(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.
--- a/src/lang/english.txt Mon Jul 14 20:36:21 2008 +0000
+++ b/src/lang/english.txt Mon Jul 14 21:01:49 2008 +0000
@@ -2738,9 +2738,11 @@
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}
--- a/src/order_cmd.cpp Mon Jul 14 20:36:21 2008 +0000
+++ b/src/order_cmd.cpp Mon Jul 14 21:01:49 2008 +0000
@@ -1694,10 +1694,12 @@
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++;
}
--- a/src/order_gui.cpp Mon Jul 14 20:36:21 2008 +0000
+++ b/src/order_gui.cpp Mon Jul 14 21:01:49 2008 +0000
@@ -251,6 +251,13 @@
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();
--- a/src/timetable_cmd.cpp Mon Jul 14 20:36:21 2008 +0000
+++ b/src/timetable_cmd.cpp Mon Jul 14 21:01:49 2008 +0000
@@ -69,8 +69,10 @@
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 @@
* 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,
--- a/src/timetable_gui.cpp Mon Jul 14 20:36:21 2008 +0000
+++ b/src/timetable_gui.cpp Mon Jul 14 21:01:49 2008 +0000
@@ -84,19 +84,18 @@
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);
+ 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->SetWidgetDisabledState(TTV_CHANGE_TIME, disable);
+ this->SetWidgetDisabledState(TTV_CLEAR_TIME, disable);
this->EnableWidget(TTV_RESET_LATENESS);
this->EnableWidget(TTV_AUTOFILL);
@@ -137,7 +136,9 @@
} 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 @@
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;
}