src/roadveh_cmd.cpp
changeset 7817 f5fd95f8bb9f
parent 7816 997b23172406
child 7832 60035eb28f08
equal deleted inserted replaced
7816:997b23172406 7817:f5fd95f8bb9f
  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 		}