//--------------------------------
//毎F実行される
def {
    ANIM_SUPPLY = 6

    AUTOADD_SECOND = 8
}
mev[MEV_ON_FRAME] .map(parentMap) .name("毎F実行") .pos(2,0)
mep[1] .parallel bl {
    //タイマー
    sceneTimer += 1

    pseudoSwitchState(sceneState,
        //ゲーム中
        [ SC_ST_PLAY, bl {
            //玉が無くなった
            @if `!eventMode bl {
                @if ballCount <= 0 bl {
                    //フリーズの起動中は待機する
                    @if freezeState == GIM_ST_EVENT bl {
                    //パワーアップ中は無条件でフリーズを起動する
                    } .elif powerupTimer > 0 bl {
                        freezeState = GIM_ST_EVENT
                    //フリーズを発動させる
                    } .elif freezeState == GIM_ST_ACTIVATED bl {
                        pbDisplay(DI_ST_NORMAL, "\c[2]フリーズ")
                        freezeState = GIM_ST_EVENT
                    //清算
                    } .else bl {
                        changeSceneState(SC_ST_LIQUID)
                    }
                }
            }
        },
        //玉を補充する
        SC_ST_LOAD, bl {
            $F = 4
            @if sceneTimer == 0 bl {
                //戦闘アニメ
                @anim[ANIM_SUPPLY].show {
                    .target(MEV_SUPPLYBALL)
                    .buffer(ANIM_BUFFER_BALL)
                    .reverse(0)
                }
            }

            @if sceneTimer >= $F bl {
                //残機を減らす
                //無敵モード中は減らない
                @if invincibleSwitch.isOff bl {
                    chance -= 1
                    bitOn(triggerFlg, SC_BIT_CHANCE)
                }
                //残機がないと警告が出る
                @if chance <= 0 bl {
                    @se.play "alert1" .opt(50, 130, 50)
                }
                //フリーズを起動する
                _activateFreeze(FREEZE_SECOND)
                freezeSwitch = FALSE
                //トップストッパーを起動
                topStopperState = GIM_ST_ACTIVATED
                //スキルショットイベントを初期化
                _initSkillShot()
                //ボール生成
                pbBallFunction(BA_FUNC_APPEAR, 0, MEV_SUPPLYBALL, GIM_LAYER_MID, 0, 0)
                //ゲーム開始
                changeSceneState(SC_ST_PLAY)
            }
        },
        //清算
        SC_ST_LIQUID, bl {
            $F = 30
            @if sceneTimer >= $F bl {
                //スコア追加
                @if sceneTimer == $F bl {
                    //取得スコア
                    temA = bonus * multiplier
                    @if temA > 0 bl {
                        //最大スコアに到達
                        @if `score < MAX_SCORE && score + temA >= MAX_SCORE bl {
                            @scr.flash .once(4) .rgbv(31, 31, 31, 31)
                            @se.play "Holy5" .opt(100, 100, 50)
                            @se.play "cheers" .opt(100, 100, 50)

                        } .else bl {
                            @se.play "dora1" .opt(100, 100, 50)
                        }

                        pbAddScore(NUM_TYPE_SCORE, temA, NUM_BIT_REEL)
                        pbDisplay(DI_ST_LIQUID, __str("\c[0]スコア清算", NEWLINE, "\c[5]\", bonus, "\c[7] x \", multiplier, "\c[0] = \c[2]\", temA ))
                    }
                    //イベントモード
                    startEventMode()
                    //清算中はスコアが入らない
                    enableScore = FALSE
                    
                //表示が終わるまで待つ
                } .elif displayState <= DI_ST_NONE bl {
                    //ゲームオーバー
                    @if chance <= 0 bl {
                        changeSceneState(SC_ST_GAMEOVER)
                    //装填する
                    } .else bl {
                        //イベントモード終了
                        endEventMode()
                        //ボーナス初期化
                        bonus = 0
                        bitOn(triggerFlg, SC_BIT_BONUS)
                        //スコアが入るように
                        enableScore = TRUE
                        changeSceneState(SC_ST_LOAD)
                    }
                }
            }
        },
        //マップに入った直後に実行される
        SC_ST_ENTER, bl {
            //初回プレイのみ、スクロールが入る
            @if pbFirstPlay.isOn bl {
                @if sceneTimer == 0 bl {
                    cm_onEnterMap()

                    setScroll(0, 0, 0)
                    @wait(0)

                    fastFadeIn(2)

                    startBGM("J2003Horn", FALSE, 0, 100, 120, 50)
                }
                @if sceneTimer == 30 bl {
                    setScroll(0, 16*16, 160)
                }
                @if sceneTimer >= 220 bl {
                    enableScore = TRUE
                    endEventMode()
                    changeSceneState(SC_ST_LOAD)
                }
            //一瞬で下まで移動する
            } .else bl {
                cm_onEnterMap()

                setScroll(0, 16*16, 0)
                @wait(0)
                fastFadeIn(2)

                endEventMode()
                changeSceneState(SC_ST_LOAD)

                //debug
                //score = MAX_SCORE - 100
            }
        },
        //ボーナスステージから出た直度
        SC_ST_EXIT_BONUSSTAGE, bl {
            @if sceneTimer == 0 bl {
                cm_onEnterMap()
                setScroll(0, 0, 0)
                fastFadeIn(2)
            }
            //ボーナスゲームの穴から玉を射出する
            @if sceneTimer == 60 bl {
                pbBallFunction(BA_FUNC_APPEAR,  0, MEV_BONUSSTAGE, GIM_LAYER_MID, 0, 0)
                pbBallFunction(BA_FUNC_SET_VEL, 0, BONUS_HOLE_VEL, BONUS_HOLE_ANG, 0, 0)

                @se.play "flipper2" .opt(90, 100, 50)

                endEventMode()
                changeSceneState(SC_ST_PLAY)
            }
        },
        //ボーナスステージへ移動する
        SC_ST_ENTER_BONUSSTAGE, bl {
            changeSceneState(SC_ST_ENTER)
            goToPinballStage(MAP_BONUSSTAGE_1)
            @ev.abort
        },
        //ゲームオーバー
        SC_ST_GAMEOVER, bl {
            //イベント状態やスコア取得フラグに関わる処理は既に行われている

            //BGMをフェードアウト
            @if sceneTimer == 0 bl {
                @scr.tint .rgbs(80, 80, 80, 100) .time(5)
                stopBGM(200)
            }
            //BGM
            @if sceneTimer == 30 bl {
                startBGM("JInn 2", FALSE, 0, 100, 90, 50)
            }
            //表示
            @if sceneTimer == 60 bl {
                pbDisplay(DI_ST_CENTER, "\c[7]ゲームオーバー\c[0]")
            }
            
            @if `sceneTimer > 60 && displayState <= DI_ST_NONE bl {
                //BGMを停止する
                stopBGM()
                //マップ移動
                goToRelayMap()
                @ev.abort
            }
        }
    ] )

    //毎フレーム実行
    pbOnFrame()

    //BGM
    //一定時間ごとに切り替える
    @if enableDedicatedBGM.isOn bl {
        //プレイ中のみでかつ、パワーアップ中でもない
        @if `sceneState == SC_ST_PLAY && powerupTimer <= 0 bl {
            bgmTimer -= 1
            //フェードアウトする
            @if bgmTimer == 4 * UNIT_FPS bl {
                @bgm.fadeout(2000)
            }
            //別の曲に切り替える
            @if bgmTimer <= 0 bl {
                localA = rnd(1, MAX_BGM - 1)

                bgmType = (bgmType + localA) % MAX_BGM
                bgmTimer = BGM_TIMER

                cm_startBGM()
            }
        }
    }

    //パワーアップ中は雑魚敵が自動で追加される
    @if powerupTimer >= AUTOADD_SECOND * UNIT_FPS bl {
        @if `!(powerupTimer % 60) bl {
            temA = EN_PAT_LEFT
            cm_addEnemys()
            temA = EN_PAT_RIGHT
            cm_addEnemys()
        }
    }

    //点滅演出などに使用するタイマー
    effectTimer += 1
}