mirror of https://github.com/OpenRCT2/OpenRCT2.git
Refactor and clean up date handling (#19666)
* Refactor and clean up date handling * Remove gDate, remove direct access to days_in_month * Adjust the MultiLaunch test * Bump network version --------- Co-authored-by: ζeh Matt <5415177+ZehMatt@users.noreply.github.com>
This commit is contained in:
parent
9e4099fcdf
commit
fd80b4c822
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include <openrct2-ui/interface/Graph.h>
|
#include <openrct2-ui/interface/Graph.h>
|
||||||
#include <openrct2/Context.h>
|
#include <openrct2/Context.h>
|
||||||
|
#include <openrct2/Date.h>
|
||||||
#include <openrct2/localisation/Date.h>
|
#include <openrct2/localisation/Date.h>
|
||||||
#include <openrct2/localisation/Formatter.h>
|
#include <openrct2/localisation/Formatter.h>
|
||||||
#include <openrct2/localisation/Localisation.h>
|
#include <openrct2/localisation/Localisation.h>
|
||||||
|
@ -17,8 +18,9 @@ namespace Graph
|
||||||
{
|
{
|
||||||
static void DrawMonths(DrawPixelInfo* dpi, const uint8_t* history, int32_t count, const ScreenCoordsXY& origCoords)
|
static void DrawMonths(DrawPixelInfo* dpi, const uint8_t* history, int32_t count, const ScreenCoordsXY& origCoords)
|
||||||
{
|
{
|
||||||
int32_t currentMonth = DateGetMonth(gDateMonthsElapsed);
|
auto& date = GetDate();
|
||||||
int32_t currentDay = gDateMonthTicks;
|
int32_t currentMonth = date.GetMonth();
|
||||||
|
int32_t currentDay = date.GetMonthTicks();
|
||||||
int32_t yearOver32 = (currentMonth * 4) + (currentDay >> 14) - 31;
|
int32_t yearOver32 = (currentMonth * 4) + (currentDay >> 14) - 31;
|
||||||
auto screenCoords = origCoords;
|
auto screenCoords = origCoords;
|
||||||
for (int32_t i = count - 1; i >= 0; i--)
|
for (int32_t i = count - 1; i >= 0; i--)
|
||||||
|
@ -152,13 +154,12 @@ namespace Graph
|
||||||
{
|
{
|
||||||
static void DrawMonths(DrawPixelInfo* dpi, const money64* history, int32_t count, const ScreenCoordsXY& origCoords)
|
static void DrawMonths(DrawPixelInfo* dpi, const money64* history, int32_t count, const ScreenCoordsXY& origCoords)
|
||||||
{
|
{
|
||||||
int32_t i, yearOver32, currentMonth, currentDay;
|
auto& date = GetDate();
|
||||||
|
int32_t currentMonth = date.GetMonth();
|
||||||
currentMonth = DateGetMonth(gDateMonthsElapsed);
|
int32_t currentDay = date.GetMonthTicks();
|
||||||
currentDay = gDateMonthTicks;
|
int32_t yearOver32 = (currentMonth * 4) + (currentDay >> 14) - 31;
|
||||||
yearOver32 = (currentMonth * 4) + (currentDay >> 14) - 31;
|
|
||||||
auto screenCoords = origCoords;
|
auto screenCoords = origCoords;
|
||||||
for (i = count - 1; i >= 0; i--)
|
for (int32_t i = count - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
if (history[i] != MONEY64_UNDEFINED && yearOver32 % 4 == 0)
|
if (history[i] != MONEY64_UNDEFINED && yearOver32 % 4 == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,6 +31,8 @@
|
||||||
constexpr auto CHEATS_MONEY_DEFAULT = 10000.00_GBP;
|
constexpr auto CHEATS_MONEY_DEFAULT = 10000.00_GBP;
|
||||||
constexpr auto CHEATS_MONEY_INCREMENT_DIV = 5000.00_GBP;
|
constexpr auto CHEATS_MONEY_INCREMENT_DIV = 5000.00_GBP;
|
||||||
|
|
||||||
|
using OpenRCT2::Date;
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -724,37 +726,41 @@ private:
|
||||||
case WIDX_MONTH_UP:
|
case WIDX_MONTH_UP:
|
||||||
_monthSpinnerValue++;
|
_monthSpinnerValue++;
|
||||||
_monthSpinnerValue = std::clamp(_monthSpinnerValue, 1, static_cast<int32_t>(MONTH_COUNT));
|
_monthSpinnerValue = std::clamp(_monthSpinnerValue, 1, static_cast<int32_t>(MONTH_COUNT));
|
||||||
_daySpinnerValue = std::clamp(_daySpinnerValue, 1, static_cast<int32_t>(days_in_month[_monthSpinnerValue - 1]));
|
_daySpinnerValue = std::clamp(
|
||||||
|
_daySpinnerValue, 1, static_cast<int32_t>(Date::GetDaysInMonth(_monthSpinnerValue - 1)));
|
||||||
InvalidateWidget(WIDX_MONTH_BOX);
|
InvalidateWidget(WIDX_MONTH_BOX);
|
||||||
InvalidateWidget(WIDX_DAY_BOX);
|
InvalidateWidget(WIDX_DAY_BOX);
|
||||||
break;
|
break;
|
||||||
case WIDX_MONTH_DOWN:
|
case WIDX_MONTH_DOWN:
|
||||||
_monthSpinnerValue--;
|
_monthSpinnerValue--;
|
||||||
_monthSpinnerValue = std::clamp(_monthSpinnerValue, 1, static_cast<int32_t>(MONTH_COUNT));
|
_monthSpinnerValue = std::clamp(_monthSpinnerValue, 1, static_cast<int32_t>(MONTH_COUNT));
|
||||||
_daySpinnerValue = std::clamp(_daySpinnerValue, 1, static_cast<int32_t>(days_in_month[_monthSpinnerValue - 1]));
|
_daySpinnerValue = std::clamp(
|
||||||
|
_daySpinnerValue, 1, static_cast<int32_t>(Date::GetDaysInMonth(_monthSpinnerValue - 1)));
|
||||||
InvalidateWidget(WIDX_MONTH_BOX);
|
InvalidateWidget(WIDX_MONTH_BOX);
|
||||||
InvalidateWidget(WIDX_DAY_BOX);
|
InvalidateWidget(WIDX_DAY_BOX);
|
||||||
break;
|
break;
|
||||||
case WIDX_DAY_UP:
|
case WIDX_DAY_UP:
|
||||||
_daySpinnerValue++;
|
_daySpinnerValue++;
|
||||||
_daySpinnerValue = std::clamp(_daySpinnerValue, 1, static_cast<int32_t>(days_in_month[_monthSpinnerValue - 1]));
|
_daySpinnerValue = std::clamp(
|
||||||
|
_daySpinnerValue, 1, static_cast<int32_t>(Date::GetDaysInMonth(_monthSpinnerValue - 1)));
|
||||||
InvalidateWidget(WIDX_DAY_BOX);
|
InvalidateWidget(WIDX_DAY_BOX);
|
||||||
break;
|
break;
|
||||||
case WIDX_DAY_DOWN:
|
case WIDX_DAY_DOWN:
|
||||||
_daySpinnerValue--;
|
_daySpinnerValue--;
|
||||||
_daySpinnerValue = std::clamp(_daySpinnerValue, 1, static_cast<int32_t>(days_in_month[_monthSpinnerValue - 1]));
|
_daySpinnerValue = std::clamp(
|
||||||
|
_daySpinnerValue, 1, static_cast<int32_t>(Date::GetDaysInMonth(_monthSpinnerValue - 1)));
|
||||||
InvalidateWidget(WIDX_DAY_BOX);
|
InvalidateWidget(WIDX_DAY_BOX);
|
||||||
break;
|
break;
|
||||||
case WIDX_DATE_SET:
|
case WIDX_DATE_SET:
|
||||||
{
|
{
|
||||||
auto setDateAction = ParkSetDateAction(_yearSpinnerValue, _monthSpinnerValue, _daySpinnerValue);
|
auto setDateAction = ParkSetDateAction(_yearSpinnerValue - 1, _monthSpinnerValue - 1, _daySpinnerValue - 1);
|
||||||
GameActions::Execute(&setDateAction);
|
GameActions::Execute(&setDateAction);
|
||||||
WindowInvalidateByClass(WindowClass::BottomToolbar);
|
WindowInvalidateByClass(WindowClass::BottomToolbar);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WIDX_DATE_RESET:
|
case WIDX_DATE_RESET:
|
||||||
{
|
{
|
||||||
auto setDateAction = ParkSetDateAction(1, 1, 1);
|
auto setDateAction = ParkSetDateAction(0, 0, 0);
|
||||||
GameActions::Execute(&setDateAction);
|
GameActions::Execute(&setDateAction);
|
||||||
WindowInvalidateByClass(WindowClass::BottomToolbar);
|
WindowInvalidateByClass(WindowClass::BottomToolbar);
|
||||||
InvalidateWidget(WIDX_YEAR_BOX);
|
InvalidateWidget(WIDX_YEAR_BOX);
|
||||||
|
|
|
@ -224,13 +224,13 @@ static_assert(std::size(_windowFinancesPageHoldDownWidgets) == WINDOW_FINANCES_P
|
||||||
class FinancesWindow final : public Window
|
class FinancesWindow final : public Window
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
int32_t _lastPaintedMonth;
|
uint32_t _lastPaintedMonth;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void OnOpen() override
|
void OnOpen() override
|
||||||
{
|
{
|
||||||
SetPage(WINDOW_FINANCES_PAGE_SUMMARY);
|
SetPage(WINDOW_FINANCES_PAGE_SUMMARY);
|
||||||
_lastPaintedMonth = std::numeric_limits<int32_t>::max();
|
_lastPaintedMonth = std::numeric_limits<uint32_t>::max();
|
||||||
ResearchUpdateUncompletedTypes();
|
ResearchUpdateUncompletedTypes();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -381,7 +381,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expenditure / Income values for each month
|
// Expenditure / Income values for each month
|
||||||
uint16_t currentMonthYear = static_cast<uint16_t>(gDateMonthsElapsed);
|
auto currentMonthYear = GetDate().GetMonthsElapsed();
|
||||||
for (int32_t i = SummaryMaxAvailableMonth(); i >= 0; i--)
|
for (int32_t i = SummaryMaxAvailableMonth(); i >= 0; i--)
|
||||||
{
|
{
|
||||||
screenCoords.y = 0;
|
screenCoords.y = 0;
|
||||||
|
@ -522,7 +522,7 @@ public:
|
||||||
ft.Add<money64>(gBankLoan);
|
ft.Add<money64>(gBankLoan);
|
||||||
|
|
||||||
// Keep up with new months being added in the first two years.
|
// Keep up with new months being added in the first two years.
|
||||||
if (gDateMonthsElapsed != _lastPaintedMonth)
|
if (GetDate().GetMonthsElapsed() != _lastPaintedMonth)
|
||||||
InitialiseScrollPosition(WIDX_SUMMARY_SCROLL, 0);
|
InitialiseScrollPosition(WIDX_SUMMARY_SCROLL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -593,7 +593,7 @@ public:
|
||||||
|
|
||||||
uint16_t SummaryMaxAvailableMonth()
|
uint16_t SummaryMaxAvailableMonth()
|
||||||
{
|
{
|
||||||
return std::min<uint16_t>(gDateMonthsElapsed, EXPENDITURE_TABLE_MONTH_COUNT - 1);
|
return std::min<uint16_t>(GetDate().GetMonthsElapsed(), EXPENDITURE_TABLE_MONTH_COUNT - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
|
@ -190,7 +190,6 @@ static void WindowGameBottomToolbarMouseup(WindowBase* w, WidgetIndex widgetInde
|
||||||
|
|
||||||
static OpenRCT2String WindowGameBottomToolbarTooltip(WindowBase* w, const WidgetIndex widgetIndex, const StringId fallback)
|
static OpenRCT2String WindowGameBottomToolbarTooltip(WindowBase* w, const WidgetIndex widgetIndex, const StringId fallback)
|
||||||
{
|
{
|
||||||
int32_t month, day;
|
|
||||||
auto ft = Formatter();
|
auto ft = Formatter();
|
||||||
|
|
||||||
switch (widgetIndex)
|
switch (widgetIndex)
|
||||||
|
@ -202,13 +201,6 @@ static OpenRCT2String WindowGameBottomToolbarTooltip(WindowBase* w, const Widget
|
||||||
case WIDX_PARK_RATING:
|
case WIDX_PARK_RATING:
|
||||||
ft.Add<int16_t>(gParkRating);
|
ft.Add<int16_t>(gParkRating);
|
||||||
break;
|
break;
|
||||||
case WIDX_DATE:
|
|
||||||
month = DateGetMonth(gDateMonthsElapsed);
|
|
||||||
day = ((gDateMonthTicks * days_in_month[month]) >> 16) & 0xFF;
|
|
||||||
|
|
||||||
ft.Add<StringId>(DateDayNames[day]);
|
|
||||||
ft.Add<StringId>(DateGameMonthNames[month]);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return { fallback, ft };
|
return { fallback, ft };
|
||||||
}
|
}
|
||||||
|
@ -496,9 +488,10 @@ static void WindowGameBottomToolbarDrawRightPanel(DrawPixelInfo* dpi, WindowBase
|
||||||
window_game_bottom_toolbar_widgets[WIDX_RIGHT_OUTSET].top + w->windowPos.y + 2 };
|
window_game_bottom_toolbar_widgets[WIDX_RIGHT_OUTSET].top + w->windowPos.y + 2 };
|
||||||
|
|
||||||
// Date
|
// Date
|
||||||
int32_t year = DateGetYear(gDateMonthsElapsed) + 1;
|
auto& date = GetDate();
|
||||||
int32_t month = DateGetMonth(gDateMonthsElapsed);
|
int32_t year = date.GetYear() + 1;
|
||||||
int32_t day = ((gDateMonthTicks * days_in_month[month]) >> 16) & 0xFF;
|
int32_t month = date.GetMonth();
|
||||||
|
int32_t day = date.GetDay();
|
||||||
|
|
||||||
colour_t colour
|
colour_t colour
|
||||||
= (gHoverWidget.window_classification == WindowClass::BottomToolbar && gHoverWidget.widget_index == WIDX_DATE
|
= (gHoverWidget.window_classification == WindowClass::BottomToolbar && gHoverWidget.widget_index == WIDX_DATE
|
||||||
|
|
|
@ -9,7 +9,10 @@
|
||||||
|
|
||||||
#include "localisation/Date.h"
|
#include "localisation/Date.h"
|
||||||
|
|
||||||
|
#include "Context.h"
|
||||||
#include "Date.h"
|
#include "Date.h"
|
||||||
|
#include "Game.h"
|
||||||
|
#include "GameState.h"
|
||||||
#include "core/Guard.hpp"
|
#include "core/Guard.hpp"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -21,6 +24,13 @@ constexpr int32_t MASK_WEEK_TICKS = 0x3FFF;
|
||||||
constexpr int32_t MASK_FORTNIGHT_TICKS = 0x7FFF;
|
constexpr int32_t MASK_FORTNIGHT_TICKS = 0x7FFF;
|
||||||
constexpr int32_t MASK_MONTH_TICKS = 0xFFFF;
|
constexpr int32_t MASK_MONTH_TICKS = 0xFFFF;
|
||||||
|
|
||||||
|
// rct2: 0x00993988
|
||||||
|
static const int16_t days_in_month[MONTH_COUNT] = {
|
||||||
|
31, 30, 31, 30, 31, 31, 30, 31,
|
||||||
|
};
|
||||||
|
|
||||||
|
RealWorldTime gRealTimeOfDay;
|
||||||
|
|
||||||
Date::Date(uint32_t monthsElapsed, uint16_t monthTicks)
|
Date::Date(uint32_t monthsElapsed, uint16_t monthTicks)
|
||||||
: _monthTicks(monthTicks)
|
: _monthTicks(monthTicks)
|
||||||
, _monthsElapsed(monthsElapsed)
|
, _monthsElapsed(monthsElapsed)
|
||||||
|
@ -29,17 +39,17 @@ Date::Date(uint32_t monthsElapsed, uint16_t monthTicks)
|
||||||
|
|
||||||
Date Date::FromYMD(int32_t year, int32_t month, int32_t day)
|
Date Date::FromYMD(int32_t year, int32_t month, int32_t day)
|
||||||
{
|
{
|
||||||
// Year, months
|
year = std::clamp(year, 0, MAX_YEAR - 1);
|
||||||
Guard::ArgumentInRange(month, 0, MONTH_COUNT - 1);
|
month = std::clamp(month, 0, static_cast<int>(MONTH_COUNT) - 1);
|
||||||
int32_t monthsElapsed = (year * MONTH_COUNT) + month;
|
auto daysInMonth = days_in_month[month];
|
||||||
|
day = std::clamp(day, 0, daysInMonth - 1);
|
||||||
|
|
||||||
|
int32_t monthsElapsed = (year * MONTH_COUNT) + month;
|
||||||
// Day
|
// Day
|
||||||
int32_t monthTicks = 0;
|
int32_t monthTicks = 0;
|
||||||
if (day != 0)
|
if (day != 0)
|
||||||
{
|
{
|
||||||
auto daysInMonth = GetDaysInMonth(month);
|
monthTicks = ((day << 16) / daysInMonth) + MONTH_TICKS_INCREMENT;
|
||||||
day = std::clamp(day, 0, daysInMonth - 1);
|
|
||||||
monthTicks = (day << 16) / daysInMonth;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Date(monthsElapsed, monthTicks);
|
return Date(monthsElapsed, monthTicks);
|
||||||
|
@ -119,3 +129,33 @@ int32_t Date::GetDaysInMonth(int32_t month)
|
||||||
|
|
||||||
return days_in_month[month];
|
return days_in_month[month];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t DateGetMonth(int32_t months)
|
||||||
|
{
|
||||||
|
return months % MONTH_COUNT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t DateGetYear(int32_t months)
|
||||||
|
{
|
||||||
|
return months / MONTH_COUNT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t DateGetTotalMonths(int32_t month, int32_t year)
|
||||||
|
{
|
||||||
|
return (year - 1) * MONTH_COUNT + month;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DateUpdateRealTimeOfDay()
|
||||||
|
{
|
||||||
|
time_t timestamp = time(nullptr);
|
||||||
|
struct tm* now = localtime(×tamp);
|
||||||
|
|
||||||
|
gRealTimeOfDay.second = now->tm_sec;
|
||||||
|
gRealTimeOfDay.minute = now->tm_min;
|
||||||
|
gRealTimeOfDay.hour = now->tm_hour;
|
||||||
|
}
|
||||||
|
|
||||||
|
Date& GetDate()
|
||||||
|
{
|
||||||
|
return OpenRCT2::GetContext()->GetGameState()->GetDate();
|
||||||
|
}
|
||||||
|
|
|
@ -11,6 +11,31 @@
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
constexpr int32_t MAX_YEAR = 8192;
|
||||||
|
constexpr int32_t TICKS_PER_MONTH = 0x10000;
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
MONTH_MARCH,
|
||||||
|
MONTH_APRIL,
|
||||||
|
MONTH_MAY,
|
||||||
|
MONTH_JUNE,
|
||||||
|
MONTH_JULY,
|
||||||
|
MONTH_AUGUST,
|
||||||
|
MONTH_SEPTEMBER,
|
||||||
|
MONTH_OCTOBER,
|
||||||
|
|
||||||
|
MONTH_COUNT
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
DATE_FORMAT_DAY_MONTH_YEAR,
|
||||||
|
DATE_FORMAT_MONTH_DAY_YEAR,
|
||||||
|
DATE_FORMAT_YEAR_MONTH_DAY,
|
||||||
|
DATE_FORMAT_YEAR_DAY_MONTH
|
||||||
|
};
|
||||||
|
|
||||||
namespace OpenRCT2
|
namespace OpenRCT2
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -44,3 +69,26 @@ namespace OpenRCT2
|
||||||
static int32_t GetDaysInMonth(int32_t month);
|
static int32_t GetDaysInMonth(int32_t month);
|
||||||
};
|
};
|
||||||
} // namespace OpenRCT2
|
} // namespace OpenRCT2
|
||||||
|
|
||||||
|
struct RealWorldDate
|
||||||
|
{
|
||||||
|
uint8_t day;
|
||||||
|
uint8_t month;
|
||||||
|
int16_t year;
|
||||||
|
uint8_t day_of_week;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RealWorldTime
|
||||||
|
{
|
||||||
|
uint8_t second;
|
||||||
|
uint8_t minute;
|
||||||
|
uint8_t hour;
|
||||||
|
};
|
||||||
|
|
||||||
|
OpenRCT2::Date& GetDate();
|
||||||
|
extern RealWorldTime gRealTimeOfDay;
|
||||||
|
|
||||||
|
int32_t DateGetMonth(int32_t months);
|
||||||
|
int32_t DateGetYear(int32_t months);
|
||||||
|
int32_t DateGetTotalMonths(int32_t month, int32_t year);
|
||||||
|
void DateUpdateRealTimeOfDay();
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
#include "./peep/GuestPathfinding.h"
|
#include "./peep/GuestPathfinding.h"
|
||||||
#include "Context.h"
|
#include "Context.h"
|
||||||
|
#include "Date.h"
|
||||||
#include "Editor.h"
|
#include "Editor.h"
|
||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "GameState.h"
|
#include "GameState.h"
|
||||||
|
@ -70,7 +71,7 @@ void GameState::InitAll(const TileCoordsXY& mapSize)
|
||||||
RideInitAll();
|
RideInitAll();
|
||||||
ResetAllEntities();
|
ResetAllEntities();
|
||||||
UpdateConsolidatedPatrolAreas();
|
UpdateConsolidatedPatrolAreas();
|
||||||
DateReset();
|
ResetDate();
|
||||||
ClimateReset(ClimateType::CoolAndWet);
|
ClimateReset(ClimateType::CoolAndWet);
|
||||||
News::InitQueue();
|
News::InitQueue();
|
||||||
|
|
||||||
|
@ -313,8 +314,7 @@ void GameState::UpdateLogic(LogicTimings* timings)
|
||||||
auto day = _date.GetDay();
|
auto day = _date.GetDay();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DateUpdate();
|
_date.Update();
|
||||||
_date = Date(static_cast<uint32_t>(gDateMonthsElapsed), gDateMonthTicks);
|
|
||||||
report_time(LogicTimePart::Date);
|
report_time(LogicTimePart::Date);
|
||||||
|
|
||||||
ScenarioUpdate();
|
ScenarioUpdate();
|
||||||
|
@ -408,3 +408,18 @@ void GameState::CreateStateSnapshot()
|
||||||
snapshots->Capture(snapshot);
|
snapshots->Capture(snapshot);
|
||||||
snapshots->LinkSnapshot(snapshot, gCurrentTicks, ScenarioRandState().s0);
|
snapshots->LinkSnapshot(snapshot, gCurrentTicks, ScenarioRandState().s0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GameState::SetDate(Date newDate)
|
||||||
|
{
|
||||||
|
_date = newDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* rct2: 0x006C4494
|
||||||
|
*/
|
||||||
|
void GameState::ResetDate()
|
||||||
|
{
|
||||||
|
_date = OpenRCT2::Date();
|
||||||
|
gCurrentRealTimeTicks = 0;
|
||||||
|
}
|
||||||
|
|
|
@ -86,6 +86,8 @@ namespace OpenRCT2
|
||||||
void InitAll(const TileCoordsXY& mapSize);
|
void InitAll(const TileCoordsXY& mapSize);
|
||||||
void Tick();
|
void Tick();
|
||||||
void UpdateLogic(LogicTimings* timings = nullptr);
|
void UpdateLogic(LogicTimings* timings = nullptr);
|
||||||
|
void SetDate(Date newDate);
|
||||||
|
void ResetDate();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void CreateStateSnapshot();
|
void CreateStateSnapshot();
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "ParkSetDateAction.h"
|
#include "ParkSetDateAction.h"
|
||||||
|
|
||||||
#include "../Context.h"
|
#include "../Context.h"
|
||||||
|
#include "../GameState.h"
|
||||||
#include "../core/MemoryStream.h"
|
#include "../core/MemoryStream.h"
|
||||||
#include "../localisation/StringIds.h"
|
#include "../localisation/StringIds.h"
|
||||||
#include "../management/Finance.h"
|
#include "../management/Finance.h"
|
||||||
|
@ -44,7 +45,7 @@ void ParkSetDateAction::Serialise(DataSerialiser& stream)
|
||||||
|
|
||||||
GameActions::Result ParkSetDateAction::Query() const
|
GameActions::Result ParkSetDateAction::Query() const
|
||||||
{
|
{
|
||||||
if (_year <= 0 || _year > MAX_YEAR || _month <= 0 || _month > MONTH_COUNT || _day <= 0 || _day > 31)
|
if (_year < 0 || _year >= MAX_YEAR || _month < 0 || _month >= MONTH_COUNT || _day < 0 || _day >= 31)
|
||||||
{
|
{
|
||||||
return GameActions::Result(GameActions::Status::InvalidParameters, STR_NONE, STR_NONE);
|
return GameActions::Result(GameActions::Status::InvalidParameters, STR_NONE, STR_NONE);
|
||||||
}
|
}
|
||||||
|
@ -54,6 +55,6 @@ GameActions::Result ParkSetDateAction::Query() const
|
||||||
|
|
||||||
GameActions::Result ParkSetDateAction::Execute() const
|
GameActions::Result ParkSetDateAction::Execute() const
|
||||||
{
|
{
|
||||||
DateSet(_year, _month, _day);
|
OpenRCT2::GetContext()->GetGameState()->SetDate(OpenRCT2::Date::FromYMD(_year, _month, _day));
|
||||||
return GameActions::Result();
|
return GameActions::Result();
|
||||||
}
|
}
|
||||||
|
|
|
@ -286,7 +286,7 @@ GameActions::Result RideCreateAction::Execute() const
|
||||||
ride->num_riders = 0;
|
ride->num_riders = 0;
|
||||||
ride->slide_in_use = 0;
|
ride->slide_in_use = 0;
|
||||||
ride->maze_tiles = 0;
|
ride->maze_tiles = 0;
|
||||||
ride->build_date = gDateMonthsElapsed;
|
ride->build_date = GetDate().GetMonthsElapsed();
|
||||||
ride->music_tune_id = TUNE_ID_NULL;
|
ride->music_tune_id = TUNE_ID_NULL;
|
||||||
|
|
||||||
ride->breakdown_reason = 255;
|
ride->breakdown_reason = 255;
|
||||||
|
|
|
@ -190,7 +190,7 @@ GameActions::Result StaffHireNewAction::QueryExecute(bool execute) const
|
||||||
}
|
}
|
||||||
|
|
||||||
// Staff uses this
|
// Staff uses this
|
||||||
newPeep->As<Staff>()->SetHireDate(gDateMonthsElapsed);
|
newPeep->As<Staff>()->SetHireDate(GetDate().GetMonthsElapsed());
|
||||||
newPeep->PathfindGoal.x = 0xFF;
|
newPeep->PathfindGoal.x = 0xFF;
|
||||||
newPeep->PathfindGoal.y = 0xFF;
|
newPeep->PathfindGoal.y = 0xFF;
|
||||||
newPeep->PathfindGoal.z = 0xFF;
|
newPeep->PathfindGoal.z = 0xFF;
|
||||||
|
|
|
@ -171,7 +171,7 @@ void Duck::UpdateSwim()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int32_t currentMonth = DateGetMonth(gDateMonthsElapsed);
|
int32_t currentMonth = GetDate().GetMonth();
|
||||||
if (currentMonth >= MONTH_SEPTEMBER && (randomNumber >> 16) < 218)
|
if (currentMonth >= MONTH_SEPTEMBER && (randomNumber >> 16) < 218)
|
||||||
{
|
{
|
||||||
state = DuckState::FlyAway;
|
state = DuckState::FlyAway;
|
||||||
|
|
|
@ -265,7 +265,7 @@ void Staff::ResetStats()
|
||||||
{
|
{
|
||||||
for (auto peep : EntityList<Staff>())
|
for (auto peep : EntityList<Staff>())
|
||||||
{
|
{
|
||||||
peep->SetHireDate(gDateMonthsElapsed);
|
peep->SetHireDate(GetDate().GetMonthsElapsed());
|
||||||
peep->StaffLawnsMown = 0;
|
peep->StaffLawnsMown = 0;
|
||||||
peep->StaffRidesFixed = 0;
|
peep->StaffRidesFixed = 0;
|
||||||
peep->StaffGardensWatered = 0;
|
peep->StaffGardensWatered = 0;
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "InteractiveConsole.h"
|
#include "InteractiveConsole.h"
|
||||||
|
|
||||||
#include "../Context.h"
|
#include "../Context.h"
|
||||||
|
#include "../Date.h"
|
||||||
#include "../EditorObjectSelectionSession.h"
|
#include "../EditorObjectSelectionSession.h"
|
||||||
#include "../Game.h"
|
#include "../Game.h"
|
||||||
#include "../OpenRCT2.h"
|
#include "../OpenRCT2.h"
|
||||||
|
@ -18,6 +19,7 @@
|
||||||
#include "../Version.h"
|
#include "../Version.h"
|
||||||
#include "../actions/CheatSetAction.h"
|
#include "../actions/CheatSetAction.h"
|
||||||
#include "../actions/ClimateSetAction.h"
|
#include "../actions/ClimateSetAction.h"
|
||||||
|
#include "../actions/ParkSetDateAction.h"
|
||||||
#include "../actions/ParkSetParameterAction.h"
|
#include "../actions/ParkSetParameterAction.h"
|
||||||
#include "../actions/RideFreezeRatingAction.h"
|
#include "../actions/RideFreezeRatingAction.h"
|
||||||
#include "../actions/RideSetPriceAction.h"
|
#include "../actions/RideSetPriceAction.h"
|
||||||
|
@ -76,6 +78,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
using arguments_t = std::vector<std::string>;
|
using arguments_t = std::vector<std::string>;
|
||||||
|
using OpenRCT2::Date;
|
||||||
|
|
||||||
static constexpr const char* ClimateNames[] = {
|
static constexpr const char* ClimateNames[] = {
|
||||||
"cool_and_wet",
|
"cool_and_wet",
|
||||||
|
@ -1452,7 +1455,7 @@ static int32_t ConsoleCommandForceDate([[maybe_unused]] InteractiveConsole& cons
|
||||||
// YYYY (no month provided, preserve existing month)
|
// YYYY (no month provided, preserve existing month)
|
||||||
if (argv.size() == 1)
|
if (argv.size() == 1)
|
||||||
{
|
{
|
||||||
month = gDateMonthsElapsed % MONTH_COUNT + 1;
|
month = GetDate().GetMonth() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// YYYY MM or YYYY MM DD (month provided)
|
// YYYY MM or YYYY MM DD (month provided)
|
||||||
|
@ -1469,21 +1472,21 @@ static int32_t ConsoleCommandForceDate([[maybe_unused]] InteractiveConsole& cons
|
||||||
// YYYY OR YYYY MM (no day provided, preserve existing day)
|
// YYYY OR YYYY MM (no day provided, preserve existing day)
|
||||||
if (argv.size() <= 2)
|
if (argv.size() <= 2)
|
||||||
{
|
{
|
||||||
day = std::clamp(
|
day = std::clamp(GetDate().GetDay() + 1, 1, static_cast<int>(Date::GetDaysInMonth(month - 1)));
|
||||||
gDateMonthTicks / (TICKS_PER_MONTH / days_in_month[month - 1]) + 1, 1, static_cast<int>(days_in_month[month - 1]));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// YYYY MM DD (year, month, and day provided)
|
// YYYY MM DD (year, month, and day provided)
|
||||||
if (argv.size() == 3)
|
if (argv.size() == 3)
|
||||||
{
|
{
|
||||||
day = atoi(argv[2].c_str());
|
day = atoi(argv[2].c_str());
|
||||||
if (day < 1 || day > days_in_month[month - 1])
|
if (day < 1 || day > Date::GetDaysInMonth(month - 1))
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DateSet(year, month, day);
|
auto setDateAction = ParkSetDateAction(year - 1, month - 1, day - 1);
|
||||||
|
GameActions::Execute(&setDateAction);
|
||||||
WindowInvalidateByClass(WindowClass::BottomToolbar);
|
WindowInvalidateByClass(WindowClass::BottomToolbar);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -9,57 +9,12 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "../Date.h"
|
||||||
#include "../common.h"
|
#include "../common.h"
|
||||||
|
|
||||||
constexpr int32_t MAX_YEAR = 8192;
|
|
||||||
constexpr int32_t TICKS_PER_MONTH = 0x10000;
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
MONTH_MARCH,
|
|
||||||
MONTH_APRIL,
|
|
||||||
MONTH_MAY,
|
|
||||||
MONTH_JUNE,
|
|
||||||
MONTH_JULY,
|
|
||||||
MONTH_AUGUST,
|
|
||||||
MONTH_SEPTEMBER,
|
|
||||||
MONTH_OCTOBER,
|
|
||||||
|
|
||||||
MONTH_COUNT
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
DATE_FORMAT_DAY_MONTH_YEAR,
|
|
||||||
DATE_FORMAT_MONTH_DAY_YEAR,
|
|
||||||
DATE_FORMAT_YEAR_MONTH_DAY,
|
|
||||||
DATE_FORMAT_YEAR_DAY_MONTH
|
|
||||||
};
|
|
||||||
|
|
||||||
struct RealWorldTime
|
|
||||||
{
|
|
||||||
uint8_t second;
|
|
||||||
uint8_t minute;
|
|
||||||
uint8_t hour;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern const int16_t days_in_month[MONTH_COUNT];
|
|
||||||
extern const StringId DateFormatStringIDs[];
|
extern const StringId DateFormatStringIDs[];
|
||||||
extern const StringId DateFormatStringFormatIds[];
|
extern const StringId DateFormatStringFormatIds[];
|
||||||
|
|
||||||
extern uint16_t gDateMonthTicks;
|
extern const StringId DateDayNames[31];
|
||||||
extern int32_t gDateMonthsElapsed;
|
extern const StringId DateGameMonthNames[MONTH_COUNT];
|
||||||
|
extern const StringId DateGameShortMonthNames[MONTH_COUNT];
|
||||||
extern RealWorldTime gRealTimeOfDay;
|
|
||||||
|
|
||||||
int32_t DateGetMonth(int32_t months);
|
|
||||||
int32_t DateGetYear(int32_t months);
|
|
||||||
int32_t DateGetTotalMonths(int32_t month, int32_t year);
|
|
||||||
void DateReset();
|
|
||||||
void DateUpdate();
|
|
||||||
void DateSet(int32_t year, int32_t month, int32_t day);
|
|
||||||
void DateUpdateRealTimeOfDay();
|
|
||||||
bool DateIsDayStart(int32_t monthTicks);
|
|
||||||
bool DateIsWeekStart(int32_t monthTicks);
|
|
||||||
bool DateIsFortnightStart(int32_t monthTicks);
|
|
||||||
bool DateIsMonthStart(int32_t monthTicks);
|
|
||||||
|
|
|
@ -7,21 +7,26 @@
|
||||||
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include "../Game.h"
|
#include "../common.h"
|
||||||
#include "../profiling/Profiling.h"
|
|
||||||
#include "../util/Math.hpp"
|
|
||||||
#include "Date.h"
|
#include "Date.h"
|
||||||
#include "StringIds.h"
|
#include "StringIds.h"
|
||||||
|
|
||||||
#include <algorithm>
|
const StringId DateDayNames[] = {
|
||||||
#include <time.h>
|
STR_DATE_DAY_1, STR_DATE_DAY_2, STR_DATE_DAY_3, STR_DATE_DAY_4, STR_DATE_DAY_5, STR_DATE_DAY_6, STR_DATE_DAY_7,
|
||||||
|
STR_DATE_DAY_8, STR_DATE_DAY_9, STR_DATE_DAY_10, STR_DATE_DAY_11, STR_DATE_DAY_12, STR_DATE_DAY_13, STR_DATE_DAY_14,
|
||||||
|
STR_DATE_DAY_15, STR_DATE_DAY_16, STR_DATE_DAY_17, STR_DATE_DAY_18, STR_DATE_DAY_19, STR_DATE_DAY_20, STR_DATE_DAY_21,
|
||||||
|
STR_DATE_DAY_22, STR_DATE_DAY_23, STR_DATE_DAY_24, STR_DATE_DAY_25, STR_DATE_DAY_26, STR_DATE_DAY_27, STR_DATE_DAY_28,
|
||||||
|
STR_DATE_DAY_29, STR_DATE_DAY_30, STR_DATE_DAY_31,
|
||||||
|
};
|
||||||
|
|
||||||
uint16_t gDateMonthTicks;
|
const StringId DateGameMonthNames[MONTH_COUNT] = {
|
||||||
int32_t gDateMonthsElapsed;
|
STR_MONTH_MARCH, STR_MONTH_APRIL, STR_MONTH_MAY, STR_MONTH_JUNE,
|
||||||
|
STR_MONTH_JULY, STR_MONTH_AUGUST, STR_MONTH_SEPTEMBER, STR_MONTH_OCTOBER,
|
||||||
|
};
|
||||||
|
|
||||||
// rct2: 0x00993988
|
const StringId DateGameShortMonthNames[MONTH_COUNT] = {
|
||||||
const int16_t days_in_month[MONTH_COUNT] = {
|
STR_MONTH_SHORT_MAR, STR_MONTH_SHORT_APR, STR_MONTH_SHORT_MAY, STR_MONTH_SHORT_JUN,
|
||||||
31, 30, 31, 30, 31, 31, 30, 31,
|
STR_MONTH_SHORT_JUL, STR_MONTH_SHORT_AUG, STR_MONTH_SHORT_SEP, STR_MONTH_SHORT_OCT,
|
||||||
};
|
};
|
||||||
|
|
||||||
const StringId DateFormatStringIDs[] = {
|
const StringId DateFormatStringIDs[] = {
|
||||||
|
@ -37,93 +42,3 @@ const StringId DateFormatStringFormatIds[] = {
|
||||||
STR_DATE_FORMAT_YMD,
|
STR_DATE_FORMAT_YMD,
|
||||||
STR_DATE_FORMAT_YDM,
|
STR_DATE_FORMAT_YDM,
|
||||||
};
|
};
|
||||||
|
|
||||||
RealWorldTime gRealTimeOfDay;
|
|
||||||
|
|
||||||
int32_t DateGetMonth(int32_t months)
|
|
||||||
{
|
|
||||||
return months % MONTH_COUNT;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t DateGetYear(int32_t months)
|
|
||||||
{
|
|
||||||
return months / MONTH_COUNT;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t DateGetTotalMonths(int32_t month, int32_t year)
|
|
||||||
{
|
|
||||||
return (year - 1) * MONTH_COUNT + month;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* rct2: 0x006C4494
|
|
||||||
*/
|
|
||||||
void DateReset()
|
|
||||||
{
|
|
||||||
gDateMonthsElapsed = 0;
|
|
||||||
gDateMonthTicks = 0;
|
|
||||||
gCurrentRealTimeTicks = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DateSet(int32_t year, int32_t month, int32_t day)
|
|
||||||
{
|
|
||||||
year = std::clamp(year, 1, MAX_YEAR);
|
|
||||||
month = std::clamp(month, 1, static_cast<int>(MONTH_COUNT));
|
|
||||||
day = std::clamp(day, 1, static_cast<int>(days_in_month[month - 1]));
|
|
||||||
gDateMonthsElapsed = (year - 1) * MONTH_COUNT + month - 1;
|
|
||||||
gDateMonthTicks = TICKS_PER_MONTH / days_in_month[month - 1] * (day - 1) + 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DateUpdate()
|
|
||||||
{
|
|
||||||
PROFILED_FUNCTION();
|
|
||||||
|
|
||||||
int32_t monthTicks = gDateMonthTicks + 4;
|
|
||||||
if (monthTicks >= TICKS_PER_MONTH)
|
|
||||||
{
|
|
||||||
gDateMonthTicks = 0;
|
|
||||||
gDateMonthsElapsed++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gDateMonthTicks = Floor2(static_cast<uint16_t>(monthTicks), 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DateUpdateRealTimeOfDay()
|
|
||||||
{
|
|
||||||
time_t timestamp = time(nullptr);
|
|
||||||
struct tm* now = localtime(×tamp);
|
|
||||||
|
|
||||||
gRealTimeOfDay.second = now->tm_sec;
|
|
||||||
gRealTimeOfDay.minute = now->tm_min;
|
|
||||||
gRealTimeOfDay.hour = now->tm_hour;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DateIsDayStart(int32_t monthTicks)
|
|
||||||
{
|
|
||||||
if (monthTicks < 4)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
int32_t prevMonthTick = monthTicks - 4;
|
|
||||||
int32_t currentMonth = DateGetMonth(gDateMonthsElapsed);
|
|
||||||
int32_t currentDaysInMonth = days_in_month[currentMonth];
|
|
||||||
return ((currentDaysInMonth * monthTicks) >> 16 != (currentDaysInMonth * prevMonthTick) >> 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DateIsWeekStart(int32_t monthTicks)
|
|
||||||
{
|
|
||||||
return (monthTicks & 0x3FFF) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DateIsFortnightStart(int32_t monthTicks)
|
|
||||||
{
|
|
||||||
return (monthTicks & 0x7FFF) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DateIsMonthStart(int32_t monthTicks)
|
|
||||||
{
|
|
||||||
return (monthTicks == 0);
|
|
||||||
}
|
|
||||||
|
|
|
@ -263,62 +263,6 @@ const StringId PeepThoughts[] = {
|
||||||
STR_PEEP_THOUGHT_TYPE_EXCITED_DEPRECATED,
|
STR_PEEP_THOUGHT_TYPE_EXCITED_DEPRECATED,
|
||||||
STR_PEEP_THOUGHT_TYPE_HERE_WE_ARE,
|
STR_PEEP_THOUGHT_TYPE_HERE_WE_ARE,
|
||||||
};
|
};
|
||||||
|
|
||||||
const StringId DateDayNames[] = {
|
|
||||||
STR_DATE_DAY_1,
|
|
||||||
STR_DATE_DAY_2,
|
|
||||||
STR_DATE_DAY_3,
|
|
||||||
STR_DATE_DAY_4,
|
|
||||||
STR_DATE_DAY_5,
|
|
||||||
STR_DATE_DAY_6,
|
|
||||||
STR_DATE_DAY_7,
|
|
||||||
STR_DATE_DAY_8,
|
|
||||||
STR_DATE_DAY_9,
|
|
||||||
STR_DATE_DAY_10,
|
|
||||||
STR_DATE_DAY_11,
|
|
||||||
STR_DATE_DAY_12,
|
|
||||||
STR_DATE_DAY_13,
|
|
||||||
STR_DATE_DAY_14,
|
|
||||||
STR_DATE_DAY_15,
|
|
||||||
STR_DATE_DAY_16,
|
|
||||||
STR_DATE_DAY_17,
|
|
||||||
STR_DATE_DAY_18,
|
|
||||||
STR_DATE_DAY_19,
|
|
||||||
STR_DATE_DAY_20,
|
|
||||||
STR_DATE_DAY_21,
|
|
||||||
STR_DATE_DAY_22,
|
|
||||||
STR_DATE_DAY_23,
|
|
||||||
STR_DATE_DAY_24,
|
|
||||||
STR_DATE_DAY_25,
|
|
||||||
STR_DATE_DAY_26,
|
|
||||||
STR_DATE_DAY_27,
|
|
||||||
STR_DATE_DAY_28,
|
|
||||||
STR_DATE_DAY_29,
|
|
||||||
STR_DATE_DAY_30,
|
|
||||||
STR_DATE_DAY_31,
|
|
||||||
};
|
|
||||||
|
|
||||||
const StringId DateGameMonthNames[MONTH_COUNT] = {
|
|
||||||
STR_MONTH_MARCH,
|
|
||||||
STR_MONTH_APRIL,
|
|
||||||
STR_MONTH_MAY,
|
|
||||||
STR_MONTH_JUNE,
|
|
||||||
STR_MONTH_JULY,
|
|
||||||
STR_MONTH_AUGUST,
|
|
||||||
STR_MONTH_SEPTEMBER,
|
|
||||||
STR_MONTH_OCTOBER,
|
|
||||||
};
|
|
||||||
|
|
||||||
const StringId DateGameShortMonthNames[MONTH_COUNT] = {
|
|
||||||
STR_MONTH_SHORT_MAR,
|
|
||||||
STR_MONTH_SHORT_APR,
|
|
||||||
STR_MONTH_SHORT_MAY,
|
|
||||||
STR_MONTH_SHORT_JUN,
|
|
||||||
STR_MONTH_SHORT_JUL,
|
|
||||||
STR_MONTH_SHORT_AUG,
|
|
||||||
STR_MONTH_SHORT_SEP,
|
|
||||||
STR_MONTH_SHORT_OCT,
|
|
||||||
};
|
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
std::string FormatStringID(StringId format, const void* args)
|
std::string FormatStringID(StringId format, const void* args)
|
||||||
|
|
|
@ -63,6 +63,3 @@ extern const StringId ResearchFundingLevelNames[4];
|
||||||
extern const StringId MarketingCampaignNames[ADVERTISING_CAMPAIGN_COUNT][3];
|
extern const StringId MarketingCampaignNames[ADVERTISING_CAMPAIGN_COUNT][3];
|
||||||
extern const StringId RideInspectionIntervalNames[];
|
extern const StringId RideInspectionIntervalNames[];
|
||||||
extern const StringId PeepThoughts[174];
|
extern const StringId PeepThoughts[174];
|
||||||
extern const StringId DateDayNames[31];
|
|
||||||
extern const StringId DateGameMonthNames[MONTH_COUNT];
|
|
||||||
extern const StringId DateGameShortMonthNames[MONTH_COUNT];
|
|
||||||
|
|
|
@ -320,7 +320,7 @@ money64 FinanceGetCurrentCash()
|
||||||
void FinanceShiftExpenditureTable()
|
void FinanceShiftExpenditureTable()
|
||||||
{
|
{
|
||||||
// If EXPENDITURE_TABLE_MONTH_COUNT months have passed then is full, sum the oldest month
|
// If EXPENDITURE_TABLE_MONTH_COUNT months have passed then is full, sum the oldest month
|
||||||
if (gDateMonthsElapsed >= EXPENDITURE_TABLE_MONTH_COUNT)
|
if (GetDate().GetMonthsElapsed() >= EXPENDITURE_TABLE_MONTH_COUNT)
|
||||||
{
|
{
|
||||||
money64 sum = 0;
|
money64 sum = 0;
|
||||||
for (uint32_t i = 0; i < static_cast<int32_t>(ExpenditureType::Count); i++)
|
for (uint32_t i = 0; i < static_cast<int32_t>(ExpenditureType::Count); i++)
|
||||||
|
@ -363,7 +363,7 @@ void FinanceResetCashToInitial()
|
||||||
money64 FinanceGetLastMonthShopProfit()
|
money64 FinanceGetLastMonthShopProfit()
|
||||||
{
|
{
|
||||||
money64 profit = 0;
|
money64 profit = 0;
|
||||||
if (gDateMonthsElapsed != 0)
|
if (GetDate().GetMonthsElapsed() != 0)
|
||||||
{
|
{
|
||||||
const auto* lastMonthExpenditure = gExpenditureTable[1];
|
const auto* lastMonthExpenditure = gExpenditureTable[1];
|
||||||
|
|
||||||
|
|
|
@ -323,13 +323,14 @@ News::Item* News::AddItemToQueue(ItemType type, StringId string_id, EntityId ass
|
||||||
|
|
||||||
News::Item* News::AddItemToQueue(News::ItemType type, const utf8* text, uint32_t assoc)
|
News::Item* News::AddItemToQueue(News::ItemType type, const utf8* text, uint32_t assoc)
|
||||||
{
|
{
|
||||||
|
auto& date = GetDate();
|
||||||
News::Item* newsItem = gNewsItems.FirstOpenOrNewSlot();
|
News::Item* newsItem = gNewsItems.FirstOpenOrNewSlot();
|
||||||
newsItem->Type = type;
|
newsItem->Type = type;
|
||||||
newsItem->Flags = 0;
|
newsItem->Flags = 0;
|
||||||
newsItem->Assoc = assoc; // Make optional for Award, Money, Graph and Null
|
newsItem->Assoc = assoc; // Make optional for Award, Money, Graph and Null
|
||||||
newsItem->Ticks = 0;
|
newsItem->Ticks = 0;
|
||||||
newsItem->MonthYear = static_cast<uint16_t>(gDateMonthsElapsed);
|
newsItem->MonthYear = static_cast<uint16_t>(date.GetMonthsElapsed());
|
||||||
newsItem->Day = ((days_in_month[DateGetMonth(newsItem->MonthYear)] * gDateMonthTicks) >> 16) + 1;
|
newsItem->Day = date.GetDay() + 1;
|
||||||
newsItem->Text = text;
|
newsItem->Text = text;
|
||||||
|
|
||||||
return newsItem;
|
return newsItem;
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include "Research.h"
|
#include "Research.h"
|
||||||
|
|
||||||
|
#include "../Date.h"
|
||||||
#include "../Game.h"
|
#include "../Game.h"
|
||||||
#include "../OpenRCT2.h"
|
#include "../OpenRCT2.h"
|
||||||
#include "../actions/ParkSetResearchFundingAction.h"
|
#include "../actions/ParkSetResearchFundingAction.h"
|
||||||
|
@ -108,16 +109,18 @@ static void ResearchCalculateExpectedDate()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
auto& date = GetDate();
|
||||||
|
|
||||||
int32_t progressRemaining = gResearchProgressStage == RESEARCH_STAGE_COMPLETING_DESIGN ? 0x10000 : 0x20000;
|
int32_t progressRemaining = gResearchProgressStage == RESEARCH_STAGE_COMPLETING_DESIGN ? 0x10000 : 0x20000;
|
||||||
progressRemaining -= gResearchProgress;
|
progressRemaining -= gResearchProgress;
|
||||||
int32_t daysRemaining = (progressRemaining / _researchRate[gResearchFundingLevel]) * 128;
|
int32_t daysRemaining = (progressRemaining / _researchRate[gResearchFundingLevel]) * 128;
|
||||||
|
|
||||||
int32_t expectedDay = gDateMonthTicks + (daysRemaining & 0xFFFF);
|
int32_t expectedDay = date.GetMonthTicks() + (daysRemaining & 0xFFFF);
|
||||||
int32_t dayQuotient = expectedDay / 0x10000;
|
int32_t dayQuotient = expectedDay / 0x10000;
|
||||||
int32_t dayRemainder = expectedDay % 0x10000;
|
int32_t dayRemainder = expectedDay % 0x10000;
|
||||||
|
|
||||||
int32_t expectedMonth = DateGetMonth(gDateMonthsElapsed + dayQuotient + (daysRemaining >> 16));
|
int32_t expectedMonth = DateGetMonth(date.GetMonthsElapsed() + dayQuotient + (daysRemaining >> 16));
|
||||||
expectedDay = (dayRemainder * days_in_month[expectedMonth]) >> 16;
|
expectedDay = (dayRemainder * Date::GetDaysInMonth(expectedMonth)) >> 16;
|
||||||
|
|
||||||
gResearchExpectedDay = expectedDay;
|
gResearchExpectedDay = expectedDay;
|
||||||
gResearchExpectedMonth = expectedMonth;
|
gResearchExpectedMonth = expectedMonth;
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
// It is used for making sure only compatible builds get connected, even within
|
// It is used for making sure only compatible builds get connected, even within
|
||||||
// single OpenRCT2 version.
|
// single OpenRCT2 version.
|
||||||
|
|
||||||
#define NETWORK_STREAM_VERSION "0"
|
#define NETWORK_STREAM_VERSION "1"
|
||||||
|
|
||||||
#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION
|
#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION
|
||||||
|
|
||||||
|
|
|
@ -297,9 +297,10 @@ private:
|
||||||
{ "players", numPlayers },
|
{ "players", numPlayers },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
auto& date = GetDate();
|
||||||
json_t mapSize = { { "x", gMapSize.x - 2 }, { "y", gMapSize.y - 2 } };
|
json_t mapSize = { { "x", gMapSize.x - 2 }, { "y", gMapSize.y - 2 } };
|
||||||
json_t gameInfo = {
|
json_t gameInfo = {
|
||||||
{ "mapSize", mapSize }, { "day", gDateMonthTicks }, { "month", gDateMonthsElapsed },
|
{ "mapSize", mapSize }, { "day", date.GetMonthTicks() }, { "month", date.GetMonthsElapsed() },
|
||||||
{ "guests", gNumGuestsInPark }, { "parkValue", gParkValue },
|
{ "guests", gNumGuestsInPark }, { "parkValue", gParkValue },
|
||||||
};
|
};
|
||||||
if (!(gParkFlags & PARK_FLAGS_NO_MONEY))
|
if (!(gParkFlags & PARK_FLAGS_NO_MONEY))
|
||||||
|
|
|
@ -479,8 +479,20 @@ namespace OpenRCT2
|
||||||
cs.Write(isPaused);
|
cs.Write(isPaused);
|
||||||
}
|
}
|
||||||
cs.ReadWrite(gCurrentTicks);
|
cs.ReadWrite(gCurrentTicks);
|
||||||
cs.ReadWrite(gDateMonthTicks);
|
if (cs.GetMode() == OrcaStream::Mode::READING)
|
||||||
cs.ReadWrite(gDateMonthsElapsed);
|
{
|
||||||
|
uint16_t monthTicks;
|
||||||
|
uint32_t monthsElapsed;
|
||||||
|
cs.ReadWrite(monthTicks);
|
||||||
|
cs.ReadWrite(monthsElapsed);
|
||||||
|
GetContext()->GetGameState()->SetDate(Date(monthsElapsed, monthTicks));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto& date = GetDate();
|
||||||
|
cs.Write(date.GetMonthTicks());
|
||||||
|
cs.Write(date.GetMonthsElapsed());
|
||||||
|
}
|
||||||
|
|
||||||
if (cs.GetMode() == OrcaStream::Mode::READING)
|
if (cs.GetMode() == OrcaStream::Mode::READING)
|
||||||
{
|
{
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
# include <fontconfig/fontconfig.h>
|
# include <fontconfig/fontconfig.h>
|
||||||
# endif // NO_TTF
|
# endif // NO_TTF
|
||||||
|
|
||||||
|
# include "../Date.h"
|
||||||
# include "../OpenRCT2.h"
|
# include "../OpenRCT2.h"
|
||||||
# include "../core/Path.hpp"
|
# include "../core/Path.hpp"
|
||||||
# include "../localisation/Language.h"
|
# include "../localisation/Language.h"
|
||||||
|
|
|
@ -11,10 +11,10 @@
|
||||||
|
|
||||||
# include "Platform.h"
|
# include "Platform.h"
|
||||||
|
|
||||||
|
# include "../Date.h"
|
||||||
# include "../core/Memory.hpp"
|
# include "../core/Memory.hpp"
|
||||||
# include "../core/Path.hpp"
|
# include "../core/Path.hpp"
|
||||||
# include "../core/String.hpp"
|
# include "../core/String.hpp"
|
||||||
# include "../localisation/Date.h"
|
|
||||||
# include "../util/Util.h"
|
# include "../util/Util.h"
|
||||||
|
|
||||||
# include <cerrno>
|
# include <cerrno>
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
# include <shlobj.h>
|
# include <shlobj.h>
|
||||||
# undef GetEnvironmentVariable
|
# undef GetEnvironmentVariable
|
||||||
|
|
||||||
|
# include "../Date.h"
|
||||||
# include "../OpenRCT2.h"
|
# include "../OpenRCT2.h"
|
||||||
# include "../common.h"
|
# include "../common.h"
|
||||||
# include "../core/Path.hpp"
|
# include "../core/Path.hpp"
|
||||||
|
|
|
@ -40,13 +40,7 @@ enum class SPECIAL_FOLDER
|
||||||
RCT2_DISCORD,
|
RCT2_DISCORD,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RealWorldDate
|
struct RealWorldDate;
|
||||||
{
|
|
||||||
uint8_t day;
|
|
||||||
uint8_t month;
|
|
||||||
int16_t year;
|
|
||||||
uint8_t day_of_week;
|
|
||||||
};
|
|
||||||
struct RealWorldTime;
|
struct RealWorldTime;
|
||||||
|
|
||||||
namespace Platform
|
namespace Platform
|
||||||
|
|
|
@ -9,11 +9,13 @@
|
||||||
|
|
||||||
#if defined(__APPLE__) && defined(__MACH__)
|
#if defined(__APPLE__) && defined(__MACH__)
|
||||||
|
|
||||||
|
# include "Platform.h"
|
||||||
|
|
||||||
|
# include "../Date.h"
|
||||||
# include "../OpenRCT2.h"
|
# include "../OpenRCT2.h"
|
||||||
# include "../core/Path.hpp"
|
# include "../core/Path.hpp"
|
||||||
# include "../core/String.hpp"
|
# include "../core/String.hpp"
|
||||||
# include "../localisation/Language.h"
|
# include "../localisation/Language.h"
|
||||||
# include "Platform.h"
|
|
||||||
|
|
||||||
// undefine `interface` and `abstract`, because it's causing conflicts with Objective-C's keywords
|
// undefine `interface` and `abstract`, because it's causing conflicts with Objective-C's keywords
|
||||||
# undef interface
|
# undef interface
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include "../Date.h"
|
||||||
#include "../common.h"
|
#include "../common.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
|
@ -2121,8 +2121,7 @@ namespace RCT1
|
||||||
// Date and srand
|
// Date and srand
|
||||||
gCurrentTicks = _s4.Ticks;
|
gCurrentTicks = _s4.Ticks;
|
||||||
ScenarioRandSeed(_s4.RandomA, _s4.RandomB);
|
ScenarioRandSeed(_s4.RandomA, _s4.RandomB);
|
||||||
gDateMonthsElapsed = static_cast<int32_t>(_s4.Month);
|
GetContext()->GetGameState()->SetDate(Date(_s4.Month, _s4.Day));
|
||||||
gDateMonthTicks = _s4.Day;
|
|
||||||
|
|
||||||
// Park rating
|
// Park rating
|
||||||
gParkRating = _s4.ParkRating;
|
gParkRating = _s4.ParkRating;
|
||||||
|
|
|
@ -249,8 +249,7 @@ namespace RCT2
|
||||||
gScenarioDetails = loadMaybeUTF8(_s6.ScenarioDescription);
|
gScenarioDetails = loadMaybeUTF8(_s6.ScenarioDescription);
|
||||||
}
|
}
|
||||||
|
|
||||||
gDateMonthsElapsed = static_cast<int32_t>(_s6.ElapsedMonths);
|
OpenRCT2::GetContext()->GetGameState()->SetDate(OpenRCT2::Date(_s6.ElapsedMonths, _s6.CurrentDay));
|
||||||
gDateMonthTicks = _s6.CurrentDay;
|
|
||||||
gCurrentTicks = _s6.GameTicks1;
|
gCurrentTicks = _s6.GameTicks1;
|
||||||
|
|
||||||
ScenarioRandSeed(_s6.ScenarioSrand0, _s6.ScenarioSrand1);
|
ScenarioRandSeed(_s6.ScenarioSrand0, _s6.ScenarioSrand1);
|
||||||
|
|
|
@ -307,7 +307,7 @@ size_t Ride::GetNumPrices() const
|
||||||
|
|
||||||
int32_t Ride::GetAge() const
|
int32_t Ride::GetAge() const
|
||||||
{
|
{
|
||||||
return gDateMonthsElapsed - build_date;
|
return GetDate().GetMonthsElapsed() - build_date;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t Ride::GetTotalQueueLength() const
|
int32_t Ride::GetTotalQueueLength() const
|
||||||
|
@ -953,7 +953,7 @@ void ResetAllRideBuildDates()
|
||||||
{
|
{
|
||||||
for (auto& ride : GetRideManager())
|
for (auto& ride : GetRideManager())
|
||||||
{
|
{
|
||||||
ride.build_date -= gDateMonthsElapsed;
|
ride.build_date -= GetDate().GetMonthsElapsed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5162,7 +5162,7 @@ void Ride::Delete()
|
||||||
void Ride::Renew()
|
void Ride::Renew()
|
||||||
{
|
{
|
||||||
// Set build date to current date (so the ride is brand new)
|
// Set build date to current date (so the ride is brand new)
|
||||||
build_date = gDateMonthsElapsed;
|
build_date = GetDate().GetMonthsElapsed();
|
||||||
reliability = RIDE_INITIAL_RELIABILITY;
|
reliability = RIDE_INITIAL_RELIABILITY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
#include "../Cheats.h"
|
#include "../Cheats.h"
|
||||||
#include "../Context.h"
|
#include "../Context.h"
|
||||||
|
#include "../Date.h"
|
||||||
#include "../FileClassifier.h"
|
#include "../FileClassifier.h"
|
||||||
#include "../Game.h"
|
#include "../Game.h"
|
||||||
#include "../GameState.h"
|
#include "../GameState.h"
|
||||||
|
@ -158,7 +159,7 @@ void ScenarioReset()
|
||||||
FinanceResetHistory();
|
FinanceResetHistory();
|
||||||
AwardReset();
|
AwardReset();
|
||||||
ResetAllRideBuildDates();
|
ResetAllRideBuildDates();
|
||||||
DateReset();
|
GetContext()->GetGameState()->ResetDate();
|
||||||
Duck::RemoveAll();
|
Duck::RemoveAll();
|
||||||
ParkCalculateSize();
|
ParkCalculateSize();
|
||||||
MapCountRemainingLandRights();
|
MapCountRemainingLandRights();
|
||||||
|
@ -326,7 +327,7 @@ static void ScenarioDayUpdate()
|
||||||
|
|
||||||
static void ScenarioWeekUpdate()
|
static void ScenarioWeekUpdate()
|
||||||
{
|
{
|
||||||
int32_t month = DateGetMonth(gDateMonthsElapsed);
|
int32_t month = GetDate().GetMonth();
|
||||||
|
|
||||||
FinancePayWages();
|
FinancePayWages();
|
||||||
FinancePayResearch();
|
FinancePayResearch();
|
||||||
|
@ -369,7 +370,7 @@ static void ScenarioUpdateDayNightCycle()
|
||||||
|
|
||||||
if (gScreenFlags == SCREEN_FLAGS_PLAYING && gConfigGeneral.DayNightCycle)
|
if (gScreenFlags == SCREEN_FLAGS_PLAYING && gConfigGeneral.DayNightCycle)
|
||||||
{
|
{
|
||||||
float monthFraction = gDateMonthTicks / static_cast<float>(TICKS_PER_MONTH);
|
float monthFraction = GetDate().GetMonthTicks() / static_cast<float>(TICKS_PER_MONTH);
|
||||||
if (monthFraction < (1 / 8.0f))
|
if (monthFraction < (1 / 8.0f))
|
||||||
{
|
{
|
||||||
gDayNightCycle = 0.0f;
|
gDayNightCycle = 0.0f;
|
||||||
|
@ -409,19 +410,20 @@ void ScenarioUpdate()
|
||||||
|
|
||||||
if (gScreenFlags == SCREEN_FLAGS_PLAYING)
|
if (gScreenFlags == SCREEN_FLAGS_PLAYING)
|
||||||
{
|
{
|
||||||
if (DateIsDayStart(gDateMonthTicks))
|
auto& date = GetDate();
|
||||||
|
if (date.IsDayStart())
|
||||||
{
|
{
|
||||||
ScenarioDayUpdate();
|
ScenarioDayUpdate();
|
||||||
}
|
}
|
||||||
if (DateIsWeekStart(gDateMonthTicks))
|
if (date.IsWeekStart())
|
||||||
{
|
{
|
||||||
ScenarioWeekUpdate();
|
ScenarioWeekUpdate();
|
||||||
}
|
}
|
||||||
if (DateIsFortnightStart(gDateMonthTicks))
|
if (date.IsFortnightStart())
|
||||||
{
|
{
|
||||||
ScenarioFortnightUpdate();
|
ScenarioFortnightUpdate();
|
||||||
}
|
}
|
||||||
if (DateIsMonthStart(gDateMonthTicks))
|
if (date.IsMonthStart())
|
||||||
{
|
{
|
||||||
ScenarioMonthUpdate();
|
ScenarioMonthUpdate();
|
||||||
}
|
}
|
||||||
|
@ -617,7 +619,7 @@ ResultWithMessage ScenarioPrepareForSave()
|
||||||
ObjectiveStatus Objective::CheckGuestsBy() const
|
ObjectiveStatus Objective::CheckGuestsBy() const
|
||||||
{
|
{
|
||||||
auto parkRating = gParkRating;
|
auto parkRating = gParkRating;
|
||||||
auto currentMonthYear = gDateMonthsElapsed;
|
int32_t currentMonthYear = GetDate().GetMonthsElapsed();
|
||||||
|
|
||||||
if (currentMonthYear == MONTH_COUNT * Year || AllowEarlyCompletion())
|
if (currentMonthYear == MONTH_COUNT * Year || AllowEarlyCompletion())
|
||||||
{
|
{
|
||||||
|
@ -637,7 +639,7 @@ ObjectiveStatus Objective::CheckGuestsBy() const
|
||||||
|
|
||||||
ObjectiveStatus Objective::CheckParkValueBy() const
|
ObjectiveStatus Objective::CheckParkValueBy() const
|
||||||
{
|
{
|
||||||
int32_t currentMonthYear = gDateMonthsElapsed;
|
int32_t currentMonthYear = GetDate().GetMonthsElapsed();
|
||||||
money64 objectiveParkValue = Currency;
|
money64 objectiveParkValue = Currency;
|
||||||
money64 parkValue = gParkValue;
|
money64 parkValue = gParkValue;
|
||||||
|
|
||||||
|
@ -695,7 +697,7 @@ ObjectiveStatus Objective::Check10RollerCoasters() const
|
||||||
*/
|
*/
|
||||||
ObjectiveStatus Objective::CheckGuestsAndRating() const
|
ObjectiveStatus Objective::CheckGuestsAndRating() const
|
||||||
{
|
{
|
||||||
if (gParkRating < 700 && gDateMonthsElapsed >= 1)
|
if (gParkRating < 700 && GetDate().GetMonthsElapsed() >= 1)
|
||||||
{
|
{
|
||||||
gScenarioParkRatingWarningDays++;
|
gScenarioParkRatingWarningDays++;
|
||||||
if (gScenarioParkRatingWarningDays == 1)
|
if (gScenarioParkRatingWarningDays == 1)
|
||||||
|
|
|
@ -46,7 +46,7 @@ namespace OpenRCT2::Scripting
|
||||||
void monthsElapsed_set(int32_t value)
|
void monthsElapsed_set(int32_t value)
|
||||||
{
|
{
|
||||||
ThrowIfGameStateNotMutable();
|
ThrowIfGameStateNotMutable();
|
||||||
gDateMonthsElapsed = static_cast<int32_t>(value);
|
GetContext()->GetGameState()->SetDate(Date(value, GetDate().GetMonthTicks()));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t monthProgress_get() const
|
uint32_t monthProgress_get() const
|
||||||
|
@ -58,13 +58,13 @@ namespace OpenRCT2::Scripting
|
||||||
void monthProgress_set(int32_t value)
|
void monthProgress_set(int32_t value)
|
||||||
{
|
{
|
||||||
ThrowIfGameStateNotMutable();
|
ThrowIfGameStateNotMutable();
|
||||||
gDateMonthTicks = value;
|
GetContext()->GetGameState()->SetDate(Date(GetDate().GetMonthsElapsed(), value));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t yearsElapsed_get() const
|
uint32_t yearsElapsed_get() const
|
||||||
{
|
{
|
||||||
const auto& date = GetDate();
|
const auto& date = GetDate();
|
||||||
return date.GetMonthsElapsed() / 8;
|
return date.GetYear();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t ticksElapsed_get() const
|
uint32_t ticksElapsed_get() const
|
||||||
|
|
|
@ -91,7 +91,7 @@ int32_t ClimateCelsiusToFahrenheit(int32_t celsius)
|
||||||
void ClimateReset(ClimateType climate)
|
void ClimateReset(ClimateType climate)
|
||||||
{
|
{
|
||||||
auto weather = WeatherType::PartiallyCloudy;
|
auto weather = WeatherType::PartiallyCloudy;
|
||||||
int32_t month = DateGetMonth(gDateMonthsElapsed);
|
int32_t month = GetDate().GetMonth();
|
||||||
const WeatherTransition* transition = &ClimateTransitions[static_cast<uint8_t>(climate)][month];
|
const WeatherTransition* transition = &ClimateTransitions[static_cast<uint8_t>(climate)][month];
|
||||||
const WeatherState* weatherState = &ClimateWeatherData[EnumValue(weather)];
|
const WeatherState* weatherState = &ClimateWeatherData[EnumValue(weather)];
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ void ClimateUpdate()
|
||||||
|
|
||||||
void ClimateForceWeather(WeatherType weather)
|
void ClimateForceWeather(WeatherType weather)
|
||||||
{
|
{
|
||||||
int32_t month = DateGetMonth(gDateMonthsElapsed);
|
int32_t month = GetDate().GetMonth();
|
||||||
const WeatherTransition* transition = &ClimateTransitions[static_cast<uint8_t>(gClimate)][month];
|
const WeatherTransition* transition = &ClimateTransitions[static_cast<uint8_t>(gClimate)][month];
|
||||||
const auto weatherState = &ClimateWeatherData[EnumValue(weather)];
|
const auto weatherState = &ClimateWeatherData[EnumValue(weather)];
|
||||||
|
|
||||||
|
@ -295,7 +295,7 @@ static int8_t ClimateStepWeatherLevel(int8_t currentWeatherLevel, int8_t nextWea
|
||||||
*/
|
*/
|
||||||
static void ClimateDetermineFutureWeather(int32_t randomDistribution)
|
static void ClimateDetermineFutureWeather(int32_t randomDistribution)
|
||||||
{
|
{
|
||||||
int32_t month = DateGetMonth(gDateMonthsElapsed);
|
int32_t month = GetDate().GetMonth();
|
||||||
|
|
||||||
// Generate a random variable with values 0 up to DistributionSize-1 and chose weather from the distribution table
|
// Generate a random variable with values 0 up to DistributionSize-1 and chose weather from the distribution table
|
||||||
// accordingly
|
// accordingly
|
||||||
|
|
|
@ -48,8 +48,11 @@ TEST(MultiLaunchTest, all)
|
||||||
ASSERT_EQ(RideGetCount(), 134);
|
ASSERT_EQ(RideGetCount(), 134);
|
||||||
auto gs = context->GetGameState();
|
auto gs = context->GetGameState();
|
||||||
ASSERT_NE(gs, nullptr);
|
ASSERT_NE(gs, nullptr);
|
||||||
|
|
||||||
auto& date = gs->GetDate();
|
auto& date = gs->GetDate();
|
||||||
ASSERT_EQ(date.GetMonthTicks(), 0);
|
// NOTE: This value is saved in the SV6 file, after the import this will be the current state.
|
||||||
|
// In case the save file gets replaced this needs to be adjusted.
|
||||||
|
ASSERT_EQ(date.GetMonthTicks(), 0x1e98);
|
||||||
|
|
||||||
for (int j = 0; j < updatesToTest; j++)
|
for (int j = 0; j < updatesToTest; j++)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue