Sure. The basic concept is 2d elite-lite with local multiplayer. Fly around a procedurally generated galaxy and shoot stuff. And some other special stuff that’s secret right now 
My initial annoyance came from trying to sync all of the floating asteroids in the galaxy across the network. A naive component solution involves a component that tests if the transform has changed, and if it has replicate it over the network. Obviously this spends a lot of time doing redundant checks. Additional annoyance - ideally objects near the player should be updated more frequently to use network bandwidth more efficiently. Right now I’ve a crude coordinate hashing thing doing that, but crowbarring in some kind of quadtree would certainly help.
A more traditional entity system (ie. non artemis), or even a non entity system approach would be much simpler by entities pushing themselves onto a ‘dirty’ list when their position is changed, and blatting through that every frame. That’s harder to do cleanly within artemis without violating some of the constrains - either components have to become non-dumb, or things like the physics system have to become aware of the network system and push change notifications between each other. These are not terrible things, but highlight a wider issue where a ‘pure’ approach leads to less efficient behaviour.
An additional snag is that gameplay-wise I have to sync all of the objects because the player can see them all of the time - think always-on mini map which spans the whole galaxy (it’s more complicated than that but that would be too awkward to explain fully).
One thing that’s become apparent is that people write components in very different ways:
-
huge monolithic components that are basically just like their original pre-ECS entities. Minimal changes to wrap your head around, but misses the benefits of combining logic components in interesting ways. Still gets you good stuff like easier editor integrations etc. though.
-
Chunky components that handle their logic and communicate with other components in defined ways. Nicer to combine but quite a change that seems to take people at least a few months to wrap their heads around and do properly.
-
Thin, data-only components and aspect-like systems that updates some combination of components based on what’s present (or not) in a single entity. Great for really breaking things down into tiny pieces of logic and making dependencies super-explicit (and avoid a lot of the config problems of 2) but makes communication between components and systems hard (without resorting to flags and polling).
-
Components as ids into external systems. Tends to happen a lot when integrating some 3rd party library - physics being a good example. The component becomes a proxy for the actual data (possibly just an id/pointer) stored in an external system. Nice because the external system doesn’t really know/care about the component system, and the rest of the game gets a nice clean component interface to interact with.
1, 2 and 4 are largely interchangable within a single project, which is awesome. But 3 very much expects a different data model so it seems not really compatible with the first two approaches. Often I think discussions about ECS tend to be very polarizing because people have either decided one way is the ‘best’ way, or don’t even realise the other ways exist. Similarly I wonder how many people have been turned off them because they’ve been exposed to one style and assumed all other ECS are like that (in particular the artemis / style 3 approach is hugely off-putting on first encounter and requires a pretty huge mental shift in approach).