Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Как я писал фикс широкоэкранных разрешений для FlatOut

Anna | 25.06.2014 | нет комментариев
Не так давным-давно я занимался написанием фиксов для нескольких ветхих игр, Дабы поправить искажение картинки и интерфейса на широкоформатных мониторах. Попросили взглянуть наFlatOut, вот и возникла идея заодно написать об этом.

Что требуется

Для создания полновесного фикса, тот, что легко устанавливается и не требует замены файлов игры, я применял: IDACheat EngineVisual Studioмногофункциональный ASI Loader(об этом чуть ниже), а для запуска исследуемой игры в окне — D3DWindower.

Разбор источников

Заглянем в папку с установленной игрой, Дабы узнать, с чем придется трудиться. В данном случае там каждого лишь один файл — «flatout.exe» и одна папка — «data». В некоторых играх могут присутствовать добавочные DLL, к примеру в Max Payne для исправления пропорций изображения я делал инжект в e2mfc.dll, а не в исполняемый файл. Flatout.exe пропатчен до v1.1, но формальный патч от русского дистрибьютора — компании «БУКА», содержит три различных EXE:

Я предпочел flatout,3.exe(2 822 144 байт) для изыскания, так как IDA дизассемблирует его во абсолютно читабельный вид.

Навыки

Открыв flatout,3.exe в IDA, первым делом начинаю искать константы. Судя по моему предыдущему навыку, множество ветхих игр применяют для отображения интерфейса и 3D изображения одни из этих: 640.0, 480.0, 1.3333, 0.0015625 = 1.0/640.0, 0.00208333333 = 1.0/480.0 и т.п. Первым делом вбиваю в поиск0.0015625, так как вторые по популярности константы 640.0 и 480.0 обыкновенно находятся поблизости. IDA находит желанное по адресу 0x667CE4:

Сейчас дозволено запускать игру и испробовать изменить значение по этому адресу памяти. Вот так выглядит интерфейс FlatOut в разрешении 1280х720:

Запускаю параллельно Cheat Engine, присоединяюсь к процессу. Кнопкой «Add address manually» добавляю в таблицу адрес 0x667CE4:

Меняю его нынешнее значение на 0.0010, легко посмотреть, что из этого выйдет. По итогу видно, что полдела сделано:

Сейчас осталось обнаружить, как поправить растягивание 3D изображения. Константу так называемого aspect ratio4:3 либо 1.3333 я не обнаружил, следственно решил испробовать поменять все числа 480 на 360. Данный способ я использовал ранее в Max Payne, подумал, что он может подмогнуть в поиске и тут. В Cheat Engine устанавливаю следующие настройки и нажимаю «First Scan»:

Среди обнаруженных адресов, добавляю в таблицу только подмеченные зелёным цветом. Зелёный цвет обозначает, что данные адреса принадлежат диапазону flatout.exe, а остальные нам просто не необходимы.

Меняю все обнаруженные значения на 360:

Изображение игры исчезает, потом возникает оплошность. Опытным путём выясняю, что вылет происходит из за метаморфозы 2-х адресов — FlatOut.exe 1069C3(0x5069C3) и FlatOut.exe 107CCB(0x507CCB). Перехожу по адресу 0x5069C3 в IDA, посмотреть, отчего же вылетает:

480 тут — смещение, а не константа, следственно данная функция интереса не представляет, но внимание привлекает функция ниже, по адресу 0x5069D0, которая при маленьком реформировании получает такой вид:

Пробую менять константы 4.0 и 3.0 на 16.0 и 9.0 соответственно:

C изумлением обнаруживаю что это и есть то самое aspect ratio, на разрешении 1280х720 картинка сразу приобрела положительные пропорции(как было/как стало):

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

C

Открываю Visual Studio, создаю новейший план Win32, тип приложения — библиотека DLL. В свойствах плана устанавливаю следующие опции:

  • Конфигурация — Release
  • Комплект символов — Применять многобайтовую кодировку
  • Библиотека времени выполнения — Многопоточная (/MT)
  • ?рус предупреждений — Level1 (/W1)
  • Финальное растяжение — .asi
  • Выходной каталог — E:GamesFlatOutFlatOut

Для работы с памятью я использую особый класс CPatch.

Dllmain:

#include "stdafx.h"
#include "CPatch.h"

HANDLE HndThread;

int* g_Width = (int *)0x6B0D88;
int* g_Height = (int *)0x6B0D8C; 

int g_CameraAspectRatio_x = 0x5069DA;
int g_CameraAspectRatio_y = 0x5069E0;
int g_hud_stretch_x = 0x667CE4;

#define screen_width (float)*g_Width
#define screen_heigth (float)*g_Height
#define hud_stretch_x (float)*g_hud_stretch_x

float hud_stretch_new = 0.0;

int Thread()
{
	while (!screen_width)
	{
		Sleep(0);
	}

	hud_stretch_new = 1.0/(480.0*(screen_width/screen_heigth));

	CPatch::SetFloat(g_CameraAspectRatio_x, screen_width);
	CPatch::SetFloat(g_CameraAspectRatio_y, screen_heigth);
	CPatch::SetFloat(g_hud_stretch_x, hud_stretch_new);

	return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
{
    if(reason==DLL_PROCESS_ATTACH)
    {
		HndThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)&Thread,NULL,0,NULL);
    }
    return TRUE;
}

Дабы моя ASI-библиотека загружалась совместно с игрой, необходимо установить многофункциональный ASI Loader, скопировав dsound.dll из архива в папку с игрой. ASI — это каждого лишь переименованная DLL, а dsound.dll загружает ASI в процесс всякий игры, которая использует DirectSound. Допустима загрузка из подпапки scripts.

Итог

Это только первая версия плагина, и скорее каждого она еще не раз обновится. Есть определенные недоработки, скажем основное меню. Также в случае несовместимости дозволено добавить поддержку других EXE, скажем steam-версии.

Скачать плагин дозволено с github.
Установка примитивна — распаковать архив в папку с игрой.

 

Источник: programmingmaster.ru

 

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB