Files @ r24498:e9114d9ab04a
Branch filter:

Location: cpp/openttd-patchpack/source/src/newgrf_airport.h - annotation

Patric Stout
Fix #6468: don't store version of AIs-started-via-console in name

You can do: "startai myai.3", which starts version 3 of "myai".
This is very useful for testing save/load code between different
versions of your AI.

However, when using this syntax, the AI got saved as "myai.3" as
name of the AI, instead of "myai". This caused several problems,
like indicating to the user the AI could not be found, but still
load the AI. But in all cases, the AI never got the chance to
load the saved data, making the whole reason this exists pointless.

By splitting the name and version already in the console command,
the code becomes simpler and AIs started this way now follow the
normal flow after initialization.
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r15934:789c54d0000d
r14618:a194334b4a3a
r15730:99440cf75a72
r14851:b3915c863ff3
r18604:49cb0a019581
r14618:a194334b4a3a
r17629:21e9dfd343cd
r14618:a194334b4a3a
r14618:a194334b4a3a
r15656:e21174b90f22
r14618:a194334b4a3a
r15656:e21174b90f22
r15656:e21174b90f22
r14618:a194334b4a3a
r14618:a194334b4a3a
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18782:6453522c2154
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18796:9773349625e3
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18605:ae5edad1d665
r18605:ae5edad1d665
r18605:ae5edad1d665
r18605:ae5edad1d665
r18605:ae5edad1d665
r18605:ae5edad1d665
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r18604:49cb0a019581
r14727:9ddd9a15dd3b
r14727:9ddd9a15dd3b
r14727:9ddd9a15dd3b
r14727:9ddd9a15dd3b
r14727:9ddd9a15dd3b
r14727:9ddd9a15dd3b
r14727:9ddd9a15dd3b
r14727:9ddd9a15dd3b
r14727:9ddd9a15dd3b
r14727:9ddd9a15dd3b
r14727:9ddd9a15dd3b
r14900:c679fdaeebe6
r14727:9ddd9a15dd3b
r14705:be9a20100bed
r14708:daac455c605a
r14705:be9a20100bed
r14705:be9a20100bed
r14705:be9a20100bed
r14705:be9a20100bed
r14705:be9a20100bed
r14705:be9a20100bed
r14859:60ec0ffb536d
r14859:60ec0ffb536d
r15656:e21174b90f22
r17926:2974cfac001c
r20667:47a3e7edbb11
r14859:60ec0ffb536d
r14859:60ec0ffb536d
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14755:86b8e81d785d
r14618:a194334b4a3a
r22687:887d71cc6873
r14756:4a18d12a6593
r14859:60ec0ffb536d
r14859:60ec0ffb536d
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14618:a194334b4a3a
r14728:03e87eafbf54
r14708:daac455c605a
r15725:0c28e29aa5d4
r15693:10940496c385
r19944:25a78576fb5e
r14729:e9e99770f7ff
r18845:66bf168f1100
r18845:66bf168f1100
r14618:a194334b4a3a
r14618:a194334b4a3a
r14726:e42b5d6d3c6a
r14618:a194334b4a3a
r14618:a194334b4a3a
r23570:fd1a0734432c
r14618:a194334b4a3a
r14725:026b6e13b803
r14725:026b6e13b803
r14730:3dabe1009fcf
r14730:3dabe1009fcf
r14730:3dabe1009fcf
r14730:3dabe1009fcf
r14730:3dabe1009fcf
r14730:3dabe1009fcf
r14730:3dabe1009fcf
r22687:887d71cc6873
r14725:026b6e13b803
r14725:026b6e13b803
r17629:21e9dfd343cd
r14618:a194334b4a3a
r14618:a194334b4a3a
r14727:9ddd9a15dd3b
r15730:99440cf75a72
r14727:9ddd9a15dd3b
r14727:9ddd9a15dd3b
r14618:a194334b4a3a
r15695:b17629bb1837
r15695:b17629bb1837
r14618:a194334b4a3a
/*
 * This file is part of OpenTTD.
 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
 */

/** @file newgrf_airport.h NewGRF handling of airports. */

#ifndef NEWGRF_AIRPORT_H
#define NEWGRF_AIRPORT_H

#include "airport.h"
#include "date_type.h"
#include "newgrf_class.h"
#include "newgrf_commons.h"
#include "tilearea_type.h"

/** Copy from station_map.h */
typedef byte StationGfx;

/** Tile-offset / AirportTileID pair. */
struct AirportTileTable {
	TileIndexDiffC ti; ///< Tile offset from  the top-most airport tile.
	StationGfx gfx;    ///< AirportTile to use for this tile.
};

/** Iterator to iterate over all tiles belonging to an airport spec. */
class AirportTileTableIterator : public TileIterator {
private:
	const AirportTileTable *att; ///< The offsets.
	TileIndex base_tile;         ///< The tile we base the offsets off.

public:
	/**
	 * Construct the iterator.
	 * @param att The TileTable we want to iterate over.
	 * @param base_tile The basetile for all offsets.
	 */
	AirportTileTableIterator(const AirportTileTable *att, TileIndex base_tile) : TileIterator(base_tile + ToTileIndexDiff(att->ti)), att(att), base_tile(base_tile)
	{
	}

	inline TileIterator& operator ++()
	{
		this->att++;
		if (this->att->ti.x == -0x80) {
			this->tile = INVALID_TILE;
		} else {
			this->tile = this->base_tile + ToTileIndexDiff(this->att->ti);
		}
		return *this;
	}

	/** Get the StationGfx for the current tile. */
	StationGfx GetStationGfx() const
	{
		return this->att->gfx;
	}

	virtual AirportTileTableIterator *Clone() const
	{
		return new AirportTileTableIterator(*this);
	}
};

/** 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 */
enum TTDPAirportType {
	ATP_TTDP_SMALL,    ///< Same as AT_SMALL
	ATP_TTDP_LARGE,    ///< Same as AT_LARGE
	ATP_TTDP_HELIPORT, ///< Same as AT_HELIPORT
	ATP_TTDP_OILRIG,   ///< Same as AT_OILRIG
};

/** A list of all hangar tiles in an airport */
struct HangarTileTable {
	TileIndexDiffC ti; ///< Tile offset from the top-most airport tile.
	Direction dir;     ///< Direction of the exit.
	byte hangar_num;   ///< The hangar to which this tile belongs.
};

/**
 * Defines the data structure for an airport.
 */
struct AirportSpec {
	const struct AirportFTAClass *fsm;     ///< the finite statemachine for the default airports
	const AirportTileTable * const *table; ///< list of the tiles composing the airport
	const Direction *rotation;             ///< the rotation of each tiletable
	byte num_table;                        ///< number of elements in the table
	const HangarTileTable *depot_table;    ///< gives the position of the depots on the airports
	byte nof_depots;                       ///< the number of hangar tiles in this airport
	byte size_x;                           ///< size of airport in x direction
	byte size_y;                           ///< size of airport in y direction
	byte noise_level;                      ///< noise that this airport generates
	byte catchment;                        ///< catchment area of this airport
	Year min_year;                         ///< first year the airport is available
	Year max_year;                         ///< last year the airport is available
	StringID name;                         ///< name of this airport
	TTDPAirportType ttd_airport_type;      ///< ttdpatch airport type (Small/Large/Helipad/Oilrig)
	AirportClassID cls_id;                 ///< the class to which this airport type belongs
	SpriteID preview_sprite;               ///< preview sprite for this airport
	uint16 maintenance_cost;               ///< maintenance cost multiplier
	/* Newgrf data */
	bool enabled;                          ///< Entity still available (by default true). Newgrf can disable it, though.
	struct GRFFileProps grf_prop;          ///< Properties related to the grf file.

	static const AirportSpec *Get(byte type);
	static AirportSpec *GetWithoutOverride(byte type);

	bool IsAvailable() const;
	bool IsWithinMapBounds(byte table, TileIndex index) const;

	static void ResetAirports();

	/** Get the index of this spec. */
	byte GetIndex() const
	{
		assert(this >= specs && this < endof(specs));
		return (byte)(this - specs);
	}

	static const AirportSpec dummy; ///< The dummy airport.

private:
	static AirportSpec specs[NUM_AIRPORTS]; ///< Specs of the airports.
};

/** Information related to airport classes. */
typedef NewGRFClass<AirportSpec, AirportClassID, APC_MAX> AirportClass;

void BindAirportSpecs();

StringID GetAirportTextCallback(const AirportSpec *as, byte layout, uint16 callback);

#endif /* NEWGRF_AIRPORT_H */