AI War 2:Finalizing Multiplayer

From Arcen Wiki
Jump to navigation Jump to search

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.817

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

  • 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