# music.cpp

Go to the documentation of this file.

    00001 /* $Id: music.cpp 18610 2009-12-23 08:51:46Z 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 #include "stdafx.h"
    00013 #include "debug.h"
    00014
    00015 /* The type of set we're replacing */
    00016 #define SET_TYPE "music"
    00017 #include "base_media_func.h"
    00018
    00019 INSTANTIATE_BASE_MEDIA_METHODS(BaseMedia<MusicSet>, MusicSet)
    00020
    00021
    00022 static const char * const _music_file_names[] = {
    00023   "theme",
    00024   "old_0", "old_1", "old_2", "old_3", "old_4", "old_5", "old_6", "old_7", "old_8", "old_9",
    00025   "new_0", "new_1", "new_2", "new_3", "new_4", "new_5", "new_6", "new_7", "new_8", "new_9",
    00026   "ezy_0", "ezy_1", "ezy_2", "ezy_3", "ezy_4", "ezy_5", "ezy_6", "ezy_7", "ezy_8", "ezy_9",
    00027 };
    00028 assert_compile(lengthof(_music_file_names) == NUM_SONGS_AVAILABLE);
    00029
    00030 template <class T, size_t Tnum_files, Subdirectory Tsubdir>
    00031 /* static */ const char * const *BaseSet<T, Tnum_files, Tsubdir>::file_names = _music_file_names;
    00032
    00033 template <class Tbase_set>
    00034 /* static */ const char *BaseMedia<Tbase_set>::GetExtension()
    00035 {
    00036   return ".obm"; // OpenTTD Base Music
    00037 }
    00038
    00039 template <class Tbase_set>
    00040 /* static */ bool BaseMedia<Tbase_set>::DetermineBestSet()
    00041 {
    00042   if (BaseMedia<Tbase_set>::used_set != NULL) return true;
    00043
    00044   const Tbase_set *best = NULL;
    00045   for (const Tbase_set *c = BaseMedia<Tbase_set>::available_sets; c != NULL; c = c->next) {
    00046     if (c->GetNumMissing() != 0) continue;
    00047
    00048     if (best == NULL ||
    00049         best->valid_files < c->valid_files ||
    00050         (best->valid_files == c->valid_files &&
    00051           (best->shortname == c->shortname && best->version < c->version))) {
    00052       best = c;
    00053     }
    00054   }
    00055
    00056   BaseMedia<Tbase_set>::used_set = best;
    00057   return BaseMedia<Tbase_set>::used_set != NULL;
    00058 }
    00059
    00064 #define fetch_name(name) \
    00065   item = metadata->GetItem(name, false); \
    00066   if (item == NULL || strlen(item->value) == 0) { \
    00067     DEBUG(grf, 0, "Base " SET_TYPE "set detail loading: %s field missing", name); \
    00068     return false; \
    00069   }
    00070
    00071 bool MusicSet::FillSetDetails(IniFile *ini, const char *path)
    00072 {
    00073   bool ret = this->BaseSet<MusicSet, NUM_SONGS_AVAILABLE, GM_DIR>::FillSetDetails(ini, path);
    00074   if (ret) {
    00075     this->num_available = 0;
    00076     IniGroup *names = ini->GetGroup("names");
    00077     for (uint i = 0, j = 1; i < lengthof(this->song_name); i++) {
    00078       const char *filename = this->files[i].filename;
    00079       if (names == NULL || StrEmpty(filename)) {
    00080         this->song_name[i][0] = '\0';
    00081         continue;
    00082       }
    00083
    00084       IniItem *item = names->GetItem(filename, false);
    00085       if (item == NULL || strlen(item->value) == 0) {
    00086         DEBUG(grf, 0, "Base music set song name missing: %s", filename);
    00087         return false;
    00088       }
    00089
    00090       strecpy(this->song_name[i], item->value, lastof(this->song_name[i]));
    00091       this->track_nr[i] = j++;
    00092       this->num_available++;
    00093     }
    00094   }
    00095   return true;
    00096 }