airport.c
changeset 950 1f6546ea35a3
parent 909 81bc9ef93f50
child 1019 6363b8a4273e
--- a/airport.c	Sun Jan 09 01:11:01 2005 +0000
+++ b/airport.c	Sun Jan 09 08:49:40 2005 +0000
@@ -10,8 +10,7 @@
 AirportFTAClass *InternationalAirport;
 
 static void AirportFTAClass_Constructor(AirportFTAClass *Airport,
-																				const byte nofterminals, const byte nofterminalgroups,
-																				const byte nofhelipads,  const byte nofhelipadgroups,
+																				const byte *terminals, const byte *helipads,
 																				const byte entry_point,  const byte acc_planes,
 																				const AirportFTAbuildup *FA,
 																				const TileIndexDiffC *depots, const byte nof_depots);
@@ -26,24 +25,75 @@
 void InitializeAirports()
 {
 	// country airport
-	CountryAirport = (AirportFTAClass *)malloc(sizeof(AirportFTAClass));
-	AirportFTAClass_Constructor(CountryAirport, 2, 1, 0, 0, 16, ALL, _airport_fta_country, _airport_depots_country, lengthof(_airport_depots_country));
+	CountryAirport = malloc(sizeof(AirportFTAClass));
+	
+	AirportFTAClass_Constructor(
+		CountryAirport, 
+		_airport_terminal_country, 
+		NULL, 
+		16, 
+		ALL, 
+		_airport_fta_country, 
+		_airport_depots_country, 
+		lengthof(_airport_depots_country)
+	);
 
 	// city airport
-	CityAirport = (AirportFTAClass *)malloc(sizeof(AirportFTAClass));
-	AirportFTAClass_Constructor(CityAirport, 3, 1, 0, 0, 19, ALL, _airport_fta_city, _airport_depots_city, lengthof(_airport_depots_city));
+	CityAirport = malloc(sizeof(AirportFTAClass));
+	
+	AirportFTAClass_Constructor(
+		CityAirport, 
+		_airport_terminal_city, 
+		NULL, 
+		19, 
+		ALL, 
+		_airport_fta_city, 
+		_airport_depots_city, 
+		lengthof(_airport_depots_city)
+	);
 
 	// metropolitan airport
-	MetropolitanAirport = (AirportFTAClass *)malloc(sizeof(AirportFTAClass));
-	AirportFTAClass_Constructor(MetropolitanAirport, 3, 1, 0, 0, 20, ALL, _airport_fta_metropolitan, _airport_depots_metropolitan, lengthof(_airport_depots_metropolitan));
+	MetropolitanAirport = malloc(sizeof(AirportFTAClass));
+	
+	AirportFTAClass_Constructor(
+		MetropolitanAirport, 
+		_airport_terminal_metropolitan, 
+		NULL, 
+		20, 
+		ALL, 
+		_airport_fta_metropolitan, 
+		_airport_depots_metropolitan, 
+		lengthof(_airport_depots_metropolitan)
+	);
 
 	// international airport
 	InternationalAirport = (AirportFTAClass *)malloc(sizeof(AirportFTAClass));
-	AirportFTAClass_Constructor(InternationalAirport, 6, 2, 2, 1, 37, ALL, _airport_fta_international, _airport_depots_international, lengthof(_airport_depots_international));
+	
+	AirportFTAClass_Constructor(
+		InternationalAirport, 
+		_airport_terminal_international, 
+		_airport_helipad_international, 
+		37, 
+		ALL, 
+		_airport_fta_international, 
+		_airport_depots_international, 
+		lengthof(_airport_depots_international)
+	);
 
 	// heliport, oilrig
 	Heliport = (AirportFTAClass *)malloc(sizeof(AirportFTAClass));
-	AirportFTAClass_Constructor(Heliport, 0, 0, 1, 1, 7, HELICOPTERS_ONLY, _airport_fta_heliport_oilrig, NULL, 0);
+	
+	AirportFTAClass_Constructor(
+		Heliport, 
+		NULL, 
+		_airport_helipad_heliport_oilrig, 
+		7, 
+		HELICOPTERS_ONLY, 
+		_airport_fta_heliport_oilrig, 
+		NULL, 
+		0
+	);
+	
 	Oilrig = Heliport;  // exactly the same structure for heliport/oilrig, so share state machine
 }
 
@@ -57,12 +107,46 @@
 }
 
 static void AirportFTAClass_Constructor(AirportFTAClass *Airport,
-																				const byte nofterminals, const byte nofterminalgroups,
-																				const byte nofhelipads, const byte nofhelipadgroups,
+																				const byte *terminals, const byte *helipads,
 																				const byte entry_point, const byte acc_planes,
 																				const AirportFTAbuildup *FA,
 																				const TileIndexDiffC *depots, const byte nof_depots)
 {
+	byte nofterminals, nofhelipads;
+	byte nofterminalgroups = 0;
+	byte nofhelipadgroups = 0;
+	const byte * curr;
+	int i;
+	nofterminals = nofhelipads = 0;
+	
+	//now we read the number of terminals we have
+	if (terminals != NULL) {
+		i = terminals[0];
+		nofterminalgroups = i;
+		curr = terminals;
+		while (i-- > 0) {
+			curr++;
+			assert(*curr != 0);	//we don't want to have an empty group
+			nofterminals += *curr;
+		}
+	
+	}
+	Airport->terminals = terminals;
+
+	//read helipads	
+	if (helipads != NULL) {
+		i = helipads[0];
+		nofhelipadgroups = i;
+		curr = helipads;
+		while (i-- > 0) {
+			curr++;
+			assert(*curr != 0); //no empty groups please
+			nofhelipads += *curr;
+		}
+	
+	}
+	Airport->helipads = helipads;
+
 	// if there are more terminals than 6, internal variables have to be changed, so don't allow that
 	// same goes for helipads
 	if (nofterminals > MAX_TERMINALS) { printf("Currently only maximum of %2d terminals are supported (you wanted %2d)\n", MAX_TERMINALS, nofterminals);}
@@ -70,23 +154,15 @@
 	// terminals/helipads are divided into groups. Groups are computed by dividing the number
 	// of terminals by the number of groups. Half in half. If #terminals is uneven, first group
 	// will get the less # of terminals
-	if (nofterminalgroups > nofterminals) { printf("# of terminalgroups (%2d) must be less or equal to terminals (%2d)", nofterminals, nofterminalgroups);}
-	if (nofhelipadgroups > nofhelipads) { printf("# of helipadgroups (%2d) must be less or equal to helipads (%2d)", nofhelipads, nofhelipadgroups);}
 
 	assert(nofterminals <= MAX_TERMINALS);
 	assert(nofhelipads <= MAX_HELIPADS);
-	assert(nofterminalgroups <= nofterminals);
-	assert(nofhelipadgroups <= nofhelipads);
 
 	Airport->nofelements = AirportGetNofElements(FA);
 	// check
 	if (entry_point >= Airport->nofelements) {printf("Entry point (%2d) must be within the airport positions (which is max %2d)\n", entry_point, Airport->nofelements);}
 	assert(entry_point < Airport->nofelements);
 
-	Airport->nofterminals = nofterminals;
-	Airport->nofterminalgroups = nofterminalgroups;
-	Airport->nofhelipads = nofhelipads;
-	Airport->nofhelipadgroups = nofhelipadgroups;
 	Airport->acc_planes = acc_planes;
 	Airport->entry_point = entry_point;
 	Airport->airport_depots = depots;
@@ -95,8 +171,8 @@
 
 	// build the state machine
 	AirportBuildAutomata(Airport, FA);
-		DEBUG(misc, 1) ("#Elements %2d; #Terminals %2d in %d group(s); #Helipads %2d in %d group(s)", Airport->nofelements,
-				  Airport->nofterminals, Airport->nofterminalgroups, Airport->nofhelipads, Airport->nofhelipadgroups);
+		DEBUG(misc, 1) ("#Elements %2d; #Terminals %2d in %d group(s); #Helipads %2d in %d group(s); Entry Point %d", Airport->nofelements,
+				  nofterminals, nofterminalgroups, nofhelipads, nofhelipadgroups, Airport->entry_point);
 
 
 	{