class_name BallsBase extends Node3D @onready var bodies: Node3D = $bodies @onready var ball_sounds: AudioStreamPlayer = $ball_sounds @onready var white_ball_marker: Marker3D = $white_ball_marker @onready var white_ball: RigidBody3D = $bodies/white_ball @export var ball_mass: float = 0.17 @export var min_speed: float = 0.0008 @export var max_speed: float = 0.5 @export var min_pitch: float = 0.6 # slower = deeper @export var max_pitch: float = 1.6 # faster = higher @export var min_volume_db: float = -30.0 # slower = quiet @export var max_volume_db: float = 0.0 # faster = loud var balls_moving: bool = false func _set_ball_physics(ball: RigidBody3D) -> void: var phy_mat = PhysicsMaterial.new() phy_mat.set_bounce(0.90) phy_mat.set_friction(0.12) phy_mat.set_rough(false) ball.set_physics_material_override(phy_mat) ball.axis_lock_linear_y = true ball.set_mass(ball_mass) ball.set_linear_damp(2.04) ball.set_angular_damp(1.44) ball.set_use_continuous_collision_detection(true) ball.contact_monitor = true # NOTE: How many balls can surround a single ball, # therefor worst case is 6 collisions. (think start of game) ball.max_contacts_reported = 6 ball.body_entered.connect(_on__ball_body_entered) func _on__ball_body_entered(_ball: Node) -> void: assert(false, "This method needs to be overridden...")