//--------------------------------
//ボーナスステージの入り口
def {
    BONUS_HOLE_ANG = 90 * UNIT_ANGLE
    BONUS_HOLE_VEL = 2 * UNIT_POS
}
mev[MEV_BONUSSTAGE] .name("ボーナスステージの入り口") .pos(4, 8)
mep[1] .parallel bl {
    //簡易判定
    @if `!ROUGHLY_CHECK_BALL_HIGH bl {
        @ev.abort
    }

    //ボーナスステージへ
    //シーンが切り替わってから４秒後に判定する
    @if `sceneState != SC_ST_PLAY || sceneTimer < 4 * UNIT_FPS bl {
        @ev.abort
    }

    //衝突判定
    pbBallToArea(temA, unusedV,
    GIM_LAYER_MID, self.id, SHARP_CIRCLE, 0, 8, 0, 0, 0, 0)
    @if temA < 0 bl {
        @ev.abort
    }
    //玉ID
    bonusHoleCatchId = temA
    //玉をロックする
    pbBallFunction(BA_FUNC_SET_POS, bonusHoleCatchId, self.id, GIM_LAYER_MID, 0, 0)
    pbBallFunction(BA_FUNC_LOCK,    bonusHoleCatchId, 0, 0, 0, 0)
    @wait(0)
    startEventMode()

    @se.play "explo1" .opt(100, 100, 50)
    @scr.shake .once(2) .value(5, 7)
    @wait(8)
    @se.play "fc_get1" .opt(100, 130, 50)

    $TEXT =
"\c[7]おーっと、ボーナスステージ
やらないなら玉を一個くれてやるぞ
\c[2]$v\c[0]:やらない  \c[2]$t\c[0]:やる"
    pbDisplay(DI_ST_SELECT, $TEXT)
    @while displayState == DI_ST_SELECT bl {
        @wait(0)
    }

    @if displaySelect == 1 bl {
        //ボーナスゲームのステージを選択
        @if `iconFlag & ICON_BIT_NIN bl {
            bonusGameMode = 1
        } .else bl {
            bonusGameMode = 0
        }

        @se.play "Wind1" .opt(90, 120, 50)
        stopBGM()

        fastFadeOut(1)
        @wait(2)

        changeSceneState(SC_ST_ENTER_BONUSSTAGE)
        @ev.abort
    
    } .else bl {
        cm_extendChance()
        cm_updateCenterHole()
        cm_initUpperBoss()

        //フラグをOFFにする
        bitOff(iconFlag, ICON_BIT_DAERO | ICON_BIT_GOSEI | ICON_BIT_MUSYA | ICON_BIT_NASU)
        bitOn(triggerFlg, SC_BIT_ICON)
        @wait(5)

        //メカゴーレムを再配置する
        gateKeeperState = GIM_ST_ACTIVATED

        //玉を解放する
        pbBallFunction(BA_FUNC_UNLOCK,  bonusHoleCatchId, 0, 0, 0, 0)
        pbBallFunction(BA_FUNC_SET_VEL, bonusHoleCatchId, BONUS_HOLE_VEL, BONUS_HOLE_ANG, 0, 0)
        bonusHoleCatchId = -1
        endEventMode()
        @se.play "flipper2" .opt(100, 140, 50)

        //4秒待つ
        @wait(40)
    }
}

//--------------------------------
//センターホール
def {
    CENTER_HOLE_ANG = 90 * UNIT_ANGLE
    CENTER_HOLE_VEL = 2 * UNIT_POS
    CENTER_HOLE_SECOND = 60

    CENTER_HOLE_ANIM_TELEPORT = 10
    CENTER_HOLE_ANIM_VIDEO = 12
    CENTER_HOLE_ANIM_BOW = 13
    CENTER_HOLE_ANIM_POWERUP = 14
}
mev[MEV_CENTER_HOLE] .pos(7,8) .name("中央ホール")
mep[1] .body(CHARSET_HOLE, 0) .dir.up  .anim.fixDir.step .priority.low .parallel bl {
    //簡易判定
    @if `!ROUGHLY_CHECK_BALL_HIGH bl {
        @ev.abort
    }

    //判定
    pbBallToArea(temA, unusedV,
    GIM_LAYER_MID, MEV_CENTER_HOLE, SHARP_CIRCLE, 0, 6, 0, 0, 0, 0)
    @if temA < 0 bl {
        centerHoleCatchId = -1
        @ev.abort
    }
    //玉ID
    centerHoleCatchId = temA
    //玉をロックする
    pbBallFunction(BA_FUNC_SET_POS, centerHoleCatchId, MEV_CENTER_HOLE, GIM_LAYER_MID, 0, 0)
    pbBallFunction(BA_FUNC_LOCK,    centerHoleCatchId, 0, 0, 0, 0)
    @se.play "flipper2" .opt(100, 80, 50)

    //状態によって処理が異なる
    //エクステンド
    @if `iconFlag & ICON_BIT_EXTRA bl {
        iconOff(ICON_BIT_EXTRA)

        startEventMode()    
        @wait(4)
        //アニメーションを再生する
        @anim.show [CENTER_HOLE_ANIM_TELEPORT] {
            .self
            .buffer(ANIM_BUFFER_EVENT)
            .reverse(0)
        }
        @wait(5)

        //BGMの変更を先延ばしにする
        bgmTimer = max(bgmTimer, UNIT_FPS * 3)
        
        //勝利BGM
        startBGM("JEnd of Battle 1", FALSE, 0, 100, 120, 50)
        
        //既に最大になっている場合は代わりにマルチプライヤーを得る
        @if chance >= MAX_CHANCE bl {
            pbAddScore(NUM_TYPE_MULTI, MULTI_EXTEND, 0)
            pbDisplay(DI_ST_ZOOM, __str("\c[2]マルチプライヤー +", MULTI_EXTEND))
        //玉追加
        } .else bl {
            pbAddScore(NUM_TYPE_CHANCE, 1, 0)
            pbDisplay(DI_ST_ZOOM, __str("\c[2]エクストラボール +", 1))
        }

        @wait(25)
        @se.play "finger1" .opt(90, 100, 50)
        @wait(10)

        //BGMを戻す
        cm_returnBGM()

        endEventMode()

    //ビデオモード
    } .elif `iconFlag & ICON_BIT_VIDEO bl {
        iconOff(ICON_BIT_VIDEO)

        @wait(5)
        //アニメーションを再生する
        @anim.show [CENTER_HOLE_ANIM_VIDEO] {
            .self
            .buffer(ANIM_BUFFER_EVENT)
            .reverse(0)
        }
        @wait(2)
        //玉を隠す
        pbBallFunction(BA_FUNC_HIDE, centerHoleCatchId, 0, 0, 0, 0)
        @wait(0)
        startEventMode()
        @wait(12)
        //効果音
        @se.play "fc_get1" .opt(100, 130, 50)
        
        $TEXT =
"\c[7]ビデオモードの時間よ！！
やらないのなら代わりに玉をあげる！
\c[2]$v\c[0]:やらない  \c[2]$t\c[0]:やる"
        pbDisplay(DI_ST_SELECT, $TEXT)
        @while displayState == DI_ST_SELECT bl {
            @wait(0)
        }

        @if displaySelect == 1 bl {
            //BGMが変わらないように
            changeSceneState(SC_ST_VIDEOMODE)
            //BGMを止める
            stopBGM()
            //BGMの変更を先延ばしにする
            bgmTimer = max(bgmTimer, UNIT_FPS * 10)
            //ビデオモード開始
            startEternalBattle(temA, temB)
            //スコア
            @if temA > 0 bl {
                pbAddScore(NUM_TYPE_BONUS, temA, 0)
            }
            @if temB > 0 bl {
                cm_extendChance()
                cm_updateCenterHole()
            }
            //BGMを戻す
            changeSceneState(SC_ST_PLAY)
            cm_returnBGM()

        //残機が増加する穴が解放される
        } .else bl {
            cm_extendChance()
            cm_updateCenterHole()
        }

        @wait(8)
        //アニメーションを再生する
        @anim[CENTER_HOLE_ANIM_VIDEO].show {
            .self
            .buffer(ANIM_BUFFER_EVENT)
            .reverse(0)
        }
        @wait(2)
        endEventMode()
        pbBallFunction(BA_FUNC_LOCK, centerHoleCatchId, 0, 0, 0, 0)
        //終わり
        @wait(12)

    //強化
    } .elif `iconFlag & ICON_BIT_POWERUP bl {
        iconOff(ICON_BIT_POWERUP)

        @wait(4)
        //アニメーションを再生する
        @anim.show [CENTER_HOLE_ANIM_POWERUP] {
            .self
            .buffer(ANIM_BUFFER_EVENT)
            .reverse(0)
        }
        //ボールの強化
        addPowerUpTimer(CENTER_HOLE_SECOND)
        //左レーンのカウントを初期化する
        leftLaneCount = 0
        @wait(8)

        pbDisplay(DI_ST_ZOOM, __str("\c[2]パワーアップ！ (", CENTER_HOLE_SECOND, "s)"))

        //OK!
        @se.play "voice_ok" .opt(100, 100, 50)
        @wait(5)
        //BGM
        bgmType = rnd(0,MAX_POWERUP_BGM - 1)
        cm_startPowerUpBGM()

    //シェイドⅡ
    } .elif exitGateState == GIM_ST_HIDE bl {
        exitGateCount += 1
        //召喚
        @if exitGateCount >= COFFIN_COUNT bl {
            exitGateCount = 0
            //EXITゲートを起動する
            pbDisplay(DI_ST_NORMAL, __str("\c[2]シェイドⅡ召喚"))
            exitGateState = GIM_ST_ACTIVATED
            @wait(8)
        //すぐに吐き出す
        } .else bl {
            @wait(3)
        }

    //すぐに吐き出す
    } .else bl {
        @wait(5)
    }

    //解放する
    pbBallFunction(BA_FUNC_UNLOCK, centerHoleCatchId, 0, 0, 0, 0)
    pbBallFunction(BA_FUNC_SET_VEL, centerHoleCatchId, CENTER_HOLE_VEL, CENTER_HOLE_ANG, 0, 0)
    centerHoleCatchId = -1
    @se.play "flipper2" .opt(100, 140, 50)

    @wait(5)
    //外見を更新する
    cm_updateCenterHole()
}