extends RigidBody2D class_name Ball var kickedPower = 70 var velocity = Vector2(2500, -1000) var swimmingZones = [] var skimSpeed = 70 var kickSoundPlayer var lastSoundIndex = -1 var kickSounds = [] var rng = RandomNumberGenerator.new() func _ready(): initialize_kick_sounds() func initialize_kick_sounds(): kickSoundPlayer = $KickSound kickSounds.append(preload("res://Sounds/SFX/Kick/kick1.mp3")) kickSounds.append(preload("res://Sounds/SFX/Kick/kick2.mp3")) kickSounds.append(preload("res://Sounds/SFX/Kick/kick3.mp3")) kickSounds.append(preload("res://Sounds/SFX/Kick/kick4.mp3")) kickSounds.append(preload("res://Sounds/SFX/Kick/kick5.mp3")) func _process(delta): $SubViewport/Spatial/CharacterBody3D/MeshInstance3D.rotation.z += linear_velocity.x / 5999 $SubViewport/Spatial/CharacterBody3D/MeshInstance3D.rotation.x += linear_velocity.y / 5999 var texture = $SubViewport.get_texture() $Sprite2D.texture = texture handle_water() func play_kick_sound(): var newIndex = rng.randi_range(0, kickSounds.size() - 1) if newIndex == lastSoundIndex: newIndex = rng.randi_range(0, kickSounds.size() - 1) kickSoundPlayer.stream = kickSounds[newIndex] kickSoundPlayer.play() lastSoundIndex = newIndex func handle_water(): if swimmingZones.size() > 0: if !%Waves.visible: %Waves.visible = true var mainSwimmingZone = swimmingZones[0] for zone in swimmingZones: if zone.swimmingSpeed <= mainSwimmingZone.swimmingSpeed: mainSwimmingZone = zone %Waves.self_modulate = mainSwimmingZone.liquidColor else: %Waves.visible = false if swimmingZones.size() > 0 and abs(linear_velocity.length()) > skimSpeed: linear_damp = 1 $WaterSpray.emitting = true else: linear_damp = 0.6 $WaterSpray.emitting = false func add_swimming_area(swimmingArea): swimmingZones.append(swimmingArea) func remove_swimming_area(swimmingArea): swimmingZones.erase(swimmingArea) func _on_kick_zone_body_entered(body): if visible: if (body is Cow) or (body is Pigeon) or (body is Seagull): var kickDirection:Vector2 = global_position - body.global_position kickDirection = kickDirection.normalized() var kickForce = kickDirection * kickedPower apply_central_impulse(kickForce) play_kick_sound() elif body is NPC and body.characterName == "Kid": var kickDirection:Vector2 = global_position - body.global_position kickDirection = kickDirection.normalized() var kickForce = kickDirection * kickedPower * 3 apply_central_impulse(kickForce) play_kick_sound() AchievementManager.complete_achievement("Sports")