StackFeature.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #ifndef __STACK_FEATURE_H__
  2. #define __STACK_FEATURE_H__
  3. struct StackFeature
  4. {
  5. //general list of stack abilities and effects
  6. enum ECombatFeatures
  7. {
  8. NO_TYPE,
  9. DOUBLE_WIDE, FLYING, SHOOTER, CHARGE_IMMUNITY, ADDITIONAL_ATTACK, UNLIMITED_RETAILATIONS,
  10. NO_MELEE_PENALTY,
  11. JOUSTING /*for champions*/,
  12. RAISING_MORALE /*value - how much raises*/,
  13. HATE /*eg. angels hate devils, subtype - ID of hated creature*/,
  14. KING1,
  15. KING2, KING3, MAGIC_RESISTANCE /*in % (value)*/,
  16. CHANGES_SPELL_COST_FOR_ALLY /*in mana points (value) , eg. mage*/,
  17. CHANGES_SPELL_COST_FOR_ENEMY /*in mana points (value) , eg. pegasus */,
  18. SPELL_AFTER_ATTACK /* subtype - spell id, value - spell level, (aditional info)%100 - chance in %; eg. dendroids, (additional info)/100 -> [0 - all attacks, 1 - shot only, 2 - melee only*/,
  19. SPELL_RESISTANCE_AURA /*eg. unicorns, value - resistance bonus in % for adjacent creatures*/,
  20. LEVEL_SPELL_IMMUNITY /*creature is immune to all spell with level below or equal to value of this bonus*/,
  21. TWO_HEX_ATTACK_BREATH /*eg. dragons*/,
  22. SPELL_DAMAGE_REDUCTION /*eg. golems; value - reduction in %, subtype - spell school; -1 - all, 0 - air, 1 - fire, 2 - water, 3 - earth*/,
  23. NO_WALL_PENALTY, NON_LIVING /*eg. gargoyle*/,
  24. RANDOM_GENIE_SPELLCASTER /*eg. master genie*/,
  25. BLOCKS_RETAILATION /*eg. naga*/,
  26. SPELL_IMMUNITY /*subid - spell id*/,
  27. MANA_CHANNELING /*value in %, eg. familiar*/,
  28. SPELL_LIKE_ATTACK /*value - spell id; range is taken from spell, but damage from creature; eg. magog*/,
  29. THREE_HEADED_ATTACK /*eg. cerberus*/,
  30. DEAMON_SUMMONING /*pit lord*/,
  31. FIRE_IMMUNITY, FIRE_SHIELD,
  32. ENEMY_MORALE_DECREASING /*value - how much it decreases*/,
  33. ENEMY_LUCK_DECREASING, UNDEAD,
  34. REGENERATION, MANA_DRAIN /*value - spell points per turn*/,
  35. LIFE_DRAIN,
  36. DOUBLE_DAMAGE_CHANCE /*value in %, eg. dread knight*/,
  37. RETURN_AFTER_STRIKE, SELF_MORALE /*eg. minotaur*/,
  38. SPELLCASTER /*subtype - spell id, value - level of school, additional info - spell power*/,
  39. CATAPULT,
  40. ENEMY_DEFENCE_REDUCTION /*in % (value), eg. behemots*/,
  41. GENERAL_DAMAGE_REDUCTION /*eg. while stoned or blinded - in %, subtype: -1 - any damage, 0 - melee damage, 1 - ranged damage*/,
  42. ATTACKS_ALL_ADAJCENT /*eg. hydra*/,
  43. MORE_DAMEGE_FROM_SPELL /*value - damage increase in %, subtype - spell id*/,
  44. CASTS_SPELL_WHEN_KILLED /*similar to spell after attack*/,
  45. FEAR, FEARLESS, NO_DISTANCE_PENALTY, NO_OBSTACLES_PENALTY,
  46. SELF_LUCK /*halfling*/,
  47. ATTACK_BONUS /*subtype: -1 - any attack, 0 - melee, 1 - ranged*/,
  48. DEFENCE_BONUS /*subtype: -1 - any attack, 0 - melee, 1 - ranged*/,
  49. SPEED_BONUS /*additional info - percent of speed bonus applied after direct bonuses; >0 - added, <0 - substracted to this part*/,
  50. HP_BONUS, ENCHANTER, HEALER, SIEGE_WEAPON, LUCK_BONUS, MORALE_BONUS, HYPNOTIZED,
  51. ADDITIONAL_RETAILATION /*value - number of additional retailations*/,
  52. MAGIC_MIRROR /* value - chance of redirecting in %*/,
  53. SUMMONED,
  54. ALWAYS_MINUMUM_DAMAGE /*unit does its minimum damage from range; subtype: -1 - any attack, 0 - melee, 1 - ranged, value: additional damage, additional info - multiplicative anti-bonus for dmg in % [eg 20 means that creature will inflict 80% of normal dmg]*/,
  55. ALWAYS_MAXIMUM_DAMAGE /*eg. bless effect, subtype: -1 - any attack, 0 - melee, 1 - ranged, value: additional damage, additional info - multiplicative bonus for dmg in %*/,
  56. ATTACKS_NEAREST_CREATURE /*while in berserk*/,
  57. IN_FRENZY /*value - level*/,
  58. SLAYER /*value - level*/,
  59. FORGETFULL /*forgetfullnes spell effect, value - level*/,
  60. CLONED, NOT_ACTIVE
  61. };
  62. enum EDuration
  63. {
  64. WHOLE_BATTLE,
  65. N_TURNS,
  66. UNITL_BEING_ATTACKED,/*removed after attack and counterattacks are performed*/
  67. UNTIL_ATTACK /*removed after attack and counterattacks are performed*/
  68. };
  69. enum ESource
  70. {
  71. CREATURE_ABILITY,
  72. BONUS_FROM_HERO,
  73. SPELL_EFFECT
  74. };
  75. ECombatFeatures type;
  76. EDuration duration;
  77. ESource source;
  78. ui16 turnsRemain; //if duration is N_TURNS it describes how long the effect will last
  79. si16 subtype; //subtype of bonus/feature
  80. si32 value;
  81. si32 additionalInfo;
  82. inline bool operator == (const ECombatFeatures & cf) const
  83. {
  84. return type == cf;
  85. }
  86. StackFeature() : type(NO_TYPE)
  87. {}
  88. template <typename Handler> void serialize(Handler &h, const int version)
  89. {
  90. h & type & duration & source & turnsRemain & subtype & value & additionalInfo;
  91. }
  92. };
  93. //generates StackFeature from given data
  94. inline StackFeature makeFeature(StackFeature::ECombatFeatures type, StackFeature::EDuration duration, si16 subtype, si32 value, StackFeature::ESource source, ui16 turnsRemain = 0, si32 additionalInfo = 0)
  95. {
  96. StackFeature sf;
  97. sf.type = type;
  98. sf.duration = duration;
  99. sf.source = source;
  100. sf.turnsRemain = turnsRemain;
  101. sf.subtype = subtype;
  102. sf.value = value;
  103. sf.additionalInfo = additionalInfo;
  104. return sf;
  105. }
  106. inline StackFeature makeCreatureAbility(StackFeature::ECombatFeatures type, si32 value, si16 subtype = 0, si32 additionalInfo = 0)
  107. {
  108. return makeFeature(type, StackFeature::WHOLE_BATTLE, subtype, value, StackFeature::CREATURE_ABILITY, 0, additionalInfo);
  109. }
  110. #endif //__STACK_FEATURE_H__