Example #1
0
 private void ctrlRun(CallbackToController callbacks)
 {
     if (mo.process(keyTrigger, callbacks))
     {
         mOmatsuri.getExitReason();
     }
     mo.restartSlot();
     ZZ.dbgDrawAll();
 }
    public bool process(int keyTrigger, CallbackToController callbacks, int[] reelIndexies)
    {
        int_s_value[Defines.DEF_INT_REEL_SPEED] =
            ZZ.getThreadSpeed()
            * Defines.DEF_REEL_COUNT_MIN
            * 0x10000
            / 60000
            * mobile.getReelSpeed() / 100;

        if (mobile.isMeoshi() ||
            (slotInterface.gpif_auto_f == true) ||
            (slotInterface.gpif_nonstop_f == true) ||
            (slotInterface.gpif_tatsujin_f == true))
        {
            // オートプレイ
            if ((slotInterface.gpif_auto_f == true) ||
                (slotInterface.gpif_nonstop_f == true) ||
                (slotInterface.gpif_tatsujin_f == true))
            {
                // オートプレイの予約
                //DfMain.TRACE(("test:" + mobile.int_m_value[Defines.DEF_INT_IS_MENU_AVAILABLE]);
                // スロットゲーム中WAIT時以外は遷移しない
                if (mobile.int_m_value[Defines.DEF_INT_IS_MENU_AVAILABLE] == Defines.DEF_MENU_UNAVAILABLE)
                {
                    // メニューが無効の時
                    //DfMain.TRACE(("ここきてる?:" + keyTrigger);
                    if ((keyTrigger & Defines.DEF_KEY_BIT_SOFT1) != 0)
                    {
                        // ソフトキーがおされたら
                        //DfMain.TRACE(("メニュー予約!!!");
                        req_code = 1;
                        reqMenuFg = true;
                    }
                    if ((keyTrigger & Defines.DEF_KEY_BIT_SOFT2) != 0)
                    {
                        // ソフトキーがおされたら
                        //DfMain.TRACE(("メニュー予約!!!");
                        req_code = 2;
                        reqMenuFg = true;
                    }
                }
            }
            keyTrigger = Defines.DEF_KEY_BIT_SELECT;
        }

        if (reqMenuFg == true)
        {
            // 自動メニュー画面描画
            if (mobile.int_m_value[Defines.DEF_INT_IS_MENU_AVAILABLE] == Defines.DEF_MENU_AVAILABLE)
            {
                // メニューが無効の時
                reqMenuFg = false;
            }
        }

        if (slotInterface.getBusy())
        {
            // GP用のウインドウが出ているので、筐体キーを無効化する
            keyTrigger = 0;
            return false;
        }

        // コイン枚数の更新
        int_s_value[Defines.DEF_INT_SLOT_COIN_NUM] = slotInterface.gpif_coin;
        pressingSpan++;
        pressingSpan %= 10;
        if (!IS_BONUS() && pressingSpan == 0)
        {
        }

        // ループの中で int_s_value が副作用を発生させる
        while (int_s_value[Defines.DEF_INT_CURRENT_MODE] != int_s_value[Defines.DEF_INT_REQUEST_MODE])
        {
            if (Defines.DEF_IS_DEBUG_PRINT_RMODE)
            {
                Defines.TRACE("RMODE: " + int_s_value[Defines.DEF_INT_CURRENT_MODE]
                        + " → " + int_s_value[Defines.DEF_INT_REQUEST_MODE]);
            }

            int_s_value[Defines.DEF_INT_CURRENT_MODE] = int_s_value[Defines.DEF_INT_REQUEST_MODE];

            // スロットゲームモード変更時に更新するフラグ
            int_s_value[Defines.DEF_INT_MODE_COUNTER] = 0;
            int_s_value[Defines.DEF_INT_ON_OFF_EFFECT] = 0;
            int_s_value[Defines.DEF_INT_RLPTNDT_COUNTER] = 0;
            int_s_value[Defines.DEF_INT_TOP_LAMP] = 0;

            // 各モードでの初期化
            switch (int_s_value[Defines.DEF_INT_CURRENT_MODE])
            {
                case Defines.DEF_RMODE_WIN:
                    if (int_s_value[Defines.DEF_INT_WIN_LAMP] > 0
                            && int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] == 0)
                    {
                        // た~まや~点灯
                        int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] = 1;
                        // ボーナス当選時
                        slotInterface.onBonusNaibu();
                        // セルフオート停止フラグを立てる
                        GameManager.StopAutoPlay("たまや点灯");
                    }

                    // さらに大当たりで止まっていたらかっきーん!
                    if (int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] == 1)
                    {
                        if (int_s_value[Defines.DEF_INT_4TH_REEL_ANGLE] == Defines.DEF_RP08)
                        {
                            playSE(Defines.DEF_SOUND_12);
                            _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_12;
                            int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] = 2;
                            // 以後演出抽選しないようにする
                            v23.setWork(Defines.DEF_FOUT3, (ushort)1);
                        }
                    }
                    break;
                // TOBE [=0.RMODE_WAIT init]137
                case Defines.DEF_RMODE_WAIT: // (モード初期)

                    if (IS_HALL())
                    {
                        mobile.saveMenuData(true);//不正防止用にここで保存
                    }
                    mobile.setMenuAvarable(true);// 押せるようにする

                    if (!IS_BONUS())
                    {
                        lampSwitch(Defines.DEF_LAMP_4TH, Defines.DEF_LAMP_ACTION_OFF);
                    }
                    // コイン7セグ描画用変数を初期化
                    int_s_value[Defines.DEF_INT_BETTED_COUNT] = 0;
                    //Defines.TRACE("待機中");

                    // 演出帳のデータを転送する
                    GPW_eventProcess((int)Defines.EVENT_PROC.EVENT_PROC_WEB, -1);
                    break;

                case Defines.DEF_RMODE_BET: // MAXBETランプ表示期間(モード初期)
                    //DfMain.TRACE(("ベット処理1");
                    // リール全点滅は一回だけ
                    if (int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] == 2)
                    {
                        int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] = 3;
                    }

                    // 払い出しコイン枚数(表示用)
                    int_s_value[Defines.DEF_INT_WIN_GET_COIN] = 0;
                    int_s_value[Defines.DEF_INT_WIN_COIN_NUM] = 0; // 1ゲーム中の獲得コイン枚数
                    // テンパイ状態
                    int_s_value[Defines.DEF_INT_IS_TEMPAI] = 0;

                    // 告知はBET時にクリア
                    if (!IS_REPLAY())
                    {
                        int_s_value[Defines.DEF_INT_KOKUCHI_X] = 0;
                    }

                    // サウンド
                    if (!IS_BONUS())
                    {
                        // ボーナス消化中以外は毎回停止指示。
                        mobile.stopSound(Defines.DEF_SOUND_UNDEF);
                    }
                    {
                        if (IS_HALL())
                        {
                            /*プレーヤーコイン要求*/
                            if (hallData[Defines.DEF_H_PLAYER_COIN] < int_s_value[Defines.DEF_INT_BET_COUNT])
                            {
                                //鳴らさない
                                //DfMain.TRACE(("ベット音ならさない");
                                break;
                            }
                        }
                        //DfMain.TRACE(("ベット音ならす");
                        switch (int_s_value[Defines.DEF_INT_BET_COUNT])
                        {
                            case 1:
                                playSE(Defines.DEF_SOUND_25);
                                _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_25;
                                break;
                            case 2:
                                playSE(Defines.DEF_SOUND_26);
                                _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_26;
                                break;
                            case 3:
                                playSE(Defines.DEF_SOUND_22);
                                _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_22;
                                break;
                        }
                    }

                    mobile.setMenuAvarable(false);
                    break;

                case Defines.DEF_RMODE_SPIN:
                    if (!IS_REPLAY())
                    {
                        int_s_value[Defines.DEF_INT_TOTAL_BET] += int_s_value[Defines.DEF_INT_BETTED_COUNT];
                        hallData[Defines.DEF_H_MEDAL_IN] += int_s_value[Defines.DEF_INT_BETTED_COUNT];
                        hallData[Defines.DEF_H_PLAYER_COIN] -= int_s_value[Defines.DEF_INT_BETTED_COUNT];
                    }

                    v23.clearWork(Defines.DEF_CLR_AREA_3);
                    int rand = v23.mRandomX();
                    chgWaveNum();

                    if (IS_BONUS_JAC())
                    {
                        v23.mSetForceFlag(Defines.ForceYakuFlag.REG);
                    }

                    chgYaku();

                    // 役抽選
                    v23.mReelStart(rand, int_s_value[Defines.DEF_INT_BET_COUNT]);
                    var yaku = v23.getWork(Defines.DEF_WAVEBIT);

                    // 内部BB 内部RBははずれ強制
                    // はずれ強制だが、BIG/777は揃えられる→リプレイ・チェリーを来ないようにする
                    // BB中、RB中ははずれ強制は解除する→
                    if ((v23.getWork(Defines.DEF_HITREQ) == Defines.DEF_HITFLAG_NR_BB) ||
                        (v23.getWork(Defines.DEF_HITREQ) == Defines.DEF_HITFLAG_NR_RB))
                    {

                        //v23.mSetForceFlag(Defines.ForceYakuFlag.BIG);
                        v23.mSetForceFlag(Defines.ForceYakuFlag.HAZURE);
                    }

                    callbacks.ReelStart(yaku);

                    if (!IS_BONUS())
                    {
                        if ((v23.getWork(Defines.DEF_WAVEBIT) & 0x01) != 0)
                        {
                            int_s_value[Defines.DEF_INT_CHRY_HIT]++;
                        }
                        else if ((v23.getWork(Defines.DEF_WAVEBIT) & 0x04) != 0)
                        {
                            int_s_value[Defines.DEF_INT_WMLN_HIT]++;
                        }
                    }
                    else if (IS_BONUS_GAME())
                    {
                        // ビタ外し成功
                        if ((v23.getWork(Defines.DEF_WAVEBIT) & 0x08) != 0)
                        {
                            int_s_value[Defines.DEF_INT_JAC_HIT]++;
                        }
                    }

                    if ((v23.getWork(Defines.DEF_GMLVSTS) & (0x08 | 0x10)) != 0)
                    {
                        int_s_value[Defines.DEF_INT_THIS_FLAG_GAME]++;
                    }

                    int flash0 = v23.getWork(Defines.DEF_FLASH + 0);
                    GPW_eventProcess((int)Defines.EVENT_PROC.EVENT_PROC_CHK_LANP, (flash0 / 128));
                    int_s_value[Defines.DEF_INT_WIN_LAMP] = flash0 / 128;
                    flash0 %= 128;
                    int flash1 = v23.getWork(Defines.DEF_FLASH + 1);
                    GPW_eventProcess((int)Defines.EVENT_PROC.EVENT_PROC_CHK_FLASH, flash1);
                    setFlash(flash1 / 32);
                    set4th(flash1 % 32);
                    int snd_id = Defines.DEF_SOUND_19;
                    if (flash1 % 32 > 0)
                    {
                        snd_id = Defines.DEF_SOUND_21;
                    }
                    if (flash0 / 64 > 0)
                    {
                        snd_id = Defines.DEF_SOUND_20;
                    }

                    if (mobile.isJacCut() == false)
                    {
                        playSE(snd_id);
                    }

                    _spinTime = Util.GetMilliSeconds() + Defines.DEF_WAIT_SPIN;
                    int_s_value[Defines.DEF_INT_IS_REEL_STOPPED] = 0; // リールストップ
                    int_s_value[Defines.DEF_INT_KOKUCHI_X] = 0;

                    if (int_s_value[Defines.DEF_INT_IS_BB_RB_END] > 0)
                    {
                        if (!IS_HALL())
                        {
                            if (int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_B7
                                    || int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_R7)
                            {
                                shiftDataPanelHistory(
                                        int_s_value[Defines.DEF_INT_UNTIL_BONUS_GAMES],
                                        Defines.DEF_PS_BB_RUN);
                            }
                            else if (int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_RB_IN)
                            {
                                shiftDataPanelHistory(
                                        int_s_value[Defines.DEF_INT_UNTIL_BONUS_GAMES],
                                        Defines.DEF_PS_RB_RUN);
                            }
                        }

                        int_s_value[Defines.DEF_INT_IS_BB_RB_END] = 0;
                        int_s_value[Defines.DEF_INT_BB_KIND] = Defines.DEF_BB_UNDEF;
                        int_s_value[Defines.DEF_INT_BONUS_GOT] = 0;
                        int_s_value[Defines.DEF_INT_BONUS_JAC_GOT] = 0;
                        int_s_value[Defines.DEF_INT_UNTIL_BONUS_GAMES] = 0;
                        hallData[Defines.DEF_H_BNS_0] = 0;
                        int_s_value[Defines.DEF_INT_BB_AFTER_1GAME] = 1;
                    }

                    if (!IS_BONUS())
                    {
                        int_s_value[Defines.DEF_INT_TOTAL_GAMES]++;
                        slotInterface.onCountUp();
                        hallData[Defines.DEF_H_GAME_COUNT]++;
                        int_s_value[Defines.DEF_INT_UNTIL_BONUS_GAMES]++;
                        hallData[Defines.DEF_H_BNS_0]++;
                    }

                    if (IS_HALL())
                    {
                        setCurrentDataPanel(hallData[Defines.DEF_H_BNS_0]);
                    }
                    else
                    {
                        setCurrentDataPanel(int_s_value[Defines.DEF_INT_UNTIL_BONUS_GAMES]);
                    }

                    int_s_value[Defines.DEF_INT_KEY_REJECT] = 5;
                    int_s_value[Defines.DEF_INT_REEL_STOP_R0] = ANGLE_UNDEF;
                    int_s_value[Defines.DEF_INT_REEL_STOP_R1] = ANGLE_UNDEF;
                    int_s_value[Defines.DEF_INT_REEL_STOP_R2] = ANGLE_UNDEF;
                    int_s_value[Defines.DEF_INT_REEL_ANGLE_R0] -= int_s_value[Defines.DEF_INT_REEL_SPEED] * 2 / 4;
                    int_s_value[Defines.DEF_INT_REEL_ANGLE_R1] -= int_s_value[Defines.DEF_INT_REEL_SPEED] * 2 / 4;
                    int_s_value[Defines.DEF_INT_REEL_ANGLE_R2] -= int_s_value[Defines.DEF_INT_REEL_SPEED] * 2 / 4;

                    GameManager.OnStartPlay();

                    break;

                case Defines.DEF_RMODE_FLASH:
                    break;

                case Defines.DEF_RMODE_RESULT:
                    // (モード初期)
                    // RESULTに入った時間を記録
                    _lampTime = Util.GetMilliSeconds() + Defines.DEF_WAIT_LAMP;

                    // 払い出しコイン枚数
                    var payOut = v23.mPayMedal();
                    int_s_value[Defines.DEF_INT_WIN_COIN_NUM] = payOut;
                    int_s_value[Defines.DEF_INT_TOTAL_PAY] += payOut;
                    hallData[Defines.DEF_H_MEDAL_OUT] += payOut;

                    callbacks.Payout(payOut);

                    int_s_value[Defines.DEF_INT_TOTAL_PAY] += int_s_value[Defines.DEF_INT_WIN_COIN_NUM];
                    hallData[Defines.DEF_H_MEDAL_OUT] += int_s_value[Defines.DEF_INT_WIN_COIN_NUM];

                    if ((v23.getWork(Defines.DEF_HITFLAG) & Defines.DEF_HITFLAG_NR_RB) != 0)
                    {
                        Defines.TRACE("RB入賞時");
                    }
                    else if ((v23.getWork(Defines.DEF_HITFLAG) & Defines.DEF_HITFLAG_NR_BB) != 0)
                    {
                        Defines.TRACE("BB入賞時");
                    }

                    if (!IS_BONUS())
                    {
                        if ((v23.getWork(Defines.DEF_HITFLAG) & 0x01) != 0)
                        {
                            int_s_value[Defines.DEF_INT_CHRY_GOT]++;
                        }
                        else if ((v23.getWork(Defines.DEF_HITFLAG) & 0x04) != 0)
                        {
                            int_s_value[Defines.DEF_INT_WMLN_GOT]++;
                        }
                    }
                    else if (IS_BONUS_GAME())
                    {
                        // ビタ外し成功
                        if (v23.getWork(Defines.DEF_HITFLAG) == 0
                                && ((v23.getWork(Defines.DEF_WAVEBIT) & 0x08) != 0)
                                && (v23.getWork(Defines.DEF_ARAY11) == Defines.DEF_BAR_))
                        {
                            int_s_value[Defines.DEF_INT_HAZUSI_COUNT]++;
                        }
                    }

                    int_s_value[Defines.DEF_INT_BONUS_GOT] += int_s_value[Defines.DEF_INT_WIN_COIN_NUM];

                    if ((IS_BONUS_JAC() == true))
                    {
                        int_s_value[Defines.DEF_INT_BONUS_JAC_GOT] += int_s_value[Defines.DEF_INT_WIN_COIN_NUM];
                    }

                    playCoinSound();
                    break;

                case Defines.DEF_RMODE_BB_FANFARE:
                    int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] = 0;
                    int_s_value[Defines.DEF_INT_4TH_ACTION_FLAG] = 0;
                    lampSwitch(Defines.DEF_LAMP_4TH, Defines.DEF_LAMP_ACTION_ON);

                    if (int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_R7)
                    {
                        _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_03; // ファンファーレ完奏時間設定
                        playBGM(Defines.DEF_SOUND_03, false); // BBファンファーレ1(ドンチャン揃い)
                    }
                    else if (int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_B7)
                    {
                        _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_02; // ファンファーレ完奏時間設定
                        playBGM(Defines.DEF_SOUND_02, false); // BBファンファーレ2(7揃い)
                    }
                    set4th(29);
                    break;
                // TOBE [=6.RMODE_BB_FANFARE init]
                case Defines.DEF_RMODE_RB_FANFARE: // (モード初期)
                    int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] = 0;
                    int_s_value[Defines.DEF_INT_4TH_ACTION_FLAG] = 0;
                    lampSwitch(Defines.DEF_LAMP_4TH, Defines.DEF_LAMP_ACTION_ON);
                    // RBファンファーレ鳴らすモード(→Defines.DEF_RMODE_BB_FANFARE_VOICE)
                    _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_04; // ファンファーレ完奏時間設定
                    playBGM(Defines.DEF_SOUND_04, false);
                    set4th(29);
                    break;
                // TOBE [=5.RMODE_FIN_WAIT init]
                case Defines.DEF_RMODE_FIN_WAIT: // (モード初期)
                    int_s_value[Defines.DEF_INT_KEY_REJECT] = 0;
                    // 毎ゲーム終了時にここを通る
                    // DfMain.TRACE(("毎ゲーム終了");
                    // ボーナス制御
                    ushort bonusEndFg;
                    bonusEndFg = v23.mBonusCounter();

                    if (IS_BONUS() == true)
                    {
                        // ボーナス終了フラグじゃないとき
                        if (cutBonusSystem(0))
                        {
                            // ボーナスカット処理が必要の場合
                            // カット処理フラグON
                            BonusCutFg = true;

                            if ((int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_B7)
                                || (int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_R7))
                            {
                                // BB終了判定(RBの場合はRB終了時にメダル加算を行なう)
                                if ((IS_BONUS_JAC() == true))
                                {
                                    int num;
                                    num = 0;
                                    // JACゲームの獲得枚数
                                    if (int_s_value[Defines.DEF_INT_BONUS_JAC_GOT] < Defines.JAC_BONUS_AVENUM)
                                    {	// JACゲームのカット枚数を加算する
                                        num = (Defines.JAC_BONUS_AVENUM - int_s_value[Defines.DEF_INT_BONUS_JAC_GOT]);
                                        int_s_value[Defines.DEF_INT_BONUS_JAC_GOT] = 0;	// JAC中の獲得枚数をクリア
                                        int_s_value[Defines.DEF_INT_BONUS_GOT] += num;
                                    }
                                    Defines.TRACE("JACカット分を追加:" + num);
                                    GPW_chgCredit(num);

                                    BonusCutFg = false;	// JACのカットはここまでなので
                                }
                            }

                            bonusEndFg = v23.mBonusCounter();
                        }
                    }

                    if (bonusEndFg != 0)
                    {
                        BonusEnd(0);
                    }
                    break; // 抜ける
                // TOBE [=RMODE_NO_COIN init}
                case Defines.DEF_RMODE_NO_COIN: // (モード初期)
                    return true; // コインなしで終了通知
            } // E-O-各モードでの初期化
            break;
        } // end of while

        if (int_s_value[Defines.DEF_INT_PREV_GAMEST] != v23.getWork(Defines.DEF_GAMEST))
        {
            int_s_value[Defines.DEF_INT_PREV_GAMEST] = v23.getWork(Defines.DEF_GAMEST);
            if ((int_s_value[Defines.DEF_INT_PREV_GAMEST] & 0x01) != 0)
            {
                // TODO JACBGMを鳴らす
                playBGM(Defines.DEF_SOUND_05, true);
            }
            else if ((int_s_value[Defines.DEF_INT_PREV_GAMEST] & 0x80) != 0)
            {
                // TODO BIGBGMを鳴らす
                if (int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_R7)
                {
                    playBGM(Defines.DEF_SOUND_07, true);
                }
                else if (int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_B7)
                {
                    playBGM(Defines.DEF_SOUND_06, true);
                }
            }
        }

        // モードが切り替わってからの累積カウンタ
        int_s_value[Defines.DEF_INT_MODE_COUNTER]++;

        ctrlTopLamp();

        int_s_value[Defines.DEF_INT_ON_OFF_EFFECT] = Util.GetMilliSeconds() % 1000 > 500 ? 1 : 0;

        ctrlLamp();
        ctrlBetLamp();

        DoModeAction(keyTrigger, callbacks, reelIndexies);
        return false;
    }
    private void DoModeAction(int keyTrigger, CallbackToController callbacks, int[] reelIndexies)
    {
        // ======================================
        // 各モードにおける毎回の処理
        // ======================================
        //DfMain.TRACE(("リプレイある(毎回)?" + IS_REPLAY());
        //DfMain.TRACE(("Defines.DEF_INT_CURRENT_MODE:" + int_s_value[Defines.DEF_INT_CURRENT_MODE] + ":" + (clOHHB_V23.getWork(Defines.DEF_GAMEST)&0xFFFF));
        switch (int_s_value[Defines.DEF_INT_CURRENT_MODE])
        {
            // TOBE [=0.RMODE_WAIT rp]
            case Defines.DEF_RMODE_WAIT: // (毎回処理)
                // 直前の停止音の完奏を待つ
                if (_soundTime < Util.GetMilliSeconds())
                {
                    // リプレイが揃っているときは、自動的にRMODE_BETまで遷移する
                    if (bgm_resumeFg == true)
                    {	// 休憩中からの復帰
                        if (bgm_no != -1)
                        {
                            // サウンド
                            //if (!IS_BONUS()) {
                            //	// ボーナス消化中以外は毎回停止指示。
                            //	mobile.stopSound(Defines.DEF_SOUND_UNDEF);
                            //}
                            if (IS_BONUS())
                            {	// ボーナス時限定
                                Defines.TRACE("復帰サウンドの再生");
                                playBGM(bgm_no, bgm_loop); // 復帰サウンドの再生
                                bgm_resumeFg = false;
                            }
                            else
                            {
                                // ボーナス消化中以外は毎回停止指示。
                                mobile.stopSound(Defines.DEF_SOUND_UNDEF);
                            }
                        }
                    }

                    slotInterface.betFlag = false;
                    if (IS_REPLAY())
                    {
                        slotInterface.betFlag = true;
                        REQ_MODE(Defines.DEF_RMODE_BET); // MAXBETへ遷移
                    }
                    else
                    {
                        // BET開始
                        if ((keyTrigger & (Defines.DEF_KEY_BIT_SELECT | Defines.DEF_KEY_BIT_5)) != 0)
                        {
                            if (IS_BONUS_JAC())
                            {
                                int_s_value[Defines.DEF_INT_BET_COUNT] = 1;
                            }
                            else
                            {
                                int_s_value[Defines.DEF_INT_BET_COUNT] = 3;
                            }

                            //DfMain.TRACE(("枚数チェック:" + int_s_value[Defines.DEF_INT_SLOT_COIN_NUM]+ ":" + int_s_value[Defines.DEF_INT_BETTED_COUNT] + ":" + int_s_value[Defines.DEF_INT_BET_COUNT]);
                            if (int_s_value[Defines.DEF_INT_SLOT_COIN_NUM] < int_s_value[Defines.DEF_INT_BET_COUNT])
                            {	// コインがないからBETさせない
                                slotInterface.onCreditZero();
                            }
                            else
                            {
                                REQ_MODE(Defines.DEF_RMODE_BET);
                                slotInterface.betFlag = true;
                            }
                        }
                    }
                }
                break;
            // TOBE [=1.RMODE_BET rp]
            case Defines.DEF_RMODE_BET: // MAXBETランプ表示期間(毎回処理)
                #region DEF_RMODE_BET
                //DfMain.TRACE(("ベット処理2");
                int betMax = Math.Min(3, int_s_value[Defines.DEF_INT_CREDIT_COIN_NUM]
                        + int_s_value[Defines.DEF_INT_SLOT_COIN_NUM]
                        + int_s_value[Defines.DEF_INT_BETTED_COUNT]);
                // サウンドの終わりを待つ
                // 描画を増やす
                if (int_s_value[Defines.DEF_INT_BETTED_COUNT] < int_s_value[Defines.DEF_INT_BET_COUNT])
                {
                    // ココのタイミングの取り方は40msでループするのが前提
                    if (int_s_value[Defines.DEF_INT_MODE_COUNTER] % 2 == 0)
                    {
                        if (!IS_REPLAY())
                        {
                            // クレジットから減らす
                            if (int_s_value[Defines.DEF_INT_CREDIT_COIN_NUM] > 0)
                            {
                                int_s_value[Defines.DEF_INT_CREDIT_COIN_NUM]--;
                            }
                            int_s_value[Defines.DEF_INT_SLOT_COIN_NUM]--;

                            // BETした分だけ減算する
                            GPW_chgCredit(-1);

                            // コイン投入時処理
                            GameManager.OnCoinInsert();

                            callbacks.Bet();
                        }
                        int_s_value[Defines.DEF_INT_BONUS_GOT]--;
                        int_s_value[Defines.DEF_INT_BETTED_COUNT]++;

                        //GPW_chgCredit(0 - int_s_value[Defines.DEF_INT_BETTED_COUNT]);
                    }
                }
                // 減らす
                else if (int_s_value[Defines.DEF_INT_BETTED_COUNT] > int_s_value[Defines.DEF_INT_BET_COUNT])
                {
                    // ココのタイミングの取り方は40msでループするのが前提
                    if (int_s_value[Defines.DEF_INT_MODE_COUNTER] % 2 == 0)
                    {
                        if (!IS_REPLAY())
                        {
                            if (int_s_value[Defines.DEF_INT_CREDIT_COIN_NUM] < Defines.DEF_NUM_MAX_CREDIT)
                            {
                                int_s_value[Defines.DEF_INT_CREDIT_COIN_NUM]++;
                            }
                            int_s_value[Defines.DEF_INT_SLOT_COIN_NUM]++;
                        }
                        int_s_value[Defines.DEF_INT_BONUS_GOT]++;
                        int_s_value[Defines.DEF_INT_BETTED_COUNT]--;
                    }
                }
                else
                {
                    if (_soundTime < Util.GetMilliSeconds())
                    {
                        // 回転開始
                        //DfMain.TRACE(("回転開始チェック:" + int_s_value[Defines.DEF_INT_BETTED_COUNT]);
                        if ((int_s_value[Defines.DEF_INT_BETTED_COUNT] > 0)
                            && (((keyTrigger & (Defines.DEF_KEY_BIT_SELECT | Defines.DEF_KEY_BIT_5)) != 0)
                            || (reelStartFg == true)))
                        {
                            //DfMain.TRACE(("回転開始ウェイト");
                            reelStartFg = true;
                            lampSwitch(Defines.DEF_LAMP_LEVER, Defines.DEF_LAMP_ACTION_ON);
                            if (mobile.isJacCut() == true)
                            {	// ボーナスカットの場合
                                reelwait = -3200;
                            }
                            if ((reelwait + 3200) < Util.GetMilliSeconds())
                            {	// リールウェイト
                                //DfMain.TRACE(("回転開始");
                                REQ_MODE(Defines.DEF_RMODE_SPIN);
                                //DfMain.TRACE(("リールウェイト:" + (Util.GetMilliSeconds() - reelwait));
                                reelwait = Util.GetMilliSeconds();//リール全体用
                                reelStartFg = false;
                            }

                        }
                    }
                }
                break;
            #endregion
            // TOBE [=2.RMODE_SPIN rp]
            case Defines.DEF_RMODE_SPIN: // 回転中(毎回処理)
                // 4thをまわす。
                action4th();
                // 全部止まったらモード変わる
                if (int_s_value[Defines.DEF_INT_IS_REEL_STOPPED] == 7)
                {
                    // 停止音 完奏を待って次のモードへ遷移
                    if (_soundTime < Util.GetMilliSeconds())
                    {
                        // 4thが止まったら
                        if (int_s_value[Defines.DEF_INT_4TH_ACTION_FLAG] == 0)
                        {
                            if (isPlay())
                            {
                                REQ_MODE(Defines.DEF_RMODE_FLASH);
                            }
                            else
                            {
                                REQ_MODE(Defines.DEF_RMODE_WIN);
                            }
                        }
                    }
                    break;
                }

                // 前に鳴らしたサウンド待ち
                if (_soundTime < Util.GetMilliSeconds() ||
                     int_s_value[Defines.DEF_INT_IS_REEL_STOPPED] != 0)
                {
                    if (int_s_value[Defines.DEF_INT_KEY_REJECT] > 0)
                    {
                        // 一定ターン待つ
                        int_s_value[Defines.DEF_INT_KEY_REJECT]--;
                    }
                    else
                    {
                        // 同時押しは出来ない ワンボタン(KEY_5)操作あり
                        bool isSpinning = true;
                        bool isLimitStop = false; // 自動停止の場合用
                        //DfMain.TRACE(("ここから開始");

                        if (_spinTime < Util.GetMilliSeconds())
                        {
                            Defines.TRACE(Util.GetMilliSeconds() - _spinTime);
                            isLimitStop = true;
                        }

                        // 自動停止もあり
                        if ((keyTrigger & (Defines.DEF_KEY_BIT_SELECT | Defines.DEF_KEY_BIT_5)) != 0
                            || (isLimitStop == true))
                        {
                            var orderDown = new[] { 0, 1, 2 };
                            var orderUp = new[] { 2, 1, 0 };

                            // JACIN時はorderUpを使う
                            var yaku = (Yaku)v23.getWork(Defines.DEF_WAVEBIT);
                            var useOrder = yaku == Yaku.JACIN ? orderUp : orderDown;
                            var mt = MeoshiType.HazureKotei;

                            foreach (var i in useOrder)
                            {
                                if (isSpinning)
                                {
                                    isSpinning = setReelStopAngle(i, yaku, mt);
                                }
                            }
                        }
                        else
                        {
                            var orderDown = new[] { 0, 1, 2 };
                            var orderUp = new[] { 2, 1, 0 };

                            // JACIN時はorderUpを使う
                            var yaku = (Yaku)v23.getWork(Defines.DEF_WAVEBIT);
                            var useOrder = yaku == Yaku.JACIN ? orderUp : orderDown;
                            var mt = MeoshiType.HazureKotei;

                            foreach (var i in useOrder)
                            {
                                if (isSpinning)
                                {
                                    isSpinning = setReelStopAngle(i, yaku, mt);
                                }
                            }
                        }
                    }
                }

                // 停止ボタンを点灯
                ctrlButtonLamp();

                // リールを進める。
                for (int i = 0; i < 3; i++)
                {
                    // 止まっていたら次
                    if ((int_s_value[Defines.DEF_INT_IS_REEL_STOPPED] & BIT(i)) != 0)
                        continue;

                    if (int_s_value[Defines.DEF_INT_REEL_STOP_R0 + i] != ANGLE_UNDEF
                            && (((int_s_value[Defines.DEF_INT_REEL_STOP_R0 + i] - int_s_value[Defines.DEF_INT_REEL_ANGLE_R0 + i])
                                & ANGLE_2PI_MASK) <= int_s_value[Defines.DEF_INT_REEL_SPEED] ||
                                (mobile.isJacCut() == true)))
                    {
                        // 止めにかかる
                        int_s_value[Defines.DEF_INT_REEL_ANGLE_R0 + i] = int_s_value[Defines.DEF_INT_REEL_STOP_R0 + i];
                        // 止まった
                        int_s_value[Defines.DEF_INT_IS_REEL_STOPPED] |= BIT(i);

                        int_s_value[Defines.DEF_INT_KEY_REJECT] = 1;
                        // 次のボタンが押せるようにする
                        int stop_snd_id = Defines.DEF_SOUND_23;

                        _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_23 / 2;
                        if (!IS_BONUS())
                        {
                            int_s_value[Defines.DEF_INT_IS_TEMPAI] = 0;
                            int[] tempai = isTempai();
                            switch (v23.getWork(Defines.DEF_PUSHCTR))
                            {
                                case 0x02:// 第1停止
                                    if (i == 0)
                                    {	// 停止リールが左リールの時
                                        GPW_eventProcess((int)Defines.EVENT_PROC.EVENT_PROC_CHK_REEL, (int)Defines.EVENT.EVENT_NO1);
                                    }
                                    break;
                                case 0x01:// 第2停止
                                    if (tempai[1] == 3)
                                    {
                                        //トリプルテンパイ音
                                        // (トリプルテンパイ(BIG確))
                                        GPW_eventProcess((int)Defines.EVENT_PROC.EVENT_PROC_CHK_REEL, (int)Defines.EVENT.EVENT_NO2);
                                        stop_snd_id = Defines.DEF_SOUND_15;
                                        _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_15;
                                        int_s_value[Defines.DEF_INT_IS_TEMPAI] = 1;
                                    }
                                    else if (tempai[0] != Defines.DEF_BB_UNDEF)
                                    {
                                        stop_snd_id = Defines.DEF_SOUND_14;
                                        _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_14;
                                        int_s_value[Defines.DEF_INT_IS_TEMPAI] = 1;
                                    }
                                    break;
                                case 0x00:// 第三停止
                                    if (tempai[0] == Defines.DEF_BB_B7)
                                    {
                                        int_s_value[Defines.DEF_INT_BB_KIND] = Defines.DEF_BB_B7;
                                        //TOBE 個別PARAM BB揃ったかの判定
                                        if (int_s_value[Defines.DEF_INT_BB_AFTER_1GAME] > 0)
                                        {
                                            int_s_value[Defines.DEF_INT_BB_END_1GAME_REGET_BB] = 1; // 揃えた
                                            if (Defines.DEF_IS_DEBUG_MISSION_PARAM) { Defines.TRACE("1ゲーム目で青七をそろえた"); }
                                        }
                                        slotInterface.onBonusBB();
                                    }
                                    else if (tempai[0] == Defines.DEF_BB_R7)
                                    {
                                        int_s_value[Defines.DEF_INT_BB_KIND] = Defines.DEF_BB_R7;

                                        //TOBE 個別PARAM BB揃ったかの判定
                                        if (int_s_value[Defines.DEF_INT_BB_AFTER_1GAME] > 0)
                                        {
                                            int_s_value[Defines.DEF_INT_BB_END_1GAME_REGET_BB] = 1; // 揃えた
                                            if (Defines.DEF_IS_DEBUG_MISSION_PARAM) { Defines.TRACE("1ゲーム目で赤ドンをそろえた"); }
                                        }
                                        slotInterface.onBonusBB();
                                    }

                                    // ゲチェナ
                                    GPW_eventProcess((int)Defines.EVENT_PROC.EVENT_PROC_CHK_REEL, (int)Defines.EVENT.EVENT_NO3);
                                    int_s_value[Defines.DEF_INT_BB_AFTER_1GAME] = 0;// TOBE 個別PARAM用フラグで使うフラグを必ず下ろす
                                    break;
                            }
                        }

                        if ((mobile.isJacCut() == false))
                        {
                            playSE(stop_snd_id);
                        }

                    }
                    else
                    {
                        int_s_value[Defines.DEF_INT_REEL_ANGLE_R0 + i] =
                            (int_s_value[Defines.DEF_INT_REEL_ANGLE_R0 + i] + int_s_value[Defines.DEF_INT_REEL_SPEED]) & ANGLE_2PI_MASK;
                    }
                }

                break;
            // TOBE [=3.RMODE_FLASH rp]
            case Defines.DEF_RMODE_FLASH: // 結果(毎回処理)
                //スピード調整
                if (ZZ.getThreadSpeed() < 40
                        && int_s_value[Defines.DEF_INT_MODE_COUNTER] % 2 == 0)
                {
                    break;
                }
                if (isPlay())
                {
                    int_s_value[Defines.DEF_INT_FLASH_DATA] = getNext();
                    // リールフラッシュ以外の部分
                    if ((int_s_value[Defines.DEF_INT_FLASH_DATA] & (1 << 10)) != 0)
                    {
                        lampSwitch(Defines.DEF_LAMP_4TH, Defines.DEF_LAMP_ACTION_ON);
                    }
                    else
                    {
                        lampSwitch(Defines.DEF_LAMP_4TH, Defines.DEF_LAMP_ACTION_OFF);
                    }
                }
                else
                {
                    REQ_MODE(Defines.DEF_RMODE_WIN);
                }
                break;
            case Defines.DEF_RMODE_WIN:
                if (_soundTime < Util.GetMilliSeconds())
                {
                    REQ_MODE(Defines.DEF_RMODE_RESULT);
                }
                break;
            // TOBE [=4.RMODE_RESULT rp]
            case Defines.DEF_RMODE_RESULT: // 結果(毎回処理)
                if ((mobile.isJacCut() == true))
                {
                    // 内部でカウント
                    int_s_value[Defines.DEF_INT_CREDIT_COIN_NUM] += int_s_value[Defines.DEF_INT_WIN_COIN_NUM];
                    int_s_value[Defines.DEF_INT_SLOT_COIN_NUM] += int_s_value[Defines.DEF_INT_WIN_COIN_NUM];
                    // 表示用は個々で増やす
                    int_s_value[Defines.DEF_INT_WIN_GET_COIN] += int_s_value[Defines.DEF_INT_WIN_COIN_NUM];
                    hallData[Defines.DEF_H_PLAYER_COIN] += int_s_value[Defines.DEF_INT_WIN_COIN_NUM];

                    // 50枚まではクレジットへ貯めるぅ
                    if (int_s_value[Defines.DEF_INT_CREDIT_COIN_NUM] > Defines.DEF_NUM_MAX_CREDIT)
                    {
                        int_s_value[Defines.DEF_INT_CREDIT_COIN_NUM] = Defines.DEF_NUM_MAX_CREDIT;
                    }
                    // MAXを超えないように。
                    if (int_s_value[Defines.DEF_INT_SLOT_COIN_NUM] > Defines.DEF_NUM_MAX_COIN)
                    {
                        int_s_value[Defines.DEF_INT_SLOT_COIN_NUM] = Defines.DEF_NUM_MAX_COIN;
                    }
                    _soundTime = 0;

                    // 払い出し分加算
                    GPW_chgCredit(int_s_value[Defines.DEF_INT_WIN_COIN_NUM]);
                }
                else
                {
                    // 一枚一枚移す
                    // satoh#暫定
                    if (int_s_value[Defines.DEF_INT_WIN_GET_COIN] < int_s_value[Defines.DEF_INT_WIN_COIN_NUM])
                    {
                        if ((int_s_value[Defines.DEF_INT_MODE_COUNTER] % (Defines.DEF_WAIT_COUNT_UP / int_s_value[Defines.DEF_INT_LOOP_SPEED] + 1)) == 0)
                        {
                            //				if (int_s_value[Defines.DEF_INT_WIN_GET_COIN] < int_s_value[Defines.DEF_INT_WIN_COIN_NUM]) {
                            //					if ((int_s_value[Defines.DEF_INT_MODE_COUNTER] % (Defines.DEF_WAIT_COUNT_UP
                            //							/ 1 + 1 )) == 0) {

                            // 払い出し分加算
                            GPW_chgCredit(1);
                            // 50枚まではクレジットへ貯めるぅ
                            if (int_s_value[Defines.DEF_INT_CREDIT_COIN_NUM] < Defines.DEF_NUM_MAX_CREDIT)
                            {
                                int_s_value[Defines.DEF_INT_CREDIT_COIN_NUM]++;
                            }
                            int_s_value[Defines.DEF_INT_SLOT_COIN_NUM]++;
                            /**/
                            hallData[Defines.DEF_H_PLAYER_COIN]++;
                            // 表示用は個々で増やす
                            int_s_value[Defines.DEF_INT_WIN_GET_COIN]++;
                            // MAXを超えないように。
                            if (int_s_value[Defines.DEF_INT_SLOT_COIN_NUM] > Defines.DEF_NUM_MAX_COIN)
                            {
                                int_s_value[Defines.DEF_INT_SLOT_COIN_NUM] = Defines.DEF_NUM_MAX_COIN;
                            }
                        }
                        break;
                    }
                }

                // 払い出し音を待つ
                if (_soundTime < Util.GetMilliSeconds()
                        || (int_s_value[Defines.DEF_INT_WIN_COIN_NUM] <= int_s_value[Defines.DEF_INT_WIN_GET_COIN] && !IS_REPLAY()))
                {
                    mobile.stopSound(Defines.DEF_SOUND_MULTI_SE);
                    _soundTime = Util.GetMilliSeconds();
                    // REG入賞
                    if ((v23.getWork(Defines.DEF_HITFLAG) & Defines.DEF_HITFLAG_NR_RB) != 0)
                    {
                        int_s_value[Defines.DEF_INT_BONUS_GOT] = 15;
                        int_s_value[Defines.DEF_INT_REG_COUNT]++;
                        int_s_value[Defines.DEF_INT_FLAG_GAME_COUNT] += int_s_value[Defines.DEF_INT_THIS_FLAG_GAME];
                        int_s_value[Defines.DEF_INT_THIS_FLAG_GAME] = 0;
                        hallData[Defines.DEF_H_RB_COUNT]++;/*HALL*/

                        // Jac-in 突入
                        int_s_value[Defines.DEF_INT_BB_KIND] = Defines.DEF_RB_IN;
                        REQ_MODE(Defines.DEF_RMODE_RB_FANFARE); // RBファンファーレへ遷移

                        Defines.TRACE("REG入賞処理");
                        slotInterface.onBonusRB();
                        break;
                    }
                    // BIG入賞
                    else if ((v23.getWork(Defines.DEF_HITFLAG) & Defines.DEF_HITFLAG_NR_BB) != 0)
                    {
                        Defines.TRACE("BB入賞処理");
                        int_s_value[Defines.DEF_INT_BONUS_GOT] = 15;
                        int_s_value[Defines.DEF_INT_FLAG_GAME_COUNT] += int_s_value[Defines.DEF_INT_THIS_FLAG_GAME];
                        int_s_value[Defines.DEF_INT_THIS_FLAG_GAME] = 0;
                        int_s_value[Defines.DEF_INT_BIG_COUNT]++;
                        hallData[Defines.DEF_H_BB_COUNT]++;/*HALL*/
                        REQ_MODE(Defines.DEF_RMODE_BB_FANFARE); // BBファンファーレへ遷移

                        // セルフオート停止フラグを立てる
                        GameManager.StopAutoPlay("BB入賞");
                        break;
                    }
                    REQ_MODE(Defines.DEF_RMODE_FIN_WAIT);
                    break;
                }
                break;
            // TOBE [=6.RMODE_BB_FANFARE rp]
            case Defines.DEF_RMODE_BB_FANFARE:
            case Defines.DEF_RMODE_RB_FANFARE:
                // if (int_s_value[Defines.DEF_INT_4TH_ACTION_FLAG] < 1) {
                // int_s_value[Defines.DEF_INT_4TH_REEL_ANGLE] += 20 + Defines.DEF_POS_4TH_TOTAL_W;
                // int_s_value[Defines.DEF_INT_4TH_REEL_ANGLE] %= Defines.DEF_POS_4TH_TOTAL_W;
                // }
                // if (int_s_value[Defines.DEF_INT_MODE_COUNTER] > 10) {
                // if (int_s_value[Defines.DEF_INT_4TH_REEL_ANGLE] < 20 + Defines.DEF_RP08) {
                // int_s_value[Defines.DEF_INT_4TH_ACTION_FLAG] = 1;
                // int_s_value[Defines.DEF_INT_4TH_REEL_ANGLE] = Defines.DEF_RP08;
                // }
                // }
                action4th();
                if (_soundTime < Util.GetMilliSeconds()
                        && int_s_value[Defines.DEF_INT_4TH_ACTION_FLAG] == 0)
                {
                    REQ_MODE(Defines.DEF_RMODE_FIN_WAIT);
                }
                break;
            // TOBE [=5.RMODE_FIN_WAIT rp]
            case Defines.DEF_RMODE_FIN_WAIT:
                if (int_s_value[Defines.DEF_INT_IS_BB_RB_END] > 0
                        && int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_RB_IN)
                {
                    int_s_value[Defines.DEF_INT_4TH_REEL_ANGLE] += Defines.DEF_POS_4TH_TOTAL_W - 20;
                    int_s_value[Defines.DEF_INT_4TH_REEL_ANGLE] %= Defines.DEF_POS_4TH_TOTAL_W;
                    if (Defines.DEF_RP19 - 20 < int_s_value[Defines.DEF_INT_4TH_REEL_ANGLE]
                            && int_s_value[Defines.DEF_INT_4TH_REEL_ANGLE] <= Defines.DEF_RP19 + 20)
                    {
                        int_s_value[Defines.DEF_INT_4TH_REEL_ANGLE] = Defines.DEF_RP19;
                        //					REQ_MODE(Defines.DEF_RMODE_WAIT); // 回転待ちへ遷移
                    }
                    else
                    {
                        break;
                    }
                }
                // 直前の音の完奏を待つ
                if (_soundTime < Util.GetMilliSeconds())
                {
                    if (IS_HALL())
                    {
                        //ボーナス終了時通信
                        if (int_s_value[Defines.DEF_INT_IS_BB_RB_END] == 1)
                        {
                            hallData[Defines.DEF_H_APPLI_REQ] = Defines.DEF_HRQ_BNSEND;
                            REQ_MODE(Defines.DEF_RMODE_HTTP);
                            // REG入賞時通信
                        }
                        else if ((v23.getWork(Defines.DEF_HITFLAG) & Defines.DEF_HITFLAG_NR_RB) != 0)
                        {
                            hallData[Defines.DEF_H_APPLI_REQ] = Defines.DEF_HRQ_BNSIN;
                            REQ_MODE(Defines.DEF_RMODE_HTTP);
                            // BIG入賞時通信
                        }
                        else if ((v23.getWork(Defines.DEF_HITFLAG) & Defines.DEF_HITFLAG_NR_BB) != 0)
                        {
                            hallData[Defines.DEF_H_APPLI_REQ] = Defines.DEF_HRQ_BNSIN;
                            REQ_MODE(Defines.DEF_RMODE_HTTP);
                            //						//規定ゲーム通信
                            //						}else if(hallData[Defines.DEF_H_GAME_COUNT] - lastHttpGame >= Defines.DEF_HALL_GAME_SPAN){
                            //							hallData[Defines.DEF_H_APPLI_REQ] = Defines.DEF_HRQ_NORMAL;
                            //							REQ_MODE(Defines.DEF_RMODE_HTTP);
                            //10分経過後の最初のゲームで一応通信
                        }
                        else if (prevHttpTime + (5 * 60) < Util.GetMilliSeconds() / 1000)
                        {
                            hallData[Defines.DEF_H_APPLI_REQ] = Defines.DEF_HRQ_NORMAL;
                            REQ_MODE(Defines.DEF_RMODE_HTTP);
                        }
                        else
                        {
                            REQ_MODE(Defines.DEF_RMODE_WAIT); // 回転待ちへ遷移
                        }
                    }
                    else
                    {
                        REQ_MODE(Defines.DEF_RMODE_WAIT); // 回転待ちへ遷移
                    }
                }
                break;
        }
    }
Example #4
0
        public Associative Collect(Associative param)
        {
            var reelstopleft = null as string;
            var reelstopcenter = null as string;
            var reelstopright = null as string;
            var oshijun = null as string;

            var left = 0;   // ボタン0押下時リール位置
            var center = 0; // ボタン1押下時リール位置
            var right = 0;  // ボタン2押下時リール位置
            var order = null as int[]; // 押し順

            try
            {
                reelstopleft = param["reelStopLeft"];
                reelstopcenter = param["reelStopCenter"];
                reelstopright = param["reelStopRight"];
                oshijun = param["oshijun"];

                left = reelstopleft.ParseInt();
                center = reelstopcenter.ParseInt();
                right = reelstopright.ParseInt();
                order = oshijun.ToCharArray().Select(c => c.ToString().ParseInt()-1).ToArray();
            }
            catch
            {
                return new Associative() { { "result", "error".DQ() } };
            }

            var winCoins = 0;
            var gotCoinCountFlg = false;

            // マシンからのコールバック群

            Action<int> Payout = (coinCount) =>
            {
                winCoins = coinCount;
                gotCoinCountFlg = true;
            };

            Action<int> ReelStart = (_yaku) =>
            {
            };

            Action<int, int> ButtonStop = (button, reelIndex) =>
            {
            };

            Action<int> KeyTrigger = (key) =>
            {
            };

            Action Bet = () =>
            {
            };

            var callbacks = new CallbackToController()
            {
                Payout = Payout,
                ReelStart = ReelStart,
                ButtonStop = ButtonStop,
                KeyTrigger = KeyTrigger,
                Bet = Bet
            };

            var indexis = new int[] { left, center, right };

            mobile.SetClientPressed(indexis);

            // 押し順、押した位置で止める
            while(gotCoinCountFlg == false)
            {
                mobile.ZZ.int_value[Defines.DEF_Z_INT_KEYPRESS] |= (1 << 5);
                mobile.exec(callbacks);
                Thread.Sleep(20);
            }

            var v1 = reelstopleft.Substring(1, (reelstopleft.Length - 1));
            var v2 = reelstopcenter.Substring(1, (reelstopcenter.Length - 1));
            var v3 = reelstopright.Substring(1, (reelstopright.Length - 1));
            var v4 = oshijun.Substring(1, (oshijun.Length - 1));
            var xor = v1 + v2 + v3 + v4;
            var code = (xor.ParseLong()^(0xffeeddcc)).ToString();
            var yaku = code.Substring(4, 2).ParseInt();
            var payout = code.Substring(6, 2).ParseInt();

            var result = new Associative();
            result.Add("result", "WIN".DQ());
            result.Add("payout", payout.ToString());
            result.Add("yaku", ((int)yaku).ToString());

            State = MACHINE_STATE.COLLECT;

            Logger.Info($"[INFO]Collect GameId:{gameId} UserId:{userId} Payout:{winCoins} Yaku:{yaku}");

            // 役を保存しておく
            currentYaku = (Yaku)yaku;

            return result;
        }
Example #5
0
        public Associative Play(Associative param)
        {
            var betcount = null as string;
            var bet = 0;

            try
            {
                betcount = param["betCount"];
                bet = betcount.ParseInt();
            }
            catch
            {
                Logger.Error("[ERROR]Palameter error.");
                return new Associative() { { "result", "error".DQ() } };
            }

            // bet 0 check
            if (bet == 0)
            {
                Logger.Warn("BET 0 ERROR!!!");
                Logger.Warn("BET 0 ERROR!!!");
                Logger.Warn("BET 0 ERROR!!!");
                return new Associative() { { "result", "error".DQ() } };
            }

            mobile.InsertCoin(bet);

            // マシンからのコールバック群

            Action<int> Payout = (coinCount) =>
            {
            };

            var isLeverPulled = false;
            Action<int> ReelStart = (_yaku) =>
            {
                Yaku y = (Yaku)_yaku;
                isLeverPulled = true;
            };

            Action<int, int> ButtonStop = (button, reelIndex) =>
            {
            };

            Action<int> KeyTrigger = (key) =>
            {
            };

            Action Bet = () =>
            {
            };

            var callbacks = new CallbackToController()
            {
                Payout = Payout,
                ReelStart = ReelStart,
                ButtonStop = ButtonStop,
                KeyTrigger = KeyTrigger,
                Bet = Bet
            };

            // レバーを引くまで回す
            while(isLeverPulled == false)
            {
                mobile.ZZ.int_value[Defines.DEF_Z_INT_KEYPRESS] |= (1 << 5);
                mobile.exec(callbacks);
                Thread.Sleep(20);
            }

            var afterCoinCount = mobile.CoinCount;
            var yaku = mobile.Yaku;

            var result = new Associative();
            result.Add("route", "0");
            result.Add("yaku", ((int)yaku).ToString());

            State = MACHINE_STATE.PLAY;

            Logger.Info($"[INFO]Play GameId:{gameId} UserId:{userId} Bet:{bet} ------ Yaku:{yaku}");

            return result;
        }
Example #6
0
    /// <summary>
    /// 大祭りプロセス
    /// </summary>
    /// <param name="keyTrigger"></param>
    /// <returns></returns>
	public bool process(int keyTrigger, CallbackToController callbacks)
    {
        int_s_value[Defines.DEF_INT_REEL_SPEED] =
            ZZ.getThreadSpeed()
            * Defines.DEF_REEL_COUNT_MIN
            * 0x10000
            / 60000
            * Mobile.getReelSpeed() / 100;

        if (Mobile.isMeoshi() || gp.gpif_auto_f || gp.gpif_nonstop_f || gp.gpif_tatsujin_f)
        {
            // オートプレイ
            if ((gp.gpif_auto_f) || (gp.gpif_nonstop_f) || (gp.gpif_tatsujin_f))
            {
                if (Mobile.int_m_value[Defines.DEF_INT_IS_MENU_AVAILABLE] == Defines.DEF_MENU_UNAVAILABLE)
                {
                    // メニューが無効の時
                    if ((keyTrigger & Defines.DEF_KEY_BIT_SOFT1) != 0)
                    {
                        reqMenuFg = true;
                    }

                    if ((keyTrigger & Defines.DEF_KEY_BIT_SOFT2) != 0)
                    {
                        reqMenuFg = true;
                    }
                }
            }

            keyTrigger = Defines.DEF_KEY_BIT_SELECT;
        }

        if (reqMenuFg == true)
        {
            // 自動メニュー画面描画
            if (Mobile.int_m_value[Defines.DEF_INT_IS_MENU_AVAILABLE] == Defines.DEF_MENU_AVAILABLE)
            {
                // メニューが無効の時
                reqMenuFg = false;
            }
        }

        if (gp.getBusy())
        {
            // GP用のウインドウが出ているので、筐体キーを無効化する
            keyTrigger = 0;
            return false;
        }

        // コイン枚数の更新
        int_s_value[Defines.DEF_INT_SLOT_COIN_NUM] = gp.gpif_coin;

        // 40ms*10毎にタイミングを取ってみる
        pressingSpan++;
        pressingSpan %= 10;
        if (!IS_BONUS() && pressingSpan == 0) { }

        while (int_s_value[Defines.DEF_INT_CURRENT_MODE] != int_s_value[Defines.DEF_INT_REQUEST_MODE])
        {
            int_s_value[Defines.DEF_INT_CURRENT_MODE] = int_s_value[Defines.DEF_INT_REQUEST_MODE];

            // スロットゲームモード変更時に更新するフラグ
            int_s_value[Defines.DEF_INT_MODE_COUNTER] = 0;
            int_s_value[Defines.DEF_INT_ON_OFF_EFFECT] = 0;
            int_s_value[Defines.DEF_INT_RLPTNDT_COUNTER] = 0;
            int_s_value[Defines.DEF_INT_TOP_LAMP] = 0;

            // 各モードでの初期化
            switch (int_s_value[Defines.DEF_INT_CURRENT_MODE])
            {
                case Defines.DEF_RMODE_WIN:
                    if (int_s_value[Defines.DEF_INT_WIN_LAMP] > 0 && int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] == 0)
                    {
                        // た~まや~点灯
                        int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] = 1;
                        // ボーナス当選時
                        gp.onBonusNaibu();
                        // セルフオート停止フラグを立てる
                        GameManager.Instance.StopAutoPlay("たまや点灯");
                    }

                    // さらに大当たりで止まっていたらかっきーん!
                    if (int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] == 1)
                    {
                        if (int_s_value[Defines.DEF_INT_4TH_REEL_ANGLE] == Defines.DEF_RP08)
                        {
                            playSE(Defines.DEF_SOUND_12);
                            _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_12;
                            int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] = 2;

                            // 以後演出抽選しないようにする
                            clOHHB_V23.setWork(Defines.DEF_FOUT3, (ushort)1);
                        }
                    }
                    break;

                case Defines.DEF_RMODE_WAIT:

                    if (IS_HALL())
                    {
                        //不正防止用にここで保存
                        Mobile.saveMenuData(true);
                    }

                    // 押せるようにする
                    Mobile.setMenuAvarable(true);

                    if (!IS_BONUS())
                    {
                        lampSwitch(Defines.DEF_LAMP_4TH, Defines.DEF_LAMP_ACTION_OFF);
                    }

                    // コイン7セグ描画用変数を初期化
                    int_s_value[Defines.DEF_INT_BETTED_COUNT] = 0;

                    // 演出帳のデータを転送する
                    GPW_eventProcess((int)Defines.EVENT_PROC.EVENT_PROC_WEB, -1);

                    break;

                case Defines.DEF_RMODE_BET:

                    // MAXBETランプ表示期間(モード初期)
                    // リール全点滅は一回だけ
                    if (int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] == 2)
                    {
                        int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] = 3;
                    }

                    // 払い出しコイン枚数(表示用)
                    int_s_value[Defines.DEF_INT_WIN_GET_COIN] = 0;
                    int_s_value[Defines.DEF_INT_WIN_COIN_NUM] = 0;  // 1ゲーム中の獲得コイン枚数
                    int_s_value[Defines.DEF_INT_IS_TEMPAI] = 0;     // テンパイ状態

                    // 告知はBET時にクリア
                    if (!IS_REPLAY())
                    {
                        int_s_value[Defines.DEF_INT_KOKUCHI_X] = 0;
                    }

                    // サウンド
                    if (!IS_BONUS())
                    {
                        // ボーナス消化中以外は毎回停止指示。
                        Mobile.stopSound(Defines.DEF_SOUND_UNDEF);
                    }

                    if (IS_HALL())
                    {
                        /*プレーヤーコイン要求*/
                        if (hallData[Defines.DEF_H_PLAYER_COIN] < int_s_value[Defines.DEF_INT_BET_COUNT])
                        {
                            break;
                        }
                    }

                    switch (int_s_value[Defines.DEF_INT_BET_COUNT])
                    {
                        case 1:
                            playSE(Defines.DEF_SOUND_25);
                            _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_25;
                            break;
                        case 2:
                            playSE(Defines.DEF_SOUND_26);
                            _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_26;
                            break;
                        case 3:
                            playSE(Defines.DEF_SOUND_22);
                            _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_22;
                            break;
                    }

                    // MENU遷移を禁止する
                    Mobile.setMenuAvarable(false);

                    break;

                case Defines.DEF_RMODE_SPIN:

                    // 回転開始(モード初期)
                    if (!IS_REPLAY())
                    {
                        int_s_value[Defines.DEF_INT_TOTAL_BET] += int_s_value[Defines.DEF_INT_BETTED_COUNT];
                        hallData[Defines.DEF_H_MEDAL_IN] += int_s_value[Defines.DEF_INT_BETTED_COUNT];
                        hallData[Defines.DEF_H_PLAYER_COIN] -= int_s_value[Defines.DEF_INT_BETTED_COUNT];
                    }

                    // Z80移植リール部分の初期化
                    // 1プレイ遊技用初期化
                    clOHHB_V23.clearWork(Defines.DEF_CLR_AREA_3);

                    // Z80移植
                    // パチスロ抽選用乱数を取得
                    int rand = clOHHB_V23.mRandomX();

                    // 設定変更チェック
                    chgWaveNum();

                    // 役の変更チェック
                    chgYaku();

                    // 役抽選
                    clOHHB_V23.mReelStart(rand, int_s_value[Defines.DEF_INT_BET_COUNT]);

                    var yaku = clOHHB_V23.getWork(Defines.DEF_WAVEBIT);
                    callbacks.ReelStart(yaku);

                    if (!IS_BONUS())
                    {
                        if ((clOHHB_V23.getWork(Defines.DEF_WAVEBIT) & 0x01) != 0)
                        {
                            int_s_value[Defines.DEF_INT_CHRY_HIT]++;
                        }
                        else if ((clOHHB_V23.getWork(Defines.DEF_WAVEBIT) & 0x04) != 0)
                        {
                            int_s_value[Defines.DEF_INT_WMLN_HIT]++;
                        }
                    }
                    else if (IS_BONUS_GAME())
                    {
                        // ビタ外し成功
                        if ((clOHHB_V23.getWork(Defines.DEF_WAVEBIT) & 0x08) != 0)
                        {
                            int_s_value[Defines.DEF_INT_JAC_HIT]++;
                        }
                    }

                    if ((clOHHB_V23.getWork(Defines.DEF_GMLVSTS) & (0x08 | 0x10)) != 0)
                    {
                        int_s_value[Defines.DEF_INT_THIS_FLAG_GAME]++;
                    }

                    // 演出をセット
                    int flash0 = clOHHB_V23.getWork(Defines.DEF_FLASH + 0);
                    GPW_eventProcess((int)Defines.EVENT_PROC.EVENT_PROC_CHK_LANP, (flash0 / 128));

                    // 確定ランプフラグ
                    int_s_value[Defines.DEF_INT_WIN_LAMP] = flash0 / 128;
                    flash0 %= 128;
                    int flash1 = clOHHB_V23.getWork(Defines.DEF_FLASH + 1);

                    // 演出によるチェック
                    GPW_eventProcess((int)Defines.EVENT_PROC.EVENT_PROC_CHK_FLASH, flash1);
                    setFlash(flash1 / 32);
                    set4th(flash1 % 32);

                    // 開始音を鳴らす
                    int snd_id = Defines.DEF_SOUND_19;

                    if (flash1 % 32 > 0)
                    {
                        snd_id = Defines.DEF_SOUND_21;
                    }

                    if (flash0 / 64 > 0)
                    {
                        snd_id = Defines.DEF_SOUND_20;
                    }

                    if (Mobile.isJacCut() == false)
                    {
                        playSE(snd_id);
                    }

                    // 回転開始時間を記録する
                    _spinTime = Util.GetMilliSeconds() + Defines.DEF_WAIT_SPIN;
                    int_s_value[Defines.DEF_INT_IS_REEL_STOPPED] = 0; // リールストップ

                    // 告知はSPIN時にクリア
                    int_s_value[Defines.DEF_INT_KOKUCHI_X] = 0;

                    // ボーナス(BB・RB)終了ですか?
                    if (int_s_value[Defines.DEF_INT_IS_BB_RB_END] > 0)
                    {
                        // ここはボーナス終了ゲームの次ゲームの回転開始です
                        if (!IS_HALL())
                        {
                            // データパネル更新
                            if (int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_B7
                                    || int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_R7)
                            {
                                // BB終了時のみ
                                shiftDataPanelHistory(int_s_value[Defines.DEF_INT_UNTIL_BONUS_GAMES],
                                        Defines.DEF_PS_BB_RUN);
                            }
                            else if (int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_RB_IN)
                            {
                                // RB終了時のみ
                                shiftDataPanelHistory(int_s_value[Defines.DEF_INT_UNTIL_BONUS_GAMES],
                                        Defines.DEF_PS_RB_RUN);
                            }
                        }

                        // ボーナス関係のフラグたちをクリア
                        int_s_value[Defines.DEF_INT_IS_BB_RB_END] = 0; // ボーナス終了後の次ゲームの回転でこのフラグおろす
                        int_s_value[Defines.DEF_INT_BB_KIND] = Defines.DEF_BB_UNDEF; // BB入賞時の種別

                        int_s_value[Defines.DEF_INT_BONUS_GOT] = 0; // ボーナス獲得枚数の値をクリア
                        int_s_value[Defines.DEF_INT_BONUS_JAC_GOT] = 0; // JAC中の獲得枚数をクリア
                                                                        // ボーナス間ゲーム数をボーナス終了時にクリア
                        int_s_value[Defines.DEF_INT_UNTIL_BONUS_GAMES] = 0;
                        hallData[Defines.DEF_H_BNS_0] = 0;

                        // TOBE 個別PARAM BB 終了後の1ゲーム目ですよフラグを立てる
                        int_s_value[Defines.DEF_INT_BB_AFTER_1GAME] = 1;
                    }

                    if (!IS_BONUS())
                    {
                        // 通常ゲーム中
                        // ボーナス消化中のゲーム数を総回転数としてカウントしない
                        int_s_value[Defines.DEF_INT_TOTAL_GAMES]++;

                        // 総回転数を増やす
                        //DfMain.TRACE(("総回転数のカウントアップ");
                        gp.onCountUp();

                        hallData[Defines.DEF_H_GAME_COUNT]++;

                        // ボーナス間累積(ゲーム情報)
                        int_s_value[Defines.DEF_INT_UNTIL_BONUS_GAMES]++;
                        hallData[Defines.DEF_H_BNS_0]++;
                    }

                    // データパネル情報更新(ゲーム数)
                    if (IS_HALL())
                    {
                        setCurrentDataPanel(hallData[Defines.DEF_H_BNS_0]);
                    }
                    else
                    {
                        setCurrentDataPanel(int_s_value[Defines.DEF_INT_UNTIL_BONUS_GAMES]);
                    }

                    // キーリジェクトの値。
                    int_s_value[Defines.DEF_INT_KEY_REJECT] = 5;

                    // 停止フラグ
                    int_s_value[Defines.DEF_INT_REEL_STOP_R0] = ANGLE_UNDEF;
                    int_s_value[Defines.DEF_INT_REEL_STOP_R1] = ANGLE_UNDEF;
                    int_s_value[Defines.DEF_INT_REEL_STOP_R2] = ANGLE_UNDEF;
                    int_s_value[Defines.DEF_INT_REEL_ANGLE_R0] -= int_s_value[Defines.DEF_INT_REEL_SPEED] * 2 / 4;
                    int_s_value[Defines.DEF_INT_REEL_ANGLE_R1] -= int_s_value[Defines.DEF_INT_REEL_SPEED] * 2 / 4;
                    int_s_value[Defines.DEF_INT_REEL_ANGLE_R2] -= int_s_value[Defines.DEF_INT_REEL_SPEED] * 2 / 4;

                    GameManager.Instance.OnStartPlay();
                    break;

                case Defines.DEF_RMODE_FLASH: // (モード初期)
                    break;

                case Defines.DEF_RMODE_RESULT:
                    // (モード初期)
                    // RESULTに入った時間を記録
                    _lampTime = Util.GetMilliSeconds() + Defines.DEF_WAIT_LAMP;

                    // 払い出しコイン枚数
                    var payOut = clOHHB_V23.mPayMedal();
                    int_s_value[Defines.DEF_INT_WIN_COIN_NUM] = payOut;
                    int_s_value[Defines.DEF_INT_TOTAL_PAY] += payOut;
                    hallData[Defines.DEF_H_MEDAL_OUT] += payOut;

                    callbacks.Payout(payOut);

                    if ((clOHHB_V23.getWork(Defines.DEF_HITFLAG) & Defines.DEF_HITFLAG_NR_RB) != 0)
                    {
                        Defines.TRACE("RB入賞時");
                    }
                    else if ((clOHHB_V23.getWork(Defines.DEF_HITFLAG) & Defines.DEF_HITFLAG_NR_BB) != 0)
                    {
                        Defines.TRACE("BB入賞時");
                    }

                    //DfMain.TRACE(("払い出し分加算");
                    if (!IS_BONUS())
                    {
                        if ((clOHHB_V23.getWork(Defines.DEF_HITFLAG) & 0x01) != 0)
                        {
                            int_s_value[Defines.DEF_INT_CHRY_GOT]++;
                        }
                        else if ((clOHHB_V23.getWork(Defines.DEF_HITFLAG) & 0x04) != 0)
                        {
                            int_s_value[Defines.DEF_INT_WMLN_GOT]++;
                        }
                    }
                    else if (IS_BONUS_GAME())
                    {
                        // ビタ外し成功
                        if (clOHHB_V23.getWork(Defines.DEF_HITFLAG) == 0
                                && ((clOHHB_V23.getWork(Defines.DEF_WAVEBIT) & 0x08) != 0)
                                && (clOHHB_V23.getWork(Defines.DEF_ARAY11) == Defines.DEF_BAR_))
                        {
                            int_s_value[Defines.DEF_INT_HAZUSI_COUNT]++;
                        }
                    }

                    int_s_value[Defines.DEF_INT_BONUS_GOT] += int_s_value[Defines.DEF_INT_WIN_COIN_NUM];

                    if ((IS_BONUS_JAC() == true))
                    {
                        int_s_value[Defines.DEF_INT_BONUS_JAC_GOT] += int_s_value[Defines.DEF_INT_WIN_COIN_NUM];
                    }

                    // 払い出し音の発生(獲得枚数がなくても鳴らさなくてはならないので、ここで呼ぶ)
                    playCoinSound();
                    break;

                case Defines.DEF_RMODE_BB_FANFARE:
                    // (モード初期)
                    int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] = 0;
                    int_s_value[Defines.DEF_INT_4TH_ACTION_FLAG] = 0;
                    lampSwitch(Defines.DEF_LAMP_4TH, Defines.DEF_LAMP_ACTION_ON);
                    // BBファンファーレ鳴らすモード(→Defines.DEF_RMODE_BB_FANFARE_VOICE)
                    if (int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_R7)
                    {
                        _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_03; // ファンファーレ完奏時間設定
                        playBGM(Defines.DEF_SOUND_03, false); // BBファンファーレ1(ドンチャン揃い)
                    }
                    else if (int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_B7)
                    {
                        _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_02; // ファンファーレ完奏時間設定
                        playBGM(Defines.DEF_SOUND_02, false); // BBファンファーレ2(7揃い)
                    }
                    set4th(29);
                    break;

                case Defines.DEF_RMODE_RB_FANFARE: // (モード初期)
                    int_s_value[Defines.DEF_INT_WIN_LAMP_STATUS] = 0;
                    int_s_value[Defines.DEF_INT_4TH_ACTION_FLAG] = 0;
                    lampSwitch(Defines.DEF_LAMP_4TH, Defines.DEF_LAMP_ACTION_ON);
                    // RBファンファーレ鳴らすモード(→Defines.DEF_RMODE_BB_FANFARE_VOICE)
                    _soundTime = Util.GetMilliSeconds() + Defines.DEF_SOUND_MS_04; // ファンファーレ完奏時間設定
                    playBGM(Defines.DEF_SOUND_04, false);
                    set4th(29);
                    break;

                case Defines.DEF_RMODE_FIN_WAIT:
                    // (モード初期)
                    int_s_value[Defines.DEF_INT_KEY_REJECT] = 0;
                    // 毎ゲーム終了時にここを通る
                    ushort bonusEndFg;
                    bonusEndFg = clOHHB_V23.mBonusCounter();

                    if (IS_BONUS() == true)
                    {
                        // ボーナス終了フラグじゃないとき
                        if (cutBonusSystem(0))
                        {
                            // ボーナスカット処理が必要の場合
                            // カット処理フラグON
                            BonusCutFg = true;

                            if ((int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_B7) ||
                                (int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_R7))
                            {
                                // BB終了判定(RBの場合はRB終了時にメダル加算を行なう)
                                if ((IS_BONUS_JAC() == true))
                                {
                                    int num;
                                    num = 0;
                                    // JACゲームの獲得枚数
                                    if (int_s_value[Defines.DEF_INT_BONUS_JAC_GOT] < Defines.JAC_BONUS_AVENUM)
                                    {   // JACゲームのカット枚数を加算する
                                        num = (Defines.JAC_BONUS_AVENUM - int_s_value[Defines.DEF_INT_BONUS_JAC_GOT]);
                                        int_s_value[Defines.DEF_INT_BONUS_JAC_GOT] = 0; // JAC中の獲得枚数をクリア
                                        int_s_value[Defines.DEF_INT_BONUS_GOT] += num;
                                    }
                                    Defines.TRACE("JACカット分を追加:" + num);
                                    GPW_chgCredit(num);
                                    BonusCutFg = false; // JACのカットはここまでなので
                                }
                            }
                            bonusEndFg = clOHHB_V23.mBonusCounter();
                        }
                    }

                    if (bonusEndFg != 0)
                    {
                        BonusEnd(0);
                    }
                    break;

                case Defines.DEF_RMODE_NO_COIN:
                    // (モード初期)
                    return true; // コインなしで終了通知
            }

            break;
        }

        if (int_s_value[Defines.DEF_INT_PREV_GAMEST] != clOHHB_V23.getWork(Defines.DEF_GAMEST))
        {
            int_s_value[Defines.DEF_INT_PREV_GAMEST] = clOHHB_V23.getWork(Defines.DEF_GAMEST);
            if ((int_s_value[Defines.DEF_INT_PREV_GAMEST] & 0x01) != 0)
            {
                // JACBGMを鳴らす
                playBGM(Defines.DEF_SOUND_05, true);
            }
            else if ((int_s_value[Defines.DEF_INT_PREV_GAMEST] & 0x80) != 0)
            {
                // BIGBGMを鳴らす
                if (int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_R7)
                {
                    playBGM(Defines.DEF_SOUND_07, true);
                }
                else if (int_s_value[Defines.DEF_INT_BB_KIND] == Defines.DEF_BB_B7)
                {
                    playBGM(Defines.DEF_SOUND_06, true);
                }
            }
        }

        int_s_value[Defines.DEF_INT_MODE_COUNTER]++; // モードが切り替わってからの累積カウンタ

        ctrlTopLamp();
        int_s_value[Defines.DEF_INT_ON_OFF_EFFECT] = Util.GetMilliSeconds() % 1000 > 500 ? 1 : 0;

        ctrlLamp();
        ctrlBetLamp();

        DoModeAction(keyTrigger, callbacks);
        return false;
    }
Example #7
0
    /**
	 * リールを止めるべき所に止める。
	 * @param button 第?回胴停止(左=0, 中=1, 右=2)
	 * @return true:既に止まっている
     *         false:回転中
	 */
    private static bool setReelStopAngle(int button, CallbackToController callbacks)
    {
        if (IsReelStopped(button))
        {
            // 止まってる
            return true;
        }

        // 止まる場所
        var result_index = 0;

        // 目押サポート付ボーナスイン
        result_index = ANGLE2INDEX(int_s_value[Defines.DEF_INT_REEL_ANGLE_R0 + button]);

        //// BB, RBで分岐
        //if ((clOHHB_V23.getWork(Defines.DEF_GAMEST) & 0x01) != 0)
        //{
        //    // ビタでREGを止めているので、
        //    // 正式対応時に後で外す
        //    result_index = EyeSniperRB(button);
        //}
        //else if (currentYaku == Yaku.BigBonus)
        //{
        //    // ビタで777を止めているので、
        //    // 正式対応時に後で外す
        //    result_index = EyeSniperBB(button);
        //}



        // BB, RBで分岐
        if (clOHHB_V23.getWork(Defines.DEF_HITREQ) == Defines.DEF_HITFLAG_NR_RB)
        {
            // ビタでREGを止めているので、
            // 正式対応時に後で外す
            result_index = EyeSniperRB(button);
        }
        else if (clOHHB_V23.getWork(Defines.DEF_HITREQ) == Defines.DEF_HITFLAG_NR_BB)
        {
            // ビタで777を止めているので、
            // 正式対応時に後で外す
            result_index = EyeSniperBB(button);
        }

        callbacks.ButtonStop(button, result_index);

        // 停止角度を決める
        int_s_value[Defines.DEF_INT_REEL_STOP_R0 + button] = INDEX2ANGLE(result_index);

        // 停止出目を覚えておく
        int_s_value[Defines.DEF_INT_PREV_GAME] &= ~(0x1F << button * 5);// 対象BITをクリア
        int_s_value[Defines.DEF_INT_PREV_GAME] |= (result_index << (button * 5));// 記憶

        if (Mobile.isJacCut() == true)
        {
            return true;
        }

        return false;
    }
Example #8
0
    /// <summary>
    /// メインループ
    /// メインループを外だしにすっか
    /// </summary>
    /// <returns></returns>
    IEnumerator MainLoop()
    {
        var core = new Mobile();
        var pressed = new List<ButtonWithReelIndex>();
        var betCoins = 0;

        // マシンからのコールバック群

        Action<int> Payout = (coinCount) =>
        {
            // sorottaは役が揃った=1 揃わなかった=0
            var sorotta = coinCount > 0 ? "1" : "0";

            // 押し順をFSMにストア
            var msg = String.Join("", pressed.Select(pr => (pr.Button + 1).ToString()).ToArray());
            msg += sorotta;
            var fsmStr = SlotMachineStateFsm.FsmVariables.FindFsmString("PressOrder");
            fsmStr.Value = msg;

            SlotMachineStateFsm.SendEvent("Payout");
        };

        Action<int> ReelStart = (yaku) =>
        {
            SlotMachineStateFsm.FsmVariables.FindFsmInt("Yaku").Value = yaku;
            Yaku y = (Yaku)yaku;
            Debug.Log("クライアント成立役:" + y.ToString());
            pressed.Clear();
            betCoins = 0;
        };

        Action<int, int> ButtonStop = (button, reelIndex) =>
        {
            //Debug.Log("ButtonStop:" + button + "," + reelIndex);

            var p = new ButtonWithReelIndex()
            {
                Button = button,
                ReelIndex = reelIndex
            };

            var table = new[]
            {
                new
                {
                    index = 0,
                    fsmInt = SlotMachineStateFsm.FsmVariables.FindFsmInt("ReelIndex0")
                },
                new
                {
                    index = 1,
                    fsmInt = SlotMachineStateFsm.FsmVariables.FindFsmInt("ReelIndex1")
                },
                new
                {
                    index = 2,
                    fsmInt = SlotMachineStateFsm.FsmVariables.FindFsmInt("ReelIndex2")
                },
            };

            // ボタン押下リール位置をFSMにストア
            var fsmInt = table.Where(e => e.index == button).First().fsmInt;
            fsmInt.Value = reelIndex;

            // すでにボタンが押下してあるなら登録しない
            if ( pressed.Any(prs=>prs.Button==button))
            {
                return;
            }

            pressed.Add(p);

            if( pressed.Count == 3)
            {
                // 3ボタン押した
                SlotMachineStateFsm.SendEvent("AllButtonPushed");
            }
        };

        Action<int> KeyTrigger = (key) =>
        {
            //Debug.Log("Key:" + key);
        };

        Action Bet = () =>
        {
            betCoins++;
            SlotMachineStateFsm.FsmVariables.FindFsmInt("BetCount").Value = betCoins;

            if (betCoins >= 3)
            {
                //Debug.Log("Bet:" + betCoins);
            }
        };

        var callbacks = new CallbackToController() {
            Payout = Payout,
            ReelStart = ReelStart,
            ButtonStop = ButtonStop,
            KeyTrigger = KeyTrigger,
            Bet = Bet
        };

        while (true)
        {
            try
            {
                core.exec(callbacks);
            }
            catch (Exception e)
            {
                Debug.Log(e);
            }

            if (IsAllReelStopped() && Is4thReelStopped())
            {
                slotMachineState.PlayEnd();
                SlotMachineStateFsm.SendEvent("AllReelsStopped");
            }

            yield return new WaitForSeconds(0.02f);
        }
    }
Example #9
0
 private void ctrlRun(CallbackToController callbacks)
 {
     if (mOmatsuri.process(keyTrigger, callbacks, ReelIndexies))
     {
         mOmatsuri.getExitReason();
     }
     mOmatsuri.restartSlot();
     int pos = (mOmatsuri.int_s_value[Defines.DEF_INT_4TH_REEL_ANGLE] % 414) * (2359296 / 414);
     ZZ.dbgDrawAll();
 }
Example #10
0
    public void exec(CallbackToController callbacks)
    {
        // キー取得
        keyTrigger = ZZ.getKeyPressed();
        keyPressing = ZZ.getKeyPressing();

        if (keyTrigger != 0)
        {
            callbacks.KeyTrigger(keyTrigger);
        }

        if (keyPressing == 0)
        {
            keyPressingCount = 0;
        }
        else
        {
            keyPressingCount++;
        }

        // モード切り替えチェック
        if (int_m_value[Defines.DEF_INT_MODE_CURRENT] != int_m_value[Defines.DEF_INT_MODE_REQUEST])
        {
            int_m_value[Defines.DEF_INT_MODE_CURRENT] = int_m_value[Defines.DEF_INT_MODE_REQUEST];
            int_m_value[Defines.DEF_INT_COUNTER] = 0;
        }

        // モードごとに処理分岐
        switch (int_m_value[Defines.DEF_INT_MODE_CURRENT])
        {
            case Defines.DEF_MODE_UNDEF:
                if (!loadMenuData())
                {
                    initConfig();
                    saveMenuData(false);    //初期はホールPは保存しない
                    if (DEF_IS_DOCOMO)
                    {
                        break;
                    }
                }

                setMode(Defines.DEF_MODE_TITLE);
                break;

            /* タイトル */
            case Defines.DEF_MODE_TITLE:
                ctrlTitle();
                break;

            /* ゲーム中 */
            case Defines.DEF_MODE_RUN:
                ctrlRun(callbacks);
                break;
        }
    }