mirror of https://github.com/OpenTTD/OpenTTD
(svn r13704) -Fix: make timetables work more sensible when used in conjunction with conditional orders, i.e. make it possibly to tell how long to travel to the next destination if you jump.
parent
797ccc8b49
commit
0f4d9a8e49
|
@ -2738,9 +2738,11 @@ STR_CONDITIONAL_UNCONDITIONAL :Jump to order {
|
|||
STR_CONDITIONAL_NUM :Jump to order {COMMA} when {STRING} {STRING} {COMMA}
|
||||
STR_CONDITIONAL_TRUE_FALSE :Jump to order {COMMA} when {STRING} {STRING}
|
||||
|
||||
STR_TIMETABLE_NO_TRAVEL :{SETX 30}No travel
|
||||
STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :{SETX 30}Travel (not timetabled)
|
||||
STR_TIMETABLE_TRAVEL_FOR :{SETX 30}Travel for {STRING1}
|
||||
STR_TIMETABLE_STAY_FOR :and stay for {STRING1}
|
||||
STR_TIMETABLE_AND_TRAVEL_FOR :and travel for {STRING1}
|
||||
STR_TIMETABLE_DAYS :{COMMA} day{P "" s}
|
||||
STR_TIMETABLE_TICKS :{COMMA} tick{P "" s}
|
||||
|
||||
|
|
|
@ -1694,10 +1694,12 @@ static bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_dept
|
|||
|
||||
case OT_CONDITIONAL: {
|
||||
VehicleOrderID next_order = ProcessConditionalOrder(order, v);
|
||||
UpdateVehicleTimetable(v, true);
|
||||
if (next_order != INVALID_VEH_ORDER_ID) {
|
||||
UpdateVehicleTimetable(v, false);
|
||||
v->cur_order_index = next_order;
|
||||
v->current_order_time += GetVehicleOrder(v, next_order)->travel_time;
|
||||
} else {
|
||||
UpdateVehicleTimetable(v, true);
|
||||
v->cur_order_index++;
|
||||
}
|
||||
|
||||
|
|
|
@ -251,6 +251,13 @@ void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int
|
|||
if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value);
|
||||
SetDParam(5, value);
|
||||
}
|
||||
|
||||
if (timetable && order->wait_time > 0) {
|
||||
SetDParam(6, STR_TIMETABLE_AND_TRAVEL_FOR);
|
||||
SetTimetableParams(7, 8, order->wait_time);
|
||||
} else {
|
||||
SetDParam(6, STR_EMPTY);
|
||||
}
|
||||
break;
|
||||
|
||||
default: NOT_REACHED();
|
||||
|
|
|
@ -69,8 +69,10 @@ CommandCost CmdChangeTimetable(TileIndex tile, uint32 flags, uint32 p1, uint32 p
|
|||
bool packed_time = HasBit(p1, 25);
|
||||
bool is_journey = HasBit(p1, 24) || packed_time;
|
||||
if (!is_journey) {
|
||||
if (!order->IsType(OT_GOTO_STATION)) return_cmd_error(STR_TIMETABLE_ONLY_WAIT_AT_STATIONS);
|
||||
if (!order->IsType(OT_GOTO_STATION) && !order->IsType(OT_CONDITIONAL)) return_cmd_error(STR_TIMETABLE_ONLY_WAIT_AT_STATIONS);
|
||||
if (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) return_cmd_error(STR_TIMETABLE_NOT_STOPPING_HERE);
|
||||
} else {
|
||||
if (order->IsType(OT_CONDITIONAL)) return CMD_ERROR;
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
|
@ -175,7 +177,9 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling)
|
|||
* adjusted later by people who aren't. */
|
||||
time_taken = (((time_taken - 1) / DAY_TICKS) + 1) * DAY_TICKS;
|
||||
|
||||
ChangeTimetable(v, v->cur_order_index, time_taken, travelling);
|
||||
if (!v->current_order.IsType(OT_CONDITIONAL)) {
|
||||
ChangeTimetable(v, v->cur_order_index, time_taken, travelling);
|
||||
}
|
||||
return;
|
||||
} else if (v->cur_order_index == 0) {
|
||||
/* Otherwise if we're at the beginning and it already has a value,
|
||||
|
|
|
@ -84,20 +84,19 @@ struct TimetableWindow : Window {
|
|||
SetVScrollCount(this, v->num_orders * 2);
|
||||
|
||||
if (v->owner == _local_player) {
|
||||
if (selected == -1) {
|
||||
this->DisableWidget(TTV_CHANGE_TIME);
|
||||
this->DisableWidget(TTV_CLEAR_TIME);
|
||||
} else if (selected % 2 == 1) {
|
||||
this->EnableWidget(TTV_CHANGE_TIME);
|
||||
this->EnableWidget(TTV_CLEAR_TIME);
|
||||
} else {
|
||||
bool disable = true;
|
||||
if (selected != -1) {
|
||||
const Order *order = GetVehicleOrder(v, (selected + 1) / 2);
|
||||
bool disable = order == NULL || !order->IsType(OT_GOTO_STATION) || (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION);
|
||||
|
||||
this->SetWidgetDisabledState(TTV_CHANGE_TIME, disable);
|
||||
this->SetWidgetDisabledState(TTV_CLEAR_TIME, disable);
|
||||
if (selected % 2 == 1) {
|
||||
disable = order != NULL && order->IsType(OT_CONDITIONAL);
|
||||
} else {
|
||||
disable = order == NULL || ((!order->IsType(OT_GOTO_STATION) || (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) && !order->IsType(OT_CONDITIONAL));
|
||||
}
|
||||
}
|
||||
|
||||
this->SetWidgetDisabledState(TTV_CHANGE_TIME, disable);
|
||||
this->SetWidgetDisabledState(TTV_CLEAR_TIME, disable);
|
||||
|
||||
this->EnableWidget(TTV_RESET_LATENESS);
|
||||
this->EnableWidget(TTV_AUTOFILL);
|
||||
} else {
|
||||
|
@ -137,7 +136,9 @@ struct TimetableWindow : Window {
|
|||
} else {
|
||||
StringID string;
|
||||
|
||||
if (order->travel_time == 0) {
|
||||
if (order->IsType(OT_CONDITIONAL)) {
|
||||
string = STR_TIMETABLE_NO_TRAVEL;
|
||||
} else if (order->travel_time == 0) {
|
||||
string = STR_TIMETABLE_TRAVEL_NOT_TIMETABLED;
|
||||
} else {
|
||||
SetTimetableParams(0, 1, order->travel_time);
|
||||
|
@ -161,7 +162,7 @@ struct TimetableWindow : Window {
|
|||
|
||||
for (const Order *order = GetVehicleOrder(v, 0); order != NULL; order = order->next) {
|
||||
total_time += order->travel_time + order->wait_time;
|
||||
if (order->travel_time == 0) complete = false;
|
||||
if (order->travel_time == 0 && !order->IsType(OT_CONDITIONAL)) complete = false;
|
||||
if (order->wait_time == 0 && order->IsType(OT_GOTO_STATION) && !(order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) complete = false;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue