//共通処理

__fn cm_onEnterMap bl {
    @ev.call .mev(MEV_COMMON, 1)
}

__fn cm_initUnderLane bl {
    @ev.call .mev(MEV_COMMON, 2)
}

__fn cm_addLeftSubFlipper bl {
    @ev.call .mev(MEV_COMMON, 3)
}

__fn cm_addRightSubFlipper bl {
    @ev.call .mev(MEV_COMMON, 4)
}

__fn cm_boardBonus bl {
    @ev.call .mev(MEV_COMMON, 5)
}

__fn cm_falconMission bl {
    @ev.call .mev(MEV_COMMON, 6)
}

__fn cm_addEnemys bl {
    @ev.call .mev(MEV_COMMON, 7)
}

__fn cm_updateCenterHole bl {
    @ev.call .mev(MEV_COMMON, 8)
}

__fn cm_extendChance bl {
    @ev.call .mev(MEV_COMMON, 9)
}

__fn cm_startBGM bl {
    @ev.call .mev(MEV_COMMON, 10)
}

__fn cm_startPowerUpBGM bl {
    @ev.call .mev(MEV_COMMON, 11)
}

__fn cm_initUpperBoss bl {
    @ev.call .mev(MEV_COMMON, 12)
}

__fn cm_updateBumperPattern bl {
    @ev.call .mev(MEV_COMMON, 13)
}

__fn cm_returnBGM bl {
    @ev.call .mev(MEV_COMMON, 14)
}

mev[MEV_COMMON] .map(parentMap) .name("common") .pos(1,0)

//--------------------------------
//マップに入った直度に実行する
mep[1] bl {
    pbOnEnterMap()

    //主人公が(9,7)にいないとズレる
    @map[parentMap].setPlayerPos .pos(9, 7) .retain

    //衝突マップ
    showCollisionMapPicture(PIC_COLLMAP + 1, "pb/cm_ms1", 0, 0)
    showCollisionMapPicture(PIC_COLLMAP + 2, "pb/cm_ms2", 0, 0)

    //ステージマップ
    showStageMapPicture(PIC_STAGE + 1, "pb/ms1", LAY_STAGE_MID, 0, 0)
    showStageMapPicture(PIC_STAGE + 2, "pb/ms2", LAY_STAGE_HI , 0, 0)

    //メインフリッパーを設置する
    pbFlipperFunction(FL_FUNC_APPEAR, 0,            0, GIM_LAYER_MID,  6 * 16 + 8 + 6, 29 * 16 + 4)
    pbFlipperFunction(FL_FUNC_APPEAR, 1,  FL_BIT_HREV, GIM_LAYER_MID, 12 * 16 + 8 - 6, 29 * 16 + 4)

    //四天王フラグをoffにする
    bitOff(iconFlag, ICON_BIT_DAERO | ICON_BIT_GOSEI | ICON_BIT_MUSYA | ICON_BIT_NASU)

    //イベントモード
    eventMode = TRUE

    //アイコンを表示する
    enableIcon = TRUE

    //女体化
    @if `COND_FEMINIZATION bl {
        //ドラゴナス
        @ev.setAction [MEV_NASU] .freq(8) .skippable .act {
            .setBody(CHARSET_LEADER_2, 5)
        }
        //ムシャ
        @ev.setAction [MEV_MUSYA] .freq(8) .skippable .act {
            .setBody(CHARSET_LEADER_2, 1)
        }
    }

    //メカゴーレムを起動する
    gateKeeperState = GIM_ST_ACTIVATED

    //ブライアンを起動する
    brianState = GIM_ST_ACTIVATED

    //最初のみ、パワーアップを無償で解放する
    @if gameTimer == 0 bl {
        iconOn(ICON_BIT_POWERUP)

    }

    //画面切り替え時にキックバックが起動する
    _activateLeftKickBack()
    _activateRightKickBack()

    //BGMを即切り替える
    bgmTimer = 1
    //パワーアップ状態の曲を流す
    @if powerupTimer > UNIT_FPS bl {
        cm_startPowerUpBGM()
    }

    //中央穴の状態を更新する
    cm_updateCenterHole()

    //バンパーのパターンを変更する
    cm_updateBumperPattern()

}
//--------------------------------
//下レーンを初期化する
mep[2] bl {
    underLaneFlag = 0
    @loop UNDER_LANE_NUM .dst(temA) bl {
        temB = MEV_UNDER_LANE_1 + temA
        
        @ev[temB].setAction .freq(8) .unskippable .act {
            .setBody(CHARSET_LANE, 0)
        }
        @ev.flash [temB] .rgbv(0, 0, 0, 31) .time(5)
    }
}
//--------------------------------
//左サブフリッパーを追加する
mep[3] bl {
    startEventMode()
    @se.play "Song" .opt(90, 130, 50)
    //スクロール
    setScroll(0, 16*6, 30)
    @wait(5)
    //移動させる
    @se.play "Horse" .opt(70, 100, 50)
    @ev.setPos [MEV_SUBFLIPPER_EVENT] .pos(SUBFLIPPER_EVENT_X, SUBFLIPPER_EVENT_Y)
    @ev.setAction [MEV_SUBFLIPPER_EVENT] .freq(8) .skippable .act {
        .beginThrough
        .beginJump
        .moveLeft
        .moveLeft
        .moveLeft
        .moveLeft
        .moveLeft
        .moveDown
        .moveDown
        .moveDown
        .endJump
        .speedUp
        .moveLeft
        .moveLeft
        .moveLeft
        .moveLeft
        .speedDown
        .faceDown
    }
    @wait(13)
    //サブフリッパーを追加する
    pbFlipperFunction(FL_FUNC_APPEAR, 2,  FL_BIT_SMALL, GIM_LAYER_MID,  7 * 16, 15 * 16 + 8)
    bitOn(subFlipperFlag, SUBFLIPPER_BIT_LEFT)
    @scr.flash .once(4) .rgbv(31, 31, 31, 31)
    @se.play "Item1" .opt(100, 100, 50)
    @wait(5)
    @ev.setAction [MEV_SUBFLIPPER_EVENT] .freq(8) .skippable .act {
        .speedUp
        .moveRight
        .moveRight
        .moveRight
        .moveRight
        .speedDown
        .beginJump
        .moveRight
        .moveRight
        .moveRight
        .moveRight
        .moveRight
        .moveUp
        .moveUp
        .moveUp
        .endJump
        .faceUp
    }
    @wait(7)
    //玉の停止を解除する
    endEventMode()
}
//--------------------------------
//右サブフリッパーを追加する
mep[4] bl {
    //玉を停止させる
    startEventMode()
    //スクロール
    setScroll(0, 16*6, 30)
    @se.play "Song" .opt(90, 130, 50)
    @wait(5)
    //移動させる
    @se.play "Horse" .opt(70, 100, 50)
    @ev.setPos [MEV_SUBFLIPPER_EVENT] .pos(SUBFLIPPER_EVENT_X, SUBFLIPPER_EVENT_Y) 
    @ev.setAction [MEV_SUBFLIPPER_EVENT] .freq(8) .skippable .act {
        .beginThrough
        .beginJump
        .moveLeft
        .moveLeft
        .moveLeft
        .moveLeft
        .moveLeft
        .moveDown
        .moveDown
        .moveDown
        .endJump
        .moveLeft
        .faceDown
    }
    @wait(10)
    //サブフリッパーを追加する
    pbFlipperFunction(FL_FUNC_APPEAR, 3,  FL_BIT_SMALL | FL_BIT_HREV, GIM_LAYER_MID, 11 * 16 + 8, 15 * 16 + 8)
    bitOn(subFlipperFlag, SUBFLIPPER_BIT_RIGHT)

    @scr.flash .once(4) .rgbv(31, 31, 31, 31)
    @se.play "Item1" .opt(100, 100, 50)
    @wait(5)
    @ev.setAction [MEV_SUBFLIPPER_EVENT] .freq(8) .skippable .act {
        .beginJump
        .moveRight
        .moveRight
        .moveRight
        .moveRight
        .moveRight
        .moveRight
        .moveUp
        .moveUp
        .moveUp
        .endJump
        .faceUp
    }
    @wait(5)
    //玉の停止を解除する
    endEventMode()
}
//--------------------------------
//看板と対応したレーンを通った
mep[5] bl {
    //スコア
    pbAddScore(NUM_TYPE_BONUS, BONUS_BOARD_MATCH, 0)
    //演出
    @se.play "fc_coin1" .opt(80, 100, 50)
    @ev.flash [MEV_BOARD] .rgbv(31, 31, 31, 31) .time(2)
}

//--------------------------------
//ファルコンミッション
//temA 対応する場所
mep[6] bl {
    @if `falconState == GIM_ST_ACTIVATED && falconTimer > 0 bl {
        @if temA == falconArea bl {
            //スコア
            pbAddScore(NUM_TYPE_BONUS, BONUS_FALCON, 0)
            //成功回数
            falconSuccess += 1
            //次の場所へ移る
            falconFlag = TRUE

            @ev.flash [MEV_FALCON] .rgbv(31, 31, 31, 31) .time(5)
            @se.play "money2" .opt(100, 100, 50)
        }
    }
}

//--------------------------------
//敵の群れを追加する
//temA, temB, ptrA, idxA
//temA 左右
mep[7] bl {
    //既にいる場合は省略する
    temB = 0
    @loop MAX_ENEMY .dst(idxA) bl {
        getEnemyPtr(ptrA, idxA)
        @if `v[ptrA + ME_STATE] > EN_ST_NONE && v[ptrA + ME_PATTERN] == temA bl {
            temB += 1
        }
    }
    @if temB <= 0 bl {
        temB = 0
        @loop MAX_ENEMY .dst(idxA) bl {
            getEnemyPtr(ptrA, idxA)
            @if `v[ptrA + ME_STATE] <= EN_ST_NONE bl {
                initEnemy(ptrA, bl{
                    $state   = EN_ST_INIT
                    $timer   = temB * (-32 * 1)
                    $pattern = temA
                    $hp      = 2
                } )
                temB += 1
                @if temB >= SIDE_ENEMY_REIN bl {
                    @break
                }
            }
        }
    }
}

//--------------------------------
//中央穴の状態を更新する
mep[8] bl {
    
    @if `iconFlag & ICON_BIT_EXTRA bl {
        @ev.setAction [MEV_CENTER_HOLE] .freq(8) .skippable .act {
            .faceRight
        }
    } .elif `iconFlag & ICON_BIT_VIDEO bl {
        @ev.setAction [MEV_CENTER_HOLE] .freq(8) .skippable .act {
            .faceLeft
        }
    } .elif `iconFlag & ICON_BIT_POWERUP bl {
        @ev.setAction [MEV_CENTER_HOLE] .freq(8) .skippable .act {
            .faceDown
        }
    } .else bl {
        @ev.setAction [MEV_CENTER_HOLE] .freq(8) .skippable .act {
            .faceUp
        }
    }
}

//--------------------------------
//残機を増やす権利を与えよう
mep[9] bl {
    @if `!(iconFlag & ICON_BIT_EXTRA) bl {
        iconOn(ICON_BIT_EXTRA)
        pbDisplay(DI_ST_NORMAL, "\c[2]エクストラホール解放")
    }
}

//--------------------------------
//BGMを流す
mep[10] bl {
    //BGM
    @if enableDedicatedBGM.isOn bl {
        //番号を範囲内に収める
        bgmType = clamp(bgmType, 0, MAX_BGM - 1)

        @bgm.stop
        pseudoSwitchState(bgmType,
        [   0, bl {
                @bgm.play "Field 1" .opt(1000, 80, 100, 50)
            },
            1, bl {
                @bgm.play "Field 2" .opt(1000, 80, 100, 50)
            },
            2, bl {
                @bgm.play "Field 3" .opt(1000, 80, 100, 50)
            },
            3, bl {
                @bgm.play "Field 4" .opt(1000, 80, 100, 50)
            },
            4, bl {
                @bgm.play "Vehicle 1" .opt(1000, 80, 100, 50)
            },
            5, bl {
                @bgm.play "Vehicle 2" .opt(1000, 80, 100, 50)
            },
            6, bl {
                @bgm.play "Vehicle 3" .opt(1000, 80, 100, 50)
            },
            7, bl {
                @bgm.play "Ship 2" .opt(1000, 100, 100, 50)
            },
            8, bl {
                @bgm.play "Tower 3" .opt (1000, 100, 100, 50)
            },
            9, bl {
                @bgm.play "Trial" .opt (1000, 100, 100, 50)
            }
        ] )
    }
}


//--------------------------------
//パワーアップ中のBGMを流す
mep[11] bl {
    //BGM
    @if enableDedicatedBGM.isOn bl {
        //番号を範囲内に収める
        bgmType = clamp(bgmType, 0, MAX_POWERUP_BGM - 1)

        @bgm.stop
        pseudoSwitchState(bgmType,
        [   0, bl {
                @bgm.play "Battle 1" .opt(1000, 80, 100, 50)
            },
            1, bl {
                @bgm.play "Battle 2" .opt(1000, 80, 100, 50)
            },
            2, bl {
                @bgm.play "Battle 3" .opt(1000, 80, 100, 50)
            },
            3, bl {
                @bgm.play "In a Pinch" .opt(1000, 100, 100, 50)
            }
        ] )
    }
}

//--------------------------------
//ドラゴナスとムシャと森崎を復活させる
mep[12] bl {
    //ムシャとドラゴナスと森崎君を復活させる
    @if nasuHp >= NASU_HP bl {
        nasuHp = 0
        @ev.flash [MEV_NASU] .rgbv(31, 31, 31, 31) .time(5)
        @ev.setPos [MEV_NASU] .pos(NASU_X, NASU_Y) 
        @ev.setAction [MEV_NASU] .freq(8) .skippable .act {
            .faceUp
        }
    }
    @if musyaHp >= MUSYA_HP bl {
        musyaHp = 0
        @ev.flash [MEV_MUSYA] .rgbv(31, 31, 31, 31) .time(5)
        @ev.setPos [MEV_MUSYA] .pos(MUSYA_X, MUSYA_Y)
        @ev.setAction [MEV_MUSYA] .freq(8) .skippable .act {
            .faceUp
        }
    }
    @if rooftopKeeperHp >= ROOFTOP_KEEPER_HP bl {
        rooftopKeeperHp = 0
        @ev.flash [MEV_ROOFTOP_KEEPER] .rgbv(31, 31, 31, 31) .time(5)
        @ev.setPos [MEV_ROOFTOP_KEEPER] .pos(ROOFTOP_KEEPER_X, ROOFTOP_KEEPER_Y)
        @ev.setAction [MEV_ROOFTOP_KEEPER] .freq(8) .skippable .act {
            .faceRight
        }
    }
    //ジャンプスイッチをOFFにする
    jumpSwitchrState = GIM_ST_HIDE
}

//--------------------------------
//バンパーのパターンを更新する
mep[13] bl {
    @loop TOP_BUMPER_NUM .dst(localA) bl {
        localB = MEV_TOP_BUMPER_1 + localA
        @ev.setAction [localB] .freq(8) .act {}
        @ev.addAction .setBody(CHARSET_TOP_BUMPER, bumperPattern)
    }
}

//--------------------------------
//BGMを戻す
mep[14] bl {
    @if powerupTimer > UNIT_FPS {
        cm_startPowerUpBGM()
    } .else bl {
        cm_startBGM()
    }
}