Scheduled dispatch: Remove scheduled_dispatch_start_full_date_fract
Use DateTicksScaled
This commit is contained in:
@@ -70,13 +70,6 @@ static inline DateTicksScaled DateTicksToScaledDateTicks(DateTicks date_ticks)
|
|||||||
return ((int64)date_ticks * _settings_game.economy.day_length_factor) + _scaled_date_ticks_offset;
|
return ((int64)date_ticks * _settings_game.economy.day_length_factor) + _scaled_date_ticks_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline std::pair<Date, uint16> ScaledDateTicksToDateAndFullSubTicks(DateTicksScaled ticks)
|
|
||||||
{
|
|
||||||
ticks -= _scaled_date_ticks_offset;
|
|
||||||
const int full_date = _settings_game.economy.day_length_factor * DAY_TICKS;
|
|
||||||
return std::make_pair<Date, uint16>(ticks / full_date, ticks % full_date);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate the year of a given date.
|
* Calculate the year of a given date.
|
||||||
* @param date The date to consider.
|
* @param date The date to consider.
|
||||||
|
@@ -715,8 +715,7 @@ private:
|
|||||||
|
|
||||||
std::vector<uint32> scheduled_dispatch; ///< Scheduled dispatch time
|
std::vector<uint32> scheduled_dispatch; ///< Scheduled dispatch time
|
||||||
uint32 scheduled_dispatch_duration = 0; ///< Scheduled dispatch duration
|
uint32 scheduled_dispatch_duration = 0; ///< Scheduled dispatch duration
|
||||||
Date scheduled_dispatch_start_date = -1; ///< Scheduled dispatch start date
|
DateTicksScaled scheduled_dispatch_start_tick = -1; ///< Scheduled dispatch start tick
|
||||||
uint16 scheduled_dispatch_start_full_date_fract = 0; ///< Scheduled dispatch start full date fraction;
|
|
||||||
/// this counts to (DAY_TICK * _settings_game.economy.day_length_factor)
|
/// this counts to (DAY_TICK * _settings_game.economy.day_length_factor)
|
||||||
int32 scheduled_dispatch_last_dispatch = 0; ///< Last vehicle dispatched offset
|
int32 scheduled_dispatch_last_dispatch = 0; ///< Last vehicle dispatched offset
|
||||||
int32 scheduled_dispatch_max_delay = 0; ///< Maximum allowed delay
|
int32 scheduled_dispatch_max_delay = 0; ///< Maximum allowed delay
|
||||||
@@ -726,8 +725,7 @@ private:
|
|||||||
inline void CopyBasicFields(const DispatchSchedule &other)
|
inline void CopyBasicFields(const DispatchSchedule &other)
|
||||||
{
|
{
|
||||||
this->scheduled_dispatch_duration = other.scheduled_dispatch_duration;
|
this->scheduled_dispatch_duration = other.scheduled_dispatch_duration;
|
||||||
this->scheduled_dispatch_start_date = other.scheduled_dispatch_start_date;
|
this->scheduled_dispatch_start_tick = other.scheduled_dispatch_start_tick;
|
||||||
this->scheduled_dispatch_start_full_date_fract = other.scheduled_dispatch_start_full_date_fract;
|
|
||||||
this->scheduled_dispatch_last_dispatch = other.scheduled_dispatch_last_dispatch;
|
this->scheduled_dispatch_last_dispatch = other.scheduled_dispatch_last_dispatch;
|
||||||
this->scheduled_dispatch_max_delay = other.scheduled_dispatch_max_delay;
|
this->scheduled_dispatch_max_delay = other.scheduled_dispatch_max_delay;
|
||||||
}
|
}
|
||||||
@@ -761,38 +759,24 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the scheduled dispatch start
|
* Set the scheduled dispatch start
|
||||||
* @param start New start date
|
* @param start_ticks New start ticks
|
||||||
* @param fract New start full date fraction, see \c CmdScheduledDispatchSetStartDate
|
|
||||||
*/
|
*/
|
||||||
inline void SetScheduledDispatchStartDate(Date start_date, uint16 start_full_date_fract)
|
inline void SetScheduledDispatchStartTick(DateTicksScaled start_tick)
|
||||||
{
|
{
|
||||||
this->scheduled_dispatch_start_date = start_date;
|
this->scheduled_dispatch_start_tick = start_tick;
|
||||||
this->scheduled_dispatch_start_full_date_fract = start_full_date_fract;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the scheduled dispatch start date part
|
|
||||||
* @return scheduled dispatch start date part
|
|
||||||
*/
|
|
||||||
inline Date GetScheduledDispatchStartDatePart() const { return this->scheduled_dispatch_start_date; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the scheduled dispatch start date fract part
|
|
||||||
* @return scheduled dispatch start date fract part
|
|
||||||
*/
|
|
||||||
inline uint16 GetScheduledDispatchStartDateFractPart() const { return this->scheduled_dispatch_start_full_date_fract; }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 SchdispatchConvertToScaledTick(this->scheduled_dispatch_start_date, this->scheduled_dispatch_start_full_date_fract); }
|
inline DateTicksScaled GetScheduledDispatchStartTick() const { return this->scheduled_dispatch_start_tick; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the scheduled dispatch setting is valid
|
* Whether the scheduled dispatch setting is valid
|
||||||
* @return scheduled dispatch start date fraction
|
* @return scheduled dispatch start date fraction
|
||||||
*/
|
*/
|
||||||
inline bool IsScheduledDispatchValid() const { return this->scheduled_dispatch_start_date >= 0 && this->scheduled_dispatch_duration > 0; }
|
inline bool IsScheduledDispatchValid() const { return this->scheduled_dispatch_duration > 0; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the scheduled dispatch last dispatch offset, in scaled tick
|
* Set the scheduled dispatch last dispatch offset, in scaled tick
|
||||||
|
@@ -3692,14 +3692,6 @@ CommandCost CmdMassChangeOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, u
|
|||||||
|
|
||||||
void ShiftOrderDates(int interval)
|
void ShiftOrderDates(int interval)
|
||||||
{
|
{
|
||||||
for (OrderList *orderlist : OrderList::Iterate()) {
|
|
||||||
for (DispatchSchedule &ds : orderlist->GetScheduledDispatchScheduleSet()) {
|
|
||||||
if (ds.GetScheduledDispatchStartDatePart() >= 0) {
|
|
||||||
ds.SetScheduledDispatchStartDate(ds.GetScheduledDispatchStartDatePart() + interval, ds.GetScheduledDispatchStartDateFractPart());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SetWindowClassesDirty(WC_VEHICLE_ORDERS);
|
SetWindowClassesDirty(WC_VEHICLE_ORDERS);
|
||||||
SetWindowClassesDirty(WC_VEHICLE_TIMETABLE);
|
SetWindowClassesDirty(WC_VEHICLE_TIMETABLE);
|
||||||
SetWindowClassesDirty(WC_SCHDISPATCH_SLOTS);
|
SetWindowClassesDirty(WC_SCHDISPATCH_SLOTS);
|
||||||
|
@@ -4165,7 +4165,7 @@ bool AfterLoadGame()
|
|||||||
for (OrderList *order_list : OrderList::Iterate()) {
|
for (OrderList *order_list : OrderList::Iterate()) {
|
||||||
if (order_list->GetScheduledDispatchScheduleCount() == 1) {
|
if (order_list->GetScheduledDispatchScheduleCount() == 1) {
|
||||||
const DispatchSchedule &ds = order_list->GetDispatchScheduleByIndex(0);
|
const DispatchSchedule &ds = order_list->GetDispatchScheduleByIndex(0);
|
||||||
if (!ds.IsScheduledDispatchValid() && ds.GetScheduledDispatch().empty()) {
|
if (!(ds.GetScheduledDispatchStartTick() >= 0 && ds.IsScheduledDispatchValid()) && ds.GetScheduledDispatch().empty()) {
|
||||||
order_list->GetScheduledDispatchScheduleSet().clear();
|
order_list->GetScheduledDispatchScheduleSet().clear();
|
||||||
} else {
|
} else {
|
||||||
VehicleOrderID idx = order_list->GetFirstSharedVehicle()->GetFirstWaitingLocation(false);
|
VehicleOrderID idx = order_list->GetFirstSharedVehicle()->GetFirstWaitingLocation(false);
|
||||||
@@ -4176,6 +4176,18 @@ bool AfterLoadGame()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (SlXvIsFeaturePresent(XSLFI_SCHEDULED_DISPATCH, 1, 4)) {
|
||||||
|
extern btree::btree_map<DispatchSchedule *, uint16> _old_scheduled_dispatch_start_full_date_fract_map;
|
||||||
|
|
||||||
|
for (OrderList *order_list : OrderList::Iterate()) {
|
||||||
|
for (DispatchSchedule &ds : order_list->GetScheduledDispatchScheduleSet()) {
|
||||||
|
DateTicksScaled start_tick = DateToScaledDateTicks(ds.GetScheduledDispatchStartTick()) + _old_scheduled_dispatch_start_full_date_fract_map[&ds];
|
||||||
|
ds.SetScheduledDispatchStartTick(start_tick);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_old_scheduled_dispatch_start_full_date_fract_map.clear();
|
||||||
|
}
|
||||||
|
|
||||||
if (SlXvIsFeaturePresent(XSLFI_TRACE_RESTRICT, 7, 12)) {
|
if (SlXvIsFeaturePresent(XSLFI_TRACE_RESTRICT, 7, 12)) {
|
||||||
/* Move vehicle in slot flag */
|
/* Move vehicle in slot flag */
|
||||||
|
@@ -17,26 +17,4 @@
|
|||||||
void ShowSchdispatchWindow(const Vehicle *v);
|
void ShowSchdispatchWindow(const Vehicle *v);
|
||||||
void SchdispatchInvalidateWindows(const Vehicle *v);
|
void SchdispatchInvalidateWindows(const Vehicle *v);
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert date and full date fraction to DateTicksScaled
|
|
||||||
* @param date Current date
|
|
||||||
* @param full_date_fract full date fraction, the number of scaled tick in current day
|
|
||||||
* @return DateTicksScaled for ths specified date/faction
|
|
||||||
*/
|
|
||||||
inline DateTicksScaled SchdispatchConvertToScaledTick(Date date, uint16 full_date_fract)
|
|
||||||
{
|
|
||||||
return DateToScaledDateTicks(date) + full_date_fract;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert DateTicksScaled to date and full date fraction format
|
|
||||||
* @param tick DateTicksScaled to convert
|
|
||||||
* @param date Point to date, for ourput
|
|
||||||
* @param full_date_fract Pointer to uint16, for output
|
|
||||||
*/
|
|
||||||
inline void SchdispatchConvertToFullDateFract(DateTicksScaled tick, Date* date, uint16* full_date_fract)
|
|
||||||
{
|
|
||||||
std::tie(*date, *full_date_fract) = ScaledDateTicksToDateAndFullSubTicks(tick);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* SCHDISPATCH_H */
|
#endif /* SCHDISPATCH_H */
|
||||||
|
@@ -180,9 +180,8 @@ CommandCost CmdScheduledDispatchSetDuration(TileIndex tile, DoCommandFlag flags,
|
|||||||
* @param tile Not used.
|
* @param tile Not used.
|
||||||
* @param flags Operation to perform.
|
* @param flags Operation to perform.
|
||||||
* @param p1 Vehicle index
|
* @param p1 Vehicle index
|
||||||
* @param p2 Date to add.
|
* @param p2 Unused.
|
||||||
* @param p3 various bitstuffed elements
|
* @param p3 Start tick
|
||||||
* - p3 = (bit 0 - 15) - Full date fraction
|
|
||||||
* @param text unused
|
* @param text unused
|
||||||
* @return the cost of this operation or an error
|
* @return the cost of this operation or an error
|
||||||
*/
|
*/
|
||||||
@@ -201,12 +200,9 @@ CommandCost CmdScheduledDispatchSetStartDate(TileIndex tile, DoCommandFlag flags
|
|||||||
|
|
||||||
if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return CMD_ERROR;
|
if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return CMD_ERROR;
|
||||||
|
|
||||||
int32 date = (int32)p2;
|
|
||||||
uint16 full_date_fract = GB(p3, 0, 16);
|
|
||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(schedule_index);
|
DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(schedule_index);
|
||||||
ds.SetScheduledDispatchStartDate(date, full_date_fract);
|
ds.SetScheduledDispatchStartTick((DateTicksScaled)p3);
|
||||||
ds.UpdateScheduledDispatch(nullptr);
|
ds.UpdateScheduledDispatch(nullptr);
|
||||||
SetTimetableWindowsDirty(v, STWDF_SCHEDULED_DISPATCH);
|
SetTimetableWindowsDirty(v, STWDF_SCHEDULED_DISPATCH);
|
||||||
}
|
}
|
||||||
@@ -325,9 +321,7 @@ CommandCost CmdScheduledDispatchClear(TileIndex tile, DoCommandFlag flags, uint3
|
|||||||
* @param flags Operation to perform.
|
* @param flags Operation to perform.
|
||||||
* @param p1 Vehicle index
|
* @param p1 Vehicle index
|
||||||
* @param p2 Duration, in scaled tick
|
* @param p2 Duration, in scaled tick
|
||||||
* @param p3 various bitstuffed elements
|
* @param p3 Start tick
|
||||||
* - p3 = (bit 0 - 31) - Start date
|
|
||||||
* - p3 = (bit 32 - 47) - Full date fraction
|
|
||||||
* @param text unused
|
* @param text unused
|
||||||
* @return the cost of this operation or an error
|
* @return the cost of this operation or an error
|
||||||
*/
|
*/
|
||||||
@@ -344,14 +338,11 @@ CommandCost CmdScheduledDispatchAddNewSchedule(TileIndex tile, DoCommandFlag fla
|
|||||||
if (v->orders == nullptr) return CMD_ERROR;
|
if (v->orders == nullptr) return CMD_ERROR;
|
||||||
if (v->orders->GetScheduledDispatchScheduleCount() >= 4096) return CMD_ERROR;
|
if (v->orders->GetScheduledDispatchScheduleCount() >= 4096) return CMD_ERROR;
|
||||||
|
|
||||||
int32 date = GB(p3, 0, 32);
|
|
||||||
uint16 full_date_fract = GB(p3, 32, 16);
|
|
||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
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.SetScheduledDispatchStartDate(date, full_date_fract);
|
ds.SetScheduledDispatchStartTick((DateTicksScaled)p3);
|
||||||
ds.UpdateScheduledDispatch(nullptr);
|
ds.UpdateScheduledDispatch(nullptr);
|
||||||
SetTimetableWindowsDirty(v, STWDF_SCHEDULED_DISPATCH);
|
SetTimetableWindowsDirty(v, STWDF_SCHEDULED_DISPATCH);
|
||||||
}
|
}
|
||||||
@@ -683,10 +674,8 @@ bool DispatchSchedule::UpdateScheduledDispatchToDate(DateTicksScaled now)
|
|||||||
{
|
{
|
||||||
bool update_windows = false;
|
bool update_windows = false;
|
||||||
if (this->GetScheduledDispatchStartTick() == 0) {
|
if (this->GetScheduledDispatchStartTick() == 0) {
|
||||||
int64 start = now - (now % this->GetScheduledDispatchDuration());
|
DateTicksScaled start = now - (now % this->GetScheduledDispatchDuration());
|
||||||
SchdispatchConvertToFullDateFract(
|
this->SetScheduledDispatchStartTick(start);
|
||||||
start,
|
|
||||||
&this->scheduled_dispatch_start_date, &this->scheduled_dispatch_start_full_date_fract);
|
|
||||||
int64 last_dispatch = -start;
|
int64 last_dispatch = -start;
|
||||||
if (last_dispatch < INT_MIN && _settings_game.game_time.time_in_minutes) {
|
if (last_dispatch < INT_MIN && _settings_game.game_time.time_in_minutes) {
|
||||||
/* Advance by multiples of 24 hours */
|
/* Advance by multiples of 24 hours */
|
||||||
@@ -696,14 +685,12 @@ bool DispatchSchedule::UpdateScheduledDispatchToDate(DateTicksScaled now)
|
|||||||
this->scheduled_dispatch_last_dispatch = ClampTo<int32>(last_dispatch);
|
this->scheduled_dispatch_last_dispatch = ClampTo<int32>(last_dispatch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Most of the time this loop does not runs. It makes sure start date in in past */
|
/* Most of the time this loop does not run. It makes sure start date in in past */
|
||||||
while (this->GetScheduledDispatchStartTick() > now) {
|
while (this->GetScheduledDispatchStartTick() > now) {
|
||||||
OverflowSafeInt32 last_dispatch = this->scheduled_dispatch_last_dispatch;
|
OverflowSafeInt32 last_dispatch = this->scheduled_dispatch_last_dispatch;
|
||||||
last_dispatch += this->GetScheduledDispatchDuration();
|
last_dispatch += this->GetScheduledDispatchDuration();
|
||||||
this->scheduled_dispatch_last_dispatch = last_dispatch;
|
this->scheduled_dispatch_last_dispatch = last_dispatch;
|
||||||
SchdispatchConvertToFullDateFract(
|
this->SetScheduledDispatchStartTick(this->GetScheduledDispatchStartTick() - this->GetScheduledDispatchDuration());
|
||||||
this->GetScheduledDispatchStartTick() - this->GetScheduledDispatchDuration(),
|
|
||||||
&this->scheduled_dispatch_start_date, &this->scheduled_dispatch_start_full_date_fract);
|
|
||||||
update_windows = true;
|
update_windows = true;
|
||||||
}
|
}
|
||||||
/* Most of the time this loop runs once. It makes sure the start date is as close to current time as possible. */
|
/* Most of the time this loop runs once. It makes sure the start date is as close to current time as possible. */
|
||||||
@@ -711,9 +698,7 @@ bool DispatchSchedule::UpdateScheduledDispatchToDate(DateTicksScaled now)
|
|||||||
OverflowSafeInt32 last_dispatch = this->scheduled_dispatch_last_dispatch;
|
OverflowSafeInt32 last_dispatch = this->scheduled_dispatch_last_dispatch;
|
||||||
last_dispatch -= this->GetScheduledDispatchDuration();
|
last_dispatch -= this->GetScheduledDispatchDuration();
|
||||||
this->scheduled_dispatch_last_dispatch = last_dispatch;
|
this->scheduled_dispatch_last_dispatch = last_dispatch;
|
||||||
SchdispatchConvertToFullDateFract(
|
this->SetScheduledDispatchStartTick(this->GetScheduledDispatchStartTick() + this->GetScheduledDispatchDuration());
|
||||||
this->GetScheduledDispatchStartTick() + this->GetScheduledDispatchDuration(),
|
|
||||||
&this->scheduled_dispatch_start_date, &this->scheduled_dispatch_start_full_date_fract);
|
|
||||||
update_windows = true;
|
update_windows = true;
|
||||||
}
|
}
|
||||||
return update_windows;
|
return update_windows;
|
||||||
|
@@ -67,11 +67,7 @@ enum SchdispatchWidgets {
|
|||||||
*/
|
*/
|
||||||
static void SetScheduleStartDateIntl(uint32 p1, DateTicksScaled date)
|
static void SetScheduleStartDateIntl(uint32 p1, DateTicksScaled date)
|
||||||
{
|
{
|
||||||
Date start_date;
|
DoCommandPEx(0, p1, 0, (uint64)date, CMD_SCHEDULED_DISPATCH_SET_START_DATE | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE), nullptr, nullptr, 0);
|
||||||
uint16 start_full_date_fract;
|
|
||||||
SchdispatchConvertToFullDateFract(date, &start_date, &start_full_date_fract);
|
|
||||||
|
|
||||||
DoCommandPEx(0, p1, start_date, start_full_date_fract, CMD_SCHEDULED_DISPATCH_SET_START_DATE | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE), nullptr, nullptr, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -161,32 +157,24 @@ static int CalculateMaxRequiredVehicle(Ticks timetable_duration, uint32 schedule
|
|||||||
|
|
||||||
static void AddNewScheduledDispatchSchedule(VehicleID vindex)
|
static void AddNewScheduledDispatchSchedule(VehicleID vindex)
|
||||||
{
|
{
|
||||||
Date start_date;
|
DateTicksScaled start_tick;
|
||||||
uint16 start_full_date_fract;
|
|
||||||
uint32 duration;
|
uint32 duration;
|
||||||
|
|
||||||
if (_settings_time.time_in_minutes) {
|
if (_settings_time.time_in_minutes) {
|
||||||
/* Set to 00:00 of today, and 1 day */
|
/* Set to 00:00 of today, and 1 day */
|
||||||
|
|
||||||
DateTicksScaled val;
|
start_tick = MINUTES_DATE(MINUTES_DAY(CURRENT_MINUTE), 0, 0);
|
||||||
val = MINUTES_DATE(MINUTES_DAY(CURRENT_MINUTE), 0, 0);
|
start_tick -= _settings_time.clock_offset;
|
||||||
val -= _settings_time.clock_offset;
|
start_tick *= _settings_time.ticks_per_minute;
|
||||||
val *= _settings_time.ticks_per_minute;
|
|
||||||
SchdispatchConvertToFullDateFract(val, &start_date, &start_full_date_fract);
|
|
||||||
|
|
||||||
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_date = DAYS_TILL(_cur_year);
|
start_tick = DateToScaledDateTicks(DAYS_TILL(_cur_year));
|
||||||
start_full_date_fract = 0;
|
|
||||||
duration = 365 * DAY_TICKS;
|
duration = 365 * DAY_TICKS;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64 p3 = 0;
|
DoCommandPEx(0, vindex, duration, (uint64)start_tick, CMD_SCHEDULED_DISPATCH_ADD_NEW_SCHEDULE | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE), CcAddNewSchDispatchSchedule, nullptr, 0);
|
||||||
SB(p3, 0, 32, start_date);
|
|
||||||
SB(p3, 32, 16, start_full_date_fract);
|
|
||||||
|
|
||||||
DoCommandPEx(0, vindex, duration, p3, CMD_SCHEDULED_DISPATCH_ADD_NEW_SCHEDULE | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE), CcAddNewSchDispatchSchedule, nullptr, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SchdispatchWindow : GeneralVehicleWindow {
|
struct SchdispatchWindow : GeneralVehicleWindow {
|
||||||
|
@@ -1770,15 +1770,9 @@ static bool DayLengthPreChange(int32 &new_value)
|
|||||||
|
|
||||||
static void DayLengthChanged(int32 new_value)
|
static void DayLengthChanged(int32 new_value)
|
||||||
{
|
{
|
||||||
DateTicksScaled old_scaled_date_ticks = _scaled_date_ticks;
|
|
||||||
DateTicksScaled old_scaled_date_ticks_offset = _scaled_date_ticks_offset;
|
|
||||||
|
|
||||||
extern void RebaseScaledDateTicksBase();
|
extern void RebaseScaledDateTicksBase();
|
||||||
RebaseScaledDateTicksBase();
|
RebaseScaledDateTicksBase();
|
||||||
|
|
||||||
extern void VehicleDayLengthChanged(DateTicksScaled old_scaled_date_ticks, DateTicksScaled old_scaled_date_ticks_offset, uint8 old_day_length_factor);
|
|
||||||
VehicleDayLengthChanged(old_scaled_date_ticks, old_scaled_date_ticks_offset, _pre_change_day_length_factor);
|
|
||||||
|
|
||||||
SetupTileLoopCounts();
|
SetupTileLoopCounts();
|
||||||
|
|
||||||
MarkWholeScreenDirty();
|
MarkWholeScreenDirty();
|
||||||
|
@@ -117,7 +117,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
|
|||||||
{ XSLFI_STATION_CATCHMENT_INC, XSCF_NULL, 1, 1, "station_catchment_inc", nullptr, nullptr, nullptr },
|
{ XSLFI_STATION_CATCHMENT_INC, XSCF_NULL, 1, 1, "station_catchment_inc", nullptr, nullptr, nullptr },
|
||||||
{ XSLFI_CUSTOM_BRIDGE_HEADS, XSCF_NULL, 4, 4, "custom_bridge_heads", nullptr, nullptr, nullptr },
|
{ XSLFI_CUSTOM_BRIDGE_HEADS, XSCF_NULL, 4, 4, "custom_bridge_heads", nullptr, nullptr, nullptr },
|
||||||
{ XSLFI_CHUNNEL, XSCF_NULL, 2, 2, "chunnel", nullptr, nullptr, "TUNN" },
|
{ XSLFI_CHUNNEL, XSCF_NULL, 2, 2, "chunnel", nullptr, nullptr, "TUNN" },
|
||||||
{ XSLFI_SCHEDULED_DISPATCH, XSCF_NULL, 4, 4, "scheduled_dispatch", nullptr, nullptr, nullptr },
|
{ XSLFI_SCHEDULED_DISPATCH, XSCF_NULL, 5, 5, "scheduled_dispatch", nullptr, nullptr, nullptr },
|
||||||
{ XSLFI_MORE_TOWN_GROWTH_RATES, XSCF_NULL, 1, 1, "more_town_growth_rates", nullptr, nullptr, nullptr },
|
{ XSLFI_MORE_TOWN_GROWTH_RATES, XSCF_NULL, 1, 1, "more_town_growth_rates", nullptr, nullptr, nullptr },
|
||||||
{ XSLFI_MULTIPLE_DOCKS, XSCF_NULL, 2, 2, "multiple_docks", nullptr, nullptr, nullptr },
|
{ XSLFI_MULTIPLE_DOCKS, XSCF_NULL, 2, 2, "multiple_docks", nullptr, nullptr, nullptr },
|
||||||
{ XSLFI_TIMETABLE_EXTRA, XSCF_NULL, 7, 7, "timetable_extra", nullptr, nullptr, "ORDX" },
|
{ XSLFI_TIMETABLE_EXTRA, XSCF_NULL, 7, 7, "timetable_extra", nullptr, nullptr, "ORDX" },
|
||||||
|
@@ -20,6 +20,9 @@ static uint32 _jokerpp_separation_mode;
|
|||||||
std::vector<OrderList *> _jokerpp_auto_separation;
|
std::vector<OrderList *> _jokerpp_auto_separation;
|
||||||
std::vector<OrderList *> _jokerpp_non_auto_separation;
|
std::vector<OrderList *> _jokerpp_non_auto_separation;
|
||||||
|
|
||||||
|
static uint16 _old_scheduled_dispatch_start_full_date_fract;
|
||||||
|
btree::btree_map<DispatchSchedule *, uint16> _old_scheduled_dispatch_start_full_date_fract_map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts this order from an old savegame's version;
|
* Converts this order from an old savegame's version;
|
||||||
* it moves all bits to the new location.
|
* it moves all bits to the new location.
|
||||||
@@ -263,8 +266,9 @@ SaveLoadTable GetDispatchScheduleDescription()
|
|||||||
static const SaveLoad _order_extra_info_desc[] = {
|
static const SaveLoad _order_extra_info_desc[] = {
|
||||||
SLE_VARVEC(DispatchSchedule, scheduled_dispatch, SLE_UINT32),
|
SLE_VARVEC(DispatchSchedule, scheduled_dispatch, SLE_UINT32),
|
||||||
SLE_VAR(DispatchSchedule, scheduled_dispatch_duration, SLE_UINT32),
|
SLE_VAR(DispatchSchedule, scheduled_dispatch_duration, SLE_UINT32),
|
||||||
SLE_VAR(DispatchSchedule, scheduled_dispatch_start_date, SLE_INT32),
|
SLE_CONDVAR_X(DispatchSchedule, scheduled_dispatch_start_tick, SLE_FILE_I32 | SLE_VAR_I64, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SCHEDULED_DISPATCH, 1, 4)),
|
||||||
SLE_VAR(DispatchSchedule, scheduled_dispatch_start_full_date_fract, SLE_UINT16),
|
SLEG_CONDVAR_X(_old_scheduled_dispatch_start_full_date_fract, SLE_UINT16, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SCHEDULED_DISPATCH, 1, 4)),
|
||||||
|
SLE_CONDVAR_X(DispatchSchedule, scheduled_dispatch_start_tick, SLE_INT64, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SCHEDULED_DISPATCH, 5)),
|
||||||
SLE_VAR(DispatchSchedule, scheduled_dispatch_last_dispatch, SLE_INT32),
|
SLE_VAR(DispatchSchedule, scheduled_dispatch_last_dispatch, SLE_INT32),
|
||||||
SLE_VAR(DispatchSchedule, scheduled_dispatch_max_delay, SLE_INT32),
|
SLE_VAR(DispatchSchedule, scheduled_dispatch_max_delay, SLE_INT32),
|
||||||
SLE_CONDSSTR_X(DispatchSchedule, name, 0, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SCHEDULED_DISPATCH, 4)),
|
SLE_CONDSSTR_X(DispatchSchedule, name, 0, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SCHEDULED_DISPATCH, 4)),
|
||||||
@@ -303,8 +307,11 @@ static void Load_ORDL()
|
|||||||
{
|
{
|
||||||
_jokerpp_auto_separation.clear();
|
_jokerpp_auto_separation.clear();
|
||||||
_jokerpp_non_auto_separation.clear();
|
_jokerpp_non_auto_separation.clear();
|
||||||
int index;
|
|
||||||
|
|
||||||
|
_old_scheduled_dispatch_start_full_date_fract = 0;
|
||||||
|
_old_scheduled_dispatch_start_full_date_fract_map.clear();
|
||||||
|
|
||||||
|
int index;
|
||||||
while ((index = SlIterateArray()) != -1) {
|
while ((index = SlIterateArray()) != -1) {
|
||||||
/* set num_orders to 0 so it's a valid OrderList */
|
/* set num_orders to 0 so it's a valid OrderList */
|
||||||
OrderList *list = new (index) OrderList(0);
|
OrderList *list = new (index) OrderList(0);
|
||||||
@@ -321,6 +328,9 @@ static void Load_ORDL()
|
|||||||
list->GetScheduledDispatchScheduleSet().resize(count);
|
list->GetScheduledDispatchScheduleSet().resize(count);
|
||||||
for (DispatchSchedule &ds : list->GetScheduledDispatchScheduleSet()) {
|
for (DispatchSchedule &ds : list->GetScheduledDispatchScheduleSet()) {
|
||||||
SlObject(&ds, GetDispatchScheduleDescription());
|
SlObject(&ds, GetDispatchScheduleDescription());
|
||||||
|
if (SlXvIsFeaturePresent(XSLFI_SCHEDULED_DISPATCH, 1, 4) && _old_scheduled_dispatch_start_full_date_fract != 0) {
|
||||||
|
_old_scheduled_dispatch_start_full_date_fract_map[&ds] = _old_scheduled_dispatch_start_full_date_fract;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4654,6 +4654,12 @@ void AdjustVehicleScaledTickBase(int64 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (OrderList *order_list : OrderList::Iterate()) {
|
||||||
|
for (DispatchSchedule &ds : order_list->GetScheduledDispatchScheduleSet()) {
|
||||||
|
ds.SetScheduledDispatchStartTick(ds.GetScheduledDispatchStartTick() + delta);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShiftVehicleDates(int interval)
|
void ShiftVehicleDates(int interval)
|
||||||
@@ -4665,25 +4671,6 @@ void ShiftVehicleDates(int interval)
|
|||||||
* for vehicles outside of a depot. */
|
* for vehicles outside of a depot. */
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void VehicleDayLengthChanged(DateTicksScaled old_scaled_date_ticks, DateTicksScaled old_scaled_date_ticks_offset, uint8 old_day_length_factor)
|
|
||||||
{
|
|
||||||
if (_settings_game.economy.day_length_factor == old_day_length_factor || !_settings_game.game_time.time_in_minutes) return;
|
|
||||||
|
|
||||||
for (OrderList *orderlist : OrderList::Iterate()) {
|
|
||||||
for (DispatchSchedule &ds : orderlist->GetScheduledDispatchScheduleSet()) {
|
|
||||||
if (ds.GetScheduledDispatchStartDatePart() >= 0) {
|
|
||||||
DateTicksScaled start = ((int64)ds.GetScheduledDispatchStartDatePart() * DAY_TICKS * old_day_length_factor) +
|
|
||||||
ds.GetScheduledDispatchStartDateFractPart() + old_scaled_date_ticks_offset;
|
|
||||||
start += (_scaled_date_ticks - old_scaled_date_ticks);
|
|
||||||
Date date;
|
|
||||||
uint16 full_date_fract;
|
|
||||||
std::tie(date, full_date_fract) = ScaledDateTicksToDateAndFullSubTicks(start);
|
|
||||||
ds.SetScheduledDispatchStartDate(date, full_date_fract);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculates the maximum weight of the ground vehicle when loaded.
|
* Calculates the maximum weight of the ground vehicle when loaded.
|
||||||
* @return Weight in tonnes
|
* @return Weight in tonnes
|
||||||
|
Reference in New Issue
Block a user