92 lines
2.5 KiB
GDScript
92 lines
2.5 KiB
GDScript
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")
|