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. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Увы, так легко не получается. Таки да, игра рисует обстановку в 320*240 и directdraw'ными средствами увеличивает её до 640*480, но кабину подрисовывает уже в SVGA-режиме поверх увеличенной обстановки.
    Тем не менее, можно выпендриться: для рисования кабины подсунуть игре левый пустой surface, что получится - подрихтовать, а потом уже самостоятельно наложить на ранее перехваченный фон. Но того кина, что хотелось, не будет: вместе с кабиной рисуются и отметки целей, подсветка ракетно-пушечных прицелов и т.д., рихтовка надписей может элементарно эти отметки повредить.

    Пример. Первая картинка снята в SVGA, вторая - после переключения в VGA-режим, для которого в код перехватчика добавлена зачистка фона:

    [​IMG]

    [​IMG]

    Я специально подогнал ракурс, при котором рамка подсветки пушки на авианосце накладывается на (собственно, подкладывается под) указатель уровня горючки.

    Кстати, сорри за чрезмерно большие картинки: просто-напросто провтыкал перед фотографированием переключить разрешение, а когда обнаружил - было уже влом повторять фотосессию, чересчур трахоёмкой оказалась точная подгонка подсветки под разметку. :-(
    Но "нет худа без добра" ((L) лиса Алиса) - зато хвастаюсь своим dwrap'оподобным, хм, перехватчиком-расширителем экрана (название рабоче-условное, кому не пофиг - предлагайте лучше!).
    А вот так под ним же выглядят обзорные кадры - в данном случае тот же авианосец с близкого (насколько смог подкрутить) ракурса:

    [​IMG]

    По-моему, неплохо. :-)
     

    Вложения:

    • cockpit-svga.png
      cockpit-svga.png
      Размер файла:
      546,8 КБ
      Просмотров:
      543
    • cockpit-vga.png
      cockpit-vga.png
      Размер файла:
      106,1 КБ
      Просмотров:
      640
    • lex-wide.png
      lex-wide.png
      Размер файла:
      462,6 КБ
      Просмотров:
      554
    Sherhan007 нравится это.
  4. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

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

    [​IMG]

    Ширина активной части картинки - 1142 пиксела, но на глаз не видно, где заканчивается правый край, не? :-)

    Из ещё достижений: случайно сообразил, как всё-таки замедлить вращение карты. Оказалось просто: если не получается замедлить вращение - будем замедлять его вывод. :-) Технически: в ветку передачи полётной карты directdraw'у добавил перехватчик, в котором Sleep( 50 ), - и вуаля. :-)
     

    Вложения:

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

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    330. Ещё пиксел - и табличка начнёт заметно срезаться. Эффективная ширина картинки, соответственно, 1162:

    [​IMG]

    "Орбита на замке!" - плакат времён Геллеспонтского кризиса. Снимок, ясен перец, откровенно постановочный, но ситуацию - готовность к войне со вчерашними братьями по разуму - передаёт атмосферно. Дарю! :-)
     

    Вложения:

    Последнее редактирование: 8 ноя 2014
  6. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Из той же серии:

    [​IMG]

    Заготовка плаката для следующего этапа операции "Чёрное копьё", после объявления "народной войны" Порубежью. Предварительное название - "На Берлин Ландсрейх!". Техника та же, место съёмки то же, участники те же.
     

    Вложения:

    Последнее редактирование: 8 ноя 2014
  7. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

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

    [​IMG]

    [​IMG]

    [​IMG]

    [​IMG]

    Это был радионекролог по Блэйру в вылете D2. Ширина одна и та же, высота разная, пропорции - 32:15 (по факту - 64:33 плюс поля слева-справа), 16:9, 8:5 и 4:3 соответственно.
     

    Вложения:

    Последнее редактирование: 10 ноя 2014
    Sherhan007 нравится это.
  8. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Напоролся на самую неприятную из грабель: отладочная конфигурация работает, релизная падает. :-( Пришлось срочно изобретать двухдебагерную параллельную отладку, за неимением лучшего стырил основную идею из когда-то читанного рассказа Николая Блохина "Реплики". Кстати, весьма рекомендую.
     
  9. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Рыжий Тигра, маску для букв субтитров сделай наконец, что бы они с фоном не сливались. Ведь элементарно же делается в самом простом варианте (вообще без рисования чего то, всё той же печаталкой текста). Хотя бы в один пиксель шириной. Ну и цвет букв поярче в сторону белого чутка.
     
    Последнее редактирование: 11 ноя 2014
  10. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Разобрался. Я сумничал:
    Код:
    void function( int param ) {
      if ( param > 200 ) {
        ....
      } else if ( param > 100 ) {
        ....
      } else {
        ....
      }
    }
    __declspec( naked ) int hook( void ) { // его вызов вместо "mov eax, data"
      __asm {
        mov   eax, data  ; // и чтобы возвратить -
        push  eax        ; // типа сохранил
        call  function
        pop   eax        ; // типа восстановил
        ret              ; // и возвращаю
      }
    }
    А компилятор - он тупой, что велели - делает как велено, что не разжевали - делает как ему в регистры взбредёт, "добру и злу внимает равнодушно" (L). Так он тоже сумничал - наоптимизячил: в вызываемой функции запомнил значение параметра у себя в EAX'е, а на его место засунул какой-то временный указатель. Ну, и перетёр ценные данные. :-( В результате перехватчик возвращает мусор. :-(
    Мораль: кладёшь параметры на стек - не надейся, что они там останутся, делай add esp.
    А как? Я в калиграфии не силён, слизал с самой игры трюк с тенью (чёрным на пиксел вниз и два влево), мало?
    0xE0E0E0, ярче уже глаза режет. :-(
    И потом, подстилающая картинка-то шевелится, в динамике текст заметнее.
     
  11. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    ну самое простое:

    берём букву и печатаем её сперва идеально чёрным цветом (или синим, короче контрастным основному для текста цветом), установив размер шрифта так, что бы он превышал размер нормального шрифта во все стороны на нужное количество пикселей, а потом точно в центр получившейся буквищи печатаем уже нормальную. Надо только считать смещение у каждой буквы относительно координаты маски по виду:
    Xmask+1 и Ymask+1

    В результате получится тот ореол вокруг букв который ты хотел.
     
  12. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Пробовал: средняя буква в строке ложится в ореольчик и не рыпается, остальные сползают и чем дальше от центра, тем заметнее. А если строк несколько, то можно уже в цирке показывать. :-(
    Можешь показать кусочек кода? Вместо вот этого:
    Код:
    #define XSUBS_TEXT_COLOR 0xE0E0E0
    #define XSUBS_FONT_HEIGHT  23
    #define XSUBS_FONT_WIDTH   10
    #define XSUBS_FONT_NAME   "Verdana"
    #define XSUBS_SHADOW_X   (-2)
    #define XSUBS_SHADOW_Y     1
    ................
      t_hfont = CreateFont(
        XSUBS_FONT_HEIGHT, XSUBS_FONT_WIDTH,
        0, 0, FW_MEDIUM,  0, 0, 0,  DEFAULT_CHARSET, 0, 0,
        ANTIALIASED_QUALITY, FF_DONTCARE | DEFAULT_PITCH, XSUBS_FONT_NAME );
    ..........
      RECT t_rect = {......};
      HFONT old_font = (HFONT) SelectObject( hdc, t_hfont );
      SetTextColor( hdc, 0 ); SetBkMode( hdc, TRANSPARENT );
      t_rect.left += XSUBS_SHADOW_X; t_rect.right += XSUBS_SHADOW_X;
      t_rect.top += XSUBS_SHADOW_Y; t_rect.bottom += XSUBS_SHADOW_Y;
      DrawText( hdc, line, -1, &t_rect,
        DT_NOPREFIX | DT_CENTER | DT_TOP | DT_NOCLIP | DT_WORDBREAK );
      SetTextColor( hdc, XSUBS_TEXT_COLOR ); SetBkMode( hdc, TRANSPARENT );
      t_rect.left -= XSUBS_SHADOW_X; t_rect.right -= XSUBS_SHADOW_X;
      t_rect.top -= XSUBS_SHADOW_Y; t_rect.bottom -= XSUBS_SHADOW_Y;
      DrawText( hdc, line, -1, &t_rect,
        DT_NOPREFIX | DT_CENTER | DT_TOP | DT_NOCLIP | DT_WORDBREAK );
      SelectObject( hdc, old_font );
     
  13. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Рыжий Тигра, ну щас под руками готового кода нет, но общий принцип такой:

    1. пишется своя функция вывода буквы DrawChar (Char, Xpos, Ypos, FatChar)
    надеюсь, понятно, что pos это координаты, где печатать, а FatChar - это ширина печатаемого символа, включая его маску. Ну можно сделать параметр указывающий размер буквы внутри маски ещё.
    2. Эта самая функция выводит каждую букву отдельно, как я описывал выше.
    3. Пишем функцию вывода строки, которая сама задаёт координаты каждого следующего символа в строке используя FatChar, который она же имеет одним из параметров и его же передаёт в функцию DrawChar, но прибавляетпри этом к координатам некое межсимвольное расстояние FatSpace:
    DrawString(StringToDraw, Xspos, Yspos, FatChar, FatSpace)

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

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Ага, а ещё умеет разбивать длинную строку на несколько по словам и центрировать полученные подстроки. Примерно как DrawText().
    А зачем? Меня и DrawText() устраивает. Тебя не? Вот ты и пиши.
    Подсказка: можешь выдрать кусок из vsfilter, он умеет рисовать как раз как тебе нравится, с ореольчиками, а ещё делит длинную строку не тупо по сколько влезло, а на примерно равные части - такие субтитры удобнее читаются. Выдери, перепиши на Си для пущей универсальности и кидай сюда. Ну, или скомпиль в .lib или .dll, чтобы с MSVС6 линковалась.
    Да, чуть не забыл: и чтобы можно было её натравить не на HDC, а просто на картинку - на массив строк пикселов. А то я задолбался из пикселов и surface'ов HBITMAP'ы строить. :-(

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

    Наблюдаю натуральный дурдом: игра выводит картинку в полноэкранке не через directdraw (который я перехватываю и дообрабатываю), и не через GDI (который я тоже перехватываю и дообрабатываю), а неведомым мне святым духом. :-( Не, ну иногда вызывает и хорошо известные мне DirectDrawPalette::SetEntries() и DirectDrawSurface::Unlock(), но основной поток вывода идёт мимо меня.
    Я в непонятке. :-( Особенно учитывая, что началось это часа два назад и на обоих компах (с разными операционками, ясен перец) одновременно. :-(
    Что может быть за фигня, кто сталкивался?
     
    Последнее редактирование: 11 ноя 2014
  15. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    да как хочешь. Можешь просто сделать вторую тень, отбрасываемую вверх и вправо. А которая вниз - чутка пошире. Результат будет тот же в принципе. Брачок маленький будет, но ты его не увидишь.

    Скайнет атакует. :D

    Если что то идёт мимо перехватчика, значит ты что то проглючил при сборке.
    Хотя, сколько ты говоришь там у тебя отладчиков висит ?
     
  16. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

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

    Кстати, есть одна штучка, которую ты мог бы покопать. Игра старается стабилизировать частоту кадров в бою, при переизбытке процессора уверенно держит 24 кадр/с. При этом грузит проц на 100%. Значит, где-то есть функция "потянуть резину" с холостым циклом внутри. Ты не мог бы её разыскать, чтобы в цикл сунуть что-то вроде Sleep()'а? Чтобы разгрузить проц, тогда можно будет задрать задаче приоритет аж до реалтайменного и плавность полёта на многозадачной тачке улучшится.
     
  17. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Кстати, а как? Делись идеей! Иногда может оказаться весьма полезно - например, если надо отладчиком полазить по внутренностям самой игры, а directdraw мешает и не на чем загнать двухмашинную отладку.

    ---------- Сообщение добавлено в 03:19 ---------- Предыдущее сообщение размещено в 03:13 ----------

    Ага, уже придумал: сделать классы производные от IDirectDraw* с пустыми методами (ну, не совсем пустыми - параметры вызовов имеет смысл сыпать в лог или хотя бы на консоль).
     
    Bato-San нравится это.
  18. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Таки да. Для отладочных целей вставил очередной перехватчик, поиграл с ним, потом закомментировал. А в скрипте для хак-движка осталось:
    Код:
    ;; исследуем универсальный перехватчик вывода
    
    ; 00477763  90909090909090909090+   Align	16
    ; 00477770                      SUB_L00477770:
    ; 00477770  A10C724B00              mov   eax,[L004B720C]
    ; ------------ заменить на:
    ; 00477770  E8xxxxxxxx              call  wc4_versatile_hook
    ; ------------
    ; 00477775  53                      push  ebx
    ; 00477776  55                      push  ebp
    ; 00477777  56                      push  esi
    ; 00477778  85C0                    test  eax,eax
    ; 0047777A  57                      push  edi
    ; 0047777B  0F84CA000000            jz    L0047784B
    ; 00477781  A1D4204D00              mov   eax,[L004D20D4]
    
    ! 4
    
    ; первая замена: "mov eax" на "call $+5"
    { REPL 4
      $ xA1 x0C x72 x4B
      $ xE8 x00 x00 x00
      @ CORE  x301000 x76770  x302000 x76770
    } REPL
    ; вторая замена: "call $+5" на "wc4_versatile_hook"
    & OVSH               x301000 x76775   x302000 x76775
    @ JUMP  &OVSH &WVSH  x301000 x76771  x302000 x76771
    Эффект потрясающий: первая замена прошла, вторая обломалась из-за отсутствия функции wc4_versatile_hook(), в коде образовалась каша, да ещё и совершенно случайно не вызывающая падения из-за кривой команды или кривого адреса. В результате игра вместо выводить кадр через directdraw гнала его по другой ветке, через GDI. Весь день ухлопал, пока нашёл в чём грабля. :-(
    Придётся срочно придумывать на смену команде JUMP с четырёхбайтными операндами какую-то более длинную, включающую байты до подменяемого адреса (в т.ч, ясен перец, и код операции) и после (например, для забития NOP'ами остатка при подмене длинной процессорной команды / группы команд на более короткую).
     
  19. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Чуть-чуть поигрался с размерами шрифта для доп-субтитров. Получилось вроде бы чуть лучше:

    [​IMG]

    Получились почти такими же, как субтитры в киноролике:

    [​IMG]

    Конечно, субтитры в кино не шитые - выводятся через vsfilter и настраиваются по вкусу. Кстати, 2 All: если кто в курсе как брать/ставить настройки у vsfilter'а (на лету, а не через копание в registry) - делитесь! Тогда можно будет согласовать киношные субтитры с доп-субтитрами в сценах, а это всяко полезно.
     

    Вложения:

  20. Ogr 2 лол

    Ogr 2

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

    Регистрация:
    25 мар 2008
    Сообщения:
    6.372
    если может накладывать текст разными шрифтами, сначала накладываешь жирным (нужно подготовить спец. шрифт чтобы не сползало) потом нормальным.
     
  21. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Как то так... наверное.
    ну и PDB до кучи.

    Ogr 2, это тебе не графический редактор. Не надо левых фонтов. Тут математика всё решает. Тем более, что проблема уже решена.

    Правда по мне ореол малость жирноват вышел. Хотя фиг его знает. )))
     
    Последнее редактирование: 12 ноя 2014
  22. Ogr 2 лол

    Ogr 2

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

    Регистрация:
    25 мар 2008
    Сообщения:
    6.372
    Bato-San, предложенный вариант для вывода сабов в игре, а не в видео роликах.
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление