void GfxBody::setAnimationMask (const std::string &name, float v) { if (dead) THROW_DEAD(className); Ogre::AnimationState *state = getAnimState(name); state->setWeight(v); state->setEnabled(v > 0.0f); }
float GfxBody::getAnimationMask (const std::string &name) { if (dead) THROW_DEAD(className); Ogre::AnimationState *state = getAnimState(name); if (!state->getEnabled()) return 0.0f; return state->getWeight(); }
void GfxBody::setAnimationPos (const std::string &name, float v) { if (dead) THROW_DEAD(className); getAnimState(name)->setTimePosition(v); }
float GfxBody::getAnimationPos (const std::string &name) { if (dead) THROW_DEAD(className); return getAnimState(name)->getTimePosition(); }
float GfxBody::getAnimationLength (const std::string &name) { if (dead) THROW_DEAD(className); return getAnimState(name)->getLength(); }
void Actor::update(bool noclip, size_t ticksPassed) { if(mLevel) { size_t animDivisor = mAnimTimeMap[getAnimState()]; if(animDivisor == 0) { animDivisor=12; } bool advanceAnims = !(ticksPassed % (World::ticksPerSecond/animDivisor)); if(advanceAnims) { auto currentAnim = getCurrentAnim(); if(mAnimPlaying) { if(mFrame < currentAnim->getAnimLength()) mFrame++; if(mFrame >= currentAnim->getAnimLength()) { mAnimPlaying = false; mFrame--; } } else { if(!isDead()) mFrame = (mFrame + 1) % currentAnim->getAnimLength(); else if(mFrame < currentAnim->getAnimLength() -1) mFrame++; } #ifndef NDEBUG assert(mFrame < getCurrentAnim()->getAnimLength()); #endif } if(mPos.current() != mDestination) { std::pair<float, float> vector = Misc::getVec(mPos.current(), mDestination); Actor * actor; actor = World::get()->getActorAt(mDestination.first, mDestination.second); if (canIAttack(actor)) { mPos.mDirection = Misc::getVecDir(vector); mPos.update(); mPos.mDist = 0; attack(actor); } else if(mPos.mDist == 0 && !mAnimPlaying) { auto nextPos = Position(mPos.current().first, mPos.current().second, Misc::getVecDir(vector)); nextPos.mMoving = true; World& world = *World::get(); FAWorld::Actor* actorAtNext = world.getActorAt(nextPos.next().first, nextPos.next().second); if((noclip || (mLevel->getTile(nextPos.next().first, nextPos.next().second).passable() && (actorAtNext == NULL || actorAtNext == this))) && !mAnimPlaying) { if(!mPos.mMoving && !mAnimPlaying) { mPos.mMoving = true; setAnimation(AnimState::walk); } } else if(!mAnimPlaying) { mPos.mMoving = false; mDestination = mPos.current(); setAnimation(AnimState::idle); } mPos.mDirection = Misc::getVecDir(vector); } } else if(mPos.mMoving && mPos.mDist == 0 && !mAnimPlaying) { mPos.mMoving = false; setAnimation(AnimState::idle); } if (!mIsDead && !mPos.mMoving && !mAnimPlaying && mAnimState != AnimState::idle) setAnimation(AnimState::idle); else if (!mIsDead && mPos.mMoving && !mAnimPlaying && mAnimState != AnimState::walk) setAnimation(AnimState::walk); if(!mAnimPlaying) mPos.update(); } }