Ejemplo n.º 1
0
    /// <summary>
    /// 大当たり抽選 
    /// </summary>
    /// <param name="HoryuSu">保留カウント</param>
    /// <param name="KenriKaisu">権利回数(0でなければ確変中)</param>
    /// <returns></returns>
    public DrawLotResult DrawLot(int HoryuSu, int KenriKaisu, 
        bool ForceNormalReach,
        bool ForceSPReach,
        bool ForceOoatari,
        bool ForceSP3,
        bool ForceSaishidou
    )
    {
        DrawLotResult result = new DrawLotResult();

        var IsKakuhen = (KenriKaisu == 0) ? false : true;

        Debug.Log("カクヘン:" + IsKakuhen);

        var Atari = IsAtari(RndFFFF, IsKakuhen);
        var ForceHazure = HazureKotei.Instance.State;

        if (ForceHazure) Atari = false;
        if (ForceOoatari) Atari = true;

        if (Atari)
        {
            //---------//
            // 大当たり //
            //---------//

            // リーチライン抽選
            var rl = DrawLotReachLine(RndFFFF);

            if (SliderChange.Instance.value != 0)
            {
                while (SliderChange.Instance.value != GetTokuzu(rl.Tokuzu))
                {
                    rl = DrawLotReachLine(RndFFFF);
                }
            }

            // リーチパターン抽選
            structReachPattern[] RP;
            if (rl.ReachLine != 4) { RP = Atari123_Chusen; }
            else { RP = Atari4_Chusen; }

            var rp = RP[RndFFFF];

            if (ForceNormalReach)
            {
                ForceSPReach = false;
                ForceSP3 = false;
                ForceSaishidou = false;
            }

            if (ForceSPReach)
            {
                while (!rp.Name.Contains("SP"))
                {
                    rp = Atari123_Chusen[RndFFFF];
                }
            }

            if (ForceSP3)
            {
                while( rl.ReachLine != 4 ){
                    rl = DrawLotReachLine(RndFFFF);
                }

                while (!rp.Name.Contains("SP3"))
                {
                    rp = Atari4_Chusen[RndFFFF];
                }
            }

            if (ForceSaishidou)
            {
                while (!rp.Name.Contains("再始動"))
                {
                    rp = RP[RndFFFF];
                }
            }

            if (ForceNormalReach)
            {
                while (rp.Name.Contains("再始動") || rp.Name.Contains("SP"))
                {
                    rp = RP[RndFFFF];
                }
            }

            // 返却値をセット
            result.isOOatari = true;
            result.reachLine = rl.ReachLine;
            result.reachLineName = rl.Tokuzu;
            result.reachPattern = rp.No;
            result.reachPatternName = rp.Name;
            result.tokuzu = GetTokuzu(rl.Tokuzu);
        }
        else
        {
            Func<int, bool> DrawLotHazure;
            if (HoryuSu == 0)
            {
                DrawLotHazure = DrawLotHazureH0;
            }
            else if (HoryuSu == 1 || HoryuSu == 2)
            {
                DrawLotHazure = DrawLotHazureH12;
            }
            else
            {
                DrawLotHazure = DrawLotHazureH3;
            }

            // リーチライン抽選
            var rl = DrawLotReachLine(RndFFFF);

            if (ForceSP3)
            {
                rl.ReachLine = 4;
            }

            // リーチ抽選
            var reach = DrawLotHazure(RndFFFF);
            structReachPattern rp = new structReachPattern();

            var tokuzu = GetTokuzu(rl.Tokuzu);

            if (reach || ForceNormalReach || ForceSPReach)
            {
                Func<int, structReachPattern> DrawLotReachPattern;
                if (rl.ReachLine == 4)
                {
                    DrawLotReachPattern = DrawLotReachPattern4;
                } else {
                    DrawLotReachPattern = DrawLotReachPattern123;
                }

                rp = DrawLotReachPattern(RndFFFF);

                if (ForceSPReach)
                {
                    while (!rp.Name.Contains("SP"))
                    {
                        rp = DrawLotReachPattern(RndFFFF);
                    }
                }

                if (ForceSP3)
                {
                    while (!rp.Name.Contains("SP3"))
                    {
                        rp = DrawLotReachPattern(RndFFFF);
                    }
                }

                //Debug.Log("ハズレリーチ:" + rp.Name);
                //Debug.Log("リーチライン:" + rl.ReachLine.ToString());
            }
            else
            {
                // バラケ目
                //Debug.Log("ハズレ");
                rp.No = -1; // バラケ目時はリーチパターンNoをー1とする
                rl.ReachLine = -1;
                rp.Name = "ハズレ";
            }

            // 返却値をセット
            result.isOOatari = false;
            result.reachLine = rl.ReachLine;
            result.reachLineName = rl.Tokuzu;
            result.reachPattern = rp.No;
            result.reachPatternName = rp.Name;
            result.tokuzu = tokuzu;
        }

        // 結果を返却する
        return result;
    }
Ejemplo n.º 2
0
    /// <summary>
    /// 大当たりの止まる位置を取得
    /// </summary>
    /// <param name="result"></param>
    /// <param name="AtariZugara"></param>
    /// <returns></returns>
    static public ReelElement[] ChooseOoatari(DrawLotResult result, out int AtariZugara)
    {
        var Tokuzu = result.tokuzu;
        var ReachLine = result.reachLine;

        AtariZugara = Tokuzu;

        //Debug.Log("特図:" + Tokuzu);
        //Debug.Log("リーチライン:" + ReachLine);

        // 上段、中段、下段の止まる位置を仮固定
        var r1 = reel1.Where(r => r.Tokuzu.Equals(Tokuzu.ToString())).First();
        var r2 = reel2.Where(r => r.Tokuzu.Equals(Tokuzu.ToString())).First();
        var r3 = reel3.Where(r => r.Tokuzu.Equals(Tokuzu.ToString())).First();

        // リーチラインに応じて、上段、下段の位置をずらす
        if (ReachLine == 1)
        {
            // ずらさない
        }
        else if (ReachLine == 2)
        {
            // 上段ずらす
            r1 = CyclicReel1.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString()))
                            .Skip(19)
                            .First();

            // 下段ずらす
            r3 = CyclicReel3.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString()))
                            .Skip(19)
                            .First();

        }
        else if (ReachLine == 3)
        {
            // 上段ずらす
            r1 = CyclicReel1.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString()))
                            .Skip(18)
                            .First();

            // 下段ずらす
            r3 = CyclicReel3.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString()))
                            .Skip(18)
                            .First();
        }
        else if (ReachLine == 4)
        {
            // 上段ずらさないで、下段ずらす
            r3 = CyclicReel3.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString()))
                            .Skip(18)
                            .First();
        }

        //--------------------------------------------------------------------
        // 中段を決める
        // リーチライン4の場合は、ダブルリーチだが、どちらで当てるかは
        // プログラム側で1/2の確率で決める
        //--------------------------------------------------------------------

        if (result.reachPatternName.Contains("SP3"))
        {
            // SP3はダブルリーチ固定
            CycleSequence<ReelElement> cyclicReel2SP;
            
            var rnd = UnityEngine.Random.Range(0, 2);

            //Debug.Log("rnd:" + rnd);
            //Debug.Log(rnd == 0 ? "前図柄" : "後図柄");

            var Zugara = Tokuzu.ToString();
            if( rnd == 0 ){
                cyclicReel2SP = CyclicReel2SP3_MaeOoatari;
            } else {
                cyclicReel2SP = CyclicReel2SP3_UshiroOoatari;

                Zugara = CyclicReelUnder.SkipWhile(e => !e.Equals(Tokuzu.ToString()))
                                             .Skip(18)
                                             .First();
                AtariZugara = int.Parse(Zugara);
            }

            r2 = cyclicReel2SP.SkipWhile(elem => !elem.Tokuzu.Equals(Zugara))
                            .Skip(19)
                            .First();

        }
        else if (result.reachPatternName.Contains("SP"))
        {
            // SP1, SP2
            var cyclicReel2SP = CyclicReel2SP3_MaeOoatari;

            if (ReachLine == 1)
            {
                r2 = cyclicReel2SP.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString()))
                                .Skip(20)
                                .First();
            }
            else if (ReachLine == 2)
            {
                r2 = cyclicReel2SP.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString()))
                                .Skip(19)
                                .First();
            }
            else if (ReachLine == 3)
            {
                r2 = cyclicReel2SP.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString()))
                                .Skip(18)
                                .First();
            }
        }
        else if (result.reachPatternName.Contains("再始動"))
        {
            // 再始動ビタどまり
            // +20の場合は+1にしておく
            // TODO 仕様を確認
            var delmitChars = new Char[] { '(', ')' };
            var split = result.reachPatternName.Split(delmitChars);
            var num = int.Parse(split[1]);
            if (num == 20) num = 1;

            var t = "";
            if (ReachLine == 1) { t = RL1[Tokuzu]; }
            else if (ReachLine == 2) { t = RL2[Tokuzu]; }
            else if (ReachLine == 3) { t = RL3[Tokuzu]; }
            else {
                var rnd = UnityEngine.Random.Range(0, 2);
                if (rnd == 0)
                {
                    t = RL2[Tokuzu];
                }
                else
                {
                    t = RL4B[Tokuzu];
                    var Zugara = CyclicReelUnder.SkipWhile(e => !e.Equals(Tokuzu.ToString()))
                             .Skip(2)
                             .First();
                    AtariZugara = int.Parse(Zugara);
                }
            }

            var s = t + "-" + num.ToString();

            r2 = new ReelElement() { Tokuzu = t, Sizi = s };
        }
        else
        {
            // ノーマル
            if (ReachLine == 1)
            {

            }
            else if (ReachLine == 2)
            {
                r2 = CyclicReel2normal.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString()))
                                .Skip(19)
                                .First();
            }
            else if (ReachLine == 3)
            {
                r2 = CyclicReel2normal.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString()))
                                .Skip(18)
                                .First();
            }
            else if (ReachLine == 4)
            {
                // 1/2 の確率で抽選
                var rnd = UnityEngine.Random.Range(0, 2);

                var Zugara = Tokuzu.ToString();
                if (rnd == 1)
                {
                    Zugara = CyclicReelUnder.SkipWhile(e => !e.Equals(Tokuzu.ToString()))
                             .Skip(18)
                             .First();
                    AtariZugara = int.Parse(Zugara);    // 出力
                }

                r2 = CyclicReel2normal.SkipWhile(elem => !elem.Tokuzu.Equals(Zugara))
                                .Skip(19)
                                .First();
            }
        }

        var reels = new ReelElement[] { r1, r2, r3 };

        return reels;
    }