mirror of
https://github.com/csd4ni3l/fishy-fingers.git
synced 2026-03-10 17:09:15 +01:00
144 lines
4.2 KiB
GDScript
144 lines
4.2 KiB
GDScript
extends Area2D
|
|
|
|
@onready var sprite = $fish_button_to_clone # or whatever the sprite node is named
|
|
@onready var audio_player = get_node("/root/Main/ClickSoundManager")
|
|
var does_move = 1
|
|
var speed_scale = 1.0
|
|
var new_rotation: float
|
|
var is_reeling = false
|
|
var reel_speed = 800.0
|
|
var line_origin: Vector2
|
|
var line: Line2D
|
|
var hook_sprite: Sprite2D
|
|
var wobble = 0.0
|
|
var angle = randi() % 360
|
|
var last_bubble_spawn = Time.get_ticks_msec()
|
|
|
|
func get_size() -> Vector2:
|
|
if sprite.texture:
|
|
return sprite.texture.get_size() * sprite.scale
|
|
return Vector2.ZERO
|
|
|
|
func play_sound(path: String):
|
|
var player = AudioStreamPlayer.new()
|
|
add_child(player)
|
|
player.stream = load(path)
|
|
player.play()
|
|
player.finished.connect(player.queue_free)
|
|
|
|
func spawn_bubble() -> void:
|
|
var new_bubble: Sprite2D = $"/root/Main/bubble_to_clone".duplicate(15)
|
|
new_bubble.set_meta("is_original", false)
|
|
new_bubble.position = Vector2(
|
|
global_position.x * randf_range(0.95, 1.05),
|
|
global_position.y
|
|
)
|
|
get_parent().get_parent().get_parent().add_child(new_bubble)
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if get_meta("is_original", false):
|
|
return
|
|
|
|
var sz = get_size()
|
|
if is_reeling:
|
|
if Time.get_ticks_msec() - last_bubble_spawn >= 20:
|
|
last_bubble_spawn = Time.get_ticks_msec()
|
|
spawn_bubble()
|
|
|
|
global_position.y -= reel_speed * delta
|
|
global_position.x = line_origin.x # no offset
|
|
if line and is_instance_valid(line):
|
|
line.set_point_position(0, line_origin)
|
|
line.set_point_position(1, global_position)
|
|
if hook_sprite and is_instance_valid(hook_sprite):
|
|
hook_sprite.global_position = global_position - Vector2(0, get_size().y / 5)
|
|
if global_position.y + get_size().y <= 0:
|
|
_on_caught()
|
|
return
|
|
|
|
if does_move == 1:
|
|
var mouse = get_global_mouse_position()
|
|
var top_left = global_position - sz / 2
|
|
var rect = Rect2(top_left, sz)
|
|
if rect.has_point(mouse):
|
|
speed_scale = 0.6
|
|
else:
|
|
speed_scale = 1.0
|
|
new_rotation = angle - deg_to_rad(135)
|
|
if abs(new_rotation - rotation) > 0.01:
|
|
rotation = lerp_angle(rotation, new_rotation, 0.2)
|
|
else:
|
|
rotation = new_rotation
|
|
|
|
wobble += delta * 15.0
|
|
var wobble_angle = angle + sin(wobble) * 0.3
|
|
var wobble_dir = Vector2(cos(wobble_angle), sin(wobble_angle))
|
|
|
|
global_position += wobble_dir * Globals.FISH_SPEED * delta * speed_scale
|
|
|
|
new_rotation = wobble_angle - deg_to_rad(135)
|
|
if abs(new_rotation - rotation) > 0.01:
|
|
rotation = lerp_angle(rotation, new_rotation, 0.2)
|
|
else:
|
|
rotation = new_rotation
|
|
|
|
var screen_size = get_viewport_rect().size
|
|
if global_position.x < 0:
|
|
if is_instance_valid(line):
|
|
line.queue_free()
|
|
if is_instance_valid(hook_sprite):
|
|
hook_sprite.queue_free()
|
|
queue_free()
|
|
elif global_position.x > screen_size.x:
|
|
if is_instance_valid(line):
|
|
line.queue_free()
|
|
if is_instance_valid(hook_sprite):
|
|
hook_sprite.queue_free()
|
|
queue_free()
|
|
|
|
if global_position.y < 0:
|
|
global_position.y = -global_position.y
|
|
self.angle = -self.angle
|
|
elif global_position.y > screen_size.y:
|
|
global_position.y = 2 * screen_size.y - global_position.y
|
|
self.angle = -self.angle
|
|
|
|
func _on_input_event(_viewport, event, _shape_idx) -> void:
|
|
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
|
|
_on_clicked()
|
|
|
|
func _on_clicked() -> void:
|
|
if is_reeling:
|
|
return
|
|
var fish_center = global_position
|
|
line_origin = Vector2(fish_center.x, 0)
|
|
|
|
line = Line2D.new()
|
|
line.width = 2.0
|
|
line.default_color = Color(0.6, 0.6, 0.6, 1.0)
|
|
line.top_level = true
|
|
line.points = PackedVector2Array([line_origin, fish_center])
|
|
add_child(line)
|
|
|
|
hook_sprite = Sprite2D.new()
|
|
hook_sprite.texture = load("res://assets/graphics/hook.png")
|
|
hook_sprite.top_level = true
|
|
hook_sprite.global_position = fish_center - Vector2(0, get_size().y / 5)
|
|
hook_sprite.scale = Vector2(1.5, 1.5)
|
|
add_child(hook_sprite)
|
|
|
|
is_reeling = true
|
|
does_move = 0
|
|
rotation = 0
|
|
play_sound("res://assets/sfx/splash.mp3")
|
|
|
|
func _on_caught() -> void:
|
|
Globals.coins += (1 + (Globals.sell_cost_upgrades * 0.5))
|
|
Globals.fish_per_second += 1
|
|
Globals.successful_hit += 1
|
|
if line and is_instance_valid(line):
|
|
line.queue_free()
|
|
if hook_sprite and is_instance_valid(hook_sprite):
|
|
hook_sprite.queue_free()
|
|
queue_free()
|