# newgrf_config.h

Go to the documentation of this file.

    00001 /* $Id$ */
    00002
    00003 /*
    00004  * This file is part of OpenTTD.
    00005  * 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.
    00006  * 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.
    00007  * 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/>.
    00008  */
    00009
    00012 #ifndef NEWGRF_CONFIG_H
    00013 #define NEWGRF_CONFIG_H
    00014
    00015 #include "strings_type.h"
    00016 #include "core/alloc_type.hpp"
    00017 #include "core/smallmap_type.hpp"
    00018 #include "misc/countedptr.hpp"
    00019
    00021 enum GCF_Flags {
    00022   GCF_SYSTEM,
    00023   GCF_UNSAFE,
    00024   GCF_STATIC,
    00025   GCF_COMPATIBLE,
    00026   GCF_COPY,
    00027   GCF_INIT_ONLY,
    00028   GCF_RESERVED,
    00029   GCF_INVALID,
    00030 };
    00031
    00033 enum GRFStatus {
    00034   GCS_UNKNOWN,
    00035   GCS_DISABLED,
    00036   GCS_NOT_FOUND,
    00037   GCS_INITIALISED,
    00038   GCS_ACTIVATED
    00039 };
    00040
    00042 enum GRFBugs {
    00043   GBUG_VEH_LENGTH,
    00044   GBUG_VEH_REFIT,
    00045   GBUG_VEH_POWERED_WAGON,
    00046 };
    00047
    00049 enum GRFListCompatibility {
    00050   GLC_ALL_GOOD,
    00051   GLC_COMPATIBLE,
    00052   GLC_NOT_FOUND
    00053 };
    00054
    00056 enum GRFPalette {
    00057   GRFP_USE_BIT     = 0,
    00058   GRFP_GRF_OFFSET  = 2,
    00059   GRFP_GRF_SIZE    = 2,
    00060
    00061   GRFP_USE_DOS     = 0x0,
    00062   GRFP_USE_WINDOWS = 0x1,
    00063   GRFP_USE_MASK    = 0x1,
    00064
    00065   GRFP_GRF_UNSET   = 0x0 << GRFP_GRF_OFFSET,
    00066   GRFP_GRF_DOS     = 0x1 << GRFP_GRF_OFFSET,
    00067   GRFP_GRF_WINDOWS = 0x2 << GRFP_GRF_OFFSET,
    00068   GRFP_GRF_ANY     = GRFP_GRF_DOS | GRFP_GRF_WINDOWS,
    00069   GRFP_GRF_MASK    = GRFP_GRF_ANY,
    00070 };
    00071
    00072
    00074 struct GRFIdentifier {
    00075   uint32 grfid;
    00076   uint8 md5sum[16];
    00077
    00084   FORCEINLINE bool HasGrfIdentifier(uint32 grfid, const uint8 *md5sum) const
    00085   {
    00086     if (this->grfid != grfid) return false;
    00087     if (md5sum == NULL) return true;
    00088     return memcmp(md5sum, this->md5sum, sizeof(this->md5sum)) == 0;
    00089   }
    00090 };
    00091
    00093 struct GRFError : ZeroedMemoryAllocator {
    00094   GRFError(StringID severity, StringID message = 0);
    00095   GRFError(const GRFError &error);
    00096   ~GRFError();
    00097
    00098   char *custom_message;
    00099   char *data;
    00100   StringID message;
    00101   StringID severity;
    00102   uint8 num_params;
    00103   uint32 param_value[2];
    00104 };
    00105
    00107 enum GRFParameterType {
    00108   PTYPE_UINT_ENUM,
    00109   PTYPE_BOOL,
    00110   PTYPE_END,
    00111 };
    00112
    00114 struct GRFParameterInfo {
    00115   GRFParameterInfo(uint nr);
    00116   GRFParameterInfo(GRFParameterInfo &info);
    00117   ~GRFParameterInfo();
    00118   struct GRFText *name;
    00119   struct GRFText *desc;
    00120   GRFParameterType type;
    00121   uint32 min_value;
    00122   uint32 max_value;
    00123   uint32 def_value;
    00124   byte param_nr;
    00125   byte first_bit;
    00126   byte num_bit;
    00127   SmallMap<uint32, struct GRFText *, 8> value_names;
    00128
    00129   uint32 GetValue(struct GRFConfig *config) const;
    00130   void SetValue(struct GRFConfig *config, uint32 value);
    00131 };
    00132
    00134 struct GRFTextWrapper : public SimpleCountedObject {
    00135   struct GRFText *text;
    00136
    00137   GRFTextWrapper();
    00138   ~GRFTextWrapper();
    00139 };
    00140
    00142 struct GRFConfig : ZeroedMemoryAllocator {
    00143   GRFConfig(const char *filename = NULL);
    00144   GRFConfig(const GRFConfig &config);
    00145   ~GRFConfig();
    00146
    00147   GRFIdentifier ident;
    00148   uint8 original_md5sum[16];
    00149   char *filename;
    00150   GRFTextWrapper *name;
    00151   GRFTextWrapper *info;
    00152   GRFError *error;
    00153
    00154   uint32 version;
    00155   uint32 min_loadable_version;
    00156   uint8 flags;
    00157   GRFStatus status;
    00158   uint32 grf_bugs;
    00159   uint32 param[0x80];
    00160   uint8 num_params;
    00161   uint8 num_valid_params;
    00162   uint8 palette;
    00163   SmallVector<GRFParameterInfo *, 4> param_info;
    00164   bool has_param_defaults;
    00165
    00166   struct GRFConfig *next;
    00167
    00168   bool IsOpenTTDBaseGRF() const;
    00169
    00170   const char *GetName() const;
    00171   const char *GetDescription() const;
    00172
    00173   void SetParameterDefaults();
    00174   void SetSuitablePalette();
    00175 };
    00176
    00178 enum FindGRFConfigMode {
    00179   FGCM_EXACT,
    00180   FGCM_COMPATIBLE,
    00181   FGCM_NEWEST,
    00182   FGCM_NEWEST_VALID,
    00183   FGCM_ANY,
    00184 };
    00185
    00186 extern GRFConfig *_all_grfs;
    00187 extern GRFConfig *_grfconfig;
    00188 extern GRFConfig *_grfconfig_newgame;
    00189 extern GRFConfig *_grfconfig_static;
    00190
    00191 void ScanNewGRFFiles();
    00192 void CheckForMissingSprites();
    00193 const GRFConfig *FindGRFConfig(uint32 grfid, FindGRFConfigMode mode, const uint8 *md5sum = NULL, uint32 desired_version = 0);
    00194 GRFConfig *GetGRFConfig(uint32 grfid, uint32 mask = 0xFFFFFFFF);
    00195 GRFConfig **CopyGRFConfigList(GRFConfig **dst, const GRFConfig *src, bool init_only);
    00196 void AppendStaticGRFConfigs(GRFConfig **dst);
    00197 void AppendToGRFConfigList(GRFConfig **dst, GRFConfig *el);
    00198 void ClearGRFConfigList(GRFConfig **config);
    00199 void ResetGRFConfig(bool defaults);
    00200 GRFListCompatibility IsGoodGRFConfigList(GRFConfig *grfconfig);
    00201 bool FillGRFDetails(GRFConfig *config, bool is_static);
    00202 char *GRFBuildParamList(char *dst, const GRFConfig *c, const char *last);
    00203
    00204 /* In newgrf_gui.cpp */
    00205 void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfig **config);
    00206
    00207 #ifdef ENABLE_NETWORK
    00208 /* For communication about GRFs over the network */
    00209 #define UNKNOWN_GRF_NAME_PLACEHOLDER "<Unknown>"
    00210 GRFTextWrapper *FindUnknownGRFName(uint32 grfid, uint8 *md5sum, bool create);
    00211 #endif /* ENABLE_NETWORK */
    00212
    00213 #endif /* NEWGRF_CONFIG_H */