def {
    ENEMY_FRI = 500
    ENEMY_REF = 300
    ENEMY_POW = 1 * UNIT_POS / 3
    ENEMY_RAD = 8
    ENEMY_RAD_2 = 16
}
mev[MEV_ENEMY_CHECKER] .pos(4, 0) .name("敵の判定")
mep[1] .parallel bl {
    @loop MAX_ENEMY .dst(idxA) bl {
        getEnemyPtr(ptrA, idxA)

        temA = v[ptrA + ME_STATE]
        @if temA <= EN_ST_NONE bl {
            @continue
        }

        //タイマー
        v[ptrA + ME_TIMER] += 1
        temC = v[ptrA + ME_TIMER]

        //イベントID
        temB = MEV_ENEMY_1 + idxA

        pseudoSwitchState(temA,
        [   EN_ST_ENABLE, bl {
                //簡易判定
                @if `!ROUGHLY_CHECK_BALL_LOW bl {
                    temD = -1
                //1f分の無敵時間がある
                } .elif temC < 2 bl {
                    temD = -1
                //パワーアップ中は重なるだけで吹っ飛ぶ
                } .elif `powerupTimer > 0 bl {
                    pbBallToArea(temD, unusedV,
                    GIM_LAYER_MID, temB, SHARP_CIRCLE, 0, ENEMY_RAD_2, 0, 0, 0, 0)
                } .else bl {
                    pbUpdateBumper(temD, unusedV,
                    GIM_LAYER_MID, ENEMY_FRI, ENEMY_REF, ENEMY_POW,
                    temB, SHARP_CIRCLE, ENEMY_RAD, 0, 0, 0, 0)
                }
                
                @if temD >= 0 bl {
                    //ダメージ
                    v[ptrA + ME_HP] -= (powerupTimer > 0) ? (v[ptrA + ME_HP]) : (1)

                    //無敵時間
                    v[ptrA + ME_TIMER] = 0

                    //撃破
                    @if `v[ptrA + ME_HP] <= 0 bl {
                        pbAddScore(NUM_TYPE_BONUS, BONUS_ENEMY_DEFEAT, 0)

                        //状態を変える
                        changeEnemyState(ptrA, EN_ST_DEFEAT, -1)

                        //イベントを設置しなおす
                        resetEventPositionByVar(temB)
                        //吹っ飛ぶ方向
                        temD = [DIR_EV_UPLEFT, DIR_EV_UPRIGHT][rnd(0,1)]
                        @ev.setAction [temB] .freq(8) .skippable .act {}
                        @ev.addAction .beginThrough
                        @ev.addAction .fixDir
                        @ev.addAction .speed(SPEED_ACT_QUADRUPLE)
                        @ev.addAction .move(temD, 20)
                        @ev.addAction .setBody("", 0)

                        @ev.flash [temB] .rgbv(31, 31, 31, 31) .time(4)
                        @se.play "Blow3" .opt(100, 100, 50)

                    //ダメージ
                    } .else bl {
                        pbAddScore(NUM_TYPE_BONUS, BONUS_ENEMY_DAMAGE, 0)
                        
                        @ev.flash [temB] .rgbv(31, 31, 31, 31) .time(4)
                        @se.play "Damage2" .opt(100, 100, 50)
                    }
                }
            },
            //登場
            EN_ST_JUMP, bl {
                //判定開始
                @if temC > 0 bl {
                    changeEnemyState(ptrA, EN_ST_ENABLE, 2)

                //繰り返し移動の開始
                } .elif temC == 0 bl {
                    temD = v[ptrA + ME_PATTERN]
                    pseudoSwitchState(temD,
                    [   EN_PAT_LEFT, bl {
                            @ev.setAction [temB] .freq(8) .repeat .skippable .act {
                                .moveRight
                                .moveUp
                                .moveUp
                                .moveUp
                                .moveLeft
                                .moveDown
                                .moveDown
                                .moveDown
                            }
                        },
                        EN_PAT_RIGHT, bl {
                            @ev.setAction [temB] .freq(8) .repeat .skippable .act {
                                .moveLeft
                                .moveUp
                                .moveUp
                                .moveUp
                                .moveRight
                                .moveDown
                                .moveDown
                                .moveDown
                            }
                        }
                    ] ) 
                }
            },
            //吹っ飛び
            EN_ST_DEFEAT, bl {
                //一秒後に消える
                @if temC >= 60 bl {
                    changeEnemyState(ptrA, EN_ST_NONE, -1)
                }
            },
            //待機と初動
            EN_ST_INIT, bl {
                @if temC >= 0 bl {
                    @se.play "Jump1" .opt(90, 100, 50)

                    temD = v[ptrA + ME_PATTERN]
                    pseudoSwitchState(temD,
                    [   EN_PAT_LEFT, bl {
                            @ev.setPos [temB] .pos(1, 22)

                            temE = 0 + idxA % 4
                            @ev.setAction [temB] .freq(8) .skippable .act {}
                            @ev.addAction .beginThrough
                            @ev.addAction .unfixDir
                            @ev.addAction .setBody(CHARSET_ENEMY_1, temE)
                            @ev.addAction .speed(SPEED_ACT_QUARTER)//32f

                            @ev.addAction .beginJump
                            @ev.addAction .move(DIR_EV_RIGHT, 4)
                            @ev.addAction .move(DIR_EV_UP, 1)
                            @ev.addAction .endJump

                            changeEnemyState(ptrA, EN_ST_JUMP, -22 - 1)
                        },
                        EN_PAT_RIGHT, bl {
                            @ev.setPos [temB] .pos(17, 22)

                            temE = 4 + idxA % 4
                            @ev.setAction [temB] .freq(8) .skippable .act {}
                            @ev.addAction .beginThrough
                            @ev.addAction .unfixDir
                            @ev.addAction .setBody(CHARSET_ENEMY_1, temE)
                            @ev.addAction .speed(SPEED_ACT_QUARTER)//32f
                            
                            @ev.addAction .beginJump
                            @ev.addAction .move(DIR_EV_LEFT, 4)
                            @ev.addAction .move(DIR_EV_UP, 1)
                            @ev.addAction .endJump

                            changeEnemyState(ptrA, EN_ST_JUMP, -22 - 1)
                        }
                    ] )                            
                }
            }
        ] )
    }
}

//--------------------------------
//敵シンボル
__loop MAX_ENEMY $idx bl {
    mev[MEV_ENEMY_1 + $idx] .pos(5 + $idx, 0) .name(__str("敵 ", $idx))
    mep[1] .dir.down .anim.step .priority.middle bl {}
}