Files
@ r27978:bcbbe240aea5
Branch filter:
Location: cpp/openttd-patchpack/source/src/newgrf_airport.h - annotation
r27978:bcbbe240aea5
7.6 KiB
text/x-c
Fix: Upgrading NewGRF presets could result in incomplete display of NewGRF parameters until restart.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | 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 r27166:64e04a3ef9b1 r15730:99440cf75a72 r14851:b3915c863ff3 r27887:31f1314e5d1a r27888:73e8956ac824 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 r27971:716575a43d7f 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 r27971:716575a43d7f r18604:49cb0a019581 r26744:108afc18327b 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 r27166:64e04a3ef9b1 r27166:64e04a3ef9b1 r14728:03e87eafbf54 r14708:daac455c605a r15725:0c28e29aa5d4 r15693:10940496c385 r27737:728d55b97775 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 r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27942:f7389062d120 r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27888:73e8956ac824 r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27888:73e8956ac824 r27888:73e8956ac824 r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27888:73e8956ac824 r27888:73e8956ac824 r27888:73e8956ac824 r27888:73e8956ac824 r27888:73e8956ac824 r27888:73e8956ac824 r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27887:31f1314e5d1a r27737:728d55b97775 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 "timer/timer_game_calendar.h"
#include "newgrf_class.h"
#include "newgrf_commons.h"
#include "newgrf_spritegroup.h"
#include "newgrf_town.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 ++() override
{
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;
}
std::unique_ptr<TileIterator> Clone() const override
{
return std::make_unique<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
TimerGameCalendar::Year min_year; ///< first year the airport is available
TimerGameCalendar::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_t 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();
/** Resolver for the airport scope. */
struct AirportScopeResolver : public ScopeResolver {
struct Station *st; ///< Station of the airport for which the callback is run, or \c nullptr for build gui.
byte airport_id; ///< Type of airport for which the callback is run.
byte layout; ///< Layout of the airport to build.
TileIndex tile; ///< Tile for the callback, only valid for airporttile callbacks.
/**
* Constructor of the scope resolver for an airport.
* @param ro Surrounding resolver.
* @param tile %Tile for the callback, only valid for airporttile callbacks.
* @param st %Station of the airport for which the callback is run, or \c nullptr for build gui.
* @param airport_id Type of airport for which the callback is run.
* @param layout Layout of the airport to build.
*/
AirportScopeResolver(ResolverObject &ro, TileIndex tile, Station *st, byte airport_id, byte layout)
: ScopeResolver(ro), st(st), airport_id(airport_id), layout(layout), tile(tile)
{
}
uint32_t GetRandomBits() const override;
uint32_t GetVariable(byte variable, [[maybe_unused]] uint32_t parameter, bool *available) const override;
void StorePSA(uint pos, int32_t value) override;
};
/** Resolver object for airports. */
struct AirportResolverObject : public ResolverObject {
AirportScopeResolver airport_scope;
std::unique_ptr<TownScopeResolver> town_scope; ///< The town scope resolver (created on the first call).
AirportResolverObject(TileIndex tile, Station *st, byte airport_id, byte layout,
CallbackID callback = CBID_NO_CALLBACK, uint32_t callback_param1 = 0, uint32_t callback_param2 = 0);
TownScopeResolver *GetTown();
ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, byte relative = 0) override
{
switch (scope) {
case VSG_SCOPE_SELF: return &this->airport_scope;
case VSG_SCOPE_PARENT:
{
TownScopeResolver *tsr = this->GetTown();
if (tsr != nullptr) return tsr;
FALLTHROUGH;
}
default: return ResolverObject::GetScope(scope, relative);
}
}
GrfSpecFeature GetFeature() const override;
uint32_t GetDebugID() const override;
};
StringID GetAirportTextCallback(const AirportSpec *as, byte layout, uint16_t callback);
#endif /* NEWGRF_AIRPORT_H */
|