Determinism, abilities, threaded input processing, and state management primitives married to a core set of basic tools used to bind to a weapon, character, entity, effect, or actor in a compositional and elegant way. Artillery is at 0.3 and is not yet in pre-alpha. It provides, as of right now:
Atypically, Artillery is designed to operate in a mixed model between input stream replication, network prediction, and interpolation. Bristlecone streams remote player input to all clients, allowing the remote player proxies to execute abilities and requiring the local client to fully simulate them. The obvious immediate implications are as follows...
By collating all input streams and using an underlying game simulation, we allow deterministic gameplay without requiring deterministic presentation. This is incredibly powerful, as it separates the concerns in a new way.
This monorepo includes all plugins required by Artillery, and all plugins that consume it. To understand the structure, it is important to know that Artillery depends on a number of other plugins maintained by Breach Dogs. These form a loosely coupled ecosystem that provides a powerful range of threading and simulation capabilities suitable for use with any UE5 game where control responsivity or multiplayer are a priority.
The next major public release is 2026-Q3 will include full support for multiplayer that doesn't ask you to draw the rest of the owl.
Unlike regular unreal, we have powerful time synchronization primitives built on shadow copies and a concept of subframe accuracy. This allows us to quickly compose updates by simply zipping them together using the timestamp. With the concept of zip-and-reconcile available to us, we have a way to do exact state recovery without needing true determinism OR a full gamestate transmission.
By tracking the GAMEPLAY ABILITIES as EVENTS and then ZIPPING them together like this - effectively eventual consistency via event sourcing, a la kafka - we can determine if an ability or cue would be a double trigger easily within a very high margin of precision by combining Bristlecone cycle, Bristlecone time, and the event properties. From there, it's a small step to tracking inputs instead of individual events. If the events generated by a given input are consistent, then you can reduce your complexity enormously this way.
I intend to expand the conserved attribute to support timestamping its changes, allowing us to do a highly granular reconciliation with a very low actual bandwidth cost, assuming this reconciliation is delta compressed and occurs irregularly. Finally, conserved attributes will be extended even further to tackle the problem of floating point determinism in a general way, based on some tricks around frame boundary based quantization.
This plugin will:
This plugin has five main design goals:
To meet these needs, we provide an impure ECS model with runtime type information available through SkeletonKeys. This, combined with a strict temporal separation between change generation and change application, allows a fairly natural paradigm.
First, this is a pre-alpha prototype and should be considered highly experimental. Second, with that said, we expect only two major API changes. The first is that conserved attributes will likely lose the Remote value in favor of a timestamp stack for ticks that allows true rollback work to begin. The second is that Mass integration will continue apace, and this has some ramifications that should be largely invisible to users. We make no promises, however, and if it's a choice between an api change and a massive body of engineering work, at this stage, we will choose to make the API change. This philosophy will not persist, ultimately.
Second, I strongly recommend reviewing the ArtilleryBusyWorker thread. It offers a deep insight into the control flow of the system as a whole. Following that, familiarize yourself with the core concepts of simulation\presentation separation. Finally, the most important structures to understand are likely ArtilleryGuns, SkeletonKeys, Attributes, FBLets, and Ticklites. In particular, the IKeyedConcept interface is of tremendous value for maintaining consistency, and is a backbone that offers much insight into WHY we use a key-first system but do not commit to a pure ECS.
Artillery will also serve to insulate our other tech from spaghetti usage of GAS, in case we do decide to use another tooling for ability and gun composing. This guide is a really useful place to start for understanding GAS. We're using it very differently, in a more composition oriented way that'll hopefully ease the dependency management and granularity issues.
C++
95.3%
C
3.7%
Determinism, abilities, threaded input processing, and state management primitives married to a core set of basic tools used to bind to a weapon, character, entity, effect, or actor in a compositional and elegant way. Artillery is at 0.3 and is not yet in pre-alpha. It provides, as of right now:
Atypically, Artillery is designed to operate in a mixed model between input stream replication, network prediction, and interpolation. Bristlecone streams remote player input to all clients, allowing the remote player proxies to execute abilities and requiring the local client to fully simulate them. The obvious immediate implications are as follows...
By collating all input streams and using an underlying game simulation, we allow deterministic gameplay without requiring deterministic presentation. This is incredibly powerful, as it separates the concerns in a new way.
This monorepo includes all plugins required by Artillery, and all plugins that consume it. To understand the structure, it is important to know that Artillery depends on a number of other plugins maintained by Breach Dogs. These form a loosely coupled ecosystem that provides a powerful range of threading and simulation capabilities suitable for use with any UE5 game where control responsivity or multiplayer are a priority.
The next major public release is 2026-Q3 will include full support for multiplayer that doesn't ask you to draw the rest of the owl.
Unlike regular unreal, we have powerful time synchronization primitives built on shadow copies and a concept of subframe accuracy. This allows us to quickly compose updates by simply zipping them together using the timestamp. With the concept of zip-and-reconcile available to us, we have a way to do exact state recovery without needing true determinism OR a full gamestate transmission.
By tracking the GAMEPLAY ABILITIES as EVENTS and then ZIPPING them together like this - effectively eventual consistency via event sourcing, a la kafka - we can determine if an ability or cue would be a double trigger easily within a very high margin of precision by combining Bristlecone cycle, Bristlecone time, and the event properties. From there, it's a small step to tracking inputs instead of individual events. If the events generated by a given input are consistent, then you can reduce your complexity enormously this way.
I intend to expand the conserved attribute to support timestamping its changes, allowing us to do a highly granular reconciliation with a very low actual bandwidth cost, assuming this reconciliation is delta compressed and occurs irregularly. Finally, conserved attributes will be extended even further to tackle the problem of floating point determinism in a general way, based on some tricks around frame boundary based quantization.
This plugin will:
This plugin has five main design goals:
To meet these needs, we provide an impure ECS model with runtime type information available through SkeletonKeys. This, combined with a strict temporal separation between change generation and change application, allows a fairly natural paradigm.
First, this is a pre-alpha prototype and should be considered highly experimental. Second, with that said, we expect only two major API changes. The first is that conserved attributes will likely lose the Remote value in favor of a timestamp stack for ticks that allows true rollback work to begin. The second is that Mass integration will continue apace, and this has some ramifications that should be largely invisible to users. We make no promises, however, and if it's a choice between an api change and a massive body of engineering work, at this stage, we will choose to make the API change. This philosophy will not persist, ultimately.
Second, I strongly recommend reviewing the ArtilleryBusyWorker thread. It offers a deep insight into the control flow of the system as a whole. Following that, familiarize yourself with the core concepts of simulation\presentation separation. Finally, the most important structures to understand are likely ArtilleryGuns, SkeletonKeys, Attributes, FBLets, and Ticklites. In particular, the IKeyedConcept interface is of tremendous value for maintaining consistency, and is a backbone that offers much insight into WHY we use a key-first system but do not commit to a pure ECS.
Artillery will also serve to insulate our other tech from spaghetti usage of GAS, in case we do decide to use another tooling for ability and gun composing. This guide is a really useful place to start for understanding GAS. We're using it very differently, in a more composition oriented way that'll hopefully ease the dependency management and granularity issues.
C++
95.3%
C
3.7%