# HG changeset patch # User rubidium # Date 1182542917 0 # Node ID 52869fa670900bd3ac6846a764bb39705478c6fb # Parent fee376b814473f7854b4adf6a9b65b1e69f8a097 (svn r10279) [0.5] -Backport from trunk (r10139, r10153, r10154, r10155, r10165, r10187): - Fix: Do not make a 270 degree turn on the international airport when a 90 degree turn is enough (r10187) - Fix: Crash when trying to get the aircraft movement state of an aircraft going to a just deleted airport [FS#874] (r10165) - Fix: Airports did not flood when there are aircraft on the airport [FS#601] (r10155) - Fix: Some vehicles were not drawn when having a high resolution and a high zoom-out level [FS#870] (r10154) - Fix: Vehicles disappear when crossing certain tiles [FS#869] (r10153) - Fix: OpenTTD assumes that the resolution is at least 1 by 1, so force the resolution to be always at least 1 by 1 (r10139) diff -r fee376b81447 -r 52869fa67090 airport_movement.h --- a/airport_movement.h Fri Jun 22 20:06:59 2007 +0000 +++ b/airport_movement.h Fri Jun 22 20:08:37 2007 +0000 @@ -180,7 +180,7 @@ { 193, 104, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 32 Fly to landing position in air { 105, 104, AMED_NOSPDCLAMP | AMED_LAND, 0 }, // 33 Going down for land { 3, 104, AMED_NOSPDCLAMP | AMED_BRAKE, 0 }, // 34 Just landed, brake until end of runway - { 12, 104, 0, 0 }, // 35 Just landed, turn around and taxi 1 square + { 12, 104, AMED_SLOWTURN, 0 }, // 35 Just landed, turn around and taxi 1 square { 7, 84, 0, 0 }, // 36 Taxi from runway to crossing { -31, 209, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 37 Fly around waiting for a landing spot (north-east) { 1, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 38 Fly around waiting for a landing spot (north-west) diff -r fee376b81447 -r 52869fa67090 newgrf_engine.c --- a/newgrf_engine.c Fri Jun 22 20:06:59 2007 +0000 +++ b/newgrf_engine.c Fri Jun 22 20:08:37 2007 +0000 @@ -290,6 +290,8 @@ const Station *st = GetStation(v->u.air.targetairport); byte amdflag = GetAirportMovingData(st->airport_type, v->u.air.pos)->flag; + if (st->airport_tile == 0) return AMS_TTDP_FLIGHT_TO_TOWER; + switch (v->u.air.state) { case HANGAR: /* The international airport is a special case as helicopters can land in diff -r fee376b81447 -r 52869fa67090 openttd.c --- a/openttd.c Fri Jun 22 20:06:59 2007 +0000 +++ b/openttd.c Fri Jun 22 20:08:37 2007 +0000 @@ -419,6 +419,11 @@ if (startyear != INVALID_YEAR) _patches_newgame.starting_year = startyear; if (generation_seed != GENERATE_NEW_SEED) _patches_newgame.generation_seed = generation_seed; + /* The width and height must be at least 1 pixel, this + * way all internal drawing routines work correctly. */ + if (_cur_resolution[0] == 0) _cur_resolution[0] = 1; + if (_cur_resolution[1] == 0) _cur_resolution[1] = 1; + if (_dedicated_forks && !dedicated) _dedicated_forks = false; // enumerate language files diff -r fee376b81447 -r 52869fa67090 vehicle.c --- a/vehicle.c Fri Jun 22 20:06:59 2007 +0000 +++ b/vehicle.c Fri Jun 22 20:08:37 2007 +0000 @@ -36,7 +36,7 @@ #include "newgrf_engine.h" #include "newgrf_sound.h" -#define INVALID_COORD (-0x8000) +#define INVALID_COORD (0x7fffffff) #define GEN_HASH(x, y) ((GB((y), 6, 6) << 6) + GB((x), 7, 6)) /* @@ -823,17 +823,29 @@ const int b = dpi->top + dpi->height; // The hash area to scan - const int xl = GB(l - 70, 7, 6); - const int xu = GB(r, 7, 6); - const int yl = GB(t - 70, 6, 6) << 6; - const int yu = GB(b, 6, 6) << 6; - - int x; - int y; + int xl, xu, yl, yu, x, y; + + if (dpi->width + 70 < (1 << (7 + 6))) { + xl = GB(l - 70, 7, 6); + xu = GB(r, 7, 6); + } else { + /* scan whole hash row */ + xl = 0; + xu = 0x3F; + } + + if (dpi->height + 70 < (1 << (6 + 6))) { + yl = GB(t - 70, 6, 6) << 6; + yu = GB(b, 6, 6) << 6; + } else { + /* scan whole column */ + yl = 0; + yu = 0x3F << 6; + } for (y = yl;; y = (y + (1 << 6)) & (0x3F << 6)) { for (x = xl;; x = (x + 1) & 0x3F) { - VehicleID veh = _vehicle_position_hash[(x + y) & 0xFFFF]; + VehicleID veh = _vehicle_position_hash[x + y]; // already masked & 0xFFF while (veh != INVALID_VEHICLE) { const Vehicle* v = GetVehicle(veh); diff -r fee376b81447 -r 52869fa67090 water_cmd.c --- a/water_cmd.c Fri Jun 22 20:06:59 2007 +0000 +++ b/water_cmd.c Fri Jun 22 20:08:37 2007 +0000 @@ -21,6 +21,7 @@ #include "water_map.h" #include "newgrf.h" #include "bridge.h" +#include "airport.h" const SpriteID _water_shore_sprites[15] = { 0, @@ -620,6 +621,26 @@ byte z; Vehicle *v; + if (IsTileType(tile, MP_STATION) && IsAirport(tile)) { + uint x, y; + const Station *st = GetStationByTile(tile); + const AirportFTAClass *airport = GetAirport(st->airport_type); + for (x = 0; x < airport->size_x; x++) { + for (y = 0; y < airport->size_y; y++) { + uint z = 1; + tile = TILE_ADDXY(st->airport_tile, x, y); + if (st->airport_type == AT_OILRIG) z += 54; + if (st->airport_type == AT_HELIPORT) z += 60; + + v = FindVehicleOnTileZ(tile, z); + if (v != NULL && (v->vehstatus & VS_CRASHED) == 0) return v; + } + } + + /* No vehicle could be flooded on this airport anymore */ + return NULL; + } + if (!IsBridgeTile(tile) || !IsBridgeRamp(tile)) return FindVehicleOnTileZ(tile, 0); end = GetOtherBridgeEnd(tile); @@ -668,6 +689,25 @@ v = u; v->u.rail.crash_anim_pos = 4000; // max 4440, disappear pretty fast RebuildVehicleLists(); + } else if (v->type == VEH_Aircraft) { + const Station *st; + const AirportFTAClass *airport; + uint z = 1; + + /* Crashing aircraft are always at z_pos == 1, never on z_pos == 0, + * because that's always the shadow. Except for the heliport, because + * that station has a big z_offset for the aircraft. */ + if (!IsTileType(v->tile, MP_STATION) || !IsAirport(v->tile) || GetTileMaxZ(v->tile) != 0) return; + st = GetStationByTile(v->tile); + airport = GetAirport(st->airport_type); + + if (st->airport_type == AT_OILRIG) z += 54; + if (st->airport_type == AT_HELIPORT) z += 60; + + if (v->z_pos != z) return; + + pass = 2; // driver + if (v->cargo_type == CT_PASSENGERS) pass += v->cargo_count; } else { return; }