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;
    }
Example #2
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;
    }