2009-05-10 15:24:46 +00:00
# ifndef __STACK_FEATURE_H__
# define __STACK_FEATURE_H__
struct StackFeature
{
//general list of stack abilities and effects
enum ECombatFeatures
{
NO_TYPE ,
DOUBLE_WIDE , FLYING , SHOOTER , CHARGE_IMMUNITY , ADDITIONAL_ATTACK , UNLIMITED_RETAILATIONS ,
2009-05-16 14:49:06 +00:00
NO_MELEE_PENALTY ,
JOUSTING /*for champions*/ ,
2009-05-13 20:40:23 +00:00
RAISING_MORALE /*value - how much raises*/ ,
2009-05-14 17:26:55 +00:00
HATE /*eg. angels hate devils, subtype - ID of hated creature*/ ,
2009-05-10 15:24:46 +00:00
KING1 ,
2009-05-14 17:26:55 +00:00
KING2 , KING3 , MAGIC_RESISTANCE /*in % (value)*/ ,
CHANGES_SPELL_COST_FOR_ALLY /*in mana points (value) , eg. mage*/ ,
CHANGES_SPELL_COST_FOR_ENEMY /*in mana points (value) , eg. pegasus */ ,
2009-05-15 12:07:55 +00:00
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*/ ,
2009-05-10 15:24:46 +00:00
SPELL_RESISTANCE_AURA /*eg. unicorns, value - resistance bonus in % for adjacent creatures*/ ,
2009-05-14 17:26:55 +00:00
LEVEL_SPELL_IMMUNITY /*creature is immune to all spell with level below or equal to value of this bonus*/ ,
2009-05-10 15:24:46 +00:00
TWO_HEX_ATTACK_BREATH /*eg. dragons*/ ,
SPELL_DAMAGE_REDUCTION /*eg. golems; value - reduction in %, subtype - spell school; -1 - all, 0 - air, 1 - fire, 2 - water, 3 - earth*/ ,
NO_WALL_PENALTY , NON_LIVING /*eg. gargoyle*/ ,
2009-05-14 17:26:55 +00:00
RANDOM_GENIE_SPELLCASTER /*eg. master genie*/ ,
BLOCKS_RETAILATION /*eg. naga*/ ,
SPELL_IMMUNITY /*subid - spell id*/ ,
MANA_CHANNELING /*value in %, eg. familiar*/ ,
2009-05-10 15:24:46 +00:00
SPELL_LIKE_ATTACK /*value - spell id; range is taken from spell, but damage from creature; eg. magog*/ ,
THREE_HEADED_ATTACK /*eg. cerberus*/ ,
DEAMON_SUMMONING /*pit lord*/ ,
2009-05-16 14:49:06 +00:00
FIRE_IMMUNITY , FIRE_SHIELD ,
ENEMY_MORALE_DECREASING /*value - how much it decreases*/ ,
ENEMY_LUCK_DECREASING , UNDEAD ,
REGENERATION , MANA_DRAIN /*value - spell points per turn*/ ,
LIFE_DRAIN ,
2009-05-14 17:26:55 +00:00
DOUBLE_DAMAGE_CHANCE /*value in %, eg. dread knight*/ ,
2009-05-10 15:24:46 +00:00
RETURN_AFTER_STRIKE , SELF_MORALE /*eg. minotaur*/ ,
2009-05-16 14:49:06 +00:00
SPELLCASTER /*subtype - spell id, value - level of school, additional info - spell power*/ ,
CATAPULT ,
2009-05-15 12:07:55 +00:00
ENEMY_DEFENCE_REDUCTION /*in % (value), eg. behemots*/ ,
2009-05-10 15:24:46 +00:00
GENERAL_DAMAGE_REDUCTION /*eg. while stoned or blinded - in %, subtype: -1 - any damage, 0 - melee damage, 1 - ranged damage*/ ,
ATTACKS_ALL_ADAJCENT /*eg. hydra*/ ,
MORE_DAMEGE_FROM_SPELL /*value - damage increase in %, subtype - spell id*/ ,
CASTS_SPELL_WHEN_KILLED /*similar to spell after attack*/ ,
FEAR , FEARLESS , NO_DISTANCE_PENALTY , NO_OBSTACLES_PENALTY ,
SELF_LUCK /*halfling*/ ,
2009-05-16 14:49:06 +00:00
ATTACK_BONUS /*subtype: -1 - any attack, 0 - melee, 1 - ranged*/ ,
DEFENCE_BONUS /*subtype: -1 - any attack, 0 - melee, 1 - ranged*/ ,
2009-05-17 15:24:50 +00:00
SPEED_BONUS /*additional info - percent of speed bonus applied after direct bonuses; >0 - added, <0 - substracted to this part*/ ,
2009-05-16 14:49:06 +00:00
HP_BONUS , ENCHANTER , HEALER , SIEGE_WEAPON , LUCK_BONUS , MORALE_BONUS , HYPNOTIZED ,
2009-05-13 20:40:23 +00:00
ADDITIONAL_RETAILATION /*value - number of additional retailations*/ ,
2009-05-10 15:24:46 +00:00
MAGIC_MIRROR /* value - chance of redirecting in %*/ ,
2009-05-16 14:49:06 +00:00
SUMMONED ,
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]*/ ,
ALWAYS_MAXIMUM_DAMAGE /*eg. bless effect, subtype: -1 - any attack, 0 - melee, 1 - ranged, value: additional damage, additional info - multiplicative bonus for dmg in %*/ ,
ATTACKS_NEAREST_CREATURE /*while in berserk*/ ,
IN_FRENZY /*value - level*/ ,
2009-05-10 15:24:46 +00:00
SLAYER /*value - level*/ ,
2009-05-16 14:49:06 +00:00
FORGETFULL /*forgetfullnes spell effect, value - level*/ ,
2009-05-10 15:24:46 +00:00
CLONED , NOT_ACTIVE
} ;
enum EDuration
{
WHOLE_BATTLE ,
N_TURNS ,
UNITL_BEING_ATTACKED , /*removed after attack and counterattacks are performed*/
UNTIL_ATTACK /*removed after attack and counterattacks are performed*/
} ;
enum ESource
{
CREATURE_ABILITY ,
BONUS_FROM_HERO ,
2009-06-30 12:28:22 +00:00
SPELL_EFFECT ,
OTHER_SOURCE /*eg. bonus from terrain if native*/
2009-05-10 15:24:46 +00:00
} ;
2009-05-30 16:00:26 +00:00
ui8 type ; //ECombatFeatures
ui8 duration ; //EDuration
ui8 source ; //ESource
2009-05-10 15:24:46 +00:00
ui16 turnsRemain ; //if duration is N_TURNS it describes how long the effect will last
si16 subtype ; //subtype of bonus/feature
si32 value ;
si32 additionalInfo ;
inline bool operator = = ( const ECombatFeatures & cf ) const
{
return type = = cf ;
}
StackFeature ( ) : type ( NO_TYPE )
{ }
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & type & duration & source & turnsRemain & subtype & value & additionalInfo ;
}
} ;
//generates StackFeature from given data
inline StackFeature makeFeature ( StackFeature : : ECombatFeatures type , StackFeature : : EDuration duration , si16 subtype , si32 value , StackFeature : : ESource source , ui16 turnsRemain = 0 , si32 additionalInfo = 0 )
{
StackFeature sf ;
sf . type = type ;
sf . duration = duration ;
sf . source = source ;
sf . turnsRemain = turnsRemain ;
sf . subtype = subtype ;
sf . value = value ;
sf . additionalInfo = additionalInfo ;
return sf ;
}
2009-05-14 17:26:55 +00:00
inline StackFeature makeCreatureAbility ( StackFeature : : ECombatFeatures type , si32 value , si16 subtype = 0 , si32 additionalInfo = 0 )
2009-05-13 20:40:23 +00:00
{
2009-05-14 17:26:55 +00:00
return makeFeature ( type , StackFeature : : WHOLE_BATTLE , subtype , value , StackFeature : : CREATURE_ABILITY , 0 , additionalInfo ) ;
2009-05-13 20:40:23 +00:00
}
2009-05-10 15:24:46 +00:00
# endif //__STACK_FEATURE_H__