Import timetabling wait time in depots patch

http://www.tt-forums.net/viewtopic.php?f=33&t=70969
This commit is contained in:
patch-import
2015-08-03 01:06:05 +01:00
committed by Jonathan G Rennison
parent 498556d6ce
commit d8c5de188f
12 changed files with 81 additions and 4 deletions

View File

@@ -1362,6 +1362,11 @@ static void AircraftEventHandler_InHangar(Aircraft *v, const AirportFTAClass *ap
return;
}
if (v->current_order.IsWaitTimetabled())
v->HandleWaiting(false);
if (v->current_order.IsType(OT_WAITING))
return;
/* if we were sent to the depot, stay there */
if (v->current_order.IsType(OT_GOTO_DEPOT) && (v->vehstatus & VS_STOPPED)) {
v->current_order.Free();

View File

@@ -78,6 +78,7 @@ public:
void MakeDummy();
void MakeConditional(VehicleOrderID order);
void MakeImplicit(StationID destination);
void MakeWaiting();
/**
* Is this a 'goto' order with a real destination?

View File

@@ -158,6 +158,11 @@ void Order::MakeImplicit(StationID destination)
this->dest = destination;
}
void Order::MakeWaiting()
{
this->type = OT_WAITING;
}
/**
* Make this depot/station order also a refit order.
* @param cargo the cargo type to change to.
@@ -1155,6 +1160,7 @@ CommandCost CmdSkipToOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
if (flags & DC_EXEC) {
if (v->current_order.IsType(OT_LOADING)) v->LeaveStation();
if (v->current_order.IsType(OT_WAITING)) v->HandleWaiting(true);
v->cur_implicit_order_index = v->cur_real_order_index = sel_ord;
v->UpdateRealOrderIndex();
@@ -2165,6 +2171,9 @@ bool ProcessOrders(Vehicle *v)
case OT_LOADING:
return false;
case OT_WAITING:
return false;
case OT_LEAVESTATION:
if (v->type != VEH_AIRCRAFT) return false;
break;

View File

@@ -312,6 +312,13 @@ void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int
SetDParam(5, (order->GetDepotActionType() & ODATFB_HALT) ? STR_ORDER_REFIT_STOP_ORDER : STR_ORDER_REFIT_ORDER);
SetDParam(6, CargoSpec::Get(order->GetRefitCargo())->name);
}
if (timetable) {
if (order->GetWaitTime() > 0) {
SetDParam(5, order->IsWaitTimetabled() ? STR_TIMETABLE_STAY_FOR : STR_TIMETABLE_STAY_FOR_ESTIMATED);
SetTimetableParams(6, 7, order->GetWaitTime());
}
}
break;
case OT_GOTO_WAYPOINT:

View File

@@ -45,6 +45,7 @@ enum OrderType {
OT_GOTO_WAYPOINT = 6,
OT_CONDITIONAL = 7,
OT_IMPLICIT = 8,
OT_WAITING = 9,
OT_END
};

View File

@@ -1531,6 +1531,9 @@ static bool RoadVehController(RoadVehicle *v)
if (v->current_order.IsType(OT_LOADING)) return true;
v->HandleWaiting(false);
if (v->current_order.IsType(OT_WAITING)) return true;
if (v->IsInDepot() && RoadVehLeaveDepot(v, true)) return true;
v->ShowVisualEffect();

View File

@@ -316,6 +316,11 @@ static bool CheckShipLeaveDepot(Ship *v)
{
if (!v->IsChainInDepot()) return false;
if (v->current_order.IsWaitTimetabled())
v->HandleWaiting(false);
if (v->current_order.IsType(OT_WAITING))
return true;
/* We are leaving a depot, but have to go to the exact same one; re-enter */
if (v->current_order.IsType(OT_GOTO_DEPOT) &&
IsShipDepotTile(v->tile) && GetDepotIndex(v->tile) == v->current_order.GetDestination()) {

View File

@@ -143,6 +143,9 @@ CommandCost CmdChangeTimetable(TileIndex tile, DoCommandFlag flags, uint32 p1, u
if (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) return_cmd_error(STR_ERROR_TIMETABLE_NOT_STOPPING_HERE);
break;
case OT_GOTO_DEPOT:
break;
case OT_CONDITIONAL:
break;

View File

@@ -181,7 +181,7 @@ struct TimetableWindow : Window {
{
assert(HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED));
bool travelling = (!v->current_order.IsType(OT_LOADING) || v->current_order.GetNonStopType() == ONSF_STOP_EVERYWHERE);
bool travelling = (!(v->current_order.IsType(OT_LOADING) || v->current_order.IsType(OT_WAITING)) || v->current_order.GetNonStopType() == ONSF_STOP_EVERYWHERE);
Ticks start_time = _date_fract - v->current_order_time;
FillTimetableArrivalDepartureTable(v, v->cur_real_order_index % v->GetNumOrders(), travelling, table, start_time);
@@ -310,7 +310,7 @@ struct TimetableWindow : Window {
if (selected % 2 == 1) {
disable = order != NULL && (order->IsType(OT_CONDITIONAL) || order->IsType(OT_IMPLICIT));
} else {
disable = order == NULL || ((!order->IsType(OT_GOTO_STATION) || (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) && !order->IsType(OT_CONDITIONAL));
disable = order == NULL || ((!(order->IsType(OT_GOTO_STATION) || (order->IsType(OT_GOTO_DEPOT) && !(order->GetDepotActionType() & ODATFB_HALT))) || (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) && !order->IsType(OT_CONDITIONAL));
}
}
bool disable_speed = disable || selected % 2 != 1 || v->type == VEH_AIRCRAFT;

View File

@@ -2131,6 +2131,11 @@ static bool CheckTrainStayInDepot(Train *v)
return true;
}
if (v->current_order.IsWaitTimetabled())
v->HandleWaiting(false);
if (v->current_order.IsType(OT_WAITING))
return true;
SigSegState seg_state;
if (v->force_proceed == TFP_NONE) {

View File

@@ -1437,12 +1437,21 @@ void VehicleEnterDepot(Vehicle *v)
}
}
/* Handle the ODTFB_PART_OF_ORDERS case. If there is a timetabled wait time, hold the train, otherwise skip to the next order.
Note that if there is a only a travel_time, but no wait_time defined for the order, and the train arrives to the depot sooner as scheduled,
he doesn't wait in it, as it would in stations. Thus, the original behaviour is maintained if there's no defined wait_time.*/
if (v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) {
/* Part of orders */
v->DeleteUnreachedImplicitOrders();
UpdateVehicleTimetable(v, true);
v->IncrementImplicitOrderIndex();
if (v->current_order.IsWaitTimetabled()) {
v->current_order.MakeWaiting();
v->current_order.SetNonStopType(ONSF_NO_STOP_AT_ANY_STATION);
return;
} else {
v->IncrementImplicitOrderIndex();
}
}
if (v->current_order.GetDepotActionType() & ODATFB_HALT) {
/* Vehicles are always stopped on entering depots. Do not restart this one. */
_vehicles_to_autoreplace[v] = false;
@@ -2167,6 +2176,33 @@ void Vehicle::HandleLoading(bool mode)
this->IncrementImplicitOrderIndex();
}
/**
* Handle the waiting time everywhere else as in stations (basically in depot but, eventually, also elsewhere ?)
* Function is called when order's wait_time is defined.
* @param stop_waiting should we stop waiting (or definitely avoid) even if there is still time left to wait ?
*/
void Vehicle::HandleWaiting(bool stop_waiting)
{
switch (this->current_order.GetType()) {
case OT_WAITING: {
uint wait_time = max(this->current_order.GetTimetabledWait() - this->lateness_counter, 0);
/* Vehicles holds on until waiting Timetabled time expires. */
if (!stop_waiting && this->current_order_time < wait_time) {
return;
}
/* When wait_time is expired, we move on. */
UpdateVehicleTimetable(this, false);
this->IncrementImplicitOrderIndex();
this->current_order.MakeDummy();
break;
}
default: return;
}
}
/**
* Get a map of cargoes and free capacities in the consist.
* @param capacities Map to be filled with cargoes and capacities.

View File

@@ -279,6 +279,8 @@ public:
void HandleLoading(bool mode = false);
void HandleWaiting(bool stop_waiting = false);
void GetConsistFreeCapacities(SmallMap<CargoID, uint> &capacities) const;
uint GetConsistTotalCapacity() const;