Difference between revisions of "AI War 2:Finalizing Multiplayer"

From Arcen Wiki
Jump to navigation Jump to search
Line 62: Line 62:
  
 
=== Bugfixes ===
 
=== Bugfixes ===
 
  
 
* Fix a bug where scourge units would fly into your choke points heedless of their own demise
 
* Fix a bug where scourge units would fly into your choke points heedless of their own demise
Line 69: Line 68:
 
* Suppressed a harmless error message (BUG: AnalyzeFriendlyToHostileBalance called with null targetPlanet) that could nevertheless cause an AI faction to shut down.  The way the method returns is proper for basically sending the AI into a holding pattern until it gets a target planet.
 
* Suppressed a harmless error message (BUG: AnalyzeFriendlyToHostileBalance called with null targetPlanet) that could nevertheless cause an AI faction to shut down.  The way the method returns is proper for basically sending the AI into a holding pattern until it gets a target planet.
 
** Thanks to Zweihander2021 for reporting.
 
** Thanks to Zweihander2021 for reporting.
 +
 +
* Put in one potential fix in GetAddedToFleetsForEntity() against an error that Strategic Sage experienced, and then instrumented the rest of that method so that if it happens again, we'll know where the problem is.
 +
** Thanks to Strategic Sage for reporting.
  
 
==== Huge Amounts Of Preemptive Code Hardening Against MP Client Errors ====
 
==== Huge Amounts Of Preemptive Code Hardening Against MP Client Errors ====

Revision as of 15:27, 14 May 2021

Contents

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 Beta 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 May, 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.

2.907

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

  • Buff Dire Gravity Guardian damage 1500 -> 2500 (royal variant 3000 -> 5000)
    • Thanks to Democracy for the suggestion.

Hunter Changes

  • Hunter Fleets now starts at 1 fireteam for difficulty 1, and goes up to 10 fireteams for difficulty 10.
    • This will allow them to focus their efforts more effectively, since previously you might have 20 fireteams and 3 teams just sitting around waiting to hit a really strong target. Better to let them focus their efforts.
    • Also, the hunter at lower intensities should be much more brute-force-only
  • Hunter is better at detecting when it's allocated resources are enough for one battle and and they should focus other units elsewhere
  • Improve the logic for Hunter Fleets getting lurk planets to be more efficient
  • Hunter fireteams now prefer to give units based on which fireteams are closest (and need units to activate)
  • Hunter Fleets unlock Dire Guardians a bit earlier on difficulty >= 7 (same for Warden Dires).
    • Slightly buff the Dire Guardian income ratio for hunters

Fireteam intelligence improvements

  • Fireteams now do a better job of realizing when they have enough strength to attack locally, and are more willing to attack early (even without all their ships) if they think they can win
  • Fireteams in 'assembling' mode will now run away if attacked; this should make it harder for players to snipe ships preparing to attack them
  • If fireteams are attacking a player planet, that faction's other fireteams become more willing to attack other planets owned by that player.
    • The hope is that this will allow for multi-front battles if the conditions are right.
  • When selecting fireteam targets, take only one target per planet. This costs a bit of memory ineffeciency, but it shortcuts a lot of work we might do so it should be a net performance boost.
    • If a planet had (say) an Economic Command Station, a Lost Energy Reactor and a player-allied scourge spawner then there might be a separate fireteam target for each of those generated by the selection code; this was causing the target analysis code to do extra work, and could wind up with fireteams overly focused on certain planets
  • add a game command to reset all the fireteams for a given faction. Intended for testing
  • Fireteam and Hunter improvements were motivated by a discussion with Strategic Sage

Bugfixes

  • Fix a bug where scourge units would fly into your choke points heedless of their own demise
    • Reported by donblas
  • Suppressed a harmless error message (BUG: AnalyzeFriendlyToHostileBalance called with null targetPlanet) that could nevertheless cause an AI faction to shut down. The way the method returns is proper for basically sending the AI into a holding pattern until it gets a target planet.
    • Thanks to Zweihander2021 for reporting.
  • Put in one potential fix in GetAddedToFleetsForEntity() against an error that Strategic Sage experienced, and then instrumented the rest of that method so that if it happens again, we'll know where the problem is.
    • Thanks to Strategic Sage for reporting.

Huge Amounts Of Preemptive Code Hardening Against MP Client Errors

  • Updated dozens of places in the code that were either already prone to having MP-related cross-threading issues on clients, or which could in theory have those sorts of issues at some point in the future, or which could have those issues in even more-rare cases on AMD machine hosts/singleplayer.
    • Some of these were being hit, others just fit a pattern where it was just a matter of time, but these have all been updated to use new methods (with the word Safe at the end, and descriptive) that don't change the meaning of the code and don't require end-programmer defensive code.
    • Thanks to Tzarro for the most recent reports.
  • All references in the entire game that went directly from a ship/squad to FleetMembership.Fleet have been adjusted to use the newer cross-thread-safe methods. In total, this made changes in about 200 (maybe?) files, and probably over a thousand lines of code. Some of them never would have been a problem, others were just waiting for the wrong kind of processor/OS combo and just plain bad luck to set them off, almost but not entirely exclusively on MP clients.
    • This is a preventative measure that should cut down on future random MP errors drastically.
  • Hardened a couple of gnarly pieces of logic in ShipListerUtils that had not errored yet in MP for any clients, but it was only a matter of time.
  • Fixed a number of cases where a hack might verbalized a harmless error on an MP client, thus getting in the way of its execution and confusing matters, when really the host will just finish taking care of the hack and the client can just ignore those temporary lapses and carry on.
  • Further updates to any code that matched the pattern of ".FleetMembership." (minus the quotes) to finish hardening it all against cross-threading exceptions. With the other bits already hardened, this was down to just a few dozen instances left.
  • More code hardening, this time in the direction of ".PlanetFaction.Faction." and anything related, plus ".PlanetFaction.Faction,".
    • This is overall around 500 lines of code in over 100 files.
    • These were less common to error than the fleet stuff, but were certainly extremely common as a source of errors on MP clients and as cross-threading errors in general.
  • Fixed over 100 cases where code was too-optimistically referencing the results of GetControllingFaction() or similar on planets.
    • This was almost never a problem, but did lead to some cross-threading error possibilities, particularly on MP clients.
  • Fixed over 400 lines of code in 61 files where we could get nullref exceptions from trying to find the names of planets associated with various things. Most of these were extremely null, and may not have even been a possibility in terms of truly generating an error, but the revised code makes absolutely sure (mainly relevant for highly performance multithreaded MP clients).
  • Further hardened the code against some more cross-threading issues that were theoretically possible when drawing specific units.

DLC 2

  • Spawn a DZ Library variant that one can hack for a unique cruiser
  • Make SaveScum a bit less effective against zenith miners. There are still some save-scummable aspects, but they are a bit reduced
  • The Spire Hammer AI Type now has much more of a focus on spire ships.
    • Thanks to Zweihand's comments that there weren't enough spire ships
  • When doing the 'crash nomad planet hack' the game now provides a popout asking 'Which planet would you like to crash me into' and lets the player choose.
    • You can pick any non-player-owned planet. Crashing a nomad into a bastion/homeworld planet produces a full strength response; any other target produces a 1/2 strength response.

Mod Updates

  • AMU:
    • Fixed a bug in the Serialization of AMU's WrappedPlanetFaciton. The code was set up to serialize a bool whether it was null or not, and only if it was not null it would also serialize it's planet and faction indices.
    • However, it actually did the opposite: When it wasn't null it would serialize nothing more, and when it was null it would have tried to serialize -1 and -1 in an UltraEfficientStyle of 0-1023, which would cause it to fail.
    • Unfortunately since this is a bug introduced to Serialization and the data required to fix the bug was never saved this cannot be reconstructed. The erroneous saves are lost forever.
      • Thanks to Vaos for reporting.

2.906 Journaling Along

(Released May 13th, 2021)

  • Spire Engineering Center (in DLC1) is now called Spire Repair Center, as it otherwise implied it assisted construction like engineers. This caused a lot of confusion.
    • Thanks to ArnaudB for updating.
  • Add "The Swarm" quickstart to DLC1, an idea kicked around today in Discord.
    • 3 lower difficulty AIs with a powerful scourge, and a macrophage for the "bio" theme.
    • Thanks to donblas for adding!

Journal Entries

  • Add beginner journal entries for:
    • Low Threat
    • High Threat
    • Discovered AI Eye
    • Outnumbered
    • Discover Guards
    • Discover Citadel
    • Discover TSS
    • Discover ARS
    • Thanks to donblas for writing these!

Visual Updates

  • The temporal filter on the Amplify Bloom effect that we use in the game has been disabled. It was possible in rare cases (more common recently) to be able to essentially "overload the virtual optical sensor" with light data and get into an invalid tinted state.
    • Thanks to GreatYng for reporting it initially, and then we started seeing it shortly after repeatedly with work on the new content for DLC2.
  • The "under construction" shader for ships that are building is now updated to be more efficent (using the geometry queue rather than transparent) as well as being more noticeably animated.
  • The AI Dragon from DLC2 that gets spawned after Zenith stuff now has its own unique graphics separate from how dragons from DLC1 look.
  • Added a lot of code for attaching and removing and pooling and displaying "addon objects or particle fields" to ships, so that we can display things like the Zenith Miner eating a planet. This hasn't been tested out yet, but it also isn't being activated yet.
    • That will come tomorrow, as the art for that stuff is ready. This is a new general-purpose major capability for the game as a whole, and will allow us to do some other things also not related to ships (for instance, planet explosions or planet status effects that are visibly there), which will also be coming tomorrow.
    • Also coming tomorrow, assuming that this all works correctly, are some upgraded base-game graphics to use these new capabilities, specifically around the various incarnations of warp gate.
  • Also created new visuals for the different phase states of matter for ships (including some base game and DLC1 content that uses this), but it isn't applied to those ships yet. Again, that will come tomorrow along with a large batch of other stuff.

Bugfixes

  • Fix a typo in a game lobby setting
    • Thanks to schoenberg for reporting
  • Fixed a couple of different errors that could happen in our new "reorganize player fleet lines" sort code.
  • Fix fleet memberships to sort by name if their strengths are equal in the end.
  • Fix a bug where journal entries that were "blocked" in XML were not correctly being blocked
    • Thanks to donblas for reporting.
  • In the event that one material can't be drawn, the game no longer freaks out any stops drawing all materials. It now gives you an error about that (once per run of the game per material name), and then just stops drawing that thing. It will be a drain on performance while this is happening, but won't cause things to look drastically wrong.
    • Previously these errors were only going to ErrorsReportedByEngine and were not very visible. We also almost never have these, but with making new art additions it can happen, usually on internal builds.
  • Correct an off-by-1K cost measurement for display purposes
    • I forget who reported this
  • Self Attritioning Ships (like tesla torpedoes) no longer give the Dark Spire energy
    • Reported by Tzarro
  • Add some defensive code to the Faction class for a weird exception I saw just after the game loaded
  • Fixed an error in the XML loading of the game where the required_expansion_list XML field did not get respected if the expansion required did not even exist in the player's game files.
    • This could cause massive issues if trying to load a mod that hat content locked behind DLCs but would fail to load if said DLCs was not bought.
    • In one case of Extended Ship Variants it was crashing the game in such a way that it would not even load to the main menu to disable the mod again.
      • Thanks to Zweihand and Charge for the report, and especially Charge for helping to debug this and testing out the solution. And thanks to NR SirLimbo for finding this in the code and fixing it!

Balance

  • Adjust the weapon ranges on a couple reflex weapon systems. They aren't actually used, but display on Z hotkey ranges. Should cut down on confusion a little.
    • Thanks to CRCGamer for adjusting.
  • Assigned command station techs as secondary tech branch to strikecraft hangar system defenses.
    • Military Command for the Bomber and Shrike Interceptor hangars.
    • Logistical Command for the V-Wing hangars.
    • Economic Command for the Metabolizing Gangsaw hangars.
    • Thanks to CRCGamer for adjusting.
  • Additional tweak to Attractive Matrix Fortress reflex weapon listed fire rate to be once per second. Cosmetic change since its actual fire rate is based on how quickly its being shot.
    • Thanks to CRCGamer for adjusting.

DLC 2

  • Fix a minor typo with the Reclamator
    • Thanks to Strategic Sage for reporting
  • If the scourge want to send a unit to a random metal generator on a planet that's been ravaged (thus, no metal generators) they will instead send units to a random location on the planet
  • Ambush Mines now have MUCH higher priority. These do nothing unless killed so these need to be preferred targets
  • Finally fixed the Drone reclamation drones (they weren't launching before). They now have a weak weapon jam in addition to their metabolism
  • Voidcaller Outguard now has true invulnerability (so it doesn't kill itself when attacking elecrtoxic units. It's event horizon AOE has been reworked so it's more likely to pull units all around it instead of in clumps
  • Voidpiercer's Void has AOE rework for same reasons
  • Ethereal Cruiser balance changes:
    • Ion Disintetegator paralysis now works on mass tx <13 (was 50). This is meant to affect most everything, but Tier 4 and 5 exogalactic units are immune
    • Base damage of Ion Disintetegator 50K -> 5K but now gets muliplier of x1 per 1tx, capping at x15 -- this means its still a solid ship to chip away at even the Flenser
    • Burst fire reversed so it starts with the burst and then has cooldown
  • Fixed minor typo with the Drone Stockade

Zenith Miners

  • When the Miner ravages a planet, it now correctly updates the planet graphics
  • Zenith Miners are now 50% ravage planet, 50% completely destroy planet, so we can show off the awesome Ravaged Planet graphics more
  • Improve some miner tooltips
  • Miners will also appear on player planets later into the game
  • Miners will not revisit a Ravaged planet
    • There's nothing left to eat!

Zenith Architrave

  • The ZA civil war is no longer the default. You must enable the civil war for >= 2 ZAs in the game lobby to see this behaviour.
    • I'm worried that newer players (or those who skim tooltips) will enable >= 2 ZAs and get crushed by the Civil War in an unfun fashion. The Civil War is much more for advanced players I think. It's very different to everything else in the game, so this makes me think it should be opt-in.
    • The other major problem is for a player in a constricted map type (Snake? X?) who gets a home planet between two ZAs that enter civil war. If there happen to be no other paths between the ZAs, you could easily die without any counterplay.
    • Or if you took an MDC on a planet in a a choke point and the ZA comes through and kills it (or your defenses protecting it), that just seems unfun
  • To compensate for losing the civil war, ZAs in non-civil-war mode will be much more aggressively expansionistic once they take a few planets; the more planets they take the more Pioneers they spawn (to a max of 6).
    • The hope is that players are motivated to go and kill non-Territory spawners to prevent the ZA from overrunning their territory. Or they can hope the AI's spawned Exogalactic War Units will keep the ZA suppressed.
    • This is not quite as impactful as a civil war, but it should keep the player interested in engaging with the ZA.
  • This also constitutes a buff to a lone ZA (though the player could enable civil war for a single ZA to use the old pioneer spawning rate)
  • Crupellarii retaliation changed to a flat riposte of 50 damage at mark 1 from a 20% damage mirror
    • ZA phased Cestus were inheriting an auto self-destruct from their parent. Reworked to give this back its intended vampirsm.
  • New Zenith Architrave Cruiser! The "Spartacus" cruiser integrates the mysterious phasing properties common to the Architrave periodically phases to and from Multi-phase. In realspace, it is equipped with three phaser weapons, which all phase targets with no shields and low energy usage. Its spiderweb phaser has planetary range and only hits mobile targets, stunning their engines and reeling targets towards itself. Its ionized phaser is short range and designed to quickly wear down shields to enable the phasing effect. The phasion bombs it launches completely bypass the shield prevention but can be destroyed in flight. While in Multi-Phase, the Spartacus Cruiser switches to its vorpal beams that wreak havoc on weakened ships and launches phased Cestus drones that are permanently in Multi-phase.
  • The ZA Castras can now be hacked for ZA units, as well as the portal
    • The goal is to give the players more carrots to interact with the ZA; you can now build a giant fleet of ZA ships if you're willing to spend the hacking poitns
      • Suggested by zeusalmighty
  • The ZA can now have their civil wars turned off
    • This setting is on a per-faction basis, so you need to apply it to all of them
    • This means that the Non-Civil-Warring ZA will just expand independently of any other ZAs.
    • I know I will want to play some games with multiple ZAs, but without their giant impact on the galaxy during a civil war

DZ / Svikari Changes

  • Jormugander base damage from 10K to 12K (per beam)
  • New Dark Zenith Cruiser! The "Gungnir" Cruiser has a weaker version of the Jormugander's annihilator beam, but still incredibly powerful. It is also equipped with a harpoon launcher and a seeker bomb launcher, the former that can immobilize even the most massive of ships and the latter that sends slow accelerating projectiles that do devastating damage if not shot down in flight. The hull is made of an electrotoxic substance favored by the Dark Zenith that will instantly return feedback to the Gungnir's attackers, causing attackers to take damage proportional to the damage taken by the Gungnir.
  • some major adjustments to the DZ that need further testing. But the general idea is that the DZ's invasion interval was set super low so they were getting free ships every few seconds. This interval has been increased dramatically
    • Made some additional adjustments to go with the interval tweaking. Basically, lower intensities generally gain a larger initial invasion because their interval for ships is longer. They need to still be able to invade after all
    • DZ gain more epistyles/terminii with intensity. Shifting their power away from their initial invasion towards their infrastrucutre
  • AI Zenith Dragon Changes:
    • Chain lightning fires every second (instead of every 4 seconds). Now deals full damage to secondary targets instead of 20%
    • AI Zenith Dragon has new overlay as a chain lightning eye)
  • The fimbulwinter enable/disable setting is now a boolean toggle instead of a dropdown. Much easier to work with.
  • If the fimbulwinter is disabled, the DZ planets that warp in are not Fimbulwintered

Mod Updates

  • Mod Updates:
    • AMU:
      • The base types for Cruisers and Destroyers do not load unless DLC 2 (for Cruisers) and DLC 3 (for Destroyers) are installed, will no longer confuse the game into thinking that there are cruisers and destroyers are in the game to populate the Cruiser/Destroyer Construction Facilities.
      • Along with the bug of required_expansion_list not always correctly working this was causing MASSIVE slowdown and an exception at the start of the game if players had the Exotic Ships mod installed, rendering the mod effectively unplayable.
        • Thanks to cml, LordNSR and Charge for reporting, especially Charge who helped to debug this as I was entirely unable to get the error myself.
    • Kaizers Marauders:
      • Adjusted the Raid Seeker, Raid Carrier and Raid Blaster no longer inherit from AMU's Cruiser prototype, instead they now inherit from the Heavy Prigate prototype so the mod can work without DLC 2.
    • ExS:
      • Void Weavers now try to go into melee range to attack so they actually use their zombification in Multi-Phase.

2.905 Alien Homes

(Released May 11th, 2021)

  • Fix a bug with a yet-unwritten journal for Raid Engines
    • Thanks to GreatYng for reporting.
  • The shape of the ODSS icon has been adjusted to be more distinctive from the TSS, and neither rely on an overlay anymore.
    • Thanks to Zweihander2021 for reporting.
  • Fixes the music debug menu so that tracks the user switches away from are no longer deleted from the list
    • Thanks to GreatYng for reporting and Dominus for fixing.
  • Fix a bug where command stations that grant their turrets bonus attack power weren't correctly factoring in that bonus power when doing strength calculations.
    • This lead to the game woefully underestimating the strength of units on high-mark military command stations.
    • From a discussion with a number of people on discord

DLC 2

  • Make the DZ a bit more efficient at consolidating their initial invasion gains
    • Thanks to zeus for reporting
  • The icon for the Vengeful Sniper Array has been updated to no longer look so similar to the frigate icon.
    • Thanks to Zweihander2021 for reporting.
  • Planet visual definitions no longer have a do_not_randomly_seed="true" option.
    • Instead they have a sub_seed_tag="SomeText", which accomplishes the same thing but ALSO puts them into a group of planet definitions to randomly seed for whatever the occasion is.
    • This can be used by mods or otherwise to trigger specific planets for specific purposes.
    • Please note that each planet definition only can have a single tag. You can make copies of the definitions if you need them in more than one tag (which seems unlikely in the first place).
  • The same sub_seed_tag="SomeText" has been set up for "space boxes" (aka nebula sky backgrounds).
  • You can now call SpaceboxDefinitionTable.SetSpaceboxDefinitionByTag(), or PlanetDefinitionTable.SetPlanetDefinitionByTag() to have the host set the visual stylings for some planet's faction by whatever logic you want, and it will properly sync any changes to clients.
    • This can be called serially, every frame, because it basically looks for if the tag of the current thing doesn't match, then set it to one of those things that has a tag that is matching (if possible).
    • Hint to modders: you can actually look at the various spaceboxes that we have, or planets, and just pick a subset to copy with a given tag and then assign it like you see us doing for the DZ, ZA, and Dyson Sphere. You can then have a unique feel for your particular faction's space, whether you actually are creating original art or not. Maybe you always want really dark or light or blue or red or whatever type nebulas for a given faction, etc.
  • There is an IsRavaged property on planets now, so that when one gets ravaged it won't compete back and forth with any factions for what graphic should show. It will show ravaged.
  • There are now special nebula backgrounds assigned to all of the DZ and ZA territory in DLC2.
    • There are special planet graphics assigned to DZ plnets, and the ZA home planet in DLC2.
  • Planets that are ravaged by a Miner in DLC2 will now show it in a dramatic fashion. This includes ones from savegames prior to this build.
  • Added a new AddonObjectOrParticleFieldPrefab table, which will be used for defining secondary effects, including particle effects, for specific ships (like the Zenith Miner). The code is about halfway complete.
  • Big thanks to Puffin for the new backgrounds used for the DZ and ZA!

New Mod: Exotic Ships by SirLimbo

  • Added a new mod to the game: Exotic Ships.
    • This mod adds ships with both potent and complex mechanics, synergies and playstyles.
    • Even without DLCs a total of 17 new ships and new 6 starter fleets are available.
      • Mechanics involve ships that revolve around Forcefield Piercing, Gravitic Cores, Tractor-induced bonus Damage, Acid, Repair Beams, Norris effect, Shield Implosion, Structure/Ship-specific Weapons and more...
    • If DLC 1 is enabled an additional 8 ships and 4 starter fleets are unlocked.
      • Mechanics involve ships that revolve around Forcefield-induced bonus Damage, Damage Harmonics, Range Harmonics, Von Neumann, Drone Guns, Attrition, etc...
    • If DLC 2 is enabled an additional 12 ships and 4 starter fleets are enabled.
      • Mechanics involve ships that revolve around Shot Attraction Fields, Chain Lightning Guns, Classical Hydra-Head Spawning, Revenge-Firing weapons, Electrotoxicity, Chain-Firing Weapons, various State-Of-Matter changes, etc...
      • All of these ships, with exception of the FRS ship lines have lower chance to seed than normal. In general only about 50% the rate in Transports compared to all other ship lines, and in ARSs only 5% compared to normal ships, which equals 50% of ship variants. Thus Exotic Ships are quite rare. The exact quantity is up to chance and potential other mods which add ships, such as Extended Ship Variants.
      • In return these ships can be very powerful and have sometimes evil mechanics to exploit. The presence of 2 or 3 Exotic Ships can make tech investments worth that were not considered before and allow for new strategies and ship counters against all factions.
      • The starter fleets usually consist out only 3 lines: 2 Strike Craft and 1 Frigate. One of them is just 2 Light Frigates. However, due to the power of Exotic Ships they are not underpowered in the slightest.
      • In all likelihood a good number of games will be required to acquire and play with every Exotic Ship at least once.

2.904 Dragon Hotifx

(Released May 11th, 2021)

  • Fix a bug where the 'Hack an ARS' achievement wasn't firing
    • Thanks to Atia on discord for reporting
  • Three new Guardians from CRCGamer uniquely for Warden fleet usage are added to the game. They are currently only available to the DLC2 AITypes that get new ships (Beast, Gladiator etc...) for balance testing.
    • The intent is to give the warden fleet some unique and distinctive units like AIWC's riot fleet; these are Warden Fleet only ships.
  • Fix some outdated text for the Exotic Text
    • Reported by Atia on discord.
  • Turrets now self-build in 90s no matter their metal cost. Small turrets were built in 60s, large ones in 150s and a number of odd costs turrets were either faster or slower to build. This is no longer the case.
    • This time is unaffected by being on a hostile planet, and doesn't count engineer support.
    • Raid turrets build 2x faster than others turrets, so 45s self build. This no longer change based on their cost, which led some turrets like scrap to self-build in 20s, or makeshift in 15s.
    • Thanks to ArnaudB for adjusting.
  • Command Stations self-build times reduced to 20 from 60. Mostly a QoL change, so if you don't have Engineers around when blowing up a station, you have much less time to wait before you can queue buildings.
    • Thanks to ArnaudB for adjusting.

DLC2

  • Improve some DZ targeting to prevent them from charging off after some minor factions early game
  • Fix a bug with the new DLC2 dragons with DLC1 and DLC2 enabled

2.903 Journals For Miles

(Released May 10th, 2021)

Bugfixes

  • Fix a typo in the Cursed Golem hacking screen and the Botnet decription, as well as one in the Exogalactic War Unit tips
    • Thanks to GreatYng for reporting these
  • Exos should never be able to actually spawn using relentless AI wave logic anymore. Even if that is requested, the data should be self-correcting now. So this should never cause an exception that shuts down the AI faction, unlike recent builds.
    • Thanks to Strategic Sage for reporting.
  • Fixed several issues in AnalyzeFriendlyToHostileBalance() that could happen as cross-threading errors even in single player, causing the AI sentinels faction to shut down. This was quite rare.
    • Thanks to Strategic Sage and GreatYng for reporting.
  • Experimental change: In order to avoid cross-threading errors in a proactive fashion, have added a new SpeedGroup.Dummy, which is basically the same as being null, but without actually being null. Rather than assigning to null when we are done with a speed group, we can assign to SpeedGroup.Dummy.
    • This does mean that in places where we are looking at speed groups to see if they are on, we now have to also make sure that IsDummy is false, but that is comparably rare and overall this frees us from the worry of having a null check on SpeedGroup be false in one line of code, and then in the next line of code it is suddenly giving a nullref exception because of the reassignment from another thread.
    • This is kind of the opposite of our usual approach to dealing with cross-threading exceptions, and it's an interesting initial case study on a fairly limited-use class. If things seem okay with this, then we could in theory make dummy planets, planet factions, factions, etc, so that we don't run into cross-threading NRE's from them and yet don't have to code so defensively all the time. We'll see.
  • Fixed an issue where if a flagship was crippled while in transport-load mode but did NOT have any ships inside it, then it would get stuck in that mode and the ships in its fleet would not respond to orders. If the flagship had ships inside it when it became crippled, then it would work properly, so this took some specific timing.
    • Thanks to aliyah for reporting, and Badger for figuring out what it was.
  • Fixed some cross-threading exceptions that could happen in AlterLODIfNeeded().
    • Thanks to zeus for reporting.

Multiplayer Fixes

  • Fix to the "InternalCreateActualShotForSalvo error at debugStage 4200" error on MP clients.
    • Thanks to Badger and his MP play group for reporting.
  • DumpFleetContentsIntoFactionLoose() is no longer allowed to be called on MP clients. It was possible for it to error sometimes, but even if it was not erroring, it was probably not doing the correct thing (because it was probably just missing some data in a transient fashion, and then mis-filing units).
    • When it comes to the fleets that were continuously losing all their information and then gaining it back, the client machines calling this method (even without errors) may have been a big part of the culprit.
    • Thanks to Badger and his MP play group for reporting.
  • DestroyFleetContentsAndWriteLog(), DestroyFleetContentsSilent(), RemoveAnyEmptySlotsPresent(), DespawnAllContentsFromSwap(), SetAllMembershipsUpFromDesignTemplate_FullCapOverwritingNotAdding_AssumeNoDuplicates(), InnerHelper_FillFromOneTemplate(), InnerHelper_FillFromDrawBagType(), InnerHelper_FillFromDrawBagType_FullCapOverwritingNotAdding_AssumeNoDuplicates(), and various things related to destroying extra units because of the count in place being higher than the ship cap are all no longer run on clients.
    • These are important things on the host, mainly for data correction and finding data that is stale for some reason (it matters in SP, too). But for clients, their data is often slightly stale, so acting on it will only make it worse. They'll find out real info from the host soon enough, if data is stale. They don't have the information needed to make corrections on their own.
  • Fix to the "BuildSidebar.OnUpdateDirectPlacement error at debugStage 8600" exception that could happen on MP clients.
    • Thanks to Badger and his MP play group for reporting.
  • Fixed the "BuildSidebar.OnUpdateDirectPlacement error at debugStage 2300" error that could happen on MP clients.
    • Thanks to Badger, Bummeri, KaleR, Jusa, and Exlium for reporting.
  • Fixed "DoShotHitLogic error at debugStage 2200" error that could happen on MP clients, although did so in a rather brute force way.
    • Thanks to Badger and his MP play group for reporting.
  • Fixed the "DoOnAnyDeathInCombatLogic_AfterFullDeathOrPartOfStackDeath debugCode 2100" error that could happen on MP clients, and which was mainly related to things that spawn on death of a parent unit, or stack handling, etc. Does not need to happen on the client.
    • Thanks to Badger and his MP play group for reporting.
  • The "During placement: fleetMembershipForType == null!" error is no longer a hard error, but rather just does a soft (invisible) log to the debug log. If we see this a lot, this is a problem, but this seems to be exclusive to some sort of client and host miscommunication right now, so we're just going to monitor it and not let it get in the way of other operations.
    • Thanks to Bummeri, KaleR, and Jusa for reporting.

Journal Enhancements

  • Journals can now be triggered when the player has forces on a planet with a specific unit type (using only XML). There are two classes of these entries, "normal" and "high priority".
  • High priority entries are always played immediately (AI Eyes, etc).
  • Normal Priorities are throttled to play once every 30 seconds, though this throttling can be undone (or modified) by changing a single C# value.
  • The High vs Normal priority is because I was concerned that a new player who starts adjacent to a planet with a TSS and ARS will be overwhelmed by immediately getting 3 journal popups ("How to deal with Guards", "How to deal with an ARS", "How to deal with a TSS"). If we wall-of-text someone immediately it's not great.
  • To make a unit emit a Journal entry, you take the unit type XML you want to have a journal entry for and apply the following fields:
    • journal_name_to_play_on_player_encounter # xml field with the name of the journal entry you want
    • journal_high_priority # xml field with 'true' or 'false'. This is for high Priority entries
  • New beginner journal about AI Eyes.
  • New beginner tips for how to spend science beyond just the tech tab!
  • Added is_blocked_from_triggering="true" as an option on journal entries, so that if we have ones that are defined by the programmers, but don't have text yet, we can put them in place without them firing with placeholder text.
    • Currently applied to:
      • Orbital Mass Driver
      • ARS
      • TSS
      • Guard Units (as a concept on an enemy planet)
      • Threat (high) (when there's a ton of enemy threat)
      • Threat (low) (when there's a some enemy threat, but not a ton yet)

Game Balance

  • Nerf to shot attraction range of Bulwark turrets from 6000 to 3500.
    • Unfortunately as a small turret type that is readily available the amount of coverage these were giving was too generous. And certain structures protected by entire nests of these were far more durable than the AI could reasonably deal with at lower AIP. Thus certain baits were a bit *too* effective.
  • Minor stat adjustments to the Dragon (now called "Spire Dragon" to distinguish from the "Zenith Dragon" that appears in response to the Dark Zenith invasion)
    • armor 140-> 350mm; energy 15K-> 150K; mass 7tx -> 11tx

DLC 2

  • Add some defensive code to the ZA Civil War
    • Reported by a number of testers
  • Fix a null reference exception when hovering DZ units in a wave
    • Thanks to donblas for reporting
  • The Geneticist AI type now has more of its scourge units vulnerable to zombification
    • This way zombifying player units are more useful against it. Playing Zombifying Starting Fleet into Geneticist was awful
  • The Spire Hammer AI type has had a unit rebalance
    • Thanks to crcgamer for the changes

DZ / Svikari Changes

  • Seeker bombs now increase in stats per mark, but base damage decreased significantly. Jormugandr's seeker bombs now start at mark 7.
  • Jormugandr now has regeneration -- repairs to full health in 30 minutes (from 1 health)
  • Exo strike directed at Jormugandr from 500 -> 350 strength at all intensities. Jormugandr shouldn't be killed by these but should take a considerable amount of damage (and then repair in time for the next one)
  • Merkismathr time before phasing increased from 20 -> 30 seconds. It was just able to avoid too much damage and getting too much value out of its ambush bonus
  • Nerfed electoxic effects of guardian tier units and up
  • Jarl will be more likely to spawn a Dreng before killed
  • DZ 10 exostrike every 20 min (up from 15)
  • increased time of Jormugandr rampage on diff 5 and up
  • Significant improvements to how efficiently the DZ distribute its resources
  • In the Dark Zenith Difficulty xml, the game can specify how many "Anti-DZ Dragons" will be spawned when the DZ invade. The lore is that the AI is strengthening itself against the new DZ incursion.
    • The Zenith Dragon has a powerful chain lightning attack instead of the coilbeam, as well as a weak (5%) elecotoxic retaliation
    • The player should need to take risks and reach a higher power level in DZ games. If they can just quickly snipe the AI to avoid dealing with the DZ (and thus not actually experience anything not in the vanilla game), that's as not interesting.
    • From a discussion started by Strategic Sage

ZA Balance changes

  • The ZA now has a new XML setting for its Difficulty; MaxSpawnerMarkLevel
    • Requested by zeus
  • adjusted the new "max mark level of spawner/portal" for each intensity.
    • Intensities 1-4 cap at mark 4.
    • Intensities 5-6 cap at mark 5.
    • Intensities 7-8 cap at mark 6.
    • Intensities 9-10 cap at mark 7 (so really, no cap)

Spire Hammer AI type changes

  • Significant balance changes to Spire ships utilized by Spire Hammer AI type overall these should make the smaller standard Spire ships utilized by this AI feel less like paper tigers.
    • AI Spire Frigate changes:
      • Strength multiplier removed
      • Base health raised to 90000 from 35000
      • Base shields raised to 45000 from 18000
      • Base damage reduced to 7500 from 15000 per shot
      • AI purchase price raised from 1000 to 2250
    • AI Spire Destroyer changes:
      • Strength multiplier adjusted from 1.4 to 1.2
      • Base health raised to 200000 from 70000
      • Base shields raised to 100000 from 35000
      • Base damage reduced to 25000 from 40000 per shot
      • Damage multiplier of 3x against large targets adjusted to kick in at 5tx instead of 7tx. This means the bonus is far more generally applicable against players since normally only command stations and centerpieces of the player meet the previous threshold.
      • AI purchase price raised from 1800 to 5500
    • AI Spire Fortress change:
      • Strength multiplier of 2 added. This thing does a disgusting amount of damage at high range with a coilbeam and was under-representing how dangerous it actually is.
  • Thanks CRCGamer for the above changes!

Mod Updates

  • AMU:
    • Now has a new Rollup for all DSAAs.
    • Fixed some bugs in AMU's Faction Allegiance management:
      • No matter whether or not the faction has a team, is allied to any Player or any AI the FactionAllegiance now also correctly saves all other data (such as allied to players, AIs, traders, etc). In theory simply always saving the RelatedFactionOrNull would be enough, but this way it forward-fixes any other potential exotic faction allegiance states causing trouble.
      • Tested out these changes and found out that this Marauders in a test case would STILL go hostile to the player if Kaizer was present, even when they have no reason to.
      • Fixed another bug in the SmartFactionImplementation where Allegiances would always be overwritten even if correctly serialized. This was a leftover from when the OnDeterministicThreadOnly_DoInitialLogic function would happen BEFORE deserialization.
        • Both of these combined now fix Kaizers Marauders in games with Kaizer present going hostile-all-except-other-kaizer-allied after loading a save, even when they shouldn't.
        • Unfortunately saves with broken allegiances cannot be repaired because the required data just wasn't stored. They won't fail to load, but allegiances are permanently wrong.
        • It's still not a good idea to trust your Marauder allies...
          • Thanks to LordNSR for stumbling upon and reporting this.
      • The variable TeamIsMinorFactionTeam is now correctly renamed to IsInAnyTeam. This was no bug, but simply false.
    • The DynamicAveragingRing now is serializable and inherits from SuperBasicSerializable.
      • It has saveAverageOnly (required in constructor). If enabled the DAR will only save the average value, which is much more efficient in data size. If disabled it will save every single variable contained and be as correct as possible.
      • Note that only the same save-style DAR can be loaded.
    • Executor Work:
      • Fixed a number of bugs for OnAnyDeathExecutors_HostAndClient and their tracing.
      • Added a new OnSpecialActionExecutors_HostAndClient using the new DeterministicSpecialActionExecutor.
      • Fixed the ExecuteOnlyOnce mechanic not actually applying anywhere, it was simply forgotten to implement it.
    • Fixed a few bugs in AMU's wrappers for Factions, Planets and Planet Factions where all of them could not serialize them being null. I'm honestly surprised that didn't crash everything sooner.
    • The Global Variable Overwriter now uses the above logic for better performance:
      • Instead of executing the code at game start and once per second it now executes at game start and whenever the settings are changed. This means it'll be much more efficient.
  • Kaizers Marauders:
    • Using the new DSAA Rollup from AMU Player-allied Marauders will now target any hostile DSAA that doesn't produce AIP on death. Non-Player-allied Marauders will target any DSAA.
      • Thanks to LordNSR for noticing that Marauder units were targeting the Raid Blaster, Kaizer had the same problem (his credit was missed in the last patchnotes, sorry). This is stage 2 of the adjustment.
    • Changed the wording in the Galaxy Settings from Kaizers Marauders (Multi-Planet Settling and Healing Allies) to be more clear, and correct English (hopefully).
      • Thanks to LordNSR for reporting. This must've been written in one tired night...
    • Fixed (Warping-In) Marauder Capitals mentioning GCAs.
      • Thanks to LordNSR for reporting.

2.902 Rather Refined Ghosts

(Released May 8th, 2021)

  • At the bottom of the quick start menu, and the campaign lobby, there is now a Campaign Type field.
    • This only lets you choose Humanity Ascendant, but it explains about the upcoming Expert and Deathwish modes. For now it does not mention Sandbox.
  • In the Planet sidebar, there's now an option to show your allies Fleets under Watched/Local fleets
    • This option is only available in multiplayer
    • Being able to track what all your allies are doing can be very useful, especially for more experienced players helping newer players
  • Add a 'select all engineers' hotkey. This is unset by default
    • Suggested by JordanK and aliyah
  • Add an 'Advanced' option to the Dark Spire preventing them from spawning Loci.

Help For New Players

  • Add a few tips of the day from Discord.
  • "Advisor" journal entries are now "TIPS" journal entries, and are shown with a bright light blue color regardless of what your faction color is, for maximum visibility.
    • We really want new players to notice when there's a new contextual tip for them, and not mistake it for being bossed around or for other info that might not be pertinent.
  • The hacking tab tooltip now says "Hack Target At Planet" rather than "Hack Enemies," since you might hack allies or even your own stuff (generally your stuff is from a different screen, but that's not always going to be true.)
    • It also says "Hacking is done with flagships at the same planet unless otherwise specified. Some very powerful hacks are done on your own fleets, in the fleet details window on the fleets tab."
    • Thanks to Vincent for inspiring this change.
  • In the tooltip for hacks, it already specified what kinds of ships could do the hack for every given hack (they're all flagships of some sort, but it really does vary a lot).
    • This information is now shown in a bright green color, and has been reworded to be more concise and clear.
    • Thanks to Vincent for inspiring this change.
  • Improve the spire campaign first journal entry to press upon the reader how dangerous it is.

Balance

  • Carrier Guardians, Shredder Guardians, and Teuthida Guardians are now disallowed from spawning in waves. These are all drone-producers that can wind up being far stronger than the wave warning would lead you to expect.
    • Thanks to Strategic Sage for suggesting, and aliyah for reporting the initial problem.
  • A number of balance adjustments to starting turret counts on some of the battlestations and command stations.
    • Thanks to ArnaudB and CRCGamer for sorting this out.

Bugfixes

  • Add some defensive code when deploying a wave composition
    • Thanks to slake-moth for reporting
  • Exos are no longer allowed to use Relentless Waves; if they use the Relentless Wave faction then they don't behave like Exos, but do behave like waves
    • If we want the ability to summon waves like we do Exos, that should be it's own thing, and I for one thing it would be useful.
    • This was causing a number of code paths to drop a mini-wave instead of any exo, like hacking. Buff the exo response to hacking as well, since it was very low.
  • Fixed a very weak memory leak that could happen when you were reloading all the data types (changing expansions or mods that are enabled, but not restarting the game) in entity order pools.
  • Recoded the way "ship to ship lines" are drawn from one to another, which improves performance and also fixes a rare memory leak (that was becoming less rare), and which was a huge amount of code to the point it makes me nervous. Once this seems not-glitchy in our internal version, then we'll probably do a day of beta just to be sure. Depending on how solid it seems.
    • Overall this is great for performance, and it has a major positive effect on how correct and impressive chain lightning looks, too.
  • Fixed a rare exception that could happen in CopyShortTermFramePlanningDataIntoSim and absolutely kill the simulation until it was restarted. Not sure how new this was.
    • Thanks to Tzarro for reporting.
  • Improved the efficiency of ship-to-ship lines that occur on distant planets in all cases in MP, and for non-weapons cases in single player and MP.
  • Fixed a cross threading bug that could occur in the Dark Zenith when they were trying to move to a harvester but the harvester died or was removed. It now tries once more and then just gives up until next cycle if that's going on.

Multiplayer Fixes

  • With the build sidebar open in multiplayer, it was apparently possible to get some errors as a MP client on an AMD machine. We unfortunately have not fixed it, but we have put in instrumentation to localize the error's impact, find out where it is further (with the next user report on BuildSidebar.OnUpdateDirectPlacement errors), and then move to a full fix once we have that added info.
    • Thanks to Aidalee, Vincent, Bummeri, KaleR, and Jusa for reporting.
  • Fixed the cross-threading "DoEntitySecondLogic for LogisticalCommandStation debug code 161" error that could happen on MP clients. We had gotten all of them in that method but missed this one.
    • Thanks to Aidalee and Vincent for reporting.
  • Likely fixed the "Error in PerFrame_CalculateEffectiveFleetData, debugStage 800" exception that could happen on MP clients, but if not it is at least much better instrumented and all the obvious possible causes are fixed.
    • Thanks to Bummeri, KaleR, and Jusa for reporting.
  • HandleTransportsSim for the DZ no longer gets run on MP clients, as that was able to cause exceptions and was also not needed in the first place.
    • Thanks to Bummeri, KaleR, and Jusa for reporting.
  • Fixed a few dozen potential (but rare) cases where tooltips could error on MP clients if the client hovered over a unit at just the wrong time.
    • Thanks to Bummeri, KaleR, and Jusa for reporting.
  • ConvertEpistylesToPirate for the DZ no longer gets run on MP clients, as that was able to cause exceptions and was also not needed in the first place.
    • Thanks to Bummeri, KaleR, and Jusa for reporting.
  • HandleUpgrades for the DZ no longer gets run on MP clients, as that was able to cause exceptions and was also not needed in the first place.
    • Thanks to Bummeri, KaleR, and Jusa for reporting.
  • Fixed "DoEntitySecondLogic debug code 161", which could happen on MP clients.
    • Thanks to Bummeri, KaleR, and Jusa for reporting.
  • Put extra instrumentation into InternalCreateActualShotForSalvo() to isolate MP cross-threading errors, and put in defensive code for the most common possible cases.
    • Thanks to Bummeri, KaleR, and Jusa for reporting.
  • Fixed a major longstanding client-side bug in multiplayer where two copies of a ship/structure/unit could be created by mistake, and this led to lots of client confusion and ghosts and explosions of not-ghosts and so on.
    • Essentially what was happening is that sometimes the general-purpose client sync data was getting there before the "fast blast" data, which was not something I expected would ever be possible... but is. By simply making the fast blast data check to make sure it doesn't already have this entity (and thus update that one versus creating a duplicate), this fixes the bulk of the problems.
    • A few other changes in general were noted, including having the clients now log how many ghost suspects they have asked sync information for, and how many ghosts they have busted. We actually tried a few different things to mitigate ghost suspects, but it still winds up accidentally busting too many ghosts. So as it is, we wind up with more ghost suspects than we would prefer, but it should be in a place where it's not actually busting any invalid ghosts (and hopefully it finds no ghosts at all).
    • If you see a bunch of ships on a client get destroyed and then reappear, please do let us know!
    • Thanks to Bummeri, KaleR, Jusa, borisgrebenshchikov, Lictuel, Pringels, Sergie, Zweihander2021, and Liorik for reporting.

DLC 2

  • Add more defensive code for the Wormhole borer notification
    • Thanks to Zweihander2021 for the bug report
  • The ZA can build a max of one Castra per planet
    • At zeus' request
  • The DZ can now use the RequiredIntensity XML setting on a DZUpgrade to restrict it based on faction intensity.
  • Adjusted Phantasmal Host Frigate icon and shorthand from heavy to medium. Its actually a light armor hull but it generates frigate sized decoys.
    • Thanks to Tzarro for pointing out disparity.

DZ / Svikari Changes

  • Coerl alebdo 0.4 -> 0.7 (it has cloaking)
  • Intensity 1 changes
    • BaseInvasionStrengthPerPlanet: 15000 ->5000
    • BaseExoStrength="500000" BaseExoInterval="3600" -- A big exostrike 500 str every hour. Too frequent, I fear the DZ would get crushed invariably except if the exo strike was super weak, which would just get insta killed by the Jormugandr.
  • Intensity 2 changes
    • BaseInvasionStrengthPerPlanet: 13000 ->6000
    • BaseExoStrength="500000" BaseExoInterval="3300" -- A big exostrike 500 str every 55 min.
  • Intensity 3 changes
    • BaseInvasionStrengthPerPlanet: 14000 ->7000
    • BaseExoStrength="500000" BaseExoInterval="3000" -- A big exostrike 500 str every 50 min.
  • Intensity 4 changes
    • BaseInvasionStrengthPerPlanet: 12500 ->8000
    • BaseExoStrength="500000" BaseExoInterval="2700" -- A big exostrike 500 str every 45 min.
  • Intensity 5 changes
    • BaseInvasionStrengthPerPlanet: 12500 ->9000
    • BaseExoStrength="500000" BaseExoInterval="2400" -- A big exostrike 500 str every 40 min.
  • Intensity 6 changes
    • BaseInvasionStrengthPerPlanet: 13000 ->10000
    • BaseExoStrength="500000" BaseExoInterval="2100" -- A big exostrike 500 str every 35 min.
  • Intensity 7 changes
    • BaseInvasionStrengthPerPlanet: 13500 ->11000
    • BaseExoStrength="500000" BaseExoInterval="1800" -- A big exostrike 500 str every 30 min.
  • Intensity 8 changes
    • BaseExoStrength="500000" BaseExoInterval="1500" -- A big exostrike 500 str every 25 min.
  • Intensity 9 changes
    • BaseExoStrength="500000" BaseExoInterval="1200" -- A big exostrike 500 str every 20 min.
  • Intensity 10 changes
    • BaseExoStrength="500000" BaseExoInterval="900" -- A big exostrike 500 str every 15 min.
  • Tier 1 (Guardians) requires 3 variant upgrades (eg., tier 0 sinister)
  • Tier 2 (Dire Guardians) unlocked at intensity >=5 and requires 6 variant upgrades
  • Tier 3 (Golems) unlocked at intensity >=6 and requires 10 variant upgrades
  • Mark 2 requires 1 variant upgrades
  • Mark 3 requires 3 variant upgrades
  • Mark 4 requires 5 variant upgrades
  • Mark 5 unlocked at intensity >=5 and requires 7 variant upgrades
  • Mark 6 unlocked at intensity >=6 and requires 9 variant upgrades
  • Mark 7 unlocked at intensity >=7 and requires 11 variant upgrades

ZA Balance changes

  • Replaced the ZA Cestus self-damaging attack with health_change_by_max_health_divided_by_this_per_attack="-1" so it always kill itself
    • thanks Puffin for pointing out the mix up!
  • Marking up of portal/spawner was 600 seconds at all intensities. Now, intensity 1 is 1200 and each intensity is 100 secconds fewer, maxing at 600 seconds at intensity 7+
  • "WarIntervalForStrengthIncrease="X"" tripled (20 ->60) at intensity 1, 10 seconds reduced per intensity until capping at 20 seconds (default) at intensity 5
  • "TimeBetweenTerritoryIncrease="X"" increased intensities 1 - 6. Intensity 1 20 -> 30 min, and 100 seconds fewer with each intensity until intensity 5 (900s ->1200s). Intensity 6 700s ->900s. The rest are 600 seconds (default)
  • Greatly increased the time before pioneers can spawn at intensity 1-3 (now 2 hours at 1, 10 min less per additional intensity), and a minor increase at 4 (now 1 hour)
  • "ExcessSpawnersToTriggerOtherArchitravesToAttackMe="X"" has basically been inverted. Intensity 1 went from 2->5 while Intensity 10 from 5->1. Basically, the lowest intensities will for all intents and purposes, never trigger a civil war (except in marathon games maybe). Intensity 10 should be triggering civil wars in most games

Mod Updates

  • AMU:
    • Now has a new Rollup for all DSAAs.
    • Fixed some bugs in AMU's Faction Allegiance management:
      • No matter whether or not the faction has a team, is allied to any Player or any AI the FactionAllegiance now also correctly saves all other data (such as allied to players, AIs, traders, etc). In theory simply always saving the RelatedFactionOrNull would be enough, but this way it forward-fixes any other potential exotic faction allegiance states causing trouble.
      • Tested out these changes and found out that this Marauders in a test case would STILL go hostile to the player if Kaizer was present, even when they have no reason to.
      • Fixed another bug in the SmartFactionImplementation where Allegiances would always be overwritten even if correctly serialized. This was a leftover from when the OnDeterministicThreadOnly_DoInitialLogic function would happen BEFORE deserialization.
        • Both of these combined now fix Kaizers Marauders in games with Kaizer present going hostile-all-except-other-kaizer-allied after loading a save, even when they shouldn't.
        • Unfortunately saves with broken allegiances cannot be repaired because the required data just wasn't stored. They won't fail to load, but allegiances are permanently wrong.
        • It's still not a good idea to trust your Marauder allies...
          • Thanks to LordNSR for stumbling upon and reporting this.
      • The variable TeamIsMinorFactionTeam is now correctly renamed to IsInAnyTeam. This was no bug, but simply false.
    • The DynamicAveragingRing now is serializable and inherits from SuperBasicSerializable.
      • It has saveAverageOnly (required in constructor). If enabled the DAR will only save the average value, which is much more efficient in data size. If disabled it will save every single variable contained and be as correct as possible.
      • Note that only the same save-style DAR can be loaded.
    • Executor Work:
      • Fixed a number of bugs for OnAnyDeathExecutors_HostAndClient and their tracing.
      • Added a new OnSpecialActionExecutors_HostAndClient using the new DeterministicSpecialActionExecutor.
      • Fixed the ExecuteOnlyOnce mechanic not actually applying anywhere, it was simply forgotten to implement it.
    • Fixed a few bugs in AMU's wrappers for Factions, Planets and Planet Factions where all of them could not serialize them being null. I'm honestly surprised that didn't crash everything sooner.
    • The Global Variable Overwriter now uses the above logic for better performance:
      • Instead of executing the code at game start and once per second it now executes at game start and whenever the settings are changed. This means it'll be much more efficient.
  • Kaizers Marauders:
    • Using the new DSAA Rollup from AMU Player-allied Marauders will now target any hostile DSAA that doesn't produce AIP on death. Non-Player-allied Marauders will target any DSAA.
      • Thanks to LordNSR for noticing that Marauder units were targeting the Raid Blaster, Kaizer had the same problem (his credit was missed in the last patchnotes, sorry). This is stage 2 of the adjustment.
    • Changed the wording in the Galaxy Settings from Kaizers Marauders (Multi-Planet Settling and Healing Allies) to be more clear, and correct English (hopefully).
      • Thanks to LordNSR for reporting. This must've been written in one tired night...
    • Fixed (Warping-In) Marauder Capitals mentioning GCAs.
      • Thanks to LordNSR for reporting.

Mods

  • Kaizers Marauders:
    • Reduced the Albedo of the Raid Blaster (and its derivatives) and Kaizer in all his variants and states from 0.9 to 0.85, meaning that the ships will no longer be targeted by the Mark 3 DSAA.

2.901 AIP Reduction Clarity

(Released May 6th, 2021)

  • Ship lines should now be sorted by strength in a number of places in the UI (hovering a flagship, the Fleet management window, etc)
    • Thanks to mahisev350 for the suggestion
  • The Swap Ship Lines UI only shows the player name if it's not you
    • Suggested by x4000.
  • In the event that an AIP reduction event does not actually reduce the AIP, it now explains "AIP Floor was hit! Reduction will apply more later as AIP rises. Current floor is: X"
    • Additionally, the AIP Never Reduces Below Amount is now shown on the same line of the AIP tooltip as the AIP Floor, so that it can't be missed. That was super easy to miss before.
    • And finally, the reported AIP floor now factors in the AIP Never Reduces Below Amount, versus looking like you SHOULD be able to reduce further and then mysteriously not being able to (unless you happen to read lower in the tooltip).
    • Thanks to The Main Man, MrButtermancer, Zeus, Strategic Sage, Badger, Lailah, and others for this discussion.

Bugfixes

  • Fixed a bug in the prior version where the new "Planet not to path through" underlay was throwing an error rather than showing.
    • Thanks to GreatYng for reporting.
  • Previously, you could get around the claim cost of a fleet leader by hacking to transform it. Now you can't hack to transform anything that is not yet fully claimed, or which is still partly under construction.
    • Thanks to Darkshade for reporting.
  • Fixed a general waste of performance where a lot of galaxy map display stuff was being calculated even when you were looking at the planet view. We discovered this quite by accident in fixing an MP bug, but this was a performance drain in solo play as well.

Multiplayer

  • There was a nonsensical failure to send a planet's data via multiplayer, but via code review all looks well. So this must be some sort of special case issue that we need to narrow down more. We've thus inserted 8 network canaries into the planet sync code, which will help us find the specific area in which the problem (which is apparently quite rare) occurs.
    • Thanks to Bummeri and their MP group for reporting.
  • In the multiplayer client, the "ghost check" code previously was deleting any units that it had not heard from the host about for 4 seconds' worth of sim cycles. This was working some of the time, but when there were too many ships it would cause periodic deletions and recreations of units, which was definitely bad.
    • One of the chief problems with ghosts is that they are not centrally registered on the client, so the host can't get in there and update them to say "you are okay" or "you are dead."
    • After 1 second of not hearing from the host, a unit on the client now ensures that it is centrally registered. This should keep it from being missed for updates and divergence checks. If it is dead on the host, we should find out in the next cycle.
    • After 8 seconds, now, if it still doesn't hear from the host then it gives up and suicides. This should be long enough for the very shortest sim cycle.
    • Thanks to Liorik, Bummeri, goodjoe696, and others for reporting. This was a tricky one!
  • Substantial update to how loading and unloading transports are handled in multiplayer. This gets rid of the bulk of the lag that clients were experiencing with this, as well as ship counts going crazy on the client in the fleet display as ships were shuffled in and out.
    • Essentially some of the fleet data just needed to be synced over at the same time, and the client needed to not do a few things that are host-side-only.
    • Thanks to Bummeri, goodjoe696, and others for reporting.
  • Fixed an exception that could happen on MP clients, where essentially if a fleet was updating at just the wrong time, it could cause an exception in trying to draw its info on the galaxy map.
  • Fixed an issue in MP where clients could get exceptions when ships transformed from one form to another.

DLC2

  • DZ Terminii now explicitly list the name of the resource they have for pickup (like 'We have 500 Izumite') instead of just '500'
    • Thanks to Strategic Sage for reporting
  • Add a new Community quickstart, 'The Devouring Badger'
  • DZ: add the ability for an upgrade to prereq a certain number of ship variant upgrades.
    • Requested by zeus for balance purposes

2.900 First Press Build

(Released May 6th, 2021)

  • Rejigger the timing of the Beginner Journals to try to prevent 4 from firing at once (which I saw). That's overwhelming.
    • If this isn't enough then we can put a beginner journal specific timer in instead to say "Only one beginner journal every X seconds"
  • Hovering ARS and TSS on the galaxy map now shows the tech lines for its available ships in Full Detail tooltips; this matches the behaviour for uncaptured flagships for a consistent experience
  • The Placement screen at the top right now reminds you of the metal costs.
    • It shows the base metal cost, then the 5x, 10x and 50x metal costs, for unobservant people like me who don't remember how much things cost, and would like a chance to easily see if I can afford to build 10 of something
  • Holding 'Alt' with units selected will now remind you what hotkeys exist to control just those units
    • Turns out there are hotkeys to control Melee units only, flagships only, units with tractors only, and a bunch of other things, but I can never remember them. Now it's easy to check!
  • Factories and Engineers always auto-build by default
    • Every player I know would turn them on immediately, so having them off at game start was just a n00b tax. The 'you should automate' beginner journal entry now appears for people who don't have auto-build defensive ships
  • The beginner Next Steps journal has real advice now
    • Thanks to Sage for this advice.
  • Hive Golem now has Greater Metabolism in the base game, as otherwise it got both standard and greater version with DLC2 update.

Tutorial Updates

  • It is now possible for planets to have "travel advisories" that block either player or NPC movement into those planets via wormholes, or block all of the above.
    • This can only be turned on via tutorials at the moment, and we have these set on most tutorial planets to prevent the AI from coming to help its smaller planet in late tutorials, and to prevent players from going too far into AI territory and dying in the tutorial in any of them.
    • Tutorial 1, nobody is allowed to leave any planet, you or the AI.
    • Tutorial 2, NPCs can't use any wormholes, and player is not allowed to go to Farland or Sidelander.
    • Tutorial 3, NPCs can't use any wormholes, and player is not allowed to go to Farland.
    • Tutorials 4 and 5 are blocked to NPCs on all wormholes, but let the players do whatever, including going to Farland and getting killed.
    • Thanks to LarryP for reporting it was possible get killed in the early tutorials.
  • Also for tutorials, we added a ne destroy_all_metal_harvesters="true" option.
    • This makes it so that in tutorial 3, on Sidelander, we can have all the harvesters (which take a long time to capture now) not get in the way of capturing the transport.
    • Essentially this was super slow now even on speed 5x.
  • Tutorial 3 now has some notes on how to speed up time, and about how to play in a fast-but-with-period-pausing playstyle.

Balance: Turret Simplification

  • An UI-focused update making turrets count far more intuitive.
    • The impact has been kept to a minimum, but this still has a number of implication. Particularly for starting turrets.
  • Turrets count in TSS reduced from 15 to 10 for small, 3 to 2 for large.
  • Defensive caps increased:
    • Battlestations: from 0.7 to 1.0
    • Citadels: from 1.4 to 2.0
    • Home Command: from 1.33 to 2.0
    • Economic: from 0.25 to 0.4
    • Logistic: from 0.48 to 0.8
    • Military: from 1.15 to 1.6
  • Starting Pike turrets now scales with Defensive capable.
    • Econ: 4, Logi: 8, Mil: 16, Home:20. This should balances "overpowered" Econ planets, now they no longer have a 4x cap on pike for free.
  • Starting Ambush and Beam turrets remain the same on mil. (32 and 3).
  • Starting Tachyton, Tractor and gravity generator counts have been adjusted. This changes little.
  • Minefields counts have been updated. This changes little.
    • Including DLC2 ones. (Zeus)
    • But not modded ones.
  • Station Keepers numbers have been adjusted to reflect Defensive Cap, they didn't before which increased confusion.
    • This concerns Watchman and Assault Station-keeping frigates.
  • Thanks to ArnaudB for making these changes!

Mod Updates

  • Update to MSD balance based on shifting base game balance
    • Turret counts available via TSS normalized to 10.
    • Escort Carrier count available by default to Economic reduced to 3.
    • Artillery Destroyer count available by default to Economic reduced to 1.

2.899 Almost Press Build

(Released May 5th, 2021)

  • Updated graphics for the Zenith Trader are now in place in the base game. We'll be doing a number of updates to base-game Zenith golems to make them fit with the new art style for the race as introduced in the upcoming expansion, but most of that art will be coming after the expansion itself releases.

Balance Updates

  • In galaxy advanced settings:
    • Number of maximum Data Centers increased from 6 to 9.
    • Number of maximum Major Data Centers increased from 2 to 3.
    • Number of maximum Distribution Nodes increased from 6 to 9.
    • These changes give back the ability to ease the game, which should particularly be welcome given DLC2 is likely to bring in new players.
      • This feature was appreciated by newcomers before, and it felt frustrating to have three sliders whose sole option was to make things harder for the player.
      • Bear in mind that in the future modes that are more for experienced players (Guerilla Warfare and Deathwish in particular), we'll maintain very strict limits for balance. But this main widest-appeal mode (to be called Humanity Ascendant in the future) we want to make sure as many people can comfortably enjoy as possible.
    • Thanks to ArnaudB for updating this.
  • On difficulty 9 and 10, the hunter fleet will be even nastier about going after MDCs

UI Updates

  • Add beginner journal entries teaching players about watching flagships, and queueing unload orders for their flagships. These are very important techniques for good play.
  • Add a journal entry when the AI Overlord transforms explaining the mechanic
    • Thanks to Miloch for pointing out some potential confusion.
  • The escape menu now shows the personal settings and galaxy options on a single line, to make them less easy to miss (in terms of them both being there, and similar but different).
    • The escape menu has moved View/Edit Factions much further up, to a place of high visual priority.
    • The escape menu now has a "Visit Us On Discord" button, because frankly that's the best place to get tips and community advice for the game these days if you don't know exactly where to head on youtube, etc.
      • The discord tooltip in this menu, and on the main menu, now have a tooltip explaining that it's the best place to go for tips and similar, and that the forums are basically dust-catching now.
  • In the More section on the main menu, the links to the forums (which are almost dead now, because of discord) have been removed.
    • We also removed the link to our mailing list, as we don't really actively manage that anymore (though it does still exist), because it's not typically a way people want to hear from us.
    • And lastly, we removed the link to the wiki (which you can still get to by just clicking the patch notes button anyhow), because other than for patch notes our wiki is basically in the game rather than on our site. The fewer options that people have to look past that don't matter, the better.
  • The in-game credits for DLC2 have been greatly expanded to properly reflect everyone's role. This team has grown in 2021 for this particular project!
  • When you have set a planet to be a no-path-through zone, it now shows a red and black octagon around it on the galaxy map to remind you of that.
    • Thanks to Badger for suggesting.
  • On full tooltips, hovering a neutral flagship will show the techs that upgrade each of its ship lines next to that ship line.
    • The goal is to make it easier to figure out what synergies that flagship has at a glance, without c-clicking.
    • This is also explained in a Tip of the Day
  • When hacking an ARS, holding Ctl will show the techs that upgrade those ship lines for easier synergy determinations

Utility Updates

  • Fixed a mapgen bug that was interfering with properly starting up the Test Chamber.
  • Fixed another bug in our camera code that would cause it to not work properly if there was only a single planet (aka the Test Chamber), so its dynamic zoom could not properly kick in.
  • The "reload select bits of xml" function (default F8) now works again for the first time since the XML Import overhaul. We haven't needed it until now.
    • It now works with lod_distance_overrides, size_scale, visuals_scale_multiplier, gimbal_name_extra_offset_y, and gimbal_icon_size_multiplier.
    • Also now with y_offset_of_icon, y_offset_of_ship_in_visual_space, y_offset_of_ship_emission_and_hit_point, rotation_x_of_ship, and rotation_z_of_ship fields.
    • These are all the things we tend to need when setting up a new DLC's art, or in the design of mods, but it serves little purpose beyond that.
    • We've actually never before had the capability of altering quite this many of them all at once, so this is a very nice improvement!
  • Added a new lod_distance_multiplier, which lets us adjust the LODs for our graphics in a multiplicative form (as they are scaled up or down) versus having to completely redefine them.
  • The test chamber no longer tries (and fails) to do autosaves.
  • The spawn requests from all expansions and mods are now all combined in a single test chamber, rather than it only taking the most recent one.
  • Test chamber data now also gets reloaded as part of the F8 function.
    • However, it does not restart the test chamber itself.
  • When you are in the test chamber, you can now hit the button to load the test chamber again, and it will reload it. It won't always actually show the ships, so you may have to click that a couple of times. But this is for modders and developers only, anyway.

Bugfixes

  • Fixed a puzzling issue where a hack could get into an invalid state and be unable to close itself down. It was in the process of trying to fail, but missing some of the metadata, so unable to finish wrapping up. These now properly fail, but don't log their hacking event since that was the part that was missing.
    • Thanks to goku454545 for reporting.
  • Fixed a couple of rare cross-threading issues that could happen with ships moving between planets and the AI thinking about it in the background and then having a nullref exception.
    • Thanks to Darkshade and Badger for reporting.

Mod Updates

  • Kaizers Marauders / Extended Ship Variants
    • Removed or replaced the icon overlay for any entity using Overlays1/Spacedock_Mobile. It seems this icon was removed entirely.

2.850 Icons, Targeting, And ODSS

(Released May 4th, 2021)

  • Increased numbers of sectors from 2 to 3 in the ODSS (how many times you can hack it)
    • Thanks to ArnaudB for adjusting.
  • Fixed an exception that could happen in Astro Trains when they wanted to spawn a wave but were not doing so for some reason.
    • Thanks to goodjoe696 for reporting.
  • Add a Tip of the Day telling players that they can queue unload operations
    • Thanks to a conversation with aliyah on discord
  • Waves against Marauders now use the smaller of current AIP and Marauder's AIP when calculating anti-marauder wave size.
    • Marauders often wind up with really high AIP, so this should be a nerf to the AI response to the marauders (especially player-allied)
  • Shot/damage logic fixes/improvements:
    • Fixed multiple cases of shots being fired twice onto the same target, or damaging the target twice if they shouldn't:
      • As it turns out the game would allow weapons with sufficient shots to attack the same target in the TargetPriorityList twice if it was not overkilled from the first shot.
        • Now the weapon shifts targets it attacks that weren't already overkilled to the front of its target priority list and, in the 2nd loop where it seeks for targets that are overkilled starts to look for targets at the end of this "already fired upon" sub-section.
        • This should actually speed up the sim a bit because the game no longer wrongfully creates multiple shots for the same target or even check them.
      • The same bug was possible for the main attack target and the FRD attack target, which have also been excluded for double-fire.
        • Also the weapon chooses a new main attack target or FRD attack target from its target list it'll now remove them from the list so it won't even get the chance to iterate over them again. This should, again, improve performance by a small bit.
      • Point Beam Weapons (such as the Hunter Seeker's Mass Destabilisation Beam) were actually hitting targets twice, once in the actual shot and once more in an AoE damage instance that should not exist with point beams.
        • The game now automatically sets shots_detonate_immediately to true for point beam weapons to limit the damage instances to 1 only.
    • Fixed a number of "abnormal" sources of damage (electrotoxicity, attrition, etc) being limited in the amount of stacks they kill per damage instance.
      • Especially the Nidorian Toroid was limited to killing off 1 unit per stack. So no matter the target's durability it could at best kill a stack of 100 enemies in 100 seconds.
    • Added new max_attrition_damage and added_max_attrition_damage_per_mark for ships dealing attrition damage. This limits the amount of attrition damage per tick they are allowed to do and scales with both fleet attack power and hacked attack power just like the attrition damage itself. If both is 0 there is no limit, which is the default.
      • For now the the Nodorian Tortoid is limited to dealing a base 100k + 25k/mark level attrition damage per second. Compared to before this is a hefty nerf, but in raw DPS it is still very significant, and counteracts the ship eating stacks due to the fix from above. This means that only upon targeting more than 1250 enemies at once the limit will be in effect at all.
      • Attrition damage will not spread equally among targets but focus as much as possible. This is to prevent it from having the same flaw old Siege Frigates had in splitting damage among so many targets it never actually kills anything.
    • Thanks to NR SirLimbo for all of these improvements!

Mod Updates

  • Yet another attempt to stop civilian industry raids from appearing. Though at this point they don't cause much performance issue.
    • Thanks to ArnaudB for adjusting.
  • AMU:
    • The AMU base entities for Light/Medium/Heavy Frigates, Destroyers and Cruisers now use their new icons. This will trickle down to multiple entities in Kaizers Marauders and Extended Ship Variants.
  • AMU
    • Fixed a small but nasty bug in the DynamicAveragerRing that would cause the sum of all averages to be wrong and ending up doing the opposite of what it's supposed to do.
    • This would lead to horrible hitches in Kaizers Marauders when planets had tons of defenses on them.
    • Planets with this type of build-up will likely lagg a few times after loading a save, but the hitches should grow less and less severe and eventually all but disappear.
      • Thanks to Sorrydough for reporting and testing the fix.

Icon Work

  • All of the icons for DLC2 are now in place! This increases the total number of icons in the game by about 50%, it's actually pretty crazy. But it's all contextual, don't worry.
  • The Astro Train Station icon has been updated to look like a lot less literal train station.
  • The Scourge (DLC1) now show a little icon overlay on units that are in the process of warping in.
    • This is now consistent with us doing that for a variety of units in DLC2.
  • The Scourge (DLC1) now have new fancier icons for denoting each of the races that are primary to the warrior that they have produced.
  • The TSS and ODSS now have much larger overlay icons that are also colored, in order to make them easier to tell apart. Previously they were just tiny little black smudges to differentiate them, at the scale you tended to see them.
  • Reworked the Frigate icons again. They were too complicated in their recent version. But at least not BOAT.

2.816 Frigate Icons And Tuning

(Released May 1st, 2021)

  • Several adjustments to D-SAA entities
    • Added an icon overlay to make them a little more obvious.
    • Made the v3 versions on Bastions and AI Homeworlds display on the galaxy map.
    • Nerfed the detection speed a little.
    • Removed FRD non-attention from base level of D-SAA since the most basic tier has no AIP attached.
    • Thanks to CRCGamer for adjusting.

Bugfixes

  • Fixed a typo of parasite hydra being hyrda.
    • Thanks to ArnaudB for fixing.
  • Grand Salvage displayed name was blank for some reason. This is now fixed.
    • Thank Abuchris on discord for the report, and ArnaudB for fixing.
  • Fixed a bug where if stacks were killed entirely, with enough damage remaining to potentially kill even more stacks the game overestimated the amount of damage, leading to wrong amounts of electrotoxic return damage among other things.
    • Thanks to NR SirLimbo for finding this, following it down the rabbit hole, and fixing it!
  • Did another change to stop AI raids from bothering Civilian Industry faction
    • Apparently some players still have raids on a single planet at a time. Please report saves when the raid is announced or about to launch. Assuming you still have them after this fix.
    • Thanks to ArnaudB for fixing.
  • AMU / Kaizers Marauders:
    • Fixed a couple of places where the wrong DoForPlanets was used, bugging things out.
      • Thanks to LordNSR for reporting.
  • Kaizers Marauders:
    • Fixed their capital ships not having short names set up and inheriting "CC AMU Base".
      • From a screenshot of LordNSR.
  • Fixed an issue where minefields were showing up in technology unlock strength comparision as ship, not defense. Among other places.
    • Thanks to donblas for reporting, Badger for the fix, and CRZgatecrusher for verifying the fix.
  • Fixed some cross-threading bugs that could happen in the GetSelectionContains() methods in some circumstances.
    • Thanks to Zweihand for reporting.

Icon Work

  • The frigate icon has been updated to look better, and have variants for light, medium, and heavy frigate classes.
    • It no longer looks like a boat, which is... really nice! ;)
  • New icon update conventions, this creates a TBD for modders in general, too:
    • The existing Frigate icon (Ships1/Starship) is now what we would consider a medium-class frigate. Right now we're only using that for the PFFL ones, and things like outguard flagships.
        • All existing frigates will default to this, which is fine for now, but differentiation is probably good to do.
    • There is also a new FFL icon (Ships1/Starship_Light), and a FFH icon (Ships1/Starship_Heavy).
    • We do actually have a first FFM (medium class frigate) in DLC2, the minelayer, and this also uses the default icon.
  • If you have been designing Elites (cruisers or destroyers) for your mods for DLC2, then you'll want to use the new icons for those.
    • Ships2/Cruiser and Ships2/Destroyer.
    • If you're making alien cruisers or destroyers (like we have for the Spire in DLC1, then carry on with whatever you were using before, probably).
    • All of the existing DLC2 cruisers have been updated to use the new icon, and we don't have any destroyers yet.

2.815 Polishing And Bugfixing

(Released April 30th, 2021)

  • Bastille Turret updated: it's now a long range turret firing burst of missiles for a good amount of damage. It cannot fire at close enemies. It still retains the 4x dmg multiplier.
    • The dps stated is wrong. It has about 2700 dps with the 4x bonus, instead of 1500 dps before the bonus as is shown.
  • Either way, this should make it more compelling and unique to take, rather than an uninteresting and generally useless turret.
    • Thanks to ArnaudB for updating.
  • The ability to have one or more arbitrary underlays under planets on the galaxy map has been added. This is for use with things like certain planet statuses in DLC2.
  • Added a new DoOnSpecialEvent_OnMainThread() that can be overridden on any faction, and which gets called on various UI-related events.
    • These mostly are related to settings windows being opened and closed or saved, etc. The purpose is for certain mods to be able to hook into those screens better.
    • Thanks to NR SirLimbo for requesting.
  • The way that planet icons are drawn on the galaxy map has been upgraded by a surprising amount. We're able to put more information in there now.
    • We're currently able to show status changes to planets, such as "Nomadic" and (the mysterious) "experiencing Fimbulwinter," and later can do more things with that. It's not very mod-friendly yet for being extended, but it's great for our immediate needs.
    • Additionally, the AI Homeworld and Bastion worlds now have different colored borders paired with interiors that are filled with a specific image. This is along the lines of how your own planets show the kind of command station you have chosen on them, and the intent is to aid in visibility for those worlds.
    • We also have new stylings for the Dark Zenith and the Zenith Architrave, which is important in the latter case in particular because the ZA might be occupying a planet but not consider that part of its innermost territory. The difference is now distinct at an immediate glance, as well as being in the tooltip. The ZA will murder you on certain planets that it considers to be its own, and is much more lenient on planets that it might have just snagged from someone else.
    • This whole process took far longer than expected, but it's a good launching point for us to be able to do increasing numbers of things in the future, and allow for modders to do the same at some point (not yet, but later).

Bugfixes

  • Update to The Reprocessors mod by CRZgatecrusher.
    • The wrong one was applied two versions back.
  • AMU / Kaizers Marauders:
    • Fixed a number of outdated methods to fit with the most recent version of the AIW2 codebase. Should have no functional impact.
  • Updated AI Shield Generators mod by cml to match current code requirements.
  • Previously, if the client in MP had incorrect wormhole data, then they would get tons of "Was looking for a wormhole on the far side of X" messages spamming their log HARD. This message now only shows up on hosts.
    • Ideally we obviously fix the wormhole issue on the client, but the first part of this is to make sure that it doesn't cause lag and log spam if it does break. After all, the host will handle the wormhole traversal fine, so it's possible for clients to not even notice that things are off.
    • Thanks to Bummeri, Kalervo, and Jusa for reporting.
  • MP clients no longer try to directly move nomad planets. The odds of them coming up with the same result was extremely low.
    • Thanks to Badger, Bummeri, Kalervo, and Jusa for reporting.
  • Fixed an MP issue that could happen with Zenith Miners on MP clients in ModifyMinersIfNecessary(). This is now just run on hosts.
    • Thanks to Bummeri, Kalervo, and Jusa for reporting.
  • Added a new Network_HostOnly_NeedToSyncPlanetPositionAndLinksAndWormholesToClients that should be set anytime the host moves a planet, destroys it, or changes around its links. This is set in a variety of places now relating to nomads and miners and even the dark zenith.
    • In those situations, it then does something it does not usually do, which is resend all of the wormhole connections to the client, which then should be up to date. This is untested at the moment.
    • The planet positions it turns out are already updated, as is the planet destroyed status, but the wormholes were the lagging element.
    • Thanks to Badger, Bummeri, Kalervo, and Jusa for reporting.
  • In savegames or lobby settings where for some reason the relentless wave subfaction is not tied properly to a specific AI faction, it now works to rebuild that in a sensible way if it can, or just chooses the first AI faction if it can't. This should solve the errors resulting from it either way, and the worst case should be that if you were having a civil war and it didn't get the optimization perfect, one side might have an edge over the other.
    • Thanks to Isiel for reporting.
  • FINALLY managed to fix a longstanding bug that has eluded me for years, where sometimes the tooltips were insanely thin for some reason. We never could figure out the proper conditions to make it happen, it sometimes seemed OS-specific, and often fiddling with settings made the problem go away for users.
    • It turns out that to reproduce the problem, your general tooltip scale had to be set to exactly 1.0, and you had to restart the game and then it would be messed up until you changed it to something else. If you changed it back to 1.0 without restarting, it would still be fine (until your next restart).
    • The general problem is that we have a "last scale" stored in a few variables, and it was set to 1. It doesn't do certain calculations over if the last scale is the same as the current scale, but it definitely needs to do these calculations at least once after starting the game! We have changed these "last scale" variables to start at a much more reasonable -1 (meaning nothing could ever match it), which means that it's not possible to trigger this problem anymore.
    • Big thanks to Maluraq for their help in finding this, including sharing a video of it in action so that we could walk through what turned out to be the steps to reproduce it.

Beta 2.814 Hotfix For Murder-By-Powerup

(Released April 30th, 2021)

  • Add group selection modifier to only select turrets, unbound by default.
    • Thanks to donblas for adding.
  • Fixed a couple of exceptions that could happen in the human faction, shutting it down, if there were no ARSes or neutral transports out and about to capture when the game wanted to give you a journal message about that.
    • Thanks to CRZgatecrusher and donblas for reporting.
  • Fixed a bug that was very old, but actually just started expressing itself yesterday because a DIFFERENT old bug was keeping it at bay until yesterday (when I fixed that bug). That is odd enough in and of itself, but the result was actually hilarious, so let's see if I can do it justice.
    • Essentially, all of those "not owned by anybody" units (transports, golems, etc) were being mistakenly given ownership to the AI of the planet they were on. These are supposed to be the capturable goodies that you go out and collect, recall.
    • Because of the unintentional ownership change during mapgen, these things turned on and went into destroy mode. A few minutes into any new game, and every capturable that was supposed to be out there for you to collect at some point... would come murder you instead.
    • Nintendo added poison mushrooms that chase Mario and kill him, but this is some next level revenge of the powerups, I have to say.
    • Thanks to donblas for being the original recipient of this, and CRZgatecrusher, Metrekec, Ovalcircle, CRCGamer, Strategic Sage, and others for reporting.

Beta 2.813 Golem Relations

(Released April 29th, 2021)

  • Fixed an issue where we were filling and then never using a list called EntityIDsWaitingAgainstThisPlanet<>, and in the new parallel loop code for it, that was causing exceptions in some savegames. This has simply been removed, as it was a pointless waste of CPU at the best of times, and now also an exception on top of that.
    • Thanks to slake-moth for reporting.
  • [Journal] Right clicking entries marks that as read.
    • Thanks to donblas for implementing!

Balance

  • Nerfed ticket value of Interplanetary Engineers to not be obnoxiously in almost every ODSS rotation.
  • The TSS now grants 4 turret lines to choose from, up from 3 last build but still down from 5 the build before that. Happy middle ground.
    • Thanks to Zeus and Strategic Sage for suggesting in response to the rumblings of others.

Spies

  • Nerfs to spies. They now are a Markless entity and have been rebalanced around what was a Mark III spy previously.
    • On top of that they are now only a single spy per military and two per logistic command without getting extra copies for being marked up happening.
    • Thanks to CRCGamer for updating.
  • Implemented D-SAA structures that will scan for and reveal player spies. These come in several different versions. The higher tier versions unmask spies considerably faster, and in the case of the v3 which only shows up on Bastions and Homeworlds also sports a gun to very quickly remove the offending spy.
    • Thanks to CRCGamer for coming up with this and implementing it!

Officers

  • Officers in general no longer come with fleet ships along for the ride. It's no longer limited to just the early officers.
  • AIP costs of capturing golems have been reduced, and their energy has been increased.
    • Armored Golem AIP 20 -> 16, energy 50k to 200k.
    • Artillery Golem AIP 15 -> 12, energy 50k to 200k.
    • Regenerator Golem AIP 15 -> 12, energy 50k to 200k.
    • Cursed Golem AIP 15 -> 12, energy 50k to 200k.
    • Botnet Golem AIP 40 -> 25, energy 50k to 400k.
    • Black Widow Golem AIP already 11 since early officer, energy 50k to 150k.
    • Hive Golem AIP 20 -> 15, energy 50k to 200k.
  • AIP costs of capturing arks have been reduced, and their energy has been increased.
    • Rorqual Hegira AIP 8 -> 7 even though early officer, energy 7k to 100k.
    • Thanatos AIP 10 -> 9, energy 7k to 100k.
    • Gyrn, the Voidhome AIP 10 -> 9, energy 7k to 100k.
    • Orchid AIP 8 -> 7 even though early officer, energy 7k to 100k.
    • Ark One AIP 8 -> 7 even though early officer, energy 7k to 100k.
    • Belle Prime (DLC1) AIP 10 -> 9, energy 7k to 100k.
    • Great A'Thomek (DLC1) AIP 10 -> 9, energy 7k to 100k.
    • Nodorian Tortoid (DLC1) AIP 10 -> 9, energy 7k to 100k.
    • Sol Ater (DLC1) AIP 10 -> 9, energy 7k to 100k.
    • Grand Salvage (DLC1) AIP 10 -> 9, energy 7k to 100k.
  • AIP costs of capturing lone wolves have been reduced, and their energy has been increased.
    • All three lost spire frigate variants AIP 15 -> 11, energy 15k to 250k.
  • Thanks to Strategic Sage for starting the discussion on the energy costs being way too low, and Zeus, Lord of Nothing, and others for suggesting refinements.

Base Game Updates

  • The game is now way more explicit about when it is in the middle of mapgen or not. You can call a variable right on the Mapgen class to find out if that's the case, now.
    • During mapgen, GetControllingFaction() on planets now uses much more complicated logic that is based around a lot of mapgen-specific logic, which means that things are correctly attributed and units that are intended to be seeded "belonging to the planet owner" now properly do that instead of belonging to no one.
    • Thanks to CRCGamer for reporting.
  • In the event that you load an older savegame into a new one that has different energy balance, if it dropped your net energy below zero, you're now given a free handicap of extra energy to not wreck that campaign.
    • This is logged into your debug log, and then you can also see it in the tooltip for energy at the top of the screen.
    • The idea here is that we do need a free hand to be able to rebalance energy at times, but we don't want to be wrecking existing games as we do so. And modders frequently have the same sort of needs.
    • With this, if we or modders need to make changes, the game will just automatically help you out and keep your existing saves from becoming unplayable due to brownout.
  • Add hotkeys to build 1/2 and 1/3 of total capacity of some structure when you hold the hotkey and click in a spot, default unbound.
    • Thanks to donblas for implementing this!

Mod Updates

  • Civilian Industry: now no longer creates AI raids. The performance drops from those were too much. This means the faction is essentially "free". The AI gets nothing to counter it.
    • For the future: instead use a variant of the wormhole invasion to create a similar AI response against civilian.
    • Thanks to ArnaudB for adding this in.
  • The Reprocessors mod by CRZgatecrusher has been updated to the latest code standards.

Multiplayer Improvements

  • Fixed an inversion of boolean logic with Network_FrameToStartAnyProcessing on ships, which may have been one cause of ghosts; it's hard to be sure.
  • Updated multiplayer clients to track how long it has been since they have heard from the host to be based on the number of sim cycles rather than using realtime OR game time.
    • Doing it via gametime would have adverse effects with regard to the fact that things take realtime. But using realtime like we had been doing had adverse effects if the simulation got paused for a bit waiting on something. For instance, we don't want a temporary network outage to cause the client to suicide all units and then have to rebuild them.
    • The method of using sim steps as the count (each one is approximately 100ms) lets us be far more granular with our checking, because we know that communications must be open for these to be progressing, and yet it is also game-speed-independent.
    • Based on this, all the things that say "it's been x amount of time since this unit was touched by the server" are based on this metric rather than actual realtime (which is what it was before).
    • Also based on that, we now have it set to murder ghosts after 4 seconds, rather than 60 seconds (curiously, it actually turned out to usually be 64 seconds.
    • Thanks to Bummeri and greyhoundgames for reports in this area.
  • Fixed a cross-threading exception that could happen in particular on multiplayer clients.
    • Thanks to KaleR for reporting.
  • Fixed an exception that could happen in DoBailOutChecksIfWasJustCrippled() after units were crippled on MP clients, even if you were not using bail out code.
    • Thanks to KaleR for reporting.
  • Fixed an exception that could happen when trying to unload transports on MP clients. This again is something that just needs to be run on the host in the first place.
    • Thanks to KaleR for reporting.
  • Fixed an exception that could happen during AOE damage calculations on MP clients.
    • Thanks to KaleR and Jusa for reporting.

Beta 2.811 Brief Beta For Balance

(Released April 28th, 2021)

  • Took a quick moment to add a new DoForEntitiesParallel() set of methods, which are centered mainly around wide-spanning "reset or prepare all the things for something that's coming."
    • This is something that should add quite a bit of performance to a few specific areas of the game, but it's really not something to use if you don't know exactly what you're doing in the code. This is the warning label.

Balance

  • Balance Changes
    • Fixed description of dire forcefieled guardian to say units protected by the shield do full damage (instead of only half)
    • Added a 2.2 strength multiplier to the Shredder Dire Guardian -- its strength value was wildly underestimating it because its drones weren't considered
    • Usurper metal cost 12,000 -> 100,000
    • Tier 1 exgalactic unit energy increase 15K -> 50K
    • Tier 2 exgalactic metal cost 2M ->5M; energy increase 15K -> 75K; armor thickness 180 mm -> 245mm
    • Tier 3 exgalactic metal cost 2M ->6M; energy increase 15K -> 100K; armor thickness 180 mm -> 350mm (except Jackalope); mass 8tx ->12tx
    • Tier 4 exgalactic metal cost 2M ->8M; energy increase 15K -> 250K; armor thickness 180 mm -> 350mm
    • Flenser metal cost 2M ->10M; energy increase 15K -> 1M
    • Thanks to Zeus for adjusting.
  • When they are spawned (they always spawn as "early officer fleets"), the following arks and golems no longer have any ship lines included with them:
    • Black Widow Golem (also had AIP capture cost reduced from 15 to 11).
    • Ark One (also had AIP capture cost reduced from 10 to 8).
    • Orchid (also had AIP capture cost reduced from 10 to 8).
    • Rorqual Hegira (also had AIP capture cost reduced from 10 to 8).
    • This lets you keep the option to get a golem or Ark early in the game, but without a giant mass of other ships coming along with it.
    • This doesn't stop this early officer from being stupidly overpowered in most real games, but it does keep there from being such an abundance of extra ship lines right away.
    • This really wasn't exactly what Strategic Sage had in mind when we discussed this, since the golem/ark itself was what was so overpowered, but that's something we'll deal with in a different fashion.
      • On difficulty 6 and down, we are continuing to seed these exactly as we have up until now (within 1-4 hops of a single player homeworld), since this is indeed quite a big boost and is a great early introduction to the game.
      • On difficulty 7+, we are now seeding these "early officer" fleets 6-16 hops away from any of the player homeworlds. This makes them still a presence in the game (and an interesting and inexpensive item you can pick up), but not an early-game power-maw.
    • Thanks to Strategic Sage for the discussion that led to this (among many other things that are coming soon).
  • The ARS now gives 3 strikecraft ship lines as options, rather than 4. Still 1 frigate ship line.
    • Similarly, the TSS now gives 3 turret options rather than 5.
    • And the ODSS now gives 3 other defensive options rather than 4.
    • The idea here is to prevent not quite so overwhelmingly many choices, especially when you consider how many ARSes and TSSes and so forth are actually out in the galaxy in general. This is a very small trim in the main, but it should make things less overwhelming as well as preventing these ship lines from being so devalued from being so common.
    • Thanks to Strategic Sage for the discussion that led to this.
  • The "Mark 2 will automatically be reached for the AI if you have at least 10 strength outside of transports on one of their Mark 7 worlds" now only applies to difficulty 10.
    • Similarly, the "Mark 3 will automatically be reached if you have at least 10 strength outside of transports on their homeworld" also only applies to difficulty 10.
    • Anyone who is playing difficulty 10 is looking for a rough time in general, and there are various ways to attempt to lobotomize the AI by keeping the AIP so incredibly low that the AI barely gets to act. That's not really a normal game at all.
    • Additionally, when this new mechanic was introduced, originally it was to spare players the angst of trying to keep their AIP below the threshold where the AI marks up. The reasoning was that if players did not have that stress point, then they would just freely use the AIP up to the threshold for mark 4 of the AI, and have a more interesting and dynamic time because of it.
    • However, what was actually happening in midlevel and low-level play is that this was essentially outlawing low-AIP gameplay styles, in favor of mid and high AIP styles. For difficulty 10, it makes sense to go ahead and keep this in place because difficulty 10 is its own beast, but for the whole "don't want people to stress about the mark-up thresholds" side of things, that argument just hasn't really held water over the long term, and it invalidated some play styles without meaning to.
    • Thanks to Strategic Sage for the discussion that led to this change.
  • Regular engineers can no longer seed in the ODSS. You'll only get the interplanetary variety, now (which are better). This should also solve the issue of having multiple groups of engineers clogging up the ODSS. However, please do let us know if you do still run into (freshly rolled) situations of too-many-engineers.
    • Thanks to donblas for reporting.

Bugfixes

  • In the event that something causes a ship to change states of matter, and that ship has a "forced to always be state of matter" that is not the default (realspace), then when that ship returns to "normal" it will now return to what it is "forced to be" instead of realspace. This should solve a variety of edge cases for unusual units.
    • Thanks to Zeus for reporting.
  • Adjusted things so that non-human factions can never have the crippled status on their units. So even if a human-style golem gets added to an AI (as was happening with some DLC2 golems and the Gladiator AI type), you'll never run into them being immortal crippled gods. This seemed like the most expedient way to fix the issue, especially when thinking about mods that might make the same sort of error. Just make it not an error.
    • Thanks to Zweihander2021 and Zeus for reporting.
  • Fixed a bug where certain types of golems being added to the AI could wind up having a little fleet of their own, whereas they should have been "just another AI unit."
  • If mapgen can't seed something really close to a specific faction despite wanting to, because of not finding a planet of that faction, it will now throw a visible error during mapgen. It also does a better job in general of trying to find such planets, though. This should hopefully solve the occasional mystery of why one player in multiplayer doesn't have an ARS near them.
  • Made a few of the lists and dictionaries from ArcenSimContext obsolete, and require developers/modders to use [ThreadStatic] local variables for those ones instead.
    • This actually helps to solve a few bugs where we could run into more threads than expected sharing one of these variables and thus running into a problem.
  • Related to the above, a variety of methods for counting planets or iterating over planets no longer require a context to be passed in, and the version that did is marked as obsolete.
    • Here again this lets us avoid some cross-threading problems that were rearing up lately.
  • Fixed a rather funky exception that could happen inside of DoForPlanetsWithinXHops() at random times, but most particularly within mapgen.
  • Put in a variety of defensive code to prevent any exceptions in GetIsPlacementPointSafe().
    • Thanks to CRCGamer for reporting.
  • Put in some defensive code to catch any exceptions in UpdateDataForPlanning().
    • Thanks to Zeus for reporting.
  • Fixed "When Crippled: Bail Out To Nearest Friendly Planet" to properly have text saying that it defaults to off.
    • Thanks to Smidlee for reporting.

DLC2 Mechanics

  • On ship systems, you can now define a inflicts_state_of_matter_on_target_for_seconds="60" or whatever to inflict a certain state of matter on any units that are shot by that system for a certain amount of time. You specify which kind of state of matter with state_of_matter_for_target_to_become="MultiPhase" or similar.
    • This allows for ships to throw other ships into solo or multi phase states, as desired. Either taking them out of the battle for a bit, or bringing them to a secondary battlefield where they can be throttled for a while.
    • Thanks to Zeus for requesting (for DLC2).
  • Added a new cannot_inflict_state_of_matter_if_target_has_any_shields_up="true" option for those same sort of ship systems, which makes it so that if the ship had any sliver of personal shields in place when the shot impacts, it will not cause the change in state of matter.
    • Thanks to Zeus for suggesting for DLC2 mechanics.
  • Added cannot_inflict_state_of_matter_if_target_has_energy_usage_of_at_least="3000" (or whatever number) for those same sort of systems.
    • For this, if the number was set to 3000, then any ships with 3000 energy usage or more would not be affected by this phasing change. Any with 2999 would. Any ships with 0 energy usage will always be affected no matter what.
    • If this field is omitted, then all targets are affected.
    • Thanks to Zeus for requesting for DLC2.
  • Added a new must_be_this_state_of_matter_to_be_enabled="MultiPhase" (or whatever), and a companion care_about_state_of_matter_to_be_enabled="true" for systems of any type (NOT just weapons! Can also be tachyon or tractor or whatever).
    • If the latter is true, then the desired state of matter must match that of the ship itself. So if the ship is currently in multi-phase, this gun turns on. If it's in normalspace, it turns off. Or vice-versa, as you prefer.
    • As noted, this can be used for all sorts of systems, so there's a lot of flexibility there.
    • The care_about_state_of_matter_to_be_enabled="true" might seem redundant, but it's way more efficient to check, and easier to override in copy_from children.
      • So that must_be_this_state_of_matter_to_be_enabled attribute is just completely ignored unless care_about_state_of_matter_to_be_enabled="true", which is nice.
    • There is also a new is_invisible_in_tooltips_if_not_a_match_by_state_of_matter="true" that you can turn on, which makes the systems invisible when the ship is the wrong state of matter to be using them. Otherwise you can see the system all the time, but just with the note "this only works if the state of matter of the ship is X" on there.
    • Thanks to Zeus for requesting for DLC2.

Base Game Mechanics

  • Added tachyon_hits_albedo_more_than. This can be used on its own, or in conjunction with tachyon_hits_albedo_less_than.
    • The tooltips adapt to show less than or greater than or a specific range, as needed.
    • Thanks to CRCGamer for suggesting.
  • There is now a new auto_seeding_on_planets sub-node that you can put on units, that specifies what planets they should be placed on, and what chance they have of being placed on planets of that sort.
    • Please note that this is something that is to be used sparingly, because for each unit, it is evaluated individually rather than as some sort of pool. So these are mainly for fixtures that should have a decent chance of being a part of any given planet matching the description.
    • There is a planet_type attribute on this, which must be one of the following:
      • None, Mark1, Mark2, Mark3, Mark4, Mark5, Mark6NonBastion, Mark7NonHomeworld, AIBastion, AIHomeworld, PlayerHomeworld.
    • There is then a chance_of_seeding attribute, which should be an integer number between 0 (no chance) and 100 (always seeds on every matching planet in every game).
    • Please note that, as with resource_production nodes, these are cleared and start fresh when you move to a copy_from, but they are retained with "parial record" modifications.
    • At the moment, the only possibility when seeding these is that they seed belonging to the same owner as the planet they are seeding on. If we need to get more complicated than that later, we can do so.
    • This is currently untested, as we don't have any units to seed using this yet, but the format would be like this:
      • <auto_seeding_on_planets planet_type="AIHomeworld" chance_of_seeding="90"/> if you wanted to have a 90% chance of seeding a given unit somewhere on each AI homeworld.
    • Thanks to CRCGamer for suggesting.

2.810 Hotfix for Death

(Released April 28th, 2021)

  • Fixed a bug in the prior version where ghostbusting was being so thorough that it was actually preventing things from dying to remains, or being crippled, on hosts and single player machines. The "deep scrub ghosts" logic now only applies on multiplayer clients, and if it gets a bit overzealous and scrubs something too much, the host will be along to fix that very soon after.
    • It's possible that if this leads to brief visual artifacts on the client in an ongoing fashion (that remains to be seen), that we could make this specifically exclude things that die to remains or things that are crippled rather than dying, etc. We'll need more MP testing feedback to know if that's required or not.
    • Thanks to Democracy, donblas, bahrman, and psychophilosopher for reporting.

2.809 Self Optimization

(Released April 27th, 2021)

Balance

  • Balance adjustment for Space Planes and Mirage strikecraft
    • Damage reduction value against distant foes reduced from 99% to 90%
    • Base health doubled from 1200 to 2400
    • The Mirage had its strength multiplier value raised to 2 from 1.6 to account for its shield ignoring damage which quickly disposes of most system defenses when deployed in large numbers.
    • The Mirage had its AI purchase price raised from 15 to 18 to match the price of the Space Plane the base variant. The more dangerous version being cheaper was leading to some gargantuan sized stacks in games with particularly bad RNG for the player.
    • Both ships should now be much closer in estimated strength value to their actual impact since a 99% damage reduction effect against fixed defenses that cannot close distance basically made even a simple mark one stack of ~60 ships have over seven million effective health. Now that same mark one stack would only have about a million and a half effective health. These ships are still quite dangerous if you don't have a nearby fleet or specific counters handy, but shouldn't chain wipe multiple systems on their own.
    • Thanks to CRCGamer for adjusting.
  • Adjusted Expatriate Tech cost scaling
    • Previously was 2000, 2750, 5000, 7500, 10000 science cost.
    • New adjusted costs of 1000, 2500, 4000, 5500, 7000.
    • Makes grabbing a few ranks to improve HRF unlocks or Outguard easier to swallow while the final two ranks are still an expensive splurge.
    • Thanks to CRCGamer for adjusting.

Performance

  • Updated the central DoForPlanets() type methods to now have a SingleThreaded and Parallel variant for each one.
    • The parallel versions are able to run on a ton of threads at once, and are way more efficient. However, there are very strict rules about how they are allowed to touch data. If you're a modder (or developer) for the game, and you don't fully understand what you're doing with this aspect of threading, then always just choose singlethreaded. It's slower but safer.
    • So far, we've used the parallel variants in a few places that should dramatically speed up a few areas of code that were previously bottlenecks in really large galaxies, or with lots of battles going on.
    • There are more places where we could use this, but those would take some refactoring to port over for various structural reasons, so we'll just handle those as they become pain points.

Bugfixes

  • Fixed a couple of cross-threading exceptions that could happen in Base_StrengthData_PlanetFaction_Stance even in single-player on suitably multi-core machines.
    • Thanks to abuchris for reporting.
  • Silenced a pointless "Null ArcenShot InstancedRenderer" error that could happen in ReactToShotHittingSquad() in certain cross-threading instances. Originally we had that code in place to make sure there were no problems, but now it's definitely pointless.
    • Thanks to abuchris for reporting.
  • Fixed a few more cross-threading issues that could happen in GetEnergyUsage() and similar on units.
    • Thanks to abuchris and Bummeri for reporting.
  • Fixed a pretty huge mistake in GetEnergyUsage() where if it could not find the fleet membership, it was using the shield amount of the unit rather than the energy cost of the unit.
    • It's likely that this was never really being hit, because the fleet membership should always be there except when something is in the middle of teardown anyhow, but still oof.
  • Fixed some more cross-threading issues that could happen in DoEntitySecondLogic_FromSimBGThread().
    • Thanks to abuchris for reporting.
  • Fixed a cross-threading exception that could happen in CalculateSpeed(), more likely in MP than SP, but possible in both. Also sped up this method for stationary units in general.
    • Thanks to abuchris and Bummeri for reporting.
  • When the count to spawn on death is set to zero, it no longer throws an exception warning you of this when that type of unit dies. This makes it possible to override that field on copy_from children in the main game or in DLC or mods.
  • If count_to_spawn_on_death is zero, then the "on death, will spawn" part of the tooltip won't show. This is very useful for when we are using copy_from and then forking a unit to not spawn something on death.
    • Thanks to Zeus for reporting.
  • Fixed a number of rare cross-threading bugs that were possible inside of the shot visualizer.
    • Thanks to slake-moth for reporting.
  • Fixed an exception that could happen in GetNumberOfTimesHacked() after a number of hacks were performed on various units.
    • Thanks to Therival for reporting.
  • DoOnFail_CalledFromMainSimOnly() now has very granular exception handling, and will report problems that it has in a sub-area, as well as not actually breaking the entire flow if just part of it goes wrong.
    • Thanks to greyhoundgames for reporting.
  • Fixed some cross-threading issues that could happen with hacks that were in the middle of being failed throwing exceptions. (It's possible that these were things that also had a success but then were triggering a fail at the same time for some reason, but both should be fixed now).
    • Thanks to greyhoundgames for reporting.
  • When a TSS or similar has too-few items to grant, that should now auto-repair itself just like the too-high case does. This is untested so far, so please let us know if that's not the case.
    • Thanks to Metrekec, ArnaudB, GreatYng, and others for reporting.

Multiplayer Improvements

  • In the event that a given unit on a multiplayer client has not gotten any updates from the host for a full 60 seconds, have it just suicide itself.
    • This is a very long timeout, but we want to make sure that this does not kick in by accident if at all possible. Brief interruptions in network connectivity, or a particularly difficult load of ship syncs to cycle through shouldn't be able to accidentally trigger this, is the goal.
    • That said, in the context of 4-5 hour gaming session, or even a 20 minute gaming session, this should hopefully act as the ultimate end-stage "goalie" to catch any client ghosts that sneak through in any other fashion.
    • Thanks to abuchris and Bummeri and their playgroups for reporting.
  • In general, added a two-fold new thing for deleting units that we want to have die.
    • On MP clients, it keeps a record of all the things that the host asked it to delete but that it could not find. If those units later do a ghost check, those units now also check that central list. If they find their name there, they kill themselves rather than going through infinite more ghost checks.
      • The amount of added processing caused by this on clients should be pretty low, and it should make some ship deaths more responsive.
    • In general, when ships die on one of many background sim threads, we now have them write their death into a central concurrent dictionary. The death cleanup process looks through this along with the usual stuff it looks through, and this thus prevents things that are not in the central registry properly from being immortal ghosts.
      • In theory this could have some singleplayer or host applications, but mostly this helps MP clients, at least at the moment. Here again, this should lead to rapid responsible ghost death, and hopefully avoiding hitting the 60-second goalie.
    • Thanks to abuchris and Bummeri and their playgroups for reporting.
  • Added two new commands to the game:
    • cmd:stop sim: Stop the simulation. This halts the simulation on your machine until you enter the command a second time. This can be useful for artificially inflicting "very behind" status on an MP client and then seeing if it can catch up.
    • cmd:resync: Send a fresh copy of everything from the host to all clients. Previously, the only way to really do this was to disconnect and reconnect. This should prove to be a much quicker way of accomplishing the same thing.
    • Details: https://wiki.arcengames.com/index.php?title=AI_War_2:Cheats
  • A variety of the long-term continuous threads are now explicitly barred on multiplayer clients. Something funky is going on where clients are getting some extra orders from somewhere (which is leading to a rubber band effect during battles), and this doesn't seem to be the answer, but it is at least ruling out some possibilities.
    • At the moment we have a test case multiplayer game that rubberbands constantly, and we seem to have reduced the severity of it a bit, but it's still pretty bad. We're still looking into the source of that.
  • The scope of where random seeds are reinitialized for combat rounds has been narrowed down to specific planet factions at each planet. This makes it so that if there is a simulation divergence in one faction on a planet, it won't bleed over into ships of other factions on the same planet. This does help to keep the host and client more in sync in MP, but it isn't the root source of rubber-banding, it turns out.
  • Added a new ArcenGameDebugLogger that allows us to log arbitrary data from the game simulation at various points in a thread-safe fashion (so it does work inside Parallel loops) so that we can do things like compare the output from a host and a client.
    • The rubber-banding issue during combat is something that we can reliably reproduce within seconds with one save in particular, and it really marrs the multiplayer experience, so we'd like to figure out where the heck the simulations are diverging and why.
  • Added a huge amount of debug output options to MovementPlanning, since we were seeing divergences on the client and the host. We're now able to see what actually happens, and more or less why (when we turn the option on in code).
  • Adjusted things so that the auto-kite settings are now properly set in an MP-friendly fashion for the warden and hunter kite-master variants.
    • There's now a centralized method for MP-safe setting kiting settings.
  • The UnitsAutoKite variable on factions has been renamed to UnitsAutoKite_NeverSetDirectlyOrItBreaksEverything, since it seemed to be being set by some outside process.
  • The way that partial-sync status is transferred has been condensed into one style, whereas before it had been split in two, because this makes things vastly more straightforward to make sure are correct.
Death Of Rubber-Banding
  • Fixed an incredibly annoying bug where ships were seeming to rubber-band away to one direction and then back on MP clients. Not always, but if it was happening to you then it was constant.
    • This was the result of actually a much more serious bug that was introduced in the last week or so -- back when the bandwidth for the game was majorly improved, whatever release that was.
    • Normally we were inferring the position of factions in the central index, and taking their data in that way. If there are 18 factions and we send them all in order, then the first one is 0, and the last one is 17. Pretty easy. It doesn't save much data, but why not.
    • Well, I'll tell you why not. When I later had the clever idea to only send player faction data on the highest frequency, it started putting those at position 0 and 1 (0 typically being "natural objects"/nobody, and 1 typically being the first AI but not always) in a two-empire game. This meant that in a two-empire game, it was likely that if the second empire had ship kiting on (it is on by default), then it would turn kiting on for just the client on that first AI faction. This would cause the ships to behave wildly differently on the client compared to the host, leading to constant corrections from the host, aka the rubber-banding.
    • Mitigating this problem was the fact that every second or so, the data for all the factions would get fully copied back over, so player data was no looking entirely insane, and mostly this was being applied to just one AI faction or similar, anyway. But then a few hundred milliseconds after that, it would come back in and write the wrong data into the AI faction again.
    • Overall it's hard to guess how many strange bugs in the last week or so were caused by this, but apparently all of them were subtle enough that just the kiting was abundantly clear since it caused rubber-banding.
    • Thanks to abuchris and Bummeri for reporting the rubber-banding, and giving an idea of how to reproduce it.
Client/Host Collaborative Bandwidth Optimization
  • The host and client now have more robust communications with one another about where exactly they are in the sim-processing pipeline. In the event that the client finds out it is more than 400ms behind, it will start showing a little notice in the upper right corner. In the event that the host becomes aware that a client is at least 1 second behind, then it will show a notice about that.
    • Using our new "cmd:stop sim" command to artificially stall out the client (as if the network connection were interrupted) and then restart it, we see the client doing a proper catchup without any incident at the moment.
    • There are some folks reporting some command lag, and if that is happening then we should start seeing these notices, at least. It may be that the command lag was an artifact of the wrong-faction data being passed in the prior build, or the rubber-band desync data. But in case it's not, now we'll have more information to work with.
    • It's possible that potentially the host is filling the client channel with too much sync data in some cases, causing it to fall behind in a way that this wouldn't replicate, so next we'll deal with that by essentially requiring acks for sync data on the client.
    • Thanks to abuchris and Bummeri for reporting.
  • It's possible that the host was sending sync data at a rate that clients could not handle, in some cases, leading to a general backup of data until the connection is broken and reformed.
    • This isn't something that we can easily check for, but it logically stands to reason, because -- unlike the central game stuff -- we don't ask for any kind of acknowledgement of receipt on that data.
    • Now we do. On the host, underneath the Sync Cycles info in the escape menu, you can now see it counting up a bit more slowly, as it is waiting to hear back from all clients before proceeding.
      • Sometimes a client won't answer, though. Maybe the client just connected and it missed the message, or maybe the client disconnected but hasn't been pruned yet.
      • When this happens, then the host machine will start counting to 60 over sim frames, which might take around 6 seconds overall.
      • If that's happening, you'll see the "waiting for acks" count go above 0. When it hits 60, then it just says "okay, nevermind waiting on the clients, just move to the next."
      • The "Acks Skipped" count will then go up by one, and the most likely result is that all the clients start responding with acks properly after that. After initial connection, you're should be very unlikely to see any Acks skipped, but one or two acks skipped at the very start of a connection to the host is just fine.
        • Huh! Actually, after running for a while, we randomly saw an ack skip happen again, in our own testing. This might actually be some evidence of the network client being overwhelmed, and it gives all of the clients a chance to breathe a bit and catch up.
    • Overall this winds up reducing the bandwidth usage a bit, depending on how quickly the clients respond, anyhow. This does NOT pose any risk of actually slowing down the game simulation (actually, kind of the opposite).
    • This also does not slow down the sync data for the ships themselves, as that's on a separate process that we're not throttling via these acks.
      • There's a very outside chance that the ship data could stack up enough to where this is a problem, in which case we'd need to add acks for that as well. Right now in our testing, we're seeing 75% of the data sent from the host as ship sync checks and divergent ship fixes, so it's possible that now that has shuffled into the top spot as something that actually can become a runaway process.
  • Okay, one last communication vector between the client and host now has acks involved. (The clients all having to say "I heard you and got the data" before the host says the next big chunk of data).
    • This overall is not a giant bandwidth reduction, and it is not too much of a slowdown in how quickly ship sync cycles are completed, but depending on the nature of your network connection between the host and the slowest client, this will cause the syncs to inherently adapt to their environment.
      • Put another way, in a semi-ideal case, the bandwidth is not really lowered. But if things get congested or there's a lot of packet loss, then this will inherently slow down the process rather than just flooding the client with sync info.
    • Overall even in a semi-ideal state, this does seem to be closer to 50% of the network traffic now rather than 75%, so we must have reduced the overall volume if that's the case. It's hard to be too precise between runs, but it does look like maybe a further 20% to 30% reduction in bandwidth usage.
    • Most importantly, these changes are adaptive to nonoptimal network environments of all sorts while not actually slowing down the gameplay, so it should yield better results in basically all situations.
    • The only data beyond this that we could really gate behind acks is all too central to the game running smoothly, and it's also a tiny minority of the data being sent (15% or so), so those will remain un-gated.

Mod Updates

  • AMU:
    • Removed some leftovers from AJEA (Auto-Juggle Energy) debugging.
      • Thanks to Chris McElligott Park for noticing.
  • Kaizers Marauders:
    • Nerfed the Raid Super Battleship's health, shield and damage by 40%, and it loses its boarding strike weapon. It was a ball of super-powered steamrolling nonsense.
      • Thanks to ArnaudB for the balancing feedback.
  • Extended Ship Variants:
    • The Engineering Transport Flagship no longer shows that it's "claiming neutral units" but instead "assists claiming units", similar to engineers.
      • Thanks to Sorrydough for reporting most recently, but I think others reported it a while ago as well.
  • AMU / Kaizers Marauders:
    • Updated to fit the most recent changes in the Vanilla codebase.
  • AMU / Kaizers Marauders:
    • Made some fine-tuning for the DoForPlanets code to avoid cross-threading issues.
    • While doing so found a bug in the Fireteam Maintenance code where it was not moving units to planets of their fireteam if they had no orders at all but still were on a wrong planet. This may already have been caught by the Vanilla fireteam code, but it's good to have fixed.

2.808 MP Ghostbusting

(Released April 23rd, 2021)

  • Add an additional beginner journal for after you've taken the nearby ARS and flagship.
    • This is very placeholder-y and needs to be rewritten by someone more skilled at the game
  • The Hacking menu now shows an estimate strength response for many hacks.
    • This estimates are more what you call guidelines than actual rules. The goal is more to let you see "Oh, this will be something like 10-20 Str response; easy" vs "This is a 200 str response. I need to bring lots of forces"
    • Not every hack has an estimate
  • Some improvements to the ARS section of the beginner journal pointing out that hacking an ARS three times is often risky
  • Added a new "Hacker OS" planet name set by ZeroTheHero.
  • "The Reprocessers" mod by CRZgatecrusher has been updated to have proper shortnames and work with the new sidebar styles better.

Balance Adjustments

  • Make the AI less susceptible to being trapped by forcefields
    • If you have blocked some AI ships retreat path with forcefields over a wormhole, they are now allowed to find another wormhole to retreat to
    • This behaviour is only for AI difficulty >= 7
  • Increased metal production of Zenith Metal Generator from 3000 to 5000 m/s.
    • With energy metal production and costs having been increased in the paradigm, it felt underwhelming for a structure you need to defend, and gave to little of a boost.
  • Increased energy production of Zenith Energy Generator from 600k to 900k.
    • Same logic except it felt lacking compared to economical stations. This makes it great wihout being OP.
  • Increased hull and shield of both Zenith Generators by 10x. This makes them roughly as resilient as a Forcefield mark III. So they don't instantly die the moment forcefields go down. They are very pricy to repair though.
    • Thanks to ArnaudB for adjusting.
  • AI Risk analysers are now less significantly punishing than having Fallen Spire active.
    • Base ExoStrike budget reduced from 20k to 10k. This means the strikes have less strength but are launched faster. (for comparison, One spire city in Fallen Spire intensity 5 is 8k.)
    • Exo strike starts charging after 55min of 40min of gametime.
    • Income for Exostrikes from Risk Analysers changed: 15->50 budget for AI-held analysers, 50->30 for neutral analysers, 150->75 for player-held analysers. With 7+ Analysers, the income from each analyser in all three cases is lower.
    • This change makes using the faction compelling to players instead of an overwhelmingly bad deal. It was worse to hold the analysers than to kill them in every situation. Now, you want to actively hunt down the analysers an deal with them one way or another, because they provide much more income in the AI's hands. Exostrikes are also more common and less deadly, thus better able to take advantage of well-timed CPAs and Waves, instead of a doom tsunami when those happened to sync up.
    • Thanks to ArnaudB for adjusting.
  • Hacking cost on ARSes has been reduced back from 16 to 12. There was a lot of discussion on this, and the boost a build or so back from 8 to 16 was more than had been intended by those originally proposing it. Apologies for misunderstanding, and thank you to everyone for the discussion!

Bugfixes

  • Fix a bug with tutorials introduced in the last patch
    • Thanks to greyhoundgames for reporting
  • Added wrappers to catch exceptions happening in UpdatePowerLevel, CheckIfPlayerHasSeenFaction, and UpdatePlanetInfluence in factions, and make it clear which factions had the error while also not blocking proper execution of other factions.
    • If a mod in particular has an exception in one of these methods, it will now have less of an impact on the rest of the game.
    • Thanks to various folks for reporting the errors in some mod factions here.
  • Fixed a cross-threading issue that could occur in CalculateCurrentShieldRadius(), most commonly on MP clients.
    • Thanks to Bummeri for reporting.
  • Recompiled Civilian Industries because of nonspecific report of them having some sort of exception. Everything seems okay at the moment, and we don't play the mod directly, so until we get a report with more details there's not a lot we can do.
    • There is currently a bug in the Kaizer's Marauders mod that is pending a fix from that mod author, so it may have been having downstream effects on other factions. The changes in this build overall should keep mod faction bugs from impacting other factions.
  • Preemptively fixed a lot of potential rare cross-threading issues in the core unit logic. Preferable to picking these up randomly as they trickle in, largely through MP play.
  • Adjusted a piece of onstart code that allows Kaizer's Marauders to work again.
    • Thanks to various folks for reporting, and NR SirLimbo for helping coordinate what his mods needed versus what the game was now doing, and why.

MP Ghost Busting

  • Fixed another way in which multiplayer clients could have "ghosts" left behind after battles.
    • This is actually a two-pronged thing, with some ghosts that you could even hover over not being zapped before, and with others that disappeared when you hovered, but did not disappear until then because of something like the unit being set to be new to the planet continuously.
    • Both cases are now caught, but it's still possible to have some ghosts in some cases that last for up to 3 realtime seconds or until someone hovers over them. We can pretty much reliably reproduce that, but thankfully that's fairly fast self-correct even if it's not as fast as under a second like the bulk of cases.
    • Thanks to Bummeri for reporting.
  • On MP clients, you can now see how long it has been since a ship has been updated by the server by hovering over it. If it has been more than 5 seconds (realtime, not game time), it will show up in red in general.
  • Made some adjustments on MP servers to do more thorough sync checks in general, which leads to fewer ghosts!
    • This was a case of saving some data to be clever, but in the end causing far more data to be sent in the first place, sigh.
    • This new change has now dramatically cut down the amount of sync data that we send, while at the same time making the client correct faster, aka feel more responsive.
    • Ghosts still happen and get caught, but it's far fewer of them, and they do all seem to be caught by the above process now.

Steamworks Update

  • Updated Facepunch.Steamworks to the newest version from their git repository, moving up from the prior version that was from July 6, 2020.
    • It's notable that under the hood they are now calling a newer version of some of Valve's networking APIs, which I didn't even notice was a thing that Valve did (they do it for backwards compatibility with old games). So hopefully that makes some positive differences.
  • Updated our usage of the Steamworks API to version 1.51, which for OSX also includes shifting the usage from their .bundle file (older) to their new .dylib file.

2.807 Beginner Journals and MP Sync

(Released April 22nd, 2021)

  • Blitzkrieg turret now fires 36 drones every 17s instead of 12 every 6s. This gives the AI more windows to close in before being assaulted by the next wave.
    • Thanks to ArnaudB for adjusting.
  • Blitzkrieg: Reduced hull for Automated Drones from 2240 to 1200 hull and Mini Automated Drones 750 to 400 hull.
    • Death of an Automated Drone creates 4 drones instead of 3 on death.
    • Speed of both drones increased to 2200.
  • Makeshift: Drone speed increased from 800 to 1600.
    • All of those changes make the drones rush in closer to the AI so they can be swatted by splash damage instead of arriving in an ever-stalling wave. The drones are gunbot-like health so they'll die like the chaff they're supposed to be. This makes both raid turrets more powerful on offense and hopefully weaker on defence.
    • Thanks to ArnaudB for adjusting.
  • Base hacking point cost for FRS hacks has been increased from 10 to 22.
    • Cruisers are now 18 instead of 10, and destroyers now 16 instead of 12.
    • Regular ARS is now 16 instead of 8.
    • The hope is to overall have better balance by not giving players SO much power at such a low cost.
    • Thanks to Strategic Sage for the suggestions.

Beginner Journal Improvements

  • Add some new beginner journals to give the player some early game direction. This kinda duplicates the same detail that is in the Intel Menu, but duplicating critical information is good design. I want a new player to feel like the game is actively poking them to make good choices.
    • After a minute of gameplay, the player gets a beginner journal journal entry chat saying "We think we've found a good target for you. See the Journal for more details".
      • The game has detected whether the closest ARS or flagship is the best target (the weaker of those two planets). The journal explains how an ARS or flagship works.
      • When the player has accomplished this first objective, they get a journal prompt about the second objective.
  • Both of these journal entries suggest looking at the Intel menu for more ideas

Bugfixes

  • When exceptions happen in trying to deserialize a table row by index, it now includes the field name properly. This will help fixing exceptions in those serialization areas.
    • Thanks to NR SirLimbo for the report that made it clear we had a gap here.
  • Fixed a funky exception that could show up on at least a few linux machines in the prior version of the game, typically when entering the lobby.
    • Thanks to Badger for reporting.
  • Added three more canaries that are network-only, these ones into hacking events, so that we can identify if there is a problem with them.
    • Thanks to NR SirLimbo for reporting an issue there.
  • Added another canary around the active hacking event on entities, again only for multiplayer. Code review seemed fine, so narrowing it down even further seems needed.
    • Thanks to NR SirLimbo for reporting.
  • Put in some extra paranoid canaries, for the network only, surrounding each kind of external data. That way if a specific mod or subfaction or whatever has a serialization issue, it will become apparent which one it was.
    • Thanks to NR SirLimbo for the report that inspired this change.
  • Fixed a super longstanding MP issue that has become more prominent recently, but has been hiding in plain sight basically since the start, breaking ship sync intermittently and also causing some other issues.
    • Essentially, on MP clients it would not properly say "I finished my current hack" on ships that were hacking. This led to situations where it tried to deserialize nonexistent hacking event data on the hacker every time the host would send it new data, which would then lead to serialization failures and in general a long and continual divergence in the simulations.
    • However, this was something that would fix itself on disconnect or reconnect, or save and reload, so that made this super extra hard to find. Until recently, it was also not clear that this was related to hacking events, because without the new density of canaries we didn't find out things were wrong until long enough after a hack finished that they didn't seem correlated to anyone.
    • This was surely a cause for various other UI and behavior problems on clients, such as likely inability to do more hacks with that hacker, and other things of that sort.
    • We have verified the fix, and knock on wood let's hope this is the last of the mystery sync issues!
    • HUGE thanks to NR SirLimbo and ArnaudB for the multiplayer session and report that led to this finally being discovered and nailed.
  • Fix a bug where ships in Exos weren't properly clearing their exo status if they were against something like a Spire City.
    • Thanks to kasnavada for reporting.

2.806 Correctness By Attrition

(Released April 21st, 2021)

  • Put a flair on AI defensive structures built by the Zenith Trader to make it easy to tell if they cause AIP on death
    • Further work from a bug report by mahisev350
  • Removed the dmg bonus for Nodorian as its main weapon damage did crazy damage.
    • Its attrition is also bugged, doing much less dmg than it should.
    • Thanks to ArnaudB for updating.
  • Reduced RorqualHegira shield from 1.5m shield to 1.0m shield. Reduced shield hack cost from 40 to 20, can be done twice.
    • This basically put it where it was.
    • Thanks to ArnaudB for updating.
  • Improve the hovertext for units that are warping in.
  • Some minor buffs to instigators. The 'Strengthen Wormhole Invasion' instigator should no longer spawn if the AI can't actually send wormhole invasions.
  • When a stacked unit takes attrition damage, it takes numStacks * baseDamage damage instead. This means that stacks are no longer a really effective counter to attrition damage.
    • Also a preemptive nerf to the nodorian totoroid.
  • Fix a bug where battle Notifications could report incorrect enemy strength.
  • Fixed an exception that could still happen in SetAllMembershipsUpFromDesignTemplates(), in MP or SP, largely during map generation.
    • Thanks to Bummeri for reporting.

Quite A Lot Of Multiplayer Improvements!

  • Canaries in MP in the prior version greatly narrowed down the ship serialization issue. Thankfully it does not seem to be in external code. However, we still can't find it. We've introduced one possible fix that is cross-threading related, but for now inserted more MP-specific canaries to get a more detailed snapshot of where the issue might be.
    • Thanks to Bummeri for reporting.
  • Our LiteNetLib implementation has been updated so that if a client disconnects but the host still has a few lingering messages for them, it won't throw any errors. If the client is supposed to be there or is in some other state, it also gives more information.
    • Thanks to Bummeri for reporting.
  • Revised the network sync a bit so that it once again checks the faction and the type of the unit when it comes to correctness.
    • This normally should not be needed, but it is a thing that can happen where ships transform but keep their ID, or in particular when they are gifted between factions (especially subfactions of the AI).
  • Also fixed a bug where when a ship sync happened and there was a faction mismatch, it was not properly changing the faction.
    • This was leading to things like "rubber band ships" on the clients where the AI "sentinels" ships would move in one direction on the client and then jolt back when sync caught them. This is because they were actually hunter ships, which would make different decision (aka sitting there) in this specific case.
    • Ironically, in the quest to save a bit of check data, this absolutely flooded the game with correction data since it couldn't correct things properly.
  • Fixed several exceptions that could happen because of cross-threading on MP clients in particular.
  • Fixed some more rare exceptions that could happen on MP clients when certain state was invalid and a ship tried to transform or similar.
  • Another source of strange behavior on clients (rubber-banding units, or unkillable units) was "ghost" units that were somehow still thought to be alive on the client, but the host knows are dead. When a client mouses over these sorts of units, they destroy themselves, but until then they mess with the client simulation quite a lot. Why exactly these exist is hard to say, but the clients now do a sanity check for potential ghost units, and request full syncs from the server on any of them that are ghosts.
    • The ones that are updated in this way are stale for SOME reason, even if they're not a ghost unit, so this should solve sync issues that can be missed via the main process.
    • In the escape menu if you have detailed info turned on, the client now sees a "Ghost Suspect Syncs" stat. Hopefully it doesn't go too crazy, but it's measuring this.
  • Whenever the game would normally do that "Memory Profile Debug Data On Game Exit" dump to your local log, if you were a multiplayer host or client it also now dumps how many messages and how many bytes were sent and received. For sends, it also has it broken down by channel.
    • This is one of those "hey, that's some useful trivia for us or end users and doesn't take much time or space" things.
  • MASSIVE savings in terms of amount of network traffic. We're talking roughly 75% savings for network hosts and clients. It's based on these two advanced features that have been added under the networking tab:
    • Host: Number Of Skips In Rolling Sync
      • The larger the number, the more of a break the network host takes between giving bulk data about updated planets, factions, fleets, etc to clients. This can dramatically lower the bandwidth requirements of the game, but can also make it take longer for errors to self-correct.
      • This doesn't really have an effect on units themselves, which are synced in a parallel process, so the bulk of things will be fine. Default is 2, but you can push it a bit higher without many issues if your bandwidth is that high.
    • Host: Number Of Skips In Ultra-Frequent Sync
      • The larger the number, the more of a break the network host takes between giving every-sim-frame sync data about things like faction data. This can moderately lower the bandwidth requirements of the game, but can also make the client see a slightly delayed view of certain central numbers.
      • This doesn't really have an effect on units themselves, which are synced in a parallel process, so the bulk of things will be fine. Default is 2, and it's probably okay to go a bit higher if you must. When it 'skips' one of these cycles, it still sends the human-player faction info, so that critical part happens no matter what.
    • This should also make the Steam Tubes style of networking way more playable in general, as the congestion on the main channel will be much lower. This was kind of an "oh, hey, we can do that" sort of moment that came as a surprise.

2.805 Relentless On Several Levels

(Released April 20th, 2021)

  • Fixed not being able to hack for a third Dark Spire design at the Vengeance Generator
    • Note: check if third hack blow up the VG.
    • Thanks to ArnaudB for fixing.
  • Two new kinds of mark level scaling have been added.
    • MobileLoneWolfFleetFlagship now gets whatever is assigned to is_default_for_lonewolf="true" (if there is anything).
    • MobileOfficerCombatFleetFlagship now gets whatever is assigned to is_default_for_officers="true" (if there is anything).
    • Thanks to ArnaudB for requesting.
  • It's not entirely clear what "Threat Waves" were in the current paradigm of the game, or if they were even working. At any rate, they were highly undesirable mechanically if they did work, and they were just an option in the lobby. They have now been removed.
    • Thanks to Democracy and Badger for suggesting.
  • Fix a bug where structures that had died back to neutral could incorrectly be reclaimable during battles, which was a needless resource drain as the AI killed the things you were rebuilding.
    • We were always looking at the "time we were created (ie game start time)" instead of actually tracking the "time we last were killed and reset to neutral", so we would always think that it had been a really long time since the unit was reset to neutral.
    • This was not really a problem until Metal Generators were more expensive to reclaim and the game was trying to reclaim them during a battle
  • Added a new GetDifficultyOrdinal_OrNegativeOneIfNotRelevant() that can be used on factions to get a difficulty or intensity for that faction if one is relevant. For most it just returns -1 right now, but for AI Sentinels it returns the AI difficulty.

Relentless Wave Intelligence Increase

  • When the game swapped to the Relentless Wave faction, waves also got dumber; they would only go after your command station every time.
    • Relentless waves are now smarter; the goal is more interesting and varied (and hopefully smarter and more dangerous) waves. Note that these advanced behaviours are more likely on higher difficulties (and usually won't happen at all on low difficulties).
    • Here are the rules
      • If there's a wave on a planet adjacent to your homeworld, the wave is allowed to just go for the the throat. Note the wave will only do this if it thinks it can make a real run at your king
      • If the wave is outnumbered on the current planet but there's a weak adjacent planet, the wave is allowed to go after the weaker planet
      • The default wave behaviour on a planet is "just fight generically, don't go after anything in particular"
      • The wave is allowed to go straight for your command station on higher difficulties if it thinks that is a good idea
      • The wave is allowed to go after structures that would generate AIP on death
      • The wave is allowed to dispatch really fast ships or cloaked ships to bring down your metal generators
  • Badger was thinking about Bellatrix's steam comment and that the waves could be much smarter. Then he remembered he had already written all that wave intelligence code, it just hadn't been ported over to the Relentless Wave faction yet.

Balance

  • Balance adjustments following yet another difficulty 10 win with a heavy emphasis on Exotic tech.
    • Vampire Turret and Harmonic Turret swap techs.
    • Harmonic Turret reload reduced from 2s to 3s.
      • This is to make it harder to have a good mono-tech turret nest with only Exotic since Harmonic turrets are quite strong on their own with sufficient numbers to cap their gimmick.
    • Acid Turret debuff scaling nerfed from 65 +20/mark to 50 +5/mark
      • This is because the damage is treated as base damage and is multiplied out by things like special damage bonuses, military command percentage damage bonus, and FRS buff fleet damage bonus. And is incredibly powerful for things with high amounts of multi-shot or very high fire rates.
    • Vanguard acid debuff scaling dropped from 30 +10/mark to 20 +5/mark for same reasoning.
    • Parasitic starting fleet adjusted. Parasitic Pike line replaced with V-Wings to make the fleet have a way to catch targets more reliably and to make it not able to upgrade three out of four ships off a single tech.
    • Thanks to CRCGamer for adjusting.
  • Changed military Command damage multiplier to +25% per mark as they were supposed to. The bonus is +0% at Mark I.
    • This was supposed to have gone through over a month ago, I don't know why this went back to 10%+15% mark
    • Thanks to ArnaudB for adjusting.
  • Increased metal cost for Phase 1 and Phase 2 Overlord to 5million. Just so metabolism give a reward to the players, rather than 0 for killing each phase.
    • Thanks to ArnaudB for adjusting.
  • To make the shifted Harmonic Turret fit subterfuge better it now does 2x damage versus targets requiring 2500 or more power.
    • Thanks to CRCGamer for adjusting.
  • Minor balance tweak to the Vanguard drones used by both AI and player versions of Escort Carriers within More System Defenders so they aren't better than regular non-drone version that was just nerfed. Base damage amplification value 30 -> 15
    • Thanks to CRCGamer for adjusting.
  • Changed Crusher so its magnetic Pull now hit 50 targets instead of being an AOE. It kept hitting the closest unit instead of trying to bring in more. That should solve it and make it much better.
    • Thanks to ArnaudB for adjusting.
  • Metal Generators are much tankier but also more expensive to claim.
    • The goal is to make defending Metal Generators something you might actually think about. Previously Metal Generators were extremely cheap to claim but also very flimsy, so they basically were rebuilt as soon as your command station was built (and there were no enemies).
  • AI Allied Scourge at intensity >= 6 now get a faster start
  • Nerfs to the Dyson Sphere to make sure they don't spawn units every second
  • Improve the game's ability to detect when Hunter ships are supposed to be warping out due to defeated enemies
    • Thanks to samnainocard for a save game where an immense number of hunter ships were spawn-camping the dyson

Overlords By Difficulty

  • There is now a separate version of the AI Overlord (both phases 1 and 2) at each difficulty level. The prior version from the beta was really designed for difficulty 8, and so was game-endingly hard on difficulty 6 and similar, while being too easy on difficulty 10.
    • The general changes as compared to the base stats are:
      • Diff 1: 5% of health and attack power compared to normal. Phase 2 speed 150 (was 300 in prior builds). Known as the v0.001proto.
      • Diff 2: 10% of health and attack power compared to normal. Phase 2 speed 150. Known as the v0.002proto.
      • Diff 3: 15% of health and attack power compared to normal. Phase 2 speed 150. Known as the v0.003proto.
      • Diff 4: 20% of health and attack power compared to normal. Phase 2 speed 200. Known as the v0.44rc.
      • Diff 5: 25% of health and attack power compared to normal. Phase 2 speed 200. Known as the v5xrc.
      • Diff 6: 50% of health and attack power compared to normal. Phase 2 speed 200. Known as the x6kx.
      • Diff 7: 75% of health and attack power compared to normal. Phase 2 speed 250. Known as the t7000.
      • Diff 8: 100% of health and attack power compared to normal. Phase 2 speed 300. Known as the t80.
      • Diff 9: 120% of health and attack power compared to normal. Phase 2 speed 400. Known as the z90. That phase 2 speed is no joke.
      • Diff 10: This actually shows off our ability to have multiple overlord variants! Because why not.
        • Diff 10 A: 180% of health and 200% of attack power compared to normal. Phase 2 speed 500. Known as the x4000 Super. This whole thing is a death machine.
        • Diff 10 B: 180% of health and 150% of attack power compared to normal, plus 150% of normal attack range (ow). Phase 2 speed 500. Known as the PFFN. This is also a death machine.
        • Fun fact: I (Chris) have been using the nickname x-4000 online since the late-ish 90s, because it was the name of the villain in a novel I was writing at the time. Different clones from the same facility, or something like that (I was a high school writer, leaving a lot to be desired there). The hero was y-3003, but since I was originally using this online handle as a romhacker, I chose to use the villainous name and it stuck. Now it's actually finally in a work in an appropriate place.
    • Thanks to donblas for reporting what a crazy difficulty spike the Phase 2 overlord was in difficulty 6 games. Thanks to Badger for suggesting the PFFN variant, in honor of Puffin's contributions and long-time battle against diff 10 victors.
  • When savegames are loaded, any older-style AI Overlords will be converted into their newer counterparts depending on the difficulty of each respective AI. So if you had a multi-AI game, you'll have multiple variants of AI Overlord if their difficulties varied.
    • This makes it so that lower-difficulty games-in-progress can avoid the shock super-hard ending difficulty spike.

Bugfixes

  • Put in some new cross-threading protections for when entity order collections are altered in any way.
    • Rather than using a concurrent queue or something of that nature, we are using an old fashioned style of thread lock on the lists in question.
    • There is the very rare risk that this could cause a deadlock, but most likely this would be detected and it will kill the background thread. In the event that happens, we can adjust further. It's also possible that this was the cause of the freezing up that Strategic Sage saw over the weekend, although we're probably not that lucky.
    • Thanks to ptarth and Waladil for reporting.
  • Fixed a regression that was a long-standing issue where if you tried to load a save that failed, and then clicked out of the load savegame window, you would wind up in a purgatory that was half crazed-main-game-ui and half main menu ui.
  • Adjusted our entity order serialization code a bit so that EntityOrderType.Length can actually be serialized if need be.
  • Improved the debug messages when entity systems fail to deserialize.
  • The game now supports putting "canaries" into serialized savegames as well as on the network.
    • This is useful for quickly detecting when there is savegame corruption of some sort, which could be caused by a mistake on our part, or a bug in a mod that contains savegame-style data.
      • Because of the utility with mods, which are ever-changing, this is something we're putting in in a minimally-invasive fashion so that we can leave this in indefinitely rather than just having it when we know we have some sort of problem in our own code.
  • There is some sort of ultra-rare serialization problem with entities that breaks certain savegames. This must be something that has a very strong temporal component, or is using a feature that very few ships use, or something of that nature.
    • Right now we are unable to identify where it is, although we know it is not mod-related. The new canaries are an attempt to locate this, given the rarity of the item in question.
    • We wish that we were able to to solve this directly in one go, but essentially we need a version of this where it is broken after saving with the canaries present in order for us to find it. We've tried reverse engineering it from existing broken saves, but did not find anything conclusive despite a few promising leads.
    • Thanks to ptarth for the one set of saves that had this problem.
  • Put in some better clarity when Astro Trains run into trouble doing a depot event.]
  • Fix a bug where player-allied Nanocaust might snipe player-allied scourge units when they spawn in
    • Thanks to Geeber51 for reporting
  • Fixed a couple of bugs that could happen in DoMilitiaThreatReaction() in Civilian Industries, but in general just instrumented that code so that if it happens again we will know where and why it is happening.
    • Thanks to gigastar for the report.
  • Improve the text of some settings related to player-allied factions
    • Thanks to mahisev350 for reporting.
  • In a number of places in the game, we're updating counts from across multiple threads. It's generally for informational purposes, and originally was not too much under contention. But it has been lately, and we were getting wrong numbers.
    • We are now using System.Threading.Interlocked.Add() instead of just using variable++ as an operator. This performs better, and gives correct results.
  • Rather than using finalizers and other not-so-efficient methods to track objects of which we are suspicious, we are now using a new ReferencerTracker class of our own design, which uses WeakReferences in a ConcurrentDictionary that is fed by the constructors of suspect objects, and which are parsed and pruned on background worker threads every 3 seconds or so.

Multiplayer Fixes

  • Fixed some exceptions that could happen in DeployDroneContents_ONLYCallFromSimBGThread() on MP clients. This should not have been running on clients in general.
    • Thanks to Badger and Zegma for reporting.
  • Put in some more canary code in Client_AcceptDivergenceDataFromHost, which seems to have been having some errors in MP at times.
    • Errors in this could cause various strange afflictions like units disappearing, so finding the root of this is important and this should be a good step on that path.
    • Thanks to Badger and Zegma for reporting.
  • Fixed an exception that could happen during hacks on MP clients. In general this code is again now not run on MP clients. Ships involved are being immediately synced from the host to the clients anyhow.
    • In general, just to be on the safe side, but in extra instrumentation for this even on the host, and split it into its own method, however.
    • Thanks to Badger for reporting.
  • Fixed a number of potential cross-threading issues in ActuallyFireSalvoAtTargetPriorityList(), most of which were mainly able to happen on MP clients, but technically which could likely happen under rare circumstances in SP as well.
    • Thanks to Badger and Zegma for reporting.
  • Fixed some cross threading exceptions that could happen in WriteCityTooltipDetails, mainly in MP.
    • Thanks to Badger for reporting.
  • Canary was hit for some faction's external data in MP, but not sure which one. We have improved the canary code to give us more information about what faction name and type is present.
    • Thanks to Badger for reporting.
  • Whenever you quit the game to the main menu or the OS from an active game (or get booted in multiplayer from a lost connection) it now logs a little "Memory Profile Debug Data On Game Exit" table.\
    • This currently covers how many fleets, fleet memberships, orders, planetfactions, faction, other gameentities, shots, ships, speed groups, fireteams, pathfinders, gamecommands, and planets have been created, garbage collected, and are still active since last reloading the game.
    • There seems to be a memory leak in multiplayer on the clients, and comparing these numbers between client and host should give us some ideas on where that is. It's possible that these are in "external data" somewhere, in which case we will have to greatly expand our footprint reporting.
    • If you're curious, essentially if the number of active ones is super duper high on the client, that's the point of concern for a memory leak. That said, if the number of total ones created is very much higher on the client compared to the host, then that could be indicative of a performance problem (rather than a memory leak).
    • These numbers mean almost nothing in isolation (unless numbers are in the hundreds of thousands or up), so if you report your version of these, please pair the client(s) and the host versions of the report together.
    • If your game is getting laggy near the end of a long session, or clients are seeing strange behaviors, or whatever else, then please do send us these plus whatever other information you feel like is relevant!
    • Fleets or fleet memberships in particular are suspicious right now, as Badger had noted that sometimes on clients not all of the ships would be selected if you press the hotkey associated with that fleet. That could be a different form of code bug, but malformed/duplicate fleets or memberships is the highest likelihood. Paired with general command delays and slowdowns on clients in long sessions that reset when disconnecting and reconnecting, we know there is SOME sort of client memory leak in general.
    • In the absolute worst case, we can brute force fixing some of this (that may be needed in the event that mods are what contain a memory leak, for example, since we can't fix those sorts of things) by doing a complete rebuild on the client periodically, but this would lose some UI state and might be annoying. If we did do it, for the most part it would likely just feel like a "save interruption" in a game like Factorio. And if we did it, it would be an optional thing. For now we'd rather go hunting for the leak.
  • Fixed a number of DoEntitySecondLogic_FromSimBGThread() errors that could happen on ships on MP clients.
    • Thanks to Zegma for reporting.
  • Fixed a whole nest of more things that could go wrong in cross-threading on MP clients in wormhole traversal logic, AI orders reevaluation, etc.
    • Thanks to Zegma for reporting.
  • The way that we were sometimes pre-generating PKIDs on the host and giving them to clients, and the way we were calling CreateNew_CallWithSpecificPKIDID_ClientOrHost(), has all been removed.
    • This almost never worked entirely properly, and tended to cause players to see the things they created exploding and then reforming exactly where they were. It also used more network data than is needed.
    • This was a clever idea before we came up with the concept of our "fast blast" network sync from the host, but now it's entirely unnecessary.
    • This also solves a cross-threading bug that could happen in that code, but that was honestly the lesser of the problems there.
    • Thanks to Zegma for reporting.
  • Introduced more network canaries into the fast blast data, as some of it was not coming through properly for clients in some cases. In all cases, this seems to be ship data, so it's probably the same problem that we're seeing in some rare savegame cases for single player.
    • Thanks to Zegma for reporting.
  • Stacks that are split are now done only on the host, and the data is sent quickly to clients. This avoids some errors that could otherwise happen on MP clients.
    • Thanks to Zegma for reporting.
  • Fixed an exception that could happen in SwitchToFaction() on MP clients. This is now only done on MP hosts and then quickly synced to clients.
    • Thanks to Zegma for reporting.
  • Fixed a couple of cross threading errors that could happen on MP clients in GetIsSelfConstructionBlocked().
    • Thanks to Zegma for reporting.
  • Fixed an exception that could happen in DeployAIReinforcementContents() on MP clients. This is now only run on hosts, and clients hear about it quickly after.
    • Thanks to Zegma for reporting.
  • Fixed up the way that we deserialize squad orders so that it is vastly more efficient for multiplayer clients.
    • This was at least a mild memory leak on MP clients, and possible quite a severe one.
  • Also fixed a memory leak (probably a mild one) in the single-player game related to orders, in cases where the firing orders were invalid for some reason.
    • This was likely very very mild, if it even came up at all. But nice to have things fixed.
  • Fixed an exception in SetAllMembershipsUpFromDesignTemplates() that could happen on MP clients when they were connecting in. That only needs to run on the host anyhow.
  • Multiplayer clients are now a bit slower about deleting ships that were not in the prior sync cycle. They now wait two sync cycles to be sure, as well as not deleting something that is so new it has not been sync-processed at all yet.
    • This should reduce some network traffic, and some flickering of new units, and some issues with units that just moved between planets. This might have the side effect of a few dead entities sticking around for a few extra seconds on the client, but probably not (a different process should catch that).
  • Multiplayer clients now split "catastrophic" ship mismatches (which should be just from a faction switch), and count missing ship mismatches as a separate category.

2.803 Multiplayer Option Overload

(Released April 16th, 2021)

  • Updated the Fallen Spire journals
    • Thanks to Vinco for some excellent feedback
  • Watched Fleets are now above Local fleets if both watched and local are above the ships in the planet tab
    • Thanks to Daw11 for the feedback
  • Improve the text when you are hovering a fleet in the sidebar and ask for more detailed in formation
    • This was annoying Badger
  • Added a new skip_all_waves="true" option for tutorials, which prevents any waves from spawning in them. This is set on for all of our tutorials, as we don't wish for any waves in these specific ones.
    • Thanks to Mr W and Strategic Sage for reporting.
  • Fixed an issue where the GOG linux installer did not have the UnityPlayer.so file. This was missed because we upgraded to a new version of unity, and they moved that file there without us noticing it. Apologies!

Way Too Many Networking Options, But Here We Are

  • Holy explosion of Steam networking frameworks, Batman!
    • So... the networking options that we provided in the prior release did not work for everyone, and we're not sure why. To err on the side of caution, right now we're providing a stupidly high number of options. We'd love nothing more than to pare this back down, so feedback on what works and what does not would be very welcome.
    • There are now SIX variations of Steam networking, and soon that number may be eight, but we'll see.
      • These come in pairs, with Relay being ones that are sent through Valve's servers, and Direct being ones that just go across the general Internet (and sometimes require the host to share their public IP with the clients).
    • The first pair is called Steam Multi-Sockets.
      • These connect via four socket connections on four different ports (as with last release), and thus are way more efficient because of how they are able to avoid data traffic jams. These may not connect for all players, though, or if connectivity is rough, they be more prone to dropping client connections since there are four that must be maintained per client.
    • The second pair is called Steam Tubes:
      • This is the sort of networking we started out with in 2.800. It uses just a single socket connection, no channels or anything, and shoves all the data along it. It is VERY prone to traffic jams, because of this. This should only be used if Multi-Sockets is not working for you.
    • The third pair is called Steam P2P:
      • This uses a different (and slightly older) form of Steam networking called P2P. The underlying technology is completely different from the two forms of networking above. This works phenomenally well for some people, and is very fast for them. For others, it won't even connect. For a few others, for some reason the underlying network actually corrupts data from time to time.
    • In the game, we have ranked all of the various connection types from S tier down to C tier, with color-coding. This was the only real way we could think of to make this at least slightly less overwhelming, but it's still now awesome. Apologies for that.
    • Huge thanks to Fluffiest and bluastelo for helping us live-bugtest this.
      • They eventually got it to work with Steam P2P, but neither Multi-Sockets nor Tubes were working until they made the P2P connection. After the P2P connection was made, Tubes started working... so maybe that means that Multi-Sockets would then work? If so, they could move all the way back to Multi-Sockets, and have the most performant connection possible.
  • Our integration with Steamworks no longer uses asynchronous callbacks. This was causing callbacks to be checked every 16ms, which in some cases is a bit too slow. We are now running callbacks every frame, directly on the main thread, because with those -- particularly the networking ones -- we want to be able to directly get the results asap and we need them on the main thread anyhow.
    • It's possible that the use of async callbacks was what was causing flaky networking via Steam for some folks, but it's hard to be sure just yet.
  • Actually updated our callbacks-running to be even more explicitly checked right before network messages are checked. This should ensure absolutely the most timely possible reception of network messages via Steam.
  • Fixed a random crash that could sometimes happen on clients of Steam Multi-Socket networking.
    • Thanks to Fluffiest and bluastelo for reporting.

2.802 Multiplayer Steams Onward

(Released April 16th, 2021)

  • Adjusted several parts of the game to use EnumerateFiles() rather than GetFiles(), and the same for directories, because these things cause less of a delay when you have a huge number of savegames or campaigns.
  • Updated several aspects of the quick start window and load savegame window to make them load much faster when you have hundreds of savegames on your machine.
  • added_shots_per_salvo_per_mark can now take in non-integer numbers. The result at any given mark level will be rounded down to the nearest integer.
    • The math is [mark level above 1] * [added_amount], rounded down. So if you have a value of 0.6, then at mark 2 it would be just 0.6, round down to 0. At mark 3 it would be 1.2, round down to 1. At mark 4, 1.8, round down to 1. At mark 5, 2.4, round down to 2. Mark 6, exactly 3, and at 7 it will round down to 3 also.
    • If you want an added shot at marks 3 and 5 and 7, then a good number is 0.5. That would give you +1 at mark 3, and +1 at mark 5, and then +1 at mark 7 rather than mark 6.
    • Thanks to CRCGamer for requesting.
  • Balance adjustment to Tritium Sniper Frigate: Now gains an extra shot per salvo at marks 4 and 6.
    • This should make it more competitive with its variant the Ramifier Frigate.
    • Thanks to CRCGamer for updating this.
  • Add a setting to not place the Strike, Lone or Officer prefix before fleet names.
    • Thanks to Badger for adding.

Bugfixes

  • Fixed a bug where electrotoxic effects were not working because we had intentionally disabled them when looking for a certain crash, and it accidentally got left off.
    • Thanks to CRCGamer for reporting.
  • Fixed icon not working in Powerful Command Stations Mod by ArnaudB.
  • Updated the game to allow parsing "false" as 0 when doing xml processing.
    • This solves the problem of potential exceptions when someone has AutoBuildAssaultFrigates in the old format rather than the newer style.
    • Thanks to KingSyphilis for reporting.
  • Fixed a random cross-threading exception that could happen in FindProtectingForcefieldToHitInsteadOfTarget() if the stars aligned just wrong. This could affect multiplayer or singleplayer, and is not a new bug, but is just THAT rare.
  • Fixed a fairly rare bug that was causing units to not serialize properly sometimes. It seemed to be related to the incomingshots list on units, which is something that really should only be sent in fully network syncs but should not be sent to disk or as part of smaller network syncs.
    • Essentially, because of the many improvements made to multiplayer efficiency, this unfortunately had created a miniature version of Russian Roulette (some sort of fantasy chain gun with 2000 slots but only one with a bullet in it), where if you got tagged with it, it would corrupt your save.
    • Thankfully, autosaves are a thing, and in the example save that had this issue, there was an autosave from literally 20 seconds earlier that did not have the problem. And with extensive testing on the same save, we couldn't get it to replicate.
    • That said, some of the persistent intermittent errors that folks were seeing in multiplayer were a lot less rare (because multiplayer takes a lot more tries at Russian Roulette, not because the actual odds changed), and this is probably an accidental discovery of what those were.
    • Thanks to deR Zaubererer and their MP partner for discovering this.
  • Fixed an oversight where the "Intra Galactic Coordinators Permadeath" option was still in the advanced settings, even though IGCs themselves have been removed.
    • Thanks to Democracy for reporting.
  • Fixed an exception that could happen when completing a spire relic hack if the spire relic was not on a nearby planet.
    • Thanks to vinco for reporting.
  • Ships that regenerate in a certain amount of time based on seconds_to_fully_regenerate_hull now will still do it in that same amount of time even if their maximum hull health is increased by outside factors like a hack.
    • Thanks to CRCGamer and Democracy for reporting.
  • Fixed an issue on the ODSS tooltips where it was still saying you could hack four times instead of twice.
    • Thanks to Zer0h1nder for reporting.
  • Removed some old code that would complain about multiple PG factions if they were in the "wrong" order. It was annoying on startup of many savegames.
    • Thanks to Badger for the save demonstrating it.
  • Dyson sphere: add some defensive code for a random crash Badger saw.
    • Thanks to Badger for adding.
  • Fix a typo in the fleets swap line messages.
    • Thanks to Badger for fixing.
  • Fix a very fun bug with ships aggrod by the dyson joining the hunter fleet.
    • This also was a memory leak, and has been around since October 2019. It happened more the more factions you had in general, and the more times you reloaded saves before closing the game.
    • Huge thanks to Badger for hunting this one down and fixing it!

Multiplayer Updates

  • Put in some code with Steam P2P networking that should make it more likely to connect in general for more people.
  • Steam networking has been split into four separate frameworks that you can choose from, rather than (recently) two or (previous to a few weeks ago) one.
    • This lets you choose between Steam P2P direct or relayed, or Steam Sockets (formerly Steam Connection-Oriented or C-O) Direct or Relayed.
    • The Steam P2P Direct method is new and doesn't require any special configuration. You just select a steam friend and hit connect like always. It may or may not work well, though.
    • The Steam Sockets Direct method is also new, and requires you to connect via IP address, which the host must provide to you. This works with both local and public IP addresses, and should be able to avoid NAT punchthrough -- but if that fails, you will still need to use Steam Sockets Relay to work around it.
      • This method is noticeably faster than any of the other Steam methods, but slightly less convenient because of the whole IP-sharing thing.
  • On the networking tab, there is now enough room in the textboxes for you to read IPV6 addresses.
  • The call to find your public IP address is now run asynchronously, so when you first click into the networking tab it no longer has a moment of lag while it contacts a server to find out what your IP is for you.
  • When you are in the lobby as a multiplayer host, or in the escape menu as a multiplayer host once a game has started, it now specifies what your public and local IPs are if you are on the sort of networking framework that needs that.
    • In those places, it also specifies what networking framework you are using, in general.
  • In the escape menu, if you are in single-player mode, it now will also show that. It looks like there were some ways for people to wind up no longer being a host without realizing it, and this will let people actually check. This is possibly what was leading to some (but definitely not all) connection issues for some folks.
  • Fixed a bug where if you tried to load a savegame to host in multiplayer, but encountered an error, then it would switch you to single-player mode. That was going to be a problem if you were then expecting clients to be able to connect!
  • Major networking improvement for the Steam Sockets networking style!
    • Steam sockets does not support multi-channel data, which is very limiting when it comes to sending main data quickly, but also having other large pieces of data that get there in a relatively-timely-but-not-so-urgent fashion.
    • To work around this, we basically followed Valve's suggestion and built in a multi-port solution, which uses the port you have chosen (for direct connection), or the virtual port 0 (for relayed connections), plus the next 3 numbered ports after that.
    • You can now see in your log as the client and host make and accept connections on each of those four channels/ports, and once all four are connected, then it starts sending data across them as needed.
    • If any of the four drop, then it will kill them all, but there's not really any reason to think that disconnects should be more frequent because of that. That was my original fear, but if that does happen I can potentially work around it a couple of ways. I have yet to see a disconnect, though, which is good.
    • Overall this takes the data sent from the host to clients, and makes something like 97% of it go on the secondary ports, which is a gigantic boost to the ability of the main port to send and receive timely information to keep the game going.
  • The two Steam P2P network options have been commented-out for now, making them unavailable for use. The only advantage that they had over Steam Sockets was that they could send multi-channel data (and that was a huge advantage). But P2P has been very unreliable, and other game developers are recommending to avoid it. It's still there in the xml if someone needs to uncomment it and try it for some reason, but we're hoping to have fewer options to confuse people.
    • The need to have Steam Sockets Relay and Steam Sockets Direct as two separate options will pretty much always remain (because they work fundamentally differently and have very different pros and cons), but we'd definitely like to avoid having a silly amount of choices.
  • Fixed up an issue where MP client machines could mess with the hack options of TSSes, ARSes, and similar. Now that is strictly handled by the host, and any changes that are made are sent to the clients post-haste. This was mostly already being caught and fixed on the client, but there was no good reason for the client to be doing this, and it just added inconsistencies to fix.
  • Fixed a very funky exception that could happen in DoFactionStepLogic_Stage2 on random factions on MP clients in particular, but in MP in general.
  • Fixed a variety of exceptions that could happen in HandleAutobuild() mainly in multiplayer, on the host or clients, due to cross-thread racing. Technically it could also happen in solo play, but we haven't seen any evidence of it actually doing so.
    • Thanks to Badger for reporting.
  • The "BLARRRGH! Only authorized to execute through frame" error is now silenced. That... really wasn't actually a problem that was worth even complaining about. This was something that was showing up lately in at least a few multiplayer sessions, though something else seemed to be going on with them in general.
    • Thanks to Badger for reporting.
  • Fixed a possible issue in multiplayer where out of order messages from the server might have potentially messed with the Network_AuthorizedToExecuteThroughFrameNumber.
    • There should not be out of order messages in the first place, but just in case.
  • Fixed an issue in CheckForInternalShipDeployment_ReinforcementLocations() that could happen on MP clients, which really did not need to be running that logic anyhow.
    • Thanks to Badger for reporting.
  • Fixed an exception that could happen in SpawnRaiders() on Marauders in multiplayer clients. Again not something they needed to ever do, it's left to just the host now.
    • Thanks to Badger for reporting.
  • Fixed a number of possible cross-threading issues in CalculateShipsThatYouCanCapture(), which were vastly more likely to happen on MP clients.
    • Thanks to Badger for reporting.
  • Fixed several more cross-threading bugs that could happen in WriteFleetTooltip(), again way more commonly on MP clients than anywhere else.
    • Thanks to Badger for reporting.
  • Fixed another cross-threading bug that could happen in Hacking_GrantShipLine_DontDestroyTarget.GetCanBeHacked(), again mainly on MP clients. The obvious potential errors have been fixed, but then also it will now show in the ui an "error at debug stage x" message if it still runs into one. It will also silently log the error for us to look at more later, and to be able to further fix if need be.
    • Thanks to Badger for reporting.
  • Fixed an exception in SetNextTargetForTradeStation() that could happen on multiplayer clients using the Civilian Industries mod.
    • Thanks to Zegma for reporting.

Prior Release Notes

AI War 2:The Paradigm Shift