From d4609ba1798d82cce128b5985d60cb212b760246 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Sun, 19 Aug 2012 23:53:28 +0200 Subject: [PATCH] added melee animation of monsters --- src/battle/BattleState.cpp | 8 ++++++++ src/battle/BattleState.h | 1 + src/battle/Monster.h | 4 ++++ src/battle/states/PerformAttacks.cpp | 5 +++-- src/main.cpp | 4 ++++ test-data/attack-monster.png | Bin 0 -> 3618 bytes 6 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 test-data/attack-monster.png diff --git a/src/battle/BattleState.cpp b/src/battle/BattleState.cpp index d0bb108..95f2f11 100644 --- a/src/battle/BattleState.cpp +++ b/src/battle/BattleState.cpp @@ -390,6 +390,14 @@ void BattleState::ApplyDamage() { } } +AttackChoice &BattleState::CurrentAttackAttackChoice() { + if (CurrentAttack().isMonster) { + return monsterAttacks[CurrentAttack().index]; + } else { + return AttackChoiceAt(CurrentAttack().index); + } +} + void BattleState::ClearAllAttacks() { attackCursor = -1; activeHero = -1; diff --git a/src/battle/BattleState.h b/src/battle/BattleState.h index ab9f731..8814663 100644 --- a/src/battle/BattleState.h +++ b/src/battle/BattleState.h @@ -134,6 +134,7 @@ public: void CalculateDamage(); void ApplyDamage(); const Order &CurrentAttack() const { assert(attackCursor >= 0 && attackCursor < int(attackOrder.size())); return attackOrder[attackCursor]; }; + AttackChoice &CurrentAttackAttackChoice(); void ClearAllAttacks(); bool Victory() const; diff --git a/src/battle/Monster.h b/src/battle/Monster.h index e4d787e..6013ebe 100644 --- a/src/battle/Monster.h +++ b/src/battle/Monster.h @@ -52,6 +52,8 @@ public: const /* Script */ void *AttackScript() { return attackScript; } const /* Script */ void *DefenseScript() { return defenseScript; } + graphics::Animation *MeleeAnimation() { return meleeAnimation; } + const graphics::Animation *MeleeAnimation() const { return meleeAnimation; } graphics::Animation *AttackAnimation() { return attackAnimation; } const graphics::Animation *AttackAnimation() const { return attackAnimation; } graphics::Animation *SpellAnimation() { return spellAnimation; } @@ -69,6 +71,7 @@ public: void SetStats(const Stats &s) { stats = s; } void SetReward(Uint16 exp, Uint16 gold) { expReward = exp; goldReward = gold; } + void SetMeleeAnimation(graphics::Animation *a) { meleeAnimation = a; } void SetAttackAnimation(graphics::Animation *a) { attackAnimation = a; } void SetSpellAnimation(graphics::Animation *a) { spellAnimation = a; } @@ -79,6 +82,7 @@ private: /* Script */ void *attackScript; /* Script */ void *defenseScript; + graphics::Animation *meleeAnimation; graphics::Animation *attackAnimation; graphics::Animation *spellAnimation; diff --git a/src/battle/states/PerformAttacks.cpp b/src/battle/states/PerformAttacks.cpp index 8550318..10fb8bb 100644 --- a/src/battle/states/PerformAttacks.cpp +++ b/src/battle/states/PerformAttacks.cpp @@ -74,6 +74,8 @@ void PerformAttacks::HandleEvents(const Input &input) { Monster &monster(battle->MonsterAt(battle->CurrentAttack().index)); titleBarText = monster.Name(); moveAnimation = monster.AttackAnimation(); + targetAnimation = monster.MeleeAnimation(); + // TODO: add number animations } else { Hero &hero(battle->HeroAt(battle->CurrentAttack().index)); const AttackChoice &ac(battle->AttackChoiceAt(battle->CurrentAttack().index)); @@ -227,8 +229,7 @@ void PerformAttacks::RenderNumbers(SDL_Surface *screen, const Vector &offse void PerformAttacks::RenderTargetAnimation(SDL_Surface *screen, const geometry::Vector &offset) const { if (!targetAnimation || !targetAnimation->Running()) return; - if (battle->CurrentAttack().isMonster) return; // no monsters for now - const TargetSelection &ts(battle->AttackChoiceAt(battle->CurrentAttack().index).Selection()); + const TargetSelection &ts(battle->CurrentAttackAttackChoice().Selection()); const vector > &positions(ts.TargetsHeroes() ? battle->HeroesPositions() : battle->MonsterPositions()); for (vector >::size_type i(0), end(positions.size()); i < end; ++i) { if (ts.IsSelected(i)) { diff --git a/src/main.cpp b/src/main.cpp index f7707ef..14a6336 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -103,6 +103,10 @@ int main(int argc, char **argv) { monsterAttackAnimation.AddFrame(0, 0, Vector(16, 0)); monsterAttackAnimation.AddFrame(0, 1, Vector(16, 0)); monster.SetAttackAnimation(&monsterAttackAnimation); + SDL_Surface *monsterMeleeImg(IMG_Load("test-data/attack-monster.png")); + Sprite monsterMeleeSprite(monsterMeleeImg, 96, 64); + SimpleAnimation monsterMeleeAnimation(&monsterMeleeSprite, framerate, 14); + monster.SetMeleeAnimation(&monsterMeleeAnimation); SDL_Surface *maximImg(IMG_Load("test-data/maxim.png")); Sprite maximSprite(maximImg, 64, 64); diff --git a/test-data/attack-monster.png b/test-data/attack-monster.png new file mode 100644 index 0000000000000000000000000000000000000000..327802b1129a23c6e60d43133d053253ba2e2682 GIT binary patch literal 3618 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 bhw-~6`v{AQ+Yj3h$d-;Cv9~J!o*Dly8B}$> literal 0 HcmV?d00001 -- 2.39.2