Hmm, the hook system is all broken. I've no idea how or why it worked before.
Is it possible that we used to load savegame data before executing the script's global scope, but a last-minute change in load order has broken everything? Unlikely, but i have no other explanation, because i'm sure it worked, i had saves for all levels and no errors whatsoever.
Anyway, i suggest we move all hook calls from global scope to a function, say __camResetHooks(), implement eventGameInit() and eventGameLoaded() to call it (directly, not as hooks!) in libcampaign, and say in documentation that we forbid user level scripts from defining eventGameInit() or eventGameLoaded() (because it's already defined in the library).
An alternative trick would be to move poorly serializable data out of the way in eventGameSaving() and put it back in eventGameSaved(), but that's tricky.