Ковырнул тут на досуге игру. Задался интересным вопросом.
Суть такая. Игра использует системный шрифт ltn3.pgf и ltn5.pgf (точнее две разных игры.)
Есть ли возможность заменить этот шрифт через плагин. (не трогая flash0)?
riku.kh3, нет, Shift-JIS шрифт очень большой. Он содержит символы английские, русские, греческие, японские катана и фиг поймёшь что там у них. И все национальные символы имеют свой уникальный код, как задумано в Shift-JIS. Некоторые коды совпадают с UTF-8, но это так же зависит от разработчика шрифта. Разработчик мог бы добавить поддержку UTF-8, как и однобайтный 1251 русский. Английский-то по-любому почти всегда идёт первым в однобайтной области. И разработчик шрифта может сам переставлять шрифты туда, куда ему это выгодно, например, если в игре не используется русский алфавит, то он может туда забить китайские символы, либо просто использовать эти коды в качестве управляющих символов.
Почему мы видим крякозяблики вместо нормального текста?
Потому что в той кодировке, в которой мы сохраняем текст, вместо необходимых букв находятся сторонние символы, например элементарно досовские символы всяких кирпичиков и уголков, либо китайских или японских иероглифов. Либо вообще там нет ничего, пустое место или совсем нет матрицы шрифтов.
Взять однобайтный win1251 на PSP...
Win-1251 начинается с 0xC0 по 0xFF. Вот скрин, где коды символов можно увидеть слева и сверху, как в шахматах.
"А" - 0xC0 или 0x00С0
"Б" - 0xC1 или 0x00С1
"В" - 0xC2 или 0x00С2
"я" - 0xFF или 0x00FF
Спереди парные нули не учитываются.
Ранее на том самом месте, где русский алфавит, были как раз досовские символы.
А вот так мы видим пронумерованные символы в шрифте TTF. Нумерация символов так же идёт по стандарту. В данном случае виден русский алфавит в кодировке UTF-8 = 0x0401 (буква Ё) до 0451 (маленькая ё - её здесь нет).
(картинка кликабельна, читаем там внимательно мой пост по установке)
Листаем тот же шрифт к самому низу и видим там ещё один алфавит Windows-1251 = 0x00C0 (буква А) до 0x00FF (маленькая я). Это уже я сам копирнул алфавит в эту область. Поэтому теперь получается, что этот шрифт поддерживает писанину в UTF-8 и Windows-1251:
То есть, можно в текстовом редакторе написать текст и сохранить его в UTF-8 и он будет отображать русскую писанину, как положено. Так же, можно сохранить текст через текстовой редактор в Windows-1251 и так же, этот текст будет прекрасно выводится, как положено.
Но если посмотреть на текстовые файлы, одного содержания, но в разных кодировках через хекс-редактор, то мы увидим коды символов отличающиеся. В данном случае UTF-8 будет иметь 2-байтные символы на букву, например буква "А" = 0410, то в кодировке 1251 мы увидим код символа "А" = С0 одним байтом.
И один и тот же шрифт будет прекрасно отображать обе кодировки.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 13.05.2014 в 20:00.
Ну так в итоге и получается, что если разработчик игры не стал заморачиваться и добавлять поддержку кучи кодировок (а из двухбайтных тут помимо shiftjis, есть еще и jis, и euc, и utf-16), а только стандартную область shiftjis - то тут и облом.
Я имею в виду, тот факт что shiftjis не противоречит другим двухбайтовым кодировкам, не делает ее частью юникода или utf-16. Это отдельный принятый самостоятельный от юникода стандарт.
Я даже не знаю как это и проверить вообще.. имеющееся тулза у меня только с shiftjis-текстом работает.
у так в итоге и получается, что если разработчик игры не стал заморачиваться и добавлять поддержку кучи кодировок (а из двухбайтных тут помимо shiftjis, есть еще и jis, и euc, и utf-16), а только стандартную область shiftjis - то тут и облом.
Нет, ты не правильно понял. Разработчик шрифта - ты сам. В оригинале да, шрифт неизвестно кто и как сделал, вернее известно - это Sony подсунула его в папку flash0:/FONT/JPN0.PGF
Но в данном случае ты сам можешь перекидывать символы куда угодно и создать свой кастомный шрифт. Ты сам можешь сделать поддержку всех тысячи кодировок в мире и скомпилировать свой JPN0.PGF.
Чем больше ты сделаешь TTF - тем больше будет размер PGF. Если твой TTF будет весить 2 Мб, то и PGF так же потяжелеет. Если ты вырежешь из шрифта TTF неиспользуемые символы, все греческие, японские и китайские, то и PGF твой будет весить копейки.
Это ты сам можешь проверить.
Поэтому поддержка кодировок зависит теперь только от тебя, потому что ты можешь ложить свой шрифт в образ игры или вместо оригинала в эмуляторе.
P.S. Кстати, в Real Life Engine PAK editor я заметил, что можно делать переназначение шрифтов, делать сдвиг смещения.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
ErikPshat, я думаю у тебя сейчас вообще голова кругом пойдет. Часть текста записывается однобайтной ascii кодировкой (A1-DD) и движок игры 'конвертирует' эти символы на лету в двухбайтные:
Это, по-сути, ненужная рутина, цель которой уменьшить размер каждой фразы в байтах. Я над ней особо не задумывался. Хотя может именно из-за нее и происходят крэши.
Кстати, текст из конвертера можно сохранять в текстовые файлы Shift-JIS и потом проверить в хексе?
У меня просто конвертер не запускается, там что-то с 4-ой версией фреймворка у меня не так.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Если ты про RLPAKTOOL, то там уже встроена эта рутина по конвертированию необходимых ascii символов в то, что на psp фактически выводится на экран. Тут экспортировал текст в shiftjis, правда там мусора много.
riku.kh3, вообщем вывел я все коды символов. Догнал, что текстовой редактор показывает количество байт на символ. По этой функции и определил все коды в хексе.
По ходу конвертер все символы пишет исключительно в 2-байтовой кодировке. А вот PSP в память складывает узкие символы из 1-байтовой кодировки, а широкие символы оставляет те же 2-байтные.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
ErikPshat, да все так. Суть всей этой кутерьмы в том, что часть наиболее часто используемых символов слоговой азбуки в игровом скрипте заменили на однобайтовые, причем реализовано это на движке игры (в ps2 и ps3 версии этой игры все так же, и сам шрифт там другой) и они выводятся на экран в другом виде. Это помогает сэкономить несколько байт на каждой фразе (там кстати физический лимит поинтера 255 байт на каждую фразу). Если проводить аналогию на привычных вещах, то автоконвертер транслита на русский.. что-то в подобном духе.
Но я все-таки не уверен что это причина крэшей, т.к. русский текст все-таки отображается на экране как положено.. проблема только при попытке сейва происходит.
По сути, можно взять и нарисовать русские буковки на другое безопасное место shiftjis'а вместо ненужных символов.. но, опять же, все сводится к ковырянию PGF формата в попытаках найти таблицу длины и ширины каждого символа в пикселях.
riku.kh3, я думаю, что можно перевод сохранить в Win-1251 и шрифт использовать обычный свой или переименовать ltn0.pgf в jpn0.pgf. И должно всё выводится.
Думаю крэш в сохранении происходит не из-за шрифтов, т.к. скорее всего в перед и после текстовых диалогов должен стоять поинтер на то, что это именно текстовая секция. Поэтому не должна быть мешанина со служебным кодом.
Скорее всего присутствует баг в самом конвертере. Ведь программный код и текст находятся в одном файле. Если делать перевод и пытаться сохранить текст вместе с программным кодом в какой-либо кодировке, то конечно программный код тоже перекодируется в другую кодировку. Поэтому можно только конвертировать текстовую секцию, но программный код трогать нельзя.
А я чую, что там в тексте как раз присутствуют программные коды, например видел скобки {}, доллары $, буквы S, прямо посреди текста.
Дело в том, что даже если ты видишь на экране те же символы, то даже при перекодировке из shiftjis в тот же самый shiftjis, ты будешь на экране видеть всё те же символы. А на самом деле, в хексе, ты увидишь уже вместо программного кода уже другие цифры, хотя в текстовике для твоих глаз будут отображаться всё те же скобки {}, доллары $, буквы S.
Так что нужно проконтролировать этот момент.
Сообщение от ErikPshat
По сути, можно взять и нарисовать русские буковки на другое безопасное место shiftjis'а вместо ненужных символов.. но, опять же, все сводится к ковырянию PGF формата в попытаках найти таблицу длины и ширины каждого символа в пикселях.
Нет, длина и ширина находятся как раз в самом шрифте. Можно просто копирнуть весь русский алфавит вместо японского, который используется в игре по номерам 82A8 (Ё) по 82FF - этого диапазона хватит выше крыши для кириллицы. А я видел, что японский алфавит вообще уходит за пределы 9600.
И вообще можно удалить все остальные шрифты, тогда твой PGF будет весить всего 128 байт )))
А сейчас я смотрю твой шрифт, так он весит почти мегабайт, зачем столько всего в нём.
Сообщение от riku.kh3
RLPAKTOOL
В исходниках видел файл kanaconv.txt, так вот там и прописывается перенаправление шрифтов.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
ErikPshat, RLPAKTOOL очень продуманно устроен. Этот нюанс с конвертированием японских ascii символов, во-первых, там внедрен исключительно только для отображения: чтобы было удобно читать когда переводишь (то есть в одну сторону), и, во-вторых, только для определенных символов, а не на все подряд. То есть он никак не может тут вредить.
Или может ты посмотрел исходники и увидел там код конвертирования в shiftjis? Он там нужен был автору только для конвертирования своего английского текста.. да, он затрагивает сервисные комманды в тексте и может создавать проблемы... НО! эта фича полностью отключается одной галочкой, и я ей попросту никогда не пользовался. Я просто сразу ввожу нужный мне текст в shiftjis без помощи каких-либо конвертеров.
То есть проблема крэшей все-равно так и не раскрыта.
riku.kh3 добавил 13.05.2014 в 22:51
Сообщение от ErikPshat
Нет, длина и ширина находятся как раз в самом шрифте. Можно просто копирнуть весь русский алфавит вместо японского, который используется в игре по номерам 82A8 (Ё) по 82FF - этого диапазона хватит выше крыши для кириллицы. А я видел, что японский алфавит вообще уходит за пределы 9600.
Просто попробуй. Возьми тот скрин выше что ты выкладывал, и попробуй перерисовать хоть один символ так, чтобы он занимал меньше по ширине. Да, в TTF это будет работать, но после конвертирования в PGF - гарантирую, места он будет занимать ровно столько же сколько и оригинальный символ. Причем shiftjis иероглифы не моноширинные (то есть они не все одинаковой фиксированной ширины в пикселях).
Последний раз редактировалось riku.kh3; 13.05.2014 в 22:51.
Причина: добавил, подумав
Просто попробуй. Возьми тот скрин выше что ты выкладывал, и попробуй перерисовать хоть один символ так, чтобы он занимал меньше по ширине.
Я просто буквы скопирую вместе с их родными данными в позицию 82А8.
Обрати внимание на скрин выше, там на скрине видно окошечко под названием Gliph Properties и в этом окошечке задаются все параметры шрифта. Так же, у шрифта не может быть строго закреплённой ширины и высоты, там указывается от и до. Всё аналогично, как в любом другом шрифте, пусть это shift-jis, пусть utf-8, от названия суть не меняется.
Другое дело, как ты будешь портировать буквы в тексте, менять их код? В программе для этого есть какие-то кнопочки?
Хорошо, если в проге можно только видеть текст наглядно, но на самом деле, чтобы буквы имели другой, необходимый тебе код.
Никак не пойму, почему прога у меня на XP SP3 не запускается.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Я просто буквы скопирую вместе с их родными данными в позицию 82А8.
Обрати внимание на скрин выше, там на скрине видно окошечко под названием Gliph Properties и в этом окошечке задаются все параметры шрифта. Так же, у шрифта не может быть строго закреплённой ширины и высоты, там указывается от и до. Всё аналогично, как в любом другом шрифте, пусть это shift-jis, пусть utf-8, от названия суть не меняется.
Для TTF - все именно так, все работает и у меня это получалось, конечно же. В TTF свободно играться шириной буковок не проблема. После конвертирования в PGF - происходит совершенно другая история.
Сообщение от ErikPshat
Другое дело, как ты будешь портировать буквы в тексте, менять их код? В программе для этого есть какие-то кнопочки?
Хорошо, если в проге можно только видеть текст наглядно, но на самом деле, чтобы буквы имели другой, необходимый тебе код.
Там в коде есть функция похожая по конвертированию английских ascii буковок, только если подправить в исходниках эту функцию под себя.
Приложил модифицированный скрипт, там только самая первая фраза заменена на ту, что в 100% вызывает крэш. Если есть желание сдампить память и поизучать что же с ней не так - пожалуйста.
Последний раз редактировалось riku.kh3; 14.05.2014 в 01:40.
Кстати, дай мне нормальный шрифт TTF, который ты собираешься использовать. А то тот, что у тебя в архиве, какой-то по-моему кривой. Или его использовать?
И это, есть возможность вытащить расжатый скриптпак?
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Кстати, дай мне нормальный шрифт TTF, который ты собираешься использовать. А то тот, что у тебя в архиве, какой-то по-моему кривой. Или его использовать?
Да нету у меня нормального, там во всех русские буковки такие небрежные. Только если из русского шрифта перетащить.
Сообщение от ErikPshat
И это, есть возможность вытащить расжатый скриптпак?
riku.kh3, ладно, нужно переварить все раскопки и размышления, и ещё поужинать ))). Сегодня ночью думаю потренируюсь со шрифтами и может что-нибудь полезного получится...
Ага, насчёт ширины букв в TTF я соврал. Их же конвертер регулирует TTF2PGF. И кстати, когда я конвертировал свой шрифт обычный Times New Roman, то на PSP в диалогах он выглядел маленьким, наклонным и узким. Скрин на предыдущих страницах, правда без русского и японского алфавита.
Сообщение от riku.kh3
Приложил модифицированный скрипт, там только самая первая фраза заменена на ту, что в 100% вызывает крэш. Если есть желание сдампить память и поизучать что же с ней не так - пожалуйста.
Ну нифига себе только одна фраза
Да там всё заменено и повырезано (Replased, Inserted and Deleted) начиная сразу с 4-го программного байта...
Скрин
Сравнение с оригиналом
Ты хотя бы одну букву измени, чтобы не было смещения символов и сохрани, тогда можно будет и сравнивать )))
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Ну нифига себе только одна фраза
Да там всё заменено и повырезано (Replased, Inserted and Deleted) начиная сразу с 4-го программного байта...
Так да, перепаковывает тулза весь скрипт, поинтеры переставляет и т.п.
Одну букву так просто не изменить, т.к. там некий хитрый binary invert применяется к тексту.
Более наглядный пример для сравнения сделал. Здесь два скрипта: в обоих изменена только первая фраза, один скрипт крэшится на сейве, другой нет. Длина в байтах у фраз одинаковая.
Последний раз редактировалось riku.kh3; 14.05.2014 в 01:40.
Приложил модифицированный скрипт, там только самая первая фраза заменена на ту, что в 100% вызывает крэш.
Снял дампы памяти с первого диалога у оригинала и крэша, различий тоже много в конце файла, причём не только в диалоге, но и вокруг. Разбираться замучаешься. Ну хоть основная масса файла в начале и дальше середины полностью совпадают.
Кстати крэша при сохранении не заметил.
Щас потестю эти 2 дампа...
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram