public static IEnumerable <uint> CalcBackUmbreon(uint h, uint a, uint b, uint c, uint d, uint s, bool deduplication = false)
 {
     // ブラッキーは特に再計算は無いので、ID生成分と1000消費分を戻して返す
     return(SeedFinder.FindGeneratingSeed(h, a, b, c, d, s, true)
            .Select(_ => _.PrevSeed(1000))
            .Where(LCGExtensions.IsAccessibleInNameScreen));
 }
        public IEnumerable <(uint seed, GCIndividual Individual)> CalcBack(uint h, uint a, uint b, uint c, uint d, uint s, bool deduplication = false)
        {
            foreach (var genSeed in SeedFinder.FindGeneratingSeed(h, a, b, c, d, s, false))
            {
                var stack = new Stack <(int Index, CalcBackCell Cell)>();
                stack.Push((preGeneratePokemons.Count, CalcBackCell.CreateCell(slot, genSeed)));
                var loopBreak = false;
                while (!loopBreak && stack.Count > 0)
                {
                    (var index, var cell) = stack.Pop();
                    if (index-- == 0)
                    {
                        // tsv判定.
                        if (!cell.CheckTSVGeneration())
                        {
                            continue;
                        }

                        yield return(cell.GetResult());

                        loopBreak = deduplication; // 重複を除く場合はloopBreakをtrueにしてループを抜ける.

                        continue;
                    }
                    foreach (var _c in cell.GetGeneratableCell(preGeneratePokemons[index]))
                    {
                        stack.Push((index, _c));
                    }
                }
            }
        }
        public static IEnumerable <uint> CalcBackEspeon(uint h, uint a, uint b, uint c, uint d, uint s, bool deduplication = false)
        {
            foreach (var genSeed in SeedFinder.FindGeneratingSeed(h, a, b, c, d, s, false))
            {
                var seed = genSeed;

                // ブラッキーのPIDを確認
                var lid = seed.BackRand();
                var psv = (lid ^ seed.BackRand()) >> 3;

                // ブラッキーが♀になるPIDは出現不可
                if ((lid & 0xFF) < 0x1F)
                {
                    continue;
                }

                // 該当したseedを返す処理
                {
                    // 個体値+特性+dummyPIDで5消費分戻す
                    var _seed = seed.PrevSeed(5);

                    // tsv生成して色回避のチェック
                    var tsv = (_seed.BackRand() ^ _seed.BackRand()) >> 3;

                    // 色回避が発生しないことの確認
                    if (tsv != psv)
                    {
                        // 謎の1000消費分を戻してから返す
                        _seed.Back(1000);

                        // 名前入力画面の不定消費に巻き込まれないかチェック
                        if (_seed.IsAccessibleInNameScreen())
                        {
                            yield return(_seed);

                            // 1つだけ返せばいい場合は中断する
                            if (deduplication)
                            {
                                yield break;
                            }
                        }
                    }
                }

                uint tsvCondition = 0x10000;
                // pidを持つような生成開始seedを探索
                do
                {
                    // ♂のPIDに当たるまでさかのぼり続ける
                    // ここで生成されるPIDは再計算対象でないといけない
                    lid = seed.BackRand();
                    var tempPSV = (lid ^ seed.BackRand()) >> 3;

                    // ♂になるPIDなら探索終了判定に移る
                    if ((lid & 0xFF) >= 0x1F)
                    {
                        // 色回避を考慮するモードで、なおかつ対象のTSVで色回避が発生しない
                        // …なら、探索を打ち切る
                        if (tsvCondition != 0x10000 && tsvCondition != tempPSV)
                        {
                            break;
                        }

                        // 本命のPIDとPSVが同じ場合、色回避が発生すると本命まで再計算されてしまうので
                        // 色回避の考慮無しに探索を打ち切る
                        if (tempPSV == psv)
                        {
                            break;
                        }

                        // 特定のTSVの場合に限って探索を続ける
                        tsvCondition = tempPSV;
                    }

                    // 該当したseedを返す処理
                    {
                        // 個体値+特性+dummyPIDで5消費分戻す
                        var _seed = seed.PrevSeed(5);

                        // tsv生成して色回避のチェック
                        var tsv = (_seed.BackRand() ^ _seed.BackRand()) >> 3;

                        if (tsvCondition == 0x10000)
                        {
                            // 本命のPIDに対して色回避を発生させてしまうTSVは不適格
                            if (tsv == psv)
                            {
                                continue;
                            }
                        }
                        else
                        {
                            // ブラッキーの色回避発生時に出現する個体の場合、色回避が発生しないとダメ
                            if (tsvCondition != tsv)
                            {
                                continue;
                            }
                        }


                        // 謎の1000消費分を戻してから返す
                        _seed.Back(1000);

                        // 名前入力画面の不定消費に巻き込まれないかチェック
                        if (_seed.IsAccessibleInNameScreen())
                        {
                            yield return(_seed);

                            // 1つだけ返せばいい場合は中断する
                            if (deduplication)
                            {
                                yield break;
                            }
                        }
                    }
                } while (true);
            }
        }