diff --git a/src/timer/timer_game_calendar.cpp b/src/timer/timer_game_calendar.cpp index 87f0ca81cf..1dcc1c79ee 100644 --- a/src/timer/timer_game_calendar.cpp +++ b/src/timer/timer_game_calendar.cpp @@ -33,6 +33,30 @@ TimerGameCalendar::Month TimerGameCalendar::month = {}; TimerGameCalendar::Date TimerGameCalendar::date = {}; TimerGameCalendar::DateFract TimerGameCalendar::date_fract = {}; +/** + * Converts a Date to a Year, Month & Day. + * @param date the date to convert from + * @returns YearMonthDay representation of the Date. + */ +/* static */ TimerGameCalendar::YearMonthDay TimerGameCalendar::ConvertDateToYMD(TimerGameCalendar::Date date) +{ + /* This wrapper function only exists because economy time sometimes does things differently, when using wallclock units. */ + return CalendarConvertDateToYMD(date); +} + +/** + * Converts a tuple of Year, Month and Day to a Date. + * @param year is a number between 0..MAX_YEAR + * @param month is a number between 0..11 + * @param day is a number between 1..31 + * @returns The equivalent date. + */ +/* static */ TimerGameCalendar::Date TimerGameCalendar::ConvertYMDToDate(TimerGameCalendar::Year year, TimerGameCalendar::Month month, TimerGameCalendar::Day day) +{ + /* This wrapper function only exists because economy time sometimes does things differently, when using wallclock units. */ + return CalendarConvertYMDToDate(year, month, day); +} + /** * Set the date. * @param date New date diff --git a/src/timer/timer_game_calendar.h b/src/timer/timer_game_calendar.h index 3ec2b66fdd..7994b57fa7 100644 --- a/src/timer/timer_game_calendar.h +++ b/src/timer/timer_game_calendar.h @@ -34,6 +34,8 @@ public: static Date date; ///< Current date in days (day counter). static DateFract date_fract; ///< Fractional part of the day. + static YearMonthDay ConvertDateToYMD(Date date); + static Date ConvertYMDToDate(Year year, Month month, Day day); static void SetDate(Date date, DateFract fract); }; diff --git a/src/timer/timer_game_common.cpp b/src/timer/timer_game_common.cpp index 13bd9bf5e1..cc145d6380 100644 --- a/src/timer/timer_game_common.cpp +++ b/src/timer/timer_game_common.cpp @@ -63,7 +63,7 @@ static constexpr uint16_t _accum_days_for_month[] = { * @returns YearMonthDay representation of the Date. */ template -/* static */ typename TimerGame::YearMonthDay TimerGame::ConvertDateToYMD(Date date) +/* static */ typename TimerGame::YearMonthDay TimerGame::CalendarConvertDateToYMD(Date date) { /* Year determination in multiple steps to account for leap * years. First do the large steps, then the smaller ones. @@ -118,9 +118,10 @@ template * @param year is a number between 0..MAX_YEAR * @param month is a number between 0..11 * @param day is a number between 1..31 + * @returns The equivalent date. */ template -/* static */ typename TimerGame::Date TimerGame::ConvertYMDToDate(Year year, Month month, Day day) +/* static */ typename TimerGame::Date TimerGame::CalendarConvertYMDToDate(Year year, Month month, Day day) { /* Day-offset in a leap year */ int days = _accum_days_for_month[month] + day - 1; @@ -133,8 +134,8 @@ template /* Create instances of the two template variants that we have. * This is needed, as this templated functions are not in a header-file. */ -template TimerGame::YearMonthDay TimerGame::ConvertDateToYMD(Date date); -template TimerGame::YearMonthDay TimerGame::ConvertDateToYMD(Date date); +template TimerGame::YearMonthDay TimerGame::CalendarConvertDateToYMD(Date date); +template TimerGame::YearMonthDay TimerGame::CalendarConvertDateToYMD(Date date); -template TimerGame::Date TimerGame::ConvertYMDToDate(Year year, Month month, Day day); -template TimerGame::Date TimerGame::ConvertYMDToDate(Year year, Month month, Day day); +template TimerGame::Date TimerGame::CalendarConvertYMDToDate(Year year, Month month, Day day); +template TimerGame::Date TimerGame::CalendarConvertYMDToDate(Year year, Month month, Day day); diff --git a/src/timer/timer_game_common.h b/src/timer/timer_game_common.h index f807359e1c..1481f9581f 100644 --- a/src/timer/timer_game_common.h +++ b/src/timer/timer_game_common.h @@ -66,8 +66,8 @@ public: return year_as_int % 4 == 0 && (year_as_int % 100 != 0 || year_as_int % 400 == 0); } - static YearMonthDay ConvertDateToYMD(Date date); - static Date ConvertYMDToDate(Year year, Month month, Day day); + static YearMonthDay CalendarConvertDateToYMD(Date date); + static Date CalendarConvertYMDToDate(Year year, Month month, Day day); /** * Calculate the year of a given date. diff --git a/src/timer/timer_game_economy.cpp b/src/timer/timer_game_economy.cpp index 3ce004bae6..474fcfd461 100644 --- a/src/timer/timer_game_economy.cpp +++ b/src/timer/timer_game_economy.cpp @@ -38,6 +38,41 @@ TimerGameEconomy::Month TimerGameEconomy::month = {}; TimerGameEconomy::Date TimerGameEconomy::date = {}; TimerGameEconomy::DateFract TimerGameEconomy::date_fract = {}; +/** + * Converts a Date to a Year, Month & Day. + * @param date the date to convert from + * @returns YearMonthDay representation of the Date. + */ +/* static */ TimerGameEconomy::YearMonthDay TimerGameEconomy::ConvertDateToYMD(TimerGameEconomy::Date date) +{ + /* If we're not using wallclock units, we keep the economy date in sync with the calendar. */ + if (!UsingWallclockUnits()) return CalendarConvertDateToYMD(date); + + /* If we're using wallclock units, economy months have 30 days and an economy year has 360 days. */ + TimerGameEconomy::YearMonthDay ymd; + ymd.year = TimerGameEconomy::date.base() / EconomyTime::DAYS_IN_ECONOMY_YEAR; + ymd.month = (TimerGameEconomy::date.base() % EconomyTime::DAYS_IN_ECONOMY_YEAR) / EconomyTime::DAYS_IN_ECONOMY_MONTH; + ymd.day = TimerGameEconomy::date.base() % EconomyTime::DAYS_IN_ECONOMY_MONTH; + return ymd; +} + +/** + * Converts a tuple of Year, Month and Day to a Date. + * @param year is a number between 0..MAX_YEAR + * @param month is a number between 0..11 + * @param day is a number between 1..31 + * @returns The equivalent date. + */ +/* static */ TimerGameEconomy::Date TimerGameEconomy::ConvertYMDToDate(TimerGameEconomy::Year year, TimerGameEconomy::Month month, TimerGameEconomy::Day day) +{ + /* If we're not using wallclock units, we keep the economy date in sync with the calendar. */ + if (!UsingWallclockUnits()) return CalendarConvertYMDToDate(year, month, day); + + /* If we're using wallclock units, economy months have 30 days and an economy year has 360 days. */ + const int total_months = (year.base() * EconomyTime::MONTHS_IN_YEAR) + month; + return (total_months * EconomyTime::DAYS_IN_ECONOMY_MONTH) + day - 1; // Day is 1-indexed but Date is 0-indexed, hence the - 1. +} + /** * Set the date. * @param date The new date diff --git a/src/timer/timer_game_economy.h b/src/timer/timer_game_economy.h index 4c723c0fd4..81df5ff179 100644 --- a/src/timer/timer_game_economy.h +++ b/src/timer/timer_game_economy.h @@ -37,6 +37,8 @@ public: static Date date; ///< Current date in days (day counter). static DateFract date_fract; ///< Fractional part of the day. + static YearMonthDay ConvertDateToYMD(Date date); + static Date ConvertYMDToDate(Year year, Month month, Day day); static void SetDate(Date date, DateFract fract); static bool UsingWallclockUnits(bool newgame = false); }; @@ -44,6 +46,10 @@ public: /** * Storage class for Economy time constants. */ -class EconomyTime : public TimerGameConst {}; +class EconomyTime : public TimerGameConst { +public: + static constexpr int DAYS_IN_ECONOMY_YEAR = 360; ///< Days in an economy year, when in wallclock timekeeping mode. + static constexpr int DAYS_IN_ECONOMY_MONTH = 30; ///< Days in an economy month, when in wallclock timekeeping mode. +}; #endif /* TIMER_GAME_ECONOMY_H */