/* * Copyright 2010-2016 OpenXcom Developers. * * This file is part of OpenXcom. * * OpenXcom 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, either version 3 of the License, or * (at your option) any later version. * * OpenXcom 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. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenXcom. If not, see . */ #include "ExtraSounds.h" #include "../Engine/SoundSet.h" #include "../Engine/Sound.h" #include "../Engine/FileMap.h" #include "../Engine/Logger.h" #include "../Engine/Exception.h" #include "Mod.h" namespace OpenXcom { /** * Creates a blank set of extra sound data. */ ExtraSounds::ExtraSounds() : _current(0) { } /** * Cleans up the extra sound set. */ ExtraSounds::~ExtraSounds() { } /** * Loads the extra sound set from YAML. * @param node YAML node. * @param modIndex The internal index of the associated mod. */ void ExtraSounds::load(const YAML::Node &node, const ModData* current) { _type = node["type"].as(_type); _sounds = node["files"].as< std::map >(_sounds); _current = current; } /** * Gets the filename that this sound set represents. * @return The sound name. */ std::string ExtraSounds::getType() const { return _type; } /** * Gets the list of sounds defined by this mod. * @return The list of sounds defined my this mod. */ std::map *ExtraSounds::getSounds() { return &_sounds; } /** * Loads the external sounds into a new or existing soundset. * @param set Existing soundset. * @return New soundset. */ SoundSet *ExtraSounds::loadSoundSet(SoundSet *set) const { if (set == 0) { Log(LOG_WARNING) << "Creating new sound set: " << _type << ", this will likely have no in-game use."; set = new SoundSet(); } else { Log(LOG_VERBOSE) << "Adding/Replacing items in sound set: " << _type; } for (std::map::const_iterator j = _sounds.begin(); j != _sounds.end(); ++j) { int startSound = j->first; std::string fileName = j->second; if (fileName[fileName.length() - 1] == '/') { Log(LOG_VERBOSE) << "Loading sound set from folder: " << fileName << " starting at index: " << startSound; int offset = startSound; const std::set &contents = FileMap::getVFolderContents(fileName); for (std::set::iterator k = contents.begin(); k != contents.end(); ++k) { try { loadSound(set, offset, fileName + *k); offset++; } catch (Exception &e) { Log(LOG_WARNING) << e.what(); } } } else { loadSound(set, startSound, fileName); } } return set; } void ExtraSounds::loadSound(SoundSet *set, int index, const std::string &fileName) const { int indexWithOffset = index; if (indexWithOffset >= set->getMaxSharedSounds()) { if ((size_t)indexWithOffset >= _current->size) { std::ostringstream err; err << "ExtraSounds '" << _type << "' sound '" << indexWithOffset << "' exceeds mod '"<< _current->name <<"' size limit " << _current->size; throw Exception(err.str()); } indexWithOffset += _current->offset; } const std::string &fullPath = FileMap::getFilePath(fileName); Sound *sound = set->getSound(indexWithOffset); if (sound) { Log(LOG_VERBOSE) << "Replacing sound: " << index << ", using index: " << indexWithOffset; } else { Log(LOG_VERBOSE) << "Adding sound: " << index << ", using index: " << indexWithOffset; sound = set->addSound(indexWithOffset); } sound->load(fullPath); } }