tron@2186: /* $Id$ */ tron@2186: rubidium@10455: /** @file newgrf.h Base for the NewGRF implementation. */ glx@9505: dominik@455: #ifndef NEWGRF_H dominik@455: #define NEWGRF_H dominik@455: rubidium@9723: #include "town_type.h" peter1138@5228: #include "newgrf_config.h" peter1138@6469: #include "cargotype.h" rubidium@9723: #include "industry_type.h" rubidium@9837: #include "station_type.h" pasky@463: rubidium@6574: enum GrfLoadingStage { peter1138@5228: GLS_FILESCAN, peter1138@5329: GLS_SAFETYSCAN, peter1138@5225: GLS_LABELSCAN, peter1138@5225: GLS_INIT, truelight@9517: GLS_RESERVE, peter1138@5225: GLS_ACTIVATION, peter1138@5225: GLS_END, rubidium@6574: }; peter1138@5225: rubidium@5838: DECLARE_POSTFIX_INCREMENT(GrfLoadingStage); rubidium@5838: rubidium@9620: enum GrfMiscBit { rubidium@9620: GMB_DESERT_TREES_FIELDS = 0, // Unsupported. rubidium@9620: GMB_DESERT_PAVED_ROADS = 1, rubidium@9620: GMB_FIELD_BOUNDING_BOX = 2, // Unsupported. rubidium@9620: GMB_TRAIN_WIDTH_32_PIXELS = 3, rubidium@9620: GMB_AMBIENT_SOUND_CALLBACK = 4, // Unsupported. rubidium@9620: GMB_CATENARY_ON_3RD_TRACK = 5, // Unsupported. rubidium@9620: }; rubidium@5838: glx@9732: enum GrfSpecFeature { glx@9732: GSF_TRAIN, glx@9732: GSF_ROAD, glx@9732: GSF_SHIP, glx@9732: GSF_AIRCRAFT, glx@9732: GSF_STATION, glx@9732: GSF_CANAL, glx@9732: GSF_BRIDGE, glx@9732: GSF_TOWNHOUSE, glx@9732: GSF_GLOBALVAR, glx@9732: GSF_INDUSTRYTILES, glx@9732: GSF_INDUSTRIES, glx@9732: GSF_CARGOS, glx@9732: GSF_SOUNDFX, glx@9732: GSF_END, glx@9732: }; glx@9732: rubidium@6574: struct GRFLabel { Darkvater@3561: byte label; Darkvater@3561: uint32 nfo_line; glx@10776: size_t pos; Darkvater@3561: struct GRFLabel *next; rubidium@6574: }; Darkvater@3561: rubidium@6574: struct GRFFile { dominik@455: char *filename; rubidium@9723: bool is_ottdfile; dominik@455: uint32 grfid; dominik@455: uint16 sprite_offset; peter1138@3640: byte grf_version; rubidium@6574: GRFFile *next; dominik@455: dominik@455: /* A sprite group contains all sprites of a given vehicle (or multiple dominik@455: * vehicles) when carrying given cargo. It consists of several sprite dominik@455: * sets. Group ids are refered as "cargo id"s by TTDPatch dominik@455: * documentation, contributing to the global confusion. dominik@455: * dominik@455: * A sprite set contains all sprites of a given vehicle carrying given dominik@455: * cargo at a given *stage* - that is usually its load stage. Ie. you dominik@455: * can have a spriteset for an empty wagon, wagon full of coal, dominik@455: * half-filled wagon etc. Each spriteset contains eight sprites (one dominik@455: * per direction) or four sprites if the vehicle is symmetric. */ dominik@455: peter1138@3707: SpriteID spriteset_start; dominik@455: int spriteset_numsets; dominik@455: int spriteset_numents; dominik@455: int spriteset_feature; dominik@455: dominik@455: int spritegroups_count; peter1138@3865: struct SpriteGroup **spritegroups; dominik@455: peter1138@4656: uint sound_offset; peter1138@4656: peter1138@3768: StationSpec **stations; truelight@9476: HouseSpec **housespec; rubidium@9625: IndustrySpec **industryspec; rubidium@9625: IndustryTileSpec **indtspec; tron@2345: tron@2345: uint32 param[0x80]; glx@9505: uint param_end; ///< one more than the highest set parameter Darkvater@3561: Darkvater@3561: GRFLabel *label; ///< Pointer to the first label. This is a linked list, not an array. peter1138@6469: peter1138@6469: uint8 cargo_max; peter1138@6469: CargoLabel *cargo_list; peter1138@6473: uint8 cargo_map[NUM_CARGO]; rubidium@6574: }; dominik@455: tron@1477: extern GRFFile *_first_grffile; dominik@455: rubidium@9724: enum ShoreReplacement { rubidium@9724: SHORE_REPLACE_NONE, ///< No shore sprites were replaced. rubidium@9724: SHORE_REPLACE_ACTION_5, ///< Shore sprites were replaced by Action5. rubidium@9724: SHORE_REPLACE_ACTION_A, ///< Shore sprites were replaced by ActionA (using grass tiles for the corner-shores). rubidium@9724: SHORE_REPLACE_ONLY_NEW, ///< Only corner-shores were loaded by Action5 (openttd(w/d).grf only). rubidium@9724: }; rubidium@9724: rubidium@9628: struct GRFLoadedFeatures { rubidium@9628: bool has_2CC; ///< Set if any vehicle is loaded which uses 2cc (two company colours). rubidium@9628: bool has_newhouses; ///< Set if there are any newhouses loaded. rubidium@9628: bool has_newindustries; ///< Set if there are any newindustries loaded. rubidium@9724: ShoreReplacement shore; ///< It which way shore sprites were replaced. rubidium@9625: }; rubidium@9625: rubidium@9625: /* Indicates which are the newgrf features currently loaded ingame */ rubidium@9628: extern GRFLoadedFeatures _loaded_newgrf_features; pasky@463: peter1138@5228: void LoadNewGRFFile(GRFConfig *config, uint file_index, GrfLoadingStage stage); tron@2342: void LoadNewGRF(uint load_index, uint file_index); glx@9505: void ReloadNewGRFData(); // in openttd.cpp dominik@455: Darkvater@5568: void CDECL grfmsg(int severity, const char *str, ...); Darkvater@5568: rubidium@9620: bool HasGrfMiscBit(GrfMiscBit bit); glx@9732: bool GetGlobalVariable(byte param, uint32 *value); rubidium@9620: rubidium@9826: StringID MapGRFStringID(uint32 grfid, StringID str); rubidium@9826: dominik@455: #endif /* NEWGRF_H */