feat: sync visual day-night cycle with simulation clock

DayNightCycle now reads time_of_day from SimulationManager group node, falling back to self-tracked elapsed for lookdev scenes. Simulation starts at 06:00 morning (tick 50) by default. TimeDial reads directly from SimulationManager and displays HH:MM format with a 24-hour dial arc. Removed initial_cycle override from JajceLookdev.
This commit is contained in:
2026-07-08 18:04:04 +02:00
parent 4604dc6d5a
commit cab732a977
5 changed files with 47 additions and 40 deletions
+28 -26
View File
@@ -1,6 +1,6 @@
extends Control
@export var day_night_cycle: Node
@export var simulation_manager: Node
const SIZE_DIAL := 60.0
const RING_RADIUS := 24.0
@@ -14,7 +14,6 @@ const COLOR_DUSK := Color(0.9, 0.35, 0.2, 1)
const COLOR_BG := Color(0.06, 0.06, 0.08, 0.65)
var _last_fraction := -1.0
var _last_color := Color.TRANSPARENT
func _process(_delta: float) -> void:
@@ -44,29 +43,37 @@ func _draw() -> void:
var tip_pos := center + tip_dir * RING_RADIUS
draw_circle(tip_pos, GLOW_RADIUS, time_color.lightened(0.3))
var label := _phase_label(fraction)
var font := ThemeDB.fallback_font
if font == null:
return
var time_label := _time_label(fraction)
var font_size := 11
var text_size := font.get_string_size(label, HORIZONTAL_ALIGNMENT_CENTER, -1, font_size)
var text_size := font.get_string_size(time_label, HORIZONTAL_ALIGNMENT_CENTER, -1, font_size)
var text_x := (SIZE_DIAL - text_size.x) / 2.0
var text_y := SIZE_DIAL - text_size.y + 4.0
draw_string(font, Vector2(text_x, text_y), label, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, Color.WHITE)
draw_string(font, Vector2(text_x, text_y), time_label, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, Color.WHITE)
func _cycle_fraction() -> float:
if day_night_cycle == null:
return 0.0
var elapsed: float = day_night_cycle.get("elapsed") if "elapsed" in day_night_cycle else 0.0
var duration: float = (
day_night_cycle.get("cycle_duration_seconds")
if "cycle_duration_seconds" in day_night_cycle
else 240.0
)
if duration <= 0.0:
return 0.0
return fmod(elapsed / duration, 1.0)
if simulation_manager != null:
if "clock" in simulation_manager:
return simulation_manager.clock.time_of_day()
var day_night_cycle := get_node_or_null(day_night_cycle_fallback())
if day_night_cycle != null:
var elapsed: float = day_night_cycle.get("elapsed") if "elapsed" in day_night_cycle else 0.0
var duration: float = (
day_night_cycle.get("cycle_duration_seconds")
if "cycle_duration_seconds" in day_night_cycle
else 240.0
)
if duration > 0.0:
return fmod(elapsed / duration, 1.0)
return 0.0
func day_night_cycle_fallback() -> NodePath:
return NodePath("../../JajceWorld/DayNightCycle")
func _time_color(fraction: float) -> Color:
@@ -81,13 +88,8 @@ func _time_color(fraction: float) -> Color:
return COLOR_DUSK.lerp(COLOR_NIGHT, smoothstep(0.85, 1.0, fraction))
func _phase_label(fraction: float) -> String:
if fraction < 0.1:
return "Night"
if fraction < 0.2:
return "Dawn"
if fraction < 0.65:
return "Day"
if fraction < 0.8:
return "Dusk"
return "Night"
func _time_label(fraction: float) -> String:
var total_minutes := int(fraction * 24.0 * 60.0)
var hour := total_minutes / 60
var minute := total_minutes % 60
return "%02d:%02d" % [hour, minute]