Thanks all!
This was another productive challenge for me, I hate bouncing off of angles because of the laborious calculations. For this demo I tried an idea I had for quite some time, turns out it was very easy to implement.
I put a ring of non-transparent pixel checks around each ball and precalulated the balls bounce angle for every one. Used a similar setup for spreading the fire.
Glad you like the results!