Farming/Scripts/day_night.gd

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())