PSPx форум

PSPx форум (https://www.pspx.ru/forum/index.php)
-   Русификация игр и софта для PSP (https://www.pspx.ru/forum/forumdisplay.php?f=190)
-   -   Системный шрифт PSP (https://www.pspx.ru/forum/showthread.php?t=102816)

ErikPshat 13.05.2014 19:00

Вложений: 2
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 одним байтом.
И один и тот же шрифт будет прекрасно отображать обе кодировки.

riku.kh3 13.05.2014 20:16

Ну так в итоге и получается, что если разработчик игры не стал заморачиваться и добавлять поддержку кучи кодировок (а из двухбайтных тут помимо shiftjis, есть еще и jis, и euc, и utf-16), а только стандартную область shiftjis - то тут и облом. :scratch_one-s_head:

Я имею в виду, тот факт что shiftjis не противоречит другим двухбайтовым кодировкам, не делает ее частью юникода или utf-16. Это отдельный принятый самостоятельный от юникода стандарт.

Я даже не знаю как это и проверить вообще.. имеющееся тулза у меня только с shiftjis-текстом работает.

ErikPshat 13.05.2014 20:21

Вложений: 3
Тэкс, снял дамп памяти оригинального японского диалога.


В дампе всё лишнее удалил, оставил только в 1-ой строке чисто диалог, во 2-ой строке указание на шрифт. Получился такой вот текстовик:

Вложение 10038

И коды символов в хексе:

Вложение 10039

Что получается, какие символы использует PSP при выводе японского алфавита?...
  1. 「 - A2 = A2
  2. 部 - 9594 = 9594
  3. 活 - 8A88 = 8A88
  4. ニ - C6 = 82C9
  5. モ - D3 = 82E0
  6. 入 - 93FC = 93FC
  7. ラ - D7 = 82E7
  8. ず - 82B8 = 82B8
  9. 無 - 96B3 = 96B3
  10. 駄 - 91CA = 91CA
  11. ニ - C6 = 82C9
  12. 鍛 - 9262 = 9262
  13. エ - B4 = 82A6
  14. 上 - 8FE3 = 8FE3
  15. げ - 82B0 = 82B0
  16. ラ - D7 = 82E7
  17. レ - DA = 82EA
  18. タ - C0 = 82BD
  19. 筋 - 8BD8 = 8BD8
  20. 肉 - 93F7 = 93F7
  21. ヲ - A6 = 82F0
  22. コ - BA = 82B1
  23. コ - BA = 82B1
  24. ぞ - 82BC = 82BC
  25. ト - C4 = 82C6
  26. ば - 82CE = 82CE
  27. カ - B6 = 82A9
  28. リ - D8 = 82E8
  29. ニ - C6 = 82C9
  30. 見 - 8CA9 = 8CA9
  31. セ - BE = 82B9
  32. ツ - C2 = 82C2
  33. ケ - B9 = 82AF
  34. テ - C3 = 82C4
  35. ヤ - D4 = 82E2
  36. が - 82AA = 82AA
  37. ル - D9 = 82E9
  38. … - 81(63) = 81(63) [прим. 63 служебный перед завершением?]
  39. 」 - A3 = A3
39 символов - 55 байтов.

ErikPshat 13.05.2014 20:30

Цитата:

Сообщение от riku.kh3 (Сообщение 1086939)
у так в итоге и получается, что если разработчик игры не стал заморачиваться и добавлять поддержку кучи кодировок (а из двухбайтных тут помимо shiftjis, есть еще и jis, и euc, и utf-16), а только стандартную область shiftjis - то тут и облом.

Нет, ты не правильно понял. Разработчик шрифта - ты сам. В оригинале да, шрифт неизвестно кто и как сделал, вернее известно - это Sony подсунула его в папку flash0:/FONT/JPN0.PGF :D

Но в данном случае ты сам можешь перекидывать символы куда угодно и создать свой кастомный шрифт. Ты сам можешь сделать поддержку всех тысячи кодировок в мире и скомпилировать свой JPN0.PGF.

Чем больше ты сделаешь TTF - тем больше будет размер PGF. Если твой TTF будет весить 2 Мб, то и PGF так же потяжелеет. Если ты вырежешь из шрифта TTF неиспользуемые символы, все греческие, японские и китайские, то и PGF твой будет весить копейки.
Это ты сам можешь проверить.

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

P.S. Кстати, в Real Life Engine PAK editor я заметил, что можно делать переназначение шрифтов, делать сдвиг смещения.

riku.kh3 13.05.2014 20:32

ErikPshat, я думаю у тебя сейчас вообще голова кругом пойдет. :D Часть текста записывается однобайтной ascii кодировкой (A1-DD) и движок игры 'конвертирует' эти символы на лету в двухбайтные:

Код:

ア=あ
イ=い
ウ=う
エ=え
オ=お
カ=か
キ=き
ク=く
ケ=け
コ=こ
サ=さ
シ=し
ス=す
セ=せ
ソ=そ
タ=た
チ=ち
ツ=つ
テ=て
ト=と
ナ=な
ニ=に
ヌ=ぬ
ネ=ね
ノ=の
ハ=は
ヒ=ひ
フ=ふ
ヘ=へ
ホ=ほ
マ=ま
ミ=み
ム=む
メ=め
モ=も
ヤ=や
ユ=ゆ
ヨ=よ
ラ=ら
リ=り
ル=る
レ=れ
ロ=ろ
ワ=わ
ヲ=を
ン=ん
ァ=ぁ
ィ=ぃ
ゥ=ぅ
ェ=ぇ
ォ=ぉ
ャ=ゃ
ュ=ゅ
ョ=ょ
ッ=っ


ErikPshat 13.05.2014 20:49

riku.kh3, а если поточнее разложить по байтам? (скриншот хекса навиду)

Цитата:

Сообщение от riku.kh3 (Сообщение 1086944)
и движок игры 'конвертирует' эти символы на лету в двухбайтные:

Не совсем так. То, что движок игры конвертирует, мы как раз наглядно видим в хексе из дампа памяти.

riku.kh3 13.05.2014 20:50

Это:
Код:

「部活ニモ入ラず無駄ニ鍛エ上げラレタ筋肉ヲここぞトばカリニ見セツケテヤがル…」
「 = A2
部 = 9594
ニ = C6
モ = D3
入 = 93FC
ラ = D7
ず = 82B8
無 = 96B3
駄 = 91CA
ニ = C6


Движок игры превращает и выводит на экран в это:
Код:

「部活にも入らず無駄に鍛え上げられた筋肉をここぞとばかりに見せつけてやがる…」
Это, по-сути, ненужная рутина, цель которой уменьшить размер каждой фразы в байтах. Я над ней особо не задумывался. Хотя может именно из-за нее и происходят крэши. :scratch_one-s_head:

ErikPshat 13.05.2014 20:54

Цитата:

Сообщение от riku.kh3 (Сообщение 1086947)
Хотя может именно из-за нее и происходят крэши.

Вот это я и хочу выяснить...

Кстати, текст из конвертера можно сохранять в текстовые файлы Shift-JIS и потом проверить в хексе?
У меня просто конвертер не запускается, там что-то с 4-ой версией фреймворка у меня не так.

riku.kh3 13.05.2014 21:04

Вложений: 1
Если ты про RLPAKTOOL, то там уже встроена эта рутина по конвертированию необходимых ascii символов в то, что на psp фактически выводится на экран. Тут экспортировал текст в shiftjis, правда там мусора много.

ErikPshat 13.05.2014 21:46

riku.kh3, вообщем вывел я все коды символов. Догнал, что текстовой редактор показывает количество байт на символ. По этой функции и определил все коды в хексе.

В твоём текстовике нашёл ту же фразу и сосчитал так же все коды букв. Дописал их в тот же пост: https://www.pspx.ru/forum/showpost.ph...&postcount=163
Кроче, видно что во что конвертируется.

По ходу конвертер все символы пишет исключительно в 2-байтовой кодировке. А вот PSP в память складывает узкие символы из 1-байтовой кодировки, а широкие символы оставляет те же 2-байтные.

riku.kh3 13.05.2014 22:08

ErikPshat, да все так. Суть всей этой кутерьмы в том, что часть наиболее часто используемых символов слоговой азбуки в игровом скрипте заменили на однобайтовые, причем реализовано это на движке игры (в ps2 и ps3 версии этой игры все так же, и сам шрифт там другой) и они выводятся на экран в другом виде. Это помогает сэкономить несколько байт на каждой фразе (там кстати физический лимит поинтера 255 байт на каждую фразу). Если проводить аналогию на привычных вещах, то автоконвертер транслита на русский.. что-то в подобном духе.

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

По сути, можно взять и нарисовать русские буковки на другое безопасное место shiftjis'а вместо ненужных символов.. но, опять же, все сводится к ковырянию PGF формата в попытаках найти таблицу длины и ширины каждого символа в пикселях.

ErikPshat 13.05.2014 22:42

riku.kh3, я думаю, что можно перевод сохранить в Win-1251 и шрифт использовать обычный свой или переименовать ltn0.pgf в jpn0.pgf. И должно всё выводится.

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

Скорее всего присутствует баг в самом конвертере. Ведь программный код и текст находятся в одном файле. Если делать перевод и пытаться сохранить текст вместе с программным кодом в какой-либо кодировке, то конечно программный код тоже перекодируется в другую кодировку. Поэтому можно только конвертировать текстовую секцию, но программный код трогать нельзя.



А я чую, что там в тексте как раз присутствуют программные коды, например видел скобки {}, доллары $, буквы S, прямо посреди текста.
Дело в том, что даже если ты видишь на экране те же символы, то даже при перекодировке из shiftjis в тот же самый shiftjis, ты будешь на экране видеть всё те же символы. А на самом деле, в хексе, ты увидишь уже вместо программного кода уже другие цифры, хотя в текстовике для твоих глаз будут отображаться всё те же скобки {}, доллары $, буквы S.
Так что нужно проконтролировать этот момент.

Цитата:

Сообщение от ErikPshat (Сообщение 1086955)
По сути, можно взять и нарисовать русские буковки на другое безопасное место shiftjis'а вместо ненужных символов.. но, опять же, все сводится к ковырянию PGF формата в попытаках найти таблицу длины и ширины каждого символа в пикселях.

Нет, длина и ширина находятся как раз в самом шрифте. Можно просто копирнуть весь русский алфавит вместо японского, который используется в игре по номерам 82A8 (Ё) по 82FF - этого диапазона хватит выше крыши для кириллицы. А я видел, что японский алфавит вообще уходит за пределы 9600.

И вообще можно удалить все остальные шрифты, тогда твой PGF будет весить всего 128 байт )))
А сейчас я смотрю твой шрифт, так он весит почти мегабайт, зачем столько всего в нём.

Цитата:

Сообщение от riku.kh3 (Сообщение 1086949)
RLPAKTOOL

В исходниках видел файл kanaconv.txt, так вот там и прописывается перенаправление шрифтов.

riku.kh3 13.05.2014 22:51

ErikPshat, RLPAKTOOL очень продуманно устроен. Этот нюанс с конвертированием японских ascii символов, во-первых, там внедрен исключительно только для отображения: чтобы было удобно читать когда переводишь (то есть в одну сторону), и, во-вторых, только для определенных символов, а не на все подряд. То есть он никак не может тут вредить.

Или может ты посмотрел исходники и увидел там код конвертирования в shiftjis? Он там нужен был автору только для конвертирования своего английского текста.. да, он затрагивает сервисные комманды в тексте и может создавать проблемы... НО! эта фича полностью отключается одной галочкой, и я ей попросту никогда не пользовался. Я просто сразу ввожу нужный мне текст в shiftjis без помощи каких-либо конвертеров.

То есть проблема крэшей все-равно так и не раскрыта.

riku.kh3 добавил 13.05.2014 в 22:51
Цитата:

Сообщение от ErikPshat (Сообщение 1086957)
Нет, длина и ширина находятся как раз в самом шрифте. Можно просто копирнуть весь русский алфавит вместо японского, который используется в игре по номерам 82A8 (Ё) по 82FF - этого диапазона хватит выше крыши для кириллицы. А я видел, что японский алфавит вообще уходит за пределы 9600.

Просто попробуй. Возьми тот скрин выше что ты выкладывал, и попробуй перерисовать хоть один символ так, чтобы он занимал меньше по ширине. Да, в TTF это будет работать, но после конвертирования в PGF - гарантирую, места он будет занимать ровно столько же сколько и оригинальный символ. Причем shiftjis иероглифы не моноширинные (то есть они не все одинаковой фиксированной ширины в пикселях).

ErikPshat 13.05.2014 23:10

Цитата:

Сообщение от riku.kh3 (Сообщение 1086958)
Просто попробуй. Возьми тот скрин выше что ты выкладывал, и попробуй перерисовать хоть один символ так, чтобы он занимал меньше по ширине.

Я просто буквы скопирую вместе с их родными данными в позицию 82А8.
Обрати внимание на скрин выше, там на скрине видно окошечко под названием Gliph Properties и в этом окошечке задаются все параметры шрифта. Так же, у шрифта не может быть строго закреплённой ширины и высоты, там указывается от и до. Всё аналогично, как в любом другом шрифте, пусть это shift-jis, пусть utf-8, от названия суть не меняется.

Другое дело, как ты будешь портировать буквы в тексте, менять их код? В программе для этого есть какие-то кнопочки?
Хорошо, если в проге можно только видеть текст наглядно, но на самом деле, чтобы буквы имели другой, необходимый тебе код.
Никак не пойму, почему прога у меня на XP SP3 не запускается.

riku.kh3 13.05.2014 23:23

Цитата:

Сообщение от ErikPshat (Сообщение 1086960)
Я просто буквы скопирую вместе с их родными данными в позицию 82А8.
Обрати внимание на скрин выше, там на скрине видно окошечко под названием Gliph Properties и в этом окошечке задаются все параметры шрифта. Так же, у шрифта не может быть строго закреплённой ширины и высоты, там указывается от и до. Всё аналогично, как в любом другом шрифте, пусть это shift-jis, пусть utf-8, от названия суть не меняется.

Для TTF - все именно так, все работает и у меня это получалось, конечно же. В TTF свободно играться шириной буковок не проблема. После конвертирования в PGF - происходит совершенно другая история.


Цитата:

Сообщение от ErikPshat (Сообщение 1086960)
Другое дело, как ты будешь портировать буквы в тексте, менять их код? В программе для этого есть какие-то кнопочки?
Хорошо, если в проге можно только видеть текст наглядно, но на самом деле, чтобы буквы имели другой, необходимый тебе код.

Там в коде есть функция похожая по конвертированию английских ascii буковок, только если подправить в исходниках эту функцию под себя.

Приложил модифицированный скрипт, там только самая первая фраза заменена на ту, что в 100% вызывает крэш. Если есть желание сдампить память и поизучать что же с ней не так - пожалуйста.

ErikPshat 13.05.2014 23:24

Кстати, дай мне нормальный шрифт TTF, который ты собираешься использовать. А то тот, что у тебя в архиве, какой-то по-моему кривой. Или его использовать?

И это, есть возможность вытащить расжатый скриптпак?

riku.kh3 13.05.2014 23:38

Цитата:

Сообщение от ErikPshat (Сообщение 1086962)
Кстати, дай мне нормальный шрифт TTF, который ты собираешься использовать. А то тот, что у тебя в архиве, какой-то по-моему кривой. Или его использовать?

Да нету у меня нормального, там во всех русские буковки такие небрежные. Только если из русского шрифта перетащить.

Цитата:

Сообщение от ErikPshat (Сообщение 1086962)
И это, есть возможность вытащить расжатый скриптпак?

Нет.

ErikPshat 14.05.2014 00:36

riku.kh3, ладно, нужно переварить все раскопки и размышления, и ещё поужинать ))). Сегодня ночью думаю потренируюсь со шрифтами и может что-нибудь полезного получится...

Ага, насчёт ширины букв в TTF я соврал. Их же конвертер регулирует TTF2PGF. И кстати, когда я конвертировал свой шрифт обычный Times New Roman, то на PSP в диалогах он выглядел маленьким, наклонным и узким. Скрин на предыдущих страницах, правда без русского и японского алфавита.

Цитата:

Сообщение от riku.kh3 (Сообщение 1086961)
Приложил модифицированный скрипт, там только самая первая фраза заменена на ту, что в 100% вызывает крэш. Если есть желание сдампить память и поизучать что же с ней не так - пожалуйста.

Ну нифига себе только одна фраза :D
Да там всё заменено и повырезано (Replased, Inserted and Deleted) начиная сразу с 4-го программного байта...
Скрин
Сравнение с оригиналом

http://i61.fastpic.ru/big/2014/0514/...080e0d3646.png
Ты хотя бы одну букву измени, чтобы не было смещения символов и сохрани, тогда можно будет и сравнивать )))

riku.kh3 14.05.2014 00:48

Вложений: 1
Цитата:

Сообщение от ErikPshat (Сообщение 1086968)
Ну нифига себе только одна фраза :D
Да там всё заменено и повырезано (Replased, Inserted and Deleted) начиная сразу с 4-го программного байта...

Так да, перепаковывает тулза весь скрипт, поинтеры переставляет и т.п.
Одну букву так просто не изменить, т.к. там некий хитрый binary invert применяется к тексту.

Более наглядный пример для сравнения сделал. Здесь два скрипта: в обоих изменена только первая фраза, один скрипт крэшится на сейве, другой нет. Длина в байтах у фраз одинаковая.

ErikPshat 14.05.2014 01:50

Цитата:

Сообщение от riku.kh3 (Сообщение 1086961)
Приложил модифицированный скрипт, там только самая первая фраза заменена на ту, что в 100% вызывает крэш.

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

Кстати крэша при сохранении не заметил.
Щас потестю эти 2 дампа...


Текущее время: 20:36. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot
PSPx Forum - Сообщество фанатов игровых консолей.