Rename DateTicksScaled to StateTicks
Rename various other related/derived types and variables
This commit is contained in:
@@ -22,7 +22,7 @@ struct BaseConsist {
|
|||||||
/* Used for timetabling. */
|
/* Used for timetabling. */
|
||||||
uint32_t current_order_time; ///< How many ticks have passed since this order started.
|
uint32_t current_order_time; ///< How many ticks have passed since this order started.
|
||||||
int32_t lateness_counter; ///< How many ticks late (or early if negative) this vehicle is.
|
int32_t lateness_counter; ///< How many ticks late (or early if negative) this vehicle is.
|
||||||
DateTicksScaled timetable_start; ///< When the vehicle is supposed to start the timetable.
|
StateTicks timetable_start; ///< When the vehicle is supposed to start the timetable.
|
||||||
|
|
||||||
uint16_t service_interval; ///< The interval for (automatic) servicing; either in days or %.
|
uint16_t service_interval; ///< The interval for (automatic) servicing; either in days or %.
|
||||||
|
|
||||||
|
54
src/date.cpp
54
src/date.cpp
@@ -32,8 +32,8 @@ DateFract _date_fract; ///< Fractional part of the day.
|
|||||||
uint64_t _tick_counter; ///< Ever incrementing tick counter for setting off various events
|
uint64_t _tick_counter; ///< Ever incrementing tick counter for setting off various events
|
||||||
uint8_t _tick_skip_counter; ///< Counter for ticks, when only vehicles are moving and nothing else happens
|
uint8_t _tick_skip_counter; ///< Counter for ticks, when only vehicles are moving and nothing else happens
|
||||||
uint64_t _scaled_tick_counter; ///< Tick counter in daylength-scaled ticks
|
uint64_t _scaled_tick_counter; ///< Tick counter in daylength-scaled ticks
|
||||||
DateTicksScaled _scaled_date_ticks; ///< Date as ticks in daylength-scaled ticks
|
StateTicks _state_ticks; ///< Current state tick
|
||||||
DateTicksScaled _scaled_date_ticks_offset; ///< Offset to add when generating _scaled_date_ticks
|
StateTicks _state_ticks_offset; ///< Offset to add when calculating a StateTicks value from a date/date fract/tick skip counter
|
||||||
uint32_t _quit_after_days; ///< Quit after this many days of run time
|
uint32_t _quit_after_days; ///< Quit after this many days of run time
|
||||||
|
|
||||||
YearMonthDay _game_load_cur_date_ymd;
|
YearMonthDay _game_load_cur_date_ymd;
|
||||||
@@ -42,43 +42,43 @@ uint8_t _game_load_tick_skip_counter;
|
|||||||
|
|
||||||
extern void ClearOutOfDateSignalSpeedRestrictions();
|
extern void ClearOutOfDateSignalSpeedRestrictions();
|
||||||
|
|
||||||
void CheckScaledDateTicksWrap()
|
void CheckStateTicksWrap()
|
||||||
{
|
{
|
||||||
DateTicksScaledDelta tick_adjust = 0;
|
StateTicksDelta tick_adjust = 0;
|
||||||
auto get_tick_adjust = [&](DateTicksScaled target) {
|
auto get_tick_adjust = [&](StateTicks target) {
|
||||||
int32_t rounding = _settings_time.time_in_minutes * 1440;
|
int32_t rounding = _settings_time.time_in_minutes * 1440;
|
||||||
return target.AsDelta() - (target.base() % rounding);
|
return target.AsDelta() - (target.base() % rounding);
|
||||||
};
|
};
|
||||||
if (_scaled_date_ticks >= ((int64_t)1 << 60)) {
|
if (_state_ticks >= ((int64_t)1 << 60)) {
|
||||||
tick_adjust = get_tick_adjust(_scaled_date_ticks);
|
tick_adjust = get_tick_adjust(_state_ticks);
|
||||||
} else if (_scaled_date_ticks <= -((int64_t)1 << 60)) {
|
} else if (_state_ticks <= -((int64_t)1 << 60)) {
|
||||||
tick_adjust = -get_tick_adjust(-(_scaled_date_ticks.base()));
|
tick_adjust = -get_tick_adjust(-(_state_ticks.base()));
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_scaled_date_ticks_offset -= tick_adjust;
|
_state_ticks_offset -= tick_adjust;
|
||||||
_scaled_date_ticks -= tick_adjust;
|
_state_ticks -= tick_adjust;
|
||||||
|
|
||||||
extern void AdjustAllSignalSpeedRestrictionTickValues(DateTicksScaledDelta delta);
|
extern void AdjustAllSignalSpeedRestrictionTickValues(StateTicksDelta delta);
|
||||||
AdjustAllSignalSpeedRestrictionTickValues(-tick_adjust);
|
AdjustAllSignalSpeedRestrictionTickValues(-tick_adjust);
|
||||||
|
|
||||||
extern void AdjustVehicleScaledTickBase(DateTicksScaledDelta delta);
|
extern void AdjustVehicleStateTicksBase(StateTicksDelta delta);
|
||||||
AdjustVehicleScaledTickBase(-tick_adjust);
|
AdjustVehicleStateTicksBase(-tick_adjust);
|
||||||
|
|
||||||
extern void AdjustLinkGraphScaledTickBase(DateTicksScaledDelta delta);
|
extern void AdjustLinkGraphStateTicksBase(StateTicksDelta delta);
|
||||||
AdjustLinkGraphScaledTickBase(-tick_adjust);
|
AdjustLinkGraphStateTicksBase(-tick_adjust);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RebaseScaledDateTicksBase()
|
void RebaseStateTicksBase()
|
||||||
{
|
{
|
||||||
DateTicksScaled old_scaled_date_ticks = _scaled_date_ticks;
|
StateTicks old_state_ticks = _state_ticks;
|
||||||
SetScaledTickVariables();
|
SetScaledTickVariables();
|
||||||
_scaled_date_ticks_offset += (old_scaled_date_ticks - _scaled_date_ticks);
|
_state_ticks_offset += (old_state_ticks - _state_ticks);
|
||||||
SetScaledTickVariables();
|
SetScaledTickVariables();
|
||||||
assert(old_scaled_date_ticks == _scaled_date_ticks);
|
assert(old_state_ticks == _state_ticks);
|
||||||
|
|
||||||
CheckScaledDateTicksWrap();
|
CheckStateTicksWrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -86,7 +86,7 @@ void RebaseScaledDateTicksBase()
|
|||||||
* @param date New date
|
* @param date New date
|
||||||
* @param fract The number of ticks that have passed on this date.
|
* @param fract The number of ticks that have passed on this date.
|
||||||
*/
|
*/
|
||||||
void SetDate(Date date, DateFract fract, bool preserve_scaled_ticks)
|
void SetDate(Date date, DateFract fract, bool preserve_state_tick)
|
||||||
{
|
{
|
||||||
assert(fract < DAY_TICKS);
|
assert(fract < DAY_TICKS);
|
||||||
|
|
||||||
@@ -94,8 +94,8 @@ void SetDate(Date date, DateFract fract, bool preserve_scaled_ticks)
|
|||||||
_date_fract = fract;
|
_date_fract = fract;
|
||||||
YearMonthDay ymd = ConvertDateToYMD(date);
|
YearMonthDay ymd = ConvertDateToYMD(date);
|
||||||
_cur_date_ymd = ymd;
|
_cur_date_ymd = ymd;
|
||||||
if (preserve_scaled_ticks) {
|
if (preserve_state_tick) {
|
||||||
RebaseScaledDateTicksBase();
|
RebaseStateTicksBase();
|
||||||
} else {
|
} else {
|
||||||
SetScaledTickVariables();
|
SetScaledTickVariables();
|
||||||
}
|
}
|
||||||
@@ -104,7 +104,7 @@ void SetDate(Date date, DateFract fract, bool preserve_scaled_ticks)
|
|||||||
|
|
||||||
void SetScaledTickVariables()
|
void SetScaledTickVariables()
|
||||||
{
|
{
|
||||||
_scaled_date_ticks = ((int64_t)(DateToDateTicks(_date, _date_fract).base()) * _settings_game.economy.day_length_factor) + _tick_skip_counter + _scaled_date_ticks_offset;
|
_state_ticks = ((int64_t)(DateToDateTicks(_date, _date_fract).base()) * _settings_game.economy.day_length_factor) + _tick_skip_counter + _state_ticks_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define M(a, b) ((a << 5) | b)
|
#define M(a, b) ((a << 5) | b)
|
||||||
@@ -270,14 +270,14 @@ static void OnNewYear()
|
|||||||
LinkGraphSchedule::instance.ShiftDates(-days_this_year);
|
LinkGraphSchedule::instance.ShiftDates(-days_this_year);
|
||||||
ShiftOrderDates(-days_this_year);
|
ShiftOrderDates(-days_this_year);
|
||||||
ShiftVehicleDates(-days_this_year);
|
ShiftVehicleDates(-days_this_year);
|
||||||
_scaled_date_ticks_offset += ((int64_t)days_this_year) * (DAY_TICKS * _settings_game.economy.day_length_factor);
|
_state_ticks_offset += ((int64_t)days_this_year) * (DAY_TICKS * _settings_game.economy.day_length_factor);
|
||||||
|
|
||||||
/* Because the _date wraps here, and text-messages expire by game-days, we have to clean out
|
/* Because the _date wraps here, and text-messages expire by game-days, we have to clean out
|
||||||
* all of them if the date is set back, else those messages will hang for ever */
|
* all of them if the date is set back, else those messages will hang for ever */
|
||||||
NetworkInitChatMessage();
|
NetworkInitChatMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckScaledDateTicksWrap();
|
CheckStateTicksWrap();
|
||||||
|
|
||||||
if (_settings_client.gui.auto_euro) CheckSwitchToEuro();
|
if (_settings_client.gui.auto_euro) CheckSwitchToEuro();
|
||||||
IConsoleCmdExec("exec scripts/on_newyear.scr 0");
|
IConsoleCmdExec("exec scripts/on_newyear.scr 0");
|
||||||
|
@@ -20,8 +20,8 @@ extern DateFract _date_fract;
|
|||||||
extern uint64_t _tick_counter;
|
extern uint64_t _tick_counter;
|
||||||
extern uint8_t _tick_skip_counter;
|
extern uint8_t _tick_skip_counter;
|
||||||
extern uint64_t _scaled_tick_counter;
|
extern uint64_t _scaled_tick_counter;
|
||||||
extern DateTicksScaled _scaled_date_ticks;
|
extern StateTicks _state_ticks;
|
||||||
extern DateTicksScaled _scaled_date_ticks_offset;
|
extern StateTicks _state_ticks_offset;
|
||||||
extern uint32_t _quit_after_days;
|
extern uint32_t _quit_after_days;
|
||||||
|
|
||||||
extern YearMonthDay _game_load_cur_date_ymd;
|
extern YearMonthDay _game_load_cur_date_ymd;
|
||||||
@@ -50,24 +50,24 @@ inline bool IsLeapYear(Year yr)
|
|||||||
return yr % 4 == 0 && (yr % 100 != 0 || yr % 400 == 0);
|
return yr % 4 == 0 && (yr % 100 != 0 || yr % 400 == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Date ScaledDateTicksToDate(DateTicksScaled ticks)
|
inline Date StateTicksToDate(StateTicks ticks)
|
||||||
{
|
{
|
||||||
return (ticks.base() - _scaled_date_ticks_offset.base()) / (DAY_TICKS * _settings_game.economy.day_length_factor);
|
return (ticks.base() - _state_ticks_offset.base()) / (DAY_TICKS * _settings_game.economy.day_length_factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline DateTicksScaled DateToScaledDateTicks(Date date)
|
inline StateTicks DateToStateTicks(Date date)
|
||||||
{
|
{
|
||||||
return ((int64_t)date.base() * DAY_TICKS * _settings_game.economy.day_length_factor) + _scaled_date_ticks_offset.base();
|
return ((int64_t)date.base() * DAY_TICKS * _settings_game.economy.day_length_factor) + _state_ticks_offset.base();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline DateTicks ScaledDateTicksToDateTicks(DateTicksScaled ticks)
|
inline DateTicks StateTicksToDateTicks(StateTicks ticks)
|
||||||
{
|
{
|
||||||
return (ticks.base() - _scaled_date_ticks_offset.base()) / _settings_game.economy.day_length_factor;
|
return (ticks.base() - _state_ticks_offset.base()) / _settings_game.economy.day_length_factor;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline DateTicksScaled DateTicksToScaledDateTicks(DateTicks date_ticks)
|
inline StateTicks DateTicksToStateTicks(DateTicks date_ticks)
|
||||||
{
|
{
|
||||||
return ((int64_t)date_ticks.base() * _settings_game.economy.day_length_factor) + _scaled_date_ticks_offset.base();
|
return ((int64_t)date_ticks.base() * _settings_game.economy.day_length_factor) + _state_ticks_offset.base();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
/** Window to select a date graphically by using dropdowns */
|
/** Window to select a date graphically by using dropdowns */
|
||||||
struct SetDateWindow : Window {
|
struct SetDateWindow : Window {
|
||||||
SetDateCallback *callback; ///< Callback to call when a date has been selected
|
SetTickCallback *callback; ///< Callback to call when a date has been selected
|
||||||
YearMonthDay date; ///< The currently selected date
|
YearMonthDay date; ///< The currently selected date
|
||||||
Year min_year; ///< The minimum year in the year dropdown
|
Year min_year; ///< The minimum year in the year dropdown
|
||||||
Year max_year; ///< The maximum year (inclusive) in the year dropdown
|
Year max_year; ///< The maximum year (inclusive) in the year dropdown
|
||||||
@@ -40,7 +40,7 @@ struct SetDateWindow : Window {
|
|||||||
* @param callback the callback to call once a date has been selected
|
* @param callback the callback to call once a date has been selected
|
||||||
*/
|
*/
|
||||||
SetDateWindow(WindowDesc *desc, WindowNumber window_number, Window *parent, Date initial_date, Year min_year, Year max_year,
|
SetDateWindow(WindowDesc *desc, WindowNumber window_number, Window *parent, Date initial_date, Year min_year, Year max_year,
|
||||||
SetDateCallback *callback, StringID button_text, StringID button_tooltip) :
|
SetTickCallback *callback, StringID button_text, StringID button_tooltip) :
|
||||||
Window(desc),
|
Window(desc),
|
||||||
callback(callback),
|
callback(callback),
|
||||||
min_year(std::max(MIN_YEAR, min_year)),
|
min_year(std::max(MIN_YEAR, min_year)),
|
||||||
@@ -153,7 +153,7 @@ struct SetDateWindow : Window {
|
|||||||
break;
|
break;
|
||||||
case WID_SD_SET_DATE:
|
case WID_SD_SET_DATE:
|
||||||
if (this->callback != nullptr) {
|
if (this->callback != nullptr) {
|
||||||
this->callback(this, DateToScaledDateTicks(ConvertYMDToDate(this->date.year, this->date.month, this->date.day)));
|
this->callback(this, DateToStateTicks(ConvertYMDToDate(this->date.year, this->date.month, this->date.day)));
|
||||||
}
|
}
|
||||||
this->Close();
|
this->Close();
|
||||||
break;
|
break;
|
||||||
@@ -184,10 +184,10 @@ struct SetMinutesWindow : SetDateWindow
|
|||||||
TickMinutes minutes;
|
TickMinutes minutes;
|
||||||
|
|
||||||
/** Constructor. */
|
/** Constructor. */
|
||||||
SetMinutesWindow(WindowDesc *desc, WindowNumber window_number, Window *parent, DateTicksScaled initial_date, Year min_year, Year max_year,
|
SetMinutesWindow(WindowDesc *desc, WindowNumber window_number, Window *parent, StateTicks initial_tick, Year min_year, Year max_year,
|
||||||
SetDateCallback *callback, StringID button_text, StringID button_tooltip) :
|
SetTickCallback *callback, StringID button_text, StringID button_tooltip) :
|
||||||
SetDateWindow(desc, window_number, parent, 0, min_year, max_year, callback, button_text, button_tooltip),
|
SetDateWindow(desc, window_number, parent, 0, min_year, max_year, callback, button_text, button_tooltip),
|
||||||
minutes(_settings_time.ToTickMinutes(initial_date))
|
minutes(_settings_time.ToTickMinutes(initial_tick))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,19 +361,19 @@ static WindowDesc _set_minutes_desc(__FILE__, __LINE__,
|
|||||||
* Create the new 'set date' window
|
* Create the new 'set date' window
|
||||||
* @param window_number number for the window
|
* @param window_number number for the window
|
||||||
* @param parent the parent window, i.e. if this closes we should close too
|
* @param parent the parent window, i.e. if this closes we should close too
|
||||||
* @param initial_date the initial date to show
|
* @param initial_tick the initial tick to show
|
||||||
* @param min_year the minimum year to show in the year dropdown
|
* @param min_year the minimum year to show in the year dropdown
|
||||||
* @param max_year the maximum year (inclusive) to show in the year dropdown
|
* @param max_year the maximum year (inclusive) to show in the year dropdown
|
||||||
* @param callback the callback to call once a date has been selected
|
* @param callback the callback to call once a date has been selected
|
||||||
*/
|
*/
|
||||||
void ShowSetDateWindow(Window *parent, int window_number, DateTicksScaled initial_date, Year min_year, Year max_year,
|
void ShowSetDateWindow(Window *parent, int window_number, StateTicks initial_tick, Year min_year, Year max_year,
|
||||||
SetDateCallback *callback, StringID button_text, StringID button_tooltip)
|
SetTickCallback *callback, StringID button_text, StringID button_tooltip)
|
||||||
{
|
{
|
||||||
CloseWindowByClass(WC_SET_DATE);
|
CloseWindowByClass(WC_SET_DATE);
|
||||||
|
|
||||||
if (!_settings_time.time_in_minutes) {
|
if (!_settings_time.time_in_minutes) {
|
||||||
new SetDateWindow(&_set_date_desc, window_number, parent, ScaledDateTicksToDate(initial_date), min_year, max_year, callback, button_text, button_tooltip);
|
new SetDateWindow(&_set_date_desc, window_number, parent, StateTicksToDate(initial_tick), min_year, max_year, callback, button_text, button_tooltip);
|
||||||
} else {
|
} else {
|
||||||
new SetMinutesWindow(&_set_minutes_desc, window_number, parent, initial_date, min_year, max_year, callback, button_text, button_tooltip);
|
new SetMinutesWindow(&_set_minutes_desc, window_number, parent, initial_tick, min_year, max_year, callback, button_text, button_tooltip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,13 +14,13 @@
|
|||||||
#include "window_type.h"
|
#include "window_type.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback for when a date has been chosen
|
* Callback for when a tick has been chosen
|
||||||
* @param w the window that sends the callback
|
* @param w the window that sends the callback
|
||||||
* @param date the date that has been chosen
|
* @param tick the tick that has been chosen
|
||||||
*/
|
*/
|
||||||
typedef void SetDateCallback(const Window *w, DateTicksScaled date);
|
typedef void SetTickCallback(const Window *w, StateTicks tick);
|
||||||
|
|
||||||
void ShowSetDateWindow(Window *parent, int window_number, DateTicksScaled initial_date, Year min_year, Year max_year, SetDateCallback *callback,
|
void ShowSetDateWindow(Window *parent, int window_number, StateTicks initial_tick, Year min_year, Year max_year, SetTickCallback *callback,
|
||||||
StringID button_text = STR_NULL, StringID button_tooltip = STR_NULL);
|
StringID button_text = STR_NULL, StringID button_tooltip = STR_NULL);
|
||||||
|
|
||||||
#endif /* DATE_GUI_H */
|
#endif /* DATE_GUI_H */
|
||||||
|
@@ -54,8 +54,8 @@ struct DateTicksOperations {
|
|||||||
using DateTicksDelta = StrongType::Typedef<int64_t, struct DateTicksDeltaTag, StrongType::Compare, StrongType::IntegerScalable>;
|
using DateTicksDelta = StrongType::Typedef<int64_t, struct DateTicksDeltaTag, StrongType::Compare, StrongType::IntegerScalable>;
|
||||||
using DateTicks = StrongType::Typedef<int64_t, struct DateTicksTag, StrongType::Compare, StrongType::IntegerDelta<DateTicksDelta>, DateTicksOperations>;
|
using DateTicks = StrongType::Typedef<int64_t, struct DateTicksTag, StrongType::Compare, StrongType::IntegerDelta<DateTicksDelta>, DateTicksOperations>;
|
||||||
|
|
||||||
/* Mixin for DateTicksScaledDelta */
|
/* Mixin for StateTicksDelta */
|
||||||
struct DateTicksScaledDeltaOperations {
|
struct StateTicksDeltaOperations {
|
||||||
template <typename TType, typename TBaseType>
|
template <typename TType, typename TBaseType>
|
||||||
struct mixin {
|
struct mixin {
|
||||||
private:
|
private:
|
||||||
@@ -69,9 +69,9 @@ struct DateTicksScaledDeltaOperations {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The type to store dates scaled by the day length factor in when tick-precision is required */
|
/* The type to store state ticks (this always ticks at the same rate regardless of day length, even in the scenario editor */
|
||||||
using DateTicksScaledDelta = StrongType::Typedef<int64_t, struct DateTicksScaledDeltaTag, StrongType::Compare, StrongType::IntegerScalable, DateTicksScaledDeltaOperations>;
|
using StateTicksDelta = StrongType::Typedef<int64_t, struct StateTicksDeltaTag, StrongType::Compare, StrongType::IntegerScalable, StateTicksDeltaOperations>;
|
||||||
using DateTicksScaled = StrongType::Typedef<int64_t, struct DateTicksScaledTag, StrongType::Compare, StrongType::IntegerDelta<DateTicksScaledDelta>>;
|
using StateTicks = StrongType::Typedef<int64_t, struct StateTicksTag, StrongType::Compare, StrongType::IntegerDelta<StateTicksDelta>>;
|
||||||
|
|
||||||
/* Mixin for TickMinutes, ClockFaceMinutes */
|
/* Mixin for TickMinutes, ClockFaceMinutes */
|
||||||
template <bool TNegativeCheck>
|
template <bool TNegativeCheck>
|
||||||
@@ -134,7 +134,7 @@ struct TickMinuteOperations {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The type to store DateTicksScaled-based minutes in */
|
/* The type to store StateTicks-based minutes in */
|
||||||
using TickMinutes = StrongType::Typedef<int64_t, struct TickMinutesTag, StrongType::Compare, StrongType::Integer, MinuteOperations<true>, TickMinuteOperations>;
|
using TickMinutes = StrongType::Typedef<int64_t, struct TickMinutesTag, StrongType::Compare, StrongType::Integer, MinuteOperations<true>, TickMinuteOperations>;
|
||||||
|
|
||||||
#define DATE_UNIT_SIZE (_settings_time.time_in_minutes ? _settings_time.ticks_per_minute : (DAY_TICKS * _settings_game.economy.day_length_factor))
|
#define DATE_UNIT_SIZE (_settings_time.time_in_minutes ? _settings_time.ticks_per_minute : (DAY_TICKS * _settings_game.economy.day_length_factor))
|
||||||
|
@@ -40,7 +40,7 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
/* A cache of used departure time for scheduled dispatch in departure time calculation */
|
/* A cache of used departure time for scheduled dispatch in departure time calculation */
|
||||||
typedef btree::btree_map<const DispatchSchedule *, btree::btree_set<DateTicksScaled>> schdispatch_cache_t;
|
typedef btree::btree_map<const DispatchSchedule *, btree::btree_set<StateTicks>> schdispatch_cache_t;
|
||||||
|
|
||||||
/** A scheduled order. */
|
/** A scheduled order. */
|
||||||
struct OrderDate {
|
struct OrderDate {
|
||||||
@@ -87,21 +87,21 @@ static bool IsArrival(const Order *order, StationID station) {
|
|||||||
!(order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION));
|
!(order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION));
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t GetDepartureConditionalOrderMode(const Order *order, const Vehicle *v, DateTicksScaled eval_date)
|
static uint8_t GetDepartureConditionalOrderMode(const Order *order, const Vehicle *v, StateTicks eval_tick)
|
||||||
{
|
{
|
||||||
if (order->GetConditionVariable() == OCV_UNCONDITIONALLY) return 1;
|
if (order->GetConditionVariable() == OCV_UNCONDITIONALLY) return 1;
|
||||||
if (order->GetConditionVariable() == OCV_TIME_DATE) {
|
if (order->GetConditionVariable() == OCV_TIME_DATE) {
|
||||||
int value = GetTraceRestrictTimeDateValueFromDate(static_cast<TraceRestrictTimeDateValueField>(order->GetConditionValue()), eval_date);
|
int value = GetTraceRestrictTimeDateValueFromStateTicks(static_cast<TraceRestrictTimeDateValueField>(order->GetConditionValue()), eval_tick);
|
||||||
return OrderConditionCompare(order->GetConditionComparator(), value, order->GetXData()) ? 1 : 2;
|
return OrderConditionCompare(order->GetConditionComparator(), value, order->GetXData()) ? 1 : 2;
|
||||||
}
|
}
|
||||||
if (order->GetConditionVariable() == OCV_DISPATCH_SLOT) {
|
if (order->GetConditionVariable() == OCV_DISPATCH_SLOT) {
|
||||||
extern bool EvaluateDispatchSlotConditionalOrder(const Order *order, const Vehicle *v, DateTicksScaled date_time, bool *predicted);
|
extern bool EvaluateDispatchSlotConditionalOrder(const Order *order, const Vehicle *v, StateTicks state_ticks, bool *predicted);
|
||||||
return EvaluateDispatchSlotConditionalOrder(order, v, eval_date, nullptr) ? 1 : 2;
|
return EvaluateDispatchSlotConditionalOrder(order, v, eval_tick, nullptr) ? 1 : 2;
|
||||||
}
|
}
|
||||||
return _settings_client.gui.departure_conditionals;
|
return _settings_client.gui.departure_conditionals;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool VehicleSetNextDepartureTime(Ticks *previous_departure, Ticks *waiting_time, const DateTicksScaled date_ticks_base, const Vehicle *v, const Order *order, bool arrived_at_timing_point, schdispatch_cache_t &dept_schedule_last)
|
static bool VehicleSetNextDepartureTime(Ticks *previous_departure, Ticks *waiting_time, const StateTicks state_ticks_base, const Vehicle *v, const Order *order, bool arrived_at_timing_point, schdispatch_cache_t &dept_schedule_last)
|
||||||
{
|
{
|
||||||
if (HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH)) {
|
if (HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH)) {
|
||||||
auto is_current_implicit_order = [&v](const Order *o) -> bool {
|
auto is_current_implicit_order = [&v](const Order *o) -> bool {
|
||||||
@@ -114,27 +114,27 @@ static bool VehicleSetNextDepartureTime(Ticks *previous_departure, Ticks *waitin
|
|||||||
if (order->IsScheduledDispatchOrder(true) && !(arrived_at_timing_point && is_current_implicit_order(order))) {
|
if (order->IsScheduledDispatchOrder(true) && !(arrived_at_timing_point && is_current_implicit_order(order))) {
|
||||||
const DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(order->GetDispatchScheduleIndex());
|
const DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(order->GetDispatchScheduleIndex());
|
||||||
|
|
||||||
DateTicksScaled actual_departure = -1;
|
StateTicks actual_departure = -1;
|
||||||
const DateTicksScaled begin_time = ds.GetScheduledDispatchStartTick();
|
const StateTicks begin_time = ds.GetScheduledDispatchStartTick();
|
||||||
const uint32_t dispatch_duration = ds.GetScheduledDispatchDuration();
|
const uint32_t dispatch_duration = ds.GetScheduledDispatchDuration();
|
||||||
const int32_t max_delay = ds.GetScheduledDispatchDelay();
|
const int32_t max_delay = ds.GetScheduledDispatchDelay();
|
||||||
|
|
||||||
/* Earliest possible departure according to schedue */
|
/* Earliest possible departure according to schedue */
|
||||||
DateTicksScaled earliest_departure = begin_time + ds.GetScheduledDispatchLastDispatch();
|
StateTicks earliest_departure = begin_time + ds.GetScheduledDispatchLastDispatch();
|
||||||
|
|
||||||
/* Earliest possible departure according to vehicle current timetable */
|
/* Earliest possible departure according to vehicle current timetable */
|
||||||
const DateTicksScaled ready_to_depart_time = date_ticks_base + *previous_departure + order->GetTravelTime() + order->GetTimetabledWait();
|
const StateTicks ready_to_depart_time = state_ticks_base + *previous_departure + order->GetTravelTime() + order->GetTimetabledWait();
|
||||||
if (earliest_departure + max_delay < ready_to_depart_time) {
|
if (earliest_departure + max_delay < ready_to_depart_time) {
|
||||||
earliest_departure = ready_to_depart_time - max_delay - 1;
|
earliest_departure = ready_to_depart_time - max_delay - 1;
|
||||||
/* -1 because this number is actually a moment before actual departure */
|
/* -1 because this number is actually a moment before actual departure */
|
||||||
}
|
}
|
||||||
|
|
||||||
btree::btree_set<DateTicksScaled> &slot_cache = dept_schedule_last[&ds];
|
btree::btree_set<StateTicks> &slot_cache = dept_schedule_last[&ds];
|
||||||
|
|
||||||
/* Find next available slots */
|
/* Find next available slots */
|
||||||
for (const DispatchSlot &slot : ds.GetScheduledDispatch()) {
|
for (const DispatchSlot &slot : ds.GetScheduledDispatch()) {
|
||||||
if (slot.offset >= dispatch_duration) continue;
|
if (slot.offset >= dispatch_duration) continue;
|
||||||
DateTicksScaled current_departure = begin_time + slot.offset;
|
StateTicks current_departure = begin_time + slot.offset;
|
||||||
while (current_departure <= earliest_departure) {
|
while (current_departure <= earliest_departure) {
|
||||||
current_departure += dispatch_duration;
|
current_departure += dispatch_duration;
|
||||||
}
|
}
|
||||||
@@ -153,8 +153,8 @@ static bool VehicleSetNextDepartureTime(Ticks *previous_departure, Ticks *waitin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*waiting_time = (actual_departure - date_ticks_base).AsTicks() - *previous_departure - order->GetTravelTime();
|
*waiting_time = (actual_departure - state_ticks_base).AsTicks() - *previous_departure - order->GetTravelTime();
|
||||||
*previous_departure = (actual_departure - date_ticks_base).AsTicks();
|
*previous_departure = (actual_departure - state_ticks_base).AsTicks();
|
||||||
if (!ds.GetScheduledDispatchReuseSlots()) {
|
if (!ds.GetScheduledDispatchReuseSlots()) {
|
||||||
slot_cache.insert(actual_departure);
|
slot_cache.insert(actual_departure);
|
||||||
}
|
}
|
||||||
@@ -191,24 +191,24 @@ static void ScheduledDispatchDepartureLocalFix(DepartureList *departure_list)
|
|||||||
/* If the group is scheduled dispatch, then */
|
/* If the group is scheduled dispatch, then */
|
||||||
if (HasBit(d_list[0]->vehicle->vehicle_flags, VF_SCHEDULED_DISPATCH)) {
|
if (HasBit(d_list[0]->vehicle->vehicle_flags, VF_SCHEDULED_DISPATCH)) {
|
||||||
/* Separate departure time and sort them ascendently */
|
/* Separate departure time and sort them ascendently */
|
||||||
std::vector<DateTicksScaled> departure_time_list;
|
std::vector<StateTicks> departure_time_list;
|
||||||
for (const auto& d : d_list) {
|
for (const auto& d : d_list) {
|
||||||
departure_time_list.push_back(d->scheduled_date);
|
departure_time_list.push_back(d->scheduled_tick);
|
||||||
}
|
}
|
||||||
std::sort(departure_time_list.begin(), departure_time_list.end());
|
std::sort(departure_time_list.begin(), departure_time_list.end());
|
||||||
|
|
||||||
/* Sort the departure list by arrival time */
|
/* Sort the departure list by arrival time */
|
||||||
std::sort(d_list.begin(), d_list.end(), [](const Departure * const &a, const Departure * const &b) -> bool {
|
std::sort(d_list.begin(), d_list.end(), [](const Departure * const &a, const Departure * const &b) -> bool {
|
||||||
DateTicksScaled arr_a = a->scheduled_date - a->EffectiveWaitingTime();
|
StateTicks arr_a = a->scheduled_tick - a->EffectiveWaitingTime();
|
||||||
DateTicksScaled arr_b = b->scheduled_date - b->EffectiveWaitingTime();
|
StateTicks arr_b = b->scheduled_tick - b->EffectiveWaitingTime();
|
||||||
return arr_a < arr_b;
|
return arr_a < arr_b;
|
||||||
});
|
});
|
||||||
|
|
||||||
/* Re-assign them sequentially */
|
/* Re-assign them sequentially */
|
||||||
for (size_t i = 0; i < d_list.size(); i++) {
|
for (size_t i = 0; i < d_list.size(); i++) {
|
||||||
const DateTicksScaled arrival = d_list[i]->scheduled_date - d_list[i]->EffectiveWaitingTime();
|
const StateTicks arrival = d_list[i]->scheduled_tick - d_list[i]->EffectiveWaitingTime();
|
||||||
d_list[i]->scheduled_waiting_time = (departure_time_list[i] - arrival).AsTicks();
|
d_list[i]->scheduled_waiting_time = (departure_time_list[i] - arrival).AsTicks();
|
||||||
d_list[i]->scheduled_date = departure_time_list[i];
|
d_list[i]->scheduled_tick = departure_time_list[i];
|
||||||
|
|
||||||
if (d_list[i]->scheduled_waiting_time == (Ticks)d_list[i]->order->GetWaitTime()) {
|
if (d_list[i]->scheduled_waiting_time == (Ticks)d_list[i]->order->GetWaitTime()) {
|
||||||
d_list[i]->scheduled_waiting_time = 0;
|
d_list[i]->scheduled_waiting_time = 0;
|
||||||
@@ -219,7 +219,7 @@ static void ScheduledDispatchDepartureLocalFix(DepartureList *departure_list)
|
|||||||
|
|
||||||
/* Re-sort the departure list */
|
/* Re-sort the departure list */
|
||||||
std::sort(departure_list->begin(), departure_list->end(), [](Departure * const &a, Departure * const &b) -> bool {
|
std::sort(departure_list->begin(), departure_list->end(), [](Departure * const &a, Departure * const &b) -> bool {
|
||||||
return a->scheduled_date < b->scheduled_date;
|
return a->scheduled_tick < b->scheduled_tick;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,7 +253,7 @@ DepartureList* MakeDepartureList(StationID station, const std::vector<const Vehi
|
|||||||
/* The maximum possible date for departures to be scheduled to occur. */
|
/* The maximum possible date for departures to be scheduled to occur. */
|
||||||
const Ticks max_ticks = GetDeparturesMaxTicksAhead();
|
const Ticks max_ticks = GetDeparturesMaxTicksAhead();
|
||||||
|
|
||||||
const DateTicksScaled date_ticks_base = _scaled_date_ticks;
|
const StateTicks state_ticks_base = _state_ticks;
|
||||||
|
|
||||||
/* The scheduled order in next_orders with the earliest expected_tick field. */
|
/* The scheduled order in next_orders with the earliest expected_tick field. */
|
||||||
OrderDate *least_order = nullptr;
|
OrderDate *least_order = nullptr;
|
||||||
@@ -321,13 +321,13 @@ DepartureList* MakeDepartureList(StationID station, const std::vector<const Vehi
|
|||||||
/* Loop through the vehicle's orders until we've found a suitable order or we've determined that no such order exists. */
|
/* Loop through the vehicle's orders until we've found a suitable order or we've determined that no such order exists. */
|
||||||
/* We only need to consider each order at most once. */
|
/* We only need to consider each order at most once. */
|
||||||
for (int i = v->GetNumOrders(); i > 0; --i) {
|
for (int i = v->GetNumOrders(); i > 0; --i) {
|
||||||
if (VehicleSetNextDepartureTime(&start_ticks, &waiting_time, date_ticks_base, v, order, status == D_ARRIVED, schdispatch_last_planned_dispatch)) {
|
if (VehicleSetNextDepartureTime(&start_ticks, &waiting_time, state_ticks_base, v, order, status == D_ARRIVED, schdispatch_last_planned_dispatch)) {
|
||||||
should_reset_lateness = true;
|
should_reset_lateness = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the order is a conditional branch, handle it. */
|
/* If the order is a conditional branch, handle it. */
|
||||||
if (order->IsType(OT_CONDITIONAL)) {
|
if (order->IsType(OT_CONDITIONAL)) {
|
||||||
switch(GetDepartureConditionalOrderMode(order, v, date_ticks_base + start_ticks)) {
|
switch(GetDepartureConditionalOrderMode(order, v, state_ticks_base + start_ticks)) {
|
||||||
case 0: {
|
case 0: {
|
||||||
/* Give up */
|
/* Give up */
|
||||||
break;
|
break;
|
||||||
@@ -453,7 +453,7 @@ DepartureList* MakeDepartureList(StationID station, const std::vector<const Vehi
|
|||||||
|
|
||||||
/* We already know the least order and that it's a suitable departure, so make it into a departure. */
|
/* We already know the least order and that it's a suitable departure, so make it into a departure. */
|
||||||
Departure *d = new Departure();
|
Departure *d = new Departure();
|
||||||
d->scheduled_date = date_ticks_base + least_order->expected_tick - least_order->lateness;
|
d->scheduled_tick = state_ticks_base + least_order->expected_tick - least_order->lateness;
|
||||||
d->lateness = least_order->lateness;
|
d->lateness = least_order->lateness;
|
||||||
d->status = least_order->status;
|
d->status = least_order->status;
|
||||||
d->vehicle = least_order->v;
|
d->vehicle = least_order->v;
|
||||||
@@ -486,7 +486,7 @@ DepartureList* MakeDepartureList(StationID station, const std::vector<const Vehi
|
|||||||
order = (order->next == nullptr) ? least_order->v->GetFirstOrder() : order->next;
|
order = (order->next == nullptr) ? least_order->v->GetFirstOrder() : order->next;
|
||||||
/* We only need to consider each order at most once. */
|
/* We only need to consider each order at most once. */
|
||||||
bool found_terminus = false;
|
bool found_terminus = false;
|
||||||
CallAt c = CallAt((StationID)order->GetDestination(), d->scheduled_date);
|
CallAt c = CallAt((StationID)order->GetDestination(), d->scheduled_tick);
|
||||||
for (int i = least_order->v->GetNumOrders(); i > 0; --i) {
|
for (int i = least_order->v->GetNumOrders(); i > 0; --i) {
|
||||||
/* If we reach the order at which the departure occurs again, then use the departure station as the terminus. */
|
/* If we reach the order at which the departure occurs again, then use the departure station as the terminus. */
|
||||||
if (order == least_order->order) {
|
if (order == least_order->order) {
|
||||||
@@ -497,23 +497,23 @@ DepartureList* MakeDepartureList(StationID station, const std::vector<const Vehi
|
|||||||
|
|
||||||
/* If the order is a conditional branch, handle it. */
|
/* If the order is a conditional branch, handle it. */
|
||||||
if (order->IsType(OT_CONDITIONAL)) {
|
if (order->IsType(OT_CONDITIONAL)) {
|
||||||
switch (GetDepartureConditionalOrderMode(order, least_order->v, c.scheduled_date != 0 ? c.scheduled_date : _scaled_date_ticks)) {
|
switch (GetDepartureConditionalOrderMode(order, least_order->v, c.scheduled_tick != 0 ? c.scheduled_tick : _state_ticks)) {
|
||||||
case 0: {
|
case 0: {
|
||||||
/* Give up */
|
/* Give up */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1: {
|
case 1: {
|
||||||
/* Take the branch */
|
/* Take the branch */
|
||||||
if (c.scheduled_date != 0 && (order->GetWaitTime() != 0 || order->IsWaitTimetabled())) {
|
if (c.scheduled_tick != 0 && (order->GetWaitTime() != 0 || order->IsWaitTimetabled())) {
|
||||||
c.scheduled_date += order->GetWaitTime();
|
c.scheduled_tick += order->GetWaitTime();
|
||||||
} else {
|
} else {
|
||||||
c.scheduled_date = 0;
|
c.scheduled_tick = 0;
|
||||||
}
|
}
|
||||||
order = least_order->v->GetOrder(order->GetConditionSkipToOrder());
|
order = least_order->v->GetOrder(order->GetConditionSkipToOrder());
|
||||||
if (order == nullptr) {
|
if (order == nullptr) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (c.scheduled_date != 0) c.scheduled_date -= order->GetTravelTime();
|
if (c.scheduled_tick != 0) c.scheduled_tick -= order->GetTravelTime();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
case 2: {
|
case 2: {
|
||||||
@@ -561,10 +561,10 @@ DepartureList* MakeDepartureList(StationID station, const std::vector<const Vehi
|
|||||||
d->remove_vias.push_back({ (StationID)order->GetDestination(), (uint)(d->calling_at.size() - 1) });
|
d->remove_vias.push_back({ (StationID)order->GetDestination(), (uint)(d->calling_at.size() - 1) });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c.scheduled_date != 0 && (order->GetTravelTime() != 0 || order->IsTravelTimetabled())) {
|
if (c.scheduled_tick != 0 && (order->GetTravelTime() != 0 || order->IsTravelTimetabled())) {
|
||||||
c.scheduled_date += order->GetTravelTime(); /* TODO smart terminal may not work correctly */
|
c.scheduled_tick += order->GetTravelTime(); /* TODO smart terminal may not work correctly */
|
||||||
} else {
|
} else {
|
||||||
c.scheduled_date = 0;
|
c.scheduled_tick = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
c.station = (StationID)order->GetDestination();
|
c.station = (StationID)order->GetDestination();
|
||||||
@@ -576,7 +576,7 @@ DepartureList* MakeDepartureList(StationID station, const std::vector<const Vehi
|
|||||||
order->GetType() != OT_IMPLICIT) ||
|
order->GetType() != OT_IMPLICIT) ||
|
||||||
order->GetNonStopType() == ONSF_NO_STOP_AT_ANY_STATION ||
|
order->GetNonStopType() == ONSF_NO_STOP_AT_ANY_STATION ||
|
||||||
order->GetNonStopType() == ONSF_NO_STOP_AT_DESTINATION_STATION) {
|
order->GetNonStopType() == ONSF_NO_STOP_AT_DESTINATION_STATION) {
|
||||||
if (c.scheduled_date != 0) c.scheduled_date += order->GetWaitTime();
|
if (c.scheduled_tick != 0) c.scheduled_tick += order->GetWaitTime();
|
||||||
order = (order->next == nullptr) ? least_order->v->GetFirstOrder() : order->next;
|
order = (order->next == nullptr) ? least_order->v->GetFirstOrder() : order->next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -612,7 +612,7 @@ DepartureList* MakeDepartureList(StationID station, const std::vector<const Vehi
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c.scheduled_date != 0) c.scheduled_date += order->GetWaitTime();
|
if (c.scheduled_tick != 0) c.scheduled_tick += order->GetWaitTime();
|
||||||
|
|
||||||
/* Get the next order, which may be the vehicle's first order. */
|
/* Get the next order, which may be the vehicle's first order. */
|
||||||
order = (order->next == nullptr) ? least_order->v->GetFirstOrder() : order->next;
|
order = (order->next == nullptr) ? least_order->v->GetFirstOrder() : order->next;
|
||||||
@@ -684,7 +684,7 @@ DepartureList* MakeDepartureList(StationID station, const std::vector<const Vehi
|
|||||||
/* Again, we define a station as being called at if the vehicle loads from it. */
|
/* Again, we define a station as being called at if the vehicle loads from it. */
|
||||||
|
|
||||||
/* However, the very first thing we do is use the arrival time as the scheduled time instead of the departure time. */
|
/* However, the very first thing we do is use the arrival time as the scheduled time instead of the departure time. */
|
||||||
d->scheduled_date -= d->scheduled_waiting_time > 0 ? d->scheduled_waiting_time : order->GetWaitTime();
|
d->scheduled_tick -= d->scheduled_waiting_time > 0 ? d->scheduled_waiting_time : order->GetWaitTime();
|
||||||
|
|
||||||
const Order *candidate_origin = (order->next == nullptr) ? least_order->v->GetFirstOrder() : order->next;
|
const Order *candidate_origin = (order->next == nullptr) ? least_order->v->GetFirstOrder() : order->next;
|
||||||
bool found_origin = false;
|
bool found_origin = false;
|
||||||
@@ -769,7 +769,7 @@ DepartureList* MakeDepartureList(StationID station, const std::vector<const Vehi
|
|||||||
|
|
||||||
/* Go to the next order so we don't add the current order again. */
|
/* Go to the next order so we don't add the current order again. */
|
||||||
order = (order->next == nullptr) ? least_order->v->GetFirstOrder() : order->next;
|
order = (order->next == nullptr) ? least_order->v->GetFirstOrder() : order->next;
|
||||||
if (VehicleSetNextDepartureTime(&least_order->expected_tick, &least_order->scheduled_waiting_time, date_ticks_base, least_order->v, order, false, schdispatch_last_planned_dispatch)) {
|
if (VehicleSetNextDepartureTime(&least_order->expected_tick, &least_order->scheduled_waiting_time, state_ticks_base, least_order->v, order, false, schdispatch_last_planned_dispatch)) {
|
||||||
least_order->lateness = 0;
|
least_order->lateness = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -793,7 +793,7 @@ DepartureList* MakeDepartureList(StationID station, const std::vector<const Vehi
|
|||||||
}
|
}
|
||||||
|
|
||||||
least_order->expected_tick -= order->GetTravelTime(); /* Added in next VehicleSetNextDepartureTime */
|
least_order->expected_tick -= order->GetTravelTime(); /* Added in next VehicleSetNextDepartureTime */
|
||||||
if (VehicleSetNextDepartureTime(&least_order->expected_tick, &least_order->scheduled_waiting_time, date_ticks_base, least_order->v, order, false, schdispatch_last_planned_dispatch)) {
|
if (VehicleSetNextDepartureTime(&least_order->expected_tick, &least_order->scheduled_waiting_time, state_ticks_base, least_order->v, order, false, schdispatch_last_planned_dispatch)) {
|
||||||
least_order->lateness = 0;
|
least_order->lateness = 0;
|
||||||
}
|
}
|
||||||
require_travel_time = false;
|
require_travel_time = false;
|
||||||
@@ -803,7 +803,7 @@ DepartureList* MakeDepartureList(StationID station, const std::vector<const Vehi
|
|||||||
/* Do not take the branch */
|
/* Do not take the branch */
|
||||||
least_order->expected_tick -= order->GetWaitTime(); /* Added previously in VehicleSetNextDepartureTime */
|
least_order->expected_tick -= order->GetWaitTime(); /* Added previously in VehicleSetNextDepartureTime */
|
||||||
order = (order->next == nullptr) ? least_order->v->GetFirstOrder() : order->next;
|
order = (order->next == nullptr) ? least_order->v->GetFirstOrder() : order->next;
|
||||||
if (VehicleSetNextDepartureTime(&least_order->expected_tick, &least_order->scheduled_waiting_time, date_ticks_base, least_order->v, order, false, schdispatch_last_planned_dispatch)) {
|
if (VehicleSetNextDepartureTime(&least_order->expected_tick, &least_order->scheduled_waiting_time, state_ticks_base, least_order->v, order, false, schdispatch_last_planned_dispatch)) {
|
||||||
least_order->lateness = 0;
|
least_order->lateness = 0;
|
||||||
}
|
}
|
||||||
require_travel_time = true;
|
require_travel_time = true;
|
||||||
@@ -833,7 +833,7 @@ DepartureList* MakeDepartureList(StationID station, const std::vector<const Vehi
|
|||||||
}
|
}
|
||||||
|
|
||||||
order = (order->next == nullptr) ? least_order->v->GetFirstOrder() : order->next;
|
order = (order->next == nullptr) ? least_order->v->GetFirstOrder() : order->next;
|
||||||
if (VehicleSetNextDepartureTime(&least_order->expected_tick, &least_order->scheduled_waiting_time, date_ticks_base, least_order->v, order, false, schdispatch_last_planned_dispatch)) {
|
if (VehicleSetNextDepartureTime(&least_order->expected_tick, &least_order->scheduled_waiting_time, state_ticks_base, least_order->v, order, false, schdispatch_last_planned_dispatch)) {
|
||||||
least_order->lateness = 0;
|
least_order->lateness = 0;
|
||||||
}
|
}
|
||||||
require_travel_time = true;
|
require_travel_time = true;
|
||||||
|
@@ -424,7 +424,7 @@ public:
|
|||||||
d = (*(this->departures))[departure];
|
d = (*(this->departures))[departure];
|
||||||
const Departure *a = (*(this->arrivals))[arrival];
|
const Departure *a = (*(this->arrivals))[arrival];
|
||||||
|
|
||||||
if (a->scheduled_date < d->scheduled_date) {
|
if (a->scheduled_tick < d->scheduled_tick) {
|
||||||
d = a;
|
d = a;
|
||||||
arrival++;
|
arrival++;
|
||||||
} else {
|
} else {
|
||||||
@@ -745,8 +745,8 @@ void DeparturesWindow<Twaypoint>::DrawDeparturesListItems(const Rect &r) const
|
|||||||
uint departure = 0;
|
uint departure = 0;
|
||||||
uint arrival = 0;
|
uint arrival = 0;
|
||||||
|
|
||||||
DateTicksScaled now_date = _scaled_date_ticks;
|
StateTicks now_date = _state_ticks;
|
||||||
DateTicksScaled max_date = now_date + GetDeparturesMaxTicksAhead();
|
StateTicks max_date = now_date + GetDeparturesMaxTicksAhead();
|
||||||
|
|
||||||
/* Draw each departure. */
|
/* Draw each departure. */
|
||||||
for (uint i = 0; i < max_departures; ++i) {
|
for (uint i = 0; i < max_departures; ++i) {
|
||||||
@@ -760,7 +760,7 @@ void DeparturesWindow<Twaypoint>::DrawDeparturesListItems(const Rect &r) const
|
|||||||
d = (*(this->departures))[departure];
|
d = (*(this->departures))[departure];
|
||||||
const Departure *a = (*(this->arrivals))[arrival];
|
const Departure *a = (*(this->arrivals))[arrival];
|
||||||
|
|
||||||
if (a->scheduled_date < d->scheduled_date) {
|
if (a->scheduled_tick < d->scheduled_tick) {
|
||||||
d = a;
|
d = a;
|
||||||
arrival++;
|
arrival++;
|
||||||
} else {
|
} else {
|
||||||
@@ -773,7 +773,7 @@ void DeparturesWindow<Twaypoint>::DrawDeparturesListItems(const Rect &r) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* If for some reason the departure is too far in the future or is at a negative time, skip it. */
|
/* If for some reason the departure is too far in the future or is at a negative time, skip it. */
|
||||||
if (d->scheduled_date > max_date || d->scheduled_date < 0) {
|
if (d->scheduled_tick > max_date || d->scheduled_tick < 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -784,8 +784,8 @@ void DeparturesWindow<Twaypoint>::DrawDeparturesListItems(const Rect &r) const
|
|||||||
if (_settings_client.gui.departure_show_both) time_str = STR_DEPARTURES_TIME_BOTH;
|
if (_settings_client.gui.departure_show_both) time_str = STR_DEPARTURES_TIME_BOTH;
|
||||||
|
|
||||||
/* Time */
|
/* Time */
|
||||||
SetDParam(0, d->scheduled_date);
|
SetDParam(0, d->scheduled_tick);
|
||||||
SetDParam(1, d->scheduled_date - (d->scheduled_waiting_time > 0 ? d->scheduled_waiting_time : d->order->GetWaitTime()));
|
SetDParam(1, d->scheduled_tick - (d->scheduled_waiting_time > 0 ? d->scheduled_waiting_time : d->order->GetWaitTime()));
|
||||||
ltr ? DrawString( text_left, text_left + time_width, y + 1, time_str)
|
ltr ? DrawString( text_left, text_left + time_width, y + 1, time_str)
|
||||||
: DrawString(text_right - time_width, text_right, y + 1, time_str);
|
: DrawString(text_right - time_width, text_right, y + 1, time_str);
|
||||||
|
|
||||||
@@ -928,17 +928,17 @@ void DeparturesWindow<Twaypoint>::DrawDeparturesListItems(const Rect &r) const
|
|||||||
/* The vehicle has been cancelled. */
|
/* The vehicle has been cancelled. */
|
||||||
DrawString(status_left, status_right, y + 1, STR_DEPARTURES_CANCELLED);
|
DrawString(status_left, status_right, y + 1, STR_DEPARTURES_CANCELLED);
|
||||||
} else{
|
} else{
|
||||||
if (d->lateness <= DATE_UNIT_SIZE && d->scheduled_date > now_date) {
|
if (d->lateness <= DATE_UNIT_SIZE && d->scheduled_tick > now_date) {
|
||||||
/* We have no evidence that the vehicle is late, so assume it is on time. */
|
/* We have no evidence that the vehicle is late, so assume it is on time. */
|
||||||
DrawString(status_left, status_right, y + 1, STR_DEPARTURES_ON_TIME);
|
DrawString(status_left, status_right, y + 1, STR_DEPARTURES_ON_TIME);
|
||||||
} else {
|
} else {
|
||||||
if ((d->scheduled_date + d->lateness) < now_date) {
|
if ((d->scheduled_tick + d->lateness) < now_date) {
|
||||||
/* The vehicle was expected to have arrived by now, even if we knew it was going to be late. */
|
/* The vehicle was expected to have arrived by now, even if we knew it was going to be late. */
|
||||||
/* We assume that the train stays at least a day at a station so it won't accidentally be marked as delayed for a fraction of a day. */
|
/* We assume that the train stays at least a day at a station so it won't accidentally be marked as delayed for a fraction of a day. */
|
||||||
DrawString(status_left, status_right, y + 1, STR_DEPARTURES_DELAYED);
|
DrawString(status_left, status_right, y + 1, STR_DEPARTURES_DELAYED);
|
||||||
} else {
|
} else {
|
||||||
/* The vehicle is expected to be late and is not yet due to arrive. */
|
/* The vehicle is expected to be late and is not yet due to arrive. */
|
||||||
SetDParam(0, d->scheduled_date + d->lateness);
|
SetDParam(0, d->scheduled_tick + d->lateness);
|
||||||
DrawString(status_left, status_right, y + 1, STR_DEPARTURES_EXPECTED);
|
DrawString(status_left, status_right, y + 1, STR_DEPARTURES_EXPECTED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -32,11 +32,11 @@ enum DepartureType : uint8_t {
|
|||||||
|
|
||||||
struct CallAt {
|
struct CallAt {
|
||||||
StationID station;
|
StationID station;
|
||||||
DateTicksScaled scheduled_date;
|
StateTicks scheduled_tick;
|
||||||
|
|
||||||
CallAt(const StationID& s) : station(s), scheduled_date(0) { }
|
CallAt(const StationID& s) : station(s), scheduled_tick(0) { }
|
||||||
CallAt(const StationID& s, DateTicksScaled t) : station(s), scheduled_date(t) { }
|
CallAt(const StationID& s, StateTicks t) : station(s), scheduled_tick(t) { }
|
||||||
CallAt(const CallAt& c) : station(c.station), scheduled_date(c.scheduled_date) { }
|
CallAt(const CallAt& c) : station(c.station), scheduled_tick(c.scheduled_tick) { }
|
||||||
|
|
||||||
inline bool operator==(const CallAt& c) const {
|
inline bool operator==(const CallAt& c) const {
|
||||||
return this->station == c.station;
|
return this->station == c.station;
|
||||||
@@ -48,14 +48,14 @@ struct CallAt {
|
|||||||
|
|
||||||
inline bool operator>=(const CallAt& c) const {
|
inline bool operator>=(const CallAt& c) const {
|
||||||
return this->station == c.station &&
|
return this->station == c.station &&
|
||||||
this->scheduled_date != 0 &&
|
this->scheduled_tick != 0 &&
|
||||||
c.scheduled_date != 0 &&
|
c.scheduled_tick != 0 &&
|
||||||
this->scheduled_date >= c.scheduled_date;
|
this->scheduled_tick >= c.scheduled_tick;
|
||||||
}
|
}
|
||||||
|
|
||||||
CallAt& operator=(const CallAt& c) {
|
CallAt& operator=(const CallAt& c) {
|
||||||
this->station = c.station;
|
this->station = c.station;
|
||||||
this->scheduled_date = c.scheduled_date;
|
this->scheduled_tick = c.scheduled_tick;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,7 +71,7 @@ struct RemoveVia {
|
|||||||
|
|
||||||
/** A scheduled departure. */
|
/** A scheduled departure. */
|
||||||
struct Departure {
|
struct Departure {
|
||||||
DateTicksScaled scheduled_date; ///< The date this departure is scheduled to finish on (i.e. when the vehicle leaves the station)
|
StateTicks scheduled_tick; ///< The tick this departure is scheduled to finish on (i.e. when the vehicle leaves the station)
|
||||||
Ticks lateness; ///< How delayed the departure is expected to be
|
Ticks lateness; ///< How delayed the departure is expected to be
|
||||||
StationID via; ///< The station the departure should list as going via
|
StationID via; ///< The station the departure should list as going via
|
||||||
StationID via2; ///< Secondary station the departure should list as going via
|
StationID via2; ///< Secondary station the departure should list as going via
|
||||||
@@ -93,7 +93,7 @@ struct Departure {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
(this->scheduled_date.base() / DATE_UNIT_SIZE) == (d.scheduled_date.base() / DATE_UNIT_SIZE) &&
|
(this->scheduled_tick.base() / DATE_UNIT_SIZE) == (d.scheduled_tick.base() / DATE_UNIT_SIZE) &&
|
||||||
this->vehicle->type == d.vehicle->type &&
|
this->vehicle->type == d.vehicle->type &&
|
||||||
this->via == d.via &&
|
this->via == d.via &&
|
||||||
this->via2 == d.via2 &&
|
this->via2 == d.via2 &&
|
||||||
|
@@ -53,7 +53,7 @@ void FlowMapper::Run(LinkGraphJob &job) const
|
|||||||
/* Scale by time the graph has been running without being compressed. Add 1 to avoid
|
/* Scale by time the graph has been running without being compressed. Add 1 to avoid
|
||||||
* division by 0 if spawn date == last compression date. This matches
|
* division by 0 if spawn date == last compression date. This matches
|
||||||
* LinkGraph::Monthly(). */
|
* LinkGraph::Monthly(). */
|
||||||
uint runtime = (uint)Clamp<DateTicksScaledDelta>(DateTicksToScaledDateTicks(job.StartDateTicks()) - job.LastCompression() + 1, 1, UINT32_MAX).base();
|
uint runtime = (uint)Clamp<StateTicksDelta>(DateTicksToStateTicks(job.StartDateTicks()) - job.LastCompression() + 1, 1, UINT32_MAX).base();
|
||||||
for (auto &it : flows) {
|
for (auto &it : flows) {
|
||||||
it.ScaleToMonthly(runtime);
|
it.ScaleToMonthly(runtime);
|
||||||
}
|
}
|
||||||
|
@@ -54,7 +54,7 @@ void LinkGraph::ShiftDates(DateDelta interval)
|
|||||||
|
|
||||||
void LinkGraph::Compress()
|
void LinkGraph::Compress()
|
||||||
{
|
{
|
||||||
this->last_compression = (_scaled_date_ticks.base() + this->last_compression.base()) / 2;
|
this->last_compression = (_state_ticks.base() + this->last_compression.base()) / 2;
|
||||||
for (NodeID node1 = 0; node1 < this->Size(); ++node1) {
|
for (NodeID node1 = 0; node1 < this->Size(); ++node1) {
|
||||||
this->nodes[node1].supply /= 2;
|
this->nodes[node1].supply /= 2;
|
||||||
}
|
}
|
||||||
@@ -79,8 +79,8 @@ void LinkGraph::Compress()
|
|||||||
*/
|
*/
|
||||||
void LinkGraph::Merge(LinkGraph *other)
|
void LinkGraph::Merge(LinkGraph *other)
|
||||||
{
|
{
|
||||||
uint32_t age = ClampTo<uint32_t>(CeilDivT<int64_t>(_scaled_date_ticks.base() - this->last_compression.base() + 1, DAY_TICKS));
|
uint32_t age = ClampTo<uint32_t>(CeilDivT<int64_t>(_state_ticks.base() - this->last_compression.base() + 1, DAY_TICKS));
|
||||||
uint32_t other_age = ClampTo<uint32_t>(CeilDivT<int64_t>(_scaled_date_ticks.base() - other->last_compression.base() + 1, DAY_TICKS));
|
uint32_t other_age = ClampTo<uint32_t>(CeilDivT<int64_t>(_state_ticks.base() - other->last_compression.base() + 1, DAY_TICKS));
|
||||||
NodeID first = this->Size();
|
NodeID first = this->Size();
|
||||||
this->nodes.reserve(first + other->Size());
|
this->nodes.reserve(first + other->Size());
|
||||||
for (NodeID node1 = 0; node1 < other->Size(); ++node1) {
|
for (NodeID node1 = 0; node1 < other->Size(); ++node1) {
|
||||||
@@ -266,7 +266,7 @@ void LinkGraph::Init(uint size)
|
|||||||
this->nodes.resize(size);
|
this->nodes.resize(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdjustLinkGraphScaledTickBase(DateTicksScaledDelta delta)
|
void AdjustLinkGraphStateTicksBase(StateTicksDelta delta)
|
||||||
{
|
{
|
||||||
for (LinkGraph *lg : LinkGraph::Iterate()) lg->last_compression += delta;
|
for (LinkGraph *lg : LinkGraph::Iterate()) lg->last_compression += delta;
|
||||||
|
|
||||||
@@ -278,11 +278,11 @@ void AdjustLinkGraphScaledTickBase(DateTicksScaledDelta delta)
|
|||||||
|
|
||||||
void LinkGraphFixupLastCompressionAfterLoad()
|
void LinkGraphFixupLastCompressionAfterLoad()
|
||||||
{
|
{
|
||||||
/* last_compression was previously a Date, change it to a DateTicksScaled */
|
/* last_compression was previously a Date, change it to a StateTicks */
|
||||||
for (LinkGraph *lg : LinkGraph::Iterate()) lg->last_compression = DateToScaledDateTicks((Date)lg->last_compression.base());
|
for (LinkGraph *lg : LinkGraph::Iterate()) lg->last_compression = DateToStateTicks((Date)lg->last_compression.base());
|
||||||
|
|
||||||
for (LinkGraphJob *lgj : LinkGraphJob::Iterate()) {
|
for (LinkGraphJob *lgj : LinkGraphJob::Iterate()) {
|
||||||
LinkGraph *lg = &(const_cast<LinkGraph &>(lgj->Graph()));
|
LinkGraph *lg = &(const_cast<LinkGraph &>(lgj->Graph()));
|
||||||
lg->last_compression = DateToScaledDateTicks((Date)lg->last_compression.base());
|
lg->last_compression = DateToStateTicks((Date)lg->last_compression.base());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -290,7 +290,7 @@ public:
|
|||||||
static constexpr DateDelta STALE_LINK_DEPOT_TIMEOUT = 1024;
|
static constexpr DateDelta STALE_LINK_DEPOT_TIMEOUT = 1024;
|
||||||
|
|
||||||
/** Minimum number of ticks between subsequent compressions of a LG. */
|
/** Minimum number of ticks between subsequent compressions of a LG. */
|
||||||
static constexpr DateTicksScaledDelta COMPRESSION_INTERVAL = 256 * DAY_TICKS;
|
static constexpr StateTicksDelta COMPRESSION_INTERVAL = 256 * DAY_TICKS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scale a value from a link graph of age orig_age for usage in one of age
|
* Scale a value from a link graph of age orig_age for usage in one of age
|
||||||
@@ -311,7 +311,7 @@ public:
|
|||||||
* Real constructor.
|
* Real constructor.
|
||||||
* @param cargo Cargo the link graph is about.
|
* @param cargo Cargo the link graph is about.
|
||||||
*/
|
*/
|
||||||
LinkGraph(CargoID cargo) : cargo(cargo), last_compression(_scaled_date_ticks) {}
|
LinkGraph(CargoID cargo) : cargo(cargo), last_compression(_state_ticks) {}
|
||||||
|
|
||||||
void Init(uint size);
|
void Init(uint size);
|
||||||
void ShiftDates(DateDelta interval);
|
void ShiftDates(DateDelta interval);
|
||||||
@@ -350,7 +350,7 @@ public:
|
|||||||
* Get date of last compression.
|
* Get date of last compression.
|
||||||
* @return Date of last compression.
|
* @return Date of last compression.
|
||||||
*/
|
*/
|
||||||
inline DateTicksScaled LastCompression() const { return this->last_compression; }
|
inline StateTicks LastCompression() const { return this->last_compression; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the cargo ID this component's link graph refers to.
|
* Get the cargo ID this component's link graph refers to.
|
||||||
@@ -365,7 +365,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
inline uint Monthly(uint base) const
|
inline uint Monthly(uint base) const
|
||||||
{
|
{
|
||||||
return (uint)((static_cast<uint64_t>(base) * 30 * DAY_TICKS * _settings_game.economy.day_length_factor) / std::max<uint64_t>((_scaled_date_ticks - this->last_compression).base(), DAY_TICKS));
|
return (uint)((static_cast<uint64_t>(base) * 30 * DAY_TICKS * _settings_game.economy.day_length_factor) / std::max<uint64_t>((_state_ticks - this->last_compression).base(), DAY_TICKS));
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeID AddNode(const Station *st);
|
NodeID AddNode(const Station *st);
|
||||||
@@ -392,11 +392,11 @@ protected:
|
|||||||
friend upstream_sl::SlLinkgraphNode;
|
friend upstream_sl::SlLinkgraphNode;
|
||||||
friend upstream_sl::SlLinkgraphEdge;
|
friend upstream_sl::SlLinkgraphEdge;
|
||||||
|
|
||||||
friend void AdjustLinkGraphScaledTickBase(DateTicksScaledDelta delta);
|
friend void AdjustLinkGraphStateTicksBase(StateTicksDelta delta);
|
||||||
friend void LinkGraphFixupLastCompressionAfterLoad();
|
friend void LinkGraphFixupLastCompressionAfterLoad();
|
||||||
|
|
||||||
CargoID cargo; ///< Cargo of this component's link graph.
|
CargoID cargo; ///< Cargo of this component's link graph.
|
||||||
DateTicksScaled last_compression; ///< Last time the capacities and supplies were compressed.
|
StateTicks last_compression; ///< Last time the capacities and supplies were compressed.
|
||||||
NodeVector nodes; ///< Nodes in the component.
|
NodeVector nodes; ///< Nodes in the component.
|
||||||
EdgeMatrix edges; ///< Edges in the component.
|
EdgeMatrix edges; ///< Edges in the component.
|
||||||
|
|
||||||
|
@@ -348,10 +348,10 @@ public:
|
|||||||
inline CargoID Cargo() const { return this->link_graph.Cargo(); }
|
inline CargoID Cargo() const { return this->link_graph.Cargo(); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the date when the underlying link graph was last compressed.
|
* Get the state tick when the underlying link graph was last compressed.
|
||||||
* @return Compression date.
|
* @return Compression date.
|
||||||
*/
|
*/
|
||||||
inline DateTicksScaled LastCompression() const { return this->link_graph.LastCompression(); }
|
inline StateTicks LastCompression() const { return this->link_graph.LastCompression(); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the ID of the underlying link graph.
|
* Get the ID of the underlying link graph.
|
||||||
|
@@ -131,7 +131,7 @@ void InitializeGame(uint size_x, uint size_y, bool reset_date, bool reset_settin
|
|||||||
_tick_counter = 0;
|
_tick_counter = 0;
|
||||||
_tick_skip_counter = 0;
|
_tick_skip_counter = 0;
|
||||||
_scaled_tick_counter = 0;
|
_scaled_tick_counter = 0;
|
||||||
_scaled_date_ticks_offset = 0;
|
_state_ticks_offset = 0;
|
||||||
_cur_tileloop_tile = 1;
|
_cur_tileloop_tile = 1;
|
||||||
_aux_tileloop_tile = 1;
|
_aux_tileloop_tile = 1;
|
||||||
_thd.redsq = INVALID_TILE;
|
_thd.redsq = INVALID_TILE;
|
||||||
|
@@ -11605,7 +11605,7 @@ void LoadNewGRF(uint load_index, uint num_baseset)
|
|||||||
uint64_t tick_counter = _tick_counter;
|
uint64_t tick_counter = _tick_counter;
|
||||||
uint8_t tick_skip_counter = _tick_skip_counter;
|
uint8_t tick_skip_counter = _tick_skip_counter;
|
||||||
uint64_t scaled_tick_counter = _scaled_tick_counter;
|
uint64_t scaled_tick_counter = _scaled_tick_counter;
|
||||||
DateTicksScaled scaled_date_ticks_offset = _scaled_date_ticks_offset;
|
StateTicks state_ticks_offset = _state_ticks_offset;
|
||||||
byte display_opt = _display_opt;
|
byte display_opt = _display_opt;
|
||||||
|
|
||||||
if (_networking) {
|
if (_networking) {
|
||||||
@@ -11615,7 +11615,7 @@ void LoadNewGRF(uint load_index, uint num_baseset)
|
|||||||
_tick_counter = 0;
|
_tick_counter = 0;
|
||||||
_tick_skip_counter = 0;
|
_tick_skip_counter = 0;
|
||||||
_scaled_tick_counter = 0;
|
_scaled_tick_counter = 0;
|
||||||
_scaled_date_ticks_offset = 0;
|
_state_ticks_offset = 0;
|
||||||
_display_opt = 0;
|
_display_opt = 0;
|
||||||
UpdateCachedSnowLine();
|
UpdateCachedSnowLine();
|
||||||
SetScaledTickVariables();
|
SetScaledTickVariables();
|
||||||
@@ -11722,7 +11722,7 @@ void LoadNewGRF(uint load_index, uint num_baseset)
|
|||||||
_tick_counter = tick_counter;
|
_tick_counter = tick_counter;
|
||||||
_tick_skip_counter = tick_skip_counter;
|
_tick_skip_counter = tick_skip_counter;
|
||||||
_scaled_tick_counter = scaled_tick_counter;
|
_scaled_tick_counter = scaled_tick_counter;
|
||||||
_scaled_date_ticks_offset = scaled_date_ticks_offset;
|
_state_ticks_offset = state_ticks_offset;
|
||||||
_display_opt = display_opt;
|
_display_opt = display_opt;
|
||||||
UpdateCachedSnowLine();
|
UpdateCachedSnowLine();
|
||||||
SetScaledTickVariables();
|
SetScaledTickVariables();
|
||||||
|
@@ -1567,7 +1567,7 @@ void CheckCaches(bool force_check, std::function<void(const char *)> log, CheckC
|
|||||||
desync_level = 1;
|
desync_level = 1;
|
||||||
if (HasChickenBit(DCBF_DESYNC_CHECK_NO_GENERAL)) flags &= ~CHECK_CACHE_GENERAL;
|
if (HasChickenBit(DCBF_DESYNC_CHECK_NO_GENERAL)) flags &= ~CHECK_CACHE_GENERAL;
|
||||||
}
|
}
|
||||||
if (unlikely(HasChickenBit(DCBF_DESYNC_CHECK_PERIODIC_SIGNALS)) && desync_level < 2 && _scaled_date_ticks.base() % 256 == 0) {
|
if (unlikely(HasChickenBit(DCBF_DESYNC_CHECK_PERIODIC_SIGNALS)) && desync_level < 2 && _state_ticks.base() % 256 == 0) {
|
||||||
if (!SignalInfraTotalMatches()) desync_level = 2;
|
if (!SignalInfraTotalMatches()) desync_level = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1575,7 +1575,7 @@ void CheckCaches(bool force_check, std::function<void(const char *)> log, CheckC
|
|||||||
* always to aid testing of caches. */
|
* always to aid testing of caches. */
|
||||||
if (desync_level < 1) return;
|
if (desync_level < 1) return;
|
||||||
|
|
||||||
if (desync_level == 1 && _scaled_date_ticks.base() % 500 != 0) return;
|
if (desync_level == 1 && _state_ticks.base() % 500 != 0) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SCOPE_INFO_FMT([flags], "CheckCaches: %X", flags);
|
SCOPE_INFO_FMT([flags], "CheckCaches: %X", flags);
|
||||||
@@ -2114,13 +2114,13 @@ void StateGameLoop()
|
|||||||
if (_game_mode == GM_EDITOR) {
|
if (_game_mode == GM_EDITOR) {
|
||||||
BasePersistentStorageArray::SwitchMode(PSM_ENTER_GAMELOOP);
|
BasePersistentStorageArray::SwitchMode(PSM_ENTER_GAMELOOP);
|
||||||
|
|
||||||
/* _scaled_date_ticks and _scaled_date_ticks_offset must update in lockstep here,
|
/* _state_ticks and _state_ticks_offset must update in lockstep here,
|
||||||
* as _date, _tick_skip_counter, etc are not updated in the scenario editor,
|
* as _date, _tick_skip_counter, etc are not updated in the scenario editor,
|
||||||
* but _scaled_date_ticks should still update in case there are vehicles running,
|
* but _state_ticks should still update in case there are vehicles running,
|
||||||
* to avoid problems with timetables and train speed adaptation
|
* to avoid problems with timetables and train speed adaptation
|
||||||
*/
|
*/
|
||||||
_scaled_date_ticks++;
|
_state_ticks++;
|
||||||
_scaled_date_ticks_offset++;
|
_state_ticks_offset++;
|
||||||
|
|
||||||
RunTileLoop();
|
RunTileLoop();
|
||||||
CallVehicleTicks();
|
CallVehicleTicks();
|
||||||
@@ -2149,11 +2149,11 @@ void StateGameLoop()
|
|||||||
_tick_skip_counter++;
|
_tick_skip_counter++;
|
||||||
_scaled_tick_counter++;
|
_scaled_tick_counter++;
|
||||||
if (_game_mode != GM_MENU && _game_mode != GM_BOOTSTRAP) {
|
if (_game_mode != GM_MENU && _game_mode != GM_BOOTSTRAP) {
|
||||||
_scaled_date_ticks++; // This must update in lock-step with _tick_skip_counter, such that it always matches what SetScaledTickVariables would return.
|
_state_ticks++; // This must update in lock-step with _tick_skip_counter, such that it always matches what SetScaledTickVariables would return.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(_game_mode == GM_MENU || _game_mode == GM_BOOTSTRAP) && !_settings_client.gui.autosave_realtime &&
|
if (!(_game_mode == GM_MENU || _game_mode == GM_BOOTSTRAP) && !_settings_client.gui.autosave_realtime &&
|
||||||
(_scaled_date_ticks.base() % (_settings_client.gui.autosave_interval * (_settings_game.economy.tick_rate == TRM_MODERN ? (60000 / 27) : (60000 / 30)))) == 0) {
|
(_state_ticks.base() % (_settings_client.gui.autosave_interval * (_settings_game.economy.tick_rate == TRM_MODERN ? (60000 / 27) : (60000 / 30)))) == 0) {
|
||||||
_do_autosave = true;
|
_do_autosave = true;
|
||||||
_check_special_modes = true;
|
_check_special_modes = true;
|
||||||
SetWindowDirty(WC_STATUS_BAR, 0);
|
SetWindowDirty(WC_STATUS_BAR, 0);
|
||||||
|
@@ -740,7 +740,7 @@ private:
|
|||||||
friend SaveLoadTable GetDispatchScheduleDescription(); ///< Saving and loading of dispatch schedules
|
friend SaveLoadTable GetDispatchScheduleDescription(); ///< Saving and loading of dispatch schedules
|
||||||
|
|
||||||
std::vector<DispatchSlot> scheduled_dispatch; ///< Scheduled dispatch slots
|
std::vector<DispatchSlot> scheduled_dispatch; ///< Scheduled dispatch slots
|
||||||
DateTicksScaled scheduled_dispatch_start_tick = -1; ///< Scheduled dispatch start tick
|
StateTicks scheduled_dispatch_start_tick = -1; ///< Scheduled dispatch start tick
|
||||||
uint32_t scheduled_dispatch_duration = 0; ///< Scheduled dispatch duration
|
uint32_t scheduled_dispatch_duration = 0; ///< Scheduled dispatch duration
|
||||||
int32_t scheduled_dispatch_last_dispatch = INVALID_SCHEDULED_DISPATCH_OFFSET; ///< Last vehicle dispatched offset
|
int32_t scheduled_dispatch_last_dispatch = INVALID_SCHEDULED_DISPATCH_OFFSET; ///< Last vehicle dispatched offset
|
||||||
int32_t scheduled_dispatch_max_delay = 0; ///< Maximum allowed delay
|
int32_t scheduled_dispatch_max_delay = 0; ///< Maximum allowed delay
|
||||||
@@ -777,7 +777,7 @@ public:
|
|||||||
void RemoveScheduledDispatch(uint32_t offset);
|
void RemoveScheduledDispatch(uint32_t offset);
|
||||||
void AdjustScheduledDispatch(int32_t adjust);
|
void AdjustScheduledDispatch(int32_t adjust);
|
||||||
void ClearScheduledDispatch() { this->scheduled_dispatch.clear(); }
|
void ClearScheduledDispatch() { this->scheduled_dispatch.clear(); }
|
||||||
bool UpdateScheduledDispatchToDate(DateTicksScaled now);
|
bool UpdateScheduledDispatchToDate(StateTicks now);
|
||||||
void UpdateScheduledDispatch(const Vehicle *v);
|
void UpdateScheduledDispatch(const Vehicle *v);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -796,7 +796,7 @@ public:
|
|||||||
* Set the scheduled dispatch start
|
* Set the scheduled dispatch start
|
||||||
* @param start_ticks New start ticks
|
* @param start_ticks New start ticks
|
||||||
*/
|
*/
|
||||||
inline void SetScheduledDispatchStartTick(DateTicksScaled start_tick)
|
inline void SetScheduledDispatchStartTick(StateTicks start_tick)
|
||||||
{
|
{
|
||||||
this->scheduled_dispatch_start_tick = start_tick;
|
this->scheduled_dispatch_start_tick = start_tick;
|
||||||
}
|
}
|
||||||
@@ -805,7 +805,7 @@ public:
|
|||||||
* Get the scheduled dispatch start date, in absolute scaled tick
|
* Get the scheduled dispatch start date, in absolute scaled tick
|
||||||
* @return scheduled dispatch start date
|
* @return scheduled dispatch start date
|
||||||
*/
|
*/
|
||||||
inline DateTicksScaled GetScheduledDispatchStartTick() const { return this->scheduled_dispatch_start_tick; }
|
inline StateTicks GetScheduledDispatchStartTick() const { return this->scheduled_dispatch_start_tick; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the scheduled dispatch setting is valid
|
* Whether the scheduled dispatch setting is valid
|
||||||
|
@@ -3045,7 +3045,7 @@ static uint16_t GetFreeStationPlatforms(StationID st_id)
|
|||||||
return counter;
|
return counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EvaluateDispatchSlotConditionalOrder(const Order *order, const Vehicle *v, DateTicksScaled date_time, bool *predicted)
|
bool EvaluateDispatchSlotConditionalOrder(const Order *order, const Vehicle *v, StateTicks state_ticks, bool *predicted)
|
||||||
{
|
{
|
||||||
uint schedule_index = GB(order->GetXData(), 0, 16);
|
uint schedule_index = GB(order->GetXData(), 0, 16);
|
||||||
if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return false;
|
if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return false;
|
||||||
@@ -3066,7 +3066,7 @@ bool EvaluateDispatchSlotConditionalOrder(const Order *order, const Vehicle *v,
|
|||||||
}
|
}
|
||||||
offset = last % sched.GetScheduledDispatchDuration();
|
offset = last % sched.GetScheduledDispatchDuration();
|
||||||
} else {
|
} else {
|
||||||
DateTicksScaled slot = GetScheduledDispatchTime(sched, _scaled_date_ticks);
|
StateTicks slot = GetScheduledDispatchTime(sched, state_ticks);
|
||||||
offset = (slot - sched.GetScheduledDispatchStartTick()).base() % sched.GetScheduledDispatchDuration();
|
offset = (slot - sched.GetScheduledDispatchStartTick()).base() % sched.GetScheduledDispatchDuration();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3256,7 +3256,7 @@ VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v, Pro
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OCV_DISPATCH_SLOT: {
|
case OCV_DISPATCH_SLOT: {
|
||||||
skip_order = EvaluateDispatchSlotConditionalOrder(order, v, _scaled_date_ticks, nullptr);
|
skip_order = EvaluateDispatchSlotConditionalOrder(order, v, _state_ticks, nullptr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
@@ -3394,7 +3394,7 @@ bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth, bool
|
|||||||
if (v->current_order.GetDepotActionType() & ODATFB_NEAREST_DEPOT) {
|
if (v->current_order.GetDepotActionType() & ODATFB_NEAREST_DEPOT) {
|
||||||
/* If the vehicle can't find its destination, delay its next search.
|
/* If the vehicle can't find its destination, delay its next search.
|
||||||
* In case many vehicles are in this state, use the vehicle index to spread out pathfinder calls. */
|
* In case many vehicles are in this state, use the vehicle index to spread out pathfinder calls. */
|
||||||
if (v->dest_tile == 0 && (_scaled_date_ticks.base() & 0x3F) != (v->index & 0x3F)) break;
|
if (v->dest_tile == 0 && (_state_ticks.base() & 0x3F) != (v->index & 0x3F)) break;
|
||||||
|
|
||||||
/* We need to search for the nearest depot (hangar). */
|
/* We need to search for the nearest depot (hangar). */
|
||||||
ClosestDepot closestDepot = v->FindClosestDepot();
|
ClosestDepot closestDepot = v->FindClosestDepot();
|
||||||
|
@@ -3608,7 +3608,7 @@ bool AfterLoadGame()
|
|||||||
/* If the start date is 0, the vehicle is not waiting to start and can be ignored. */
|
/* If the start date is 0, the vehicle is not waiting to start and can be ignored. */
|
||||||
if (v->timetable_start == 0) continue;
|
if (v->timetable_start == 0) continue;
|
||||||
|
|
||||||
v->timetable_start += _scaled_date_ticks.base() - _tick_counter;
|
v->timetable_start += _state_ticks.base() - _tick_counter;
|
||||||
}
|
}
|
||||||
} else if (!SlXvIsFeaturePresent(XSLFI_TIMETABLES_START_TICKS, 3)) {
|
} else if (!SlXvIsFeaturePresent(XSLFI_TIMETABLES_START_TICKS, 3)) {
|
||||||
extern btree::btree_map<VehicleID, uint16_t> _old_timetable_start_subticks_map;
|
extern btree::btree_map<VehicleID, uint16_t> _old_timetable_start_subticks_map;
|
||||||
@@ -3620,7 +3620,7 @@ bool AfterLoadGame()
|
|||||||
v->timetable_start.edit_base() *= DAY_TICKS;
|
v->timetable_start.edit_base() *= DAY_TICKS;
|
||||||
}
|
}
|
||||||
|
|
||||||
v->timetable_start = DateTicksToScaledDateTicks(v->timetable_start.base());
|
v->timetable_start = DateTicksToStateTicks(v->timetable_start.base());
|
||||||
|
|
||||||
if (SlXvIsFeaturePresent(XSLFI_TIMETABLES_START_TICKS, 2, 2)) {
|
if (SlXvIsFeaturePresent(XSLFI_TIMETABLES_START_TICKS, 2, 2)) {
|
||||||
v->timetable_start += _old_timetable_start_subticks_map[v->index];
|
v->timetable_start += _old_timetable_start_subticks_map[v->index];
|
||||||
@@ -3907,10 +3907,10 @@ bool AfterLoadGame()
|
|||||||
/* Use current order time to approximate last loading time */
|
/* Use current order time to approximate last loading time */
|
||||||
if (IsSavegameVersionBefore(SLV_LAST_LOADING_TICK) && SlXvIsFeatureMissing(XSLFI_LAST_LOADING_TICK)) {
|
if (IsSavegameVersionBefore(SLV_LAST_LOADING_TICK) && SlXvIsFeatureMissing(XSLFI_LAST_LOADING_TICK)) {
|
||||||
for (Vehicle *v : Vehicle::Iterate()) {
|
for (Vehicle *v : Vehicle::Iterate()) {
|
||||||
v->last_loading_tick = _scaled_date_ticks - v->current_order_time;
|
v->last_loading_tick = _state_ticks - v->current_order_time;
|
||||||
}
|
}
|
||||||
} else if (SlXvIsFeatureMissing(XSLFI_LAST_LOADING_TICK, 3)) {
|
} else if (SlXvIsFeatureMissing(XSLFI_LAST_LOADING_TICK, 3)) {
|
||||||
const DateTicksScaledDelta delta = _scaled_date_ticks.base() - (int64_t)_scaled_tick_counter;
|
const StateTicksDelta delta = _state_ticks.base() - (int64_t)_scaled_tick_counter;
|
||||||
for (Vehicle *v : Vehicle::Iterate()) {
|
for (Vehicle *v : Vehicle::Iterate()) {
|
||||||
if (v->last_loading_tick != 0) {
|
if (v->last_loading_tick != 0) {
|
||||||
if (SlXvIsFeaturePresent(XSLFI_LAST_LOADING_TICK, 1, 1)) v->last_loading_tick = v->last_loading_tick.base() * _settings_game.economy.day_length_factor;
|
if (SlXvIsFeaturePresent(XSLFI_LAST_LOADING_TICK, 1, 1)) v->last_loading_tick = v->last_loading_tick.base() * _settings_game.economy.day_length_factor;
|
||||||
@@ -4228,7 +4228,7 @@ bool AfterLoadGame()
|
|||||||
|
|
||||||
for (OrderList *order_list : OrderList::Iterate()) {
|
for (OrderList *order_list : OrderList::Iterate()) {
|
||||||
for (DispatchSchedule &ds : order_list->GetScheduledDispatchScheduleSet()) {
|
for (DispatchSchedule &ds : order_list->GetScheduledDispatchScheduleSet()) {
|
||||||
DateTicksScaled start_tick = DateToScaledDateTicks(ds.GetScheduledDispatchStartTick().base()) + _old_scheduled_dispatch_start_full_date_fract_map[&ds];
|
StateTicks start_tick = DateToStateTicks(ds.GetScheduledDispatchStartTick().base()) + _old_scheduled_dispatch_start_full_date_fract_map[&ds];
|
||||||
ds.SetScheduledDispatchStartTick(start_tick);
|
ds.SetScheduledDispatchStartTick(start_tick);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -202,7 +202,7 @@ CommandCost CmdScheduledDispatchSetStartDate(TileIndex tile, DoCommandFlag flags
|
|||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(schedule_index);
|
DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(schedule_index);
|
||||||
ds.SetScheduledDispatchStartTick((DateTicksScaled)p3);
|
ds.SetScheduledDispatchStartTick((StateTicks)p3);
|
||||||
ds.UpdateScheduledDispatch(nullptr);
|
ds.UpdateScheduledDispatch(nullptr);
|
||||||
SetTimetableWindowsDirty(v, STWDF_SCHEDULED_DISPATCH);
|
SetTimetableWindowsDirty(v, STWDF_SCHEDULED_DISPATCH);
|
||||||
}
|
}
|
||||||
@@ -375,7 +375,7 @@ CommandCost CmdScheduledDispatchAddNewSchedule(TileIndex tile, DoCommandFlag fla
|
|||||||
v->orders->GetScheduledDispatchScheduleSet().emplace_back();
|
v->orders->GetScheduledDispatchScheduleSet().emplace_back();
|
||||||
DispatchSchedule &ds = v->orders->GetScheduledDispatchScheduleSet().back();
|
DispatchSchedule &ds = v->orders->GetScheduledDispatchScheduleSet().back();
|
||||||
ds.SetScheduledDispatchDuration(p2);
|
ds.SetScheduledDispatchDuration(p2);
|
||||||
ds.SetScheduledDispatchStartTick((DateTicksScaled)p3);
|
ds.SetScheduledDispatchStartTick((StateTicks)p3);
|
||||||
ds.UpdateScheduledDispatch(nullptr);
|
ds.UpdateScheduledDispatch(nullptr);
|
||||||
SetTimetableWindowsDirty(v, STWDF_SCHEDULED_DISPATCH);
|
SetTimetableWindowsDirty(v, STWDF_SCHEDULED_DISPATCH);
|
||||||
}
|
}
|
||||||
@@ -752,11 +752,11 @@ void DispatchSchedule::AdjustScheduledDispatch(int32_t adjust)
|
|||||||
std::sort(this->scheduled_dispatch.begin(), this->scheduled_dispatch.end());
|
std::sort(this->scheduled_dispatch.begin(), this->scheduled_dispatch.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DispatchSchedule::UpdateScheduledDispatchToDate(DateTicksScaled now)
|
bool DispatchSchedule::UpdateScheduledDispatchToDate(StateTicks now)
|
||||||
{
|
{
|
||||||
bool update_windows = false;
|
bool update_windows = false;
|
||||||
if (this->GetScheduledDispatchStartTick() == 0) {
|
if (this->GetScheduledDispatchStartTick() == 0) {
|
||||||
DateTicksScaled start = now - (now.base() % this->GetScheduledDispatchDuration());
|
StateTicks start = now - (now.base() % this->GetScheduledDispatchDuration());
|
||||||
this->SetScheduledDispatchStartTick(start);
|
this->SetScheduledDispatchStartTick(start);
|
||||||
int64_t last_dispatch = -(start.base());
|
int64_t last_dispatch = -(start.base());
|
||||||
if (last_dispatch < INT_MIN && _settings_game.game_time.time_in_minutes) {
|
if (last_dispatch < INT_MIN && _settings_game.game_time.time_in_minutes) {
|
||||||
@@ -795,7 +795,7 @@ bool DispatchSchedule::UpdateScheduledDispatchToDate(DateTicksScaled now)
|
|||||||
*/
|
*/
|
||||||
void DispatchSchedule::UpdateScheduledDispatch(const Vehicle *v)
|
void DispatchSchedule::UpdateScheduledDispatch(const Vehicle *v)
|
||||||
{
|
{
|
||||||
if (this->UpdateScheduledDispatchToDate(_scaled_date_ticks) && v != nullptr) {
|
if (this->UpdateScheduledDispatchToDate(_state_ticks) && v != nullptr) {
|
||||||
SetTimetableWindowsDirty(v, STWDF_SCHEDULED_DISPATCH);
|
SetTimetableWindowsDirty(v, STWDF_SCHEDULED_DISPATCH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -68,7 +68,7 @@ enum SchdispatchWidgets {
|
|||||||
* @param p1 The p1 parameter to send to CmdScheduledDispatchSetStartDate
|
* @param p1 The p1 parameter to send to CmdScheduledDispatchSetStartDate
|
||||||
* @param date the actually chosen date
|
* @param date the actually chosen date
|
||||||
*/
|
*/
|
||||||
static void SetScheduleStartDateIntl(uint32_t p1, DateTicksScaled date)
|
static void SetScheduleStartDateIntl(uint32_t p1, StateTicks date)
|
||||||
{
|
{
|
||||||
DoCommandPEx(0, p1, 0, (uint64_t)date.base(), CMD_SCHEDULED_DISPATCH_SET_START_DATE | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE), nullptr, nullptr, 0);
|
DoCommandPEx(0, p1, 0, (uint64_t)date.base(), CMD_SCHEDULED_DISPATCH_SET_START_DATE | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE), nullptr, nullptr, 0);
|
||||||
}
|
}
|
||||||
@@ -78,7 +78,7 @@ static void SetScheduleStartDateIntl(uint32_t p1, DateTicksScaled date)
|
|||||||
* @param window the window related to the setting of the date
|
* @param window the window related to the setting of the date
|
||||||
* @param date the actually chosen date
|
* @param date the actually chosen date
|
||||||
*/
|
*/
|
||||||
static void SetScheduleStartDateCallback(const Window *w, DateTicksScaled date)
|
static void SetScheduleStartDateCallback(const Window *w, StateTicks date)
|
||||||
{
|
{
|
||||||
SetScheduleStartDateIntl(w->window_number, date);
|
SetScheduleStartDateIntl(w->window_number, date);
|
||||||
}
|
}
|
||||||
@@ -88,7 +88,7 @@ static void SetScheduleStartDateCallback(const Window *w, DateTicksScaled date)
|
|||||||
* @param p1 The p1 parameter to send to CmdScheduledDispatchAdd
|
* @param p1 The p1 parameter to send to CmdScheduledDispatchAdd
|
||||||
* @param date the actually chosen date
|
* @param date the actually chosen date
|
||||||
*/
|
*/
|
||||||
static void ScheduleAddIntl(uint32_t p1, DateTicksScaled date, uint extra_slots, uint offset, bool wrap_mode = false)
|
static void ScheduleAddIntl(uint32_t p1, StateTicks date, uint extra_slots, uint offset, bool wrap_mode = false)
|
||||||
{
|
{
|
||||||
VehicleID veh = GB(p1, 0, 20);
|
VehicleID veh = GB(p1, 0, 20);
|
||||||
uint schedule_index = GB(p1, 20, 12);
|
uint schedule_index = GB(p1, 20, 12);
|
||||||
@@ -98,13 +98,13 @@ static void ScheduleAddIntl(uint32_t p1, DateTicksScaled date, uint extra_slots,
|
|||||||
const DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(schedule_index);
|
const DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(schedule_index);
|
||||||
|
|
||||||
/* Make sure the time is the closest future to the timetable start */
|
/* Make sure the time is the closest future to the timetable start */
|
||||||
DateTicksScaled start_tick = ds.GetScheduledDispatchStartTick();
|
StateTicks start_tick = ds.GetScheduledDispatchStartTick();
|
||||||
uint32_t duration = ds.GetScheduledDispatchDuration();
|
uint32_t duration = ds.GetScheduledDispatchDuration();
|
||||||
while (date > start_tick) date -= duration;
|
while (date > start_tick) date -= duration;
|
||||||
while (date < start_tick) date += duration;
|
while (date < start_tick) date += duration;
|
||||||
|
|
||||||
if (extra_slots > 0 && offset > 0 && !wrap_mode) {
|
if (extra_slots > 0 && offset > 0 && !wrap_mode) {
|
||||||
DateTicksScaled end_tick = start_tick + duration;
|
StateTicks end_tick = start_tick + duration;
|
||||||
int64_t max_extra_slots = (end_tick - 1 - date).base() / offset;
|
int64_t max_extra_slots = (end_tick - 1 - date).base() / offset;
|
||||||
if (max_extra_slots < extra_slots) extra_slots = static_cast<uint>(std::max<int64_t>(0, max_extra_slots));
|
if (max_extra_slots < extra_slots) extra_slots = static_cast<uint>(std::max<int64_t>(0, max_extra_slots));
|
||||||
extra_slots = std::min<uint>(extra_slots, UINT16_MAX);
|
extra_slots = std::min<uint>(extra_slots, UINT16_MAX);
|
||||||
@@ -118,7 +118,7 @@ static void ScheduleAddIntl(uint32_t p1, DateTicksScaled date, uint extra_slots,
|
|||||||
* @param window the window related to the setting of the date
|
* @param window the window related to the setting of the date
|
||||||
* @param date the actually chosen date
|
* @param date the actually chosen date
|
||||||
*/
|
*/
|
||||||
static void ScheduleAddCallback(const Window *w, DateTicksScaled date)
|
static void ScheduleAddCallback(const Window *w, StateTicks date)
|
||||||
{
|
{
|
||||||
ScheduleAddIntl(w->window_number, date, 0, 0);
|
ScheduleAddIntl(w->window_number, date, 0, 0);
|
||||||
}
|
}
|
||||||
@@ -160,7 +160,7 @@ static int CalculateMaxRequiredVehicle(Ticks timetable_duration, uint32_t schedu
|
|||||||
|
|
||||||
static void AddNewScheduledDispatchSchedule(VehicleID vindex)
|
static void AddNewScheduledDispatchSchedule(VehicleID vindex)
|
||||||
{
|
{
|
||||||
DateTicksScaled start_tick;
|
StateTicks start_tick;
|
||||||
uint32_t duration;
|
uint32_t duration;
|
||||||
|
|
||||||
const Company *c = Company::GetIfValid(_local_company);
|
const Company *c = Company::GetIfValid(_local_company);
|
||||||
@@ -179,7 +179,7 @@ static void AddNewScheduledDispatchSchedule(VehicleID vindex)
|
|||||||
duration = 24 * 60 * _settings_time.ticks_per_minute;
|
duration = 24 * 60 * _settings_time.ticks_per_minute;
|
||||||
} else {
|
} else {
|
||||||
/* Set Jan 1st and 365 day */
|
/* Set Jan 1st and 365 day */
|
||||||
start_tick = DateToScaledDateTicks(DateAtStartOfYear(_cur_year));
|
start_tick = DateToStateTicks(DateAtStartOfYear(_cur_year));
|
||||||
duration = 365 * DAY_TICKS;
|
duration = 365 * DAY_TICKS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,7 +193,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
uint num_columns; ///< Number of columns.
|
uint num_columns; ///< Number of columns.
|
||||||
|
|
||||||
uint item_count = 0; ///< Number of scheduled item
|
uint item_count = 0; ///< Number of scheduled item
|
||||||
DateTicksScaled next_departure_update = INT64_MAX; ///< Time after which the last departure value should be re-drawn
|
StateTicks next_departure_update = INT64_MAX; ///< Time after which the last departure value should be re-drawn
|
||||||
uint warning_count = 0;
|
uint warning_count = 0;
|
||||||
uint extra_line_count = 0;
|
uint extra_line_count = 0;
|
||||||
|
|
||||||
@@ -467,7 +467,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
GuiShowTooltips(this, STR_SCHDISPATCH_REMOVE_SLOT, close_cond);
|
GuiShowTooltips(this, STR_SCHDISPATCH_REMOVE_SLOT, close_cond);
|
||||||
} else {
|
} else {
|
||||||
const DispatchSchedule &ds = this->GetSelectedSchedule();
|
const DispatchSchedule &ds = this->GetSelectedSchedule();
|
||||||
const DateTicksScaled start_tick = ds.GetScheduledDispatchStartTick();
|
const StateTicks start_tick = ds.GetScheduledDispatchStartTick();
|
||||||
|
|
||||||
SetDParam(0, start_tick + slot->offset);
|
SetDParam(0, start_tick + slot->offset);
|
||||||
_temp_special_strings[0] = GetString(STR_SCHDISPATCH_SLOT_TOOLTIP);
|
_temp_special_strings[0] = GetString(STR_SCHDISPATCH_SLOT_TOOLTIP);
|
||||||
@@ -493,7 +493,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
}
|
}
|
||||||
have_last = true;
|
have_last = true;
|
||||||
}
|
}
|
||||||
DateTicksScaled next_slot = GetScheduledDispatchTime(ds, _scaled_date_ticks);
|
StateTicks next_slot = GetScheduledDispatchTime(ds, _state_ticks);
|
||||||
if ((next_slot - ds.GetScheduledDispatchStartTick()).AsTicks() % ds.GetScheduledDispatchDuration() == slot->offset) {
|
if ((next_slot - ds.GetScheduledDispatchStartTick()).AsTicks() % ds.GetScheduledDispatchDuration() == slot->offset) {
|
||||||
if (!have_last) _temp_special_strings[0] += '\n';
|
if (!have_last) _temp_special_strings[0] += '\n';
|
||||||
_temp_special_strings[0] += GetString(STR_SCHDISPATCH_SLOT_TOOLTIP_NEXT);
|
_temp_special_strings[0] += GetString(STR_SCHDISPATCH_SLOT_TOOLTIP_NEXT);
|
||||||
@@ -540,7 +540,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
* @param right Right side of the box to draw in.
|
* @param right Right side of the box to draw in.
|
||||||
* @param y Top of the box to draw in.
|
* @param y Top of the box to draw in.
|
||||||
*/
|
*/
|
||||||
void DrawScheduledTime(const DateTicksScaled time, int left, int right, int y, TextColour colour, bool last, bool next, bool flagged) const
|
void DrawScheduledTime(const StateTicks time, int left, int right, int y, TextColour colour, bool last, bool next, bool flagged) const
|
||||||
{
|
{
|
||||||
bool rtl = _current_text_dir == TD_RTL;
|
bool rtl = _current_text_dir == TD_RTL;
|
||||||
|
|
||||||
@@ -571,7 +571,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
|
|
||||||
virtual void OnGameTick() override
|
virtual void OnGameTick() override
|
||||||
{
|
{
|
||||||
if (_scaled_date_ticks >= this->next_departure_update) {
|
if (_state_ticks >= this->next_departure_update) {
|
||||||
this->next_departure_update = INT64_MAX;
|
this->next_departure_update = INT64_MAX;
|
||||||
SetWidgetDirty(WID_SCHDISPATCH_SUMMARY_PANEL);
|
SetWidgetDirty(WID_SCHDISPATCH_SUMMARY_PANEL);
|
||||||
}
|
}
|
||||||
@@ -600,10 +600,10 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
const uint maxval = std::min<uint>(this->item_count, num + (rows_in_display * this->num_columns));
|
const uint maxval = std::min<uint>(this->item_count, num + (rows_in_display * this->num_columns));
|
||||||
|
|
||||||
auto current_schedule = ds.GetScheduledDispatch().begin() + num;
|
auto current_schedule = ds.GetScheduledDispatch().begin() + num;
|
||||||
const DateTicksScaled start_tick = ds.GetScheduledDispatchStartTick();
|
const StateTicks start_tick = ds.GetScheduledDispatchStartTick();
|
||||||
const DateTicksScaled end_tick = ds.GetScheduledDispatchStartTick() + ds.GetScheduledDispatchDuration();
|
const StateTicks end_tick = ds.GetScheduledDispatchStartTick() + ds.GetScheduledDispatchDuration();
|
||||||
|
|
||||||
DateTicksScaled slot = GetScheduledDispatchTime(ds, _scaled_date_ticks);
|
StateTicks slot = GetScheduledDispatchTime(ds, _state_ticks);
|
||||||
int32_t next_offset = (slot - ds.GetScheduledDispatchStartTick()).AsTicks() % ds.GetScheduledDispatchDuration();
|
int32_t next_offset = (slot - ds.GetScheduledDispatchStartTick()).AsTicks() % ds.GetScheduledDispatchDuration();
|
||||||
|
|
||||||
int32_t last_dispatch = ds.GetScheduledDispatchLastDispatch() % ds.GetScheduledDispatchDuration();
|
int32_t last_dispatch = ds.GetScheduledDispatchLastDispatch() % ds.GetScheduledDispatchDuration();
|
||||||
@@ -613,7 +613,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
/* Draw all departure time in the current row */
|
/* Draw all departure time in the current row */
|
||||||
if (current_schedule != ds.GetScheduledDispatch().end()) {
|
if (current_schedule != ds.GetScheduledDispatch().end()) {
|
||||||
int x = r.left + (rtl ? (this->num_columns - i - 1) : i) * this->resize.step_width;
|
int x = r.left + (rtl ? (this->num_columns - i - 1) : i) * this->resize.step_width;
|
||||||
DateTicksScaled draw_time = start_tick + current_schedule->offset;
|
StateTicks draw_time = start_tick + current_schedule->offset;
|
||||||
bool last = last_dispatch == (int32_t)current_schedule->offset;
|
bool last = last_dispatch == (int32_t)current_schedule->offset;
|
||||||
bool next = next_offset == (int32_t)current_schedule->offset;
|
bool next = next_offset == (int32_t)current_schedule->offset;
|
||||||
TextColour colour;
|
TextColour colour;
|
||||||
@@ -640,7 +640,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
Rect ir = r.Shrink(WidgetDimensions::scaled.framerect);
|
Rect ir = r.Shrink(WidgetDimensions::scaled.framerect);
|
||||||
int y = ir.top;
|
int y = ir.top;
|
||||||
|
|
||||||
auto set_next_departure_update = [&](DateTicksScaled time) {
|
auto set_next_departure_update = [&](StateTicks time) {
|
||||||
if (time < this->next_departure_update) const_cast<SchdispatchWindow*>(this)->next_departure_update = time;
|
if (time < this->next_departure_update) const_cast<SchdispatchWindow*>(this)->next_departure_update = time;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -670,8 +670,8 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
warnings++;
|
warnings++;
|
||||||
};
|
};
|
||||||
|
|
||||||
auto departure_time_warnings = [&](DateTicksScaled time) {
|
auto departure_time_warnings = [&](StateTicks time) {
|
||||||
if (_settings_time.time_in_minutes && time > (_scaled_date_ticks + (1350 * (uint)_settings_time.ticks_per_minute))) {
|
if (_settings_time.time_in_minutes && time > (_state_ticks + (1350 * (uint)_settings_time.ticks_per_minute))) {
|
||||||
/* If the departure slot is more than 23 hours ahead of now, show a warning */
|
/* If the departure slot is more than 23 hours ahead of now, show a warning */
|
||||||
const TickMinutes now = _settings_time.NowInTickMinutes();
|
const TickMinutes now = _settings_time.NowInTickMinutes();
|
||||||
const TickMinutes target = _settings_time.ToTickMinutes(time);
|
const TickMinutes target = _settings_time.ToTickMinutes(time);
|
||||||
@@ -741,9 +741,9 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
y += WidgetDimensions::scaled.vsep_wide;
|
y += WidgetDimensions::scaled.vsep_wide;
|
||||||
|
|
||||||
if (ds.GetScheduledDispatchLastDispatch() != INVALID_SCHEDULED_DISPATCH_OFFSET) {
|
if (ds.GetScheduledDispatchLastDispatch() != INVALID_SCHEDULED_DISPATCH_OFFSET) {
|
||||||
const DateTicksScaled last_departure = ds.GetScheduledDispatchStartTick() + ds.GetScheduledDispatchLastDispatch();
|
const StateTicks last_departure = ds.GetScheduledDispatchStartTick() + ds.GetScheduledDispatchLastDispatch();
|
||||||
StringID str;
|
StringID str;
|
||||||
if (_scaled_date_ticks < last_departure) {
|
if (_state_ticks < last_departure) {
|
||||||
str = STR_SCHDISPATCH_SUMMARY_LAST_DEPARTURE_FUTURE;
|
str = STR_SCHDISPATCH_SUMMARY_LAST_DEPARTURE_FUTURE;
|
||||||
set_next_departure_update(last_departure);
|
set_next_departure_update(last_departure);
|
||||||
} else {
|
} else {
|
||||||
@@ -755,7 +755,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
|
|
||||||
departure_time_warnings(last_departure);
|
departure_time_warnings(last_departure);
|
||||||
|
|
||||||
if (_settings_time.time_in_minutes && last_departure < (_scaled_date_ticks + (1350 * (uint)_settings_time.ticks_per_minute))) {
|
if (_settings_time.time_in_minutes && last_departure < (_state_ticks + (1350 * (uint)_settings_time.ticks_per_minute))) {
|
||||||
/* If the departure slot is more than 23 hours behind now, show a warning */
|
/* If the departure slot is more than 23 hours behind now, show a warning */
|
||||||
const TickMinutes now = _settings_time.NowInTickMinutes();
|
const TickMinutes now = _settings_time.NowInTickMinutes();
|
||||||
const TickMinutes target = _settings_time.ToTickMinutes(last_departure);
|
const TickMinutes target = _settings_time.ToTickMinutes(last_departure);
|
||||||
@@ -775,7 +775,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
y += GetCharacterHeight(FS_NORMAL);
|
y += GetCharacterHeight(FS_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
const DateTicksScaled next_departure = GetScheduledDispatchTime(ds, _scaled_date_ticks);
|
const StateTicks next_departure = GetScheduledDispatchTime(ds, _state_ticks);
|
||||||
set_next_departure_update(next_departure + ds.GetScheduledDispatchDelay());
|
set_next_departure_update(next_departure + ds.GetScheduledDispatchDelay());
|
||||||
SetDParam(0, next_departure);
|
SetDParam(0, next_departure);
|
||||||
DrawString(ir.left, ir.right, y, STR_SCHDISPATCH_SUMMARY_NEXT_AVAILABLE_DEPARTURE);
|
DrawString(ir.left, ir.right, y, STR_SCHDISPATCH_SUMMARY_NEXT_AVAILABLE_DEPARTURE);
|
||||||
@@ -940,7 +940,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
} else if (_settings_time.time_in_minutes && _settings_client.gui.timetable_start_text_entry) {
|
} else if (_settings_time.time_in_minutes && _settings_client.gui.timetable_start_text_entry) {
|
||||||
ShowQueryString(STR_EMPTY, STR_SCHDISPATCH_ADD_CAPTION, 31, this, CS_NUMERAL, QSF_NONE);
|
ShowQueryString(STR_EMPTY, STR_SCHDISPATCH_ADD_CAPTION, 31, this, CS_NUMERAL, QSF_NONE);
|
||||||
} else {
|
} else {
|
||||||
ShowSetDateWindow(this, v->index | (this->schedule_index << 20), _scaled_date_ticks, _cur_year, _cur_year + 15, ScheduleAddCallback, STR_SCHDISPATCH_ADD, STR_SCHDISPATCH_ADD_TOOLTIP);
|
ShowSetDateWindow(this, v->index | (this->schedule_index << 20), _state_ticks, _cur_year, _cur_year + 15, ScheduleAddCallback, STR_SCHDISPATCH_ADD, STR_SCHDISPATCH_ADD_TOOLTIP);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -959,7 +959,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
SetDParam(0, _settings_time.NowInTickMinutes().ClockHHMM());
|
SetDParam(0, _settings_time.NowInTickMinutes().ClockHHMM());
|
||||||
ShowQueryString(STR_JUST_INT, STR_SCHDISPATCH_START_CAPTION_MINUTE, 31, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED);
|
ShowQueryString(STR_JUST_INT, STR_SCHDISPATCH_START_CAPTION_MINUTE, 31, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED);
|
||||||
} else {
|
} else {
|
||||||
ShowSetDateWindow(this, v->index | (this->schedule_index << 20), _scaled_date_ticks, _cur_year, _cur_year + 15, SetScheduleStartDateCallback, STR_SCHDISPATCH_SET_START, STR_SCHDISPATCH_START_TOOLTIP);
|
ShowSetDateWindow(this, v->index | (this->schedule_index << 20), _state_ticks, _cur_year, _cur_year + 15, SetScheduleStartDateCallback, STR_SCHDISPATCH_SET_START, STR_SCHDISPATCH_START_TOOLTIP);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1169,7 +1169,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
if (val >= 0 && end != nullptr && *end == 0) {
|
if (val >= 0 && end != nullptr && *end == 0) {
|
||||||
uint minutes = (val % 100) % 60;
|
uint minutes = (val % 100) % 60;
|
||||||
uint hours = (val / 100) % 24;
|
uint hours = (val / 100) % 24;
|
||||||
DateTicksScaled slot = _settings_time.FromTickMinutes(_settings_time.NowInTickMinutes().ToSameDayClockTime(hours, minutes));
|
StateTicks slot = _settings_time.FromTickMinutes(_settings_time.NowInTickMinutes().ToSameDayClockTime(hours, minutes));
|
||||||
ScheduleAddIntl(v->index | (this->schedule_index << 20), slot, 0, 0);
|
ScheduleAddIntl(v->index | (this->schedule_index << 20), slot, 0, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1185,7 +1185,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
if (val >= 0 && end != nullptr && *end == 0) {
|
if (val >= 0 && end != nullptr && *end == 0) {
|
||||||
uint minutes = (val % 100) % 60;
|
uint minutes = (val % 100) % 60;
|
||||||
uint hours = (val / 100) % 24;
|
uint hours = (val / 100) % 24;
|
||||||
DateTicksScaled start = _settings_time.FromTickMinutes(_settings_time.NowInTickMinutes().ToSameDayClockTime(hours, minutes));
|
StateTicks start = _settings_time.FromTickMinutes(_settings_time.NowInTickMinutes().ToSameDayClockTime(hours, minutes));
|
||||||
SetScheduleStartDateIntl(v->index | (this->schedule_index << 20), start);
|
SetScheduleStartDateIntl(v->index | (this->schedule_index << 20), start);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1272,7 +1272,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
|
|||||||
}
|
}
|
||||||
if (end < start || step == 0 || !this->IsScheduleSelected()) return;
|
if (end < start || step == 0 || !this->IsScheduleSelected()) return;
|
||||||
|
|
||||||
DateTicksScaled slot = _settings_time.FromTickMinutes(_settings_time.NowInTickMinutes().ToSameDayClockTime(0, start));
|
StateTicks slot = _settings_time.FromTickMinutes(_settings_time.NowInTickMinutes().ToSameDayClockTime(0, start));
|
||||||
ScheduleAddIntl(this->vehicle->index | (this->schedule_index << 20), slot, (end - start) / step, step * _settings_time.ticks_per_minute, wrap_mode);
|
ScheduleAddIntl(this->vehicle->index | (this->schedule_index << 20), slot, (end - start) / step, step * _settings_time.ticks_per_minute, wrap_mode);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@@ -85,17 +85,17 @@
|
|||||||
|
|
||||||
/* static */ SQInteger ScriptDate::GetCurrentScaledDateTicks()
|
/* static */ SQInteger ScriptDate::GetCurrentScaledDateTicks()
|
||||||
{
|
{
|
||||||
return _scaled_date_ticks.base();
|
return _state_ticks.base();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */ SQInteger ScriptDate::GetHour(SQInteger ticks)
|
/* static */ SQInteger ScriptDate::GetHour(SQInteger ticks)
|
||||||
{
|
{
|
||||||
TickMinutes minutes = _settings_game.game_time.ToTickMinutes(DateTicksScaled(ticks));
|
TickMinutes minutes = _settings_game.game_time.ToTickMinutes(StateTicks(ticks));
|
||||||
return minutes.ClockHour();
|
return minutes.ClockHour();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */ SQInteger ScriptDate::GetMinute(SQInteger ticks)
|
/* static */ SQInteger ScriptDate::GetMinute(SQInteger ticks)
|
||||||
{
|
{
|
||||||
TickMinutes minutes = _settings_game.game_time.ToTickMinutes(DateTicksScaled(ticks));
|
TickMinutes minutes = _settings_game.game_time.ToTickMinutes(StateTicks(ticks));
|
||||||
return minutes.ClockMinute();
|
return minutes.ClockMinute();
|
||||||
}
|
}
|
||||||
|
@@ -1850,8 +1850,8 @@ static bool DayLengthPreChange(int32_t &new_value)
|
|||||||
|
|
||||||
static void DayLengthChanged(int32_t new_value)
|
static void DayLengthChanged(int32_t new_value)
|
||||||
{
|
{
|
||||||
extern void RebaseScaledDateTicksBase();
|
extern void RebaseStateTicksBase();
|
||||||
RebaseScaledDateTicksBase();
|
RebaseStateTicksBase();
|
||||||
|
|
||||||
SetupTileLoopCounts();
|
SetupTileLoopCounts();
|
||||||
UpdateCargoScalers();
|
UpdateCargoScalers();
|
||||||
|
@@ -136,18 +136,18 @@ struct TimeSettings {
|
|||||||
uint16_t ticks_per_minute; ///< how many ticks per minute
|
uint16_t ticks_per_minute; ///< how many ticks per minute
|
||||||
uint16_t clock_offset; ///< clock offset in minutes
|
uint16_t clock_offset; ///< clock offset in minutes
|
||||||
|
|
||||||
TickMinutes ToTickMinutes(DateTicksScaled ticks) const
|
TickMinutes ToTickMinutes(StateTicks ticks) const
|
||||||
{
|
{
|
||||||
return (ticks.base() / this->ticks_per_minute) + this->clock_offset;
|
return (ticks.base() / this->ticks_per_minute) + this->clock_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
TickMinutes NowInTickMinutes() const
|
TickMinutes NowInTickMinutes() const
|
||||||
{
|
{
|
||||||
extern DateTicksScaled _scaled_date_ticks;
|
extern StateTicks _state_ticks;
|
||||||
return this->ToTickMinutes(_scaled_date_ticks);
|
return this->ToTickMinutes(_state_ticks);
|
||||||
}
|
}
|
||||||
|
|
||||||
DateTicksScaled FromTickMinutes(TickMinutes minutes) const
|
StateTicks FromTickMinutes(TickMinutes minutes) const
|
||||||
{
|
{
|
||||||
return (minutes.base() - this->clock_offset) * this->ticks_per_minute;
|
return (minutes.base() - this->clock_offset) * this->ticks_per_minute;
|
||||||
}
|
}
|
||||||
|
@@ -42,7 +42,7 @@ enum SlXvFeatureIndex {
|
|||||||
XSLFI_ADJACENT_CROSSINGS, ///< Adjacent level crossings closure patch
|
XSLFI_ADJACENT_CROSSINGS, ///< Adjacent level crossings closure patch
|
||||||
XSLFI_SAFER_CROSSINGS, ///< Safer level crossings
|
XSLFI_SAFER_CROSSINGS, ///< Safer level crossings
|
||||||
XSLFI_DEPARTURE_BOARDS, ///< Departure boards patch, in ticks mode
|
XSLFI_DEPARTURE_BOARDS, ///< Departure boards patch, in ticks mode
|
||||||
XSLFI_TIMETABLES_START_TICKS, ///< Timetable start time format: 1: is in ticks, instead of days, 2: also has subticks, 3: uses DateTicksScaled
|
XSLFI_TIMETABLES_START_TICKS, ///< Timetable start time format: 1: is in ticks, instead of days, 2: also has subticks, 3: uses StateTicks
|
||||||
XSLFI_TOWN_CARGO_ADJ, ///< Town cargo adjustment patch
|
XSLFI_TOWN_CARGO_ADJ, ///< Town cargo adjustment patch
|
||||||
XSLFI_SIG_TUNNEL_BRIDGE, ///< Signals on tunnels and bridges
|
XSLFI_SIG_TUNNEL_BRIDGE, ///< Signals on tunnels and bridges
|
||||||
XSLFI_IMPROVED_BREAKDOWNS, ///< Improved breakdowns patch
|
XSLFI_IMPROVED_BREAKDOWNS, ///< Improved breakdowns patch
|
||||||
|
@@ -91,7 +91,7 @@ static const SaveLoad _date_desc[] = {
|
|||||||
SLEG_CONDVAR_X(_tick_counter, SLE_UINT64, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_U64_TICK_COUNTER)),
|
SLEG_CONDVAR_X(_tick_counter, SLE_UINT64, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_U64_TICK_COUNTER)),
|
||||||
SLEG_CONDVAR_X(_tick_skip_counter, SLE_UINT8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH)),
|
SLEG_CONDVAR_X(_tick_skip_counter, SLE_UINT8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH)),
|
||||||
SLEG_CONDVAR_X(_scaled_tick_counter, SLE_UINT64, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH, 3)),
|
SLEG_CONDVAR_X(_scaled_tick_counter, SLE_UINT64, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH, 3)),
|
||||||
SLEG_CONDVAR_X(_scaled_date_ticks_offset, SLE_INT64, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH, 3)),
|
SLEG_CONDVAR_X(_state_ticks_offset, SLE_INT64, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH, 3)),
|
||||||
SLE_CONDNULL(2, SL_MIN_VERSION, SLV_157), // _vehicle_id_ctr_day
|
SLE_CONDNULL(2, SL_MIN_VERSION, SLV_157), // _vehicle_id_ctr_day
|
||||||
SLEG_CONDVAR(_age_cargo_skip_counter, SLE_UINT8, SL_MIN_VERSION, SLV_162),
|
SLEG_CONDVAR(_age_cargo_skip_counter, SLE_UINT8, SL_MIN_VERSION, SLV_162),
|
||||||
SLE_CONDNULL(1, SL_MIN_VERSION, SLV_46),
|
SLE_CONDNULL(1, SL_MIN_VERSION, SLV_46),
|
||||||
@@ -128,7 +128,7 @@ static const SaveLoad _date_check_desc[] = {
|
|||||||
SLE_CONDNULL_X(8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_U64_TICK_COUNTER)), // _tick_counter
|
SLE_CONDNULL_X(8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_U64_TICK_COUNTER)), // _tick_counter
|
||||||
SLE_CONDNULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH)), // _tick_skip_counter
|
SLE_CONDNULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH)), // _tick_skip_counter
|
||||||
SLE_CONDNULL_X(8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH, 3)), // _scaled_tick_counter
|
SLE_CONDNULL_X(8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH, 3)), // _scaled_tick_counter
|
||||||
SLE_CONDNULL_X(8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH, 3)), // _scaled_date_ticks_offset
|
SLE_CONDNULL_X(8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH, 3)), // _state_ticks_offset
|
||||||
SLE_CONDNULL(2, SL_MIN_VERSION, SLV_157), // _vehicle_id_ctr_day
|
SLE_CONDNULL(2, SL_MIN_VERSION, SLV_157), // _vehicle_id_ctr_day
|
||||||
SLE_CONDNULL(1, SL_MIN_VERSION, SLV_162), // _age_cargo_skip_counter
|
SLE_CONDNULL(1, SL_MIN_VERSION, SLV_162), // _age_cargo_skip_counter
|
||||||
SLE_CONDNULL(1, SL_MIN_VERSION, SLV_46),
|
SLE_CONDNULL(1, SL_MIN_VERSION, SLV_46),
|
||||||
|
@@ -4550,8 +4550,8 @@ void DeleteStaleLinks(Station *from)
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
});
|
});
|
||||||
assert(_scaled_date_ticks >= lg->LastCompression());
|
assert(_state_ticks >= lg->LastCompression());
|
||||||
if ((_scaled_date_ticks - lg->LastCompression()) > LinkGraph::COMPRESSION_INTERVAL) {
|
if ((_state_ticks - lg->LastCompression()) > LinkGraph::COMPRESSION_INTERVAL) {
|
||||||
lg->Compress();
|
lg->Compress();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -93,7 +93,7 @@ struct StatusBarWindow : Window {
|
|||||||
Dimension d;
|
Dimension d;
|
||||||
switch (widget) {
|
switch (widget) {
|
||||||
case WID_S_LEFT:
|
case WID_S_LEFT:
|
||||||
SetDParam(0, DateToScaledDateTicks(MAX_YEAR * DAYS_IN_YEAR));
|
SetDParam(0, DateToStateTicks(MAX_YEAR * DAYS_IN_YEAR));
|
||||||
d = GetStringBoundingBox(STR_JUST_DATE_WALLCLOCK_LONG);
|
d = GetStringBoundingBox(STR_JUST_DATE_WALLCLOCK_LONG);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -121,7 +121,7 @@ struct StatusBarWindow : Window {
|
|||||||
switch (widget) {
|
switch (widget) {
|
||||||
case WID_S_LEFT:
|
case WID_S_LEFT:
|
||||||
/* Draw the date */
|
/* Draw the date */
|
||||||
SetDParam(0, _scaled_date_ticks);
|
SetDParam(0, _state_ticks);
|
||||||
DrawString(tr, STR_JUST_DATE_WALLCLOCK_LONG, TC_WHITE, SA_HOR_CENTER);
|
DrawString(tr, STR_JUST_DATE_WALLCLOCK_LONG, TC_WHITE, SA_HOR_CENTER);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@@ -473,14 +473,14 @@ static void FormatBytes(StringBuilder builder, int64_t number)
|
|||||||
fmt::format_to(builder, NBSP "{}B", iec_prefixes[id]);
|
fmt::format_to(builder, NBSP "{}B", iec_prefixes[id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FormatWallClockString(StringBuilder builder, DateTicksScaled ticks, bool show_date, uint case_index)
|
static void FormatWallClockString(StringBuilder builder, StateTicks ticks, bool show_date, uint case_index)
|
||||||
{
|
{
|
||||||
TickMinutes minutes = _settings_time.ToTickMinutes(ticks);
|
TickMinutes minutes = _settings_time.ToTickMinutes(ticks);
|
||||||
char hour[3], minute[3];
|
char hour[3], minute[3];
|
||||||
seprintf(hour, lastof(hour), "%02i", minutes.ClockHour());
|
seprintf(hour, lastof(hour), "%02i", minutes.ClockHour());
|
||||||
seprintf(minute, lastof(minute), "%02i", minutes.ClockMinute());
|
seprintf(minute, lastof(minute), "%02i", minutes.ClockMinute());
|
||||||
if (show_date) {
|
if (show_date) {
|
||||||
Date date = ScaledDateTicksToDate(ticks);
|
Date date = StateTicksToDate(ticks);
|
||||||
int64_t final_arg;
|
int64_t final_arg;
|
||||||
if (_settings_client.gui.date_with_time == 1) {
|
if (_settings_client.gui.date_with_time == 1) {
|
||||||
YearMonthDay ymd = ConvertDateToYMD(date);
|
YearMonthDay ymd = ConvertDateToYMD(date);
|
||||||
@@ -1538,36 +1538,36 @@ static void FormatString(StringBuilder builder, const char *str_arg, StringParam
|
|||||||
|
|
||||||
case SCC_DATE_WALLCLOCK_LONG: { // {DATE_WALLCLOCK_LONG}
|
case SCC_DATE_WALLCLOCK_LONG: { // {DATE_WALLCLOCK_LONG}
|
||||||
if (_settings_time.time_in_minutes) {
|
if (_settings_time.time_in_minutes) {
|
||||||
FormatWallClockString(builder, args.GetNextParameter<DateTicksScaled>(), _settings_client.gui.date_with_time, next_substr_case_index);
|
FormatWallClockString(builder, args.GetNextParameter<StateTicks>(), _settings_client.gui.date_with_time, next_substr_case_index);
|
||||||
} else {
|
} else {
|
||||||
FormatYmdString(builder, ScaledDateTicksToDate(args.GetNextParameter<DateTicksScaled>()), next_substr_case_index);
|
FormatYmdString(builder, StateTicksToDate(args.GetNextParameter<StateTicks>()), next_substr_case_index);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case SCC_DATE_WALLCLOCK_SHORT: { // {DATE_WALLCLOCK_SHORT}
|
case SCC_DATE_WALLCLOCK_SHORT: { // {DATE_WALLCLOCK_SHORT}
|
||||||
if (_settings_time.time_in_minutes) {
|
if (_settings_time.time_in_minutes) {
|
||||||
FormatWallClockString(builder, args.GetNextParameter<DateTicksScaled>(), _settings_client.gui.date_with_time, next_substr_case_index);
|
FormatWallClockString(builder, args.GetNextParameter<StateTicks>(), _settings_client.gui.date_with_time, next_substr_case_index);
|
||||||
} else {
|
} else {
|
||||||
FormatYmdString(builder, ScaledDateTicksToDate(args.GetNextParameter<DateTicksScaled>()), next_substr_case_index);
|
FormatYmdString(builder, StateTicksToDate(args.GetNextParameter<StateTicks>()), next_substr_case_index);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case SCC_DATE_WALLCLOCK_TINY: { // {DATE_WALLCLOCK_TINY}
|
case SCC_DATE_WALLCLOCK_TINY: { // {DATE_WALLCLOCK_TINY}
|
||||||
if (_settings_time.time_in_minutes) {
|
if (_settings_time.time_in_minutes) {
|
||||||
FormatWallClockString(builder, args.GetNextParameter<DateTicksScaled>(), false, next_substr_case_index);
|
FormatWallClockString(builder, args.GetNextParameter<StateTicks>(), false, next_substr_case_index);
|
||||||
} else {
|
} else {
|
||||||
FormatTinyOrISODate(builder, ScaledDateTicksToDate(args.GetNextParameter<DateTicksScaled>()), STR_FORMAT_DATE_TINY);
|
FormatTinyOrISODate(builder, StateTicksToDate(args.GetNextParameter<StateTicks>()), STR_FORMAT_DATE_TINY);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case SCC_DATE_WALLCLOCK_ISO: { // {DATE_WALLCLOCK_ISO}
|
case SCC_DATE_WALLCLOCK_ISO: { // {DATE_WALLCLOCK_ISO}
|
||||||
if (_settings_time.time_in_minutes) {
|
if (_settings_time.time_in_minutes) {
|
||||||
FormatWallClockString(builder, args.GetNextParameter<DateTicksScaled>(), false, next_substr_case_index);
|
FormatWallClockString(builder, args.GetNextParameter<StateTicks>(), false, next_substr_case_index);
|
||||||
} else {
|
} else {
|
||||||
FormatTinyOrISODate(builder, ScaledDateTicksToDate(args.GetNextParameter<DateTicksScaled>()), STR_FORMAT_DATE_ISO);
|
FormatTinyOrISODate(builder, StateTicksToDate(args.GetNextParameter<StateTicks>()), STR_FORMAT_DATE_ISO);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -263,7 +263,7 @@ class NIHVehicle : public NIHelper {
|
|||||||
seprintf(buffer, lastof(buffer), " V Last loading station: %u, %s", v->last_loading_station, BaseStation::Get(v->last_loading_station)->GetCachedName());
|
seprintf(buffer, lastof(buffer), " V Last loading station: %u, %s", v->last_loading_station, BaseStation::Get(v->last_loading_station)->GetCachedName());
|
||||||
output.print(buffer);
|
output.print(buffer);
|
||||||
seprintf(buffer, lastof(buffer), " V Last loading tick: " OTTD_PRINTF64 " (" OTTD_PRINTF64 ", " OTTD_PRINTF64 " mins ago)",
|
seprintf(buffer, lastof(buffer), " V Last loading tick: " OTTD_PRINTF64 " (" OTTD_PRINTF64 ", " OTTD_PRINTF64 " mins ago)",
|
||||||
v->last_loading_tick.base(), (_scaled_date_ticks - v->last_loading_tick).base(), (_scaled_date_ticks - v->last_loading_tick).base() / _settings_time.ticks_per_minute);
|
v->last_loading_tick.base(), (_state_ticks - v->last_loading_tick).base(), (_state_ticks - v->last_loading_tick).base() / _settings_time.ticks_per_minute);
|
||||||
output.print(buffer);
|
output.print(buffer);
|
||||||
}
|
}
|
||||||
if (v->IsGroundVehicle()) {
|
if (v->IsGroundVehicle()) {
|
||||||
@@ -1449,7 +1449,7 @@ class NIHSignals : public NIHelper {
|
|||||||
if (it.second.IsOutOfDate()) {
|
if (it.second.IsOutOfDate()) {
|
||||||
b += seprintf(b, lastof(buffer), ", expired");
|
b += seprintf(b, lastof(buffer), ", expired");
|
||||||
} else {
|
} else {
|
||||||
b += seprintf(b, lastof(buffer), ", expires in %u ticks", (uint)(it.second.time_stamp - _scaled_date_ticks).base());
|
b += seprintf(b, lastof(buffer), ", expires in %u ticks", (uint)(it.second.time_stamp - _state_ticks).base());
|
||||||
}
|
}
|
||||||
output.print(buffer);
|
output.print(buffer);
|
||||||
}
|
}
|
||||||
|
@@ -41,6 +41,6 @@ struct TimetableProgress {
|
|||||||
std::vector<TimetableProgress> PopulateSeparationState(const Vehicle *v_start);
|
std::vector<TimetableProgress> PopulateSeparationState(const Vehicle *v_start);
|
||||||
|
|
||||||
struct DispatchSchedule;
|
struct DispatchSchedule;
|
||||||
DateTicksScaled GetScheduledDispatchTime(const DispatchSchedule &ds, DateTicksScaled leave_time);
|
StateTicks GetScheduledDispatchTime(const DispatchSchedule &ds, StateTicks leave_time);
|
||||||
|
|
||||||
#endif /* TIMETABLE_H */
|
#endif /* TIMETABLE_H */
|
||||||
|
@@ -486,12 +486,12 @@ CommandCost CmdSetTimetableStart(TileIndex tile, DoCommandFlag flags, uint32_t p
|
|||||||
CommandCost ret = CheckOwnership(v->owner);
|
CommandCost ret = CheckOwnership(v->owner);
|
||||||
if (ret.Failed()) return ret;
|
if (ret.Failed()) return ret;
|
||||||
|
|
||||||
DateTicksScaled start_date_scaled = (DateTicksScaled)p3;
|
StateTicks start_date_scaled = (StateTicks)p3;
|
||||||
|
|
||||||
/* Don't let a timetable start more than 15 unscaled years into the future... */
|
/* Don't let a timetable start more than 15 unscaled years into the future... */
|
||||||
if (start_date_scaled - _scaled_date_ticks > 15 * DAY_TICKS * DAYS_IN_LEAP_YEAR) return CMD_ERROR;
|
if (start_date_scaled - _state_ticks > 15 * DAY_TICKS * DAYS_IN_LEAP_YEAR) return CMD_ERROR;
|
||||||
/* ...or 1 unscaled year in the past. */
|
/* ...or 1 unscaled year in the past. */
|
||||||
if (_scaled_date_ticks - start_date_scaled > DAY_TICKS * DAYS_IN_LEAP_YEAR) return CMD_ERROR;
|
if (_state_ticks - start_date_scaled > DAY_TICKS * DAYS_IN_LEAP_YEAR) return CMD_ERROR;
|
||||||
|
|
||||||
if (timetable_all && !v->orders->IsCompleteTimetable()) return CommandCost(STR_ERROR_TIMETABLE_INCOMPLETE);
|
if (timetable_all && !v->orders->IsCompleteTimetable()) return CommandCost(STR_ERROR_TIMETABLE_INCOMPLETE);
|
||||||
|
|
||||||
@@ -787,12 +787,12 @@ void UpdateSeparationOrder(Vehicle *v_start)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DateTicksScaled GetScheduledDispatchTime(const DispatchSchedule &ds, DateTicksScaled leave_time)
|
StateTicks GetScheduledDispatchTime(const DispatchSchedule &ds, StateTicks leave_time)
|
||||||
{
|
{
|
||||||
const uint32_t dispatch_duration = ds.GetScheduledDispatchDuration();
|
const uint32_t dispatch_duration = ds.GetScheduledDispatchDuration();
|
||||||
const int32_t max_delay = ds.GetScheduledDispatchDelay();
|
const int32_t max_delay = ds.GetScheduledDispatchDelay();
|
||||||
const DateTicksScaled minimum = leave_time - max_delay;
|
const StateTicks minimum = leave_time - max_delay;
|
||||||
DateTicksScaled begin_time = ds.GetScheduledDispatchStartTick();
|
StateTicks begin_time = ds.GetScheduledDispatchStartTick();
|
||||||
if (ds.GetScheduledDispatchReuseSlots()) {
|
if (ds.GetScheduledDispatchReuseSlots()) {
|
||||||
begin_time -= dispatch_duration;
|
begin_time -= dispatch_duration;
|
||||||
}
|
}
|
||||||
@@ -804,7 +804,7 @@ DateTicksScaled GetScheduledDispatchTime(const DispatchSchedule &ds, DateTicksSc
|
|||||||
last_dispatched_offset = ds.GetScheduledDispatchLastDispatch();
|
last_dispatched_offset = ds.GetScheduledDispatchLastDispatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
DateTicksScaled first_slot = -1;
|
StateTicks first_slot = -1;
|
||||||
|
|
||||||
/* Find next available slots */
|
/* Find next available slots */
|
||||||
for (const DispatchSlot &slot : ds.GetScheduledDispatch()) {
|
for (const DispatchSlot &slot : ds.GetScheduledDispatch()) {
|
||||||
@@ -817,7 +817,7 @@ DateTicksScaled GetScheduledDispatchTime(const DispatchSchedule &ds, DateTicksSc
|
|||||||
current_offset += dispatch_duration * ((threshold + dispatch_duration - current_offset) / dispatch_duration);
|
current_offset += dispatch_duration * ((threshold + dispatch_duration - current_offset) / dispatch_duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
DateTicksScaled current_departure = begin_time + current_offset;
|
StateTicks current_departure = begin_time + current_offset;
|
||||||
if (current_departure < minimum) {
|
if (current_departure < minimum) {
|
||||||
current_departure += dispatch_duration * ((minimum + dispatch_duration - current_departure - 1) / dispatch_duration);
|
current_departure += dispatch_duration * ((minimum + dispatch_duration - current_departure - 1) / dispatch_duration);
|
||||||
}
|
}
|
||||||
@@ -873,11 +873,11 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling)
|
|||||||
ds.UpdateScheduledDispatch(v);
|
ds.UpdateScheduledDispatch(v);
|
||||||
|
|
||||||
const int wait_offset = real_current_order->GetTimetabledWait();
|
const int wait_offset = real_current_order->GetTimetabledWait();
|
||||||
DateTicksScaled slot = GetScheduledDispatchTime(ds, _scaled_date_ticks + wait_offset);
|
StateTicks slot = GetScheduledDispatchTime(ds, _state_ticks + wait_offset);
|
||||||
if (slot > -1) {
|
if (slot > -1) {
|
||||||
just_started = !HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED);
|
just_started = !HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED);
|
||||||
SetBit(v->vehicle_flags, VF_TIMETABLE_STARTED);
|
SetBit(v->vehicle_flags, VF_TIMETABLE_STARTED);
|
||||||
v->lateness_counter = (_scaled_date_ticks - slot + wait_offset).AsTicks();
|
v->lateness_counter = (_state_ticks - slot + wait_offset).AsTicks();
|
||||||
ds.SetScheduledDispatchLastDispatch((slot - ds.GetScheduledDispatchStartTick()).AsTicks());
|
ds.SetScheduledDispatchLastDispatch((slot - ds.GetScheduledDispatchStartTick()).AsTicks());
|
||||||
SetTimetableWindowsDirty(v, STWDF_SCHEDULED_DISPATCH);
|
SetTimetableWindowsDirty(v, STWDF_SCHEDULED_DISPATCH);
|
||||||
set_scheduled_dispatch = true;
|
set_scheduled_dispatch = true;
|
||||||
@@ -905,7 +905,7 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling)
|
|||||||
if (!set_scheduled_dispatch) just_started = !HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED);
|
if (!set_scheduled_dispatch) just_started = !HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED);
|
||||||
|
|
||||||
if (v->timetable_start != 0) {
|
if (v->timetable_start != 0) {
|
||||||
v->lateness_counter = (_scaled_date_ticks - v->timetable_start).AsTicks();
|
v->lateness_counter = (_state_ticks - v->timetable_start).AsTicks();
|
||||||
v->timetable_start = 0;
|
v->timetable_start = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -144,17 +144,17 @@ static void FillTimetableArrivalDepartureTable(const Vehicle *v, VehicleOrderID
|
|||||||
|
|
||||||
case OCV_TIME_DATE: {
|
case OCV_TIME_DATE: {
|
||||||
predicted = true;
|
predicted = true;
|
||||||
DateTicksScaled time = _scaled_date_ticks + sum;
|
StateTicks time = _state_ticks + sum;
|
||||||
if (!no_offset) time -= v->lateness_counter;
|
if (!no_offset) time -= v->lateness_counter;
|
||||||
int value = GetTraceRestrictTimeDateValueFromDate(static_cast<TraceRestrictTimeDateValueField>(order->GetConditionValue()), time);
|
int value = GetTraceRestrictTimeDateValueFromStateTicks(static_cast<TraceRestrictTimeDateValueField>(order->GetConditionValue()), time);
|
||||||
jump = OrderConditionCompare(order->GetConditionComparator(), value, order->GetXData());
|
jump = OrderConditionCompare(order->GetConditionComparator(), value, order->GetXData());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case OCV_DISPATCH_SLOT: {
|
case OCV_DISPATCH_SLOT: {
|
||||||
DateTicksScaled time = _scaled_date_ticks + sum;
|
StateTicks time = _state_ticks + sum;
|
||||||
if (!no_offset) time -= v->lateness_counter;
|
if (!no_offset) time -= v->lateness_counter;
|
||||||
extern bool EvaluateDispatchSlotConditionalOrder(const Order *order, const Vehicle *v, DateTicksScaled date_time, bool *predicted);
|
extern bool EvaluateDispatchSlotConditionalOrder(const Order *order, const Vehicle *v, StateTicks state_ticks, bool *predicted);
|
||||||
jump = EvaluateDispatchSlotConditionalOrder(order, v, time, &predicted);
|
jump = EvaluateDispatchSlotConditionalOrder(order, v, time, &predicted);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -193,11 +193,11 @@ static void FillTimetableArrivalDepartureTable(const Vehicle *v, VehicleOrderID
|
|||||||
DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(order->GetDispatchScheduleIndex());
|
DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(order->GetDispatchScheduleIndex());
|
||||||
DispatchSchedule predicted_ds;
|
DispatchSchedule predicted_ds;
|
||||||
predicted_ds.BorrowSchedule(ds);
|
predicted_ds.BorrowSchedule(ds);
|
||||||
predicted_ds.UpdateScheduledDispatchToDate(_scaled_date_ticks + sum);
|
predicted_ds.UpdateScheduledDispatchToDate(_state_ticks + sum);
|
||||||
DateTicksScaled slot = GetScheduledDispatchTime(predicted_ds, _scaled_date_ticks + sum + order->GetTimetabledWait());
|
StateTicks slot = GetScheduledDispatchTime(predicted_ds, _state_ticks + sum + order->GetTimetabledWait());
|
||||||
predicted_ds.ReturnSchedule(ds);
|
predicted_ds.ReturnSchedule(ds);
|
||||||
if (slot <= -1) return;
|
if (slot <= -1) return;
|
||||||
sum = (slot - _scaled_date_ticks).AsTicks();
|
sum = (slot - _state_ticks).AsTicks();
|
||||||
predicted = true;
|
predicted = true;
|
||||||
no_offset = true;
|
no_offset = true;
|
||||||
} else {
|
} else {
|
||||||
@@ -234,21 +234,21 @@ static void FillTimetableArrivalDepartureTable(const Vehicle *v, VehicleOrderID
|
|||||||
/**
|
/**
|
||||||
* Callback for when a time has been chosen to start the time table
|
* Callback for when a time has been chosen to start the time table
|
||||||
* @param p1 The p1 parameter to send to CmdSetTimetableStart
|
* @param p1 The p1 parameter to send to CmdSetTimetableStart
|
||||||
* @param date the actually chosen date
|
* @param tick the actually chosen state tick
|
||||||
*/
|
*/
|
||||||
static void ChangeTimetableStartIntl(uint32_t p1, DateTicksScaled date)
|
static void ChangeTimetableStartIntl(uint32_t p1, StateTicks tick)
|
||||||
{
|
{
|
||||||
DoCommandPEx(0, p1, 0, (uint64_t)date.base(), CMD_SET_TIMETABLE_START | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE), nullptr, nullptr, 0);
|
DoCommandPEx(0, p1, 0, (uint64_t)tick.base(), CMD_SET_TIMETABLE_START | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE), nullptr, nullptr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback for when a time has been chosen to start the time table
|
* Callback for when a time has been chosen to start the time table
|
||||||
* @param w the window related to the setting of the date
|
* @param w the window related to the setting of the date
|
||||||
* @param date the actually chosen date
|
* @param tick the actually chosen tick
|
||||||
*/
|
*/
|
||||||
static void ChangeTimetableStartCallback(const Window *w, DateTicksScaled date)
|
static void ChangeTimetableStartCallback(const Window *w, StateTicks tick)
|
||||||
{
|
{
|
||||||
ChangeTimetableStartIntl(w->window_number, date);
|
ChangeTimetableStartIntl(w->window_number, tick);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProcessTimetableWarnings(const Vehicle *v, std::function<void(StringID, bool)> handler)
|
void ProcessTimetableWarnings(const Vehicle *v, std::function<void(StringID, bool)> handler)
|
||||||
@@ -762,10 +762,10 @@ struct TimetableWindow : GeneralVehicleWindow {
|
|||||||
if (arr_dep[i / 2].arrival != INVALID_TICKS) {
|
if (arr_dep[i / 2].arrival != INVALID_TICKS) {
|
||||||
DrawString(abbr.left, abbr.right, tr.top, STR_TIMETABLE_ARRIVAL_ABBREVIATION, i == selected ? TC_WHITE : TC_BLACK);
|
DrawString(abbr.left, abbr.right, tr.top, STR_TIMETABLE_ARRIVAL_ABBREVIATION, i == selected ? TC_WHITE : TC_BLACK);
|
||||||
if (this->show_expected && i / 2 == earlyID) {
|
if (this->show_expected && i / 2 == earlyID) {
|
||||||
SetDParam(0, _scaled_date_ticks + arr_dep[i / 2].arrival);
|
SetDParam(0, _state_ticks + arr_dep[i / 2].arrival);
|
||||||
DrawString(time.left, time.right, tr.top, STR_JUST_DATE_WALLCLOCK_TINY, TC_GREEN);
|
DrawString(time.left, time.right, tr.top, STR_JUST_DATE_WALLCLOCK_TINY, TC_GREEN);
|
||||||
} else {
|
} else {
|
||||||
SetDParam(0, _scaled_date_ticks + arr_dep[i / 2].arrival + (HasBit(arr_dep[i / 2].flags, TADF_ARRIVAL_NO_OFFSET) ? 0 : offset));
|
SetDParam(0, _state_ticks + arr_dep[i / 2].arrival + (HasBit(arr_dep[i / 2].flags, TADF_ARRIVAL_NO_OFFSET) ? 0 : offset));
|
||||||
DrawString(time.left, time.right, tr.top, STR_JUST_DATE_WALLCLOCK_TINY,
|
DrawString(time.left, time.right, tr.top, STR_JUST_DATE_WALLCLOCK_TINY,
|
||||||
HasBit(arr_dep[i / 2].flags, TADF_ARRIVAL_PREDICTED) ? (TextColour)(TC_IS_PALETTE_COLOUR | TC_NO_SHADE | 4) : (show_late ? TC_RED : i == selected ? TC_WHITE : TC_BLACK));
|
HasBit(arr_dep[i / 2].flags, TADF_ARRIVAL_PREDICTED) ? (TextColour)(TC_IS_PALETTE_COLOUR | TC_NO_SHADE | 4) : (show_late ? TC_RED : i == selected ? TC_WHITE : TC_BLACK));
|
||||||
}
|
}
|
||||||
@@ -773,7 +773,7 @@ struct TimetableWindow : GeneralVehicleWindow {
|
|||||||
} else {
|
} else {
|
||||||
if (arr_dep[i / 2].departure != INVALID_TICKS) {
|
if (arr_dep[i / 2].departure != INVALID_TICKS) {
|
||||||
DrawString(abbr.left, abbr.right, tr.top, STR_TIMETABLE_DEPARTURE_ABBREVIATION, i == selected ? TC_WHITE : TC_BLACK);
|
DrawString(abbr.left, abbr.right, tr.top, STR_TIMETABLE_DEPARTURE_ABBREVIATION, i == selected ? TC_WHITE : TC_BLACK);
|
||||||
SetDParam(0, _scaled_date_ticks + arr_dep[i/2].departure + (HasBit(arr_dep[i / 2].flags, TADF_DEPARTURE_NO_OFFSET) ? 0 : offset));
|
SetDParam(0, _state_ticks + arr_dep[i/2].departure + (HasBit(arr_dep[i / 2].flags, TADF_DEPARTURE_NO_OFFSET) ? 0 : offset));
|
||||||
DrawString(time.left, time.right, tr.top, STR_JUST_DATE_WALLCLOCK_TINY,
|
DrawString(time.left, time.right, tr.top, STR_JUST_DATE_WALLCLOCK_TINY,
|
||||||
HasBit(arr_dep[i / 2].flags, TADF_DEPARTURE_PREDICTED) ? (TextColour)(TC_IS_PALETTE_COLOUR | TC_NO_SHADE | 4) : (show_late ? TC_RED : i == selected ? TC_WHITE : TC_BLACK));
|
HasBit(arr_dep[i / 2].flags, TADF_DEPARTURE_PREDICTED) ? (TextColour)(TC_IS_PALETTE_COLOUR | TC_NO_SHADE | 4) : (show_late ? TC_RED : i == selected ? TC_WHITE : TC_BLACK));
|
||||||
}
|
}
|
||||||
@@ -909,7 +909,7 @@ struct TimetableWindow : GeneralVehicleWindow {
|
|||||||
ShowQueryString(str, STR_TIMETABLE_START, 31, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED);
|
ShowQueryString(str, STR_TIMETABLE_START, 31, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED);
|
||||||
} else {
|
} else {
|
||||||
ShowSetDateWindow(this, v->index | (_ctrl_pressed ? 1U << 20 : 0),
|
ShowSetDateWindow(this, v->index | (_ctrl_pressed ? 1U << 20 : 0),
|
||||||
_scaled_date_ticks, _cur_year, _cur_year + 15, ChangeTimetableStartCallback);
|
_state_ticks, _cur_year, _cur_year + 15, ChangeTimetableStartCallback);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@@ -2417,9 +2417,9 @@ int GetTraceRestrictTimeDateValue(TraceRestrictTimeDateValueField type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetTraceRestrictTimeDateValueFromDate(TraceRestrictTimeDateValueField type, DateTicksScaled scaled_date_ticks)
|
int GetTraceRestrictTimeDateValueFromStateTicks(TraceRestrictTimeDateValueField type, StateTicks state_ticks)
|
||||||
{
|
{
|
||||||
const TickMinutes minutes = _settings_game.game_time.ToTickMinutes(scaled_date_ticks);
|
const TickMinutes minutes = _settings_game.game_time.ToTickMinutes(state_ticks);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TRTDVF_MINUTE:
|
case TRTDVF_MINUTE:
|
||||||
@@ -2432,12 +2432,12 @@ int GetTraceRestrictTimeDateValueFromDate(TraceRestrictTimeDateValueField type,
|
|||||||
return minutes.ClockHHMM();
|
return minutes.ClockHHMM();
|
||||||
|
|
||||||
case TRTDVF_DAY: {
|
case TRTDVF_DAY: {
|
||||||
YearMonthDay ymd = ConvertDateToYMD(ScaledDateTicksToDate(scaled_date_ticks));
|
YearMonthDay ymd = ConvertDateToYMD(StateTicksToDate(state_ticks));
|
||||||
return ymd.day;
|
return ymd.day;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TRTDVF_MONTH: {
|
case TRTDVF_MONTH: {
|
||||||
YearMonthDay ymd = ConvertDateToYMD(ScaledDateTicksToDate(scaled_date_ticks));
|
YearMonthDay ymd = ConvertDateToYMD(StateTicksToDate(state_ticks));
|
||||||
return ymd.month + 1;
|
return ymd.month + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1169,7 +1169,7 @@ bool TraceRestrictProgramDuplicateItemAtDryRun(const std::vector<TraceRestrictIt
|
|||||||
void ShowTraceRestrictProgramWindow(TileIndex tile, Track track);
|
void ShowTraceRestrictProgramWindow(TileIndex tile, Track track);
|
||||||
|
|
||||||
int GetTraceRestrictTimeDateValue(TraceRestrictTimeDateValueField type);
|
int GetTraceRestrictTimeDateValue(TraceRestrictTimeDateValueField type);
|
||||||
int GetTraceRestrictTimeDateValueFromDate(TraceRestrictTimeDateValueField type, DateTicksScaled scaled_date_ticks);
|
int GetTraceRestrictTimeDateValueFromStateTicks(TraceRestrictTimeDateValueField type, StateTicks state_ticks);
|
||||||
|
|
||||||
void TraceRestrictRemoveDestinationID(TraceRestrictOrderCondAuxField type, uint16_t index);
|
void TraceRestrictRemoveDestinationID(TraceRestrictOrderCondAuxField type, uint16_t index);
|
||||||
void TraceRestrictRemoveGroupID(GroupID index);
|
void TraceRestrictRemoveGroupID(GroupID index);
|
||||||
|
@@ -101,7 +101,7 @@ static bool CheckTrainStayInWormHolePathReserve(Train *t, TileIndex tile);
|
|||||||
|
|
||||||
/** Return the scaled date ticks by which the speed restriction
|
/** Return the scaled date ticks by which the speed restriction
|
||||||
* at the current position of the train is going to be invalid */
|
* at the current position of the train is going to be invalid */
|
||||||
static DateTicksScaled GetSpeedRestrictionTimeout(const Train *t)
|
static StateTicks GetSpeedRestrictionTimeout(const Train *t)
|
||||||
{
|
{
|
||||||
const int64_t velocity = std::max<int64_t>(25, t->cur_speed);
|
const int64_t velocity = std::max<int64_t>(25, t->cur_speed);
|
||||||
const int64_t look_ahead_distance = Clamp(t->cur_speed / 8, 4, 16); // In tiles, varying between 4 and 16 depending on current speed
|
const int64_t look_ahead_distance = Clamp(t->cur_speed / 8, 4, 16); // In tiles, varying between 4 and 16 depending on current speed
|
||||||
@@ -111,7 +111,7 @@ static DateTicksScaled GetSpeedRestrictionTimeout(const Train *t)
|
|||||||
|
|
||||||
const int64_t ticks = ticks_per_tile * look_ahead_distance;
|
const int64_t ticks = ticks_per_tile * look_ahead_distance;
|
||||||
|
|
||||||
return _scaled_date_ticks + ticks;
|
return _state_ticks + ticks;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Removes all speed restrictions from all signals */
|
/** Removes all speed restrictions from all signals */
|
||||||
@@ -120,7 +120,7 @@ void ClearAllSignalSpeedRestrictions()
|
|||||||
_signal_speeds.clear();
|
_signal_speeds.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdjustAllSignalSpeedRestrictionTickValues(DateTicksScaledDelta delta)
|
void AdjustAllSignalSpeedRestrictionTickValues(StateTicksDelta delta)
|
||||||
{
|
{
|
||||||
for (auto &it : _signal_speeds) {
|
for (auto &it : _signal_speeds) {
|
||||||
it.second.time_stamp += delta;
|
it.second.time_stamp += delta;
|
||||||
|
@@ -36,12 +36,12 @@ struct SignalSpeedKey {
|
|||||||
|
|
||||||
struct SignalSpeedValue {
|
struct SignalSpeedValue {
|
||||||
uint16_t train_speed;
|
uint16_t train_speed;
|
||||||
DateTicksScaled time_stamp;
|
StateTicks time_stamp;
|
||||||
|
|
||||||
/** Checks if the timeout has passed */
|
/** Checks if the timeout has passed */
|
||||||
bool IsOutOfDate() const
|
bool IsOutOfDate() const
|
||||||
{
|
{
|
||||||
return _scaled_date_ticks > this->time_stamp;
|
return _state_ticks > this->time_stamp;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -3239,7 +3239,7 @@ static void VehicleIncreaseStats(const Vehicle *front)
|
|||||||
{
|
{
|
||||||
for (const Vehicle *v = front; v != nullptr; v = v->Next()) {
|
for (const Vehicle *v = front; v != nullptr; v = v->Next()) {
|
||||||
StationID last_loading_station = HasBit(front->vehicle_flags, VF_LAST_LOAD_ST_SEP) ? v->last_loading_station : front->last_loading_station;
|
StationID last_loading_station = HasBit(front->vehicle_flags, VF_LAST_LOAD_ST_SEP) ? v->last_loading_station : front->last_loading_station;
|
||||||
DateTicksScaled loading_tick = HasBit(front->vehicle_flags, VF_LAST_LOAD_ST_SEP) ? v->last_loading_tick : front->last_loading_tick;
|
StateTicks loading_tick = HasBit(front->vehicle_flags, VF_LAST_LOAD_ST_SEP) ? v->last_loading_tick : front->last_loading_tick;
|
||||||
if (v->refit_cap > 0 &&
|
if (v->refit_cap > 0 &&
|
||||||
last_loading_station != INVALID_STATION &&
|
last_loading_station != INVALID_STATION &&
|
||||||
last_loading_station != front->last_station_visited &&
|
last_loading_station != front->last_station_visited &&
|
||||||
@@ -3254,7 +3254,7 @@ static void VehicleIncreaseStats(const Vehicle *front)
|
|||||||
EdgeUpdateMode restricted_mode = EUM_INCREASE;
|
EdgeUpdateMode restricted_mode = EUM_INCREASE;
|
||||||
if (v->type == VEH_AIRCRAFT) restricted_mode |= EUM_AIRCRAFT;
|
if (v->type == VEH_AIRCRAFT) restricted_mode |= EUM_AIRCRAFT;
|
||||||
IncreaseStats(Station::Get(last_loading_station), v->cargo_type, front->last_station_visited, v->refit_cap,
|
IncreaseStats(Station::Get(last_loading_station), v->cargo_type, front->last_station_visited, v->refit_cap,
|
||||||
std::min<uint>(v->refit_cap, v->cargo.StoredCount()), (_scaled_date_ticks - loading_tick).AsTicksT<uint32_t>(), restricted_mode);
|
std::min<uint>(v->refit_cap, v->cargo.StoredCount()), (_state_ticks - loading_tick).AsTicksT<uint32_t>(), restricted_mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3474,7 +3474,7 @@ void Vehicle::LeaveStation()
|
|||||||
|
|
||||||
/* if the vehicle could load here or could stop with cargo loaded set the last loading station */
|
/* if the vehicle could load here or could stop with cargo loaded set the last loading station */
|
||||||
this->last_loading_station = this->last_station_visited;
|
this->last_loading_station = this->last_station_visited;
|
||||||
this->last_loading_tick = _scaled_date_ticks;
|
this->last_loading_tick = _state_ticks;
|
||||||
ClrBit(this->vehicle_flags, VF_LAST_LOAD_ST_SEP);
|
ClrBit(this->vehicle_flags, VF_LAST_LOAD_ST_SEP);
|
||||||
} else if (cargoes_can_leave_with_cargo == 0) {
|
} else if (cargoes_can_leave_with_cargo == 0) {
|
||||||
/* can leave with no cargoes */
|
/* can leave with no cargoes */
|
||||||
@@ -3488,14 +3488,14 @@ void Vehicle::LeaveStation()
|
|||||||
|
|
||||||
/* NB: this is saved here as we overwrite it on the first iteration of the loop below */
|
/* NB: this is saved here as we overwrite it on the first iteration of the loop below */
|
||||||
StationID head_last_loading_station = this->last_loading_station;
|
StationID head_last_loading_station = this->last_loading_station;
|
||||||
DateTicksScaled head_last_loading_tick = this->last_loading_tick;
|
StateTicks head_last_loading_tick = this->last_loading_tick;
|
||||||
for (Vehicle *u = this; u != nullptr; u = u->Next()) {
|
for (Vehicle *u = this; u != nullptr; u = u->Next()) {
|
||||||
StationID last_loading_station = HasBit(this->vehicle_flags, VF_LAST_LOAD_ST_SEP) ? u->last_loading_station : head_last_loading_station;
|
StationID last_loading_station = HasBit(this->vehicle_flags, VF_LAST_LOAD_ST_SEP) ? u->last_loading_station : head_last_loading_station;
|
||||||
DateTicksScaled last_loading_tick = HasBit(this->vehicle_flags, VF_LAST_LOAD_ST_SEP) ? u->last_loading_tick : head_last_loading_tick;
|
StateTicks last_loading_tick = HasBit(this->vehicle_flags, VF_LAST_LOAD_ST_SEP) ? u->last_loading_tick : head_last_loading_tick;
|
||||||
if (u->cargo_type < NUM_CARGO && HasBit(cargoes_can_load_unload, u->cargo_type)) {
|
if (u->cargo_type < NUM_CARGO && HasBit(cargoes_can_load_unload, u->cargo_type)) {
|
||||||
if (HasBit(cargoes_can_leave_with_cargo, u->cargo_type)) {
|
if (HasBit(cargoes_can_leave_with_cargo, u->cargo_type)) {
|
||||||
u->last_loading_station = this->last_station_visited;
|
u->last_loading_station = this->last_station_visited;
|
||||||
u->last_loading_tick = _scaled_date_ticks;
|
u->last_loading_tick = _state_ticks;
|
||||||
} else {
|
} else {
|
||||||
u->last_loading_station = INVALID_STATION;
|
u->last_loading_station = INVALID_STATION;
|
||||||
}
|
}
|
||||||
@@ -4688,7 +4688,7 @@ void DumpVehicleStats(char *buffer, const char *last)
|
|||||||
buffer += seprintf(buffer, last, "Total vehicles: %u\n", (uint)Vehicle::GetNumItems());
|
buffer += seprintf(buffer, last, "Total vehicles: %u\n", (uint)Vehicle::GetNumItems());
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdjustVehicleScaledTickBase(DateTicksScaledDelta delta)
|
void AdjustVehicleStateTicksBase(StateTicksDelta delta)
|
||||||
{
|
{
|
||||||
for (Vehicle *v : Vehicle::Iterate()) {
|
for (Vehicle *v : Vehicle::Iterate()) {
|
||||||
if (v->timetable_start != 0) v->timetable_start += delta;
|
if (v->timetable_start != 0) v->timetable_start += delta;
|
||||||
|
@@ -380,7 +380,7 @@ public:
|
|||||||
|
|
||||||
StationID last_station_visited; ///< The last station we stopped at.
|
StationID last_station_visited; ///< The last station we stopped at.
|
||||||
StationID last_loading_station; ///< Last station the vehicle has stopped at and could possibly leave from with any cargo loaded. (See VF_LAST_LOAD_ST_SEP).
|
StationID last_loading_station; ///< Last station the vehicle has stopped at and could possibly leave from with any cargo loaded. (See VF_LAST_LOAD_ST_SEP).
|
||||||
DateTicksScaled last_loading_tick; ///< Last tick (_scaled_date_ticks) the vehicle has stopped at a station and could possibly leave with any cargo loaded. (See VF_LAST_LOAD_ST_SEP).
|
StateTicks last_loading_tick; ///< Last tick (_state_ticks) the vehicle has stopped at a station and could possibly leave with any cargo loaded. (See VF_LAST_LOAD_ST_SEP).
|
||||||
|
|
||||||
VehicleCargoList cargo; ///< The cargo this vehicle is carrying
|
VehicleCargoList cargo; ///< The cargo this vehicle is carrying
|
||||||
uint16_t cargo_cap; ///< total capacity
|
uint16_t cargo_cap; ///< total capacity
|
||||||
|
Reference in New Issue
Block a user