From d8ec8139399ab6677cb667892fb461c3999ddde2 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Wed, 24 Jul 2013 10:02:50 -0700 Subject: [PATCH] Say something from the "hit" dialog topic when losing health --- apps/openmw/mwbase/dialoguemanager.hpp | 2 ++ apps/openmw/mwclass/npc.cpp | 3 +++ apps/openmw/mwdialogue/dialoguemanagerimp.cpp | 25 +++++++++++++++++++ apps/openmw/mwdialogue/dialoguemanagerimp.hpp | 2 ++ 4 files changed, 32 insertions(+) diff --git a/apps/openmw/mwbase/dialoguemanager.hpp b/apps/openmw/mwbase/dialoguemanager.hpp index 12996cc309..58731d1c78 100644 --- a/apps/openmw/mwbase/dialoguemanager.hpp +++ b/apps/openmw/mwbase/dialoguemanager.hpp @@ -40,6 +40,8 @@ namespace MWBase virtual MWWorld::Ptr getActor() const = 0; ///< Return the actor the player is currently talking to. + virtual void say(const MWWorld::Ptr &actor, const std::string &topic) const = 0; + //calbacks for the GUI virtual void keywordSelected (const std::string& keyword) = 0; virtual void goodbyeSelected() = 0; diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index 7a033d78f5..8cd40ccd4f 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -13,6 +13,7 @@ #include "../mwbase/world.hpp" #include "../mwbase/mechanicsmanager.hpp" #include "../mwbase/windowmanager.hpp" +#include "../mwbase/dialoguemanager.hpp" #include "../mwmechanics/creaturestats.hpp" #include "../mwmechanics/npcstats.hpp" @@ -343,6 +344,8 @@ namespace MWClass // 'ptr' is losing health. Play a 'hit' voiced dialog entry if not already saying // something, alert the character controller, scripts, etc. // NOTE: 'attacker' may be empty. + + MWBase::Environment::get().getDialogueManager()->say(ptr, "hit"); } bool wasDead = crstats.isDead(); diff --git a/apps/openmw/mwdialogue/dialoguemanagerimp.cpp b/apps/openmw/mwdialogue/dialoguemanagerimp.cpp index 7093ff91e0..06a6e335dc 100644 --- a/apps/openmw/mwdialogue/dialoguemanagerimp.cpp +++ b/apps/openmw/mwdialogue/dialoguemanagerimp.cpp @@ -25,6 +25,7 @@ #include "../mwbase/scriptmanager.hpp" #include "../mwbase/windowmanager.hpp" #include "../mwbase/mechanicsmanager.hpp" +#include "../mwbase/soundmanager.hpp" #include "../mwworld/class.hpp" #include "../mwworld/containerstore.hpp" @@ -557,6 +558,30 @@ namespace MWDialogue return false; } + void DialogueManager::say(const MWWorld::Ptr &actor, const std::string &topic) const + { + MWBase::SoundManager *sndMgr = MWBase::Environment::get().getSoundManager(); + if(!sndMgr->sayDone(actor)) + { + // Actor is already saying something. + return; + } + + const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore(); + const ESM::Dialogue *dial = store.get().find(topic); + + Filter filter(actor, 0, false); + const ESM::DialInfo *info = filter.search(*dial, false); + if(info != NULL) + { + MWBase::WindowManager *winMgr = MWBase::Environment::get().getWindowManager(); + if(winMgr->getSubtitlesEnabled()) + winMgr->messageBox(info->mResponse); + sndMgr->say(actor, info->mSound); + } + } + + std::vector ParseHyperText(const std::string& text) { std::vector result; diff --git a/apps/openmw/mwdialogue/dialoguemanagerimp.hpp b/apps/openmw/mwdialogue/dialoguemanagerimp.hpp index de1ac77c6f..13bab4dae1 100644 --- a/apps/openmw/mwdialogue/dialoguemanagerimp.hpp +++ b/apps/openmw/mwdialogue/dialoguemanagerimp.hpp @@ -68,6 +68,8 @@ namespace MWDialogue virtual bool checkServiceRefused (); + virtual void say(const MWWorld::Ptr &actor, const std::string &topic) const; + //calbacks for the GUI virtual void keywordSelected (const std::string& keyword); virtual void goodbyeSelected();