float Creature::getSpeed(const MWWorld::Ptr &ptr) const { MWMechanics::CreatureStats& stats = getCreatureStats(ptr); float walkSpeed = fMinWalkSpeedCreature->getFloat() + 0.01 * stats.getAttribute(ESM::Attribute::Speed).getModified() * (fMaxWalkSpeedCreature->getFloat() - fMinWalkSpeedCreature->getFloat()); /// \todo what about the rest? return walkSpeed; }
bool Npc::apply (const MWWorld::Ptr& ptr, const std::string& id, const MWWorld::Ptr& actor) const { MWMechanics::CreatureStats& stats = getCreatureStats (ptr); /// \todo consider instant effects return stats.getActiveSpells().addSpell (id, actor); }
void Creature::onHit(const MWWorld::Ptr &ptr, float damage, bool ishealth, const MWWorld::Ptr &object, const MWWorld::Ptr &attacker, bool successful) const { // NOTE: 'object' and/or 'attacker' may be empty. if(!successful) { // TODO: Handle HitAttemptOnMe script function // Missed MWBase::Environment::get().getSoundManager()->playSound3D(ptr, "miss", 1.0f, 1.0f); return; } if(!object.isEmpty()) getCreatureStats(ptr).setLastHitObject(MWWorld::Class::get(object).getId(object)); if(!attacker.isEmpty() && attacker.getRefData().getHandle() == "player") { const std::string &script = ptr.get<ESM::Creature>()->mBase->mScript; /* Set the OnPCHitMe script variable. The script is responsible for clearing it. */ if(!script.empty()) ptr.getRefData().getLocals().setVarByInt(script, "onpchitme", 1); } if(ishealth) { if(damage > 0.0f) MWBase::Environment::get().getSoundManager()->playSound3D(ptr, "Health Damage", 1.0f, 1.0f); float health = getCreatureStats(ptr).getHealth().getCurrent() - damage; setActorHealth(ptr, health, attacker); } else { MWMechanics::DynamicStat<float> fatigue(getCreatureStats(ptr).getFatigue()); fatigue.setCurrent(fatigue.getCurrent() - damage); getCreatureStats(ptr).setFatigue(fatigue); } }
float Creature::getEncumbrance (const MWWorld::Ptr& ptr) const { float weight = getContainerStore (ptr).getWeight(); const MWMechanics::CreatureStats& stats = getCreatureStats (ptr); weight -= stats.getMagicEffects().get (MWMechanics::EffectKey (8)).mMagnitude; // feather weight += stats.getMagicEffects().get (MWMechanics::EffectKey (7)).mMagnitude; // burden if (weight<0) weight = 0; return weight; }
void Creature::setActorHealth(const MWWorld::Ptr& ptr, float health, const MWWorld::Ptr& attacker) const { MWMechanics::CreatureStats &crstats = getCreatureStats(ptr); bool wasDead = crstats.isDead(); MWMechanics::DynamicStat<float> stat(crstats.getHealth()); stat.setCurrent(health); crstats.setHealth(stat); if(!wasDead && crstats.isDead()) { // actor was just killed } else if(wasDead && !crstats.isDead()) { // actor was just resurrected } }
boost::shared_ptr<MWWorld::Action> Creature::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const { if(get(actor).isNpc() && get(actor).getNpcStats(actor).isWerewolf()) { const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore(); const ESM::Sound *sound = store.get<ESM::Sound>().searchRandom("WolfCreature"); boost::shared_ptr<MWWorld::Action> action(new MWWorld::FailedAction("#{sWerewolfRefusal}")); if(sound) action->setSound(sound->mId); return action; } if(getCreatureStats(ptr).isDead()) return boost::shared_ptr<MWWorld::Action>(new MWWorld::ActionOpen(ptr, true)); return boost::shared_ptr<MWWorld::Action>(new MWWorld::ActionTalk(ptr)); }
float Creature::getCapacity (const MWWorld::Ptr& ptr) const { const MWMechanics::CreatureStats& stats = getCreatureStats (ptr); return stats.getAttribute(0).getModified()*5; }