#apply
#include "../_include.txt"
#include "../../define/_vector2.txt"
#include "../../define/_const_pinball.txt"

/*
@param
機能
玉ID(0-1)
引数3
4
5
*/
cev[CEV_PB_BALL_FUNC] .name(">>>>玉の処理") {
    defv {
        a_func = TV_PB_BALL_FUNC
        a_id
        a_3
        a_4
        a_5
        a_6

        ptr
        state
        ele
        idx
        exists
        vx
        vy
    }

    getBallPtr(ptr, a_id)
    state = v[ptr + MB_STATE]

    pseudoSwitchState(a_func,
    //------------------------
    //玉を有効化する(func, id, ev, layer, x, y)
    //レイヤーはMID
    [ BA_FUNC_APPEAR, bl {
        @if state <= BA_ST_NONE bl {
            //位置
            @if a_3 > 0 bl {
                V2_addEventCenter(a_5, a_3)
            }
            initBall(ptr, bl {
                $state = BA_ST_ENABLE
                $layer = a_4
                $x = a_5 * UNIT_POS
                $y = a_6 * UNIT_POS
                $nx = a_5 * UNIT_POS
                $ny = a_6 * UNIT_POS
            } )

            //ゲームオーバー判定に備えてカウントを増やしておく
            ballCount += 1
        }
    },
    //------------------------
    //玉を消去する(func, id)
    BA_FUNC_DELETE, bl {
        //not none or delete
        @if state > BA_ST_DELETE bl {
            v[ptr + MB_STATE] = BA_ST_DELETE
        }
    },
    //------------------------
    //玉を解放する(func, id)
    BA_FUNC_UNLOCK, bl {
        @if `state == BA_ST_LOCK || state == BA_ST_HIDE bl {
            v[ptr + MB_STATE] = BA_ST_ENABLE
            v[ptr + MB_ANGLE] = 0
            v[ptr + MB_SPIN] = 0
            v[ptr + MB_VX] = 0
            v[ptr + MB_VY] = 0
            v[ptr + MB_NX] = v[ptr + MB_X]
            v[ptr + MB_NY] = v[ptr + MB_Y]
        }
    },
    //------------------------
    //玉をロックする(func, id)
    BA_FUNC_LOCK, bl {
        @if state > BA_ST_DELETE bl {
            v[ptr + MB_STATE] = BA_ST_LOCK
        }
    },
    //------------------------
    //玉を隠す(func, id)
    BA_FUNC_HIDE, bl {
        @if state > BA_ST_DELETE bl {
            v[ptr + MB_STATE] = BA_ST_HIDE
            //ついでに角度も初期化する
            v[ptr + MB_ANGLE] = 0
            v[ptr + MB_SPIN] = 0
        }
    },
    //以下の機能は状態に関わらず設定可能
    //------------------------
    //座標を設定する(func, id, ev, layer, x, y)
    BA_FUNC_SET_POS, bl {
        //位置
        @if a_3 > 0 bl {
            V2_addEventCenter(a_5, a_3)

        }
        v[ptr + MB_LAYER] = a_4
        v[ptr + MB_X] = a_5 * UNIT_POS
        v[ptr + MB_Y] = a_6 * UNIT_POS
        v[ptr + MB_NX] = a_5 * UNIT_POS
        v[ptr + MB_NY] = a_6 * UNIT_POS

    //------------------------
    //速度を設定する(func, id, velocity, angle)
    },
    BA_FUNC_SET_VEL, bl {
        V2_getCosSin(vx, a_4, UNIT_ANGLE, a_3)
        v[ptr + MB_VX] = vx
        v[ptr + MB_VY] = vy
    },
    //------------------------
    //レイヤーを設定する(func, id, layer)
    BA_FUNC_SET_LAYER, bl {
        v[ptr + MB_LAYER] = a_3
    } ] )
}