# base_media_base.h

Go to the documentation of this file.

    00001 /* $Id: base_media_base.h 19278 2010-02-27 16:41:10Z 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
    00114   bool FillSetDetails(IniFile *ini, const char *path, bool allow_empty_filename = true);
    00115
    00124   const char *GetDescription(const char *isocode = NULL) const
    00125   {
    00126     if (isocode != NULL) {
    00127       /* First the full ISO code */
    00128       for (TranslatedStrings::const_iterator iter = this->description.Begin(); iter != this->description.End(); iter++) {
    00129         if (strcmp(iter->first, isocode) == 0) return iter->second;
    00130       }
    00131       /* Then the first two characters */
    00132       for (TranslatedStrings::const_iterator iter = this->description.Begin(); iter != this->description.End(); iter++) {
    00133         if (strncmp(iter->first, isocode, 2) == 0) return iter->second;
    00134       }
    00135     }
    00136     /* Then fall back */
    00137     return this->description.Begin()->second;
    00138   }
    00139 };
    00140
    00145 template <class Tbase_set>
    00146 class BaseMedia : FileScanner {
    00147 protected:
    00148   static Tbase_set *available_sets;
    00149   static const Tbase_set *used_set;
    00150
    00151   /* virtual */ bool AddFile(const char *filename, size_t basepath_length);
    00152
    00157   static const char *GetExtension();
    00158 public:
    00160   static const char *ini_set;
    00161
    00167   static bool DetermineBestSet();
    00168
    00170   static uint FindSets()
    00171   {
    00172     BaseMedia<Tbase_set> fs;
    00173     /* GM_DIR == music set. Music sets don't support tars,
    00174      * so there is no need to search for tars in that case. */
    00175     return fs.Scan(GetExtension(), Tbase_set::SUBDIR, Tbase_set::SUBDIR != GM_DIR);
    00176   }
    00177
    00183   static bool SetSet(const char *name);
    00184
    00191   static char *GetSetsList(char *p, const char *last);
    00192
    00197   static int GetNumSets();
    00198
    00203   static int GetIndexOfUsedSet();
    00204
    00209   static const Tbase_set *GetSet(int index);
    00214   static const Tbase_set *GetUsedSet();
    00215
    00222   static bool HasSet(const ContentInfo *ci, bool md5sum);
    00223 };
    00224
    00225
    00227 enum GraphicsFileType {
    00228   GFT_BASE,
    00229   GFT_LOGOS,
    00230   GFT_ARCTIC,
    00231   GFT_TROPICAL,
    00232   GFT_TOYLAND,
    00233   GFT_EXTRA,
    00234   MAX_GFT
    00235 };
    00236
    00238 struct GraphicsSet : BaseSet<GraphicsSet, MAX_GFT, DATA_DIR> {
    00239   PaletteType palette;
    00240
    00241   bool FillSetDetails(struct IniFile *ini, const char *path);
    00242 };
    00243
    00245 class BaseGraphics : public BaseMedia<GraphicsSet> {
    00246 public:
    00250   static void DeterminePalette();
    00251 };
    00252
    00254 struct SoundsSet : BaseSet<SoundsSet, 1, DATA_DIR> {
    00255 };
    00256
    00258 class BaseSounds : public BaseMedia<SoundsSet> {
    00259 public:
    00260 };
    00261
    00263 static const uint NUM_SONGS_CLASS     = 10;
    00265 static const uint NUM_SONG_CLASSES    = 3;
    00267 static const uint NUM_SONGS_AVAILABLE = 1 + NUM_SONG_CLASSES * NUM_SONGS_CLASS;
    00268
    00270 static const uint NUM_SONGS_PLAYLIST  = 32;
    00271
    00273 struct MusicSet : BaseSet<MusicSet, NUM_SONGS_AVAILABLE, GM_DIR> {
    00275   char song_name[NUM_SONGS_AVAILABLE][32];
    00276   byte track_nr[NUM_SONGS_AVAILABLE];
    00277   byte num_available;
    00278
    00279   bool FillSetDetails(struct IniFile *ini, const char *path);
    00280 };
    00281
    00283 class BaseMusic : public BaseMedia<MusicSet> {
    00284 public:
    00285 };
    00286
    00287 #endif /* BASE_MEDIA_BASE_H */