Changeset - r9641:a78fbf5c85cc
[Not reviewed]
master
0 5 0
rubidium - 16 years ago 2008-07-14 21:01:49
rubidium@openttd.org
(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.
5 files changed with 32 insertions and 16 deletions:
0 comments (0 inline, 0 general)
src/lang/english.txt
Show inline comments
 
@@ -2735,15 +2735,17 @@ STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE
 
STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE                       :is false
 
STR_CONDITIONAL_VALUE                                           :{SKIP}{BLACK}{COMMA}
 
STR_CONDITIONAL_UNCONDITIONAL                                   :Jump to order {COMMA}
 
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}
 

	
 
STR_HEADING_FOR_TRAIN_DEPOT                                     :{ORANGE}Heading for {TOWN} Train Depot
 
STR_HEADING_FOR_TRAIN_DEPOT_VEL                                 :{ORANGE}Heading for {TOWN} Train Depot, {VELOCITY}
 
STR_HEADING_FOR_TRAIN_DEPOT_SERVICE                             :{LTBLUE}Service at {TOWN} Train Depot
src/order_cmd.cpp
Show inline comments
 
@@ -1691,16 +1691,18 @@ static bool UpdateOrderDest(Vehicle *v, 
 
		case OT_GOTO_WAYPOINT:
 
			v->dest_tile = GetWaypoint(order->GetDestination())->xy;
 
			break;
 

	
 
		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++;
 
			}
 

	
 
			if (conditional_depth > v->num_orders) return false;
 

	
 
			/* Get the current order */
src/order_gui.cpp
Show inline comments
 
@@ -248,12 +248,19 @@ void DrawOrderString(const Vehicle *v, c
 
				SetDParam(4, STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS + occ);
 

	
 
				uint value = order->GetConditionValue();
 
				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();
 
	}
 

	
 
	SetDParam(0, order_index + 1);
src/timetable_cmd.cpp
Show inline comments
 
@@ -66,14 +66,16 @@ CommandCost CmdChangeTimetable(TileIndex
 
	Order *order = GetVehicleOrder(v, order_number);
 
	if (order == NULL) return CMD_ERROR;
 

	
 
	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) {
 
		ChangeTimetable(v, order_number, GB(p2, 0, 16), is_journey);
 
		if (packed_time) ChangeTimetable(v, order_number, GB(p2, 16, 16), false);
 
	}
 
@@ -172,13 +174,15 @@ void UpdateVehicleTimetable(Vehicle *v, 
 
		if (timetabled == 0) {
 
			/* Round the time taken up to the nearest day, as this will avoid
 
			 * confusion for people who are timetabling in days, and can be
 
			 * 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,
 
			 * assume that autofill is finished and turn it off again. */
 
			ClrBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
 
		}
src/timetable_gui.cpp
Show inline comments
 
@@ -81,25 +81,24 @@ struct TimetableWindow : Window {
 
		const Vehicle *v = GetVehicle(this->window_number);
 
		int selected = this->sel_index;
 

	
 
		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);
 
		} else {
 
			this->DisableWidget(TTV_CHANGE_TIME);
 
			this->DisableWidget(TTV_CLEAR_TIME);
 
@@ -134,13 +133,15 @@ struct TimetableWindow : Window {
 
				} else {
 
					order = order->next;
 
				}
 
			} 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);
 
					string = STR_TIMETABLE_TRAVEL_FOR;
 
				}
 

	
 
@@ -158,13 +159,13 @@ struct TimetableWindow : Window {
 
		{
 
			uint total_time = 0;
 
			bool complete = true;
 

	
 
			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;
 
			}
 

	
 
			if (total_time != 0) {
 
				SetTimetableParams(0, 1, total_time);
 
				DrawString(2, y, complete ? STR_TIMETABLE_TOTAL_TIME : STR_TIMETABLE_TOTAL_TIME_INCOMPLETE, TC_BLACK);
0 comments (0 inline, 0 general)