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


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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 24 июн 2020, 14:49

Такое подозрение что нужно еще менять h3_ActivePlayer.
Но пока все что пробовал не помогает.
Вернуться к началу

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 » 24 июн 2020, 14:53

А попробуйте сразу после вызова этой функции игрой поставить лоухук со Sleep(10000); и посмотреть, в каком состоянии оказывается игра сразу после вызова.

Может, все вызовы после первого игнорируются (игра их скипает), например, потому что считает, что кнопка не отпущена. Как вариант, можно попытаться вызывать int __thiscall ProcessMapScreen(int this, _MouseStr_ *mstr); заполнив структуру _MouseStr_.

Хотя... Лучше эмулировать нажатие клавиши, т.к. координаты кнопки конца хода при разном разрешении будут разными. Ещё можно посмотреть вызовы 0x408B84 и 0x4089DC.
Вернуться к началу

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 » 25 июн 2020, 02:47

Потестил. Эмуляция нажатия клавиши "E" работает (пропускает ход игрока). Только вызывать функцию нужно не в цикле, иначе компы не ходят. Нужно завести глобальную переменную-счётчик пропущенных ходов. И в хуке где-нибудь после вызова NewDayStart проверять: если ход игрока-человека и счётчик пропущенных ходов больше нуля, уменьшать счётчик на 1 и пропускать ход (в идеале посылать сообщение H3Msg о завершении хода для ProcessMapScreen).
Вернуться к началу

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 » 25 июн 2020, 11:31

Через сообщения не получилось. Сделал "костыль":

Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include "..\..\HotA\homm3.h"

Patcher* _P;
PatcherInstance* _PI;
static _bool_ plugin_On = 0;

int turnsToSkip = 5;

struct _MouseStr_
{
    int Type;
    int SubType;
    int Item;
    int Flags;
    int Xabs;
    int Yabs;
    int NewPar;
    int Dialog;
} msg = {0};

int __stdcall testSkipTurn(LoHook* h, HookContext* c)
{
    if ( *(int*)(c->edx + 8) == 0x408710 && o_ActivePlayer->IsHuman() && turnsToSkip > 0 )
    {
        c->eax = (int)&msg;
       
        // o_InputMgr->SendEventMsg(0x200, 0xD, 0xC, 0, 0, 0, 0, 1);
        --turnsToSkip;
    }
    return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        if ( !plugin_On )
        {
            plugin_On = 1;
            _P = GetPatcher();
            _PI = _P->CreateInstance((char*)"HD.Plugin.TestSkipTurns");
            _PI->WriteLoHook(0x4B0C35, testSkipTurn);
            msg.Type = 0x200;
            msg.SubType = 0xD;
            msg.Item = 0xC;
            msg.NewPar = 1;
        }
    }

    return TRUE;
}

Код приведён в демонстрационных целях. Автоматически скипает turnsToSkip ходов игрока-человека сразу при старте карты (если нужно дней, умножайте turnsToSkip на кол-во игроков-людей*). Скипает однократно, но можно написать хук, который будет восстанавливать turnsToSkip по заданному событию. Также можно задать различные триггеры автоскипа хода непосредственно в условии лоухука testSkipTurn().

На время пропуска ходов удобно запретить сообщения в sub_4F6C00.

* Если нужно пропускать только свои ходы, замените условие o_ActivePlayer->IsHuman() на o_ActivePlayerID == o_MeID.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 26 июн 2020, 06:05

Большое спасибо! Все работает как надо.
Предупреждение убрал в том же хуке так:
Код: Выделить всё
      H3Hero *Hero = h3_ActivePlayer->GetActiveHero();
      Hero->movement = 0;


Кстати заметил интересный момент - если окно игры развернуто не на весь экран, то ИИ ходит гораздо быстрее чем на полном экране.
Почему так?
Отображение хода ИИ в настройках отключено, т.е. картинка не меняется.
Вернуться к началу

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 » 26 июн 2020, 09:18

Цитата:
Предупреждение убрал в том же хуке

Я про полный запрет сообщений (ещё есть новая неделя/месяц, а также различные сообщения в сингле). Т.е. нужно на время автоскипа устанавливать флаг и чекать его в sub_4F6C00. Если установлен, то не выполнять её код.

Цитата:
Кстати заметил интересный момент - если окно игры развернуто не на весь экран, то ИИ ходит гораздо быстрее чем на полном экране.

Такого не замечал. Нужно будет проверить, связано ли это как-то с HD-модом или в оригинале то же.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 26 июн 2020, 09:26

Да, отключил еще сообщения новой недели, больше в моем случае ничего не требуется:
Код: Выделить всё
_PI->WriteHexPatch(0x4CCA63, "90 90 90 90 90");


Цитата:
Такого не замечал. Нужно будет проверить, связано ли это как-то с HD-модом или в оригинале то же.

Эффект точно есть, нужно выбрать шаблон с 8 компьютерами например 6lm10a, пропустить ход и посмотреть как быстро сменяются флажки.
При свернутом окне это происходит заметно быстрее.

Мои настройки запуска HD мода:
 
Изображение
Последний раз редактировалось as239 26 июн 2020, 09:36, всего редактировалось 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 » 26 июн 2020, 09:32

Цитата:
При свернутом окне это происходит заметно быстрее.

Я подумал о разнице между оконным и полноэкранным режимами. Возможно, в свёрнутом состоянии выигрыш во времени за счёт отсутствия апдейта графики.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 26 июн 2020, 09:37

Но окно же не свернуто в трей, а просто уменьшено т.е. изображение видно и оно выводится.
С фильтром Verok такого не наблюдается, либо эффект заметно меньше.
Последний раз редактировалось as239 26 июн 2020, 09:42, всего редактировалось 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 » 26 июн 2020, 09:40

Тогда из-за фильтров? Меньше видимая площадь, меньше вычислений.
Вернуться к началу

Пред.След.

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

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

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

cron