Тогда тут всё понятно:
- Код: Выделить всё
if ( spellTargetType <= 0 && (First = Army->inUnicornAuraOf.First) != 0 && (Army->inUnicornAuraOf.Last - First) >> 2 )
{
result = get_spell_work_chance(spell_1, (ECreatureType)MonType, DHero, Hero) * 0.80000001;
}
else
{
result = get_spell_work_chance(spell_1, (ECreatureType)MonType, DHero, Hero);
}
break;
Если дебаф или ударное заклинание и существо находится по крайней мере в ауре одного отряда единорогов, шанс срабатывания заклинания уменьшается на 1 - 0.8 = 20%. Уже есть идея добавить опцию кумулятивной ауры. Например, если отряд находится в ауре двух единорогов, шанс срабатывания заклинания 0.8 * 0.8 = 64% и т.д. Это было бы логично, если проводить аналогию с физическими полями.
Заклинание Clone:
- Код: Выделить всё
case SPL_CLONE:
if ( (flags & CF_CLONE) != 0 || Army->clone != -1 )
{
LABEL_91:
result = 0.0;
}
clone - это указатель на клон отряда.
Итого, структура army выглядит пока так:
- Код: Выделить всё
#pragma pack(push, 4)
struct army
{
char field_0[40];
army *clone;
char field_1F[8];
enum ECreatureType type;
int hex;
int animation;
int animationFrame;
int secondHexOrientation;
char f_048[4];
int numberAlive;
int previousNumber;
char f_054[4];
int healthLost;
int slotIndex;
int numberAtStart;
int f_064;
int walkAnimationTime;
int baseHP;
int luckValue;
H3CreatureInformation creatureInfo;
char f_0E8[4];
enum SpellID spellToApply;
char f_0F0[4];
int side;
int sideIndex;
unsigned int last_animation_time;
int yOffset;
int xOffset;
char f_108[8];
H3MonsterAnimation cranim;
int *def;
int *shootingDef;
char f_16C[4];
unsigned int moveSound;
unsigned int attackSound;
unsigned int getHitSound;
unsigned int shotSound;
unsigned int deathSound;
unsigned int defendSound;
unsigned int extraSound1;
unsigned int extraSound2;
int f_190;
int activeSpellsNumber;
int activeSpellDuration[81];
int activeSpellsLevel[81];
char f_420[52];
int retaliations;
int blessDamageBonus;
int curseDamagePenalty;
int antiMagic;
int bloodlustEffect;
int precisionEffect;
int weaknessEffect;
int stoneSkinEffect;
int unknown13;
int prayerEffect;
int mirthEffect;
int sorrowEffect;
int fortuneEffect;
int misfortuneEffect;
int slayerType;
int unknown14;
int counterstrikeEffect;
float frenzyMultiplier;
int blindEffect;
float fireShieldEffect;
float ageHealthMultiplier;
float protAirEffect;
float protFireEffect;
float protWaterEffect;
float protEarthEffect;
int effectShield;
int effectAirShield;
bool blinded;
bool paralyzed;
char _f_4C2[2];
TSkillMastery forgetfulnessMastery;
float slowEffect;
int hasteEffect;
int diseaseAttackEffect;
int diseaseDefenseEffect;
char f_4D8[8];
int faerieDragonSpell;
int magicMirrorEffect;
int morale;
int luck;
char f_4F0[4];
vector dendroidBinder;
vector dendroidBinds;
vector unicornAuraFor;
vector inUnicornAuraOf;
int health_AI_unk;
army *targetArmy;
int f_53C;
int distanceToTargetArmy;
int bfTargetArmies;
};
#pragma pack(pop)
Давайте добьём. Одна из самых важных структур всё-таки.
health_AI_unk - это, скорее всего, средний урон targetArmyAvgDamage самого опасного противника (targetArmy). Используется для определения, нужно ли кастовать Cure, и его ценности. Но, может быть, и весь средний урон от угрожающих противников из битового поля bfTargetArmies (нужно переименовать target, например, на threatening).