Hello engineers! Happy holidays from the Never Games team! This week, there's no patch on account of the holidays. However, this doesn't mean we haven't been hard at work, especially on the multiplayer update and all that it entails. Here are some details on what we've been working on: [h3]Netcode Fundamentals[/h3] At this point, the main structural components of the multiplayer update are in place. We are using a combination of Unity Relay, Unity Netcode for GameObjects, and Steam Lobbies to create the seamless multiplayer setup experience most people are familiar with in other games. The multiplayer framework has also been merged into the main branch behind a feature flag! Some may be wondering why we aren't using Unity Dots Netcode, seeing as Final Factory is a DOTS-based game. DOTS networking, as it turns out, is not really suitable for something like a co-op factory game. We don't want to be sending updates for all entities in the game across the network, as factory games have tens of thousands of entities, and this would really bog down the network. Instead, we want to rely on the simulation being fully deterministic and only syncing player input/controller updates between clients so that everyone's simulation is affected by each player in the same way. This means we just need a relatively simple setup for sending player controller updates via RPCs. Unity's Netcode for GameObjects is much more up to this job. [h3]Fixed Points and Determinism[/h3] As I've talked about in previous updates, we've been working hard to excise all usages of floats as they relate to game state. Our work on the inserters has led us to the next major area of update: getting rid of float3 positions in various stateful components. Any state that relies on floats to represent numbers is prone to [url=https://shaderfun.com/2020/10/25/understanding-determinism-part-1-intro-and-floating-points/]nondeterminism and precision-related bugs[/url]. For example, on each structure in the game, the placeable component stores a float3 (x, y, z coordinate) corresponding to its position on the map. This float3 is used in lots of places and converted to int3 to determine where it is in the underlying grid structure. Everywhere this pattern is used is a potential hotspot for bugs (especially in mobile station code!) and nondeterminism. We've begun flipping this convention so that world space float3s are always inferred from int3s, which have no floating-point error. This is a pretty large refactor but is largely working on our development branch. Currently, there are several floating-point error bugs in the single-player experience around inserters and mobile station movement in particular. In upcoming patches, as these changes are merged in, we should see a much more stable and deterministic experience. Multiplayer, as it turns out, demands a level of rigor in the code that ends up fixing a lot of bugs in the single-player experience!