@@ -1666,19 +1666,16 @@ static bool SignalVehicleCheck(TileIndex
/* check for a vehicle with that trackdir on the start tile of the tunnel */
if (VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL) return true;
/* check for a vehicle with that trackdir on the end tile of the tunnel */
if (VehicleFromPos(end, &dest, SignalVehicleCheckProc) != NULL) return true;
/* now check all tiles from start to end for a warping vehicle
* NOTE: the hashes for tiles may overlap, so this could maybe be optimised a bit by not checking every tile? */
/* now check all tiles from start to end for a warping vehicle */
dest.track = 0x40; //Vehicle inside a tunnel or on a bridge
for (; tile != end; tile += TileOffsByDiagDir(direction)) {
if (VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL)
return true;
}
/* no vehicle found */
return false;
return VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL;
@@ -2757,13 +2757,22 @@ static void CheckTrainCollision(Vehicle
TrainCollideChecker tcc;
tcc.v = v;
tcc.v_skip = v->next;
tcc.num = 0;
/* find colliding vehicles */
VehicleFromPosXY(v->x_pos, v->y_pos, &tcc, FindTrainCollideEnum);
if (v->u.rail.track == TRACK_BIT_WORMHOLE) {
VehicleFromPos(v->tile, &tcc, FindTrainCollideEnum);
if (IsBridgeTile(v->tile)) {
VehicleFromPos(GetOtherBridgeEnd(v->tile), &tcc, FindTrainCollideEnum);
} else {
VehicleFromPos(GetOtherTunnelEnd(v->tile), &tcc, FindTrainCollideEnum);
/* any dead -> no crash */
if (tcc.num == 0) return;
SetDParam(0, tcc.num);
AddNewsItem(STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL,
@@ -468,14 +468,14 @@ static void UpdateNewVehiclePosHash(Vehi
Vehicle **old_hash = v->old_new_hash;
Vehicle **new_hash;
if (remove) {
new_hash = NULL;
int x = GB(v->x_pos / TILE_SIZE, HASH_RES, HASH_BITS);
int y = GB(v->y_pos / TILE_SIZE, HASH_RES, HASH_BITS) << HASH_BITS;
int x = GB(TileX(v->tile), HASH_RES, HASH_BITS);
int y = GB(TileY(v->tile), HASH_RES, HASH_BITS) << HASH_BITS;
new_hash = &_new_vehicle_position_hash[(x + y) & TOTAL_HASH_MASK];
if (old_hash == new_hash) return;
/* Remove from the old position in the hash table */
Status change: