The_Dark_Side_of_Earth/water/water.gd
2025-09-18 14:49:30 +02:00

70 lines
1.8 KiB
GDScript

extends Node2D
signal water_reached_max_height
var radius : float:
set(new_radius):
radius = new_radius
var mesh = get_node_or_null("WaterMesh")
if !is_instance_valid(mesh):
return
update_scale(mesh)
mesh.material.set_shader_parameter("radius", radius)
@export var amplitude : float:
set(new_amplitude):
amplitude = new_amplitude
var mesh = get_node_or_null("WaterMesh")
if !is_instance_valid(mesh):
return
update_scale(mesh)
mesh.material.set_shader_parameter("amplitude", amplitude)
var tsunami_size : float:
set(new_size):
tsunami_size = new_size
var mesh = get_node_or_null("WaterMesh")
if !is_instance_valid(mesh):
return
update_scale(mesh)
mesh.material.set_shader_parameter("tsunami_size", tsunami_size)
var tsunami_angle : float:
set(new_angle):
tsunami_angle = new_angle
var mesh = get_node_or_null("WaterMesh")
if !is_instance_valid(mesh):
return
update_scale(mesh)
mesh.material.set_shader_parameter("tsunami_angle", tsunami_angle)
@export var rise_from : float = 2500;
@export var rise_to : float = 3500;
@export var rise_time : float = 120; # in seconds
var auto_rise : bool = true;
@onready var start_unix_time : float = Time.get_unix_time_from_system()
func update_scale(mesh):
mesh.scale = 2 * (radius + amplitude * 2.1 + tsunami_size) * Vector2.ONE
func update_shader():
radius = radius
amplitude = amplitude
tsunami_angle = tsunami_angle
tsunami_size = tsunami_size
func _ready() -> void:
update_shader()
radius = rise_from
func _process(_delta: float) -> void:
if auto_rise:
var time: float = Time.get_unix_time_from_system()
if time - start_unix_time > rise_time:
auto_rise = false
radius = rise_to
water_reached_max_height.emit()
else:
radius = lerpf(rise_from, rise_to, (time - start_unix_time) / rise_time)