Game Time
Posted by Elowrae on 2026-02-03 07:17
- Topline runs as a slighly excellerated time scale. 1 Real Year = 2 Game Years.
- The current game year and season is displayed in the header of each webpage for easy reference.
- Animals age on January 1st and July 1st.
Function to fetch current Game Time:
Code: Select allfunction game_year_info(DateTime $now): array
{
$startDate = '2018-01-01'; // the actual date of when the first game year accured
$gameEpochYear = 1; // the number of the first game year
// -------------------------
// Game-year start (Jan 1 / Jul 1)
// -------------------------
$realYear = (int)$now->format('Y');
$realMonth = (int)$now->format('n');
if ($realMonth <= 6) {
$start = new DateTime("$realYear-01-01 00:00:00");
} else {
$start = new DateTime("$realYear-07-01 00:00:00");
}
// -------------------------
// Game year number (monotonic)
// -------------------------
$epoch = new DateTime($startDate);
$epochYear = (int)$epoch->format('Y');
$epochHalf = ((int)$epoch->format('n') <= 6) ? 0 : 1;
$currentHalf = ($realMonth <= 6) ? 0 : 1;
$gameYear =
$gameEpochYear
+ (($realYear - $epochYear) * 2)
+ ($currentHalf - $epochHalf);
// -------------------------
// Season (360-day internal year)
// -------------------------
$end = (clone $start)->modify('+6 months');
$secondsPerDay = 86400;
$elapsedDays = intdiv(
max(0, $now->getTimestamp() - $start->getTimestamp()),
$secondsPerDay
);
$spanDays = max(1, intdiv(
$end->getTimestamp() - $start->getTimestamp(),
$secondsPerDay
));
// Scale real progress → 360-day internal year
$gameDay0 = (int)floor(($elapsedDays / $spanDays) * 360);
$gameDay0 = max(0, min(359, $gameDay0));
if ($gameDay0 <= 89) {
$season = 'Winter';
} elseif ($gameDay0 <= 179) {
$season = 'Spring';
} elseif ($gameDay0 <= 269) {
$season = 'Summer';
} else {
$season = 'Fall';
}
return [
'year' => $gameYear, // use this if you only want the year
'season' => $season,
'year_start' => $start->format('Y-m-d'),
];
}
Display Year & Season:
Code: Select all$gt = game_year_info(new DateTime());
echo "Year {$gt['year']} — {$gt['season']}";
or just the year as a integer:
Code: Select all$gameYear = game_year_info(new DateTime())['year'];