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

/*
@param
レイヤー
基準となるイベントの番号(0:無効)
形状
内積の計算に使用する角度(0-360)
半径(px)
左/中心x(px)
上/中心y
右
下

@return
玉のID(-1:衝突なし)(検知するのは一つのみ。IDが大きい方が優先される。)
角度と移動速度の内積
*/
cev[CEV_PB_BALL_TO_AREA] .name(">>玉の中心と範囲") {
    defv {
        r_id = TV_RETURN
        r_dot

        a_layer = TV_PB_BALL_TO_AREA
        a_event
        a_sharp
        a_angle
        a_rad
        a_sx
        a_sy
        a_ex
        a_ey

        ptr
        idx
        ax
        ay
        bx
        by
        flag
        
    }

    //返り値を初期化
    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)
    }

    @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
        }

        V2_set(bx,
            v[ptr + MB_X] / UNIT_POS,
            v[ptr + MB_Y] / UNIT_POS
        )

        flag = FALSE

        //円形
        @if a_sharp == SHARP_CIRCLE bl {
            V2_sub(ax, a_sx, bx)
            //中心点と円
            @if `abs(ax) <= a_rad && abs(ay) <= a_rad && ax*ax + ay*ay <= a_rad*a_rad bl {
                flag = TRUE
            } 
        //矩形
        } .elif a_sharp == SHARP_RECT bl {
            //中心点と矩形
            V2_ifRectOverlap(bx, bx, a_sx, a_ex, a_rad, bl {flag = TRUE}, EMPTY_BLOCK)
        }

        @if `flag bl {
            r_id  = idx
            r_dot = (
                cos(a_angle, 1, UNIT_NORMAL) * v[ptr + MB_VX] +
                sin(a_angle, 1, UNIT_NORMAL) * v[ptr + MB_VY]
            ) / UNIT_NORMAL
        }
    }
}