예제 #1
0
        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;
                }
            }
        }
예제 #2
0
        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.");
            }
        }