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

/*
@param
レイヤー
速度
角度(-360:全方位)
放射状フラグ
基準となるイベント番号
形状(円形のみ)
半径
始点x/中心点x
始点y/中心点y
終点x
終点y

@return
玉のID
反射の勢い
*/
cev[CEV_PB_UPDATE_FORCE] .name(">>力場を更新する") {
    defv {
        r_id = TV_RETURN
        r_dot

        a_layer = TV_PB_UPDATE_BUMPER
        a_vel
        a_ang
        a_event
        a_sharp
        a_rad
        a_sx
        a_sy
        a_ex
        a_ey

        ptr
        idx
        rad
        ang
        time
        hitId
        hitDot
        ax
        ay
        bx
        by
        cx
        cy
        nx
        ny
    }

    def {
        ALL_DIRECTION = -360
    }
    
    //返り値を初期化
    r_id = -1
    r_dot = 0

    //玉がロックされていると判定しない
    @if `eventMode && hitStopTimer > 0 bl {
        @ev.abort
    }

    //位置
    @if a_event > 0 bl {
        V2_setEventCenter(ax, a_event)
        V2_asAdd(a_sx, ax)
        V2_asAdd(a_ex, ax)
    }

    //簡易判定
    //円形
    @if a_sharp == SHARP_CIRCLE bl {
        V2_set(ax,
            (a_sx - a_rad) / MAPTILE_SIZE,
            (a_sy - a_rad) / MAPTILE_SIZE
        )
        V2_set(bx,
            (a_sx + a_rad) / MAPTILE_SIZE,
            (a_sy + a_rad) / MAPTILE_SIZE
        )
        V2_ifRectOverlap(ax, bx, ballAreaMinX, ballAreaMaxX, 0, EMPTY_BLOCK, ABORT_BLOCK)
    //例外
    } .else bl {
        @ev.abort
    }

    //ループ用返り値
    hitId = -1
    hitDot = 0

    //半径
    rad = a_rad * UNIT_POS + BA_RADxUNIT
    V2_mulScalar(ax, a_sx, UNIT_POS)
    V2_mulScalar(bx, a_ex, UNIT_POS)

    //速度
    V2_getCosSin(nx, a_ang, 1, UNIT_NORMAL)

    @loop MAX_BALL .dst(idx) bl {
        getBallPtr(ptr, idx)
        //状態
        @if `v[ptr + MB_STATE] != BA_ST_ENABLE bl {
            @continue
        }
        //レイヤー
        @if `v[ptr + MB_LAYER] != a_layer bl {
            @continue
        }
        time = -1

        //円形
        @if a_sharp == SHARP_CIRCLE bl {
            V2_set(cx,
                ax - v[ptr + MB_X],
                ay - v[ptr + MB_Y]
            )
            @if `cx * cx + cy * cy <= rad * rad bl {
                time = 1
                //全方位の場合、ベクトルを更新する
                @if a_ang == ALL_DIRECTION bl {
                    ang = atan2(cy, cx, 1)
                    V2_getCosSin(nx, ang, 1, UNIT_NORMAL)
                }
            }
        }

        @if time >= 0 bl {
            //速度を足す
            v[ptr + MB_VX] += muldiv(nx, a_vel, UNIT_NORMAL)
            v[ptr + MB_VY] += muldiv(ny, a_vel, UNIT_NORMAL)
            //衝突した玉のID
            hitId = idx
            //内積
            hitDot = (v[ptr + MB_VX] * nx + v[ptr + MB_VY] + ny) / UNIT_NORMAL
        }
    }
    //返り値を代入
    r_id = hitId
    r_dot = hitDot
}