Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineigrik  
Подмастерье
Подмастерье
 
Сообщения: 108
Зарегистрирован: 14 сен 2017, 12:35
Пол: Не указан
Поблагодарили: 84 раз.

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

Сообщение igrik » 22 дек 2021, 05:06

Вот код для XXL под SOD (WoG'овские строки я вырезал). Код достаточно подробно откомментирован.
Единственное что тут не решено: это нет поддержки миникарты. Я не решал эту проблему по двум причинам:
1. Миникарта корректно работает в HD-моде (там Бараторч ёё решил (видимо интегрировал из Хоты)). А так как это плагин под HD, то по факту и решать эту проблему не нужно.
2. Решение этой проблемы достаточно сложное, и нужно некисло так переписать большой кусок нескольких функций обработки миникарты. Учитывая пункт 1 - я посчитал, что "игра не стоит свеч".

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

char myString[1024];
#define MyString (char*)myString

Patcher* _P;
PatcherInstance* _PI;

///////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////  КОНСТАНТЫ ///////////////////////////////////////////////

#define MAPSIZE_S   36
#define MAPSIZE_M   72
#define MAPSIZE_L  108
#define MAPSIZE_XL 144
#define MAPSIZE_H  180
#define MAPSIZE_XH 216
#define MAPSIZE_G  252

#define BTTNID_S   281
#define BTTNID_M   282
#define BTTNID_L   283
#define BTTNID_XL  284
#define BTTNID_U   285

#define BTTNID_PCX  1102
#define BTTNID_H  1103
#define BTTNID_XH 1104
#define BTTNID_G  1105

///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

#define SmallFont_FNT (*(char**)0x4EEAF8)

char* RanSizS_DEF = "RanSizS.def";
char* RanSizM_DEF = "RanSizM.def";
char* RanSizL_DEF = "RanSizL.def";
char* RanSizXL_DEF = "RanSizX.def";
char* RanSizHG_DEF = "RanSizHG.def";
char* RanSizXH_DEF = "RanSizXH.def";
char* RanSizGT_DEF = "RanSizGT.def";
char* RanSizU_DEF = "RanUndr.def";

// переменная для проверки стартовала ли игра (т.е. видима ли уже карта)
// например диалог повышения уровня при старте карты пропускается из-за неё
#define o_StartGame_SkipDialogs (*(_int_*)0x698450)

///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

int __stdcall Y_NewScenarioDlg_Proc(HiHook* hook, _NewScenarioDlg_* sDlg, _EventMsg_* msg)
{
   // делаем ПКМ на кнопках размера карты при создании "случайной карты"
   if (msg->type == MT_MOUSEBUTTON) {
        if(msg->subtype == MST_RBUTTONDOWN) {
            if ( msg->item_id >= BTTNID_S && msg->item_id <= BTTNID_XL ) {
                int size = (msg->item_id -BTTNID_S +1) *MAPSIZE_S;
                sprintf(MyString, "{%s:} %d x %d", o_GENRLTXT_TXT->GetString(754), size, size);
                b_MsgBox(MyString, 4);
                return 1;

            }

            if (msg->item_id >= BTTNID_H && msg->item_id <= BTTNID_G ) {
                int size = (msg->item_id -BTTNID_H +5) *MAPSIZE_S;
                sprintf(MyString, "{%s:} %d x %d", o_GENRLTXT_TXT->GetString(754), size, size);
                b_MsgBox(MyString, 4);
                return 1;
            }
 
            //sprintf(MyString, "id: %d", msg->item_id);
            //b_MsgBox(MyString, 4);
            //return 1;
        }      
   }

   return CALL_2(int, __thiscall, hook->GetDefaultFunc(), sDlg, msg);
}

///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

// вырезаем создание кнопок игрой и создаём их сами
int __stdcall Y_NewScenarioDlg_RandomMap_CreateButtons(LoHook* h, HookContext* c)
{
    // получаем структуру диалога
    _NewScenarioDlg_* dlg = (_NewScenarioDlg_*)c->ebx;
    // создаём текст (размер карты)
    dlg->AddItemToOwnArrayList(_DlgStaticText_::Create(58, 82, 99, 31, o_GENRLTXT_TXT->GetString(754), SmallFont_FNT, 1, 280, ALIGN_H_CENTER | ALIGN_V_CENTER, 0));   
    // перекрываем этот текс и его обводку голубым фоном
    dlg->AddItemToOwnArrayList(_DlgStaticPcx8_::Create(56, 78, 102, 38, BTTNID_PCX, "DiBoxBlu.pcx"));
    // координаты кнопок
    int x = 57;   int xh = 44;   int xd = 43;
    int y = 81;   int yh = 33;
    // стандартные кнопки: S, M, L, XL
    dlg->AddItemToOwnArrayList(_DlgButton_::Create(x + xd*0, y, xh, yh, BTTNID_S, RanSizS_DEF, 0, 1, 0, 0, 2));
    dlg->AddItemToOwnArrayList(_DlgButton_::Create(x + xd*1, y, xh, yh, BTTNID_M, RanSizM_DEF, 0, 1, 0, 0, 2));
    dlg->AddItemToOwnArrayList(_DlgButton_::Create(x + xd*2, y, xh, yh, BTTNID_L, RanSizL_DEF, 0, 1, 0, 0, 2));
    dlg->AddItemToOwnArrayList(_DlgButton_::Create(x + xd*3, y, xh, yh, BTTNID_XL, RanSizXL_DEF, 0, 1, 0, 0, 2));   
    // новые кнопки: H, XH, G
    dlg->AddItemToOwnArrayList(_DlgButton_::Create(x + xd*4, y, xh, yh, BTTNID_H, RanSizHG_DEF, 0, 1, 0, 0, 2));
    dlg->AddItemToOwnArrayList(_DlgButton_::Create(x + xd*5, y, xh, yh, BTTNID_XH, RanSizXH_DEF, 0, 1, 0, 0, 2));
    dlg->AddItemToOwnArrayList(_DlgButton_::Create(x + xd*6, y, xh, yh, BTTNID_G, RanSizGT_DEF, 0, 1, 0, 0, 2));
    // кнопка подземелья
    dlg->AddItemToOwnArrayList(_DlgButton_::Create(x + xd*7, y, xh, yh, BTTNID_U, RanSizU_DEF, 0, 1, 0, 0, 2));
    // пропускаем оригинальный код игры
    c->return_address = 0x57D6CC;
   return NO_EXEC_DEFAULT;
}


int DlgItem_SendCommand(_Dlg_* dlg, int itemID, int enable)
{
    if (enable) // DlgItem_Send5Cmd2Item
       return CALL_3(int, __thiscall, 0x5FF490, dlg, itemID, 16);
    else       // DlgItem_Send6Cmd2Item
       return CALL_3(int, __thiscall, 0x5FF520, dlg, itemID, 16);
}

///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

char Y_NewScenarioDlg_RandomMap_CALL_UpdateButtons(_NewScenarioDlg_* dlg, int mapSize)
{
    *(int*)((int)dlg + 6304) = mapSize;
    CALL_1(char, __thiscall, 0x57F240, dlg);
   
    dlg->Redraw(0);
    CALL_1(signed int, __thiscall, 0x584820, dlg);

    return 0;
}

int __stdcall Y_NewScenarioDlg_RandomMap_UpdateButtons(LoHook* h, HookContext* c)
{
    // получаем структуру диалога
    _NewScenarioDlg_* dlg = (_NewScenarioDlg_*)c->esi;

    // отключаем все старые кнопки
    DlgItem_SendCommand(dlg, BTTNID_S, 0);
    DlgItem_SendCommand(dlg, BTTNID_M, 0);
    DlgItem_SendCommand(dlg, BTTNID_L, 0);
    DlgItem_SendCommand(dlg, BTTNID_XL, 0);
    // отключаем все новые кнопки
    DlgItem_SendCommand(dlg, BTTNID_H, 0);
    DlgItem_SendCommand(dlg, BTTNID_XH, 0);
    DlgItem_SendCommand(dlg, BTTNID_G, 0);

    // тут код включения нужной кнопки
    // в зависимости от размера карты 0x57F270
    int mapSize = *(int*)((int)dlg + 6304);

    if (mapSize == MAPSIZE_S)
        DlgItem_SendCommand(dlg, BTTNID_S, 1);

    if (mapSize == MAPSIZE_M)
        DlgItem_SendCommand(dlg, BTTNID_M, 1);

    if (mapSize == MAPSIZE_L)
        DlgItem_SendCommand(dlg, BTTNID_L, 1);

    if (mapSize == MAPSIZE_XL)
        DlgItem_SendCommand(dlg, BTTNID_XL, 1);

    if (mapSize == MAPSIZE_H)
        DlgItem_SendCommand(dlg, BTTNID_H, 1);

    if (mapSize == MAPSIZE_XH)
        DlgItem_SendCommand(dlg, BTTNID_XH, 1);
   
    if (mapSize == MAPSIZE_G)
        DlgItem_SendCommand(dlg, BTTNID_G, 1);

    c->return_address = 0x57F2B6;
   return NO_EXEC_DEFAULT;
}


int __stdcall Y_NewScenarioDlg_RandomMap_CallUpdateButtons(HiHook* hook, _NewScenarioDlg_* dlg, _EventMsg_* msg, int a3, int a4)
{
    if (msg->item_id == BTTNID_H)     
        return Y_NewScenarioDlg_RandomMap_CALL_UpdateButtons(dlg, MAPSIZE_H);

    if (msg->item_id == BTTNID_XH)       
        return Y_NewScenarioDlg_RandomMap_CALL_UpdateButtons(dlg, MAPSIZE_XH);

    if (msg->item_id == BTTNID_G)       
        return Y_NewScenarioDlg_RandomMap_CALL_UpdateButtons(dlg, MAPSIZE_G);

   return CALL_4(int, __thiscall, hook->GetDefaultFunc(), dlg, msg, a3, a4);
}


// показать кнопки   
int __stdcall Y_NewScenarioDlg_RandomMap_ShowButtons(LoHook* h, HookContext* c)
{
    // получаем структуру диалога
    _NewScenarioDlg_* dlg = (_NewScenarioDlg_*)c->esi;

    _DlgItem_* item;

    item = dlg->GetItem(BTTNID_PCX);
    if (item) item->Show();

    item = dlg->GetItem(BTTNID_H);
    if (item) item->Show();

    item = dlg->GetItem(BTTNID_XH);
    if (item) item->Show();

    item = dlg->GetItem(BTTNID_G);
    if (item) item->Show();   

   return EXEC_DEFAULT;
}

// скрыть кнопки   
int __stdcall Y_NewScenarioDlg_RandomMap_HideButtons(LoHook* h, HookContext* c)
{
    // получаем структуру диалога
    _NewScenarioDlg_* dlg = (_NewScenarioDlg_*)c->esi;

    _DlgItem_* item;

    item = dlg->GetItem(BTTNID_PCX);
    if (item) item->Hide();

    item = dlg->GetItem(BTTNID_H);
    if (item) item->Hide();

    item = dlg->GetItem(BTTNID_XH);
    if (item) item->Hide();

    item = dlg->GetItem(BTTNID_G);
    if (item) item->Hide();   

   return EXEC_DEFAULT;
}

// патч: фикс вылета при загрузке/старте карты
int __stdcall Y_Fix_OpenArea(LoHook* h, HookContext* c)
{
    if (o_StartGame_SkipDialogs)
    {
        c->return_address = 0x49D026;
        return NO_EXEC_DEFAULT;
    }

    return EXEC_DEFAULT;
}

///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

void StartPlugin()
{
   _PI->WriteHiHook(0x587FD0, SPLICE_, EXTENDED_, THISCALL_, Y_NewScenarioDlg_Proc);

    // вырезаем создание кнопок игрой и создаём их сами
    _PI->WriteCodePatch(0x57D49B, "%n", 2);
    _PI->WriteLoHook(0x57D4A6, Y_NewScenarioDlg_RandomMap_CreateButtons);

    // показать кнопки   
    _PI->WriteLoHook(0x5801E1, Y_NewScenarioDlg_RandomMap_ShowButtons);

    // скрыть кнопки   
    _PI->WriteLoHook(0x5820A6, Y_NewScenarioDlg_RandomMap_HideButtons);

    // подсветка нужной кнопки случайной карты
    _PI->WriteLoHook(0x57F258, Y_NewScenarioDlg_RandomMap_UpdateButtons);

    // нажатия кнопок обрабатывать тут 0x586938 -> 0x586FEB
    _PI->WriteHiHook(0x586880, SPLICE_, EXTENDED_, THISCALL_, Y_NewScenarioDlg_RandomMap_CallUpdateButtons);

    // читы: радиус открытия/закрытия карты
    _PI->WriteDword(0x4026F9 +1, 356);
    _PI->WriteDword(0x402750 +1, 356);
    _PI->WriteDword(0x4F4B56 +1, 356);

    // патч: фикс вылета при загрузке/старте карты
    _PI->WriteLoHook(0x49CFFA, Y_Fix_OpenArea);

    // решение проблемы вылета игры при загрузке сохранения
    // суть: __int16 в __uint16 (делаем беззнаковое)
    _PI->WriteByte(0x49B96F +1, 0xB7); // загрузка   (change MOVSX to MOVZX)
    _PI->WriteByte(0x49BAA2, 0x76);    // сохранение (change JLE to JBE)
    _PI->WriteByte(0x49BAB4 +1, 0xB7); // сохранение (change MOVSX to MOVZX)
    _PI->WriteByte(0x49BABB, 0x72);    // сохранение (change JL to JB)

///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

BOOL APIENTRY DllMain ( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
{
   static _bool_ initialized = 0;
   switch (ul_reason_for_call)
   {
   case DLL_PROCESS_ATTACH:
      if (!initialized)
      {
         initialized = 1;

         _P = GetPatcher();
         _PI = _P->CreateInstance("igrik.XXL");

         StartPlugin();
         
      }
      break;

   case DLL_PROCESS_DETACH:
      if (initialized)
         initialized = 0;
      break;

   case DLL_THREAD_ATTACH:
      break;

   case DLL_THREAD_DETACH:
      break;
   }
   return TRUE;
}


PS: и ещё один важнйый момент: данный код предназначен только для генерации случайных карт.
Последний раз редактировалось igrik 29 дек 2021, 07:55, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

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

Сообщение void_17 » 22 дек 2021, 06:37

Цитата:
игра не стоит свеч

А результат - труда,
Но я сажаю баганные хуки
а-а-ааа
на геройском экзешнике.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

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

Сообщение void_17 » 22 дек 2021, 06:43

Цитата:
В HD моде для 4-ки от Verok есть возможность переключаться с Winds of War на ванилу, и на The Gathering Storm, вот это тема, да.

Слишком сложно реализовать для 3-ки. В 3-ке в разных версиях многие типы и соответственно переменные другие, плюс еще учитывайте новведения и функции к ним. Хотя, впринципе, можно сделать так, чтобы в одной папке лежало три разных экзешника и они просто запускались. Но и для них надо накостылить HD-Mod, ведь он не работает для RoE и AB.
Вернуться к началу

offlineХеромант  
имя: OL
Новичок
Новичок
 
Сообщения: 15
Зарегистрирован: 21 ноя 2021, 19:42
Пол: Мужчина
Поблагодарили: 2 раз.

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

Сообщение Херомант » 22 дек 2021, 10:21

igrik писал(а):

Вот код для XXL под SOD (WoG'овские строки я вырезал). Код достаточно подробно откомментирован.
1. Миникарта корректно работает в HD-моде (там Бараторч ёё решил (видимо интегрировал из Хоты)). А так как это плагин под HD, то по факту и решать эту проблему не нужно.


Насколько помню, в HD-моде перехват и замена всей функции отрисовки радара появилась раньше всех. Как раз из-за патча на XXXL-карты от 2010 года. Видимо, Бараторч не стал ждать у моря погоды, а просто сделал сам. Но и минус в этом соответствующий - моддеры не имеют доступа к отрисовке мини-карты (например, в ERA+ с HD-модом и без HD-мода мини-карты будут выглядеть по-разному, т.к. Тифон показывает на ней новые объекты, а HD-мод рисует согласно СоД-у).

igrik писал(а):

2. Решение этой проблемы достаточно сложное, и нужно некисло так переписать большой кусок нескольких функций обработки миникарты.


Да, HD-мод так и делает, там довольно объёмистый с сложный код на создание рамки в режиме реального времени, её отрисовки и ну и самой мини-карты. В MoP всё проще - пропатчены и расширены оригинальные содовские функции, но при этом сохранена привязка на конкретные размеры карты, а все данные хранятся в готовом виде в виде спрайтов-шаблонов - сама игра ничего не считает, тупо показывает и всё. А так как в MoP поддерживается только 800х600, то и переделывать содовский код не было необходимости - радар на XXXL-картах работает целиком на нём.
Вернуться к началу

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 » 22 дек 2021, 13:46

Цитата:
Насколько помню, в HD-моде перехват и замена всей функции отрисовки радара появилась раньше всех. Как раз из-за патча на XXXL-карты от 2010 года. Видимо, Бараторч не стал ждать у моря погоды, а просто сделал сам. Но и минус в этом соответствующий - моддеры не имеют доступа к отрисовке мини-карты (например, в ERA+ с HD-модом и без HD-мода мини-карты будут выглядеть по-разному, т.к. Тифон показывает на ней новые объекты, а HD-мод рисует согласно СоД-у).

У baratorch'а нужно попросить хотя бы мало-мальский API для работы с новыми элементами интерфейса. Например, для работы с очередью ходов мне бы хватило возможности самостоятельно определять, когда применяется модификатор скорости, а когда нет. Тогда и хукать dll'ки не приходилось бы. Вот, оказывается и с мини-картой тоже проблема.

Цитата:
Да, HD-мод так и делает, там довольно объёмистый с сложный код на создание рамки в режиме реального времени, её отрисовки и ну и самой мини-карты. В MoP всё проще - пропатчены и расширены оригинальные содовские функции, но при этом сохранена привязка на конкретные размеры карты, а все данные хранятся в готовом виде в виде спрайтов-шаблонов - сама игра ничего не считает, тупо показывает и всё. А так как в MoP поддерживается только 800х600, то и переделывать содовский код не было необходимости - радар на XXXL-картах работает целиком на нём.

Аналогично. Я делал рамки для радаров под стандартное разрешение 800x600 (тогда ещё не было HD мода) путём замены и добавления кадров в дефы. Я думаю, если бы не сама идея разных разрешений (например, если бы было фиксированное 1920x1080), baratorch пошёл бы точно таким же путём.
Вернуться к началу

offlineEranikus  
имя: Максим
 
Сообщения: 9
Зарегистрирован: 02 авг 2019, 10:45
Пол: Мужчина
Поблагодарили: 3 раз.

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

Сообщение Eranikus » 22 дек 2021, 14:20

void_17 писал(а):

Цитата:
В HD моде для 4-ки от Verok есть возможность переключаться с Winds of War на ванилу, и на The Gathering Storm, вот это тема, да.

Слишком сложно реализовать для 3-ки. В 3-ке в разных версиях многие типы и соответственно переменные другие, плюс еще учитывайте новведения и функции к ним. Хотя, впринципе, можно сделать так, чтобы в одной папке лежало три разных экзешника и они просто запускались. Но и для них надо накостылить HD-Mod, ведь он не работает для RoE и AB.

А то, что когда играешь кампании из RoE на комплите, то у тебя всего 4 слота под "остальные" артефакты, и ров не наносит урона - это ли не кое-какое умение игры переключаться на RoE?
Вернуться к началу

offlineigrik  
Подмастерье
Подмастерье
 
Сообщения: 108
Зарегистрирован: 14 сен 2017, 12:35
Пол: Не указан
Поблагодарили: 84 раз.

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

Сообщение igrik » 22 дек 2021, 17:21

Чё то я вас как-то совсем не понимаю: Бараторч n-е количество лет назад запилил поддержку миникарты под мод XXL, а вас это не устраивает? Что не так?
Вернуться к началу

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 » 22 дек 2021, 18:10

Цитата:
Чё то я вас как-то совсем не понимаю: Бараторч n-е количество лет назад запилил поддержку миникарты под мод XXL, а вас это не устраивает? Что не так?

Всё устраивает, но нет API для работы с новыми элементами интерфейса. Например, если кто-то захочет отрисовывать миникарту по-своему, он не сможет это сделать нормальным способом. То же самое касается очереди ходов.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

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

Сообщение void_17 » 23 дек 2021, 00:54

Бараторч вообще таким образом в области интерфейса перекрыл моддерам кислород. Свой, открытый, HD-мод кто соберется писать? То-то же.
Вернуться к началу

offlineigrik  
Подмастерье
Подмастерье
 
Сообщения: 108
Зарегистрирован: 14 сен 2017, 12:35
Пол: Не указан
Поблагодарили: 84 раз.

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

Сообщение igrik » 23 дек 2021, 05:45

Я не понимаю в чём Бараторч перекрыл кислород модерам в области интерфейса. Я в Воге (точнее в ЭРЕ) написал 12 диалогов, и они прекрасно работают с HD. Никаких трудностей при взаимодействии с Хайрезом я не встретил. Единственное с чем я вижу трудность взаимодействия - так это с очередью хода. И только.
Любыми элементами диалогов можно управлять, перемещать, скрывать, показывать и т.п. Даже HD-шные элементы подчиняются этим правилам.

Чисто для информации: у меня большие трудности вызывает взаимодействие с кодом Вога (даже при наличии исходников), чем с HD.
Вернуться к началу

Пред.След.

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

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

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