게임 안에서 바다의 하루를 정할 수 있게
메뉴 > 시간 하위 메뉴에 세 갈래를 둔다. - 실제 시각: 바깥 시계 그대로 (기본) - 빠르게: 하루를 5분으로 압축해 돌린다 - 한 시각에 멈추기: 새벽/아침/낮/저녁/밤 프리셋의 이름과 시각을 DayCycle.FIXED_PRESETS 한곳에 같이 두어, 메뉴 항목과 실제로 적용되는 시각이 어긋날 수 없게 했다. 고른 값은 window_state의 time_mode/time_hour에 저장한다. 모드를 바꿀 때 지금 보이던 시각을 먼저 잡아 둔다. mode를 먼저 바꾼 뒤 hour()를 부르면 이미 새 모드의 시계를 읽어 0시로 튀었다 -- 낮에 "빠르게"를 켜면 한밤중으로 떨어지는 버그였다. 명령줄 --hour=21은 그대로 살아 있고 FIXED 모드의 지름길이 되었다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+66
-12
@@ -33,6 +33,7 @@ func _ready() -> void:
|
||||
_test_shape_families()
|
||||
_test_upgrades_are_all_production()
|
||||
_test_day_cycle()
|
||||
_test_time_modes()
|
||||
|
||||
if _failures == 0:
|
||||
print("모든 검사 통과")
|
||||
@@ -623,20 +624,22 @@ func _test_upgrades_are_all_production() -> void:
|
||||
|
||||
func _test_day_cycle() -> void:
|
||||
print("하루의 빛")
|
||||
var before := DayCycle.forced_hour
|
||||
var before_mode := DayCycle.mode
|
||||
var before_hour := DayCycle.fixed_hour
|
||||
DayCycle.mode = DayCycle.Mode.FIXED
|
||||
|
||||
DayCycle.forced_hour = 5.0
|
||||
DayCycle.fixed_hour = 5.0
|
||||
check("새벽 5시는 새벽", DayCycle.phase == "새벽", DayCycle.phase)
|
||||
DayCycle.forced_hour = 8.0
|
||||
DayCycle.fixed_hour = 8.0
|
||||
check("아침 8시는 아침", DayCycle.phase == "아침", DayCycle.phase)
|
||||
DayCycle.forced_hour = 13.0
|
||||
DayCycle.fixed_hour = 13.0
|
||||
check("오후 1시는 낮", DayCycle.phase == "낮", DayCycle.phase)
|
||||
DayCycle.forced_hour = 18.0
|
||||
DayCycle.fixed_hour = 18.0
|
||||
check("저녁 6시는 저녁", DayCycle.phase == "저녁", DayCycle.phase)
|
||||
DayCycle.forced_hour = 22.0
|
||||
DayCycle.fixed_hour = 22.0
|
||||
check("밤 10시는 밤", DayCycle.phase == "밤", DayCycle.phase)
|
||||
# 자정을 넘긴 시각은 전날 밤이 이어져야 한다. 여기서 구간이 비면 이름이 빈다.
|
||||
DayCycle.forced_hour = 1.0
|
||||
DayCycle.fixed_hour = 1.0
|
||||
check("새벽 1시도 밤", DayCycle.phase == "밤", DayCycle.phase)
|
||||
|
||||
# 가장 밝은 시각이 한낮 언저리에 있어야 한다. 정점 시각 자체는 표에서 조절한다.
|
||||
@@ -651,18 +654,18 @@ func _test_day_cycle() -> void:
|
||||
check("가장 밝은 때가 한낮 언저리", peak_hour >= 10.0 and peak_hour <= 14.0,
|
||||
"%.1f시" % peak_hour)
|
||||
check("한낮 밝기는 1.0", is_equal_approx(peak_light, 1.0), str(peak_light))
|
||||
DayCycle.forced_hour = 0.0
|
||||
DayCycle.fixed_hour = 0.0
|
||||
var midnight := DayCycle.light
|
||||
DayCycle.forced_hour = 24.0
|
||||
DayCycle.fixed_hour = 24.0
|
||||
check("자정과 24시가 이어진다", is_equal_approx(DayCycle.light, midnight),
|
||||
"%f vs %f" % [DayCycle.light, midnight])
|
||||
|
||||
# 빛이 튀면 해가 순간이동하는 것처럼 보인다. 하루를 훑으며 급변이 없는지 본다.
|
||||
var max_jump := 0.0
|
||||
DayCycle.forced_hour = 0.0
|
||||
DayCycle.fixed_hour = 0.0
|
||||
var prev := DayCycle.light
|
||||
for i in range(1, 481):
|
||||
DayCycle.forced_hour = float(i) / 20.0
|
||||
DayCycle.fixed_hour = float(i) / 20.0
|
||||
max_jump = maxf(max_jump, absf(DayCycle.light - prev))
|
||||
prev = DayCycle.light
|
||||
check("빛이 튀는 곳이 없다", max_jump < 0.05, "최대 변화 %f" % max_jump)
|
||||
@@ -672,4 +675,55 @@ func _test_day_cycle() -> void:
|
||||
check("밤은 낮보다 어둡다", night.r + night.g + night.b < noon.r + noon.g + noon.b)
|
||||
check("저녁은 붉은 쪽으로 기운다", DayCycle.tint_at(18.5).r > DayCycle.tint_at(18.5).b)
|
||||
|
||||
DayCycle.forced_hour = before
|
||||
DayCycle.fixed_hour = before_hour
|
||||
DayCycle.mode = before_mode
|
||||
|
||||
|
||||
func _test_time_modes() -> void:
|
||||
print("시간 설정")
|
||||
var before_mode := DayCycle.mode
|
||||
var before_hour := DayCycle.fixed_hour
|
||||
|
||||
DayCycle.fixed_hour = 22.0
|
||||
DayCycle.mode = DayCycle.Mode.FIXED
|
||||
check("고정하면 그 시각에 멈춘다", is_equal_approx(DayCycle.hour(), 22.0),
|
||||
str(DayCycle.hour()))
|
||||
check("고정한 시각의 이름이 맞다", DayCycle.phase == "밤", DayCycle.phase)
|
||||
check("시계 문자열", DayCycle.clock_text() == "22:00", DayCycle.clock_text())
|
||||
DayCycle.fixed_hour = 18.7
|
||||
check("분까지 나온다", DayCycle.clock_text() == "18:42", DayCycle.clock_text())
|
||||
|
||||
# 24시를 넘겨 넣어도 하루 안으로 돌아와야 한다. 안 그러면 램프가 끝에 붙어 멈춘다.
|
||||
DayCycle.fixed_hour = 26.0
|
||||
check("24시를 넘기면 돌아 들어온다", is_equal_approx(DayCycle.hour(), 2.0),
|
||||
str(DayCycle.hour()))
|
||||
|
||||
# 빠르게로 넘어갈 때 보던 시각에서 이어져야 한다. 0시로 튀면 한밤중으로 뚝 떨어진다.
|
||||
DayCycle.fixed_hour = 15.0
|
||||
DayCycle.mode = DayCycle.Mode.FIXED
|
||||
DayCycle.mode = DayCycle.Mode.FAST
|
||||
check("빠르게는 보던 시각에서 이어진다", absf(DayCycle.hour() - 15.0) < 0.01,
|
||||
str(DayCycle.hour()))
|
||||
|
||||
var start := DayCycle.hour()
|
||||
DayCycle._process(30.0)
|
||||
var moved := DayCycle.hour() - start
|
||||
# 하루 5분이면 30초에 2.4시간이 흐른다.
|
||||
var expected := 30.0 * 24.0 / (DayCycle.FAST_DAY_MINUTES * 60.0)
|
||||
check("빠르게는 압축한 만큼 흐른다", absf(moved - expected) < 0.05,
|
||||
"%f vs %f" % [moved, expected])
|
||||
|
||||
DayCycle.mode = DayCycle.Mode.REAL
|
||||
var now := Time.get_time_dict_from_system()
|
||||
check("실제 시각으로 돌아온다", absf(DayCycle.hour() - float(now.hour)) < 1.01,
|
||||
"%f vs %d시" % [DayCycle.hour(), now.hour])
|
||||
|
||||
# 메뉴에 올리는 프리셋이 모두 제 이름의 구간에 들어 있어야 한다.
|
||||
var named := true
|
||||
for p in DayCycle.FIXED_PRESETS:
|
||||
if DayCycle.phase_at(float(p.hour)) != String(p.name):
|
||||
named = false
|
||||
check("고정 프리셋 이름이 구간과 맞는다", named)
|
||||
|
||||
DayCycle.fixed_hour = before_hour
|
||||
DayCycle.mode = before_mode
|
||||
|
||||
Reference in New Issue
Block a user