//--------------------------------
//門番
def {
    GATE_KEEPER_FRI = 900
    GATE_KEEPER_REF = 400
    GATE_KEEPER_POW = 1 * UNIT_POS
    GATE_KEEPER_X = 4
    GATE_KEEPER_Y = 9
}
mev[MEV_GATE_KEEPER] .pos(GATE_KEEPER_X, GATE_KEEPER_Y) .name("門番")
mep[1] .body(CHARSET_LEADER_2, 6) .dir.right .anim.fixDir .priority.middle .trans bl {}
mep[2] .body(CHARSET_LEADER_2, 6) .dir.up .anim.fixDir.step .priority.middle .cond(v[__id(gateKeeperState)] == GIM_ST_ACTIVATED) .parallel bl {
    //初期位置に移動させる
    @ev.setPos .self .pos(GATE_KEEPER_X - 1, GATE_KEEPER_Y + 2)
    //ゲームの状態が変わるまで待つ
    @while sceneState != SC_ST_PLAY bl {
        @wait(0)
    }
    //移動する
    @ev.setAction .self .freq(8) .skippable .act {
        .beginThrough
        .moveRight
        .moveUp
        .moveUp
    }
    @wait(9)

    @loop bl {
        @wait(0)

        $bit = (ICON_BIT_DAERO | ICON_BIT_GOSEI | ICON_BIT_MUSYA | ICON_BIT_NASU)
        @if `(iconFlag & $bit) == $bit bl {
            @ev.flash .self .rgbv(31, 31, 31, 31) .time(5)
            pbDisplay(DI_ST_ZOOM, __str("\c[2]ボーナスステージ解禁！"))
            @wait(5)
            @ev.setAction .self .freq(8) .skippable .act {
                .beginThrough
                .moveDown
                .moveDown
                .moveLeft
            }
            @wait(9)

            gateKeeperState = GIM_ST_HIDE
            @ev.abort
        }

        //簡易判定
        @if `ROUGHLY_CHECK_BALL_HIGH bl {
            //判定
            //一方向にのみ作用する
            pbBallToArea(temA, temB,
            GIM_LAYER_MID, self.id, SHARP_RECT, 60, 0, -24, -24, 24, 24)
            @if temB <= 0 bl {
                pbUpdateBumper(temA, unusedV,
                GIM_LAYER_MID, GATE_KEEPER_FRI, GATE_KEEPER_REF, GATE_KEEPER_POW,
                self.id, SHARP_SEGMENT, 0, -20, 8, 20, -8)
                @if temA >= 0 bl {
                    //スコア
                    pbAddScore(NUM_TYPE_BONUS, BONUS_GATE_KEEPER, 0)

                    @ev.flash .self .rgbv(31, 31, 31, 31) .time(5)
                    @se.play "Sword2" .opt(90, 100, 50)
                }
            }
        }
    }
}

//--------------------------------
//ドラゴン+ダーエロ
//デスシープ+死神五世
def {
    SIDE_ENEMY_FRI  = 900
    SIDE_ENEMY_REF  = 500
    SIDE_ENEMY_POW  = 1 * UNIT_POS
    SIDE_ENEMY_HP   = 3
    SIDE_ENEMY_REIN = 4
}
mev[MEV_DAERO] .pos(2, 18) .name("ドラゴンandダーエロ")
mep[1] .body(CHARSET_LEADER_1, 0) .dir.up .anim.fixDir.step .priority(.middle) .parallel bl {
    //HPが少なくなると点滅する
    @if `!(effectTimer % 60) bl {
        @if `daeroHp % SIDE_ENEMY_HP == SIDE_ENEMY_HP - 1 bl {
            @ev.flash .self .rgbv(31, 31, 31, 24) .time(3)
        }
    }
    
    //簡易判定
    @if `!ROUGHLY_CHECK_BALL_MIDDLE bl {
        @ev.abort
    }
    //a:hit id b:pattern
    pbUpdateBumper(temA, unusedV,
    GIM_LAYER_MID, SIDE_ENEMY_FRI, SIDE_ENEMY_REF, SIDE_ENEMY_POW,
    self.id, SHARP_SEGMENT, 2, 0,-20, 0, 8)
    @if temA >= 0 bl {
        //ダメージ
        daeroHp += 1
        //交代する
        @if `!(daeroHp % SIDE_ENEMY_HP) bl {
            //キックバックを起動する
            @if leftKickBackState != GIM_ST_ACTIVATED bl {
                _activateLeftKickBack()
                pbDisplay(DI_ST_NORMAL, __str("\c[2]左キックバックを起動"))
            }
            //四天王を撃破
            @if `daeroHp >= SIDE_ENEMY_HP * 2 bl {
                daeroHp = 0
                //既に一度倒している場合はボーナスに代わる
                @if `iconFlag & ICON_BIT_DAERO bl {
                    pbAddScore(NUM_TYPE_BONUS, BONUS_SIDE_ENEMY_DEFEAT, 0)
                } .else bl {
                    pbAddScore(NUM_TYPE_MULTI, MULTI_LEADER, 0)
                    iconOn(ICON_BIT_DAERO)
                    pbDisplay(DI_ST_ZOOM, __str("\c[2]ダーエロを撃破！"))
                }
            } .else bl {
                pbAddScore(NUM_TYPE_BONUS, BONUS_SIDE_ENEMY_DEFEAT, 0)
            }

            //ファルコンミッション
            temA = FALCON_AREA_LEFT_ENEMY
            cm_falconMission()
            
            @se.play "hit_db" .opt(100, 100, 50)
            @ev.flash .self .rgbv(31, 31, 31, 31) .time(5)

            //ヒットストップ
            hitStopTimer = 12
            @wait .frame(12)

            //ドラゴンの時は雑魚敵を発生させる
            //@if daeroHp == SIDE_ENEMY_HP bl {
                temA = EN_PAT_LEFT
                cm_addEnemys()
            //}

            //後退
            @ev.setAction .self .freq(8) .skippable .act {
                .beginThrough
                .faceDown
                .moveLeft
            }
            @wait(8)
            //交代
            //条件を満たすと女体化or代理
            temB = 0 + daeroHp / SIDE_ENEMY_HP + ((daeroHp / SIDE_ENEMY_HP == 1 && COND_FEMINIZATION) ? 1 : 0)
            @ev.setAction .self .freq(8) .skippable .act {}
            @ev.addAction .setBody(CHARSET_LEADER_1, temB)
            .addAction .faceUp
            .addAction .move(DIR_EV_RIGHT, 1)
            @se.play "Evade2" .opt(100, 100, 50)
            @ev.flash .self .rgbv(31, 31, 31, 31) .time(5)
            @wait(2)
        
        } .else bl {
            //スコア
            pbAddScore(NUM_TYPE_BONUS, BONUS_SIDE_ENEMY_DAMAGE, 0)
            //怯む
            @ev.setAction .self .freq(8) .skippable .act {
                .faceRight
                .pause
                .pause
                .faceUp
            }
            @se.play "Damage1" .opt(100, 100, 50)
            @ev.flash .self .rgbv(31, 31, 31, 31) .time(5)
            @wait(2)
        }
    }
}

mev[MEV_GOSEI] .pos(16, 18) .name("デスシープand死神五世")
mep[1] .body(CHARSET_LEADER_1, 4) .dir.up .anim.fixDir.step .priority(.high) .parallel bl {
    //HPが少なくなると点滅する
    @if `!(effectTimer % 60) bl {
        @if `goseiHp % SIDE_ENEMY_HP == SIDE_ENEMY_HP - 1 bl {
            @ev.flash .self .rgbv(31, 31, 31, 24) .time(3)
        }
    }

    //簡易判定
    @if `!ROUGHLY_CHECK_BALL_MIDDLE bl {
        @ev.abort
    }
    //a:hit id b:pattern
    pbUpdateBumper(temA, unusedV,
    GIM_LAYER_MID, SIDE_ENEMY_FRI, SIDE_ENEMY_REF, SIDE_ENEMY_POW,
    self.id, SHARP_SEGMENT, 2, 0,-20, 0, 8)
    @if temA >= 0 bl {
        //ダメージ
        goseiHp += 1
        //交代する
        @if `!(goseiHp % SIDE_ENEMY_HP) bl {
            //キックバックを起動する
            @if rightKickBackState != GIM_ST_ACTIVATED bl {
                _activateRightKickBack()
                pbDisplay(DI_ST_NORMAL, __str("\c[2]右キックバックを起動"))
            }

            //四天王を撃破
            @if `goseiHp >= SIDE_ENEMY_HP * 2 bl {
                goseiHp = 0
                //既に一度倒している場合はボーナスに代わる
                @if `iconFlag & ICON_BIT_GOSEI bl {
                    pbAddScore(NUM_TYPE_BONUS, BONUS_SIDE_ENEMY_DEFEAT, 0)
                } .else bl {
                    pbAddScore(NUM_TYPE_MULTI, MULTI_LEADER, 0)
                    iconOn(ICON_BIT_GOSEI)
                    pbDisplay(DI_ST_ZOOM, __str("\c[2]死神五世を撃破！"))
                }
            } .else bl {
                pbAddScore(NUM_TYPE_BONUS, BONUS_SIDE_ENEMY_DEFEAT, 0)
            }

            //ファルコンミッション
            temA = FALCON_AREA_RIGHT_ENEMY
            cm_falconMission()

            @se.play "hit_db" .opt(100, 100, 50)
            @ev.flash .self .rgbv(31, 31, 31, 31) .time(5)

            //ヒットストップ
            hitStopTimer = 12
            @wait .frame(12)

            //デスシープの時は雑魚敵を発生させる
            //@if goseiHp == SIDE_ENEMY_HP bl {
                temA = EN_PAT_RIGHT
                cm_addEnemys()
            //}

            //後退
            @ev.setAction .self .freq(8) .skippable .act {
                .beginThrough
                .faceDown
                .moveRight
            }
            @wait(8)
            //交代
            //条件を満たすと女体化or代理
            temB = 4 + goseiHp / SIDE_ENEMY_HP + ((goseiHp / SIDE_ENEMY_HP == 1 && COND_FEMINIZATION) ? 1 : 0)
            @ev.setAction .self .freq(8) .skippable .act {}
            @ev.addAction .setBody(CHARSET_LEADER_1, temB)
            .addAction .faceUp
            .addAction .move(DIR_EV_LEFT, 1)
            @se.play "Evade2" .opt(100, 100, 50)
            @ev.flash .self .rgbv(31, 31, 31, 31) .time(5)
            @wait(2)
        
        } .else bl {
            //スコア
            pbAddScore(NUM_TYPE_BONUS, BONUS_SIDE_ENEMY_DAMAGE, 0)
            //後退
            @ev.setAction .self .freq(8) .skippable .act {
                .faceRight
                .pause
                .pause
                .faceUp
            }
            @se.play "Damage1" .opt(100, 100, 50)
            @ev.flash .self .rgbv(31, 31, 31, 31) .time(5)
            @wait(2)
        }
    }
}

//--------------------------------
//ムシャ
def {
    MUSYA_X = 1
    MUSYA_Y = 11
    MUSYA_FRI = 900
    MUSYA_REF = 500
    MUSYA_POW = 2 * UNIT_POS
    MUSYA_HP = 3
}
mev[MEV_MUSYA] .pos(MUSYA_X, MUSYA_Y) .name("ムシャ")
mep[1] .body(CHARSET_LEADER_2, 0) .dir.up .anim.fixDir .priority.middle .parallel bl {
    //体力
    @if musyaHp >= MUSYA_HP bl {
        @ev.abort
    }

    //簡易判定
    @if `!ROUGHLY_CHECK_BALL_HIGH bl {
        @ev.abort
    }

    //切り払い判定
    pbUpdateBumper(temA, unusedV,
    GIM_LAYER_MID, SIDE_ENEMY_FRI, SIDE_ENEMY_REF, SIDE_ENEMY_POW,
    self.id, SHARP_SEGMENT, 2, -16,6, 24,-8)
    @if temA >= 0 bl {
        //スコア
        pbAddScore(NUM_TYPE_BONUS, BONUS_MUSYA_REFLECT, 0)

        //切りはらう
        __fn _musyaAttackAction $char1 $char2 {
            @ev.setAction .self .freq(7) .skippable .act {
                .setBody(CHARSET_LEADER_2, $char1)
                .pauseAnim
                .faceUp
                .faceRight
                .faceDown
                .pause
                .pause
                .faceLeft
                .setBody(CHARSET_LEADER_2, $char2)
                .faceUp
                .resumeAnim
            }
        }
        @if `COND_FEMINIZATION bl {
            _musyaAttackAction(3,1)
        } .else bl {
            _musyaAttackAction(2,0)
        }
        @se.play "Sword2" .opt(100, 100, 50)
        @wait(4)

    } .else bl {
        //球が下方向に移動していた場合
        pbBallToArea(temA, temB,
        GIM_LAYER_MID, self.id, SHARP_RECT, 90, 0, -16, -40, 16, -8)
        @if `temA >= 0 && temB > 0 bl {
            musyaHp += 1
            //撃破
            @if musyaHp >= MUSYA_HP bl {
                //スコア
                pbAddScore(NUM_TYPE_MULTI, MULTI_LEADER, 0)
                iconOn(ICON_BIT_MUSYA)
                pbDisplay(DI_ST_ZOOM, __str("\c[2]ムシャを撃破！"))

                @se.play "hit_db" .opt(100, 100, 50)
                @ev.flash .self .rgbv(31, 31, 31, 31) .time(5)

                //ヒットストップ
                hitStopTimer = 12
                @wait .frame(12)

                //左に一歩移動する
                __fn _musyaDefeatAction $char {
                    @ev.setAction .self .freq(8) .skippable .act {
                        .setBody(CHARSET_LEADER_2, $char)
                        .beginThrough
                        .faceRight
                        .beginJump
                        .moveLeft
                        .endJump
                        .faceDown
                        .pause
                        .pause
                        .pause
                        .faceLeft
                        .beginJump
                        .endJump
                    }
                }
                @if `COND_FEMINIZATION bl {
                    _musyaDefeatAction(1)
                } .else bl {
                    _musyaDefeatAction(0)
                }

                @wait(10)
            //ダメージ
            } .else bl {
                //スコア
                pbAddScore(NUM_TYPE_BONUS, BONUS_MUSYA_DAMAGE, 0)
                //のけ反り
                __fn _musyaDamageAction $char {
                    @ev.setAction .self .freq(8) .skippable .act {
                        .setBody(CHARSET_LEADER_2, $char)
                        .faceRight
                        .beginJump
                        .endJump
                        .pause
                        .pause
                        .faceUp
                    }
                }
                @if `COND_FEMINIZATION bl {
                    _musyaDamageAction(1)
                } .else bl {
                    _musyaDamageAction(0)
                }

                @se.play "Damage1" .opt(100, 100, 50)
                @ev.flash .self .rgbv(31, 31, 31, 31) .time(5)
                @wait(4)
            }
        }
    }
}

//--------------------------------
//ドラゴナス
//判定は別のイベントで行う
def {
    NASU_X = 1
    NASU_Y = 2
    NASU_HP = 3
}
mev[MEV_NASU] .pos(NASU_X, NASU_Y) .name("ドラゴナス")
mep[1] .body(CHARSET_LEADER_2, 4) .dir.up .anim.fixDir.step .priority.high bl {}

//--------------------------------
//ヘレン
mev[MEV_HELEN] .pos(6, 3) .name("ヘレン")
mep[1] .body(CHARSET_HOLE, 4) .dir.up .anim.fixDir.step .priority.high bl {}