"I should write a FightSystem which handles all the entities with an "AttackedBy" component right? "
- That is a good idea, I would handle it on the "node added" though, as you could have multiple "AttackedBy" components added in a single update.
"I would avoid the second approach, I really like the idea that each System can live on its own without communicating with the others :)"
- In theory it sound's good but in practice, if your game is < 40K Lines of Code I really would not worry. It is much faster to handle communication via the message route.
I have used it on an 80K LOC project and it was very maintainable.
I think many devs new to ECS theory consider decoupling, but omit ease of use, consistency and cohesion. All important factors with any software design ;)
"How to write Systems which are agnostic to gameplay data?"
- The simplest way is to represent each animation via a string-id. Then grab the animation based on id, using that string, from the AnimationComponent.
Alternatively, use a model-view-controller pattern for the complex display and pass the controller to the systems that handle animation changes.
Hope it helps :D