2107 if (v->type != VEH_TRAIN || !CheckOwnership(v->owner)) return CMD_ERROR; |
2107 if (v->type != VEH_TRAIN || !CheckOwnership(v->owner)) return CMD_ERROR; |
2108 |
2108 |
2109 if (v->vehstatus & VS_CRASHED) return CMD_ERROR; |
2109 if (v->vehstatus & VS_CRASHED) return CMD_ERROR; |
2110 |
2110 |
2111 if (v->current_order.IsType(OT_GOTO_DEPOT)) { |
2111 if (v->current_order.IsType(OT_GOTO_DEPOT)) { |
2112 bool halt_in_depot = HasBit(v->current_order.GetDepotActionType(), OF_HALT_IN_DEPOT); |
2112 bool halt_in_depot = v->current_order.GetDepotActionType() & ODATFB_HALT; |
2113 if (!!(p2 & DEPOT_SERVICE) == halt_in_depot) { |
2113 if (!!(p2 & DEPOT_SERVICE) == halt_in_depot) { |
2114 /* We called with a different DEPOT_SERVICE setting. |
2114 /* We called with a different DEPOT_SERVICE setting. |
2115 * Now we change the setting to apply the new one and let the vehicle head for the same depot. |
2115 * Now we change the setting to apply the new one and let the vehicle head for the same depot. |
2116 * Note: the if is (true for requesting service == true for ordered to stop in depot) */ |
2116 * Note: the if is (true for requesting service == true for ordered to stop in depot) */ |
2117 if (flags & DC_EXEC) { |
2117 if (flags & DC_EXEC) { |
2118 v->current_order.SetDepotOrderType(OFB_MANUAL_ORDER); |
2118 v->current_order.SetDepotOrderType(ODTF_MANUAL); |
2119 v->current_order.SetDepotActionType(halt_in_depot ? OFB_NORMAL_ACTION : OFB_HALT_IN_DEPOT); |
2119 v->current_order.SetDepotActionType(halt_in_depot ? ODATF_SERVICE_ONLY : ODATFB_HALT); |
2120 InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); |
2120 InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); |
2121 } |
2121 } |
2122 return CommandCost(); |
2122 return CommandCost(); |
2123 } |
2123 } |
2124 |
2124 |
2125 if (p2 & DEPOT_DONT_CANCEL) return CMD_ERROR; // Requested no cancelation of depot orders |
2125 if (p2 & DEPOT_DONT_CANCEL) return CMD_ERROR; // Requested no cancelation of depot orders |
2126 if (flags & DC_EXEC) { |
2126 if (flags & DC_EXEC) { |
2127 /* If the orders to 'goto depot' are in the orders list (forced servicing), |
2127 /* If the orders to 'goto depot' are in the orders list (forced servicing), |
2128 * then skip to the next order; effectively cancelling this forced service */ |
2128 * then skip to the next order; effectively cancelling this forced service */ |
2129 if (v->current_order.GetDepotOrderType() & OFB_PART_OF_ORDERS) v->cur_order_index++; |
2129 if (v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) v->cur_order_index++; |
2130 |
2130 |
2131 v->current_order.MakeDummy(); |
2131 v->current_order.MakeDummy(); |
2132 InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); |
2132 InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); |
2133 } |
2133 } |
2134 return CommandCost(); |
2134 return CommandCost(); |
2143 |
2143 |
2144 if (flags & DC_EXEC) { |
2144 if (flags & DC_EXEC) { |
2145 if (v->current_order.IsType(OT_LOADING)) v->LeaveStation(); |
2145 if (v->current_order.IsType(OT_LOADING)) v->LeaveStation(); |
2146 |
2146 |
2147 v->dest_tile = tfdd.tile; |
2147 v->dest_tile = tfdd.tile; |
2148 v->current_order.MakeGoToDepot(GetDepotByTile(tfdd.tile)->index, false); |
2148 v->current_order.MakeGoToDepot(GetDepotByTile(tfdd.tile)->index, ODTF_MANUAL); |
2149 if (!(p2 & DEPOT_SERVICE)) v->current_order.SetDepotActionType(OFB_HALT_IN_DEPOT); |
2149 if (!(p2 & DEPOT_SERVICE)) v->current_order.SetDepotActionType(ODATFB_HALT); |
2150 InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); |
2150 InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); |
2151 /* If there is no depot in front, reverse automatically */ |
2151 /* If there is no depot in front, reverse automatically */ |
2152 if (tfdd.reverse) DoCommand(v->tile, v->index, 0, DC_EXEC, CMD_REVERSE_TRAIN_DIRECTION); |
2152 if (tfdd.reverse) DoCommand(v->tile, v->index, 0, DC_EXEC, CMD_REVERSE_TRAIN_DIRECTION); |
2153 } |
2153 } |
2154 |
2154 |
3568 v->current_order.GetDestination() != depot->index && |
3568 v->current_order.GetDestination() != depot->index && |
3569 !Chance16(3, 16)) { |
3569 !Chance16(3, 16)) { |
3570 return; |
3570 return; |
3571 } |
3571 } |
3572 |
3572 |
3573 v->current_order.MakeGoToDepot(depot->index, false); |
3573 v->current_order.MakeGoToDepot(depot->index, ODTFB_SERVICE); |
3574 v->dest_tile = tfdd.tile; |
3574 v->dest_tile = tfdd.tile; |
3575 InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); |
3575 InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); |
3576 } |
3576 } |
3577 |
3577 |
3578 void Train::OnNewDay() |
3578 void Train::OnNewDay() |