(svn r12846) [NewGRF_ports] -Change: Added clearer support for seaplanes. NewGRF_ports
authorrichk
Wed, 23 Apr 2008 03:14:27 +0000
branchNewGRF_ports
changeset 10305 e90761e37744
parent 10280 ffc3a406abe7
child 10310 c8b1eafc56bd
(svn r12846) [NewGRF_ports] -Change: Added clearer support for seaplanes.
Seaplane is now defined on bits 2 & 3 of Prop 0x17 of Action0Planes.
Seaplanes can only be built at airports they can use. Some seaplanes have dual land/sea capability; this is supported.
Updated seaplaneport.grf to reflect new functionality.
bin/data/seaplaneport.grf
bin/data/sprites/seaplaneport.nfo
src/aircraft.h
src/engine_type.h
src/newgrf.cpp
src/table/engines.h
Binary file bin/data/seaplaneport.grf has changed
--- a/bin/data/sprites/seaplaneport.nfo	Sun Apr 20 23:50:19 2008 +0000
+++ b/bin/data/sprites/seaplaneport.nfo	Wed Apr 23 03:14:27 2008 +0000
@@ -252,7 +252,7 @@
 		1E 01 02
 
 // Prop20 Port Subtype
-		20 07
+		20 0F
 
 // Prop22 Catchment Area
 		22 04
--- a/src/aircraft.h	Sun Apr 20 23:50:19 2008 +0000
+++ b/src/aircraft.h	Wed Apr 23 03:14:27 2008 +0000
@@ -44,7 +44,8 @@
 	const AirportFTAClass *apc = st->Airport();
 	const AircraftVehicleInfo *avi = AircraftVehInfo(engine);
 
-	if ((apc->flags & AirportFTAClass::SEAPLANES) && ((avi->subtype & AirportFTAClass::SEAPLANES) == 0)) return false;
+	if ((apc->flags & AirportFTAClass::SEAPLANES) && (avi->airport_required == AIRPORT_LAND_ONLY)) return false;  ///< restrict to what can be built at a seaplane airport
+	if (!(apc->flags & AirportFTAClass::SEAPLANES) && (avi->airport_required == AIRPORT_SEA_ONLY)) return false;  ///< restrict to what can be built at a land airport
 	return (apc->flags & (avi->subtype & AIR_CTOL ? AirportFTAClass::AIRPLANES : AirportFTAClass::HELICOPTERS)) != 0;
 }
 
@@ -103,7 +104,7 @@
 /**
  * This class 'wraps' Vehicle; you do not actually instantiate this class.
  * You create a Vehicle using AllocateVehicle, so it is added to the pool
- * and you reinitialize that to a Train using:
+ * and you reinitialize that to an Aircraft using:
  *   v = new (v) Aircraft();
  *
  * As side-effect the vehicle type is set correctly.
--- a/src/engine_type.h	Sun Apr 20 23:50:19 2008 +0000
+++ b/src/engine_type.h	Wed Apr 23 03:14:27 2008 +0000
@@ -76,7 +76,16 @@
 	AIR_HELI = 0,
 	AIR_CTOL = 1, ///< Conventional Take Off and Landing, i.e. planes
 	AIR_FAST = 2,
-	AIR_SEAPLANE = 8
+};
+
+/* AircraftVehicleInfo airport_required, bitmask type.
+ * Indicates whether an aircraft, can, or can only use seaplane airports.
+ * If bit 0 is 1 then it can land at a seaplane airport.
+ * If bit 1 is 1 then it can ONLY land at a seaplane airport. */
+enum {
+	AIRPORT_LAND_ONLY   = 0,
+	AIRPORT_SEA_OR_LAND = 1,
+	AIRPORT_SEA_ONLY    = 3,
 };
 
 struct AircraftVehicleInfo {
@@ -89,6 +98,7 @@
 	uint16 max_speed;
 	byte mail_capacity;
 	uint16 passenger_capacity;
+	byte airport_required;
 };
 
 struct RoadVehicleInfo {
--- a/src/newgrf.cpp	Sun Apr 20 23:50:19 2008 +0000
+++ b/src/newgrf.cpp	Wed Apr 23 03:14:27 2008 +0000
@@ -855,10 +855,6 @@
 
 			case 0x09: { // Helicopter
 				uint subtype = grf_load_byte(&buf);
-				if ((subtype & 0x08) == 0x08) {
-					avi->subtype = AIR_SEAPLANE;
-					break;
-				}
 				if ((subtype & 0x03) == 0) {
 					avi->subtype = AIR_HELI;
 				} else {
@@ -917,6 +913,13 @@
 			case 0x17: // Miscellaneous flags
 				ei->misc_flags = grf_load_byte(&buf);
 				_loaded_newgrf_features.has_2CC |= HasBit(ei->misc_flags, EF_USES_2CC);
+				if ((ei->misc_flags & 0x06) == 0x06) {
+					avi->airport_required = AIRPORT_SEA_ONLY;
+				} else if ((ei->misc_flags & 0x04) == 0x04) {
+					avi->airport_required = AIRPORT_SEA_OR_LAND;
+				} else {
+					avi->airport_required = AIRPORT_LAND_ONLY;
+				}
 				break;
 
 			case 0x18: // Cargo classes allowed
--- a/src/table/engines.h	Sun Apr 20 23:50:19 2008 +0000
+++ b/src/table/engines.h	Wed Apr 23 03:14:27 2008 +0000
@@ -550,7 +550,7 @@
  * @param h mail_capacity
  * @param i passenger_capacity
  */
-#define AVI(a, b, c, d, e, f, g, h, i) { a, b, c, d, {e}, f, (g * 129) / 10, h, i }
+#define AVI(a, b, c, d, e, f, g, h, i, j) { a, b, c, d, {e}, f, (g * 129) / 10, h, i, j }
 #define H AIR_HELI
 #define P AIR_CTOL
 #define J AIR_CTOL | AIR_FAST
@@ -559,48 +559,49 @@
 	//    |   base_cost       |                           |   max_speed
 	//    |   |    running_cost                           |   |    mail_capacity
 	//    |   |    |  subtype |                           |   |    |    passenger_capacity
-	//    |   |    |  |       |                           |   |    |    |
-	AVI(  1, 14,  85, P, SND_08_PLANE_TAKE_OFF,          18,  37,  4,  25 ), /*  0 */
-	AVI(  0, 15, 100, P, SND_08_PLANE_TAKE_OFF,          20,  37,  8,  65 ), /*  1 */
-	AVI(  2, 16, 130, J, SND_09_JET,                     35,  74, 10,  90 ), /*  2 */
-	AVI(  8, 75, 250, J, SND_3B_JET_OVERHEAD,            50, 181, 20, 100 ), /*  3 */
-	AVI(  5, 15,  98, P, SND_08_PLANE_TAKE_OFF,          20,  37,  6,  30 ), /*  4 */
-	AVI(  6, 18, 240, J, SND_09_JET,                     40,  74, 30, 200 ), /*  5 */
-	AVI(  2, 17, 150, P, SND_09_JET,                     35,  74, 15, 100 ), /*  6 */
-	AVI(  2, 18, 245, J, SND_09_JET,                     40,  74, 30, 150 ), /*  7 */
-	AVI(  3, 19, 192, J, SND_09_JET,                     40,  74, 40, 220 ), /*  8 */
-	AVI(  3, 20, 190, J, SND_09_JET,                     40,  74, 25, 230 ), /*  9 */
-	AVI(  2, 16, 135, J, SND_09_JET,                     35,  74, 10,  95 ), /* 10 */
-	AVI(  2, 18, 240, J, SND_09_JET,                     40,  74, 35, 170 ), /* 11 */
-	AVI(  4, 17, 155, J, SND_09_JET,                     40,  74, 15, 110 ), /* 12 */
-	AVI(  7, 30, 253, J, SND_3D_ANOTHER_JET_OVERHEAD,    40,  74, 50, 300 ), /* 13 */
-	AVI(  4, 18, 210, J, SND_09_JET,                     40,  74, 25, 200 ), /* 14 */
-	AVI(  4, 19, 220, J, SND_09_JET,                     40,  74, 25, 240 ), /* 15 */
-	AVI(  4, 27, 230, J, SND_09_JET,                     40,  74, 40, 260 ), /* 16 */
-	AVI(  3, 25, 225, J, SND_09_JET,                     40,  74, 35, 240 ), /* 17 */
-	AVI(  4, 20, 235, J, SND_09_JET,                     40,  74, 30, 260 ), /* 18 */
-	AVI(  4, 19, 220, J, SND_09_JET,                     40,  74, 25, 210 ), /* 19 */
-	AVI(  4, 18, 170, J, SND_09_JET,                     40,  74, 20, 160 ), /* 20 */
-	AVI(  4, 26, 210, J, SND_09_JET,                     40,  74, 20, 220 ), /* 21 */
-	AVI(  6, 16, 125, P, SND_09_JET,                     50,  74, 10,  80 ), /* 22 */
-	AVI(  2, 17, 145, P, SND_09_JET,                     40,  74, 10,  85 ), /* 23 */
-	AVI( 11, 16, 130, P, SND_09_JET,                     40,  74, 10,  75 ), /* 24 */
-	AVI( 10, 16, 149, P, SND_09_JET,                     40,  74, 10,  85 ), /* 25 */
-	AVI( 15, 17, 170, P, SND_09_JET,                     40,  74, 18,  65 ), /* 26 */
-	AVI( 12, 18, 210, J, SND_09_JET,                     40,  74, 25, 110 ), /* 27 */
-	AVI( 13, 20, 230, J, SND_09_JET,                     40,  74, 60, 180 ), /* 28 */
-	AVI( 14, 21, 220, J, SND_09_JET,                     40,  74, 65, 150 ), /* 29 */
-	AVI( 16, 19, 160, J, SND_09_JET,                     40, 181, 45,  85 ), /* 30 */
-	AVI( 17, 24, 248, J, SND_3D_ANOTHER_JET_OVERHEAD,    40,  74, 80, 400 ), /* 31 */
-	AVI( 18, 80, 251, J, SND_3B_JET_OVERHEAD,            50, 181, 45, 130 ), /* 32 */
-	AVI( 20, 13,  85, P, SND_45_PLANE_CRASHING,          18,  37,  5,  25 ), /* 33 */
-	AVI( 21, 18, 100, P, SND_46_PLANE_ENGINE_SPUTTERING, 20,  37,  9,  60 ), /* 34 */
-	AVI( 22, 25, 140, P, SND_09_JET,                     40,  74, 12,  90 ), /* 35 */
-	AVI( 23, 32, 220, J, SND_3D_ANOTHER_JET_OVERHEAD,    40,  74, 40, 200 ), /* 36 */
-	AVI( 24, 80, 255, J, SND_3B_JET_OVERHEAD,            50, 181, 30, 100 ), /* 37 */
-	AVI(  9, 15,  81, H, SND_09_JET,                     20,  25, 15,  40 ), /* 38 */
-	AVI( 19, 17,  77, H, SND_09_JET,                     20,  40, 20,  55 ), /* 39 */
-	AVI( 25, 15,  80, H, SND_09_JET,                     20,  25, 10,  40 ), /* 40 */
+	//    |   |    |  |       |                           |   |    |    |  airport_required (land only = 0, sea only = 3, both = 1)
+	//    |   |    |  |       |                           |   |    |    |  |
+	AVI(  1, 14,  85, P, SND_08_PLANE_TAKE_OFF,          18,  37,  4,  25, 0 ), /*  0 */
+	AVI(  0, 15, 100, P, SND_08_PLANE_TAKE_OFF,          20,  37,  8,  65, 0 ), /*  1 */
+	AVI(  2, 16, 130, J, SND_09_JET,                     35,  74, 10,  90, 0 ), /*  2 */
+	AVI(  8, 75, 250, J, SND_3B_JET_OVERHEAD,            50, 181, 20, 100, 0 ), /*  3 */
+	AVI(  5, 15,  98, P, SND_08_PLANE_TAKE_OFF,          20,  37,  6,  30, 0 ), /*  4 */
+	AVI(  6, 18, 240, J, SND_09_JET,                     40,  74, 30, 200, 0 ), /*  5 */
+	AVI(  2, 17, 150, P, SND_09_JET,                     35,  74, 15, 100, 0 ), /*  6 */
+	AVI(  2, 18, 245, J, SND_09_JET,                     40,  74, 30, 150, 0 ), /*  7 */
+	AVI(  3, 19, 192, J, SND_09_JET,                     40,  74, 40, 220, 0 ), /*  8 */
+	AVI(  3, 20, 190, J, SND_09_JET,                     40,  74, 25, 230, 0 ), /*  9 */
+	AVI(  2, 16, 135, J, SND_09_JET,                     35,  74, 10,  95, 0 ), /* 10 */
+	AVI(  2, 18, 240, J, SND_09_JET,                     40,  74, 35, 170, 0 ), /* 11 */
+	AVI(  4, 17, 155, J, SND_09_JET,                     40,  74, 15, 110, 0 ), /* 12 */
+	AVI(  7, 30, 253, J, SND_3D_ANOTHER_JET_OVERHEAD,    40,  74, 50, 300, 0 ), /* 13 */
+	AVI(  4, 18, 210, J, SND_09_JET,                     40,  74, 25, 200, 0 ), /* 14 */
+	AVI(  4, 19, 220, J, SND_09_JET,                     40,  74, 25, 240, 0 ), /* 15 */
+	AVI(  4, 27, 230, J, SND_09_JET,                     40,  74, 40, 260, 0 ), /* 16 */
+	AVI(  3, 25, 225, J, SND_09_JET,                     40,  74, 35, 240, 0 ), /* 17 */
+	AVI(  4, 20, 235, J, SND_09_JET,                     40,  74, 30, 260, 0 ), /* 18 */
+	AVI(  4, 19, 220, J, SND_09_JET,                     40,  74, 25, 210, 0 ), /* 19 */
+	AVI(  4, 18, 170, J, SND_09_JET,                     40,  74, 20, 160, 0 ), /* 20 */
+	AVI(  4, 26, 210, J, SND_09_JET,                     40,  74, 20, 220, 0 ), /* 21 */
+	AVI(  6, 16, 125, P, SND_09_JET,                     50,  74, 10,  80, 0 ), /* 22 */
+	AVI(  2, 17, 145, P, SND_09_JET,                     40,  74, 10,  85, 0 ), /* 23 */
+	AVI( 11, 16, 130, P, SND_09_JET,                     40,  74, 10,  75, 0 ), /* 24 */
+	AVI( 10, 16, 149, P, SND_09_JET,                     40,  74, 10,  85, 0 ), /* 25 */
+	AVI( 15, 17, 170, P, SND_09_JET,                     40,  74, 18,  65, 0 ), /* 26 */
+	AVI( 12, 18, 210, J, SND_09_JET,                     40,  74, 25, 110, 0 ), /* 27 */
+	AVI( 13, 20, 230, J, SND_09_JET,                     40,  74, 60, 180, 0 ), /* 28 */
+	AVI( 14, 21, 220, J, SND_09_JET,                     40,  74, 65, 150, 0 ), /* 29 */
+	AVI( 16, 19, 160, J, SND_09_JET,                     40, 181, 45,  85, 0 ), /* 30 */
+	AVI( 17, 24, 248, J, SND_3D_ANOTHER_JET_OVERHEAD,    40,  74, 80, 400, 0 ), /* 31 */
+	AVI( 18, 80, 251, J, SND_3B_JET_OVERHEAD,            50, 181, 45, 130, 0 ), /* 32 */
+	AVI( 20, 13,  85, P, SND_45_PLANE_CRASHING,          18,  37,  5,  25, 0 ), /* 33 */
+	AVI( 21, 18, 100, P, SND_46_PLANE_ENGINE_SPUTTERING, 20,  37,  9,  60, 0 ), /* 34 */
+	AVI( 22, 25, 140, P, SND_09_JET,                     40,  74, 12,  90, 0 ), /* 35 */
+	AVI( 23, 32, 220, J, SND_3D_ANOTHER_JET_OVERHEAD,    40,  74, 40, 200, 0 ), /* 36 */
+	AVI( 24, 80, 255, J, SND_3B_JET_OVERHEAD,            50, 181, 30, 100, 0 ), /* 37 */
+	AVI(  9, 15,  81, H, SND_09_JET,                     20,  25, 15,  40, 0 ), /* 38 */
+	AVI( 19, 17,  77, H, SND_09_JET,                     20,  40, 20,  55, 0 ), /* 39 */
+	AVI( 25, 15,  80, H, SND_09_JET,                     20,  25, 10,  40, 0 ), /* 40 */
 };
 #undef J
 #undef P