* * *
1. Карта приключений и объекты на ней
Как получить указатель на состояние банка существ по указателю на структуру клетки карты, являющуюся входом в банк существ
- Код: Выделить всё
_MapItem_* mapItem;
_CrBankState_* bankState = CALL_1(_CrBankState_*, __fastcall, 0x405D80, mapItem);
Как получить указатель на состояние жилища существ по указателю на структуру клетки карты, являющуюся входом в жилище существ
(Спасибо: igrik)
- Код: Выделить всё
// Получаем указатель на _Dwelling_ по ID жилища существ
_Dwelling_* GetDwelling(_int_ dwellingId) {
return (_Dwelling_ *)(o_GameMgr->Field<int>(0x4E39C) + 92 * dwellingId);
}
// Получаем состояние жилища существ
_Dwelling_* dwelling = GetDwelling(mapItem->setup);
Как получить координаты x, y, z клетки карты по указателю на структуру клетки карты
(Спасибо: RoseKavalier)
- Код: Выделить всё
int mapSize = o_AdvMgr->map->size;
int pos = mapItem - o_AdvMgr->map->items;
char x = pos % mapSize;
pos /= mapSize;
char y = pos % mapSize;
char z = pos / mapSize;
2. Города и замки
Как получить тип стартового замка игрока по номеру игрока
- Код: Выделить всё
int playerID;
const int startTownType = o_GameMgr->Field<int>(0x1F6A0 + 0x10 + playerID * 4);
3. Герои, их свойства и характеристики
Как получить номер стартового героя игрока по номеру игрока
- Код: Выделить всё
int playerID;
const int startHeroID = o_GameMgr->Field<int>(0x1F6A0 + 0x1A4 + playerID * 4);
Как получить модификаторы (множители) вторичных навыков героя с учётом его специализации и экипированных артефактов по указателю на структуру героя
- Код: Выделить всё
_Hero_* hero;
bool clamp_value; // Нужна для Некроматии: true - модификатор ограничен числом 1.0, false - модификатор не ограничен
float ArcheryMod = CALL_1(float, __thiscall, 0x4E43D0, hero); // Стрельба (Archery)
float DiplomacyMod = CALL_1(float, __thiscall, 0x4E47F0, hero); // Дипломатия (Diplomacy)
float EagleEyeMod = CALL_1(float, __thiscall, 0x4E4690, hero); // Зоркость (Eagle Eye)
float NecromancyMod = CALL_2(float, __thiscall, 0x4E3F40, hero, clamp_value); // Некромантия (Necromancy)
float EstatesMod = CALL_1(float, __thiscall, 0x4E4600, hero); // Имущество (Estates)
float LearningMod = CALL_1(float, __thiscall, 0x4E4AB0, hero); // Обучение (Learning)
float OffenseMod = CALL_1(float, __thiscall, 0x4E4520, hero); // Нападение (Offense)
float ArmorerMod = CALL_1(float, __thiscall, 0x4E4580, hero); // Доспехи (Armorer)
float IntelligenceMod = CALL_1(float, __thiscall, 0x4E4B20, hero); // Интеллект (Intelligence)
float ResistanceMod = CALL_1(float, __thiscall, 0x4E4950, hero); // Сопротивление (Resistance)
float FirstAidMod = CALL_1(float, __thiscall, 0x4E4B90, hero); // Первая помощь (First Aid)
Как получить радиус обзора героя
- Код: Выделить всё
_Hero_* hero;
int ScoutingRadius = CALL_1(int, __thiscall, 0x4E42E0, hero);
4. Бой
Как получить номер текущего раунда (Требует проверки)
- Код: Выделить всё
int currentRound = o_BattleMgr->Field<int>(0x132A0) - 30000;
Как получить текущую скорость отряда
- Код: Выделить всё
_BattleStack_* battleStack;
int speed = CALL_1(int, __thiscall, 0x4489F0, battleStack);
5. Графика, анимация и звук
Как отметить отряды для анимации массового заклинания
- Код: Выделить всё
#define AnimateStack (((bool(*)[20])&o_BattleMgr->Field<bool>(0x547C)))
memset(AnimateStack, false, 40);
// Отмечаем отряды, для которых необходима анимация (в цикле)
AnimateStack[side][stackID] = true;
// Проигрываем массовую анимацию
CALL_4(void, __thiscall, 0x5A6AD0, o_BattleMgr, AnimateStack, o_Spell[spellId].animation_ix, 0);
To be continued...