X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;ds=sidebyside;f=src%2Fbattle%2FAttackAnimation.cpp;fp=src%2Fbattle%2FAttackAnimation.cpp;h=938982aec7ad1c709b67783757f3bd4be5a5bca6;hb=c98665e575f49251dd9b123204063eefdc10e681;hp=0000000000000000000000000000000000000000;hpb=24369a427910299e6ebf5167279dcb26ae0cdf9a;p=l2e.git diff --git a/src/battle/AttackAnimation.cpp b/src/battle/AttackAnimation.cpp new file mode 100644 index 0000000..938982a --- /dev/null +++ b/src/battle/AttackAnimation.cpp @@ -0,0 +1,163 @@ +/* + * AttackAnimation.cpp + * + * Created on: Aug 13, 2012 + * Author: holy + */ + +#include "AttackAnimation.h" + +#include "BattleState.h" +#include "../app/State.h" +#include "../graphics/Animation.h" + +using geometry::Point; +using graphics::Animation; +using std::vector; + +namespace battle { + +AttackAnimation::~AttackAnimation() { + for (vector::const_iterator i(animations.begin()), end(animations.end()); i != end; ++i) { + i->animation->Stop(); + } + for (vector::const_iterator i(foreignAnimations.begin()), end(foreignAnimations.end()); i != end; ++i) { + (*i)->Stop(); + } +} + + +void AttackAnimation::Wait(int ms) { + text.push_back(WAIT); + text.push_back(ms); +} + +void AttackAnimation::WaitForAnimation() { + text.push_back(WAIT_ANIMATION); +} + +void AttackAnimation::PlayAttackAnimation() { + text.push_back(ATTACK_ANIMATION); +} + +void AttackAnimation::PlaySpellAnimation() { + text.push_back(SPELL_ANIMATION); +} + +void AttackAnimation::PlayTargetAnimation(graphics::Animation *a) { + text.push_back(TARGET_ANIMATION); + text.push_back(a); +} + +void AttackAnimation::PlayFullscreenAnimation(graphics::Animation *a) { + text.push_back(FULLSCREEN_ANIMATION); + text.push_back(a); +} + + +void AttackAnimation::Start(BattleState *b, app::State *s) { + battle = b; + state = s; + cursor = 0; + Update(); +} + +void AttackAnimation::Update() { + while (!Finished()) { + if (ExecuteCommand()) break; + } +} + +bool AttackAnimation::ExecuteCommand() { + switch (text[cursor].command) { + case WAIT: + return ExecuteWait(); + case WAIT_ANIMATION: + return ExecuteWaitAnimation(); + case ATTACK_ANIMATION: + return ExecuteAttackAnimation(); + case SPELL_ANIMATION: + return ExecuteSpellAnimation(); + case TARGET_ANIMATION: + return ExecuteTargetAnimation(); + case FULLSCREEN_ANIMATION: + return ExecuteFullscreenAnimation(); + } + ++cursor; // skip unknown command (which should never happen anyway) + return false; +} + +bool AttackAnimation::ExecuteWait() { + if (timer.Started()) { + if (timer.Running()) { + return true; + } else { + cursor += 2; + return false; + } + } else { + timer = state->GraphicsTimers().StartCountdown(text[cursor + 1].number); + return true; + } +} + + +bool AttackAnimation::ExecuteWaitAnimation() { + for (vector::const_iterator i(animations.begin()), end(animations.end()); i != end; ++i) { + if (i->animation->Running()) return true; + } + for (vector::const_iterator i(foreignAnimations.begin()), end(foreignAnimations.end()); i != end; ++i) { + if ((*i)->Running()) return true; + } + ++cursor; + return false; +} + +bool AttackAnimation::ExecuteAttackAnimation() { + foreignAnimations.push_back(battle->HeroAt(0).AttackAnimation()); + battle->HeroAt(0).AttackAnimation()->Start(*state); + ++cursor; + return false; +} + +bool AttackAnimation::ExecuteSpellAnimation() { + foreignAnimations.push_back(battle->HeroAt(0).SpellAnimation()); + battle->HeroAt(0).SpellAnimation()->Start(*state); + ++cursor; + return false; +} + +bool AttackAnimation::ExecuteTargetAnimation() { + AnimationMemo am; + am.animation = (Animation *) text[cursor + 1].ptr; + am.animation->Start(*state); + am.position = Point(100, 100); + animations.push_back(am); + cursor += 2; + return true; +} + +bool AttackAnimation::ExecuteFullscreenAnimation() { + AnimationMemo am; + am.animation = (Animation *) text[cursor + 1].ptr; + am.animation->Start(*state); + am.position = Point(100, 100); + animations.push_back(am); + cursor += 2; + return true; +} + + +bool AttackAnimation::Finished() const { + return cursor >= int(text.size()); +} + +void AttackAnimation::Render(SDL_Surface *screen, const geometry::Vector &offset) const { + for (vector::const_iterator i(animations.begin()), end(animations.end()); i != end; ++i) { + if (i->animation->Running()) { + i->animation->Draw(screen, i->position + offset); + } + } +} + +}