Replace day length scaled tick macros with global variables.

This is to avoid needing to expensively re-calculate them all the time.
Instead update them by incrementing.
pull/8/head
Jonathan G Rennison 8 years ago
parent d733955d33
commit 375b069f82

@ -30,6 +30,8 @@ Date _date; ///< Current date in days (day counter)
DateFract _date_fract; ///< Fractional part of the day.
uint16 _tick_counter; ///< Ever incrementing (and sometimes wrapping) tick counter for setting off various events
uint8 _tick_skip_counter; ///< Counter for ticks, when only vehicles are moving and nothing else happens
uint32 _scaled_tick_counter; ///< Tick counter in daylength-scaled ticks
DateTicksScaled _scaled_date_ticks; ///< Date as ticks in daylength-scaled ticks
/**
* Set the date.
@ -47,6 +49,13 @@ void SetDate(Date date, DateFract fract)
ConvertDateToYMD(date, &ymd);
_cur_year = ymd.year;
_cur_month = ymd.month;
SetScaledTickVariables();
}
void SetScaledTickVariables()
{
_scaled_date_ticks = ((((DateTicksScaled)_date * DAY_TICKS) + _date_fract) * _settings_game.economy.day_length_factor) + _tick_skip_counter;
_scaled_tick_counter = (((uint32)_tick_counter) * _settings_game.economy.day_length_factor) + _tick_skip_counter;
}
#define M(a, b) ((a << 5) | b)

@ -20,10 +20,13 @@ extern Date _date;
extern DateFract _date_fract;
extern uint16 _tick_counter;
extern uint8 _tick_skip_counter;
extern uint32 _scaled_tick_counter;
extern DateTicksScaled _scaled_date_ticks;
void SetDate(Date date, DateFract fract);
void ConvertDateToYMD(Date date, YearMonthDay *ymd);
Date ConvertYMDToDate(Year year, Month month, Day day);
void SetScaledTickVariables();
#define YMD_TO_DATE(ymd) (ConvertYMDToDate(ymd.year, ymd.month, ymd.day))

@ -33,9 +33,6 @@ static const int DAY_TICKS = 74; ///< ticks per day
static const int DAYS_IN_YEAR = 365; ///< days per year
static const int DAYS_IN_LEAP_YEAR = 366; ///< sometimes, you need one day more...
#define CURRENT_SCALED_TICKS (((((DateTicksScaled)_date * DAY_TICKS) + _date_fract) * _settings_game.economy.day_length_factor) + _tick_skip_counter)
#define SCALED_TICK_COUNTER ((((uint32)_tick_counter) * _settings_game.economy.day_length_factor) + _tick_skip_counter)
#define DATE_UNIT_SIZE (_settings_client.gui.time_in_minutes ? _settings_client.gui.ticks_per_minute : (DAY_TICKS * _settings_game.economy.day_length_factor))
static const int STATION_RATING_TICKS = 185; ///< cycle duration for updating station rating
@ -115,7 +112,7 @@ static const Year MAX_YEAR = 5000000;
#define MINUTES_DATE(day, hour, minute) ((day * 1440) + (hour * 60) + minute)
/** Get the current date in minutes */
#define CURRENT_MINUTE (CURRENT_SCALED_TICKS / _settings_client.gui.ticks_per_minute)
#define CURRENT_MINUTE (_scaled_date_ticks / _settings_client.gui.ticks_per_minute)
/**
* Data structure to convert between Date and triplet (year, month, and day).

@ -566,7 +566,7 @@ void DeparturesWindow<Twaypoint>::DrawDeparturesListItems(const Rect &r) const
uint departure = 0;
uint arrival = 0;
DateTicksScaled now_date = CURRENT_SCALED_TICKS;
DateTicksScaled now_date = _scaled_date_ticks;
DateTicksScaled max_date = now_date + (_settings_client.gui.max_departure_time * DAY_TICKS * _settings_game.economy.day_length_factor);
/* Draw each departure. */

@ -540,7 +540,7 @@ static void AnimateTile_Industry(TileIndex tile)
switch (gfx) {
case GFX_SUGAR_MINE_SIEVE:
if ((SCALED_TICK_COUNTER & 1) == 0) {
if ((_scaled_tick_counter & 1) == 0) {
byte m = GetAnimationFrame(tile) + 1;
if (_settings_client.sound.ambient) {
@ -561,7 +561,7 @@ static void AnimateTile_Industry(TileIndex tile)
break;
case GFX_TOFFEE_QUARY:
if ((SCALED_TICK_COUNTER & 3) == 0) {
if ((_scaled_tick_counter & 3) == 0) {
byte m = GetAnimationFrame(tile);
if (_industry_anim_offs_toffee[m] == 0xFF && _settings_client.sound.ambient) {
@ -579,7 +579,7 @@ static void AnimateTile_Industry(TileIndex tile)
break;
case GFX_BUBBLE_CATCHER:
if ((SCALED_TICK_COUNTER & 1) == 0) {
if ((_scaled_tick_counter & 1) == 0) {
byte m = GetAnimationFrame(tile);
if (++m >= 40) {
@ -594,7 +594,7 @@ static void AnimateTile_Industry(TileIndex tile)
/* Sparks on a coal plant */
case GFX_POWERPLANT_SPARKS:
if ((SCALED_TICK_COUNTER & 3) == 0) {
if ((_scaled_tick_counter & 3) == 0) {
byte m = GetAnimationFrame(tile);
if (m == 6) {
SetAnimationFrame(tile, 0);
@ -607,7 +607,7 @@ static void AnimateTile_Industry(TileIndex tile)
break;
case GFX_TOY_FACTORY:
if ((SCALED_TICK_COUNTER & 1) == 0) {
if ((_scaled_tick_counter & 1) == 0) {
byte m = GetAnimationFrame(tile) + 1;
switch (m) {
@ -635,7 +635,7 @@ static void AnimateTile_Industry(TileIndex tile)
case GFX_PLASTIC_FOUNTAIN_ANIMATED_3: case GFX_PLASTIC_FOUNTAIN_ANIMATED_4:
case GFX_PLASTIC_FOUNTAIN_ANIMATED_5: case GFX_PLASTIC_FOUNTAIN_ANIMATED_6:
case GFX_PLASTIC_FOUNTAIN_ANIMATED_7: case GFX_PLASTIC_FOUNTAIN_ANIMATED_8:
if ((SCALED_TICK_COUNTER & 3) == 0) {
if ((_scaled_tick_counter & 3) == 0) {
IndustryGfx gfx = GetIndustryGfx(tile);
gfx = (gfx < 155) ? gfx + 1 : 148;
@ -647,7 +647,7 @@ static void AnimateTile_Industry(TileIndex tile)
case GFX_OILWELL_ANIMATED_1:
case GFX_OILWELL_ANIMATED_2:
case GFX_OILWELL_ANIMATED_3:
if ((SCALED_TICK_COUNTER & 7) == 0) {
if ((_scaled_tick_counter & 7) == 0) {
bool b = Chance16(1, 7);
IndustryGfx gfx = GetIndustryGfx(tile);
@ -667,7 +667,7 @@ static void AnimateTile_Industry(TileIndex tile)
case GFX_COAL_MINE_TOWER_ANIMATED:
case GFX_COPPER_MINE_TOWER_ANIMATED:
case GFX_GOLD_MINE_TOWER_ANIMATED: {
int state = SCALED_TICK_COUNTER & 0x7FF;
int state = _scaled_tick_counter & 0x7FF;
if ((state -= 0x400) < 0) return;
@ -827,7 +827,7 @@ static void TileLoop_Industry(TileIndex tile)
case GFX_COAL_MINE_TOWER_NOT_ANIMATED:
case GFX_COPPER_MINE_TOWER_NOT_ANIMATED:
case GFX_GOLD_MINE_TOWER_NOT_ANIMATED:
if (!(SCALED_TICK_COUNTER & 0x400) && Chance16(1, 2)) {
if (!(_scaled_tick_counter & 0x400) && Chance16(1, 2)) {
switch (gfx) {
case GFX_COAL_MINE_TOWER_NOT_ANIMATED: gfx = GFX_COAL_MINE_TOWER_ANIMATED; break;
case GFX_COPPER_MINE_TOWER_NOT_ANIMATED: gfx = GFX_COPPER_MINE_TOWER_ANIMATED; break;
@ -850,7 +850,7 @@ static void TileLoop_Industry(TileIndex tile)
case GFX_COAL_MINE_TOWER_ANIMATED:
case GFX_COPPER_MINE_TOWER_ANIMATED:
case GFX_GOLD_MINE_TOWER_ANIMATED:
if (!(SCALED_TICK_COUNTER & 0x400)) {
if (!(_scaled_tick_counter & 0x400)) {
switch (gfx) {
case GFX_COAL_MINE_TOWER_ANIMATED: gfx = GFX_COAL_MINE_TOWER_NOT_ANIMATED; break;
case GFX_COPPER_MINE_TOWER_ANIMATED: gfx = GFX_COPPER_MINE_TOWER_NOT_ANIMATED; break;

@ -75,6 +75,8 @@ void InitializeGame(uint size_x, uint size_y, bool reset_date, bool reset_settin
if (reset_date) {
SetDate(ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1), 0);
InitializeOldNames();
} else {
SetScaledTickVariables();
}
LinkGraphSchedule::Clear();

@ -9226,6 +9226,7 @@ void LoadNewGRF(uint load_index, uint file_index)
Year year = _cur_year;
DateFract date_fract = _date_fract;
uint16 tick_counter = _tick_counter;
uint8 tick_skip_counter = _tick_skip_counter;
byte display_opt = _display_opt;
if (_networking) {
@ -9233,7 +9234,9 @@ void LoadNewGRF(uint load_index, uint file_index)
_date = ConvertYMDToDate(_cur_year, 0, 1);
_date_fract = 0;
_tick_counter = 0;
_tick_skip_counter = 0;
_display_opt = 0;
SetScaledTickVariables();
}
InitializeGRFSpecial();
@ -9316,7 +9319,9 @@ void LoadNewGRF(uint load_index, uint file_index)
_date = date;
_date_fract = date_fract;
_tick_counter = tick_counter;
_tick_skip_counter = tick_skip_counter;
_display_opt = display_opt;
SetScaledTickVariables();
}
/**

@ -56,7 +56,7 @@ struct AnimationBase {
* increasing this value by one doubles the wait. 0 is the minimum value
* allowed for animation_speed, which corresponds to 30ms, and 16 is the
* maximum, corresponding to around 33 minutes. */
if (SCALED_TICK_COUNTER % (1 << animation_speed) != 0) return;
if (_scaled_tick_counter % (1 << animation_speed) != 0) return;
uint8 frame = GetAnimationFrame(tile);
uint8 num_frames = spec->animation.frames;

@ -1262,7 +1262,7 @@ void CheckCaches(bool force_check)
* always to aid testing of caches. */
if (_debug_desync_level < 1) return;
if (_debug_desync_level == 1 && CURRENT_SCALED_TICKS % 500 != 0) return;
if (_debug_desync_level == 1 && _scaled_date_ticks % 500 != 0) return;
}
/* Check the town caches. */
@ -1527,13 +1527,15 @@ void StateGameLoop()
BasePersistentStorageArray::SwitchMode(PSM_ENTER_GAMELOOP);
_tick_skip_counter++;
_scaled_tick_counter++; // This must update in lock-step with _tick_skip_counter, such that it always matches what SetScaledTickVariables would return.
_scaled_date_ticks++; // "
if (_tick_skip_counter < _settings_game.economy.day_length_factor) {
AnimateAnimatedTiles();
CallVehicleTicks();
} else {
_tick_skip_counter = 0;
AnimateAnimatedTiles();
IncreaseDate();
AnimateAnimatedTiles();
RunTileLoop();
CallVehicleTicks();
CallLandscapeTick();

@ -127,6 +127,7 @@ static const SaveLoadGlobVarList _date_check_desc[] = {
static void SaveLoad_DATE()
{
SlGlobList(_date_desc);
SetScaledTickVariables();
}
static void Check_DATE()

@ -1376,6 +1376,12 @@ static bool ImprovedBreakdownsSettingChanged(int32 p1)
return true;
}
static bool DayLengthChanged(int32 p1)
{
SetScaledTickVariables();
return true;
}
#ifdef ENABLE_NETWORK
static bool UpdateClientName(int32 p1)

@ -139,7 +139,7 @@ struct StatusBarWindow : Window {
switch (widget) {
case WID_S_LEFT:
/* Draw the date */
SetDParam(0, CURRENT_SCALED_TICKS);
SetDParam(0, _scaled_date_ticks);
DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, STR_WHITE_DATE_WALLCLOCK_LONG, TC_FROMSTRING, SA_HOR_CENTER);
break;

@ -43,6 +43,7 @@ static bool InvalidateCompanyWindow(int32 p1);
static bool ZoomMinMaxChanged(int32 p1);
static bool MaxVehiclesChanged(int32 p1);
static bool ImprovedBreakdownsSettingChanged(int32 p1);
static bool DayLengthChanged(int32 p1);
#ifdef ENABLE_NETWORK
static bool UpdateClientName(int32 p1);
@ -1438,6 +1439,7 @@ max = 125
str = STR_CONFIG_SETTING_DAY_LENGTH_FACTOR
strhelp = STR_CONFIG_SETTING_DAY_LENGTH_FACTOR_HELPTEXT
strval = STR_JUST_COMMA
proc = DayLengthChanged
cat = SC_BASIC
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH)
patxname = ""variable_day_length.economy.day_length_factor""

@ -332,7 +332,7 @@ CommandCost CmdSetTimetableStart(TileIndex tile, DoCommandFlag flags, uint32 p1,
if (timetable_all && !v->orders.list->IsCompleteTimetable()) return CMD_ERROR;
const DateTicksScaled now = CURRENT_SCALED_TICKS;
const DateTicksScaled now = _scaled_date_ticks;
DateTicksScaled start_date_scaled = (_settings_game.economy.day_length_factor * (((DateTicks)_date * DAY_TICKS) + _date_fract + (DateTicks)(int32)p2)) + sub_ticks;
if (flags & DC_EXEC) {
@ -698,7 +698,7 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling)
just_started = !HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED);
if (v->timetable_start != 0) {
v->lateness_counter = CURRENT_SCALED_TICKS - ((_settings_game.economy.day_length_factor * v->timetable_start) + v->timetable_start_subticks);
v->lateness_counter = _scaled_date_ticks - ((_settings_game.economy.day_length_factor * v->timetable_start) + v->timetable_start_subticks);
v->timetable_start = 0;
v->timetable_start_subticks = 0;
}

@ -491,10 +491,10 @@ struct TimetableWindow : Window {
if (arr_dep[i / 2].arrival != INVALID_TICKS) {
DrawString(abbr_left, abbr_right, y, STR_TIMETABLE_ARRIVAL_ABBREVIATION, i == selected ? TC_WHITE : TC_BLACK);
if (this->show_expected && i / 2 == earlyID) {
SetDParam(0, CURRENT_SCALED_TICKS + arr_dep[i / 2].arrival);
SetDParam(0, _scaled_date_ticks + arr_dep[i / 2].arrival);
DrawString(time_left, time_right, y, STR_JUST_DATE_WALLCLOCK_TINY, TC_GREEN);
} else {
SetDParam(0, CURRENT_SCALED_TICKS + arr_dep[i / 2].arrival + offset);
SetDParam(0, _scaled_date_ticks + arr_dep[i / 2].arrival + offset);
DrawString(time_left, time_right, y, STR_JUST_DATE_WALLCLOCK_TINY,
show_late ? TC_RED : i == selected ? TC_WHITE : TC_BLACK);
}
@ -502,7 +502,7 @@ struct TimetableWindow : Window {
} else {
if (arr_dep[i / 2].departure != INVALID_TICKS) {
DrawString(abbr_left, abbr_right, y, STR_TIMETABLE_DEPARTURE_ABBREVIATION, i == selected ? TC_WHITE : TC_BLACK);
SetDParam(0, CURRENT_SCALED_TICKS + arr_dep[i/2].departure + offset);
SetDParam(0, _scaled_date_ticks + arr_dep[i/2].departure + offset);
DrawString(time_left, time_right, y, STR_JUST_DATE_WALLCLOCK_TINY,
show_late ? TC_RED : i == selected ? TC_WHITE : TC_BLACK);
}
@ -576,7 +576,7 @@ struct TimetableWindow : Window {
if (_settings_client.gui.time_in_minutes && _settings_client.gui.timetable_start_text_entry) {
this->set_start_date_all = v->orders.list->IsCompleteTimetable() && _ctrl_pressed;
StringID str = STR_JUST_INT;
uint64 time = CURRENT_SCALED_TICKS;
uint64 time = _scaled_date_ticks;
time /= _settings_client.gui.ticks_per_minute;
time += _settings_client.gui.clock_offset;
time %= (24 * 60);
@ -585,7 +585,7 @@ struct TimetableWindow : Window {
ShowQueryString(str, STR_TIMETABLE_STARTING_DATE, 31, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED);
} else {
ShowSetDateWindow(this, v->index | (v->orders.list->IsCompleteTimetable() && _ctrl_pressed ? 1U << 20 : 0),
CURRENT_SCALED_TICKS, _cur_year, _cur_year + 15, ChangeTimetableStartCallback);
_scaled_date_ticks, _cur_year, _cur_year + 15, ChangeTimetableStartCallback);
}
break;

@ -399,7 +399,7 @@ static void AnimateTile_Town(TileIndex tile)
return;
}
if (SCALED_TICK_COUNTER & 3) return;
if (_scaled_tick_counter & 3) return;
/* If the house is not one with a lift anymore, then stop this animating.
* Not exactly sure when this happens, but probably when a house changes.

Loading…
Cancel
Save