Объявления

Форум о Героях Меча и Магии и King's Bounty. Если Вы любите эти игры, мы будем рады видеть Вас в наших рядах. :smile2:

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

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

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

Сообщение as239 » 04 апр 2019, 05:32

Проходы на смежные респы это очень большая проблема особенно когда они генерятся с одинаковой местностью.
Тогда очень сложно определить где заканчивается один и начинается другой.

Для JC можно сделать простой алгоритм - до прорисовки дорог обходим все клетки и смотрим смежные.
Если смежная клетка другой зоны, пустая и не пустынная, то добавляем на нее непроходимый одноклеточный объект.
Это избавило бы игроков от больших проблем. И улучшило генерацию дорог.
Тем не менее останется такой тип проблемы с дорогами:

Изображение

Т.е. когда есть 2 или более прохода в пустыню, тогда дорога от деревни идет по ближайшему пути в центр, а не в свой центральный город.
Последний раз редактировалось as239 04 апр 2019, 05:38, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение as239 » 04 апр 2019, 05:37

При первом вызове процедуры генерации дорог.
Строится дорога от центрального замка красного к центральному замку синего (x,y,z).
Т.е. как-то же алгоритм понимает что нужно вести дорогу от координат красного замка.
Которые кстати никогда не появляется в параметрах x,y,z.
Если бы можно было найти где и как задается эта отправная точка, тогда можно было бы правильно формировать дороги от нужного города к нужному.
Вернуться к началу

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

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

Сообщение Ben80 » 04 апр 2019, 06:38

@RoseKavalier,

let's continue :smile1:

Returning to shifted passage guards - you may see that they are generated strictly at border of connecting zones. In this respect NWC algorithm have no bugs. However sometimes (and frequently) it diverges with requirements of the relief. Possibly, problem arises when too big object is deleted (making path).
I think, anyway, one should solve this task by monster shifting. But it would be useful (although not necessarily) to know place in code where object/objects is deleted.

Concerning object guards:

Изображение

At this moment I have algorithm to identify bug treasure blocks. And because they are rare - solution at this moment - regenerate zone (refill it). It would be better to find error in NWC algorithm of creating of treasure blocks.

Concerning monsters which block road. I'm not sure in solution to try it to move. Because of while moving monsters, we may make some objects be opened, that is incorrect. Besides, if monster stay on road but can be bypassed - one should not change monster position. One should not diminish variability of game - gamer have choice - kill such monster or bypass it. Besides some monster on roads which are not too strong should not be moved. Again, keeping variability of game. I don't like completely refined solutions HotA-like. Frequently they are so refined, that nothing remains.

Returning to management of connection ways. It is very useful. I'm going to provide something like "Water random maps support". Problem of such maps - very freq. by land to move more profitable than by sea. I will disable regular paths. Also such maps should be without UG (they can with UG, but UG should contains sea instead of passages, but it is impossible at this moment).
Also there is other small problems which can be easily solved by management of connections (it would be very interesting to introduce some more or less complex logic).
Вернуться к началу

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

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

Сообщение Ben80 » 04 апр 2019, 10:34

Мой подход к блокам на дорогах следующий:
меня волнует не то, есть на дорогах монстры или нет, а другое. Я проверяю, можно ли из города добраться до границы с другой зоной (либо можно ли добраться до wood mine AND ore mine), без необходимости драться с очень сильным монстром.

Проблемы шаблона Jebus Cross меня, честно говоря, не слишком волнуют. JC - это по сути часть направления Героев 3 как киберспорта. А геройский киберспорт лучше оставить Хоте. Хота оптимизирована и оптимизируется под него.

В своем моде я бы хотел обеспечить отличную поддержку того, что в просторечии зовут "фанками", фан-играми (это тоже мультиплеер), которые играются без правил, подобных HW Rulez. Хотя по таким играм можно точно также проводить турниры, вести рейтинги и тд. Мод будет представлять собой по сути набор опций (так же как WOG, HD mod, SoD_SP). Мне, к сожалению, не нравиться тенденция развития HD мода в направлении именно киберспорта, в ущерб остальному. Поэтому, возможно, я сделаю мод несовместимым с версиями HD мода 4+ и 5+ (базовой можно сделать версию 3.811f). И точно мод будет не совместимым с плагином HW_Rulez (будет проверка на подключение HW_Rulez - и отключение функционала мода, если проверка даст нежелательный результат).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5048
Зарегистрирован: 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)
Поблагодарили: 1934 раз.

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

Сообщение AlexSpl » 04 апр 2019, 12:52

2catshy: Here is the working example of how you can write statistics into the info window from a plugin. This plugin simply shows Morale rolls in battle, but, of course, you can show there whatever you want to.

 InfoWnd example
Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#include "HotA\homm3.h"
#include <windows.h>
#include <tchar.h>

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

#define MAX_LOADSTRING 100
TCHAR InfoClassName[MAX_LOADSTRING] = _T("H3InfoClass");

ATOM RegisterInfoClass(HINSTANCE);
LRESULT CALLBACK InfoWnd(HWND, UINT, WPARAM, LPARAM);

HINSTANCE hGameInstance;
HWND hGameWnd;
HWND hInfoWnd;

TCHAR str[MAX_LOADSTRING] = L"Welcome to the game!";

int __stdcall showInfoWnd(LoHook* h, HookContext* c)
{
    hGameWnd = *(HWND*)0x699650;
    hGameInstance = *(HINSTANCE*)0x699604;
    RegisterInfoClass(hGameInstance);

    hInfoWnd = CreateWindow(InfoClassName, _T("Info"), WS_OVERLAPPEDWINDOW,
        10, 10, 200, 400, hGameWnd, 0, hGameInstance, 0);

    ShowWindow(hInfoWnd, SW_SHOWNORMAL);
    UpdateWindow(hInfoWnd);

    return EXEC_DEFAULT;
}

int __stdcall showMoraleRoll(LoHook* h, HookContext* c)
{
    _tcscpy_s(str, L"Rolled: ");

    TCHAR roll_str[3];
    _itot(c->eax, roll_str, 10);
    _tcscat(str, roll_str);
    InvalidateRect(hInfoWnd, NULL, TRUE);

    return EXEC_DEFAULT;
}

ATOM RegisterInfoClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcInfo = {0};

    wcInfo.cbSize = sizeof(WNDCLASSEX);

    wcInfo.style            = CS_HREDRAW | CS_VREDRAW;
    wcInfo.lpfnWndProc      = InfoWnd;
    wcInfo.cbClsExtra       = 0;
    wcInfo.cbWndExtra       = 0;
    wcInfo.hInstance        = hInstance;
    wcInfo.hIcon            = LoadIcon(wcInfo.hInstance, IDI_APPLICATION);
    wcInfo.hCursor          = LoadCursor(NULL, IDC_ARROW);
    wcInfo.hbrBackground    = (HBRUSH)(COLOR_WINDOW + 1);
    wcInfo.lpszMenuName     = NULL;
    wcInfo.lpszClassName    = InfoClassName;

    return RegisterClassEx(&wcInfo);
}

LRESULT CALLBACK InfoWnd(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            TextOut(hdc, 4, 4, str, _tcslen(str));
            EndPaint(hWnd, &ps);
            break;

        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

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("HD.Plugin.InfoWnd");

            _PI->WriteLoHook(0x4F824A, showInfoWnd);
            _PI->WriteLoHook(0x4645B8, showMoraleRoll);
        }
    }

    return TRUE;
}

InfoWnd.zip
(5.9 КБ) Скачиваний: 144
Вернуться к началу

offlinecatshy  
Новичок
Новичок
 
Сообщения: 15
Зарегистрирован: 06 сен 2018, 12:32
Пол: Не указан
Поблагодарили: 0 раз.

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

Сообщение catshy » 04 апр 2019, 15:00

AlexSpl, thanks for your example dll, tell me please, did you tested it with Hota + hd mod?
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5048
Зарегистрирован: 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)
Поблагодарили: 1934 раз.

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

Сообщение AlexSpl » 04 апр 2019, 15:41

HD mod doesn't support plugins for HotA anymore.
Вернуться к началу

offlinecatshy  
Новичок
Новичок
 
Сообщения: 15
Зарегистрирован: 06 сен 2018, 12:32
Пол: Не указан
Поблагодарили: 0 раз.

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

Сообщение catshy » 04 апр 2019, 16:04

yea, I thought that your DLL I can use for DLL Injection and it will compatible with hota+hd mod :smile6: I sent you a private message, look how you will find a moment
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 233 раз.

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

Сообщение RoseKavalier » 05 апр 2019, 03:21

@as239
Yea, that's my current thinking on how to fix misconnected roads. Zones that are set as having only 1 exit should only have 1, not several.
Terrain should not be an issue once it is possible to figure out why zones are not closed properly.

I don't know how the first road is created, but it is an interesting question to find an answer to.

@Ben80
My only intention here is to study how RMG works a bit to maybe improve some common MP issues under SoD.
To this end, I think it will be nice to use a set RMG seed so that knowing the final answer can let us understand how the game manages its steps over there.
@ 0x53662F you will find call to time() to get random seed, this can be overwritten and set to any value. After that, all RMG maps with the same settings give the exact same result. The impact of modifying any piece of code is more clearly seen!

Object guards can always be moved in post-processing, or removed along with the objects they were guarding.

~~~~

EDIT:
Example of fixed Seed 0x12345678 and modified code.

Normal generation
 
Изображение

Here 0x9090 @ 0x541B6A
 
Изображение

Here 0xEB @ 0x541B6A
 
Изображение


This is not a road fix, there are still holes that can happen which get plugged by monsters. But it would possibly reduce the amount of wrong roads in Jebus.
 
Изображение


I believe actual problem lies when zones are moved around and cover parts of each other. These tiles get marked as belonging to both zones and need to be either closed by obstacles or blocked by creatures. If game selects creature instead of obstacle, problems start for roads.
Вернуться к началу

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

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

Сообщение as239 » 06 апр 2019, 06:26

Did I understood correctly, what I can try this, by:
Код: Выделить всё
_PI->WriteHexPatch(0x541B6A, "9090");

or
Код: Выделить всё
_PI->WriteHexPatch(0x541B6A, "EB");
Вернуться к началу

Пред.След.

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

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

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

cron