To make VFX feel a lot more impactful, especially for the titular Immortals’ abilities, simple 2D GPU ‘fluid simulation’ (I use those words very loosely here) was used. Internally it was called the shockwave solver.
Niagara systems could inject velocity into the field through a custom Niagara module. It had all the usual settings that one might expect – radius, intensity, origin position and supported omnidirectional, directional and vortex emitter types.
The solver had to remain very lightweight, as the entire level needed to be simulated at all times – the camera could jump to any location on the map with no warning. Due to that the grid that stores the result ended up having a quite low texel density.
The primary consumer of the shockwave solver is the foliage spring simulation – a very simple GPU sim that creates state for all foliage instances excluding grass in a level and allows it to react as springs to inputs, the main one being the shockwave simulation, but general wind forces apply too. Each foliage type has different spring parameters such as mass, dampening and tightness.
The result of the foliage spring solver is written into a small render target where each instance is represented by a texel, and the foliage vertex shader samples the data and offsets vertices accordingly.
Only one spring per instance is created to keep it simple. Individual instances are never that large on screen in game, so the additional complexity of simulating per branch/ bone didn’t seem worth the effort.

Acknowledgements:
Most of the implementation ideas were taken from “Interactive Wind and Vegetation in ‘God of War” and “Wind Simulation in God of War”. Check them out – they’re great presentations.