
//--------------------------------
//フリーズ
def {
    FREEZE_X = 13
    FREEZE_Y = 27
    FREEZE_SECOND = 15
    ANIM_FREEZE = 7
}
mev[MEV_FREEZE] .pos(FREEZE_X, FREEZE_Y) .name("フリーズ")
mep[1] .body(CHARSET_SAVER, 6) .dir.up .anim.fixDir .trans .priority.middle bl {}
mep[2] .body(CHARSET_SAVER, 6) .dir.right .anim.fixDir.step .priority.middle .cond(v[__id(freezeState)] == GIM_ST_ACTIVATED) .parallel bl {
    //範囲内に入るまでフリーズのカウントは進まない
    @if `freezeSwitch bl {
        countDownAndChangeState(freezeState, freezeTimer, MEV_FREEZE, GIM_ST_HIDE)
    } .elif ballAreaMinX <= 16 bl {
        freezeSwitch = TRUE
    }
}
mep[3] .body(CHARSET_SAVER, 6) .dir.down .anim.fixDir.step .priority.middle .cond(v[__id(freezeState)] == GIM_ST_EVENT) .parallel bl {
    @ev.flash .self .rgbv(31, 31, 31, 31) .time(5)
    @wait(5)
    //魔法アニメ
    @anim.show [ANIM_FREEZE] {
        .self
        .buffer(ANIM_BUFFER_EFFECT)
        .reverse(0)
    }
    @wait(8)
    //玉を再生させる
    pbBallFunction(BA_FUNC_APPEAR, 0, MEV_FREEZE, GIM_LAYER_MID, 0, -8)
    pbBallFunction(BA_FUNC_SET_VEL, 0, 1 * UNIT_POS, -135 * UNIT_ANGLE, 0, 0)
    @se.play "flipper2" .opt(100, 80, 50)
    @wait(5)

    @ev.flash .self .rgbv(0, 0, 0, 31) .time(5)
    //待機状態に戻る
    freezeTimer = 0
    freezeState = GIM_ST_HIDE
}

//--------------------------------
//センターポスト
def {
    CENTER_POST_X = 9
    CENTER_POST_Y = 30
    CENTER_POST_RADIUS = 8
    CENTER_POST_POW = 1 * UNIT_POS
    CENTER_POST_FRI = 1000
    CENTER_POST_REF = 400
    CETNER_POST_ADD_SECOND = 20
}
mev[MEV_CENTER_POST] .pos(CENTER_POST_X, CENTER_POST_Y) .name("センターポスト")
mep[1] .body(CHARSET_SAVER, 4) .dir.up .anim.fixDir.step .trans .priority.low bl {}
mep[2] .body(CHARSET_SAVER, 4) .dir.right .anim.fixDir.step .priority.middle .cond(v[__id(centerPostState)] == GIM_ST_ACTIVATED) .parallel bl {
    //カウントダウン
    countDownAndChangeState(centerPostState, centerPostTimer, MEV_CENTER_POST, GIM_ST_HIDE)
    //簡易判定
    @if `!ROUGHLY_CHECK_BALL_LOW bl {
        @ev.abort
    }
    pbUpdateBumper(temA, unusedV,
    GIM_LAYER_MID, CENTER_POST_FRI, CENTER_POST_REF, CENTER_POST_POW,
    MEV_CENTER_POST, SHARP_CIRCLE, CENTER_POST_RADIUS, 0, 0, 0, 0)
    @if temA >= 0 bl {
        @ev.setAction .self .freq(6) .skippable .act {
            .pauseAnim
            .setBody (CHARSET_SAVER, 5)
            .faceUp
            .faceRight
            .faceDown
            .faceLeft
            .setBody(CHARSET_SAVER, 4)
            .faceRight
            .resumeAnim

        }
        @se.play "Jump2" .opt(100, 100, 50)

        @wait(8)
    }
}

//--------------------------------
//キックバック
def {
    KICKBACK_POW = 5 * UNIT_POS
}
//左右キックバックの共通処理
__fn kickBackCommon $dvState $eventId $x $y $block {
    //簡易判定
    @if `!ROUGHLY_CHECK_BALL_LOW bl {
        @ev.abort
    }
    //衝突判定
    pbBallToArea(temA, unusedV,
    GIM_LAYER_MID, $eventId, SHARP_RECT, 0, 0, -6, -16, 6, 0)
    @if temA >= 0 bl {
        //球を打ち上げる
        pbBallFunction(BA_FUNC_SET_VEL, temA, KICKBACK_POW, -90 * UNIT_ANGLE, 0, 0)

        //演出
        @se.play "Jump2" .opt(100, 100, 50)
        $block
        @ev.flash[$eventId] .rgbv(0, 0, 0, 31) .time(5)

        //一度使用すると消える
        v[__id($dvState)] = GIM_ST_HIDE
        @ev.abort
    }
}
//左キックバック
def {
    LEFT_KICKBACK_X = 2
    LEFT_KICKBACK_Y = 27
}
mev[MEV_LEFT_KICKBACK] .pos(LEFT_KICKBACK_X, LEFT_KICKBACK_Y) .name("左キックバック")
mep[1] .body(CHARSET_SAVER, 0) .dir.up .anim.fixDir.step .trans .priority.low bl {}
mep[2] .body(CHARSET_SAVER, 0) .dir.right .anim.fixDir.step .priority.middle .cond(v[__id(leftKickBackState)] == GIM_ST_ACTIVATED) .parallel bl {
    kickBackCommon(leftKickBackState MEV_LEFT_KICKBACK,
        LEFT_KICKBACK_X, LEFT_KICKBACK_Y, bl {
        @ev.setAction .self .freq(6) .skippable .act {
            .pauseAnim
            .setBody (CHARSET_SAVER, 1)
            .faceUp
            .faceRight
            .faceDown
            .faceLeft
            .pause
            .faceLeft
            .faceUp
            .setBody(CHARSET_SAVER, 0)
            .faceRight
            .resumeAnim

        }
        @wait(11)
    } )
}

//右キックバック
def {
    RIGHT_KICKBACK_X = 16
    RIGHT_KICKBACK_Y = 27
}
mev[MEV_RIGHT_KICKBACK] .pos(RIGHT_KICKBACK_X, RIGHT_KICKBACK_Y) .name("右キックバック")
mep[1] .body(CHARSET_SAVER, 0) .dir.down .anim.fixDir.step .trans .priority.low bl {}
mep[2] .body(CHARSET_SAVER, 0) .dir.left .anim.fixDir.step .priority.middle .cond(v[__id(rightKickBackState)] == GIM_ST_ACTIVATED) .parallel bl {
    kickBackCommon(rightKickBackState, MEV_RIGHT_KICKBACK,
        RIGHT_KICKBACK_X, RIGHT_KICKBACK_Y, bl {
        @ev.setAction .self .freq(6) .skippable .act {
            .pauseAnim
            .setBody(CHARSET_SAVER, 2)
            .faceUp
            .faceRight
            .faceDown
            .faceLeft
            .pause
            .faceLeft
            .faceUp
            .setBody(CHARSET_SAVER, 0)
            .faceLeft
            .resumeAnim
        }
        @wait(11)
    } )
}

//--------------------------------
//エンリュウ
def {
    ENRYU_X = 1
    ENRYU_Y = 20
    ENRYU_GRID = 10
    ENRYU_VEL = 10 * UNIT_POS
    ENRYU_SECOND = 30
    ENRYU_SECOND_ADD = 10
}
mev[MEV_ENRYU] .pos(ENRYU_X, ENRYU_Y) .name("エンリュウ")
mep[1] .body(CHARSET_SPINNER, 5) .dir.up .anim.fixDir.step .priority.middle bl {}
mep[2] .body(CHARSET_SPINNER, 5) .dir.up .anim.fixDir.step .priority.middle .cond(v[__id(enryuState)] == GIM_ST_ACTIVATED) .parallel bl {
    //定位置にジャンプする
    @ev.setAction .self .freq(8) .skippable .act {}
    @ev.addAction .beginThrough
    @ev.addAction .pauseAnim
    @ev.addAction .speed(SPEED_ACT_QUARTER)
    @ev.addAction .beginJump
    @ev.addAction .moveRight(8)
    @ev.addAction .endJump
    @ev.addAction .faceRight
    @wait(8)
    //回転開始
    @se.play "Fire4" .opt(100, 100, 50)
    @ev.flash .self .rgbv(31, 31, 31, 31) .time(5)

    @ev.setAction .self .freq(8) .skippable .act {
        .setBody(CHARSET_SPINNER, 6)
        .faceUp
    }
    @wait(0)
    @ev.setAction .self .freq(6) .skippable .repeat .act {
        .turnLeft
    }
    //開始
    @loop bl {
        @wait(0)
        countDownEvent(enryuTimer, MEV_ENRYU)
        @if enryuTimer <= 0 bl {
            @break
        }
        //簡易判定
        @if `ROUGHLY_CHECK_BALL_MIDDLE bl {
            //衝突判定
            pbBallToArea(temA, unusedV,
            GIM_LAYER_MID, self.id, SHARP_CIRCLE, 0, 18, 0, 0, 0, 0)
            @if temA >= 0 bl {
                //吹っ飛ぶ方向はX軸の差で決まる
                getBallPtr(temB, temA)
                temC = v[temB + MB_X] / UNIT_POS - (ev[self.id].x * MAPTILE_SIZE + 8)
                @if `abs(temC) < ENRYU_GRID bl {
                    temD = -90
                } .elif temC < 0 bl {
                    temD = -135
                } .else bl {
                    temD = -58
                }
                pbBallFunction(BA_FUNC_SET_VEL, temA, ENRYU_VEL, temD * UNIT_ANGLE, 0, 0)

                @se.play "Blow4" .opt(90, 100, 50)
                
                //少し待つ
                @wait(2)
            }
        }
    }
    //撤退
    @ev.setAction .self .freq(8) .skippable .act {
        .setBody(CHARSET_SPINNER, 5)
        .faceRight
    }
    @se.play "Ice2" .opt(100, 100, 50)
    @ev.flash .self .rgbv(0, 0, 0, 31) .time(5)
    @wait(4)
    //定位置にジャンプする
    @ev.setAction .self .freq(8) .skippable .act {}
    @ev.addAction .beginJump
    @ev.addAction .faceUp
    @ev.addAction .moveLeft(8)
    @ev.addAction .endJump
    @ev.addAction .resumeAnim
    @wait(8)
    //終了
    enryuState = GIM_ST_HIDE
}