58 lines
1.7 KiB
GDScript
58 lines
1.7 KiB
GDScript
extends CanvasModulate
|
|
|
|
@export var RSECONDS_PER_GMINUTE: float = 1
|
|
|
|
@export var r_time: float = 6 * 60 * 60
|
|
@export var gradient: GradientTexture1D
|
|
@export var min_hour: int = 6
|
|
@export var max_hour: int = 24
|
|
@export var is_stopped: bool = false
|
|
@export var should_apply_modulation: bool = true
|
|
|
|
var minute: int = 0
|
|
var hour: int = self.min_hour
|
|
var min_time: float = float(min_hour) * 60 * 60
|
|
var max_time: float = float(max_hour) * 60 * 60
|
|
|
|
signal time_changed(hour: int, minute: int)
|
|
|
|
func _get_game_time() -> float:
|
|
return floorf(self.r_time / 60 * RSECONDS_PER_GMINUTE)
|
|
|
|
func get_game_minute() -> int:
|
|
return posmod(int(_get_game_time() / RSECONDS_PER_GMINUTE), 60)
|
|
|
|
func get_game_hour() -> int:
|
|
return posmod(int(_get_game_time() / 60 / RSECONDS_PER_GMINUTE), 24)
|
|
|
|
func apply_modulation():
|
|
if not should_apply_modulation:
|
|
return
|
|
self.color = \
|
|
self.gradient.gradient.sample(
|
|
(self.r_time - self.min_time) / (self.max_time - self.min_time)
|
|
)
|
|
print("New color:", self.color)
|
|
|
|
func _on_time_changes() -> void:
|
|
self.minute = get_game_minute()
|
|
self.hour = get_game_hour()
|
|
apply_modulation()
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready() -> void:
|
|
self.minute = get_game_minute()
|
|
self.hour = get_game_hour()
|
|
self.min_time = min_hour * 60 * 60
|
|
_on_time_changes()
|
|
time_changed.emit(get_game_hour(), get_game_minute())
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
func _process(delta: float) -> void:
|
|
if self.is_stopped or self.r_time >= self.max_time:
|
|
return
|
|
self.r_time = min(self.r_time + (delta * 60 / RSECONDS_PER_GMINUTE), self.max_time)
|
|
if (minute != get_game_minute() or hour != get_game_hour()):
|
|
_on_time_changes()
|
|
time_changed.emit(get_game_hour(), get_game_minute())
|