float CEntity::getPlayListLength() { // Accumul all the time float time = 0; for(size_t i = 0; i < _PlayListAnimation.size(); ++i) time += getAnimLength(_PlayListAnimation[i]); return time; }
void animationSequence::add(animation* animationProvider, unsigned int lengthMs) { offsets->insert(offsets->end(), getAnimLength()); animations->insert(animations->end(), animationProvider); setAnimLength(getAnimLength() + lengthMs); }
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(); } }