Page 1 of 1

Game Time & Seasons

Posted: Wed May 13, 2026 11:04 pm
by Danyel
Official Game Guide
Game Time & Seasons
Written by Topline Staff · Last updated: June 2026
How Time Works
Time in Belverra moves faster than in the real world. Every real day that passes equals two game days — so the world is always in motion, animals age, seasons turn, and the competition calendar advances even when you're not logged in.

One game year spans six real months, meaning two full game years pass for every real year. Game years are numbered from Year 1 (January 2013) and the number increments every six months — once in January, and once in July.

The Game Year
Each game year corresponds to one real calendar half-year. As a reference:
Real PeriodGame Year
January – June 2025Year 25
July – December 2025Year 26
January – June 2026Year 27
July – December 2026Year 28
The current game year is always shown in the site header.

Seasons
Belverra experiences four seasons within every game year — roughly one season every six real weeks. Each half-year runs through a full cycle of Winter, Spring, Summer, and Autumn.
SeasonJan–Jun (approx.)Jul–Dec (approx.)
WinterJan 1 – Feb 9Jul 1 – Aug 9
SpringFeb 10 – Mar 24Aug 10 – Sep 23
SummerMar 25 – May 4Sep 24 – Nov 3
AutumnMay 5 – Jun 30Nov 4 – Dec 31
The current season is shown alongside the game year in the site header.

What This Means for Your Stable
Aging — Horses and dogs age in game years. Because game time moves at twice real speed, a foal born today will be a yearling in about six real months. Plan breeding and competition careers with this in mind.

Health Care — Care intervals (vaccinations, deworming, farrier visits, and so on) are measured in game days. Due dates arrive faster than you might expect — check your animals regularly.

Breeding — Gestation is measured in game days and reflects real-world gestation timelines compressed into game time. A foal or litter is never far away.

Shows — The show calendar runs on real dates. Game year and season provide context for results, records, and future championship qualifying windows.
This is an official Topline guide. If you spot an error or have a suggestion, please post in The Query Board.

Re: Game Year and Season Helper

Posted: Wed Jun 03, 2026 7:08 am
by Danyel
Code: Select all
 <?php
// ═══════════════════════════════════════════════════════════════
// config/game_date.php — Topline game calendar helper
//
// Epoch:  January 1, 2013 = Year 1
// Ratio:  1 real day = 2 game days (affects aging/stats only)
//
// Game year = 6 real months (half a real year)
//   Jan–Jun  = first half of real year
//   Jul–Dec  = second half of real year
//
// Game year formula: (real_year - 2013 + 1), incremented in July
//   Jan–Jun 2013 = Year 1
//   Jul–Dec 2013 = Year 2
//   Jan–Jun 2014 = Year 3
//   ...
//   Jan–Jun 2026 = Year 27
//   Jul–Dec 2026 = Year 28
//
// Seasons cycle twice per real year (once per game year, ~6 weeks each):
//   Winter — day  0–40  of each 6-month half  (~Jan 1  – Feb 10 / Jul 1  – Aug 10)
//   Spring — day 41–82                         (~Feb 11 – Mar 24 / Aug 11 – Sep 23)
//   Summer — day 83–123                        (~Mar 25 – May 5  / Sep 24 – Nov 4 )
//   Autumn — day 124–181                       (~May 6  – Jun 30 / Nov 5  – Dec 31)
// ═══════════════════════════════════════════════════════════════

define('GAME_EPOCH', '2013-01-01');

// ── Current game date ────────────────────────────────────────────
// Returns ['season' => 'Spring', 'year' => 27, 'label' => 'Spring, Year 27']
function game_date_now(): array
{
    return game_date_from_timestamp(time());
}

// ── Game date from a unix timestamp ─────────────────────────────
function game_date_from_timestamp(int $ts): array
{
    $epoch_year = 2013;
    $real_year  = (int) date('Y', $ts);
    $month      = (int) date('n', $ts);

    $half_years = ($real_year - $epoch_year) * 2;
    if ($month >= 7) $half_years++;
    $game_year = $half_years + 1;

    $season = game_season($ts);

    return [
        'season' => $season,
        'year'   => $game_year,
        'label'  => $season . ', Year ' . $game_year,
        'short'  => substr($season, 0, 3) . ' Y' . $game_year,
    ];
}

// ── Game date from a datetime string ────────────────────────────
function game_date_from_string(string $datetime): array
{
    return game_date_from_timestamp(strtotime($datetime));
}

// ── Current game year window ─────────────────────────────────────
// Returns the real date range for the current game year
// Jan–Jun → ['start' => 'YYYY-01-01', 'end' => 'YYYY-06-30']
// Jul–Dec → ['start' => 'YYYY-07-01', 'end' => 'YYYY-12-31']
function current_game_year_window(): array
{
    $month     = (int) date('n');
    $real_year = (int) date('Y');

    if ($month <= 6) {
        return [
            'start' => $real_year . '-01-01',
            'end'   => $real_year . '-06-30',
        ];
    } else {
        return [
            'start' => $real_year . '-07-01',
            'end'   => $real_year . '-12-31',
        ];
    }
}

// ── Game year window for a specific game year ────────────────────
// Pass the game year integer, returns real date range
function game_year_window(int $game_year): array
{
    $epoch_year = (int) date('Y', strtotime(GAME_EPOCH));

    // game_year 1 = Jan–Jun 2013, game_year 2 = Jul–Dec 2013, etc.
    $half_index = $game_year - 1; // 0-based
    $real_year  = $epoch_year + (int) floor($half_index / 2);

    if ($half_index % 2 === 0) {
        return [
            'start' => $real_year . '-01-01',
            'end'   => $real_year . '-06-30',
        ];
    } else {
        return [
            'start' => $real_year . '-07-01',
            'end'   => $real_year . '-12-31',
        ];
    }
}

// ── Season from unix timestamp ───────────────────────────────────
// Seasons cycle twice per real year; each season is ~6 real weeks.
// Uses day-of-year mod 182 to find position within the 6-month half.
function game_season(int $ts): string
{
    $doy  = (int) date('z', $ts); // 0-based day of year, 0–364
    $half = $doy % 182;           // position within the 6-month cycle

    return match(true) {
        $half < 41  => 'Winter',  // ~Jan 1  – Feb 10 / Jul 1  – Aug 10
        $half < 83  => 'Spring',  // ~Feb 11 – Mar 24 / Aug 11 – Sep 23
        $half < 124 => 'Summer',  // ~Mar 25 – May 5  / Sep 24 – Nov 4
        default     => 'Autumn',  // ~May 6  – Jun 30 / Nov 5  – Dec 31
    };
}

// ── Season CSS class ─────────────────────────────────────────────
function game_season_class(string $season): string
{
    return match($season) {
        'Spring' => 'season-spring',
        'Summer' => 'season-summer',
        'Autumn' => 'season-autumn',
        'Winter' => 'season-winter',
        default  => '',
    };
}

// ── Season icon ──────────────────────────────────────────────────
function game_season_icon(string $season): string
{
    return match($season) {
        'Spring' => '🌿',
        'Summer' => '☀️',
        'Autumn' => '🍂',
        'Winter' => '❄️',
        default  => '',
    };
}
?>
Useage
Code: Select all
require_once ‘game_date.php’;
$gd = game_date_now();

echo $gd['label']; // Season, Year XX
echo $gd['year']; // year number

//Calculate Horse Age
$horseAge = $gd['year'] - $horseYear;