(svn r14383) -Fix [FS#2316](r14343): handle invalid 'v->u.air.targetairport' in the NewGRF code, too
authorsmatz
Mon, 22 Sep 2008 14:34:38 +0000
changeset 10177 41ce7529a331
parent 10176 bd20cc54b41f
child 10178 15d8196fed65
(svn r14383) -Fix [FS#2316](r14343): handle invalid 'v->u.air.targetairport' in the NewGRF code, too
src/aircraft_cmd.cpp
src/newgrf_engine.cpp
--- a/src/aircraft_cmd.cpp	Sun Sep 21 18:28:35 2008 +0000
+++ b/src/aircraft_cmd.cpp	Mon Sep 22 14:34:38 2008 +0000
@@ -973,10 +973,8 @@
 {
 	int count;
 
-	StationID target = v->u.air.targetairport;
-
 	/* NULL if station is invalid */
-	const Station *st = IsValidStationID(target) ? GetStation(target) : NULL;
+	const Station *st = IsValidStationID(v->u.air.targetairport) ? GetStation(v->u.air.targetairport) : NULL;
 	/* 0 if there is no station */
 	TileIndex tile = 0;
 	if (st != NULL) {
--- a/src/newgrf_engine.cpp	Sun Sep 21 18:28:35 2008 +0000
+++ b/src/newgrf_engine.cpp	Mon Sep 22 14:34:38 2008 +0000
@@ -27,6 +27,7 @@
 #include "rail_map.h"
 #include "rail.h"
 #include "settings_type.h"
+#include "aircraft.h"
 #include <map>
 
 
@@ -190,8 +191,8 @@
  */
 static byte MapAircraftMovementState(const Vehicle *v)
 {
-	const Station *st = GetStation(v->u.air.targetairport);
-	if (st->airport_tile == 0) return AMS_TTDP_FLIGHT_TO_TOWER;
+	const Station *st = GetTargetAirportIfValid(v);
+	if (st == NULL) return AMS_TTDP_FLIGHT_TO_TOWER;
 
 	const AirportFTAClass *afc = st->Airport();
 	uint16 amdflag = afc->MovingData(v->u.air.pos)->flag;
@@ -550,22 +551,26 @@
 			{
 				const Vehicle *w = v->Next();
 				uint16 altitude = v->z_pos - w->z_pos; // Aircraft height - shadow height
-				byte airporttype;
+				byte airporttype = ATP_TTDP_LARGE;
 
-				switch (GetStation(v->u.air.targetairport)->airport_type) {
-					/* Note, Helidepot and Helistation are treated as small airports
-					 * as they are at ground level. */
-					case AT_HELIDEPOT:
-					case AT_HELISTATION:
-					case AT_COMMUTER:
-					case AT_SMALL:         airporttype = ATP_TTDP_SMALL; break;
-					case AT_METROPOLITAN:
-					case AT_INTERNATIONAL:
-					case AT_INTERCON:
-					case AT_LARGE:         airporttype = ATP_TTDP_LARGE; break;
-					case AT_HELIPORT:      airporttype = ATP_TTDP_HELIPORT; break;
-					case AT_OILRIG:        airporttype = ATP_TTDP_OILRIG; break;
-					default:               airporttype = ATP_TTDP_LARGE; break;
+				const Station *st = GetTargetAirportIfValid(v);
+
+				if (st != NULL) {
+					switch (st->airport_type) {
+						/* Note, Helidepot and Helistation are treated as small airports
+						 * as they are at ground level. */
+						case AT_HELIDEPOT:
+						case AT_HELISTATION:
+						case AT_COMMUTER:
+						case AT_SMALL:         airporttype = ATP_TTDP_SMALL; break;
+						case AT_METROPOLITAN:
+						case AT_INTERNATIONAL:
+						case AT_INTERCON:
+						case AT_LARGE:         airporttype = ATP_TTDP_LARGE; break;
+						case AT_HELIPORT:      airporttype = ATP_TTDP_HELIPORT; break;
+						case AT_OILRIG:        airporttype = ATP_TTDP_OILRIG; break;
+						default:               airporttype = ATP_TTDP_LARGE; break;
+					}
 				}
 
 				return (altitude << 8) | airporttype;