-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtime_system.gd
More file actions
144 lines (118 loc) · 4.02 KB
/
time_system.gd
File metadata and controls
144 lines (118 loc) · 4.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
extends Node
signal day_changed(day: int)
signal season_changed(season: String)
signal time_changed(hour: int, minute: int)
# Time settings
var day_length_seconds = 120.0 # 2 minutes = 1 day
var current_time = 0.0 # Time in seconds since start
var current_day = 1
var current_season = "Spring"
var current_year = 1
# Season lengths (in days)
var season_length = 28 # 28 days per season
var seasons = ["Spring", "Summer", "Fall", "Winter"]
# Time of day
var hours_per_day = 24
var current_hour = 6 # Start at 6 AM
var current_minute = 0
# References
var sun_light
var environment_sky
func _ready():
add_to_group("time_system")
sun_light = get_node("../Sun")
func _process(delta):
current_time += delta
# Calculate current hour and minute
var day_progress = fmod(current_time, day_length_seconds) / day_length_seconds
var total_minutes = day_progress * 24 * 60 # 24 hours * 60 minutes
var new_hour = int(total_minutes / 60) % 24
var new_minute = int(total_minutes) % 60
if new_hour != current_hour or new_minute != current_minute:
current_hour = new_hour
current_minute = new_minute
time_changed.emit(current_hour, current_minute)
_update_lighting()
# Check for new day
var new_day = int(current_time / day_length_seconds) + 1
if new_day != current_day:
current_day = new_day
day_changed.emit(current_day)
_check_season_change()
func _check_season_change():
var total_days_in_year = (current_day - 1) % (season_length * 4)
var season_index = int(total_days_in_year / season_length)
var new_season = seasons[season_index]
if new_season != current_season:
current_season = new_season
season_changed.emit(current_season)
_update_seasonal_effects()
# Check for new year
if (current_day - 1) % (season_length * 4) == 0 and current_day > 1:
current_year += 1
func _update_lighting():
if not sun_light:
return
# Calculate sun position and intensity based on time
var time_factor = (current_hour + current_minute / 60.0) / 24.0
# Sun angle (rises at 6 AM, sets at 8 PM)
var sun_angle = 0.0
if current_hour >= 6 and current_hour <= 20:
# Daytime
var day_progress = (current_hour - 6 + current_minute / 60.0) / 14.0 # 14 hours of daylight
sun_angle = day_progress * PI - PI/2 # -90 to +90 degrees
else:
# Nighttime
sun_angle = PI/2 + 0.5 # Below horizon
# Update sun rotation
var sun_transform = Transform3D()
sun_transform = sun_transform.rotated(Vector3.RIGHT, sun_angle)
sun_transform.origin = Vector3(0, 10, 0)
sun_light.transform = sun_transform
# Update light intensity
var light_intensity = 0.0
if current_hour >= 6 and current_hour <= 20:
if current_hour <= 12:
# Morning - gradually brighten
light_intensity = (current_hour - 6 + current_minute / 60.0) / 6.0
else:
# Afternoon/Evening - gradually dim
light_intensity = 1.0 - ((current_hour - 12 + current_minute / 60.0) / 8.0)
light_intensity = clamp(light_intensity, 0.1, 1.0)
else:
# Night
light_intensity = 0.05
# Apply seasonal light adjustments
match current_season:
"Spring":
sun_light.light_color = Color(1.0, 0.95, 0.8, 1.0)
"Summer":
sun_light.light_color = Color(1.0, 1.0, 0.9, 1.0)
light_intensity *= 1.2
"Fall":
sun_light.light_color = Color(1.0, 0.8, 0.6, 1.0)
"Winter":
sun_light.light_color = Color(0.8, 0.9, 1.0, 1.0)
light_intensity *= 0.7
sun_light.light_energy = light_intensity
func _update_seasonal_effects():
print("Season changed to: ", current_season)
# Additional seasonal effects can be added here
func get_current_time_string() -> String:
var period = "AM" if current_hour < 12 else "PM"
var display_hour = current_hour
if display_hour == 0:
display_hour = 12
elif display_hour > 12:
display_hour -= 12
return "%d:%02d %s" % [display_hour, current_minute, period]
func get_season_info() -> String:
var day_in_season = ((current_day - 1) % season_length) + 1
return "%s %d, Year %d" % [current_season, day_in_season, current_year]
func reset_time():
current_time = 0.0
current_day = 1
current_season = "Spring"
current_year = 1
current_hour = 6
current_minute = 0