![]() |
eXeL@B —› Вопросы новичков —› Как научить видеть игру широкоформатные мониторы? |
. 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 23 декабря 2012 19:07 · Личное сообщение · #1 Здравствуйте. Нашёл CD древней игрушки, но после установки, заметил, что разработчики ограничились только самыми распространёнными разрешениями экрана. Возможно ли сделать каким-либо образом поддержку 1366х768, 1920х1080? Прикладываю файлы кинфигуратора разрешения. пароль: exelab ![]() ----- Ламер - не профессия :)) ![]() |
|
Создано: 23 декабря 2012 21:17 · Личное сообщение · #2 Вот один из известных патчеров для игр с маленьким разрешением ![]() ![]() |
|
Создано: 23 декабря 2012 21:24 · Личное сообщение · #3 |
|
Создано: 23 декабря 2012 23:24 · Личное сообщение · #4 |
|
Создано: 23 декабря 2012 23:36 · Личное сообщение · #5 |
|
Создано: 23 декабря 2012 23:56 · Личное сообщение · #6 так давай на примере nfs underground 2 (не смейтесь бывает играю) Вот и ищи примерно Больше вариантов нет пока что ![]() |
|
Создано: 24 декабря 2012 15:46 · Личное сообщение · #7 Mishar_Hacker пишет: так давай на примере nfs underground 2 (не смейтесь бывает играю) Мне тоже интересен этот вопрос. Потому что это делается зачастую нетривиально, особенно если дело касается игр на DirectX. Просто патчем цифирок отвечающих за разрешение экрана, дело необходится. ----- Реверсивная инженерия - написание кода идентичного натуральному ![]() |
|
Создано: 24 декабря 2012 15:58 · Поправил: Runner · Личное сообщение · #8 Встречал вот "This DLL attempts to override the screen resolution set by a Direct3D 9 program." ![]() |
|
Создано: 24 декабря 2012 17:20 · Поправил: Gideon Vi · Личное сообщение · #9 |
|
Создано: 24 декабря 2012 18:39 · Поправил: aspirin · Личное сообщение · #10 Mishar_Hacker пишет: так давай на примере nfs underground 2 (не смейтесь бывает играю) Ну а чего там смеяться, кстати, одна из лучших игр серии. Думаете Patrician 3 будет новинкой? ![]() Gideon Vi предостережения не особо интересны ![]() В каком направлении лучше всего искать решение? ----- Ламер - не профессия :)) ![]() |
|
Создано: 24 декабря 2012 18:59 · Личное сообщение · #11 |
|
Создано: 24 декабря 2012 22:45 · Личное сообщение · #12 |
|
Создано: 25 декабря 2012 00:48 · Поправил: tomac · Личное сообщение · #13 |
|
Создано: 25 декабря 2012 00:55 · Личное сообщение · #14 |
|
Создано: 25 декабря 2012 12:04 · Поправил: aspirin · Личное сообщение · #15 |
|
Создано: 25 декабря 2012 18:00 · Поправил: tomac · Личное сообщение · #16 |
|
Создано: 25 декабря 2012 20:30 · Поправил: aspirin · Личное сообщение · #17 |
|
Создано: 25 декабря 2012 23:05 · Поправил: tomac · Личное сообщение · #18 Предварительный анализ показывает, что разрешения зашиты в код, в частности, в архивах есть переменные ObenLinks800Anim, ObenLinks1024Anim, ObenLinks1280Anim. Похоже, что на других разрешениях работать будет крайне криво, если вообще будет. Покопаюсь потом еще. Кстати, да, конфигуратор разрешения нифига не конфигурирует. Падал из-за недостатка какой-то либы, сейчас, с полным набором файлов, не падает. ![]() |
|
Создано: 26 декабря 2012 01:00 · Личное сообщение · #19 Проворачивал подобный трюк с игрой Tank Race. Уже не помню что конкретно делал. Вроде как действовал так. Искал функцию для работы с режимами экрана в импорте. Вышел на switch в котором задавались параметры для разрешения экрана и поправил их на нужные. Вполне замечательно все работало вплодь до разрешения 1600x1200. Широкоформатные разрешения тоже делал и тоже все работало замечательно. Может я конечно путаю что-то. Я все-таки дилетант в этом деле. ![]() |
|
Создано: 26 декабря 2012 10:36 · Личное сообщение · #20 Делал перехватом ддрав/директикс Обрабатывал в рантайме кадр (в принципе любой алгоритм можно, у меня масштабирование и сглаживание было), потом рендерил http://blackninja2000.narod.ru/rus/directx_logger.html ![]() |
|
Создано: 26 декабря 2012 15:02 · Поправил: Veliant · Личное сообщение · #21 Стоит смотреть начиная отсюда Code:
Это разрешение потом передается почти все функциям ddraw_dll. Но после выставления нужного фон рисуется под старое разрешение, а контролы со смещением. Нужно искать где пересчет идет. Проще наверное все же сделать запуск игры в окне с меньшим разрешением. Там не directx, там gdi Add: Возможно стоит смотреть в сторону функции sgl_SetZoomFactor, которая вызывает функцию 05026050 с расчетами. Сама же sgl_SetZoomFactor вызывается перед каждой отрисовкой. Add2: с установленным широкоформатным разрешением, но внутренним 1024x768 выглядит как-то так http://rghost.ru/42525347/image.png ![]() |
|
Создано: 27 декабря 2012 12:54 · Личное сообщение · #22 |
|
Создано: 27 декабря 2012 14:54 · Личное сообщение · #23 Veliant пишет: Навелосипедил пока следующим образом. Так и не разобрал до конца какие адреса еще участвуют в пересчете экранных координат http://rghost.ru/42546882 Попробовал, кроме рамки игры на чёрном фоне - работает. dll такой вроде не было в папке с игрой, собственная разработка? Не могли бы вы хоть в кратце объяснить, для чего нужна dll, и вообще свою технологию апгрейда игры? ----- Ламер - не профессия :)) ![]() |
|
Создано: 27 декабря 2012 18:09 · Личное сообщение · #24 Идея собственно в том чтоб при создании окна и вызова функций sgl_InitScreen и sgl_SetScreenDimension передавать разрешение нативное, после их отработки возвращается старое внутреннее разрешение. В dll ставится veh обработчик и в нужные места программы ставятся hw бряки на которых и происходит подмена. ![]() |
|
Создано: 29 декабря 2012 09:59 · Поправил: DenCoder · Личное сообщение · #25 С согласия автора топика, выкладываю обещанный свой вариант. Первое, что нужно сделать - написать прокладку и вставить в код исполняемого файла игрушки её загрузку. Под прокладкой имеется ввиду dll, которая хучит нужные функции. Опущу подробности как это делать, поскольку об этом много раз писалось. Сосредоточусь на реализации самой прокладки. Нам требуется изменить видео режим. Поскольку игрушка старая, то вряд ли в ней используется Direct3D, используется DirectDraw версий от 1 до 4, 7-ой скорей всего ещё и не было. Функция в DirectDraw, которая меняет видео режим - IDirectDraw::SetDisplayMode. Её описание можно найти Пишем для этого в DllMain.cpp под case DLL_PROCESS_ATTACH: вызов функции установки хуков: Code:
Хочу отметить, что для того, чтобы компилятор смог скомпилировать код dll, требуется найти и скачать ddraw.h, если нет, а также подключить директивой #include и указать линкеру ddraw.lib В функции SetHooks() пишем тело: Code:
В функции SetApiHook: Code:
В заголовочном файле определяем 2 макроса: Code:
Определяем все нужные куски кода //push ebp //mov ebp, esp //push ebp //push Address - адрем перехватываемой функции, которую нужно будет вызвать после нужных операций Code:
Таким образом, мы перехватываем функцию и заставляем процессор при вызове функции выполнить код переходника на нашу функцию. Теперь можно приступить к нашей функции Code:
Функция вызова оригинальной функции с переменным числом аргументов Code:
Макросы для установки хуков на метода интерфейса выглядят так Code:
Адрес метода интерфейса вычисляется значением [адреса таблицы + порядковый номер метода * 4]. Нам требуется не сам адрес метода, а указатель на его место в таблице, чтобы подменить оригинальный адрес на адрес нашей функции интерфейса. В си/си++ нельзя производить действия над укателями на разные методы классов, поэтому пришлось определять целые таблицы функций интерфейсов ----- IZ.RU ![]() |
|
Создано: 29 декабря 2012 10:00 · Поправил: DenCoder · Личное сообщение · #26 Code:
Два метода, IDirectDraw::QueryInterface и IDirectDraw::CreateSurface, перехватываются для получения контроля над используемым интерфейсом IDirectDraw более новой версии и для получения контроля интерфейса для работы с поверхностями IDirectDrawSurface. Также нам потребуется перехватить метод IDirectDraw::SetDisplayMode, для чего аналогичным образом добавляем установку хука Code:
Установщик хуков на методы интерфейса выглядит следующим образом Code:
Определим наши функции-хуки для QueryInterface и CreateSurface, а также SetDisplayMode: Code:
Code:
Code:
Если используется DirectDraw2 или DirectDraw4, следует аналогичным образом установить хуки на нужные методы используемого интерфейса. Функция вызова оригинального метода Code:
Установить режим - это ещё не всё. В коде исполняемого файла игры и её библиотек во многих местах могут быть прописаны относительные и абсолютные размеры экрана, графических объектов. И в лучшем случае выводиться будет на левую верхнюю часть экрана, а нижняя и правая части останутся нетронутыми. Чтобы изображение растянулось, и потребуются два установленных хука: на IDirectDrawSurface::GetAttachedSurface и IDirectDrawSurface::Flip. Первый метод получает поверхность(или поверхности, которых может быть несколько), присоединённую к экрану, с которой готовый результат копируется на экран вторым методом IDirectDrawSurface::Flip. Такие поверхности называются в DirectX бэкбуферами. ----- IZ.RU ![]() |
|
Создано: 29 декабря 2012 10:01 · Личное сообщение · #27 Идея перехватов IDirectDrawSurface::GetAttachedSurface и IDirectDrawSurface::Flip состоит в том, чтобы при получении приложением бэкбуфера подсунуть созданную нами промежуточную поверхность с теми размерами, которые приложение ставит в вызове метода IDirectDraw::SetDisplayMode, чтобы при переключении приложением бэкбуферов методом IDirectDrawSurface::Flip перед этим скопировать с внедрённой промежуточной на действительный бэкбуфер всю подготовленную приложением графику методом IDirectDrawSurface::Blt, который при передаче NULL в качестве исходного и целевого прямоугольников производит автоматическое растягивание. Перехваты нужных методов работы с поверхностями будут выглядеть так Code:
Code:
Собственно и всё. Может где-то пропустил объявление переменных - в свободное время пройдусь по написанному пару раз, вставлю, поправлю. В случае, если приложение получает не один бэкбуфер, а больше, то следует организовать массивы бэкбуферов и соответствующих им промежуточных поверхностей, а в коде перехвата Flip() смотреть для какой поверхности Flip вызывается, на соответствующий бэкбуфер и будет выполняться копирование графики. ----- IZ.RU ![]() |
|
Создано: 31 декабря 2012 17:10 · Поправил: aspirin · Личное сообщение · #28 DenCoder Ваше решение выглядит в общем-то серьёзно. Если это всё будет работать, тогда программистам из Акеллы есть, чему поучиться в ответах этого топа. Т.к. когда я обращался в тех. поддержку года 2 назад, мне сказали, что ничего сделать, в принципе, невозможно в данном случае. Сам я только немного играюсь с кодом в консольных приложениях на сях++, как мне всё это скомпелировать в одно решение? ----- Ламер - не профессия :)) ![]() |
|
Создано: 31 декабря 2012 19:11 · Поправил: DenCoder · Личное сообщение · #29 aspirin пишет: Если это всё будет работать Ну у меня же работало. ) Правда была немного другая задача - сжать окно с графикой немного и добавить 2 окошка - вверху и справа. Метод разработал сам, пройдя вводный курс в DirectX. Одна проблема при таком способе возможна - нелинейность изображения, так как его растянули, квадрат будет прямоугольником, а круг эллипсом. Не сомневаюсь, можно это как-то улучшить. Но для этого надо основательно покопаться в коде игры. aspirin пишет: Сам я только немного играюсь с кодом в консольных приложениях на сях++, как мне всё это скомпелировать в одно решение? dll. Но сначала поиграйтесь с DirectX, оно ещё интересней ) http://netlib.narod.ru/category.htm?1240 aspirin пишет: программистам из Акеллы есть, чему поучиться в ответах этого топа. Ну, тут дело не в грамотности программистов, а в желании! Никто не будет бесплатно поддерживать старый проект! Максимум, чего можно ждать от разработчиков - какой-нибудь ремейк. ----- IZ.RU ![]() |
|
Создано: 03 января 2013 12:26 · Поправил: Rustem · Личное сообщение · #30 DenCoder Чтобы не гадать какой директ используется, можно посмотреть вызовы этой утилитой, http://blackninja2000.narod.ru/rus/directx_logger.html Кстати поддерживаются плагины, которые позволяют сразу реагировать на вызов функций, а не возится самому с хуками и интерфейсами Там есть пример плагина под игру мдк ![]() |
. 1 . 2 . 3 . >> |
![]() |
eXeL@B —› Вопросы новичков —› Как научить видеть игру широкоформатные мониторы? |