So the conditions sufficient to reproduce the Critical Game state.
- 4 AM in Australia vs 12:00 PM in California
- NAT vs no-NAT
- Russian Version vs English Version
- Modified Version of Cataract
- Light player captures all of the flags and then a flag returns to neutral (Dark player captures one)
- WindowsXP vs Windows 7
- Irek vs Ptarth
I'm looking at the logs to try to make sense of what is going on. The best clue I currently have is that after the Forces of Light have complete flag control and they lose one of their flags, a localization error occurs. A critical game state then occurs 1-6 seconds after this event. This was replicated 5 times, so I'm pretty sure it is real.
Edit: I think I got it.
The string definitions used in Demigod are case sensitive. This can lead to problems, one of which is when two strings exist that only differ by in case only. In the following I show examples of this, as well as what is most likely causing the problem. The following are excerpts from strings_da.lua from the English, French, and Russian string_db.lua files.
- FLAG_0000="Cooldown times reduced by [GetCooldownBonus]% for the controlling team. Grants controlling team members access to the Celerity Battle Standard."
- FLAG_0001="Cooldowns decreased."
- FLAG_0000="Temps de refroidissement rÃ©duits de [GetCooldownBonus]% pour l'Ã©quipe qui le contrÃ´le. Fait profiter les membres de cette Ã©quipe de l'Etendard de Refroidissement."
- FLAG_0001="Refroidissement accÃ©lÃ©rÃ©."
- FLAG_0000="Ð£ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹, Ð¾Ð²Ð»Ð°Ð´ÐµÐ²ÑˆÐµÐ¹ Ñ„Ð»Ð°Ð³Ð¾Ð¼, Ð¿ÐµÑ€ÐµÐ·Ð°Ñ€Ñ??Ð´ÐºÐ° Ð½Ð° [GetCooldownBonus]% Ð±Ñ‹Ñ??Ñ‚Ñ€ÐµÐµ. Ð’Ñ??Ðµ Ñ‡Ð»ÐµÐ½Ñ‹ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ??Ñ‚ Ð´Ð¾Ñ??Ñ‚ÑƒÐ¿ Ðº Ð±Ð¾ÐµÐ²Ð¾Ð¼Ñƒ Ñ„Ð»Ð°Ð³Ñƒ Ð¿ÐµÑ€ÐµÐ·Ð°Ñ€Ñ??Ð´ÐºÐ¸."
- FLAG_0001="ÐŸÐµÑ€ÐµÐ·Ð°Ñ€Ñ??Ð´ÐºÐ° Ð¿Ñ€Ð¾Ñ…Ð¾Ð´Ð¸Ñ‚ Ð±Ñ‹Ñ??Ñ‚Ñ€ÐµÐµ."
So, the first two entries, FLAG_0000 and FLAG_0001 are the tooltips for the Celerity Flag (I'm not sure they are used in game). Comparing across languages it is apparent that they are similar. Also, notice that all contain [GetCooldownBonus]. This is the syntax that is interpreting to allow the strings to referenced defined values in the blueprints. In this case, GetCooldownBonus is defined in the blueprint of whatever calls FLAG_0000.
Now, let's look at another set of strings.
- flag_0000="The Forces of Light control the map!"
- flag_0001="The Forces of Darkness control the map!"
- flag_0000="Les Forces de la LumiÃ¨re contrÃ´lent la carte !"
- flag_0001="Les Forces des TÃ©nÃ¨bres contrÃ´lent la carte !"
- flag_0000="Ð£ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹, Ð¾Ð²Ð»Ð°Ð´ÐµÐ²ÑˆÐµÐ¹ Ñ„Ð»Ð°Ð³Ð¾Ð¼, Ð¿ÐµÑ€ÐµÐ·Ð°Ñ€Ñ??Ð´ÐºÐ° Ð½Ð° [GetCooldownBonus]% Ð±Ñ‹Ñ??Ñ‚Ñ€ÐµÐµ. Ð’Ñ??Ðµ Ñ‡Ð»ÐµÐ½Ñ‹ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ??Ñ‚ Ð´Ð¾Ñ??Ñ‚ÑƒÐ¿ Ðº Ð±Ð¾ÐµÐ²Ð¾Ð¼Ñƒ Ñ„Ð»Ð°Ð³Ñƒ Ð¿ÐµÑ€ÐµÐ·Ð°Ñ€Ñ??Ð´ÐºÐ¸."
- flag_0001="ÐŸÐµÑ€ÐµÐ·Ð°Ñ€Ñ??Ð´ÐºÐ° Ð¿Ñ€Ð¾Ñ…Ð¾Ð´Ð¸Ñ‚ Ð±Ñ‹Ñ??Ñ‚Ñ€ÐµÐµ."
Notice that the French and English strings match. Now, check out the Russian version (at least I assume it is Russian). Notice that flag_0000 contains [GetCooldownBonus] only in the Russian version. Also notice that FLAG_0000 and flag_0000 for the Russian versions are identical. I believe that happened is that flag_0000 was replaced by FLAG_0000 somehow. When flag_0000 is called it then wants to call have [GetCooldownBonus] defined. However, since GetCooldownBonus is not defined, it errors out and causes a desync.
The solution is to fix the strings_db.lua for the Russian version by removing the [GetCooldownBonus] from flag_0000. Ideally you'd want to replace the faulty string with the correct one, but either way the problem would be resolved.
Now, this is complete conjecture without testing it, I'd need to get another gullible person with a Russian install to test it. I can't confirm it only with English installs. However, I'm pretty sure this is it.
I'd like to thank Irek for facilitating the documentation of the Forces of Light bug. His continued belief and active posting in the forums was one of the leading causes to why I believed the bug did exist. This was in spite of the stance by active forumers and Stardock. It was only with his help and testing efforts that the bug was able to be tracked down and solved. I really appreciate his assistance in this matter. His help in this matter is doubly appreciated because he stayed up all night and was still willing to put up with my efforts and attempts to solve this issue.