Fix handling, display and input of hhmm times in timetables

With high ticks/min and day length values
This commit is contained in:
Jonathan G Rennison
2019-01-30 20:31:39 +00:00
parent b93a4d6daa
commit 32353fdf03
2 changed files with 8 additions and 8 deletions

View File

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

View File

@@ -591,7 +591,7 @@ struct TimetableWindow : Window {
/* We are running towards the first station so we can start the /* We are running towards the first station so we can start the
* timetable at the given time. */ * timetable at the given time. */
SetDParam(0, STR_JUST_DATE_WALLCLOCK_TINY); SetDParam(0, STR_JUST_DATE_WALLCLOCK_TINY);
SetDParam(1, (v->timetable_start * _settings_game.economy.day_length_factor) + v->timetable_start_subticks); SetDParam(1, (((DateTicksScaled) v->timetable_start) * _settings_game.economy.day_length_factor) + v->timetable_start_subticks);
DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_TIMETABLE_STATUS_START_AT); DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_TIMETABLE_STATUS_START_AT);
} else if (!HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) { } else if (!HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) {
/* We aren't running on a timetable yet, so how can we be "on time" /* We aren't running on a timetable yet, so how can we be "on time"
@@ -937,12 +937,12 @@ struct TimetableWindow : Window {
if (val >= 0 && end && *end == 0) { if (val >= 0 && end && *end == 0) {
uint minutes = (val % 100) % 60; uint minutes = (val % 100) % 60;
uint hours = (val / 100) % 24; uint hours = (val / 100) % 24;
val = MINUTES_DATE(MINUTES_DAY(CURRENT_MINUTE), hours, minutes); DateTicksScaled time = MINUTES_DATE(MINUTES_DAY(CURRENT_MINUTE), hours, minutes);
val -= _settings_client.gui.clock_offset; time -= _settings_client.gui.clock_offset;
if (val < (CURRENT_MINUTE - 60)) val += 60 * 24; if (time < (CURRENT_MINUTE - 60)) time += 60 * 24;
val *= _settings_client.gui.ticks_per_minute; time *= _settings_client.gui.ticks_per_minute;
ChangeTimetableStartIntl(v->index | (this->set_start_date_all ? 1 << 20 : 0), val); ChangeTimetableStartIntl(v->index | (this->set_start_date_all ? 1 << 20 : 0), time);
} }
break; break;
} }