# use.ludic - the thing the use key should act on. The ray comes first and proximity is its fallback, # never its override: # under the crosshair and in reach -> that, whatever else is nearer # under the crosshair and too far -> NOTHING (the prompt says why), within AIM_USE_MAX # nothing of that kind aimed at -> the nearest thing in reach # A player looking at something who presses the key has said which thing they mean. export const AIM_USE_THIS: int = 0 export const AIM_USE_NOTHING: int = 1 export const AIM_USE_NEAREST: int = 2 export function aim_use(aim_st: AimState, kind: int) -> int { if aim_st.am_kind == kind and aim_st.am_reach { return AIM_USE_THIS } if aim_st.am_kind == kind and aim_st.am_dist < AIM_USE_MAX { return AIM_USE_NOTHING } return AIM_USE_NEAREST } # whether (x, z) is before the view: within `cos_min` of the camera's heading, seen from the body. # Anything at the feet counts, where a heading means nothing, and so does all of it when the view # looks straight up or down const AIM_FEET: float = 1.2 export function aim_ahead(x: float, z: float, cos_min: float) -> bool { let dx = x - AimView.body_x() let dz = z - AimView.body_z() let d = Math.sqrt(dx * dx + dz * dz) if d < AIM_FEET { return true } let fx = AimView.fx() let fz = AimView.fz() let f = Math.sqrt(fx * fx + fz * fz) if f < 0.0001 { return true } return (dx * fx + dz * fz) / (d * f) >= cos_min }