private void AddAllNames( IDictionary <int, List <string> > classByLength, ICollection <string> classesByNothing, IEnumerable <string> trainerClasses) { foreach (var trainerClassName in trainerClasses) { classesByNothing.Add(trainerClassName); var len = RomHandler.InternalStringLength(trainerClassName); if (classByLength.ContainsKey(len)) { classByLength[len].Add(trainerClassName); } else { var namesOfThisLength = new List <string> { trainerClassName }; classByLength[len] = namesOfThisLength; } } }
public void RandomizeTrainerClassNames(CustomNamesSet customNames) { if (!RomHandler.CanChangeTrainerText) { return; } // index 0 = singles, 1 = doubles List <string>[] allTrainerClasses = { new List <string>(), new List <string>() }; Dictionary <int, List <string> >[] trainerClassesByLength = { new Dictionary <int, List <string> >(), new Dictionary <int, List <string> >() }; AddAllNames(trainerClassesByLength[0], allTrainerClasses[0], customNames.TrainerClasses); AddAllNames(trainerClassesByLength[1], allTrainerClasses[1], customNames.DoublesTrainerClasses); // Get the current trainer names data var currentClassNames = RomHandler.TrainerClassNames.ToArray(); var mustBeSameLength = RomHandler.FixedTrainerClassNamesLength; var maxLength = RomHandler.MaxTrainerClassNameLength; // Init the translation map and new list var translation = new Dictionary <string, string>(); var numTrainerClasses = currentClassNames.Length; var doublesClasses = RomHandler.DoublesTrainerClasses; // Start choosing for (var i = 0; i < numTrainerClasses; i++) { var trainerClassName = currentClassNames[i]; if (translation.ContainsKey(trainerClassName)) { // use an already picked translation currentClassNames[i] = translation[trainerClassName]; } else { var idx = doublesClasses.Contains(i) ? 1 : 0; var pickFrom = allTrainerClasses[idx]; var intStrLen = RomHandler.InternalStringLength(trainerClassName); if (mustBeSameLength) { pickFrom = trainerClassesByLength[idx][intStrLen]; } var changeTo = trainerClassName; if (pickFrom != null && pickFrom.Count > 0) { changeTo = pickFrom[Random.Next(pickFrom.Count)]; while (changeTo.Length > maxLength) { changeTo = pickFrom[Random.Next(pickFrom.Count)]; } } translation[trainerClassName] = changeTo; currentClassNames[i] = changeTo; } } }
public void RandomizeTrainerNames(CustomNamesSet customNames) { if (!RomHandler.CanChangeTrainerText) { return; } // index 0 = singles, 1 = doubles List <string>[] allTrainerNames = { new List <string>(), new List <string>() }; Dictionary <int, List <string> >[] trainerNamesByLength = { new Dictionary <int, List <string> >(), new Dictionary <int, List <string> >() }; AddAllNames(trainerNamesByLength[0], allTrainerNames[0], customNames.TrainerNames); AddAllNames(trainerNamesByLength[1], allTrainerNames[1], customNames.DoublesTrainerNames); // Get the current trainer names data var currentTrainerNames = RomHandler.TrainerNames; if (currentTrainerNames.Length == 0) { return; } var mode = RomHandler.TrainerNameMode; var maxLength = RomHandler.MaxTrainerNameLength; var totalMaxLength = RomHandler.MaxSumOfTrainerNameLengths; var success = false; var tries = 0; // Init the translation map and new list var translation = new Dictionary <string, string>(); // loop until we successfully pick names that fit // should always succeed first attempt except for gen2. while (!success && tries < 10000) { success = true; translation.Clear(); var totalLength = 0; // Start choosing for (var i = 0; i < currentTrainerNames.Length; ++i) { var trainerName = currentTrainerNames[i]; if (translation.ContainsKey(trainerName) && trainerName.Equals("GRUNT", StringComparison.InvariantCultureIgnoreCase) == false && trainerName.Equals("EXECUTIVE", StringComparison.InvariantCultureIgnoreCase) == false) { // use an already picked translation currentTrainerNames[i] = translation[trainerName]; totalLength = totalLength + RomHandler.InternalStringLength(translation[trainerName]); } else { var idx = trainerName.Contains("&") ? 1 : 0; var pickFrom = allTrainerNames[idx]; var intStrLen = RomHandler.InternalStringLength(trainerName); if (mode == TrainerNameMode.SameLength) { pickFrom = trainerNamesByLength[idx][intStrLen]; } var changeTo = trainerName; var ctl = intStrLen; if (pickFrom != null && pickFrom.Count > 0 && intStrLen > 1) { var innerTries = 0; changeTo = pickFrom[Random.Next(pickFrom.Count)]; ctl = RomHandler.InternalStringLength(changeTo); while (mode == TrainerNameMode.MaxLength && ctl > maxLength || mode == TrainerNameMode.MaxLengthWithClass) { innerTries++; if (innerTries == 100) { changeTo = trainerName; ctl = intStrLen; break; } changeTo = pickFrom[Random.Next(pickFrom.Count)]; ctl = RomHandler.InternalStringLength(changeTo); } } translation[trainerName] = changeTo; currentTrainerNames[i] = changeTo; totalLength = totalLength + ctl; } if (totalLength <= totalMaxLength) { continue; } success = false; tries++; break; } } if (!success) { throw new NotImplementedException( "Could not randomize trainer names in a reasonable amount of attempts." + "\nPlease add some shorter names to your custom trainer names."); } }