mirror of https://github.com/OpenTTD/OpenTTD
(svn r19325) -Codechange: introduce airport classes and split the default airports in 4 classes
parent
d03d990f33
commit
a71462bb94
|
@ -2030,6 +2030,11 @@ STR_STATION_BUILD_AIRPORT_LARGE_AIRPORTS :{BLACK}Large ai
|
||||||
STR_STATION_BUILD_AIRPORT_HUB_AIRPORTS :{BLACK}Hub airports
|
STR_STATION_BUILD_AIRPORT_HUB_AIRPORTS :{BLACK}Hub airports
|
||||||
STR_STATION_BUILD_AIRPORT_HELIPORTS :{BLACK}Helicopter airports
|
STR_STATION_BUILD_AIRPORT_HELIPORTS :{BLACK}Helicopter airports
|
||||||
|
|
||||||
|
STR_AIRPORT_CLASS_SMALL :Small airports
|
||||||
|
STR_AIRPORT_CLASS_LARGE :Large airports
|
||||||
|
STR_AIRPORT_CLASS_HUB :Hub airports
|
||||||
|
STR_AIRPORT_CLASS_HELIPORTS :Helicopter airports
|
||||||
|
|
||||||
STR_STATION_BUILD_NOISE :{BLACK}Noise generated: {GOLD}{COMMA}
|
STR_STATION_BUILD_NOISE :{BLACK}Noise generated: {GOLD}{COMMA}
|
||||||
|
|
||||||
# Landscaping toolbar
|
# Landscaping toolbar
|
||||||
|
|
|
@ -5907,6 +5907,7 @@ static void ResetNewGRFData()
|
||||||
ResetCustomStations();
|
ResetCustomStations();
|
||||||
|
|
||||||
/* Reset airport-related structures */
|
/* Reset airport-related structures */
|
||||||
|
ResetAirportClasses();
|
||||||
ResetCustomAirports();
|
ResetCustomAirports();
|
||||||
AirportSpec::ResetAirports();
|
AirportSpec::ResetAirports();
|
||||||
AirportTileSpec::ResetAirportTiles();
|
AirportTileSpec::ResetAirportTiles();
|
||||||
|
@ -6633,6 +6634,7 @@ static void AfterLoadGRFs()
|
||||||
|
|
||||||
/* Add all new airports to the airports array. */
|
/* Add all new airports to the airports array. */
|
||||||
FinaliseAirportsArray();
|
FinaliseAirportsArray();
|
||||||
|
BindAirportSpecs();
|
||||||
|
|
||||||
/* Update the townname generators list */
|
/* Update the townname generators list */
|
||||||
InitGRFTownGeneratorNames();
|
InitGRFTownGeneratorNames();
|
||||||
|
|
|
@ -14,9 +14,14 @@
|
||||||
#include "newgrf_airport.h"
|
#include "newgrf_airport.h"
|
||||||
#include "date_func.h"
|
#include "date_func.h"
|
||||||
#include "settings_type.h"
|
#include "settings_type.h"
|
||||||
|
#include "core/alloc_type.hpp"
|
||||||
|
#include "newgrf.h"
|
||||||
|
#include "table/strings.h"
|
||||||
|
|
||||||
AirportSpec AirportSpec::dummy = {NULL, NULL, 0, 0, 0, 0, 0, MIN_YEAR, MIN_YEAR, ATP_TTDP_LARGE};
|
static AirportClass _airport_classes[APC_MAX];
|
||||||
AirportSpec AirportSpec::oilrig = {NULL, NULL, 0, 1, 1, 0, 4, MIN_YEAR, MIN_YEAR, ATP_TTDP_OILRIG};
|
|
||||||
|
AirportSpec AirportSpec::dummy = {NULL, NULL, 0, 0, 0, 0, 0, MIN_YEAR, MIN_YEAR, ATP_TTDP_LARGE, APC_BEGIN};
|
||||||
|
AirportSpec AirportSpec::oilrig = {NULL, NULL, 0, 1, 1, 0, 4, MIN_YEAR, MIN_YEAR, ATP_TTDP_OILRIG, APC_BEGIN};
|
||||||
|
|
||||||
AirportSpec AirportSpec::specs[NUM_AIRPORTS];
|
AirportSpec AirportSpec::specs[NUM_AIRPORTS];
|
||||||
|
|
||||||
|
@ -62,3 +67,141 @@ void AirportSpec::ResetAirports()
|
||||||
memset(&AirportSpec::specs, 0, sizeof(AirportSpec::specs));
|
memset(&AirportSpec::specs, 0, sizeof(AirportSpec::specs));
|
||||||
memcpy(&AirportSpec::specs, &_origin_airport_specs, sizeof(AirportSpec) * NUM_AIRPORTS);
|
memcpy(&AirportSpec::specs, &_origin_airport_specs, sizeof(AirportSpec) * NUM_AIRPORTS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate an airport class for the given class id
|
||||||
|
* @param cls A 32 bit value identifying the class
|
||||||
|
* @return Index into _airport_classes of allocated class
|
||||||
|
*/
|
||||||
|
AirportClassID AllocateAirportClass(uint32 cls)
|
||||||
|
{
|
||||||
|
for (AirportClassID i = APC_BEGIN; i < APC_MAX; i++) {
|
||||||
|
if (_airport_classes[i].id == cls) {
|
||||||
|
/* ClassID is already allocated, so reuse it. */
|
||||||
|
return i;
|
||||||
|
} else if (_airport_classes[i].id == 0) {
|
||||||
|
/* This class is empty, so allocate it to the ClassID. */
|
||||||
|
_airport_classes[i].id = cls;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grfmsg(2, "AllocateAirportClass: already allocated %d classes, using small airports class", APC_MAX);
|
||||||
|
return APC_SMALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the name of an airport class
|
||||||
|
* @param id The id of the class to change the name from
|
||||||
|
* @param name The new name for the class
|
||||||
|
*/
|
||||||
|
void SetAirportClassName(AirportClassID id, StringID name)
|
||||||
|
{
|
||||||
|
assert(id < APC_MAX);
|
||||||
|
_airport_classes[id].name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the name of an airport class
|
||||||
|
* @param id The id of the airport class to get the name from
|
||||||
|
* @return The name of the given class
|
||||||
|
*/
|
||||||
|
StringID GetAirportClassName(AirportClassID id)
|
||||||
|
{
|
||||||
|
assert(id < APC_MAX);
|
||||||
|
return _airport_classes[id].name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the number of airport classes in use
|
||||||
|
* @return The number of airport classes
|
||||||
|
*/
|
||||||
|
uint GetNumAirportClasses()
|
||||||
|
{
|
||||||
|
uint i;
|
||||||
|
for (i = APC_BEGIN; i < APC_MAX && _airport_classes[i].id != 0; i++) {}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of airports for the given airport class.
|
||||||
|
* @param id Index of the airport class.
|
||||||
|
* @return Number of airports in the class.
|
||||||
|
*/
|
||||||
|
uint GetNumAirportsInClass(AirportClassID id)
|
||||||
|
{
|
||||||
|
assert(id < APC_MAX);
|
||||||
|
return _airport_classes[id].airports;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tie an airport spec to its airport class.
|
||||||
|
* @param statspec The airport spec.
|
||||||
|
*/
|
||||||
|
static void BindAirportSpecToClass(AirportSpec *as)
|
||||||
|
{
|
||||||
|
assert(as->aclass < APC_MAX);
|
||||||
|
AirportClass *airport_class = &_airport_classes[as->aclass];
|
||||||
|
|
||||||
|
int i = airport_class->airports++;
|
||||||
|
airport_class->spec = ReallocT(airport_class->spec, airport_class->airports);
|
||||||
|
|
||||||
|
airport_class->spec[i] = as;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tie all airportspecs to their class.
|
||||||
|
*/
|
||||||
|
void BindAirportSpecs()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < NUM_AIRPORTS; i++) {
|
||||||
|
AirportSpec *as = AirportSpec::GetWithoutOverride(i);
|
||||||
|
BindAirportSpecToClass(as);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve an airport spec from a class.
|
||||||
|
* @param aclass Index of the airport class.
|
||||||
|
* @param airport The airport index with the class.
|
||||||
|
* @return The station spec.
|
||||||
|
*/
|
||||||
|
const AirportSpec *GetAirportSpecFromClass(AirportClassID aclass, uint airport)
|
||||||
|
{
|
||||||
|
assert(aclass < APC_MAX);
|
||||||
|
assert(airport < _airport_classes[aclass].airports);
|
||||||
|
|
||||||
|
return _airport_classes[aclass].spec[airport];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset airport classes to their default state.
|
||||||
|
* This includes initialising the defaults classes with an empty
|
||||||
|
* entry, for standard airports.
|
||||||
|
*/
|
||||||
|
void ResetAirportClasses()
|
||||||
|
{
|
||||||
|
for (AirportClassID i = APC_BEGIN; i < APC_MAX; i++) {
|
||||||
|
_airport_classes[i].id = 0;
|
||||||
|
_airport_classes[i].name = STR_EMPTY;
|
||||||
|
_airport_classes[i].airports = 0;
|
||||||
|
|
||||||
|
free(_airport_classes[i].spec);
|
||||||
|
_airport_classes[i].spec = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set up initial data */
|
||||||
|
AirportClassID id = AllocateAirportClass('SMAL');
|
||||||
|
SetAirportClassName(id, STR_AIRPORT_CLASS_SMALL);
|
||||||
|
|
||||||
|
id = AllocateAirportClass('LARG');
|
||||||
|
SetAirportClassName(id, STR_AIRPORT_CLASS_LARGE);
|
||||||
|
|
||||||
|
id = AllocateAirportClass('HUB_');
|
||||||
|
SetAirportClassName(id, STR_AIRPORT_CLASS_HUB);
|
||||||
|
|
||||||
|
id = AllocateAirportClass('HELI');
|
||||||
|
SetAirportClassName(id, STR_AIRPORT_CLASS_HELIPORTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "date_type.h"
|
#include "date_type.h"
|
||||||
#include "map_type.h"
|
#include "map_type.h"
|
||||||
|
#include "strings_type.h"
|
||||||
|
|
||||||
/* Copy from station_map.h */
|
/* Copy from station_map.h */
|
||||||
typedef byte StationGfx;
|
typedef byte StationGfx;
|
||||||
|
@ -23,6 +24,19 @@ struct AirportTileTable {
|
||||||
StationGfx gfx;
|
StationGfx gfx;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** List of default airport classes. */
|
||||||
|
enum AirportClassID {
|
||||||
|
APC_BEGIN = 0, ///< Lowest valid airport class id
|
||||||
|
APC_SMALL = 0, ///< id for small airports class
|
||||||
|
APC_LARGE, ///< id for large airports class
|
||||||
|
APC_HUB, ///< id for hub airports class
|
||||||
|
APC_HELIPORT, ///< id for heliports
|
||||||
|
APC_MAX = 16, ///< maximum number of airport classes
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Allow incrementing of AirportClassID variables */
|
||||||
|
DECLARE_POSTFIX_INCREMENT(AirportClassID);
|
||||||
|
|
||||||
/** TTDP airport types. Used to map our types to TTDPatch's */
|
/** TTDP airport types. Used to map our types to TTDPatch's */
|
||||||
enum TTDPAirportType {
|
enum TTDPAirportType {
|
||||||
ATP_TTDP_SMALL, ///< Same as AT_SMALL
|
ATP_TTDP_SMALL, ///< Same as AT_SMALL
|
||||||
|
@ -45,6 +59,7 @@ struct AirportSpec {
|
||||||
Year min_year; ///< first year the airport is available
|
Year min_year; ///< first year the airport is available
|
||||||
Year max_year; ///< last year the airport is available
|
Year max_year; ///< last year the airport is available
|
||||||
TTDPAirportType ttd_airport_type; ///< ttdpatch airport type (Small/Large/Helipad/Oilrig)
|
TTDPAirportType ttd_airport_type; ///< ttdpatch airport type (Small/Large/Helipad/Oilrig)
|
||||||
|
AirportClassID aclass; ///< the class to which this airport type belongs
|
||||||
|
|
||||||
static const AirportSpec *Get(byte type);
|
static const AirportSpec *Get(byte type);
|
||||||
static AirportSpec *GetWithoutOverride(byte type);
|
static AirportSpec *GetWithoutOverride(byte type);
|
||||||
|
@ -60,5 +75,23 @@ private:
|
||||||
static AirportSpec specs[NUM_AIRPORTS];
|
static AirportSpec specs[NUM_AIRPORTS];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Information related to airport classes. */
|
||||||
|
struct AirportClass {
|
||||||
|
uint32 id; ///< ID of this class, e.g. 'SMAL', 'LARG', 'HUB_', 'HELI', etc.
|
||||||
|
StringID name; ///< name of this class
|
||||||
|
uint airports; ///< number of airports in this class
|
||||||
|
AirportSpec **spec; ///< array of airport specifications
|
||||||
|
};
|
||||||
|
|
||||||
|
void ResetAirportClasses();
|
||||||
|
AirportClassID AllocateAirportClass(uint32 cls);
|
||||||
|
void SetAirportClassName(AirportClassID id, StringID name);
|
||||||
|
StringID GetAirportClassName(AirportClassID id);
|
||||||
|
|
||||||
|
uint GetNumAirportClasses();
|
||||||
|
uint GetNumAirportsInClass(AirportClassID id);
|
||||||
|
|
||||||
|
void BindAirportSpecs();
|
||||||
|
const AirportSpec *GetAirportSpecFromClass(AirportClassID aclass, uint airport);
|
||||||
|
|
||||||
#endif /* NEWGRF_AIRPORT_H */
|
#endif /* NEWGRF_AIRPORT_H */
|
||||||
|
|
|
@ -377,28 +377,28 @@ static AirportTileTable *_tile_table_helistation[] = {
|
||||||
#undef MKEND
|
#undef MKEND
|
||||||
|
|
||||||
/** General AirportSpec definition. */
|
/** General AirportSpec definition. */
|
||||||
#define AS_GENERIC(att, depot_tbl, num_depots, size_x, size_y, noise, catchment, min_year, max_year, ttdpatch_type) \
|
#define AS_GENERIC(att, depot_tbl, num_depots, size_x, size_y, noise, catchment, min_year, max_year, ttdpatch_type, class_id) \
|
||||||
{att, depot_tbl, num_depots, size_x, size_y, noise, catchment, min_year, max_year, ttdpatch_type}
|
{att, depot_tbl, num_depots, size_x, size_y, noise, catchment, min_year, max_year, ttdpatch_type, class_id}
|
||||||
|
|
||||||
/** AirportSpec definition for airports without any depot. */
|
/** AirportSpec definition for airports without any depot. */
|
||||||
#define AS_ND(ap_name, size_x, size_y, min_year, max_year, catchment, noise, ttdpatch_type) \
|
#define AS_ND(ap_name, size_x, size_y, min_year, max_year, catchment, noise, ttdpatch_type, class_id) \
|
||||||
AS_GENERIC(_tile_table_##ap_name, NULL, 0, size_x, size_y, noise, catchment, min_year, max_year, ttdpatch_type)
|
AS_GENERIC(_tile_table_##ap_name, NULL, 0, size_x, size_y, noise, catchment, min_year, max_year, ttdpatch_type, class_id)
|
||||||
|
|
||||||
/** AirportSpec definition for airports with at least one depot. */
|
/** AirportSpec definition for airports with at least one depot. */
|
||||||
#define AS(ap_name, size_x, size_y, min_year, max_year, catchment, noise, ttdpatch_type) \
|
#define AS(ap_name, size_x, size_y, min_year, max_year, catchment, noise, ttdpatch_type, class_id) \
|
||||||
AS_GENERIC(_tile_table_##ap_name, _airport_depots_##ap_name, lengthof(_airport_depots_##ap_name), size_x, size_y, noise, catchment, min_year, max_year, ttdpatch_type)
|
AS_GENERIC(_tile_table_##ap_name, _airport_depots_##ap_name, lengthof(_airport_depots_##ap_name), size_x, size_y, noise, catchment, min_year, max_year, ttdpatch_type, class_id)
|
||||||
|
|
||||||
/* The helidepot and helistation have ATP_TTDP_SMALL because they are at ground level */
|
/* The helidepot and helistation have ATP_TTDP_SMALL because they are at ground level */
|
||||||
extern const AirportSpec _origin_airport_specs[] = {
|
extern const AirportSpec _origin_airport_specs[] = {
|
||||||
AS(country, 4, 3, 0, 1959, 4, 3, ATP_TTDP_SMALL),
|
AS(country, 4, 3, 0, 1959, 4, 3, ATP_TTDP_SMALL, APC_SMALL),
|
||||||
AS(city, 6, 6, 1955, MAX_YEAR, 5, 5, ATP_TTDP_LARGE),
|
AS(city, 6, 6, 1955, MAX_YEAR, 5, 5, ATP_TTDP_LARGE, APC_LARGE),
|
||||||
AS_ND(heliport, 1, 1, 1963, MAX_YEAR, 4, 1, ATP_TTDP_HELIPORT),
|
AS_ND(heliport, 1, 1, 1963, MAX_YEAR, 4, 1, ATP_TTDP_HELIPORT, APC_HELIPORT),
|
||||||
AS(metropolitan, 6, 6, 1980, MAX_YEAR, 6, 8, ATP_TTDP_LARGE),
|
AS(metropolitan, 6, 6, 1980, MAX_YEAR, 6, 8, ATP_TTDP_LARGE, APC_LARGE),
|
||||||
AS(international, 7, 7, 1990, MAX_YEAR, 8, 17, ATP_TTDP_LARGE),
|
AS(international, 7, 7, 1990, MAX_YEAR, 8, 17, ATP_TTDP_LARGE, APC_HUB),
|
||||||
AS(commuter, 5, 4, 1983, MAX_YEAR, 4, 4, ATP_TTDP_SMALL),
|
AS(commuter, 5, 4, 1983, MAX_YEAR, 4, 4, ATP_TTDP_SMALL, APC_SMALL),
|
||||||
AS(helidepot, 2, 2, 1976, MAX_YEAR, 4, 2, ATP_TTDP_SMALL),
|
AS(helidepot, 2, 2, 1976, MAX_YEAR, 4, 2, ATP_TTDP_SMALL, APC_HELIPORT),
|
||||||
AS(intercontinental, 9, 11, 2002, MAX_YEAR, 10, 25, ATP_TTDP_LARGE),
|
AS(intercontinental, 9, 11, 2002, MAX_YEAR, 10, 25, ATP_TTDP_LARGE, APC_HUB),
|
||||||
AS(helistation, 4, 2, 1980, MAX_YEAR, 4, 3, ATP_TTDP_SMALL),
|
AS(helistation, 4, 2, 1980, MAX_YEAR, 4, 3, ATP_TTDP_SMALL, APC_HELIPORT),
|
||||||
};
|
};
|
||||||
|
|
||||||
assert_compile(NUM_AIRPORTS == lengthof(_origin_airport_specs));
|
assert_compile(NUM_AIRPORTS == lengthof(_origin_airport_specs));
|
||||||
|
|
Loading…
Reference in New Issue