CMeleeAttackAnimation.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "StdInc.h"
  2. #include "CMeleeAttackAnimation.h"
  3. #include "CBattleInterface.h"
  4. #include "CCreatureAnimation.h"
  5. #include "../../lib/BattleState.h"
  6. #include "CReverseAnimation.h"
  7. bool CMeleeAttackAnimation::init()
  8. {
  9. if( !CAttackAnimation::checkInitialConditions() )
  10. return false;
  11. //if(owner->creAnims[stackID]->getType()!=2)
  12. //{
  13. // return false;
  14. //}
  15. if(!attackingStack || myAnim()->getType() == 5)
  16. {
  17. endAnim();
  18. return false;
  19. }
  20. bool toReverse = isToReverse(attackingStackPosBeforeReturn, dest, owner->creDir[stack->ID], attackedStack->doubleWide(), owner->creDir[attackedStack->ID]);
  21. if(toReverse)
  22. {
  23. owner->addNewAnim(new CReverseAnimation(owner, stack, attackingStackPosBeforeReturn, true));
  24. return false;
  25. }
  26. //reversed
  27. shooting = false;
  28. static const CCreatureAnim::EAnimType mutPosToGroup[] = {CCreatureAnim::ATTACK_UP, CCreatureAnim::ATTACK_UP,
  29. CCreatureAnim::ATTACK_FRONT, CCreatureAnim::ATTACK_DOWN, CCreatureAnim::ATTACK_DOWN, CCreatureAnim::ATTACK_FRONT};
  30. int revShiftattacker = (attackingStack->attackerOwned ? -1 : 1);
  31. int mutPos = SBattleHex::mutualPosition(attackingStackPosBeforeReturn, dest);
  32. if(mutPos == -1 && attackingStack->doubleWide())
  33. {
  34. mutPos = SBattleHex::mutualPosition(attackingStackPosBeforeReturn + revShiftattacker, attackedStack->position);
  35. }
  36. if (mutPos == -1 && attackedStack->doubleWide())
  37. {
  38. mutPos = SBattleHex::mutualPosition(attackingStackPosBeforeReturn, attackedStack->occupiedHex());
  39. }
  40. if (mutPos == -1 && attackedStack->doubleWide() && attackingStack->doubleWide())
  41. {
  42. mutPos = SBattleHex::mutualPosition(attackingStackPosBeforeReturn + revShiftattacker, attackedStack->occupiedHex());
  43. }
  44. switch(mutPos) //attack direction
  45. {
  46. case 0: case 1: case 2: case 3: case 4: case 5:
  47. group = mutPosToGroup[mutPos];
  48. break;
  49. default:
  50. tlog1<<"Critical Error! Wrong dest in stackAttacking! dest: "<<dest<<" attacking stack pos: "<<attackingStackPosBeforeReturn<<" mutual pos: "<<mutPos<<std::endl;
  51. group = CCreatureAnim::ATTACK_FRONT;
  52. break;
  53. }
  54. return true;
  55. }
  56. void CMeleeAttackAnimation::nextFrame()
  57. {
  58. /*for(std::list<std::pair<CBattleAnimation *, bool> >::const_iterator it = owner->pendingAnims.begin(); it != owner->pendingAnims.end(); ++it)
  59. {
  60. CBattleMoveStart * anim = dynamic_cast<CBattleMoveStart *>(it->first);
  61. CReverseAnim * anim2 = dynamic_cast<CReverseAnim *>(it->first);
  62. if( (anim && anim->stackID == stackID) || (anim2 && anim2->stackID == stackID ) )
  63. return;
  64. }*/
  65. CAttackAnimation::nextFrame();
  66. }
  67. void CMeleeAttackAnimation::endAnim()
  68. {
  69. CBattleAnimation::endAnim();
  70. delete this;
  71. }
  72. CMeleeAttackAnimation::CMeleeAttackAnimation(CBattleInterface * _owner, const CStack * attacker, SBattleHex _dest, const CStack * _attacked)
  73. : CAttackAnimation(_owner, attacker, _dest, _attacked)
  74. {
  75. }