/// <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; }
/// <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; }