Max_HMMI, Чет ты со мной как с нубасом каким-то говоришь.
Если такие большие секретность и ценность ваших наработок, что ими жалко делиться, не надо это как-то пытаться оправдывать, скажите просто - нет не дадим. Я бы лично оставил бы себе право решать что мне поможет, а что - нет.
Понимаю, что могут быть сомнения в моих способностях и намерениях, в том как я распоряжусь запрашиваемым материалом. Но если бы вы следили за развитием ХД для 3ки или пообщались с контактировавшими со мной мододелами 3ки, то сомнения бы все отпали. Тем более я смотрю вперед и, возможно, при достаточном интересе со всех сторон (моей, вашей, игроков) я бы смог вывести моддинг/программирование для 4ки на новый уровень (как в свое время сделал для HotA).
Хотя пока у меня складывается впечатление, что я буду стараться для 3,5 человек, среди которых нет членов команды Экви..
...Через нее, в принципе, можно выйти на код, отвечающий за изменение расширения экрана.
У меня почему-то ощущение, что
вы не понимаете что нужно для смены разрешения.
4ка - не 3д игра. Если просто изменить размер окна и параметры передаваемые в DirectDraw->SetDisplayMode, вы получите игру в обычном разрешении, в левом верхнем квадрате на черном фоне (что собственно продемонстрированно на скриншоте в этой теме). Чтобы реально сменить разрешение придется двигать/растягивать весь UI игры: Координаты/размеры окон, кнопок, и т.д. ; кол-во клеток, помещающихся в область обзора карты и другое.
"код, отвечающий за изменение расширения экрана" как я полагаю,
пронизывает всю игру насквозь. Так по крайней мере в героях 1,2,3. И судя по тому как в 4ке меняется экран приключений в зависимости от выбранного разрешения, она - не исключение. Я сомневаюсь что координаты и содержание интерфейса рассчитываются по единой формуле, кторой можно скормить любое разрешение. Скорей всего код свой для каждого из оригинальных разрешений, т.е. типа: если 800х600, то UI №1, если 1024х768, то UI №2, если 1280х1024, то UI №3. Хорошо бы это оказалось не так...
Экзешник я уже слегка ковырнул.
Функции меняющие размер окна и DisplayMode элементарно ищутся за несколько минут по имени ключа в реестре "resolution", куда запоминается выбранное разрешение. Вот одна из центральных:
Code: Select all
char __cdecl A_ChangeScreenMode_sub_8D3750(LONG RezX, LONG RezY, unsigned __int8 a3, char Fullscreen)
{
LONG RezX_; // edi@1
char result; // al@4
int v6; // eax@5
signed int v7; // edi@35
signed int v8; // ebp@35
int v9; // kr00_4@35
int v10; // eax@35
struct tagRECT v11; // [sp+64h] [bp-20h]@32
struct tagRECT Rect; // [sp+74h] [bp-10h]@32
int v12; // [sp+88h] [bp+4h]@5
RezX_ = RezX;
if ( RezX == A_ResolutionX_dword_AD2508
&& RezY == A_ResolutionY_dword_AD250C
&& Fullscreen == A_FullscreenMode_byte_AD2551 )
{
result = byte_AD2554;
if ( !byte_AD2554 )
return result;
}
v6 = sub_71ED50();
v12 = v6;
byte_AD2552 = 1;
A_ResolutionX_dword_AD2508 = RezX_;
A_ResolutionY_dword_AD250C = RezY;
if ( RezX_ + 10 > dword_AD2500 || RezY + 60 > dword_AD2504 )
Fullscreen = 1;
if ( dword_AD2548 && dword_A8775C <= 8 )
Fullscreen = 1;
sub_71F490(v6, 0);
if ( Fullscreen != A_FullscreenMode_byte_AD2551 || byte_AD2553 || byte_AD2554 )
{
A_FullscreenMode_byte_AD2551 = Fullscreen;
if ( dword_AD2540 )
{
(*(void (__stdcall **)(int, _DWORD))(*(_DWORD *)dword_AD2548 + 112))(dword_AD2548, 0);
(*(void (__stdcall **)(int))(*(_DWORD *)dword_AD2540 + 8))(dword_AD2540);
dword_AD2540 = 0;
}
if ( dword_AD2548 )
{
(*(void (__stdcall **)(int))(*(_DWORD *)dword_AD2548 + 8))(dword_AD2548);
dword_AD2548 = 0;
}
if ( dword_AD254C )
{
(*(void (__stdcall **)(int))(*(_DWORD *)dword_AD254C + 8))(dword_AD254C);
dword_AD254C = 0;
}
byte_AD2553 = 0;
if ( !Fullscreen )
{
SetWindowLongA(hWnd, -16, 281673728);
SetWindowLongA(hWnd, -20, 0); //
// lpDD->SetCooperativeLevel
(*(void (__stdcall **)(int, HWND, signed int))(*(_DWORD *)lpDD + 80))(lpDD, hWnd, 8);
LABEL_31:
sub_8D2C20();
goto LABEL_32;
}
SetWindowLongA(hWnd, -16, -1879048192);
SetWindowLongA(hWnd, -20, 8); //
// lpDD->SetCooperativeLevel
(*(void (__stdcall **)(int, HWND, signed int))(*(_DWORD *)lpDD + 80))(lpDD, hWnd, 19);
byte_AD2550 = 1;
}
if ( Fullscreen )
{
if ( dword_AD2540 )
{
(*(void (__stdcall **)(int, _DWORD))(*(_DWORD *)dword_AD2548 + 112))(dword_AD2548, 0);
(*(void (__stdcall **)(int))(*(_DWORD *)dword_AD2540 + 8))(dword_AD2540);
dword_AD2540 = 0;
}
if ( dword_AD2548 )
{
(*(void (__stdcall **)(int))(*(_DWORD *)dword_AD2548 + 8))(dword_AD2548);
dword_AD2548 = 0;
}
if ( dword_AD254C )
{
(*(void (__stdcall **)(int))(*(_DWORD *)dword_AD254C + 8))(dword_AD254C);
dword_AD254C = 0;
}
if ( (*(int (__stdcall **)(int, LONG, LONG, signed int, _DWORD, _DWORD))(*(_DWORD *)lpDD + 84))(
lpDD,
RezX_,
RezY,
16,
0,
0) == -2005532552 ) //
// lpDD->SetDisplayMode
(*(void (__stdcall **)(int, LONG, LONG, signed int, _DWORD, _DWORD))(*(_DWORD *)lpDD + 84))(
lpDD,
RezX_,
RezY,
15,
0,
0); // lpDD->SetDisplayMode
goto LABEL_31;
}
LABEL_32:
GetWindowRect(hWnd, &Rect);
v11.left = 0;
v11.top = 0;
v11.right = RezX_;
v11.bottom = RezY;
if ( Fullscreen )
{
AdjustWindowRectEx(&v11, 0x90000000, 1, 0);
Rect = v11;
}
else
{
AdjustWindowRectEx(&v11, 0x10CA0000u, 1, 0);
v7 = v11.right - v11.left;
v8 = v11.bottom - v11.top;
v9 = GetSystemMetrics(0);
v10 = GetSystemMetrics(1);
Rect.left = v9 / 2 - v7 / 2;
Rect.top = v10 / 2 - v8 / 2;
if ( Rect.left < 0 )
Rect.left = 0;
if ( v10 / 2 - v8 / 2 < 0 )
Rect.top = 0;
}
sub_71F490(v12, 1);
byte_AD2552 = 0;
return MoveWindow(hWnd, Rect.left, Rect.top, v11.right - v11.left, v11.bottom - v11.top, a3);
}
Вот только глобальные переменные A_ResolutionX_dword_AD2508 и A_ResolutionY_dword_AD250C используются только в функциях меняющих размер окна и DisplayMode, а интерфейсу судя по всему разрешение передается в полях неких неясных пока для меня структур..
Есть внутренняя утилита для распаковки/запаковки графики, но опять-таки - зачем она для HD-моддинга?
по большому счету мне нужен вьюер, чтобы я мог видеть названия и содержание графических файлов. Но мало -ли что мне может понадобиться, почему бы не иметь максимально полный инструментарий?
Еще мне однозначно нужен разобранный формат графики в файлах и в игре, т.е. то как битмапы и спрайты представлены в файлах и внутри игры, если есть наработки на эту тему.
В свое время база ида от создателя WoG меня очень сильно продвинула в разработке HD, а без исходников WoG не был бы до сих пор решен ряд проблем совместимости WoG и HD.
Почему бы не исключить сразу возможне проблемы несвоместимости HD и Экви или сократить время на их решение, предоставив мне исходники?