129 static void *EnsureNoVehicleProcZ(Vehicle *v, void *data) |
129 static void *EnsureNoVehicleProcZ(Vehicle *v, void *data) |
130 { |
130 { |
131 const TileInfo *ti = data; |
131 const TileInfo *ti = data; |
132 |
132 |
133 if (v->tile != ti->tile || v->type == VEH_Disaster) return NULL; |
133 if (v->tile != ti->tile || v->type == VEH_Disaster) return NULL; |
134 if (!IS_INT_INSIDE(ti->z - v->z_pos, 0, TILE_HEIGHT + 1)) return NULL; |
134 if (v->z_pos > ti->z) return NULL; |
135 |
135 |
136 VehicleInTheWayErrMsg(v); |
136 VehicleInTheWayErrMsg(v); |
137 return v; |
137 return v; |
138 } |
138 } |
139 |
139 |
140 static inline uint Correct_Z(Slope tileh) |
140 |
141 { |
141 bool EnsureNoVehicleOnGround(TileIndex tile) |
142 // needs z correction for slope-type graphics that have the NORTHERN tile lowered |
|
143 return CorrectZ(tileh) ? TILE_HEIGHT : 0; |
|
144 } |
|
145 |
|
146 uint GetCorrectTileHeight(TileIndex tile) |
|
147 { |
|
148 return Correct_Z(GetTileSlope(tile, NULL)); |
|
149 } |
|
150 |
|
151 bool EnsureNoVehicleZ(TileIndex tile, byte z) |
|
152 { |
142 { |
153 TileInfo ti; |
143 TileInfo ti; |
154 |
144 |
155 ti.tile = tile; |
145 ti.tile = tile; |
156 ti.z = z + GetCorrectTileHeight(tile); |
146 ti.z = GetTileMaxZ(tile); |
157 |
|
158 return VehicleFromPos(tile, &ti, EnsureNoVehicleProcZ) == NULL; |
147 return VehicleFromPos(tile, &ti, EnsureNoVehicleProcZ) == NULL; |
159 } |
148 } |
160 |
149 |
161 Vehicle *FindVehicleOnTileZ(TileIndex tile, byte z) |
150 Vehicle *FindVehicleOnTileZ(TileIndex tile, byte z) |
162 { |
151 { |