diff --git a/client/mainmenu/CPrologEpilogVideo.cpp b/client/mainmenu/CPrologEpilogVideo.cpp index b8b7ab49e..b37383c03 100644 --- a/client/mainmenu/CPrologEpilogVideo.cpp +++ b/client/mainmenu/CPrologEpilogVideo.cpp @@ -29,8 +29,12 @@ CPrologEpilogVideo::CPrologEpilogVideo(CampaignScenarioPrologEpilog _spe, std::f CCS->videoh->open(spe.prologVideo); CCS->musich->playMusic(spe.prologMusic, true, true); - // MPTODO: Custom campaign crashing on this? -// voiceSoundHandle = CCS->soundh->playSound(CCampaignHandler::prologVoiceName(spe.prologVideo)); + voiceSoundHandle = CCS->soundh->playSound(spe.prologVoice); + auto onVoiceStop = [this]() + { + voiceStopped = true; + }; + CCS->soundh->setCallback(voiceSoundHandle, onVoiceStop); text = std::make_shared(Rect(100, 500, 600, 100), EFonts::FONT_BIG, ETextAlignment::CENTER, Colors::METALLIC_GOLD, spe.prologText); text->scrollTextTo(-100); @@ -51,7 +55,7 @@ void CPrologEpilogVideo::show(Canvas & to) else text->showAll(to); // blit text over video, if needed - if(text->textSize.y + 100 < positionCounter / 5) + if(text->textSize.y + 100 < positionCounter / 5 && voiceStopped) clickPressed(GH.getCursorPosition()); } diff --git a/client/mainmenu/CPrologEpilogVideo.h b/client/mainmenu/CPrologEpilogVideo.h index ec6de9055..756c2f5e7 100644 --- a/client/mainmenu/CPrologEpilogVideo.h +++ b/client/mainmenu/CPrologEpilogVideo.h @@ -23,6 +23,8 @@ class CPrologEpilogVideo : public CWindowObject std::shared_ptr text; + bool voiceStopped = false; + public: CPrologEpilogVideo(CampaignScenarioPrologEpilog _spe, std::function callback); diff --git a/lib/campaign/CampaignHandler.cpp b/lib/campaign/CampaignHandler.cpp index ab2cc63c5..63fae7c05 100644 --- a/lib/campaign/CampaignHandler.cpp +++ b/lib/campaign/CampaignHandler.cpp @@ -168,6 +168,7 @@ CampaignScenario CampaignHandler::readScenarioFromJson(JsonNode & reader) { ret.prologVideo = VideoPath::fromJson(identifier["video"]); ret.prologMusic = AudioPath::fromJson(identifier["music"]); + ret.prologVoice = AudioPath::fromJson(identifier["voice"]); ret.prologText = identifier["text"].String(); } return ret; @@ -403,8 +404,12 @@ CampaignScenario CampaignHandler::readScenarioFromMemory( CBinaryReader & reader ret.hasPrologEpilog = reader.readUInt8(); if(ret.hasPrologEpilog) { - ret.prologVideo = CampaignHandler::prologVideoName(reader.readUInt8()); + bool isOriginalCampaign = boost::starts_with(header.getFilename(), "DATA/"); + + ui8 index = reader.readUInt8(); + ret.prologVideo = CampaignHandler::prologVideoName(index); ret.prologMusic = CampaignHandler::prologMusicName(reader.readUInt8()); + ret.prologVoice = isOriginalCampaign ? CampaignHandler::prologVoiceName(index) : AudioPath(); ret.prologText = readLocalizedString(reader, header.filename, header.modName, header.encoding, identifier); } return ret; @@ -605,13 +610,13 @@ AudioPath CampaignHandler::prologMusicName(ui8 index) return AudioPath::builtinTODO(VLC->generaltexth->translate("core.cmpmusic." + std::to_string(static_cast(index)))); } -std::string CampaignHandler::prologVoiceName(ui8 index) +AudioPath CampaignHandler::prologVoiceName(ui8 index) { JsonNode config(JsonPath::builtin("CONFIG/campaignMedia")); auto audio = config["voice"].Vector(); if(index < audio.size()) - return audio[index].String(); - return ""; + return AudioPath::fromJson(audio[index]); + return AudioPath(); } VCMI_LIB_NAMESPACE_END diff --git a/lib/campaign/CampaignHandler.h b/lib/campaign/CampaignHandler.h index 7a6d0fd1f..d7d0c4a8a 100644 --- a/lib/campaign/CampaignHandler.h +++ b/lib/campaign/CampaignHandler.h @@ -35,7 +35,7 @@ class DLL_LINKAGE CampaignHandler static VideoPath prologVideoName(ui8 index); static AudioPath prologMusicName(ui8 index); - static std::string prologVoiceName(ui8 index); + static AudioPath prologVoiceName(ui8 index); public: static std::unique_ptr getHeader( const std::string & name); //name - name of appropriate file diff --git a/lib/campaign/CampaignScenarioPrologEpilog.h b/lib/campaign/CampaignScenarioPrologEpilog.h index 00b321188..ab67cc584 100644 --- a/lib/campaign/CampaignScenarioPrologEpilog.h +++ b/lib/campaign/CampaignScenarioPrologEpilog.h @@ -16,8 +16,9 @@ VCMI_LIB_NAMESPACE_BEGIN struct DLL_LINKAGE CampaignScenarioPrologEpilog { bool hasPrologEpilog = false; - VideoPath prologVideo; // from CmpMovie.txt + VideoPath prologVideo; AudioPath prologMusic; // from CmpMusic.txt + AudioPath prologVoice; std::string prologText; template void serialize(Handler &h, const int formatVersion) @@ -25,6 +26,7 @@ struct DLL_LINKAGE CampaignScenarioPrologEpilog h & hasPrologEpilog; h & prologVideo; h & prologMusic; + h & prologVoice; h & prologText; } };