forked from teamnwah/openmw-tes3coop
Handle soundgen animation keys
This commit is contained in:
parent
d6324d71bf
commit
9ea6b22a83
7 changed files with 115 additions and 2 deletions
|
@ -291,6 +291,33 @@ namespace MWClass
|
||||||
return ref->mBase->mPersistent;
|
return ref->mBase->mPersistent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string Creature::getSoundIdFromSndGen(const MWWorld::Ptr &ptr, const std::string &name) const
|
||||||
|
{
|
||||||
|
const MWWorld::Store<ESM::SoundGenerator> &store = MWBase::Environment::get().getWorld()->getStore().get<ESM::SoundGenerator>();
|
||||||
|
|
||||||
|
int type = getSndGenTypeFromName(ptr, name);
|
||||||
|
if(type >= 0)
|
||||||
|
{
|
||||||
|
std::vector<const ESM::SoundGenerator*> sounds;
|
||||||
|
sounds.reserve(8);
|
||||||
|
|
||||||
|
std::string ptrid = Creature::getId(ptr);
|
||||||
|
MWWorld::Store<ESM::SoundGenerator>::iterator sound = store.begin();
|
||||||
|
while(sound != store.end())
|
||||||
|
{
|
||||||
|
if(type == sound->mType && sound->mCreature.size() > 0 &&
|
||||||
|
Misc::StringUtils::ciEqual(ptrid.substr(0, sound->mCreature.size()),
|
||||||
|
sound->mCreature))
|
||||||
|
sounds.push_back(&*sound);
|
||||||
|
sound++;
|
||||||
|
}
|
||||||
|
if(sounds.size() > 0)
|
||||||
|
return sounds[(int)(rand()/(RAND_MAX+1.0)*sounds.size())]->mSound;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
MWWorld::Ptr
|
MWWorld::Ptr
|
||||||
Creature::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
|
Creature::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
|
||||||
{
|
{
|
||||||
|
@ -300,6 +327,38 @@ namespace MWClass
|
||||||
return MWWorld::Ptr(&cell.mCreatures.insert(*ref), &cell);
|
return MWWorld::Ptr(&cell.mCreatures.insert(*ref), &cell);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Creature::getSndGenTypeFromName(const MWWorld::Ptr &ptr, const std::string &name)
|
||||||
|
{
|
||||||
|
if(name == "left")
|
||||||
|
{
|
||||||
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
|
Ogre::Vector3 pos(ptr.getRefData().getPosition().pos);
|
||||||
|
if(world->isUnderwater(ptr.getCell(), pos))
|
||||||
|
return 2;
|
||||||
|
if(world->isOnGround(ptr))
|
||||||
|
return 0;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if(name == "right")
|
||||||
|
{
|
||||||
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
|
Ogre::Vector3 pos(ptr.getRefData().getPosition().pos);
|
||||||
|
if(world->isUnderwater(ptr.getCell(), pos))
|
||||||
|
return 3;
|
||||||
|
if(world->isOnGround(ptr))
|
||||||
|
return 1;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if(name == "moan")
|
||||||
|
return 4;
|
||||||
|
if(name == "roar")
|
||||||
|
return 5;
|
||||||
|
if(name == "scream")
|
||||||
|
return 6;
|
||||||
|
|
||||||
|
throw std::runtime_error(std::string("Unexpected soundgen type: ")+name);
|
||||||
|
}
|
||||||
|
|
||||||
const ESM::GameSetting* Creature::fMinWalkSpeedCreature;
|
const ESM::GameSetting* Creature::fMinWalkSpeedCreature;
|
||||||
const ESM::GameSetting* Creature::fMaxWalkSpeedCreature;
|
const ESM::GameSetting* Creature::fMaxWalkSpeedCreature;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,8 @@ namespace MWClass
|
||||||
virtual MWWorld::Ptr
|
virtual MWWorld::Ptr
|
||||||
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
|
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
|
||||||
|
|
||||||
|
static int getSndGenTypeFromName(const MWWorld::Ptr &ptr, const std::string &name);
|
||||||
|
|
||||||
static const ESM::GameSetting *fMinWalkSpeedCreature;
|
static const ESM::GameSetting *fMinWalkSpeedCreature;
|
||||||
static const ESM::GameSetting *fMaxWalkSpeedCreature;
|
static const ESM::GameSetting *fMaxWalkSpeedCreature;
|
||||||
|
|
||||||
|
@ -69,6 +71,8 @@ namespace MWClass
|
||||||
|
|
||||||
virtual bool isPersistent (const MWWorld::Ptr& ptr) const;
|
virtual bool isPersistent (const MWWorld::Ptr& ptr) const;
|
||||||
|
|
||||||
|
virtual std::string getSoundIdFromSndGen(const MWWorld::Ptr &ptr, const std::string &name) const;
|
||||||
|
|
||||||
virtual MWMechanics::Movement& getMovementSettings (const MWWorld::Ptr& ptr) const;
|
virtual MWMechanics::Movement& getMovementSettings (const MWWorld::Ptr& ptr) const;
|
||||||
///< Return desired movement.
|
///< Return desired movement.
|
||||||
|
|
||||||
|
|
|
@ -663,6 +663,42 @@ namespace MWClass
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string Npc::getSoundIdFromSndGen(const MWWorld::Ptr &ptr, const std::string &name) const
|
||||||
|
{
|
||||||
|
if(name == "left")
|
||||||
|
{
|
||||||
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
|
Ogre::Vector3 pos(ptr.getRefData().getPosition().pos);
|
||||||
|
if(world->isUnderwater(ptr.getCell(), pos))
|
||||||
|
return "FootWaterLeft";
|
||||||
|
if(world->isOnGround(ptr))
|
||||||
|
return "FootBareLeft";
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if(name == "right")
|
||||||
|
{
|
||||||
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
|
Ogre::Vector3 pos(ptr.getRefData().getPosition().pos);
|
||||||
|
if(world->isUnderwater(ptr.getCell(), pos))
|
||||||
|
return "FootWaterRight";
|
||||||
|
if(world->isOnGround(ptr))
|
||||||
|
return "FootBareRight";
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
// TODO: I have no idea what these are supposed to do for NPCs since they use
|
||||||
|
// voiced dialog for various conditions like health loss and combat taunts. Maybe
|
||||||
|
// only for biped creatures?
|
||||||
|
if(name == "moan")
|
||||||
|
return "";
|
||||||
|
if(name == "roar")
|
||||||
|
return "";
|
||||||
|
if(name == "scream")
|
||||||
|
return "";
|
||||||
|
|
||||||
|
throw std::runtime_error(std::string("Unexpected soundgen type: ")+name);
|
||||||
|
}
|
||||||
|
|
||||||
MWWorld::Ptr
|
MWWorld::Ptr
|
||||||
Npc::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
|
Npc::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -132,6 +132,8 @@ namespace MWClass
|
||||||
|
|
||||||
virtual bool isPersistent (const MWWorld::Ptr& ptr) const;
|
virtual bool isPersistent (const MWWorld::Ptr& ptr) const;
|
||||||
|
|
||||||
|
virtual std::string getSoundIdFromSndGen(const MWWorld::Ptr &ptr, const std::string &name) const;
|
||||||
|
|
||||||
static void registerSelf();
|
static void registerSelf();
|
||||||
|
|
||||||
virtual std::string getModel(const MWWorld::Ptr &ptr) const;
|
virtual std::string getModel(const MWWorld::Ptr &ptr) const;
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
|
|
||||||
#include "../mwmechanics/character.hpp"
|
#include "../mwmechanics/character.hpp"
|
||||||
|
#include "../mwworld/class.hpp"
|
||||||
|
|
||||||
namespace MWRender
|
namespace MWRender
|
||||||
{
|
{
|
||||||
|
@ -511,8 +512,12 @@ bool Animation::handleTextKey(AnimState &state, const std::string &groupname, co
|
||||||
}
|
}
|
||||||
if(evt.compare(0, 10, "soundgen: ") == 0)
|
if(evt.compare(0, 10, "soundgen: ") == 0)
|
||||||
{
|
{
|
||||||
// FIXME: Lookup the SoundGen (SNDG) for the specified sound that corresponds
|
std::string sound = MWWorld::Class::get(mPtr).getSoundIdFromSndGen(mPtr, evt.substr(10));
|
||||||
// to this actor type
|
if(!sound.empty())
|
||||||
|
{
|
||||||
|
MWBase::SoundManager *sndMgr = MWBase::Environment::get().getSoundManager();
|
||||||
|
sndMgr->playSound3D(mPtr, sound, 1.0f, 1.0f);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -240,6 +240,10 @@ namespace MWWorld
|
||||||
throw std::runtime_error ("class does not have an down sound");
|
throw std::runtime_error ("class does not have an down sound");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string Class::getSoundIdFromSndGen(const Ptr &ptr, const std::string &type) const
|
||||||
|
{
|
||||||
|
throw std::runtime_error("class does not support soundgen look up");
|
||||||
|
}
|
||||||
|
|
||||||
std::string Class::getInventoryIcon (const MWWorld::Ptr& ptr) const
|
std::string Class::getInventoryIcon (const MWWorld::Ptr& ptr) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -221,6 +221,9 @@ namespace MWWorld
|
||||||
///< Return the down sound ID of \a ptr or throw an exception, if class does not support ID retrieval
|
///< Return the down sound ID of \a ptr or throw an exception, if class does not support ID retrieval
|
||||||
/// (default implementation: throw an exception)
|
/// (default implementation: throw an exception)
|
||||||
|
|
||||||
|
virtual std::string getSoundIdFromSndGen(const Ptr &ptr, const std::string &type) const;
|
||||||
|
///< Returns the sound ID for \a ptr of the given soundgen \a type.
|
||||||
|
|
||||||
virtual float getArmorRating (const MWWorld::Ptr& ptr) const;
|
virtual float getArmorRating (const MWWorld::Ptr& ptr) const;
|
||||||
///< @return combined armor rating of this actor
|
///< @return combined armor rating of this actor
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue