It can be done but it&#x27;s quite expensive to engineer such a solution, both in time spent theorizing and in runtime performance consequences. There are many small gameplay features that are trivial with mutability and a data-oriented model, but require a major spec change if functional style is applied. The parts that are easy to do functionally are relatively trivial in comparison.<p>The happy medium for gameplay simulations is to write straight-line imperative code and minimize your use of subroutines and indirection - you want &quot;static&quot; synchronization that loops over data in big batches where execution flow reads easily. When it&#x27;s kept simple like this, major desynchronization challenges come down to compilation behaviors and interactions with other modules(render, network, etc). The main loop gets big as a result, but factoring it out only makes it harder to follow, because the complexity is coming from the high number of sync points, not duplicated code.