Static typing saves a lot of headaches down the track. The main "pain in the ass" is that you get more compiler errors. But this doesn't mean you had more errors than in a dynamic typed program, it just means that the compiler picked up potential flaws in your logic before you actually ran the program.
For example, if you have a combat-unit class that takes a pointer to an AI object that's supposed to tell it how to move, then a static typed language will tell you there is a logical error if you try and point it at e.g. a sound-playing object, whereas a dynamic typed language will just look sideways and whistle going "I'm totally cool with that", and then your players get weird shit happening in their game, which could be extremely expensive in dollars and time to track down. All for want of simple type checking.
Think about how often you wrap "ParseInt" or "IsANumber?" around variables in PHP/Javascript programs. It's something you always need to guard against. That's extra overhead both for the CPU and the programmer, and it's manually fixing it one variable at a time at runtime, what C++ prevents at compile time for all variables without you needing extra function calls.
Basically, errors picked up at compile time are quick to fix and don't cost a lot of money. They can also serve as an early-warning sign that you have issues in your program's design. Whereas with dynamic typing you can write code that makes no sense at all, and the machine totally accepts it as valid until it causes a runtime crash. Which means you have to test EVERY execution branch manually for errors that static typing would have prevented in the first place.