Только всё-таки diplomacyLevel - это char. Т.е. приведение к int - лишнее.
Код
float currentModifier = ( (diplomacyLevel >= 0) && (diplomacyLevel <= 3) ? armyModifier[diplomacyLevel] : 1 );
Почему 1? У нас не модификатор теперь (в понимании множителя), а процент. И currentModifier лучше переименовать в diplomacyBonus. Вообще слово Modifier заменить на Bonus.
* * *
Если нужна читабельность, то следует прислушаться к совету
feanor'а.
Создать заголовочный файл (например, hstructs.h):
Код
struct art {
int id;
int prop;
};
struct hero {
char dummy_0[201]; // байты структуры героя с 0-го по 200-й нас не интересуют
char secondarySkill[28]; // +201
char dummy_1[72]; // байты структуры героя с 229-го по 300-й тоже не интересуют
art dollArt[19]; // +301
// остальные тоже не интересуют
};
enum
{
PATHFINDING, ARCHERY, LOGISTICS, SCOUTING, DIPLOMACY, NAVIGATION, LEADERSHIP,
WISDOM, MYSTICISM, LUCK, BALLISTICS, EAGLE_EYE, NECROMANCY, ESTATES,
FIRE_MAGIC, AIR_MAGIC, WATER_MAGIC, EARTH_MAGIC, SCHOLAR, TACTICS, ARTILLERY,
LEARNING, OFFENSE, ARMORER, INTELLIGENCE, SORCERY, RESISTANCE, FIRST_AID
};
Код примерно такой получится:
Код
#include "hstructs.h";
double getArmyValueModifier(hero* myHero)
{
double diploBonus[4] = {0.00, 0.10, 0.15, 0.20};
double artBonus = 0.00;
for (int i = 0; i < 19; ++i) {
if ( myHero->dollArt[i].id == 66 ) artBonus += 0.05;
}
return 1 + diploBonus[myHero->secondarySkill[DIPLOMACY]] + artBonus;
}
int __stdcall setArmyValue(LoHook* h, HookContext* c)
{
c->eax *= getArmyValueModifier((hero*)(c->edi));
return EXEC_DEFAULT;
}
// и т.п.
* * *
UPD Поэкспериментировал с артефактами на "кукле" героя. Действительно, ID артефакта идёт первым (почему-то казалось, что вторым). Соответственно, исправил стуктуры art и hero в коде выше. Старый код со смещением артов 297 + (i << 3) + 4 будет работать всё равно (из-за +4), но правильно записывать смещение так: 301 + (i << 3). Прошу прощения. Таким образом, смещение "куклы" в структуре
feanor'а указано верно и тупил я.