This is because the code is saying :
(unsigned long) ask_amount = player_money * .5;
the bug there is that (signed long) -1 = max_unsigned_long / 2 -1
so when the signed long (player money) is cast to unsigned, the MSb which is the negative flag, ends up adding 2.4 million gold instead.
easy to fix, but it's an example the sorts of bugs that are in the title, most of which are less obvious.