equal
deleted
inserted
replaced
1013 static void* EnumFindVehToOvertake(Vehicle* v, void* data) |
1013 static void* EnumFindVehToOvertake(Vehicle* v, void* data) |
1014 { |
1014 { |
1015 const OvertakeData* od = (OvertakeData*)data; |
1015 const OvertakeData* od = (OvertakeData*)data; |
1016 |
1016 |
1017 return |
1017 return |
1018 v->tile == od->tile && v->type == VEH_ROAD && v != od->u && v != od->v ? |
1018 v->tile == od->tile && v->type == VEH_ROAD && v->First() == v && v != od->u && v != od->v ? |
1019 v : NULL; |
1019 v : NULL; |
1020 } |
1020 } |
1021 |
1021 |
1022 static bool FindRoadVehToOvertake(OvertakeData *od) |
1022 static bool FindRoadVehToOvertake(OvertakeData *od) |
1023 { |
1023 { |
1463 if (v->u.road.state == RVSB_WORMHOLE) { |
1463 if (v->u.road.state == RVSB_WORMHOLE) { |
1464 /* Vehicle is entering a depot or is on a bridge or in a tunnel */ |
1464 /* Vehicle is entering a depot or is on a bridge or in a tunnel */ |
1465 GetNewVehiclePosResult gp = GetNewVehiclePos(v); |
1465 GetNewVehiclePosResult gp = GetNewVehiclePos(v); |
1466 |
1466 |
1467 const Vehicle *u = RoadVehFindCloseTo(v, gp.x, gp.y, v->direction); |
1467 const Vehicle *u = RoadVehFindCloseTo(v, gp.x, gp.y, v->direction); |
1468 if (u != NULL && u->cur_speed < v->cur_speed) { |
1468 if (u != NULL && u->First()->cur_speed < v->cur_speed) { |
1469 v->cur_speed = u->cur_speed; |
1469 v->cur_speed = u->First()->cur_speed; |
1470 return false; |
1470 return false; |
1471 } |
1471 } |
1472 |
1472 |
1473 if ((IsTunnelTile(gp.new_tile) || IsBridgeTile(gp.new_tile)) && HASBIT(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) { |
1473 if ((IsTunnelTile(gp.new_tile) || IsBridgeTile(gp.new_tile)) && HASBIT(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) { |
1474 /* Vehicle has just entered a bridge or tunnel */ |
1474 /* Vehicle has just entered a bridge or tunnel */ |
1661 /* Vehicle is not in a road stop. |
1661 /* Vehicle is not in a road stop. |
1662 * Check for another vehicle to overtake */ |
1662 * Check for another vehicle to overtake */ |
1663 Vehicle* u = RoadVehFindCloseTo(v, x, y, new_dir); |
1663 Vehicle* u = RoadVehFindCloseTo(v, x, y, new_dir); |
1664 |
1664 |
1665 if (u != NULL) { |
1665 if (u != NULL) { |
|
1666 u = u->First(); |
1666 /* There is a vehicle in front overtake it if possible */ |
1667 /* There is a vehicle in front overtake it if possible */ |
1667 if (v->u.road.overtaking == 0) RoadVehCheckOvertake(v, u); |
1668 if (v->u.road.overtaking == 0) RoadVehCheckOvertake(v, u); |
1668 if (v->u.road.overtaking == 0) v->cur_speed = u->cur_speed; |
1669 if (v->u.road.overtaking == 0) v->cur_speed = u->cur_speed; |
1669 return false; |
1670 return false; |
1670 } |
1671 } |