# base_media_base.h

Go to the documentation of this file.

    00001 /* $Id: base_media_base.h 20608 2010-08-24 00:03:26Z rubidium $ */
    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 BASE_MEDIA_BASE_H
    00013 #define BASE_MEDIA_BASE_H
    00014
    00015 #include "fileio_func.h"
    00016 #include "core/smallmap_type.hpp"
    00017 #include "gfx_type.h"
    00018
    00019 /* Forward declare these; can't do 'struct X' in functions as older GCCs barf on that */
    00020 struct IniFile;
    00021 struct ContentInfo;
    00022
    00024 struct MD5File {
    00026   enum ChecksumResult {
    00027     CR_MATCH,
    00028     CR_MISMATCH,
    00029     CR_NO_FILE,
    00030   };
    00031
    00032   const char *filename;
    00033   uint8 hash[16];
    00034   const char *missing_warning;
    00035
    00036   ChecksumResult CheckMD5(Subdirectory subdir) const;
    00037 };
    00038
    00045 template <class T, size_t Tnum_files, Subdirectory Tsubdir>
    00046 struct BaseSet {
    00047   typedef SmallMap<const char *, const char *> TranslatedStrings;
    00048
    00050   static const size_t NUM_FILES = Tnum_files;
    00051
    00053   static const Subdirectory SUBDIR = Tsubdir;
    00054
    00056   static const char * const *file_names;
    00057
    00058   const char *name;
    00059   TranslatedStrings description;
    00060   uint32 shortname;
    00061   uint32 version;
    00062   bool fallback;
    00063
    00064   MD5File files[NUM_FILES];
    00065   uint found_files;
    00066   uint valid_files;
    00067
    00068   T *next;
    00069
    00071   ~BaseSet()
    00072   {
    00073     free((void*)this->name);
    00074
    00075     for (TranslatedStrings::iterator iter = this->description.Begin(); iter != this->description.End(); iter++) {
    00076       free((void*)iter->first);
    00077       free((void*)iter->second);
    00078     }
    00079
    00080     for (uint i = 0; i < NUM_FILES; i++) {
    00081       free((void*)this->files[i].filename);
    00082       free((void*)this->files[i].missing_warning);
    00083     }
    00084
    00085     delete this->next;
    00086   }
    00087
    00092   int GetNumMissing() const
    00093   {
    00094     return Tnum_files - this->found_files;
    00095   }
    00096
    00102   int GetNumInvalid() const
    00103   {
    00104     return Tnum_files - this->valid_files;
    00105   }
    00106
    00115   bool FillSetDetails(IniFile *ini, const char *path, const char *full_filename, bool allow_empty_filename = true);
    00116
    00125   const char *GetDescription(const char *isocode = NULL) const
    00126   {
    00127     if (isocode != NULL) {
    00128       /* First the full ISO code */
    00129       for (TranslatedStrings::const_iterator iter = this->description.Begin(); iter != this->description.End(); iter++) {
    00130         if (strcmp(iter->first, isocode) == 0) return iter->second;
    00131       }
    00132       /* Then the first two characters */
    00133       for (TranslatedStrings::const_iterator iter = this->description.Begin(); iter != this->description.End(); iter++) {
    00134         if (strncmp(iter->first, isocode, 2) == 0) return iter->second;
    00135       }
    00136     }
    00137     /* Then fall back */
    00138     return this->description.Begin()->second;
    00139   }
    00140 };
    00141
    00146 template <class Tbase_set>
    00147 class BaseMedia : FileScanner {
    00148 protected:
    00149   static Tbase_set *available_sets;
    00150   static Tbase_set *duplicate_sets;
    00151   static const Tbase_set *used_set;
    00152
    00153   /* virtual */ bool AddFile(const char *filename, size_t basepath_length);
    00154
    00159   static const char *GetExtension();
    00160 public:
    00162   static const char *ini_set;
    00163
    00169   static bool DetermineBestSet();
    00170
    00172   static uint FindSets()
    00173   {
    00174     BaseMedia<Tbase_set> fs;
    00175     /* GM_DIR == music set. Music sets don't support tars,
    00176      * so there is no need to search for tars in that case. */
    00177     return fs.Scan(GetExtension(), Tbase_set::SUBDIR, Tbase_set::SUBDIR != GM_DIR);
    00178   }
    00179
    00185   static bool SetSet(const char *name);
    00186
    00193   static char *GetSetsList(char *p, const char *last);
    00194
    00199   static int GetNumSets();
    00200
    00205   static int GetIndexOfUsedSet();
    00206
    00211   static const Tbase_set *GetSet(int index);
    00216   static const Tbase_set *GetUsedSet();
    00217
    00224   static bool HasSet(const ContentInfo *ci, bool md5sum);
    00225 };
    00226
    00227
    00229 enum GraphicsFileType {
    00230   GFT_BASE,
    00231   GFT_LOGOS,
    00232   GFT_ARCTIC,
    00233   GFT_TROPICAL,
    00234   GFT_TOYLAND,
    00235   GFT_EXTRA,
    00236   MAX_GFT
    00237 };
    00238
    00240 struct GraphicsSet : BaseSet<GraphicsSet, MAX_GFT, DATA_DIR> {
    00241   PaletteType palette;
    00242
    00243   bool FillSetDetails(struct IniFile *ini, const char *path, const char *full_filename);
    00244 };
    00245
    00247 class BaseGraphics : public BaseMedia<GraphicsSet> {
    00248 public:
    00252   static void DeterminePalette();
    00253 };
    00254
    00256 struct SoundsSet : BaseSet<SoundsSet, 1, DATA_DIR> {
    00257 };
    00258
    00260 class BaseSounds : public BaseMedia<SoundsSet> {
    00261 public:
    00262 };
    00263
    00265 static const uint NUM_SONGS_CLASS     = 10;
    00267 static const uint NUM_SONG_CLASSES    = 3;
    00269 static const uint NUM_SONGS_AVAILABLE = 1 + NUM_SONG_CLASSES * NUM_SONGS_CLASS;
    00270
    00272 static const uint NUM_SONGS_PLAYLIST  = 32;
    00273
    00275 struct MusicSet : BaseSet<MusicSet, NUM_SONGS_AVAILABLE, GM_DIR> {
    00277   char song_name[NUM_SONGS_AVAILABLE][32];
    00278   byte track_nr[NUM_SONGS_AVAILABLE];
    00279   byte num_available;
    00280
    00281   bool FillSetDetails(struct IniFile *ini, const char *path, const char *full_filename);
    00282 };
    00283
    00285 class BaseMusic : public BaseMedia<MusicSet> {
    00286 public:
    00287 };
    00288
    00289 #endif /* BASE_MEDIA_BASE_H */