class_name SpeedPad extends Area3D const BASE_ANIM_SPEED: float = 0.1 @export var launch_speed: float = 30.0 @onready var mesh := $'Mesh' as MeshInstance3D @onready var audio_player := $'AudioStreamPlayer' as AudioStreamPlayer var turn45: int var turn90: int var turn135: int var turn180: int var anim_progress: float = 0.0 func _ready() -> void: turn45 = mesh.find_blend_shape_by_name(&'Turn45') turn90 = mesh.find_blend_shape_by_name(&'Turn90') turn135 = mesh.find_blend_shape_by_name(&'Turn135') turn180 = mesh.find_blend_shape_by_name(&'Turn180') body_entered.connect(propel) mesh.set_instance_shader_parameter( &'hue_shift', launch_speed - 30.0 ) func _process(delta: float) -> void: anim_progress = fposmod( anim_progress + delta*launch_speed*BASE_ANIM_SPEED, 1.0 ) var subprogress: float var increase: int = -1 var decrease: int = -1 if anim_progress < 0.25: subprogress = clampf(4.0*anim_progress, 0.0, 1.0) decrease = turn180 increase = turn45 elif anim_progress < 0.5: subprogress = clampf(4.0*(anim_progress - 0.25), 0.0, 1.0) decrease = turn45 increase = turn90 elif anim_progress < 0.75: subprogress = clampf(4.0*(anim_progress - 0.5), 0.0, 1.0) decrease = turn90 increase = turn135 else: subprogress = clampf(4.0*(anim_progress - 0.75), 0.0, 1.0) decrease = turn135 increase = turn180 if decrease == turn180: mesh.set_blend_shape_value(decrease, 0.0) else: mesh.set_blend_shape_value( decrease, clampf(1.0 - subprogress, 0.0, 1.0) ) mesh.set_blend_shape_value(increase, subprogress) func propel(body: PhysicsBody3D) -> void: if body is RigidBody3D: audio_player.play() (body as RigidBody3D).linear_velocity += launch_speed*basis.z