I Hope You Like Text

Art!

The Vaults has some new environment art. Is it more Smaug or more McDuck?

Super Secret Base is starting to get some unit art.

Code!

This week, Steambirds Alliance has upgraded to Unity 2017.1, from 5.5. It seemed like a good time to do this shortly after PAX, because we have time to rassle bugs. The upgrade gives us rendering engine improvements, and the first scripting engine upgrade in 7? 8? years. But who’s counting. Those haven’t been enabled yet, so things aren’t too different, but we can soon give them a shot. Improvements to the particle systems almost always yield some cool in-game effects down the line, as well! The Unity release notes are always packed with cool looking stuff and are fun to read, check em out: 5.6, 2017.1

There are some known issues:

  • Fullscreen mode at non-native resolution has scaling artifacts. This is not specific to Steambirds, it looks like other devs are seeing it as well, so it seems likely that Unity will release a patch fix for it soon.
  • The ship shadows that add overfly the Rebel City to keep it feeling busy haven’t survived very well, so please ignore their glitchiness until we get to fixin’ them.

Please keep your eyes peeled for any other bugs that we didn’t see! This game is big, there’s lots to break.

We started tackling the network timeout issues that have been cropping up recently, and think that we’ve made some real progress! The networking’s main timeout calculation is based on ping/pong packets that it sends back and forth across every connection. Machine A sends Ping 5 to Machine B, then Machine B replies with Pong 5 to Machine A, and so on for every direction and pair of machines. It verifies that the number it receives is the same number it sent, otherwise packet corruption and reordering would show up as “just fine”. There was a tricky bug in there though: it would continue to send ping packets even if it hadn’t yet confirmed a pong. So if the ping interval was shorter than the roundtrip latency, it would send a new ping before receiving a pong, and ignore the older pong (because the number wouldn’t match). This made the ping system likely to incorrectly detect timeouts under high latency conditions. The solution was to use a range of permissible ping numbers instead of a single value, and also to increase the ping interval.

In addition to that, it seemed silly that the networking relies entirely on these ping messages to decide whether the connection was still good. Pings are sent pretty infrequently, and they could get lost or delayed while other packets go through. So we made it so that when other packets are received, they also extend the timeout window, just like a ping. So this change should fix timeouts twice over. The network layer should now only time out when 4 seconds have passed with no messages being received whatsoever. It’s still possible thought that the client might incorrectly decide that the network layer timed out when it really didn’t, so the problem might not be completely gone. Getting there, though!

There are still going to be cases where the connection hasn’t timed out but performance is so bad that the game is unplayable. We’re starting to add some functionality to detect these situations and deal with them; there should be more to show next week. It’s definitely going to be a slow-burn project where we learn a little bit more each iteration.

Until then, please let us know if you see any undeserved timeouts!

While looking at the networking library, it became apparent that it was sending a lot of very small packets. Small packets are bad for a number of reasons: the headers are fixed-size and thus proportionately larger, sending more packets involves more frequent expensive system calls, and the chance of loss on the internet goes up. A standard technique to deal with this is to hold on to messages for a short period of time in the hopes that the game will generate another small message that can be combined with the first (it’s not Nagle’s algorithm but similar). Our library already supports this kind of batching, but it turned out that it was overly aggressive, waiting for less than a millisecond for additional messages to batch. We cranked this number up to 24 ms, so messages are batching better. Also there was a spinloop in that section of the code, so we replaced it with a sleep, which should slightly improve performance on both server and client (it’s in a background thread so it doesn’t affect frame times directly, but CPUs should be less loaded overall). The batching does increase latency by about 16ms on average, but the game is pretty well built to absorb constant latencies so it shouldn’t be noticeable.

Gameplay!

We’ve been hearing that the heal blast is a little exploitable due to its long life. We talked about cutting it shorter last week, and this week it’s been done. Now the duration is 0.5 seconds, roughly the same as the animation. The heal amount has been increased by 10% … to compensate for the duration being dropped by 70%. Don’t spend it all in one place, kid.

Folks were reporting arc guns were not taking enemy radius into account. It took us a while to realize that the problem was not with the lock-on, which does take radius into account, but with the part where it loses lock. Now both take radius into account.

One of the pieces of feedback we pretty often get is that people
expect the Esc key to open the options menu. Previously the purpose of
the Esc key had been to “escape” from any UI and return to playing the
game, and we used “O” for options. We’d had special sections in the
tutorial to teach the options menu, but it started to feel like we were
swimming against the tide, so this week we’ve made Esc simply toggle
the options menu (as a default; no rebinding is happening if you’ve
bound this key already). Let us know how this change suits you!

More new-player-friendly changes:

  • Tripled Bomb Factory drop rate. Now new players might actually get to play a dungeon.
  • Event bosses only show up in level appropriate elevations. That poor fellow who got instakilled by a white spider right after getting a T2 upgrade or the first time brought a tear to our eye.
  • Tutorial dungeon tweaked; now has two treasure moments to increase player interaction with items, in addition to other tweaks.

Changes in response to other feedback:

  • Engines have more gradual stat improvement progression. See if those pumped up kicks can still outrun my bullets.
  • Fixed issue with sparks staying stuck on player planes. They don’t bleed pixels, not anymore. Or maybe they still do, let us know if you see it.

Other things we did:

  • Added Guard Lion to quest enemy list.
  • Treasure Ship less common, drops different distribution of loot.
  • Robot Snake self-destructs after losing head
  • Options shouldn’t be triggered while chat field is open.
  • Big adjustments to blinkleader (minion health down, leader health up, +150% xp)
  • Removed old and busted custom effects from guns. Most of these didn’t do anything, but some guns could make other guns jam. We might introduce them again later, but for now they seemed like a source of confusion and (real or perceived) bugs.
  • Updated quest enemies so T10 players only get missions for setpieces T8 and up

Thanks as always for all the great feedback, please keep it coming!