I was going through some code so I could update the SDK with some specifics for each call, and I noticed something odd about the ForceMoraleX functions. It seems they're buggy. If you use a parameter of -1 for all players, then you have no troubles. But the code path that handles forcing morale levels for a specific player is buggy.
What it should probably be doing, is clearing the bit of each forced morale level for that player, and then set the bit for the desired level. But what it really does, is flips the bit for each morale level, and then sets the bit for the desired level.
What happens then, is that if you call any of the ForceMoraleX functions, (assuming the initial state of all bits is 0) then all levels have that bit set for that player (and the desired level is set twice). This ends up forcing the morale level to excellent, no matter which function you called. Now, if you call the function again, it will flip all the bits again (setting them all to 0), and then set the bit for the desired level. So if you call it twice, it will work right.
Similarly, if you call two different functions, the first one sets morale level to excellent, and then the second one has the desired effect. However, if you call different functions each time, then things start to get a little hairy after two calls.
FreeMoraleLevel looks like it works fine in all cases.
Of course there is little reason to call ForceMoraleX with a value other than -1, since it'd be unfair in multiplayer, and would have no effect on an AI in single player.