Add game day tracking to game time system

This commit is contained in:
Jared Miller 2026-02-14 15:54:21 -05:00
parent 15d141b53e
commit d91b180824
Signed by: shmup
GPG key ID: 22B5C6D66A38B06C
2 changed files with 106 additions and 0 deletions

View file

@ -42,6 +42,17 @@ class GameTime:
return hour, minute
def get_game_day(self) -> int:
"""Get current game day (0-based).
Returns:
Current game day since epoch
"""
elapsed_real_seconds = time.time() - self.epoch
elapsed_real_minutes = elapsed_real_seconds / 60
elapsed_game_hours = elapsed_real_minutes / self.real_minutes_per_game_hour
return int(elapsed_game_hours) // 24
# Global game time instance (initialized at server startup)
_game_time: GameTime | None = None
@ -88,3 +99,17 @@ def get_game_time() -> tuple[int, int]:
if _game_time is None:
raise RuntimeError("Game time not initialized. Call init_game_time() first.")
return _game_time.get_game_time()
def get_game_day() -> int:
"""Get current game day from global instance.
Returns:
Current game day (0-based)
Raises:
RuntimeError: If game time not initialized
"""
if _game_time is None:
raise RuntimeError("Game time not initialized. Call init_game_time() first.")
return _game_time.get_game_day()

81
tests/test_gametime.py Normal file
View file

@ -0,0 +1,81 @@
"""Tests for the game time system."""
import time
import pytest
from mudlib.gametime import GameTime, get_game_day, get_game_hour, init_game_time
def test_get_game_hour_at_epoch():
"""Game hour should be 0 at epoch."""
epoch = time.time()
gt = GameTime(epoch, real_minutes_per_game_hour=1.0)
assert gt.get_game_hour() == 0
def test_get_game_hour_after_one_hour():
"""Game hour should advance after one real minute."""
epoch = time.time() - 60 # one real minute ago
gt = GameTime(epoch, real_minutes_per_game_hour=1.0)
assert gt.get_game_hour() == 1
def test_get_game_hour_wraps_at_24():
"""Game hour should wrap from 23 back to 0."""
epoch = time.time() - (24 * 60) # 24 real minutes ago
gt = GameTime(epoch, real_minutes_per_game_hour=1.0)
assert gt.get_game_hour() == 0
def test_get_game_day_at_epoch():
"""Game day should be 0 at epoch."""
epoch = time.time()
gt = GameTime(epoch, real_minutes_per_game_hour=1.0)
assert gt.get_game_day() == 0
def test_get_game_day_after_24_hours():
"""Game day should be 1 after 24 game hours."""
epoch = time.time() - (24 * 60) # 24 real minutes ago = 24 game hours
gt = GameTime(epoch, real_minutes_per_game_hour=1.0)
assert gt.get_game_day() == 1
def test_get_game_day_after_48_hours():
"""Game day should be 2 after 48 game hours."""
epoch = time.time() - (48 * 60) # 48 real minutes ago
gt = GameTime(epoch, real_minutes_per_game_hour=1.0)
assert gt.get_game_day() == 2
def test_get_game_day_partial_day():
"""Game day should not increment until 24 hours have passed."""
epoch = time.time() - (12 * 60) # 12 real minutes ago = 12 game hours
gt = GameTime(epoch, real_minutes_per_game_hour=1.0)
assert gt.get_game_day() == 0
def test_global_get_game_hour():
"""Global get_game_hour should work after init."""
init_game_time(epoch=time.time(), real_minutes_per_game_hour=1.0)
hour = get_game_hour()
assert 0 <= hour <= 23
def test_global_get_game_day():
"""Global get_game_day should work after init."""
init_game_time(epoch=time.time(), real_minutes_per_game_hour=1.0)
day = get_game_day()
assert day >= 0
def test_global_get_game_day_raises_if_not_initialized():
"""Global get_game_day should raise if not initialized."""
import mudlib.gametime
# reset global state
mudlib.gametime._game_time = None
with pytest.raises(RuntimeError, match="Game time not initialized"):
get_game_day()