StackFeature.h 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #ifndef __STACK_FEATURE_H__
  2. #define __STACK_FEATURE_H__
  3. struct StackFeature
  4. {
  5. #define VCMI_CREATURE_ABILITY_LIST \
  6. VCMI_CREATURE_ABILITY_NAME(NO_TYPE) \
  7. VCMI_CREATURE_ABILITY_NAME(DOUBLE_WIDE) \
  8. VCMI_CREATURE_ABILITY_NAME(FLYING) \
  9. VCMI_CREATURE_ABILITY_NAME(SHOOTER) \
  10. VCMI_CREATURE_ABILITY_NAME(CHARGE_IMMUNITY) \
  11. VCMI_CREATURE_ABILITY_NAME(ADDITIONAL_ATTACK) \
  12. VCMI_CREATURE_ABILITY_NAME(UNLIMITED_RETALIATIONS) \
  13. VCMI_CREATURE_ABILITY_NAME(NO_MELEE_PENALTY) \
  14. VCMI_CREATURE_ABILITY_NAME(JOUSTING) /*for champions*/ \
  15. VCMI_CREATURE_ABILITY_NAME(RAISING_MORALE) /*value - how much raises*/ \
  16. VCMI_CREATURE_ABILITY_NAME(HATE) /*eg. angels hate devils, subtype - ID of hated creature*/ \
  17. VCMI_CREATURE_ABILITY_NAME(KING1) \
  18. VCMI_CREATURE_ABILITY_NAME(KING2) \
  19. VCMI_CREATURE_ABILITY_NAME(KING3) \
  20. VCMI_CREATURE_ABILITY_NAME(MAGIC_RESISTANCE) /*in % (value)*/ \
  21. VCMI_CREATURE_ABILITY_NAME(CHANGES_SPELL_COST_FOR_ALLY) /*in mana points (value) , eg. mage*/ \
  22. VCMI_CREATURE_ABILITY_NAME(CHANGES_SPELL_COST_FOR_ENEMY) /*in mana points (value) , eg. pegasus */ \
  23. VCMI_CREATURE_ABILITY_NAME(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*/ \
  24. VCMI_CREATURE_ABILITY_NAME(SPELL_RESISTANCE_AURA) /*eg. unicorns, value - resistance bonus in % for adjacent creatures*/ \
  25. VCMI_CREATURE_ABILITY_NAME(LEVEL_SPELL_IMMUNITY) /*creature is immune to all spell with level below or equal to value of this bonus*/ \
  26. VCMI_CREATURE_ABILITY_NAME(TWO_HEX_ATTACK_BREATH) /*eg. dragons*/ \
  27. VCMI_CREATURE_ABILITY_NAME(SPELL_DAMAGE_REDUCTION) /*eg. golems; value - reduction in %, subtype - spell school; -1 - all, 0 - air, 1 - fire, 2 - water, 3 - earth*/ \
  28. VCMI_CREATURE_ABILITY_NAME(NO_WALL_PENALTY) \
  29. VCMI_CREATURE_ABILITY_NAME(NON_LIVING) /*eg. gargoyle*/ \
  30. VCMI_CREATURE_ABILITY_NAME(RANDOM_GENIE_SPELLCASTER) /*eg. master genie*/ \
  31. VCMI_CREATURE_ABILITY_NAME(BLOCKS_RETALIATION) /*eg. naga*/ \
  32. VCMI_CREATURE_ABILITY_NAME(SPELL_IMMUNITY) /*subid - spell id*/ \
  33. VCMI_CREATURE_ABILITY_NAME(MANA_CHANNELING) /*value in %, eg. familiar*/ \
  34. VCMI_CREATURE_ABILITY_NAME(SPELL_LIKE_ATTACK) /*value - spell id; range is taken from spell, but damage from creature; eg. magog*/ \
  35. VCMI_CREATURE_ABILITY_NAME(THREE_HEADED_ATTACK) /*eg. cerberus*/ \
  36. VCMI_CREATURE_ABILITY_NAME(DAEMON_SUMMONING) /*pit lord*/ \
  37. VCMI_CREATURE_ABILITY_NAME(FIRE_IMMUNITY) \
  38. VCMI_CREATURE_ABILITY_NAME(FIRE_SHIELD) \
  39. VCMI_CREATURE_ABILITY_NAME(ENEMY_MORALE_DECREASING) /*value - how much it decreases*/ \
  40. VCMI_CREATURE_ABILITY_NAME(ENEMY_LUCK_DECREASING) \
  41. VCMI_CREATURE_ABILITY_NAME(UNDEAD) \
  42. VCMI_CREATURE_ABILITY_NAME(HP_REGENERATION) /*creature regenerates val HP every new round*/ \
  43. VCMI_CREATURE_ABILITY_NAME(FULL_HP_REGENERATION) /*first creature regenerates all HP every new round; subtype 0 - animation 4 (trolllike), 1 - animation 47 (wightlike)*/ \
  44. VCMI_CREATURE_ABILITY_NAME(MANA_DRAIN) /*value - spell points per turn*/ \
  45. VCMI_CREATURE_ABILITY_NAME(LIFE_DRAIN) \
  46. VCMI_CREATURE_ABILITY_NAME(DOUBLE_DAMAGE_CHANCE) /*value in %, eg. dread knight*/ \
  47. VCMI_CREATURE_ABILITY_NAME(RETURN_AFTER_STRIKE) \
  48. VCMI_CREATURE_ABILITY_NAME(SELF_MORALE) /*eg. minotaur*/ \
  49. VCMI_CREATURE_ABILITY_NAME(SPELLCASTER) /*subtype - spell id, value - level of school, additional info - spell power*/ \
  50. VCMI_CREATURE_ABILITY_NAME(CATAPULT) \
  51. VCMI_CREATURE_ABILITY_NAME(ENEMY_DEFENCE_REDUCTION) /*in % (value) eg. behemots*/ \
  52. VCMI_CREATURE_ABILITY_NAME(GENERAL_DAMAGE_REDUCTION) /* shield / air shield effect */ \
  53. VCMI_CREATURE_ABILITY_NAME(GENERAL_ATTACK_REDUCTION) /*eg. while stoned or blinded - in %, subtype: -1 - any damage, 0 - melee damage, 1 - ranged damage*/ \
  54. VCMI_CREATURE_ABILITY_NAME(ATTACKS_ALL_ADJACENT) /*eg. hydra*/ \
  55. VCMI_CREATURE_ABILITY_NAME(MORE_DAMAGE_FROM_SPELL) /*value - damage increase in %, subtype - spell id*/ \
  56. VCMI_CREATURE_ABILITY_NAME(CASTS_SPELL_WHEN_KILLED) /*similar to spell after attack*/ \
  57. VCMI_CREATURE_ABILITY_NAME(FEAR) \
  58. VCMI_CREATURE_ABILITY_NAME(FEARLESS) \
  59. VCMI_CREATURE_ABILITY_NAME(NO_DISTANCE_PENALTY) \
  60. VCMI_CREATURE_ABILITY_NAME(NO_OBSTACLES_PENALTY) \
  61. VCMI_CREATURE_ABILITY_NAME(SELF_LUCK) /*halfling*/ \
  62. VCMI_CREATURE_ABILITY_NAME(ATTACK_BONUS) /*subtype: -1 - any attack, 0 - melee, 1 - ranged*/ \
  63. VCMI_CREATURE_ABILITY_NAME(DEFENCE_BONUS) /*subtype: -1 - any attack, 0 - melee, 1 - ranged*/ \
  64. VCMI_CREATURE_ABILITY_NAME(SPEED_BONUS) /*additional info - percent of speed bonus applied after direct bonuses; >0 - added, <0 - substracted to this part*/ \
  65. VCMI_CREATURE_ABILITY_NAME(HP_BONUS) \
  66. VCMI_CREATURE_ABILITY_NAME(ENCHANTER) \
  67. VCMI_CREATURE_ABILITY_NAME(HEALER) \
  68. VCMI_CREATURE_ABILITY_NAME(SIEGE_WEAPON) \
  69. VCMI_CREATURE_ABILITY_NAME(LUCK_BONUS) \
  70. VCMI_CREATURE_ABILITY_NAME(MORALE_BONUS) \
  71. VCMI_CREATURE_ABILITY_NAME(HYPNOTIZED) \
  72. VCMI_CREATURE_ABILITY_NAME(ADDITIONAL_RETALIATION) /*value - number of additional retaliations*/ \
  73. VCMI_CREATURE_ABILITY_NAME(MAGIC_MIRROR) /* value - chance of redirecting in %*/ \
  74. VCMI_CREATURE_ABILITY_NAME(SUMMONED) \
  75. VCMI_CREATURE_ABILITY_NAME(ALWAYS_MINIMUM_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]*/ \
  76. VCMI_CREATURE_ABILITY_NAME(ALWAYS_MAXIMUM_DAMAGE) /*eg. bless effect, subtype: -1 - any attack, 0 - melee, 1 - ranged, value: additional damage, additional info - multiplicative bonus for dmg in %*/ \
  77. VCMI_CREATURE_ABILITY_NAME(ATTACKS_NEAREST_CREATURE) /*while in berserk*/ \
  78. VCMI_CREATURE_ABILITY_NAME(IN_FRENZY) /*value - level*/ \
  79. VCMI_CREATURE_ABILITY_NAME(SLAYER) /*value - level*/ \
  80. VCMI_CREATURE_ABILITY_NAME(FORGETFULL) /*forgetfullnes spell effect, value - level*/ \
  81. VCMI_CREATURE_ABILITY_NAME(CLONED) \
  82. VCMI_CREATURE_ABILITY_NAME(NOT_ACTIVE) \
  83. VCMI_CREATURE_ABILITY_NAME(NO_LUCK) /*eg. when fighting on cursed ground*/ \
  84. VCMI_CREATURE_ABILITY_NAME(NO_MORALE) /*eg. when fighting on cursed ground*/
  85. //general list of stack abilities and effects
  86. enum ECombatFeatures
  87. {
  88. #define VCMI_CREATURE_ABILITY_NAME(x) x,
  89. VCMI_CREATURE_ABILITY_LIST
  90. #undef VCMI_CREATURE_ABILITY_NAME
  91. };
  92. enum EDuration
  93. {
  94. WHOLE_BATTLE = 1,
  95. N_TURNS = 2,
  96. UNITL_BEING_ATTACKED = 4,/*removed after attack and counterattacks are performed*/
  97. UNTIL_ATTACK = 8 /*removed after attack and counterattacks are performed*/
  98. };
  99. enum ESource
  100. {
  101. CREATURE_ABILITY,
  102. BONUS_FROM_HERO,
  103. SPELL_EFFECT,
  104. OTHER_SOURCE /*eg. bonus from terrain if native*/
  105. };
  106. ui8 type;//ECombatFeatures
  107. ui8 duration;//EDuration //bitfield
  108. ui8 source;//ESource
  109. si8 positiveness; //+1 - positive, 0 - neutral, -1 - negative; used mostly for spell features
  110. ui16 turnsRemain; //if duration is N_TURNS it describes how long the effect will last
  111. si16 subtype; //subtype of bonus/feature
  112. si32 value;
  113. si32 additionalInfo;
  114. inline bool operator == (const ECombatFeatures & cf) const
  115. {
  116. return type == cf;
  117. }
  118. StackFeature() : type(NO_TYPE)
  119. {}
  120. template <typename Handler> void serialize(Handler &h, const int version)
  121. {
  122. h & type & duration & source & positiveness & turnsRemain & subtype & value & additionalInfo;
  123. }
  124. };
  125. //generates StackFeature from given data
  126. inline StackFeature makeFeature(StackFeature::ECombatFeatures type, ui8 duration, si16 subtype, si32 value, StackFeature::ESource source, ui16 turnsRemain = 0, si32 additionalInfo = 0)
  127. {
  128. StackFeature sf;
  129. sf.type = type;
  130. sf.duration = duration;
  131. sf.source = source;
  132. sf.turnsRemain = turnsRemain;
  133. sf.subtype = subtype;
  134. sf.value = value;
  135. sf.additionalInfo = additionalInfo;
  136. return sf;
  137. }
  138. inline StackFeature makeCreatureAbility(StackFeature::ECombatFeatures type, si32 value, si16 subtype = 0, si32 additionalInfo = 0)
  139. {
  140. return makeFeature(type, StackFeature::WHOLE_BATTLE, subtype, value, StackFeature::CREATURE_ABILITY, 0, additionalInfo);
  141. }
  142. #endif //__STACK_FEATURE_H__