00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include "stdafx.h"
00013 #include "debug.h"
00014
00015
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 const char * const *BaseSet<T, Tnum_files, Tsubdir>::file_names = _music_file_names;
00032
00033 template <class Tbase_set>
00034 const char *BaseMedia<Tbase_set>::GetExtension()
00035 {
00036 return ".obm";
00037 }
00038
00039 template <class Tbase_set>
00040 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 }