private static void InitializeGameData() { var totalDataToLoad = (double)(LoadingWindowViewModel.Settings.EnemyCount + LoadingWindowViewModel.Settings.ChipCount + LoadingWindowViewModel.Settings.AddOnCount + LoadingWindowViewModel.Settings.InteriorCount + LoadingWindowViewModel.Settings.BackgroundCount); var dataLoaded = 0; // Prints multiple NullReferenceExceptions as EnemyBase in ShanghaiEXE has undefined ids caught in the game code Constants.BaseEnemyDefinitions = new Dictionary <int, EnemyDefinition>(); for (int enemyID = 0; enemyID < LoadingWindowViewModel.Settings.EnemyCount; enemyID++) { Constants.BaseEnemyDefinitions[enemyID] = EnemyDefinition.GetEnemyDefinition(enemyID, 0, 0, 1); dataLoaded++; Constants.ConstantsLoadProgressEventUpdated?.Invoke(null, new ConstantsLoadProgressEventUpdatedEventArgs("Data: Enemy: ", dataLoaded / totalDataToLoad)); } Constants.ChipDefinitions = new Dictionary <int, ChipDefinition>(); for (int chipID = 0; chipID < LoadingWindowViewModel.Settings.ChipCount; chipID++) { var chipDefinition = ChipDefinition.GetChipDefinition(chipID); if (chipDefinition != null) { Constants.ChipDefinitions[chipID] = chipDefinition; } dataLoaded++; Constants.ConstantsLoadProgressEventUpdated?.Invoke(null, new ConstantsLoadProgressEventUpdatedEventArgs("Data: Chip: ", dataLoaded / totalDataToLoad)); } Constants.AddOnDefinitions = new Dictionary <int, AddOnDefinition>(); for (int addOnID = 0; addOnID < LoadingWindowViewModel.Settings.AddOnCount; addOnID++) { var addOnDefiniton = AddOnDefinition.GetAddOnDefinition(addOnID); if (addOnDefiniton != null) { Constants.AddOnDefinitions[addOnID] = addOnDefiniton; } dataLoaded++; Constants.ConstantsLoadProgressEventUpdated?.Invoke(null, new ConstantsLoadProgressEventUpdatedEventArgs("Data: AddOn: ", dataLoaded / totalDataToLoad)); } Constants.InteriorDefinitions = new Dictionary <int, string>(); for (int interiorID = 0; interiorID < LoadingWindowViewModel.Settings.InteriorCount; interiorID++) { var interiorKey = $"Interior.Item{interiorID + 1}"; if (Constants.TranslationService.CanTranslate(interiorKey)) { Constants.InteriorDefinitions[interiorID] = Constants.TranslationService.Translate(interiorKey).Text; } dataLoaded++; Constants.ConstantsLoadProgressEventUpdated?.Invoke(null, new ConstantsLoadProgressEventUpdatedEventArgs("Data: Interior: ", dataLoaded / totalDataToLoad)); } Constants.BackgroundDefinitions = new Dictionary <int, BackgroundDefinition>(); for (int i = 0; i < LoadingWindowViewModel.Settings.BackgroundCount; i++) { Constants.BackgroundDefinitions[i] = new BackgroundDefinition(BackgroundBase.BackMake(i)); dataLoaded++; Constants.ConstantsLoadProgressEventUpdated?.Invoke(null, new ConstantsLoadProgressEventUpdatedEventArgs("Data: Background: ", dataLoaded / totalDataToLoad)); } CharacterInfo.LoadCharacterInfo(out FloatingCharacters, out NoShadowCharacters); var keyItemDoc = new XmlDocument(); keyItemDoc.Load($"data/data/KeyItems.xml"); var keyItemDefintions = Constants.LoadKeyItems(keyItemDoc); Constants.KeyItemDefinitions = new ObservableConcurrentDictionary <int, KeyItemDefinition>(); foreach (var kvp in keyItemDefintions) { Constants.KeyItemDefinitions.Add(kvp.Key, kvp.Value); } var mailDoc = new XmlDocument(); mailDoc.Load($"data/data/Mail.xml"); var mailDefinitions = Constants.LoadMail(mailDoc); Constants.MailDefinitions = new ObservableConcurrentDictionary <int, MailDefinition>(); foreach (var kvp in mailDefinitions) { Constants.MailDefinitions.Add(kvp.Key, kvp.Value); } }