diff --git a/main.tscn b/main.tscn index a28b527..bdb47b0 100644 --- a/main.tscn +++ b/main.tscn @@ -130,11 +130,11 @@ theme_override_colors/font_color = Color(0.96, 0.91, 0.78, 1) theme_override_font_sizes/font_size = 15 text = "Villager inspector" -[node name="TimeDial" type="Control" parent="UI" node_paths=PackedStringArray("day_night_cycle")] +[node name="TimeDial" type="Control" parent="UI" node_paths=PackedStringArray("simulation_manager")] layout_mode = 0 offset_left = 880.0 offset_top = 6.0 offset_right = 940.0 offset_bottom = 66.0 script = ExtResource("12_timedial") -day_night_cycle = NodePath("../JajceWorld/DayNightCycle") +simulation_manager = NodePath("../SimulationManager") diff --git a/simulation/SimulationManager.gd b/simulation/SimulationManager.gd index 466aff3..0a486b8 100644 --- a/simulation/SimulationManager.gd +++ b/simulation/SimulationManager.gd @@ -44,6 +44,7 @@ func _ready() -> void: return clock = SimulationClock.new(tick_interval) clock.cycle_duration_seconds = cycle_duration_seconds + clock.elapsed_ticks = int(0.25 * cycle_duration_seconds / tick_interval) village.debug_logs = debug_logs _initialize_storage() village.update_modifiers() diff --git a/world/jajce/JajceLookdev.tscn b/world/jajce/JajceLookdev.tscn index 065eca8..cd86b1c 100644 --- a/world/jajce/JajceLookdev.tscn +++ b/world/jajce/JajceLookdev.tscn @@ -7,9 +7,6 @@ [node name="JajceWorld" parent="." instance=ExtResource("1_world")] -[node name="DayNightCycle" parent="JajceWorld" index="9"] -initial_cycle = 0.38 - [node name="BeautyCamera" type="Camera3D" parent="."] position = Vector3(44, 34, 44) current = true diff --git a/world/jajce/day_night_cycle.gd b/world/jajce/day_night_cycle.gd index 7c653a7..611d7de 100644 --- a/world/jajce/day_night_cycle.gd +++ b/world/jajce/day_night_cycle.gd @@ -1,7 +1,7 @@ extends Node @export var cycle_duration_seconds := 240.0 -@export_range(0.0, 1.0, 0.01) var initial_cycle := 0.35 +@export_range(0.0, 1.0, 0.01) var initial_cycle := 0.25 @export var directional_light: DirectionalLight3D @export var world_environment: WorldEnvironment @@ -36,19 +36,26 @@ const SUNRISE_LIGHT_COLOR := Color(1, 0.6, 0.45, 1) const SUNRISE_SUNSET_ENERGY := 0.8 var elapsed := 0.0 +var _simulation_node: Node func _ready() -> void: - elapsed = cycle_duration_seconds * initial_cycle - _apply_light_rotation(initial_cycle) - _apply_environment(initial_cycle) + _simulation_node = get_tree().get_first_node_in_group("simulation_manager") + if _simulation_node == null: + elapsed = cycle_duration_seconds * initial_cycle + _apply_light_rotation(initial_cycle) + _apply_environment(initial_cycle) -func _process(delta: float) -> void: - elapsed += delta - if elapsed >= cycle_duration_seconds: - elapsed = fmod(elapsed, cycle_duration_seconds) - var cycle := elapsed / cycle_duration_seconds +func _process(_delta: float) -> void: + var cycle: float + if _simulation_node != null and "clock" in _simulation_node: + cycle = _simulation_node.clock.time_of_day() + else: + elapsed += _delta + if elapsed >= cycle_duration_seconds: + elapsed = fmod(elapsed, cycle_duration_seconds) + cycle = elapsed / cycle_duration_seconds _apply_light_rotation(cycle) _apply_environment(cycle) diff --git a/world/ui/time_dial.gd b/world/ui/time_dial.gd index cdac8a6..b3bc0b4 100644 --- a/world/ui/time_dial.gd +++ b/world/ui/time_dial.gd @@ -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]