1229 v->tile = gp.new_tile; |
1229 v->tile = gp.new_tile; |
1230 /* If vehicle is in the air, use tile coordinate 0. */ |
1230 /* If vehicle is in the air, use tile coordinate 0. */ |
1231 if (amd.flag & (AMED_TAKEOFF | AMED_SLOWTURN | AMED_LAND)) v->tile = 0; |
1231 if (amd.flag & (AMED_TAKEOFF | AMED_SLOWTURN | AMED_LAND)) v->tile = 0; |
1232 |
1232 |
1233 /* Adjust Z for land or takeoff? */ |
1233 /* Adjust Z for land or takeoff? */ |
1234 uint z = v->z_pos; |
1234 int z = v->z_pos; |
1235 |
1235 |
1236 if (((v->z_pos - GetTileZ(st->airport_tile))-1 ) < amd.z) { //taking off, so increase altitude |
1236 if ((int)v->z_pos < (amd.z + TilePixelHeight(st->airport_tile))) { //target position is higher, so increase altitude |
1237 z = min(z + 2, GetAircraftFlyingAltitude(v)); |
1237 z = min(z + 2, (v->u.air.state == ENDTAKEOFF)? GetAircraftFlyingAltitude(v) : amd.z + TilePixelHeight(st->airport_tile) ); |
1238 } |
1238 } |
1239 |
1239 |
1240 if ((amd.flag & AMED_HOLD) && (z > 150)) z--; |
1240 if ((amd.flag & AMED_HOLD) && (z > 150)) z--; |
1241 |
1241 |
1242 if (amd.z < ((v->z_pos - GetTileZ(st->airport_tile))-1 ) ) { //landing, so decrease altitude |
1242 if ((amd.z + TilePixelHeight(st->airport_tile)) < (int)v->z_pos) { //target position is lower, so decrease altitude |
1243 if (st->airport_tile == 0) { |
1243 if (st->airport_tile == 0) { |
1244 /* Airport has been removed, abort the landing procedure */ |
1244 /* Airport has been removed, abort the landing procedure */ |
1245 v->u.air.state = FLYING; |
1245 v->u.air.state = FLYING; |
1246 UpdateAircraftCache(v); |
1246 UpdateAircraftCache(v); |
1247 AircraftNextAirportPos_and_Order(v); |
1247 AircraftNextAirportPos_and_Order(v); |
1248 /* get aircraft back on running altitude */ |
1248 /* get aircraft back on running altitude */ |
1249 SetAircraftPosition(v, gp.x, gp.y, GetAircraftFlyingAltitude(v)); |
1249 SetAircraftPosition(v, gp.x, gp.y, GetAircraftFlyingAltitude(v)); |
1250 continue; |
1250 continue; |
1251 } |
1251 } |
1252 |
1252 |
1253 uint curz = GetSlopeZ(x, y) + 1; |
1253 int curz = amd.z + TilePixelHeight(st->airport_tile) + 1; |
1254 |
1254 |
1255 if (curz > z) { |
1255 if (curz > z) { |
1256 z++; |
1256 z++; |
1257 } else { |
1257 } else { |
1258 int t = max(1U, dist - 4); |
1258 int t = max(1U, dist - 4); |