Объявления
Поздравляем
Roman2211


Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

Как создать плагин для HD мода

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 09 сен 2017, 14:04

Цитата:
При игре с компом играю красным и получаю ID 1 из-за того, что атакер - комп, а не я.

Естественно, нападает же он в свой ход.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 09 сен 2017, 14:06

Цитата:
Нужно в любом случае понимать, какой герой будет орлоглазить, и на каком уровне.
Вот встречаются например 2 героя, один с Орлоглазом на 1 стадии, другой на 2-й. Оба получат спеллы, но очень разные
(поскольку на 1-й ступени можно выучить спеллы только 1 и 2 уровня, да и изначальные спеллы у них разные).

Посмотрите хук на предыдущей странице. В нём можно получить всю нужную инфу и раздать спеллы. hero[0] учит спеллы hero[1], а hero[1] - hero[0], соответственно.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 09 сен 2017, 14:12

AlexSpl писал(а):

Цитата:
Нужно в любом случае понимать, какой герой будет орлоглазить, и на каком уровне.
Вот встречаются например 2 героя, один с Орлоглазом на 1 стадии, другой на 2-й. Оба получат спеллы, но очень разные
(поскольку на 1-й ступени можно выучить спеллы только 1 и 2 уровня, да и изначальные спеллы у них разные).

Посмотрите хук на предыдущей странице. В нём можно получить всю нужную инфу и раздать спеллы. hero[0] учит спеллы hero[1], а hero[1] - hero[0], соответственно.


Посмотрел.

AlexSpl писал(а):

hero[0] учит спеллы hero[1], а hero[1] - hero[0], соответственно.


Это получится. А отправить адекватную инфу (диалог) со списком выученных заклинаний - не получиться. Нужно знать, кому какой список послать. В смысле - нужно знать кто мы - герой0 или герой1.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 09 сен 2017, 14:14

Правда, есть способ - найти, какие заклинания у нас добавились. :smile1:
И из них сформировать список для диалога.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 09 сен 2017, 14:16

Цитата:
Это получится. А отправить адекватную инфу (диалог) со списком выученных заклинаний - не получиться. Нужно знать, кому какой список послать. В смысле - нужно знать кто мы - герой0 или герой1.

Это уже следующий этап. Пока сделайте общий список: hero[0] (его имя) выучил(а): список заклов, hero[1] (его имя) выучил(а): список заклов.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 09 сен 2017, 14:16

Хотя вообще-то и это затруднительно сделать, если не знать кто мы.
Наш ID нам по любому нужен.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 09 сен 2017, 14:17

В общем, вот эту штуку я протестировал -
Код: Выделить всё
int mojID = CALL_1(_int_, __thiscall, 0x4CE6E0, *(int*)0x699538);


И на этом варианте остановлюсь.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 09 сен 2017, 14:22

Цитата:
Хотя вообще-то и это затруднительно сделать, если не знать кто мы.
Наш ID нам по любому нужен.

Я не понимаю :smile14: Почему затруднительно: o_BattleMgr->hero[0]->spell[ID] = o_BattleMgr->hero[1]->spell[ID]; То же для _byte_ spell_level[70]; // +1072 (уровни школ магии также доступны). ID - заклинание, которое учим. Всё в цикле с rand_s.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 09 сен 2017, 14:56

Например, так:

Код: Выделить всё
for (int iSide = ATTACKER; iSide <= DEFENDER; ++iSide)
{
    if ( !o_BattleMgr->hero[iSide] || !o_BattleMgr->hero[1 - iSide] ) continue;
   
    for (int iSpell = SPL_QUICKSAND; iSpell <= SPL_AIR_ELEMENTAL; ++iSpell)
    {
        if ( canLearn(iSide, iSpell) )
        {
            o_BattleMgr->hero[iSide]->spell[iSpell] = 1;
            o_BattleMgr->hero[iSide]->spell_level[iSpell] = getMagicSchoolExpertise(iSide, iSpell);
        }
   
    }
}


canLearn() - в эту функцию пишем условия получения заклинания (вероятность изучения, ограничения по уровню заклинания и пр.).
getMagicSchoolExpertise() - возвращает уровень школы магии героя, к которой принадлежит заклинание.

* * *
Функция canLearn() может выглядеть так:

Код: Выделить всё
bool canLearn(const int side, const int id)
{
    // Если герой уже знает заклинание id, возвращаем false
    if ( o_BattleMgr->hero[side]->spell[id] ) return false;

    // Если вражеский герой не знает заклинание id, возвращаем false
    if ( !o_BattleMgr->hero[1 - side]->spell[id] ) return false;

    // Если у героя недостаточно Мудрости, чтобы изучить заклинание, возвращаем false
    if ( o_BattleMgr->hero[side]->second_skill[HSS_WISDOM] < minWisdom(id) ) return false;

    // Проверяем ограничения Eagle Eye, налагаемые на уровень заклинаний
    const int maxLevel[] = {0, 2, 3, 4};
    if ( getSpellLevel(id) > maxLevel[o_BattleMgr->hero[side]->second_skill[HSS_EAGLE_EYE]] ) return false;
   
    // Иначе бросаем кость
    const unsigned int eagleEyeProbs[] = {0, 40, 50, 60};
    unsigned int dice;
    rand_s(&dice);
    dice = (unsigned int)((double)dice / ((double)UINT_MAX + 1) * 100.0) + 1;

    return dice <= eagleEyeProbs[o_BattleMgr->hero[side]->second_skill[HSS_EAGLE_EYE]];
}


UPD: Добавил проверку на уровень заклинания (1-2 уровень на Basic, 1-3 на Advanced, 1-4 на Expert Eagle Eye).

P.S. Остаётся только написать функции getMagicSchoolExpertise(), minWisdom() и getSpellLevel().
Последний раз редактировалось AlexSpl 09 сен 2017, 17:28, всего редактировалось 3 раз(а).
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 09 сен 2017, 17:11

AlexSpl писал(а):

Цитата:
Хотя вообще-то и это затруднительно сделать, если не знать кто мы.
Наш ID нам по любому нужен.

Я не понимаю :smile14: Почему затруднительно: o_BattleMgr->hero[0]->spell[ID] = o_BattleMgr->hero[1]->spell[ID]; То же для _byte_ spell_level[70]; // +1072 (уровни школ магии также доступны). ID - заклинание, которое учим. Всё в цикле с rand_s.


В коде, не относящемся к получению ID, ничего затруднительного нет, я в общем-то его уже написал вчера вечером. Единственной проблемой было получение корректных ID (красный, синий и тд).
Кроме того, придется уделить некоторое внимание размеру кода, входящего в патч (уже встречал некое неприятное предупреждение от программы с сопутствующими глюками).
Ну и придется потратить определенное время на то, чтобы понять, какие точно аргументы нужно передавать в вызов диалога.
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron