@@ -2410,25 +2410,25 @@ static VehicleEnterTileStatus VehicleEnt
fract_coord = (x & 0xF) + ((y & 0xF) << 4);
if (_fractcoords_behind[dir] == fract_coord) {
/* make sure a train is not entering the tile from behind */
return VETSB_CANNOT_ENTER;
} else if (_fractcoords_enter[dir] == fract_coord) {
if (DiagDirToDir(ReverseDiagDir(dir)) == v->direction) {
/* enter the depot */
v->track = TRACK_BIT_DEPOT,
v->vehstatus |= VS_HIDDEN; // hide it
v->direction = ReverseDir(v->direction);
if (v->Next() == NULL) VehicleEnterDepot(v);
if (v->Next() == NULL) VehicleEnterDepot(v->First());
v->tile = tile;
InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
return VETSB_ENTERED_WORMHOLE;
}
} else if (fract_coord_leave == fract_coord) {
if (DiagDirToDir(dir) == v->direction) {
/* leave the depot? */
if ((v = v->Next()) != NULL) {
v->vehstatus &= ~VS_HIDDEN;
v->track = (DiagDirToAxis(dir) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y);
@@ -1541,25 +1541,25 @@ static const byte _roadveh_enter_depot_d
static VehicleEnterTileStatus VehicleEnter_Road(Vehicle *v, TileIndex tile, int x, int y)
{
switch (GetRoadTileType(tile)) {
case ROAD_TILE_DEPOT: {
if (v->type != VEH_ROAD) break;
RoadVehicle *rv = RoadVehicle::From(v);
if (rv->frame == RVC_DEPOT_STOP_FRAME &&
_roadveh_enter_depot_dir[GetRoadDepotDirection(tile)] == rv->state) {
rv->state = RVSB_IN_DEPOT;
rv->vehstatus |= VS_HIDDEN;
rv->direction = ReverseDir(rv->direction);
if (rv->Next() == NULL) VehicleEnterDepot(rv);
if (rv->Next() == NULL) VehicleEnterDepot(rv->First());
rv->tile = tile;
InvalidateWindowData(WC_VEHICLE_DEPOT, rv->tile);
} break;
default: break;
return VETSB_CONTINUE;
@@ -945,43 +945,44 @@ uint8 CalcPercentVehicleFilled(const Veh
/* Train without capacity */
if (max == 0) return 100;
/* Return the percentage */
return (count * 100) / max;
void VehicleEnterDepot(Vehicle *v)
/* Always work with the front of the vehicle */
assert(v == v->First());
switch (v->type) {
case VEH_TRAIN: {
Train *t = Train::From(v);
InvalidateWindowClasses(WC_TRAINS_LIST);
/* Clear path reservation */
SetDepotReservation(t->tile, false);
if (_settings_client.gui.show_track_reservation) MarkTileDirtyByTile(t->tile);
if (!t->IsFrontEngine()) t = t->First();
UpdateSignalsOnSegment(t->tile, INVALID_DIAGDIR, t->owner);
t->load_unload_time_rem = 0;
ClrBit(t->flags, VRF_TOGGLE_REVERSE);
TrainConsistChanged(t, true);
break;
case VEH_ROAD:
InvalidateWindowClasses(WC_ROADVEH_LIST);
if (!RoadVehicle::From(v)->IsRoadVehFront()) v = v->First();
case VEH_SHIP:
InvalidateWindowClasses(WC_SHIPS_LIST);
Ship::From(v)->state = TRACK_BIT_DEPOT;
RecalcShipStuff(v);
case VEH_AIRCRAFT:
InvalidateWindowClasses(WC_AIRCRAFT_LIST);
HandleAircraftEnterHangar(Aircraft::From(v));
Status change: