//--------------------------------
//分身や弾丸を更新する
mev[MEV_ATTACK] .pos(13, 0) .name("分身や攻撃")
mep[1] .parallel bl {
    @loop bl {
        @wait(0)

        bossAttackCount = 0
        @loop MAX_ATTACK .dst(idxA) bl {
            getAttackPtr(ptrA, idxA)
            //状態
            temA = v[ptrA + MA_STATE]
            @if temA <= AT_ST_NONE bl {
                @continue
            }
            //タイマー
            v[ptrA + MA_TIMER] += 1
            temB = v[ptrA + MA_TIMER]
            //タイプ
            temC = v[ptrA + MA_TYPE]
            //ピクチャID
            temD = PIC_ATTACK + idxA
            //ピクチャを消去
            @if temA == AT_ST_DELETE bl {
                hidePicture(temD)
                changeAttackState(ptrA, AT_ST_NONE)
                @continue
            }
            //現在のピクチャの座標
            @pic.getInfo [temD] .currentRect(temE, temF, 0, 0) .cewh

            //カウント
            bossAttackCount += 1

            //ニンニンの分身
            @if `between(temC, AT_TY_ALTER, AT_TY_ALTER_ITEM) bl {
                pseudoSwitchState(temA,
                [   AT_ST_ENABLE, bl {
                        //イベント中、登場直後は判定が無い
                        @if `eventMode || temB < 30 bl {
                            @break
                        }
                        //衝突判定
                        //パワーアップ中は重なるだけで吹っ飛ぶ                    
                        @if powerupTimer > 0 bl {
                            pbBallToArea(temG, unusedV,
                            GIM_LAYER_MID, 0, SHARP_CIRCLE, 0, BOSS1_RAD + BA_RAD, temE, temF, 0, 0)
                        } .else bl {
                            pbUpdateBumper(temG, unusedV,
                            GIM_LAYER_MID, BOSS1_FRI, BOSS1_REF, BOSS1_POW,
                            0, SHARP_CIRCLE, BOSS1_RAD, temE, temF, 0, 0)
                        }
                        @if temG >= 0 bl {
                            pbAddScore(NUM_TYPE_BONUS, BONUS_BOSS1_DAMAGE, 0)

                            //効果音
                            @se.play "Blow3" .opt(100, 100, 50)

                            //本体がやられると分身が全て吹っ飛ぶ
                            @if temC == AT_TY_ALTER_BODY bl {
                                bossState = NIN_ST_BREAKDOWN

                            //分身
                            } .else bl {
                                @if temC == AT_TY_ALTER_ITEM bl {
                                    @if ballCount < 2 bl {
                                        _activateMultiBall()
                                    }
                                }

                                //左右どちらかに吹っ飛ぶ
                                @if `rnd(0, 1) == 0 bl {
                                    @pic.move [temD] .relative .pos(-240, -240) .scale(0) .trans(100) .time(4) .keepBlend
                                } .else bl {
                                    @pic.move [temD] .relative .pos( 240, -240) .scale(0) .trans(100) .time(4) .keepBlend
                                }

                                changeAttackState(ptrA, AT_ST_DEFEAT)
                            }
                        }
                    },
                    AT_ST_DEFEAT, bl {
                        @if temB > 16 bl {
                            changeAttackState(ptrA, AT_ST_DELETE)
                        }
                    }
                ] )
            //魔王の攻撃
            } .elif `between(temC, AT_TY_EXPLO_EFF, AT_TY_TORNADE) bl {
                pseudoSwitchState(temC,
                    //爆発エフェクト
                [   AT_TY_EXPLO_EFF, bl {
                        @if temB >= 4 * 4 - 1 bl {
                            changeAttackState(ptrA, AT_ST_DELETE)
                        }
                    },
                    //ダークネスエフェクト
                    AT_TY_DARKNESS_EFF, bl {
                        @if temB >= 4 * 8 - 1 bl {
                            changeAttackState(ptrA, AT_ST_DELETE)
                        }
                    },
                    //フレイム
                    //下方向に吹き飛ばす
                    AT_TY_FLAME, bl {
                        @if temB >= 48 bl {
                            changeAttackState(ptrA, AT_ST_DELETE)
                        } .elif powerupTimer <= 0 bl {
                            pbUpdateForce(unusedV, unusedV,
                            GIM_LAYER_MID, BOSS2_FLAME_POW, v[ptrA + MA_PARAM],
                            0, SHARP_CIRCLE, BOSS2_FLAME_RAD, temE, temF, 0, 0)
                        }
                    },
                    //スパーク
                    //しばらく留まり時間で消える
                    AT_TY_SPARK, bl {
                        @if temA == AT_ST_DEFEAT bl {
                            @if temB > 12 bl {
                                changeAttackState(ptrA, AT_ST_DELETE)
                            }
                        //しばらく留まり、時間で消える
                        } .elif temB >= 6 * UNIT_FPS bl {
                            @pic.move[temD] .relative .pos(0, 0) .scale(50) .trans(100) .time(2) .keepBlend
                            changeAttackState(ptrA, AT_ST_DEFEAT)
                        //判定が行われるまで間がある
                        } .elif `temB >= 18 && powerupTimer <= 0 bl {
                            pbUpdateBumper(temG, unusedV,
                            GIM_LAYER_MID, BOSS2_SPARK_FRI, BOSS2_SPARK_REF, BOSS2_SPARK_POW,
                            0, SHARP_CIRCLE, BOSS2_SPARK_RAD, temE, temF, 0, 0)
                            @if temG >= 0 bl {
                                @se.play "Thunder3" .opt(90, 100, 50)
                                @pic.move[temD] .relative .pos(0, 0) .scale(50) .trans(100) .time(2) .keepBlend
                                changeAttackState(ptrA, AT_ST_DEFEAT)
                            }
                        }
                    },
                    //トルネード
                    //移動方向に吹き飛ばす
                    AT_TY_TORNADE, bl {
                        @if temB >= 90 bl {
                            changeAttackState(ptrA, AT_ST_DELETE)
                        } .elif powerupTimer <= 0 bl {
                            pbUpdateForce(unusedV, unusedV,
                            GIM_LAYER_MID, BOSS2_TORNADE_POW, v[ptrA + MA_PARAM],
                            0, SHARP_CIRCLE, BOSS2_TORNADE_RAD, temE, temF, 0, 0)
                        }
                    },
                ] )
            }
        }
    }
}

//--------------------------------
//ボス
mev[MEV_BOSS] .pos(14, 0) .name("ボス")

//--------------------------------
//ニンニン
def {
    BOSS1_HP    = 4
    BOSS1_RAD   = 8
    BOSS1_FRI   = 800
    BOSS1_REF   = 200
    BOSS1_POW   = 1 * UNIT_POS / 2
    BOSS1_ROW   = 8
    BOSS1_MOVE  = 8
    BOSS1_PHASE = 4
}
mep[1] .body(CHARSET_BOSS_1, 0) .dir.left .anim.fixDir .priority.middle .cond(v[__id(bonusGameMode)] == BONUSGAME_NINNIN) .parallel bl {
    //--------------------------------
    //登場
    @wait(10)
    @se.play "jump_anim" .opt(60, 150, 50)
    @ev.flash .self .rgbv(0, 0, 0, 31) .time(5)
    
    @ev.setPos .pos(9, 2) .self
    @ev.setAction .self .freq(8) .skippable .act {
        .beginThrough
        .faceDown
        .speedUp
        .speedUp
        .speedUp
        .moveDown
        .moveDown
        .moveDown
        .moveDown
        .speedDown
        .speedDown
        .speedDown
        .faceRight
    }
    @wait(8)
    @se.play "Magic2" .opt(100, 100, 50)
    @ev.setAction .self .freq(8) .skippable .act {
        .faceUp
    }
    @wait(12)
    @ev.setAction .self .freq(8) .skippable .act {
        .faceLeft
    }

    //--------------------------------
    //ボス戦開始
    cm_addBall()
    cm_resumeSpectatorsAnim()
    endEventMode()
    startBGM("Boss 1", FALSE, 0, 100, 100, 50)

    bossHp = BOSS1_HP
    bossState = NIN_ST_ENABLE

    //--------------------------------
    @loop bl {
        //--------------------------------
        //分身開始
        @se.play "Flash1" .opt(100, 80, 50)
        @scr.flash .once(4) .rgbv(31, 31, 31, 31)
        
        //位置を初期化する
        V2_set(bossX, 0, 0)

        //分身の補充
        //分身の数
        temA = [0, 32, 32, 24, 16][bossHp]
        //玉を補充するお助けキャラの位置(2行目以降)
        temB = rnd(BOSS1_ROW, temA - 1)
        //本物(1行目)
        temC = (bossHp == 1) ? rnd(0, BOSS1_ROW - 1) : (-1)

        @loop temA .dst(idxA) bl {
            getAttackPtr(ptrA, idxA)
            //タイプとアニメーション
            @if idxA == temC bl {
                temD = AT_TY_ALTER_BODY
                temG = 1
                temH = 4

            } .elif idxA == temB bl {
                temD = AT_TY_ALTER_ITEM
                temF = (bossHp % 4) * 4
                temG = 25 + temF
                temH = 25 + 3 + temF

            } .else bl {
                temD = AT_TY_ALTER
                temF = (idxA % 5) * 4
                temG = 5 + temF
                temH = 5 + 3 + temF
            }
            //ピクチャID
            temF = PIC_ATTACK + idxA
            @pic.show[temF] .pos(CENTER_X, CENTER_Y) .trans(100) .rangeAnim(16, temG, temH) ninPicCmd
            //設置
            initAttack(ptrA, bl {
                $state = AT_ST_ENABLE
                $timer = -1
                $type = temD
                $param = 1
            } )

            //
            bossAttackCount += 1
        }
        //--------------------------------
        //分身がいなくなるまでループする
        @loop bl {
            //分身の位置を変える
            temA = bossY % 2 == 0 ? -1 : 1
            @if `!between(bossX + temA, 0, 4) bl {
                bossY += 1
                bossY %= 4
            } .else bl {
                bossX += temA
            }
            //ピクチャを移動させる
            @loop MAX_ATTACK .dst(idxA) bl {
                getAttackPtr(ptrA, idxA)
                @if `v[ptrA + MA_STATE] == AT_ST_ENABLE bl {
                    temD = PIC_ATTACK + idxA
                    V2_set(temF,
                        52 + (idxA % BOSS1_ROW) * 24 + bossX * BOSS1_MOVE,
                        32 + (idxA / BOSS1_ROW) * 20 + bossY * BOSS1_MOVE
                    )
                    @pic.move[temD] .pos(temF, temG) .center .time(5)
                }
            }
            //分身の数を判定しながら1秒待機する
            @loop UNIT_FPS bl {
                @if `bossAttackCount <= 0 || bossState == NIN_ST_BREAKDOWN bl {
                    @break(2)
                }
                @wait(0)
            }
        }

        //リスキルを防止する為、玉を下斜め方向に吹っ飛ばす
        @se.play "Darkness6" .opt(80, 120, 50)
        @scr.flash .once(4) .rgbv(0, 0, 0, 8)

        @loop MAX_BALL .dst(idxA) bl {
            getBallPtr(ptrA, idxA)
            @if `v[ptrA + MB_STATE] == BA_ST_ENABLE bl {
                temA = ((v[ptrA + MB_X] / UNIT_POS) > CENTER_X) ? (-1) : (1)
                pbBallFunction(BA_FUNC_SET_VEL, idxA, 3 * UNIT_POS, (90 + 45 * temA) * UNIT_ANGLE, 0, 0)
            }
        }

        //--------------------------------
        //次のフェイズへ
        bossHp -= 1
        //全フェイズ終了
        @if bossHp <= 0 bl {
            @break
        }
        //少し待ってから次のフェイズへ
        @wait(5)
    }

    //--------------------------------
    //撃破
    startEventMode()

    //ピクチャの動きを止める
    @loop MAX_ATTACK .dst(idxB) bl {
        getAttackPtr(ptrB, idxB)
        @if `v[ptrB + MA_STATE] == AT_ST_ENABLE bl {
            temD = PIC_ATTACK + idxB
            //ピクチャを設置しなおす
            @pic.getInfo [temD] .currentRect(temF, temG, 0, 0) .cewh
            @pic.move [temD] .pos(temF, temG) .scale(100) .trans(0)
        }
    }

    @se.play "Thunder10" .opt(90, 100, 50)
    @scr.flash .once(2) .rgbv(31, 31, 31, 31)
    @wait(8)

    @se.play "Explosion7" .opt(100, 100, 50)
    @scr.flash .once(2) .rgbv(31, 31, 31, 16)
    @scr.shake .once(4) .value(2, 7)

    //他の分身を吹っ飛ばす
    @loop MAX_ATTACK .dst(idxB) bl {
        getAttackPtr(ptrB, idxB)
        @if `v[ptrB + MA_STATE] == AT_ST_ENABLE bl {
            //左右どちらかに吹っ飛ぶ
            temD = PIC_ATTACK + idxB
            @if `rnd(0, 1) == 0 bl {
                @pic.move [temD] .relative .pos(-240, -240) .scale(0) .trans(100) .time(6)
            } .else bl {
                @pic.move [temD] .relative .pos( 240, -240) .scale(0) .trans(100) .time(6)
            }
            changeAttackState(ptrB, AT_ST_DEFEAT)
        }
    }
    @wait(10)

    //倒した
    changeSceneState(SC_ST_WINS)
    
    //--------------------------------
    //終端
    @loop bl {
        @wait(10)
    }
}

//--------------------------------
//魔王
//攻撃の空き場所を探すのが面倒なのでIDを固定する
def {
    BOSS2_X          = CENTER_X
    BOSS2_Y          = CENTER_Y - 24
    BOSS2_HP         = 15000
    BOSS2_RAD        = 25
    BOSS2_OX         = 0
    BOSS2_OY         = 12
    BOSS2_FRI        = 800
    BOSS2_REF        = 200
    BOSS2_MIN        = 2 * UNIT_POS
    BOSS2_POW        = 1 * UNIT_POS / 2
    BOSS2_DAMAGE_EFF = 8

    BOSS2_DARKNESS_POW = -9 * UNIT_POS
    BOSS2_DARKNESS_POW2=  1 * UNIT_POS / 4
    BOSS2_FLAME_POW    = 1 * UNIT_POS / 2
    BOSS2_FLAME_RAD    = 16

    BOSS2_SPARK_RAD = 12
    BOSS2_SPARK_POW = 2 * UNIT_POS
    BOSS2_SPARK_FRI = 800
    BOSS2_SPARK_REF = 200

    BOSS2_TORNADE_POW = 1 * UNIT_POS / 4
    BOSS2_TORNADE_RAD = 72

    BOSS2_ID_EXPLO    = 0
    BOSS2_ID_DARKNESS = 0
    BOSS2_ID_FLAME    = 0
    BOSS2_ID_SPARK    = 8
    BOSS2_ID_TORNADE  = 12

}
mep[2] .body(CHARSET_BOSS_1, 1) .dir.up .anim.fixDir .priority.middle .cond(v[__id(bonusGameMode)] == BONUSGAME_MAOU) .parallel bl {
    //--------------------------------
    //登場
    @ev.setPos .pos(9, 5) .self
    @ev.flash .self .rgbv(0, 0, 0, 31) .time(10)
    @wait(12)
    @se.play "jump_anim" .opt(60, 100, 50)
    @ev.setAction .self .freq(5) .skippable .act {
        .beginThrough
        .faceRight
        .faceDown
        .faceLeft
        .setBody(CHARSET_BOSS_1, 2)
        .faceUp
        .faceRight
    }
    @wait(8)
    @se.play "Magic2" .opt(100, 100, 50)
    @ev.flash .self .rgbv(31, 31, 31, 31) .time(5)
    @ev.setAction .self .freq(8) .skippable .act {
        .faceDown
    }
    @wait(10)
    @se.play "Flash3" .opt(100, 100, 50)
    @ev.setAction .self .freq(8) .skippable .act {
        .faceLeft
    }
    @scr.flash .once(4) .rgbv(31, 31, 31, 31)
    @pic.show[PIC_BOSS] .pos(CENTER_X, CENTER_Y - 24) .center .scale(30) .trans(0) .rgbs(200, 200, 200, 100) .rangeAnim(12, 1, 3) maouPicCmd
    @pic.move[PIC_BOSS] .relative .pos(0, 0) .scale(70) .trans(0) .keepRgbs .time(8)
    @wait(10)
    @pic.move[PIC_BOSS] .relative .pos(0, 0) .scale(0) .trans(0) .rgbs(100, 100, 100, 100) .time(5)
    @wait(5)
    startBGM("Boss 3", FALSE, 0, 100, 100, 50)
    @wait(5)

    //登場演出を省略
    //@pic.show[PIC_BOSS] .pos(BOSS2_X, BOSS2_Y) .center .scale(100) .trans(0) .rangeAnim(12, 1, 3) maouPicCmd

    //--------------------------------
    //ボス戦開始
    cm_addBall()
    cm_resumeSpectatorsAnim()
    endEventMode()

    bossState = MAO_ST_WAIT
    bossHp = BOSS2_HP
    bossPos = 1
    bossPattern = 0
    V2_set(bossX, BOSS2_X, BOSS2_Y)

    //--------------------------------
    //ループ
    @loop bl {
        @wait(0)

        //タイマー
        bossTimer += 1

        //衝突判定
        pbUpdateBumper(temE, temF,
        GIM_LAYER_MID, BOSS2_FRI, BOSS2_REF, BOSS2_POW,
        0, SHARP_CIRCLE, BOSS2_RAD, bossX + BOSS2_OX, bossY + BOSS2_OY, 0, 0)
        
        //一部の攻撃中は無敵になる
        @if `bossState == MAO_ST_DARKNESS && bossTimer < 90 bl {
            temE = -1
        }

        //ある程度の勢いが無いと無視される
        @if `temE >= 0 && -temF > BOSS2_MIN bl {
            //効果音
            @se.play "Damage1" .opt(90, 100, 50)
            //ダメージエフェクト
            bossDamage = BOSS2_DAMAGE_EFF
            //威力は速度に比例する
            //最低威力も設定しておく
            temA = bossHp
            temB = muldiv(abs(temF), (powerupTimer > 0 ? 2 : 1) * 100, UNIT_POS)

            bossHp -= temB

            //ダメージ表示
            temC = bossY + 32
            @pic.strpic [PIC_DAMAGE] __str("\", temB) .pos(bossX, temC) .bottom .trans(-300) .bold strPicCmd
            @pic.move [PIC_DAMAGE] .relative .pos(0, -8) .trans(400) .time(6)

            //スコア
            pbAddScore(NUM_TYPE_BONUS, BONUS_BOSS2_DAMAGE, 0)
            
            //撃破
            @if bossHp <= 0 bl {
                @break
            }
            //第二形態に移行
            @if `temA >= BOSS2_HP / 2 && bossHp < BOSS2_HP / 2 bl {
                @scr.flash .once(4) .rgbv(31, 31, 31, 24)

                bossPattern = 0

                hitStopTimer = 12
                @wait .frame(12)
            }
        }

        //ダメージエフェクトタイマー
        @if bossDamage > 0 bl {
            bossDamage -= 1
        }

        //状態ごとの処理
        pseudoSwitchState(bossState,
            //次の行動を決める
        [   MAO_ST_NEXT, bl {
                //イベント中は停止する
                @if `eventMode bl {
                } .elif bossTimer >= 2 bl {
                    //第二フェイズ
                    @if bossHp < BOSS2_HP / 2 bl {
                        temA = bossPattern % 8
                        temB = [MAO_ST_DARKNESS, MAO_ST_WAIT, MAO_ST_MOVE, MAO_ST_MOVE, MAO_ST_SPARK, MAO_ST_FLAME, MAO_ST_WAIT, MAO_ST_MOVE][temA]

                    //第一フェイズ
                    } .else bl {
                        temA = bossPattern % 6
                        temB = [MAO_ST_WAIT, MAO_ST_FLAME, MAO_ST_MOVE, MAO_ST_TORNADE, MAO_ST_WAIT, MAO_ST_SPARK][temA]
                    }

                    bossPattern += 1
                    changeBossState(temB)
                }
            },
            //待機
            MAO_ST_WAIT, bl {
                @if bossTimer == 0 bl {
                    @pic.show[PIC_BOSS] .pos(bossX, bossY) .center .scale(100) .trans(0) .rangeAnim(12, 1, 3) maouPicCmd
                }
                @if bossTimer == 60 bl {
                    changeBossState(MAO_ST_NEXT)
                }
            },
            //移動する
            MAO_ST_MOVE, bl {
                @if bossTimer == 0 bl {
                    bossPos = (bossPos + rnd(1, 3 - 1)) % 3
                    @pic.show[PIC_BOSS] .pos(bossX, bossY) .center .scale(100) .trans(0) .rangeAnim(6, 5, 6) maouPicCmd
                    @se.play "Evade2" .opt(50, 100, 50)
                }
                @if `between(bossTimer, 0, 20 -2) bl {
                    V2_set(temF,
                        [5, 9, 13][bossPos] * MAPTILE_SIZE + 8,
                        [5, 4,  5][bossPos] * MAPTILE_SIZE + 8
                    )
                    bossX = lerp(bossX, temF, bossTimer, 20)
                    bossY = lerp(bossY, temG, bossTimer, 20)
                }
                @if bossTimer > 30 bl {
                    changeBossState(MAO_ST_NEXT)
                }
            },
            //引き寄せ、全方位に衝撃波を放つ。これだけはパワーアップ状態でも効く。
            MAO_ST_DARKNESS, bl {
                //詠唱
                @if bossTimer == 0 bl {
                    @pic.show[PIC_BOSS] .pos(bossX, bossY) .center .scale(100) .trans(0) .rangeAnim(6, 9, 10) maouPicCmd
                    @se.play "Darkness1" .opt(90, 100, 50)
                }
                //引き寄せ
                @if `between(bossTimer, 1, 85) bl {
                    pbUpdateForce(temE, temF,
                    GIM_LAYER_MID, BOSS2_DARKNESS_POW2, -360,
                    0, SHARP_CIRCLE, 320, bossX, bossY, 0, 0)
                }
                //発動
                @if bossTimer == 90 bl {
                    @pic.show[PIC_BOSS] .pos(bossX, bossY) .center .scale(100) .trans(0) .rangeAnim(6, 11, 12) maouPicCmd

                    @se.play "Darkness4" .opt(90, 100, 50)
                    @scr.flash .once(5) .rgbv(0, 0, 0, 24)

                    temD = PIC_ATTACK + BOSS2_ID_DARKNESS
                    @pic.show[temD] .pos(bossX, bossY) .scale(200) .trans(-100) .rangeAnim(4, 5, 8) .repeat .overlay effPicCmd
                    @pic.move[temD] .relative .pos(0, 0) .scale(100) .trans(200) .keepBlend .time(6)
                    getAttackPtr(ptrA, BOSS2_ID_DARKNESS)
                    initAttack(ptrA, bl {
                        $state = AT_ST_ENABLE
                        $timer = -1
                        $type = AT_TY_DARKNESS_EFF
                    } )

                    pbUpdateForce(temE, temF,
                    GIM_LAYER_MID, BOSS2_DARKNESS_POW, -360,
                    0, SHARP_CIRCLE, 320, bossX, bossY, 0, 0)
                }

                @if bossTimer == 120 bl {
                    changeBossState(MAO_ST_NEXT)
                }
            },
            //前方に炎を放つ
            MAO_ST_FLAME, bl {
                //詠唱
                @if bossTimer == 0 bl {
                    @pic.show[PIC_BOSS] .pos(bossX, bossY) .center .scale(100) .trans(0) .rangeAnim(6, 13, 14) maouPicCmd
                }
                //発動
                @if bossTimer == 30 bl {
                    @pic.show[PIC_BOSS] .pos(bossX, bossY) .center .scale(100) .trans(0) .rangeAnim(6, 7, 8) maouPicCmd
                    @se.play "Fire5" .opt(90, 100, 50)
                }
                @if `between(bossTimer, 30, 96) && !(bossTimer % 6) bl {
                    //id
                    temC = BOSS2_ID_FLAME + bossTimer / 6 % 8
                    //picture id
                    temD = PIC_ATTACK + temC
                    //angle
                    //+-20の範囲にばら撒く
                    temE = 90 + sin(bossTimer / 6 * 32, 1, 20)
                    //add pos
                    V2_getCosSin(temF, temE, 1, 240)

                    @pic.show[temD] .pos(bossX, bossY) .scale(80) .trans(-100) .rangeAnim(2, 9, 12) .repeat .add effPicCmd
                    @pic.move[temD] .relative .pos(temF, temG) .scale(120) .trans(200) .keepBlend .time(8)

                    getAttackPtr(ptrA, temC)
                    initAttack(ptrA, bl {
                        $state = AT_ST_ENABLE
                        $timer = -1
                        $type = AT_TY_FLAME
                        $param = temE
                    } )
                }
                @if bossTimer == 120 bl {
                    changeBossState(MAO_ST_NEXT)
                }
            },
            //所定の位置に雷球を置く
            MAO_ST_SPARK, bl {
                //詠唱
                @if bossTimer == 0 bl {
                    @pic.show[PIC_BOSS] .pos(bossX, bossY) .center .scale(100) .trans(0) .rangeAnim(6, 11, 12) maouPicCmd
                }
                //発動
                @if bossTimer == 30 bl {
                    @pic.show[PIC_BOSS] .pos(bossX, bossY) .center .scale(100) .trans(0) .rangeAnim(6, 15,16) maouPicCmd

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

                    @loop 4 .dst(temB) bl {
                        V2_set(temF,
                            [ 4,14, 6,12][temB] * MAPTILE_SIZE + 8,
                            [10,10, 6, 6][temB] * MAPTILE_SIZE + 8
                        )

                        //ブレる
                        temF += rnd(-1, 1) * MAPTILE_SIZE
                        temG += rnd(-1, 1) * MAPTILE_SIZE

                        //id
                        temC = BOSS2_ID_SPARK + temB
                        //picture id
                        temD = PIC_ATTACK + temC

                        @pic.show[temD] .pos(bossX, bossY) .scale(25) .trans(100) .rangeAnim(2, 13, 16) .repeat .add effPicCmd
                        @pic.move[temD] .pos(temF, temG) .scale(75) .trans(0) .keepBlend .time(3)

                        getAttackPtr(ptrA, temC)
                        initAttack(ptrA, bl {
                            $state = AT_ST_ENABLE
                            $timer = -1
                            $type = AT_TY_SPARK
                        } )
                    }
                }

                @if bossTimer == 60 bl {
                    changeBossState(MAO_ST_NEXT)
                }
            },
            //画面横から竜巻が現れる
            MAO_ST_TORNADE, bl {
                //詠唱
                @if bossTimer == 0 bl {
                    @pic.show[PIC_BOSS] .pos(bossX, bossY) .center .scale(100) .trans(0) .rangeAnim(6, 7, 8) maouPicCmd
                }
                //発動
                @if bossTimer == 30 bl {
                    @pic.show[PIC_BOSS] .pos(bossX, bossY) .center .scale(100) .trans(0) .rangeAnim(6, 9, 10) maouPicCmd

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

                    //場所によって向きが変わる
                    temA = [1, rnd(0, 1), 0][bossPos]

                    //設置パターンA:左から右
                    @if temA > 0 bl {
                        temE = 0
                        V2_set(temF,
                            (0 - 2) * MAPTILE_SIZE + 8,
                            6 * MAPTILE_SIZE + 8
                        )
                        V2_set(temH, 400, 0)
                    //設置パターンB:右から左
                    } .else bl {
                        temE = 180
                        V2_set(temF,
                            (19 + 2) * MAPTILE_SIZE + 8,
                            6 * MAPTILE_SIZE + 8
                        )
                        V2_set(temH, -400, 0)                            
                    }

                    //id
                    temC = BOSS2_ID_TORNADE
                    //picture id
                    temD = PIC_ATTACK + temC

                    @pic.show[temD] .pos(temF, temG) .scale(300) .trans(-300) .rangeAnim(4, 17, 20) .repeat .add effPicCmd
                    @pic.move[temD] .relative .pos(temH, temI) .scale(0) .trans(400) .keepBlend .time(15)

                    getAttackPtr(ptrA, temC)
                    initAttack(ptrA, bl {
                        $state = AT_ST_ENABLE
                        $timer = -1
                        $type = AT_TY_TORNADE
                        $param = temE
                    } )
                }

                @if bossTimer == 60 bl {
                    changeBossState(MAO_ST_NEXT)
                }
            }
        ] )

        //ピクチャの位置を更新する
        temG = lerp(100, 200, bossDamage, BOSS2_DAMAGE_EFF)
        temH = 100
        @pic.move[PIC_BOSS] .pos(bossX, bossY) .scale(100) .trans(0) .rgbs(temG, temH, temH, temH)
    }

    //--------------------------------
    //撃破
    startEventMode()
    cm_clearAttack()
    stopBGM(1000)

    //実績解除
    checkSetAchievement(achievedPinballBonus, TRUE)

    //のけぞり
    @pic.show[PIC_BOSS] .pos(bossX, bossY) .center .scale(100) .trans(0) .cell(4) maouPicCmd

    @se.play "Thunder10" .opt(90, 100, 50)
    @scr.flash .once(2) .rgbv(31, 31, 31, 31)
    @wait(8)

    @loop 240 .dst(idxA) bl {
        //叫び声
        @if idxA == 60 bl {
            @se.play "voice_scream1" .opt(80, 90, 50)
        }
        //爆発音+エフェクト
        @if `idxA < 240 - 40 && !(idxA % 14) bl {
            @se.play "Explosion1" .opt(80, 90, 50)

            //id
            temC = (idxA / 14) % 4 % MAX_ATTACK + BOSS2_ID_EXPLO
            //picture id
            temD = PIC_ATTACK + temC
            //pos
            V2_set(temE,
                bossX + rnd(-32, 32),
                bossY + rnd(-32, 32)
            )
            @pic.show[temD] .pos(temE, temF).rangeAnim(4, 1, 4) .repeat .add effPicCmd
            
            getAttackPtr(ptrA, temC)
            initAttack(ptrA, bl {
                $state = AT_ST_ENABLE
                $timer = -1
                $type = AT_TY_EXPLO_EFF
            } )
        }
        //ピクチャを白く染めながら揺らす
        @if `!(idxA % 2) bl {
            temD = min(lerp(100, 200, idxA, 180), 200)
            temE = 100
            V2_set(temF,
                bossX + rnd(-2, 2),
                bossY + rnd(-2, 2),
            )
            @pic.move [PIC_BOSS] .pos(temF, temG) .scale(100) .rgbs(temD, temD, temD, temE) .trans(0)
        }
        @wait (0)
    }
    @pic.move [PIC_BOSS] .relative .pos(-240, -240) .scale(0) .trans(100) .time(4)

    @scr.shake .once(4) .value(2, 7)
    @scr.flash .once(2) .rgbv(31, 31, 31, 31)
    @se.play "Explosion7" .opt(100, 100, 50)
    @wait(10)

    //BGMを完全に止める
    stopBGM()

    //倒した
    changeSceneState(SC_ST_WINS)
    
    //--------------------------------
    //終端
    @loop bl {
        @wait(10)
    }
}