private void KKP_TextDumpAwake(BaseTextDumpPlugin sender, EventArgs eventArgs)
 {
     ManualDumpHotkey = Config.Bind("Keyboard Shortcuts", "Dump Translations",
                                    new KeyboardShortcut(KeyCode.F9, KeyCode.LeftControl, KeyCode.LeftAlt),
                                    "Once you have control of the player and have visited all the screens you'd like to collect press this key to start dump");
     SceneManager.sceneLoaded   += SceneManager_sceneLoaded;
     SceneManager.sceneUnloaded += SceneManager_sceneUnloaded;
 }
 private void TextDump_TextDumpUpdate(BaseTextDumpPlugin sender, EventArgs eventArgs)
 {
     if (Enabled.Value && DumpLevelCompleted == (int)DumpLevels.Main &&
         DumpLevelReady < DumpLevelMax &&
         ManualDumpHotkey.Value.IsPressed())
     {
         DumpLevelReady = (int)DumpLevels.Manual;
     }
 }
 private void AI_INT_TextDumpLevelComplete(BaseTextDumpPlugin sender, EventArgs eventArgs)
 {
     if (DumpLevelCompleted >= DumpLevelMax)
     {
         NotificationMessage = string.Empty;
     }
     else if (DumpLevelCompleted > 0)
     {
         NotificationMessage =
             "Localizations not loaded. Start/Load game and play until you have control of the player";
     }
 }
示例#4
0
        protected IEnumerable <ITranslationDumper> GetScenarioTextMergers()
        {
            if (!TextDump.IsReadyForFinalDump())
            {
                yield break;
            }
            var needle = CombinePaths("", "abdata", "adv", "scenario", "");
            var paths  = BaseTextDumpPlugin.GetTranslationPaths().Where(k => k.Contains(needle)).ToList();

            paths.Sort();
            paths.Reverse();
            var personalityCheckChars = "01234567890-".ToCharArray();

            var mappings = new Dictionary <string, Dictionary <string, string> >();
            var fileMaps = new Dictionary <string, List <string> >();

            foreach (var path in paths)
            {
                var parts            = path.Split(PathSplitter).ToList();
                var personalityIndex = parts.IndexOf("scenario") + 1;
                if (personalityIndex == 0)
                {
                    continue;
                }
                var personality       = parts[personalityIndex];
                var isPersonalityFile = personality.Length > 1 && personality.StartsWith("c") &&
                                        personalityCheckChars.Contains(personality[1]);
                if (!isPersonalityFile)
                {
                    continue;
                }

                var personalityMap = mappings.GetOrInit(personality,
                                                        () => new Dictionary <string, string>(new TrimmedStringComparer()));

                var personalityFiles = fileMaps.GetOrInit(personality);

                personalityFiles.Add(path);

                foreach (var entry in BaseTextDumpPlugin.GetTranslationsForPath(path)
                         .Where(entry => !entry.Value.IsNullOrEmpty()))
                {
                    AddLocalizationToResults(personalityMap, entry);
                }
            }

            foreach (var translationDumper in BuildTranslationMergers(fileMaps, mappings))
            {
                yield return(translationDumper);
            }
        }
示例#5
0
        private void KKS_TextDumpComplete(BaseTextDumpPlugin sender, EventArgs eventArgs)
        {
            var delta = _total - _lastTotal;

            if (DumpLevelCompleted >= DumpLevelMax)
            {
                NotificationMessage = string.Empty;


                if (_total == _lastTotal)
                {
                    _stableCount++;
                }
                else
                {
                    _lastTotal = _total;
                    if (_stableCount != 0)
                    {
                        _lastDelta = delta;
                    }
                    _stableCount = 0;
                }

                if (_stableCount < 3)
                {
                    StartCoroutine(RetryDelay(10));
                    if (_stableCount == 0)
                    {
                        NotificationMessage = $"Number of translations found is continuing to change ({delta})";
                    }
                    else
                    {
                        NotificationMessage = "Number of translations unchanged";
                    }


                    NotificationMessage +=
                        $", will keep re-dumping until it's stable for {3 - _stableCount} more cycle(s)";
                    DumpLevelCompleted--;
                    DumpLevelReady = DumpLevelCompleted;
                }
            }
            else if (DumpLevelCompleted > 0)
            {
                NotificationMessage =
                    "Multiple brute-force dump attempts are required, please wait until you see a message saying files are available";
            }
        }
示例#6
0
        protected IEnumerable <ITranslationDumper> GetCommunicationTextMergers()
        {
            if (!TextDump.IsReadyForFinalDump())
            {
                yield break;
            }
            var needle = CombinePaths("", "abdata", "communication", "");
            var paths  = BaseTextDumpPlugin.GetTranslationPaths().Where(k => k.Contains(needle)).ToList();

            paths.Sort();
            paths.Reverse();

            var splitter = new HashSet <char> {
                Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar
            }.ToArray();

            var mappings = new Dictionary <string, Dictionary <string, string> >();
            var fileMaps = new Dictionary <string, List <string> >();

            foreach (var path in paths)
            {
                var parent = Path.GetFileName(Path.GetDirectoryName(path));
                if (parent is null)
                {
                    continue;
                }
                var personalityMap = mappings.GetOrInit(parent,
                                                        () => new Dictionary <string, string>(new TrimmedStringComparer()));
                var personalityFiles = fileMaps.GetOrInit(parent);

                personalityFiles.Add(path);

                foreach (var entry in BaseTextDumpPlugin.GetTranslationsForPath(path)
                         .Where(entry => !entry.Value.IsNullOrEmpty()))
                {
                    AddLocalizationToResults(personalityMap, entry);
                }
            }

            foreach (var translationDumper in BuildTranslationMergers(fileMaps, mappings))
            {
                yield return(translationDumper);
            }
        }
示例#7
0
        protected IEnumerable <ITranslationDumper> BuildTranslationMergers(Dictionary <string, List <string> > fileMaps,
                                                                           Dictionary <string, Dictionary <string, string> > mappings)
        {
            foreach (var personalityFileMap in fileMaps)
            {
                var personality      = personalityFileMap.Key;
                var personalityMap   = mappings[personality];
                var personalityFiles = personalityFileMap.Value;

                foreach (var path in personalityFiles)
                {
                    var mapPath = path.Substring(TextDump.AssetsRoot.Length).TrimStart(PathSplitter);
                    mapPath = CombinePaths(Path.GetDirectoryName(mapPath), Path.GetFileNameWithoutExtension(mapPath));

                    var toUpdate = new HashSet <string>(BaseTextDumpPlugin.GetTranslationsForPath(path)
                                                        .Where(e => e.Value.IsNullOrWhiteSpace()).Select(e => e.Key));

                    if (toUpdate.Count == 0)
                    {
                        continue;
                    }

                    IDictionary <string, string> Dumper()
                    {
                        var result = new OrderedDictionary <string, string>();

                        foreach (var key in toUpdate)
                        {
                            if (personalityMap.TryGetValue(key, out var match))
                            {
                                AddLocalizationToResults(result, key, match);
                            }
                        }

                        return(result);
                    }

                    yield return(new StringTranslationDumper(mapPath, Dumper));
                }
            }
        }
 private static void Unpatch(BaseTextDumpPlugin sender, EventArgs eventArgs)
 {
     if (_harmony == null)
     {
         return;
     }
     lock (InitialDumpLock)
     {
         var tmp = _harmony;
         if (tmp == null)
         {
             return;
         }
         _harmony = null;
         tmp.UnpatchAll(HarmonyId);
         if (sender is TextDump textDump)
         {
             textDump.TextDumpUpdate -= Unpatch;
         }
     }
 }
        private void KKP_TextDumpLevelComplete(BaseTextDumpPlugin sender, EventArgs eventArgs)
        {
            _waitForTitleUnload |= (DumpLevelCompleted > 0 && DumpLevelCompleted < (int)DumpLevels.Main);

            if (DumpLevelCompleted < (int)DumpLevels.Initial)
            {
                NotificationMessage = string.Empty;
            }

            /*
             * else if (DumpLevelCompleted < (int) DumpLevels.Maker)
             * {
             *  NotificationMessage =
             *      "Localizations not fully loaded. Please launch the character maker.";
             * }
             */
            else if (DumpLevelCompleted < (int)DumpLevels.Main)
            {
                NotificationMessage =
                    "Localizations not fully loaded. Start/Load main game and play until you have control of the player";
            }

            if (DumpLevelCompleted == (int)DumpLevels.Main)
            {
                TextDumpUpdate     += TextDump_TextDumpUpdate;
                NotificationMessage =
                    $"Visit as many dialogs/screens as possible then press {ManualDumpHotkey.Value} to execute dump";
            }

            if (DumpLevelCompleted < DumpLevelMax)
            {
                return;
            }

            NotificationMessage         = string.Empty;
            SceneManager.sceneUnloaded -= SceneManager_sceneUnloaded;
            SceneManager.sceneLoaded   -= SceneManager_sceneLoaded;
            TextDumpUpdate             -= TextDump_TextDumpUpdate;
        }
示例#10
0
 private void KKS_TextDumpAwake(BaseTextDumpPlugin sender, EventArgs eventArgs)
 {
     SceneManager.sceneLoaded += KKS_sceneLoaded;
 }
 private void KKP_TextDumpUpdate(BaseTextDumpPlugin sender, EventArgs eventArgs)
 {
 }