Change the way double dispatch is implemented.

Now uses dynamic_cast instead of function overloading.
Blood is almost working again.