1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление
    1. Если вы сделали перевод или русификацию игры, то вы можете поделиться своим творением здесь.
    2. О правилах вступления в группу переводчиков можно прочитать здесь.
    3. Русификации следует искать там.

Wing Commander IV: Цена свободы

Тема в разделе "Переводы своими руками", создана пользователем Рыжий Тигра, 8 янв 2007.

  1. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Процесс перевода игры "Wing Commander IV: Цена свободы"- в разгаре. Желающие опробовать то, что получилось, могут добраться сразу до описания перевода и ссылок на его скачивание, щёлкнув по этой ссылке.

    Желающим посоучаствовать в переводе - рекомендую: полезные для переводчика ссылки - словари, книги, статьи и прочие материалы. Пополнение копилки приветствуется!

    См. также:
    Самая свежая тестовая сборка и инструкции по её установке
    Бета-тестеры, wэлкам!
    31 дек 2016

    Upd 1:
    В связи с участившимися постами здесь "чисто для поржать" - вынужден объясниться.
    6 янв 2014

    Upd 2:
    Приглашаю желающих поучаствовать в переводе. Отозвавшиеся будут увековечены в финальных титрах. (Никаких более материальных благ, к сожалению, обещать не могу. :( )
    27 мая 2014

    Upd 3:
    Наконец удалось пробить барьер несовместимости моего перевода с версией игры от GOG!!! Желающим опробовать - wэлкам!
    2 окт 2014
     
    Последнее редактирование: 21 апр 2017
    kirik-82 нравится это.
  2.  
  3. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Если коротко, то почти всегда да. CRT мониторы пошире - это редкие профессиональные, телевизоры - поздние широкоэкранные, на которых уже никто особо не играл.
    Я писал более длинный ответ, про нюансы с телевизорами, но он пропал.
     
    Рыжий Тигра нравится это.
  4. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Ключ правильный? Скопипасть отсюда:
    -no_full_screen
    Ё! Это ценно. Ща проверю.
    Угу. Осталась фигня - найти приличную опен-сорсную реализацию. :-(
     
  5. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    заааааачем ? о_О

    Тебе влом прочитать 128 байт параметра EDID (это подсказка что искать в реестре по F3 где то в HKLM из реестра винды и расшифровать их по табличке ?

    Ну, я понимаю, что надо запросить версию винды, потом выбрать нужный ключ реестра, а потом прочитать его и парсить... это так сложно ! :D

    Кстати, там же ты найдёшь и мультимониторные все фишки.

    Как пример местонахождения искомого для вин 7 (осталось там от умершего Лайтона и потому нашлось первым):
    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\DISPLAY\LTN1717\5&2e982a7&0&UID2097409\Device Parameters

    Для win95 это будет:

    HKEY_LOCAL_MACHINE
    \Enum
    \Monitor
    \<Device ID, e.g. ABC1234>
    \<instance value, e.g. 0001, 0002, etc.>

    HardwareID=<device id>, *PNP09FF
    EDID=<128-bypte structure returned from VESA BIOS>

    ЗЫ. Да, в оконном режиме всё нормально работает.
     
    Рыжий Тигра нравится это.
  6. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Нашёл граблю - был кривой расчёт позиции, получалась отрицательная Y-координата выводимой строки. Исправил.
    "Я зашиваааюсь!" (L) "Приключения Плуто Нэша" :-(
    О! Thnx! Оформи это в функцию и кидай сюда, я её включу в libwc4.
     
    Bato-San нравится это.
  7. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Сляпал-таки на скорую руку этот самый оверлей и опробовал. Не сказал бы, что картинка получилась резче, чем при выводе Blt()'ом на primary surface с аппаратным ресайзом. Но самое паскудное - это размывка цветов: субтитры к радиосвязи - белые буквы на зелёном фоне - подёрнулись прозеленью, зелёные на чёрном надписи на экране отслеживания цели, оружейном и коммуникаторе - посерели (а по контрасту пятна кажутся ещё и розовыми)... Бррр. Не хочу этой радости. :-(
     
    Bato-San нравится это.
  8. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Похоже, давно пора выложить описание - как всё-таки работает вся эта кухня с получением картинки от игры, преобразованием глубины цвета, рисованием по ней моих дополнительных субтитров, подгонкой под разрешение экрана и сглаживанием. Вдруг кому-то пригодится, вдруг кто-то что-то подскажет, да и самому пригодится потом в качестве шпаргалки. :-)

    Итак. Игра рисует в surface четырьмя с половиной основными способами, т.е. гоняет циклы четырёх с половиной основных видов:
    • StretchDIBits() - FlipToGDISurface(): "статическая" часть игры (на авианосце между вылетами) в 16-битке;
    • primary->Lock() - primary->Unlock(): "статика" в 8-битке, вывод полётного задания перед вылетом (всегда 8-битный);
    • backbuffer->Blt(NULL) - backbuffer->Lock() - backbuffer->Unlock() - primary->Flip(): собственно вылет (всегда 8-битный);
    • backbuffer->Lock() - backbuffer->Unlock() - primary->Flip(): вывод финальных титров (всегда 8-битный);
    • SetEntries() - SetEntries() - SetEntries()... (всего примерно 64 вызова): плавное "проявление" или "растворение" картинки перепрограммированием палитры в начале и конце цикла вывода финальных титров сразу после первого (или, соответственно, последнего) Flip()'а.
    Далее. Я в начале игры заранее (в обработчике IDirectDraw::CreateSurface()) создаю, кроме запрошенных игрой primary и backbuffer surface'ов, ещё два offscreen surface'а: 640*480*8 палитровый в системной памяти и 640*480*16 в видеопамяти.
    Для пущей универсальности, чтобы не париться с переключением primary-backbuffer, я во всех случаях (кроме первого - его обрабатываю отдельно) по Lock()'у подсовываю игре 8-битный offscreen surface и она его честно заполняет картинкой.
    Затем в обработчике Unlock()'а делаю следующее:
    • перегоняю 8-битную картинку в 16-битный offscreen surface (функциями prepare_palette() и translate_frame() в исходнике src\dxmci-mod\ddconv.c);
    • при необходимости DrawText()'ом вывожу поверх 16-битной картинки доп-субтитры (некролог, выступления Папаши в оружейке, м.б. ещё добавятся переводы реплик Блэйра в бою);
    • DirectDrawSurface::Blt()'ом перегоняю эту картинку (с растяжкой и сглаживанием - поскольку оба surface'а лежат в видеопамяти, этим занимается сама видеокарта) в primary или backbuffer (в соответствии с запросом от игры) surface.
    Дальше картинка либо (из primary surface) попадает непосредственно на экран, либо (из backbuffer'а) игра выводит её на экран Flip()'ом.
    Аналогичные преобразования выполняю и в цикле SetEntries(), а цикл StretchDIBits() - FlipToGDISurface() эмулирую: перехватчик StretchDIBits()'а работает похоже на перехватчик Unlock()'а (с поправкой на то, что исходная картинка поступает не в виде surface'а, а по отдельности массив данных и его описание), а перехватчик FlipToGDISurface()'а не делает вообще ничего кроме проверок surface'ов на IsLost().

    ---------- Сообщение добавлено в 21:57 ---------- Предыдущее сообщение размещено в 21:45 ----------

    Насчёт разрешения 1280*1024, квадратности пикселов на ЖКИ-мониторах и 4:3'шности экрана на мониторах кинескопных, определения параметров монитора через VESA DDC и прочего в этом роде: не буду я париться со всей этой кухней, влом. Предлагаю исходить из того, что владельцы ЖКИ-мониторов один фиг не в силах сделать пиксель неквадратным, а любители ставить 1280*1024 на кинескопе либо знают что делают (и заранее сузили картинку через настройки монитора), либо их и так устраивает.
    Таким образом, при разрешении у́же-выше чем 4:3 вполне оправданным будет во всех режимах игры просто добавлять чёрное поле сверху-снизу.
    Конечно, приятнее было бы в обзорных сценах (некролог, автопилот, внешний обзор на себя и прочие объекты) обрезать картинку слева-справа и заполнить ею всю площадь экрана; но тут проблема - обрезка с боков может зацепить субтитры некролога. Если кому-то захочется и экран заполнить и субтитры чтобы не пострадали - могу подробно рассказать как они выводятся и что где в каких исходниках надо подправить.
     
    Последнее редактирование: 30 янв 2015
  9. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    в целом - согласен. Самой игре нефиг заниматься тем чем должен заниматься настраивающий её под себя человек. Так что выбрасываю нафиг все наработки в этом направлении. :)
     
    Рыжий Тигра нравится это.
  10. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Выложи в "Беседке для программистов" - вдруг кому-то пригодится.

    ---------- Сообщение добавлено в 23:41 ---------- Предыдущее сообщение размещено в 22:26 ----------

    Вместо эпиграфа:
    Вот расписал как в игре работает вывод картинок - и сразу допёр, как избавиться от "двадцать пятого кадра".
    Эффект проявляется только на циклах с записью в backbuffer, а "25-й кадр" начинается с записи в primary surface. Значит, надо что? Значит, первую запись в primary после backbuffer'а надо иг-но-рировать. Технически: немедленно (конечно, после предварительных проверок surface'ов на IsLost()) возвращать управление с кодом "отлюбись", то бишь DD_OK.
    (радостно потирая лапы) Вот ща и проверю! :-) (по кончик хвоста закапывается в исходники dxmci; на всю округу мотоциклетным треском раздаётся лязг клавиатуры)
     
    Последнее редактирование: 31 янв 2015
    Bato-San нравится это.
  11. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Рыжий Тигра, Если что, готов принять новые заказы. Вплоть до растяжения с фильтрацией сразу из 8 битов :)
     
    Рыжий Тигра нравится это.
  12. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Не, не пойдёт: тогда придётся впечатывать субтитры в уже увеличенную картинку - будут геморрои с вычислением размера шрифта и с ореольчиками вокруг букв, сейчас я их делаю выводом строки на 640*480 - 8 раз подряд чёрным со смещением на пару пикселов и поверх белым в центр.
    (оживившись) Кстати, об ореольчиках. Хочу чтобы доп-субтитры выводились как в роликах - с ореольчиками пошире и чуточку прозрачноватыми. Как ты считаешь - можно под это дело припахать vsfilter.dll, чтобы он сам накладывал?
    Да и в роликах неплохо бы задавать вертикальную позицию субтитров динамически - в зависимости от текущего форм-фактора экрана; сейчас она задаётся настройками для vsfilter.dll в registry, а это дурно по отношению к другим фильмам, которые возможно захочет смотреть пользователь в перерывах между игрой. Но как к этому подойти грамотно - я не разобрался и запутался. :-(
     
  13. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Если нормального способа так и не найдешь, то можно попробовать перехватить чтение реестра библиотекой: GetModuleHandle возвращает указатель на начало образа библиотеки, там в таблице секций добираешься до импорта и подменяешь указатель на RegQueryValueEx (или что там будет) на свой, который будет делать, что тебе нужно. А copy-on-write не должен дать остальным процессам патченную библиотеку.
     
    Рыжий Тигра нравится это.
  14. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Реализовал. Но испытания с треском захлебнулись. :-( Запускал раз с тридцать - ни разу эффекта не проявилось. Вчера-позавчера регулярно вылезало через считанные секунды после запуска, а сейчас почему-то никак. :-(

    ---------- Сообщение добавлено в 06:10 ---------- Предыдущее сообщение размещено в 06:02 ----------

    Хм. Вообще-то vsfilter.dll грузится не как нормальная .dll'ка, а где-то в недрах IGraphBuilder::RenderFile()'а, и сильно подозреваю, что к моменту возврата из него всё уже считано и настроено. :-(
    Впрочем, можно заранее сделать LoadLibrary(), подхимичить таблицы и тогда уже рендерить...
    Сенькс за идею!
     
  15. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Кстати, а чем можно выяснить имя файла directshow-фильтра по его GUID'у?
     
  16. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Рыжий Тигра, может по CLSID всё же ? Тогда поиском в реестре.[​IMG]
     
    Последнее редактирование модератором: 19 июл 2015
    Рыжий Тигра нравится это.
  17. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Рыжий Тигра, можно что-то вроде такого:
    Код:
    HMODULE GetModuleHandleByCLSID (REFGUID clsid) {
        IBaseFilter *pFilter = NULL;    
        HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pFilter));
        if (!FAILED(hr)) {
            MEMORY_BASIC_INFORMATION mbi;
            if (VirtualQuery(&(pFilter->EnumPins), &mbi, sizeof(mbi)))
                return (HMODULE)mbi.AllocationBase;
            SafeRelease(&pFilter);
        }
        return NULL;
    }
    
    Никаких проверок нет, ничего не тестилось, просто примерный алгоритм.

    В CoCreateInstance обязательно должен передаваться именно CLSCTX_INPROC_SERVER - это значит, что реализация интерфейса должна находиться в DLL и подгружаться в адресное пространство процесса. Если с этим значением фейлится и нужно другое, то ничего не получится.
     
    Рыжий Тигра нравится это.
  18. iunnamed

    iunnamed

    Хелпер

    Регистрация:
    15 янв 2007
    Сообщения:
    1.235
    SP2 стоит? Там же написано:
    Что MSDN, кстати, и подтверждает (SP2 или SP3):
    Активация технологии режима совместимости приложений в Windows 2000 с пакетами обновлений 2 (SP2) и 3 (SP3)

    Эм... нет. С учётом очень ограниченного свободного времени - считаю, что это совсем не та вещь, на которую его можно потратить.

    Кстати, возможно ещё какая-то зависимая служба отключена.
    А, вообще, если Windows совсем в дугу не скривило, то при загрузке с оригинального CD и установке поверх существующей системы (первое предложение о восстановлении системы пропускаем) на определённом шаге вылезет вопрос, мол, обнаружена установленная копия Windows в том же месте: хотите восстановить или поставить начисто? Здесь уже выбираем восстановить, тогда установленные программы и настройки остаются на местах. Может что и слетает, но сколько раз знакомым систему восстанавливал изуродованную вирусами, вроде, всё на местах оставалось.
     
    Рыжий Тигра и AxXxB нравится это.
  19. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    AxXxB, хм, не факт, что в процессе CoCreateInstance()'а фильтр не успеет считать из registry все настройки.
    Ага, логично. Только не там, где ты показал, а в HKCR\CLSID\<clsid>\InprocServer32\@ - нам нужно имя файла, чтобы скормить его в LoadLibrary().
     
    Bato-San нравится это.
  20. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Да, действительно. Но она и в DLLMain может это сделать, хоть Майкрософтом это и не рекомендуется :). Надо дизасмом пройтись.

    Еще я не знаю, если библиотека заранее грузится в пространство процесса через LoadLibrary или там статически, а потом используется COM - это ок? Ничего там не случится страшного?)
     
    Рыжий Тигра нравится это.
  21. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Рыжий Тигра, а не проще взять dll и пропатчив от реестрозависимости кинуть в папку игры под другим именем ?
     
  22. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Bato-San, а если библиотека зарегистрирована с полным путем? Это же COM.

    Зато ты натолкнул меня на другую мысль - можно не патчить библиотеку, а хукнуть RegQueryValue(Ex) в своем адресном пространстве до загрузки фильтра, а там уже можно и определить, кто стучится и что делать.
     
    Рыжий Тигра нравится это.
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление