(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.

This commit is contained in:
rubidium
2008-07-14 21:01:49 +00:00
parent 68613f4ba0
commit 2e68b35106
5 changed files with 32 additions and 16 deletions

View File

@@ -2738,9 +2738,11 @@ STR_CONDITIONAL_UNCONDITIONAL :Jump to order {
STR_CONDITIONAL_NUM :Jump to order {COMMA} when {STRING} {STRING} {COMMA} STR_CONDITIONAL_NUM :Jump to order {COMMA} when {STRING} {STRING} {COMMA}
STR_CONDITIONAL_TRUE_FALSE :Jump to order {COMMA} when {STRING} {STRING} 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_NOT_TIMETABLED :{SETX 30}Travel (not timetabled)
STR_TIMETABLE_TRAVEL_FOR :{SETX 30}Travel for {STRING1} STR_TIMETABLE_TRAVEL_FOR :{SETX 30}Travel for {STRING1}
STR_TIMETABLE_STAY_FOR :and stay 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_DAYS :{COMMA} day{P "" s}
STR_TIMETABLE_TICKS :{COMMA} tick{P "" s} STR_TIMETABLE_TICKS :{COMMA} tick{P "" s}

View File

@@ -1694,10 +1694,12 @@ static bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_dept
case OT_CONDITIONAL: { case OT_CONDITIONAL: {
VehicleOrderID next_order = ProcessConditionalOrder(order, v); VehicleOrderID next_order = ProcessConditionalOrder(order, v);
UpdateVehicleTimetable(v, true);
if (next_order != INVALID_VEH_ORDER_ID) { if (next_order != INVALID_VEH_ORDER_ID) {
UpdateVehicleTimetable(v, false);
v->cur_order_index = next_order; v->cur_order_index = next_order;
v->current_order_time += GetVehicleOrder(v, next_order)->travel_time;
} else { } else {
UpdateVehicleTimetable(v, true);
v->cur_order_index++; v->cur_order_index++;
} }

View File

@@ -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); if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value);
SetDParam(5, 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; break;
default: NOT_REACHED(); default: NOT_REACHED();

View File

@@ -69,8 +69,10 @@ CommandCost CmdChangeTimetable(TileIndex tile, uint32 flags, uint32 p1, uint32 p
bool packed_time = HasBit(p1, 25); bool packed_time = HasBit(p1, 25);
bool is_journey = HasBit(p1, 24) || packed_time; bool is_journey = HasBit(p1, 24) || packed_time;
if (!is_journey) { 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); 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) { if (flags & DC_EXEC) {
@@ -175,7 +177,9 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling)
* adjusted later by people who aren't. */ * adjusted later by people who aren't. */
time_taken = (((time_taken - 1) / DAY_TICKS) + 1) * DAY_TICKS; 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; return;
} else if (v->cur_order_index == 0) { } else if (v->cur_order_index == 0) {
/* Otherwise if we're at the beginning and it already has a value, /* Otherwise if we're at the beginning and it already has a value,

View File

@@ -84,20 +84,19 @@ struct TimetableWindow : Window {
SetVScrollCount(this, v->num_orders * 2); SetVScrollCount(this, v->num_orders * 2);
if (v->owner == _local_player) { if (v->owner == _local_player) {
if (selected == -1) { bool disable = true;
this->DisableWidget(TTV_CHANGE_TIME); if (selected != -1) {
this->DisableWidget(TTV_CLEAR_TIME);
} else if (selected % 2 == 1) {
this->EnableWidget(TTV_CHANGE_TIME);
this->EnableWidget(TTV_CLEAR_TIME);
} else {
const Order *order = GetVehicleOrder(v, (selected + 1) / 2); 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);
this->SetWidgetDisabledState(TTV_CHANGE_TIME, disable); } else {
this->SetWidgetDisabledState(TTV_CLEAR_TIME, disable); 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_RESET_LATENESS);
this->EnableWidget(TTV_AUTOFILL); this->EnableWidget(TTV_AUTOFILL);
} else { } else {
@@ -137,7 +136,9 @@ struct TimetableWindow : Window {
} else { } else {
StringID string; 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; string = STR_TIMETABLE_TRAVEL_NOT_TIMETABLED;
} else { } else {
SetTimetableParams(0, 1, order->travel_time); 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) { for (const Order *order = GetVehicleOrder(v, 0); order != NULL; order = order->next) {
total_time += order->travel_time + order->wait_time; 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 (order->wait_time == 0 && order->IsType(OT_GOTO_STATION) && !(order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) complete = false;
} }