2009-08-21 20:21:05 +00:00
/*
* 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/>.
*/
2008-05-06 15:11:33 +00:00
/** @file newgrf.h Base for the NewGRF implementation. */
2007-03-21 03:06:21 +00:00
2004-11-17 20:08:13 +00:00
# ifndef NEWGRF_H
# define NEWGRF_H
2007-02-24 19:36:47 +00:00
# include "cargotype.h"
2009-02-08 18:11:06 +00:00
# include "rail_type.h"
2019-04-06 06:46:15 +00:00
# include "road_type.h"
2011-08-24 13:48:29 +00:00
# include "fileio_type.h"
2012-01-01 16:38:38 +00:00
# include "core/bitmath_func.hpp"
2012-05-25 20:54:54 +00:00
# include "core/alloc_type.hpp"
2012-05-25 20:57:36 +00:00
# include "core/smallvec_type.hpp"
2004-11-19 22:53:18 +00:00
2011-09-11 09:31:57 +00:00
/**
* List of different canal ' features ' .
* Each feature gets an entry in the canal spritegroup table
*/
enum CanalFeature {
CF_WATERSLOPE ,
CF_LOCKS ,
CF_DIKES ,
CF_ICON ,
CF_DOCKS ,
CF_RIVER_SLOPE ,
CF_RIVER_EDGE ,
2011-10-02 20:26:43 +00:00
CF_RIVER_GUI ,
CF_BUOY ,
2011-09-11 09:31:57 +00:00
CF_END ,
} ;
/** Canal properties local to the NewGRF */
struct CanalProperties {
uint8 callback_mask ; ///< Bitmask of canal callbacks that have to be called.
uint8 flags ; ///< Flags controlling display.
} ;
2007-03-07 12:11:48 +00:00
enum GrfLoadingStage {
2006-12-04 08:30:04 +00:00
GLS_FILESCAN ,
2006-12-12 19:38:41 +00:00
GLS_SAFETYSCAN ,
2006-12-03 23:46:54 +00:00
GLS_LABELSCAN ,
GLS_INIT ,
2007-03-22 23:19:40 +00:00
GLS_RESERVE ,
2006-12-03 23:46:54 +00:00
GLS_ACTIVATION ,
GLS_END ,
2007-03-07 12:11:48 +00:00
} ;
2006-12-03 23:46:54 +00:00
2010-03-23 22:25:43 +00:00
DECLARE_POSTFIX_INCREMENT ( GrfLoadingStage )
2007-01-10 18:56:51 +00:00
2007-04-27 21:35:02 +00:00
enum GrfMiscBit {
GMB_DESERT_TREES_FIELDS = 0 , // Unsupported.
GMB_DESERT_PAVED_ROADS = 1 ,
GMB_FIELD_BOUNDING_BOX = 2 , // Unsupported.
2009-07-17 22:00:13 +00:00
GMB_TRAIN_WIDTH_32_PIXELS = 3 , ///< Use 32 pixels per train vehicle in depot gui and vehicle details. Never set in the global variable; @see GRFFile::traininfo_vehicle_width
2011-11-04 21:05:08 +00:00
GMB_AMBIENT_SOUND_CALLBACK = 4 ,
2007-04-27 21:35:02 +00:00
GMB_CATENARY_ON_3RD_TRACK = 5 , // Unsupported.
2015-03-20 19:27:15 +00:00
GMB_SECOND_ROCKY_TILE_SET = 6 ,
2007-04-27 21:35:02 +00:00
} ;
2007-01-10 18:56:51 +00:00
2008-02-12 11:08:47 +00:00
enum GrfSpecFeature {
2010-04-24 11:52:58 +00:00
GSF_TRAINS ,
GSF_ROADVEHICLES ,
GSF_SHIPS ,
2008-02-12 11:08:47 +00:00
GSF_AIRCRAFT ,
2010-04-24 11:52:58 +00:00
GSF_STATIONS ,
GSF_CANALS ,
GSF_BRIDGES ,
GSF_HOUSES ,
2008-02-12 11:08:47 +00:00
GSF_GLOBALVAR ,
GSF_INDUSTRYTILES ,
GSF_INDUSTRIES ,
2011-12-15 21:56:00 +00:00
GSF_CARGOES ,
2008-02-12 11:08:47 +00:00
GSF_SOUNDFX ,
2010-01-30 21:49:22 +00:00
GSF_AIRPORTS ,
GSF_SIGNALS ,
GSF_OBJECTS ,
GSF_RAILTYPES ,
2010-02-22 14:16:19 +00:00
GSF_AIRPORTTILES ,
2019-04-06 06:46:15 +00:00
GSF_ROADTYPES ,
GSF_TRAMTYPES ,
2008-02-12 11:08:47 +00:00
GSF_END ,
2010-04-24 13:36:29 +00:00
GSF_FAKE_TOWNS = GSF_END , ///< Fake town GrfSpecFeature for NewGRF debugging (parent scope)
GSF_FAKE_END , ///< End of the fake features
2011-12-19 17:48:04 +00:00
GSF_INVALID = 0xFF , ///< An invalid spec feature
2008-02-12 11:08:47 +00:00
} ;
2009-03-08 16:51:08 +00:00
static const uint32 INVALID_GRFID = 0xFFFFFFFF ;
2007-03-07 12:11:48 +00:00
struct GRFLabel {
2006-04-15 21:27:59 +00:00
byte label ;
uint32 nfo_line ;
2008-05-27 21:41:00 +00:00
size_t pos ;
2006-04-15 21:27:59 +00:00
struct GRFLabel * next ;
2007-03-07 12:11:48 +00:00
} ;
2006-04-15 21:27:59 +00:00
2009-07-17 22:00:13 +00:00
/** Dynamic data of a loaded NewGRF */
2012-05-25 20:54:54 +00:00
struct GRFFile : ZeroedMemoryAllocator {
2004-11-17 20:08:13 +00:00
char * filename ;
uint32 grfid ;
2006-04-23 18:03:55 +00:00
byte grf_version ;
2004-11-17 20:08:13 +00:00
2006-09-27 18:17:01 +00:00
uint sound_offset ;
2010-04-20 05:52:51 +00:00
uint16 num_sounds ;
2006-09-27 18:17:01 +00:00
2010-08-08 09:07:40 +00:00
struct StationSpec * * stations ;
struct HouseSpec * * housespec ;
struct IndustrySpec * * industryspec ;
struct IndustryTileSpec * * indtspec ;
2010-08-28 18:21:09 +00:00
struct ObjectSpec * * objectspec ;
2010-03-18 23:12:38 +00:00
struct AirportSpec * * airportspec ;
2010-02-22 14:16:19 +00:00
struct AirportTileSpec * * airtspec ;
2005-08-15 21:19:28 +00:00
uint32 param [ 0x80 ] ;
2007-03-21 03:06:21 +00:00
uint param_end ; ///< one more than the highest set parameter
2006-04-15 21:27:59 +00:00
GRFLabel * label ; ///< Pointer to the first label. This is a linked list, not an array.
2007-02-24 19:36:47 +00:00
2019-03-04 20:49:33 +00:00
std : : vector < CargoLabel > cargo_list ; ///< Cargo translation table (local ID -> label)
2012-05-25 20:57:36 +00:00
uint8 cargo_map [ NUM_CARGO ] ; ///< Inverse cargo translation table (CargoID -> local ID)
2009-02-08 18:11:06 +00:00
2019-03-04 20:49:33 +00:00
std : : vector < RailTypeLabel > railtype_list ; ///< Railtype translation table
2019-04-22 06:39:52 +00:00
RailType railtype_map [ RAILTYPE_END ] ;
2009-07-17 22:00:13 +00:00
2019-04-06 06:46:15 +00:00
std : : vector < RoadTypeLabel > roadtype_list ; ///< Roadtype translation table (road)
RoadType roadtype_map [ ROADTYPE_END ] ;
2020-06-01 09:25:58 +00:00
std : : vector < RoadTypeLabel > tramtype_list ; ///< Roadtype translation table (tram)
2019-04-06 06:46:15 +00:00
RoadType tramtype_map [ ROADTYPE_END ] ;
2011-09-11 09:31:57 +00:00
CanalProperties canal_local_properties [ CF_END ] ; ///< Canal properties as set by this NewGRF
2010-11-16 12:47:22 +00:00
struct LanguageMap * language_map ; ///< Mappings related to the languages.
2019-09-29 20:27:32 +00:00
int traininfo_vehicle_pitch ; ///< Vertical offset for drawing train images in depot GUI and vehicle details
2010-05-13 09:44:44 +00:00
uint traininfo_vehicle_width ; ///< Width (in pixels) of a 8/8 train vehicle in depot GUI and vehicle details
2009-11-24 13:15:58 +00:00
uint32 grf_features ; ///< Bitset of GrfSpecFeature the grf uses
PriceMultipliers price_base_multipliers ; ///< Price base multipliers as set by the grf.
2010-01-03 19:29:56 +00:00
2012-05-25 20:54:54 +00:00
GRFFile ( const struct GRFConfig * config ) ;
~ GRFFile ( ) ;
2010-01-03 19:29:56 +00:00
/** Get GRF Parameter with range checking */
uint32 GetParam ( uint number ) const
{
/* Note: We implicitly test for number < lengthof(this->param) and return 0 for invalid parameters.
* In fact this is the more important test , as param is zeroed anyway . */
assert ( this - > param_end < = lengthof ( this - > param ) ) ;
return ( number < this - > param_end ) ? this - > param [ number ] : 0 ;
}
2007-03-07 12:11:48 +00:00
} ;
2004-11-17 20:08:13 +00:00
2008-01-24 14:49:40 +00:00
enum ShoreReplacement {
SHORE_REPLACE_NONE , ///< No shore sprites were replaced.
SHORE_REPLACE_ACTION_5 , ///< Shore sprites were replaced by Action5.
SHORE_REPLACE_ACTION_A , ///< Shore sprites were replaced by ActionA (using grass tiles for the corner-shores).
SHORE_REPLACE_ONLY_NEW , ///< Only corner-shores were loaded by Action5 (openttd(w/d).grf only).
} ;
2019-04-06 06:46:15 +00:00
enum TramReplacement {
TRAMWAY_REPLACE_DEPOT_NONE , ///< No tram depot graphics were loaded.
TRAMWAY_REPLACE_DEPOT_WITH_TRACK , ///< Electrified depot graphics with tram track were loaded.
TRAMWAY_REPLACE_DEPOT_NO_TRACK , ///< Electrified depot graphics without tram track were loaded.
} ;
2007-06-15 23:55:52 +00:00
struct GRFLoadedFeatures {
bool has_2CC ; ///< Set if any vehicle is loaded which uses 2cc (two company colours).
2010-09-25 21:59:22 +00:00
uint64 used_liveries ; ///< Bitmask of #LiveryScheme used by the defined engines.
2019-04-15 20:06:41 +00:00
ShoreReplacement shore ; ///< In which way shore sprites were replaced.
2019-04-06 06:46:15 +00:00
TramReplacement tram ; ///< In which way tram depots were replaced.
2007-05-31 19:13:41 +00:00
} ;
2012-01-01 16:38:38 +00:00
/**
2013-01-08 22:46:42 +00:00
* Check for grf miscellaneous bits
2012-01-01 16:38:38 +00:00
* @ param bit The bit to check .
* @ return Whether the bit is set .
*/
static inline bool HasGrfMiscBit ( GrfMiscBit bit )
{
extern byte _misc_grf_features ;
return HasBit ( _misc_grf_features , bit ) ;
}
2007-05-31 19:13:41 +00:00
/* Indicates which are the newgrf features currently loaded ingame */
2007-06-15 23:55:52 +00:00
extern GRFLoadedFeatures _loaded_newgrf_features ;
2004-11-19 22:53:18 +00:00
2012-02-04 13:29:04 +00:00
byte GetGRFContainerVersion ( ) ;
2011-08-24 13:48:29 +00:00
void LoadNewGRFFile ( struct GRFConfig * config , uint file_index , GrfLoadingStage stage , Subdirectory subdir ) ;
2017-01-14 15:48:19 +00:00
void LoadNewGRF ( uint load_index , uint file_index , uint num_baseset ) ;
2009-01-04 15:32:25 +00:00
void ReloadNewGRFData ( ) ; // in saveload/afterload.cpp
2010-09-06 18:20:07 +00:00
void ResetNewGRFData ( ) ;
2011-07-29 22:23:17 +00:00
void ResetPersistentNewGRFData ( ) ;
2004-11-17 20:08:13 +00:00
2009-05-10 17:27:25 +00:00
void CDECL grfmsg ( int severity , const char * str , . . . ) WARN_FORMAT ( 2 , 3 ) ;
2006-12-26 17:36:18 +00:00
2011-11-08 17:28:52 +00:00
bool GetGlobalVariable ( byte param , uint32 * value , const GRFFile * grffile ) ;
2007-04-27 21:35:02 +00:00
2008-02-29 08:48:01 +00:00
StringID MapGRFStringID ( uint32 grfid , StringID str ) ;
2009-12-15 00:00:51 +00:00
void ShowNewGRFError ( ) ;
2008-02-29 08:48:01 +00:00
2004-11-17 20:08:13 +00:00
# endif /* NEWGRF_H */