(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.
authorrubidium
Mon, 14 Jul 2008 21:01:49 +0000
changeset 11146 fb7703b62a99
parent 11145 5e43414d6351
child 11147 d009bad829a6
(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.
src/lang/english.txt
src/order_cmd.cpp
src/order_gui.cpp
src/timetable_cmd.cpp
src/timetable_gui.cpp
--- 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;
 			}