Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Overlord
Зарегистрирован: 29.01.2007 Сообщения: 8
|
Добавлено: Пн Янв 29, 2007 1:58 am Заголовок сообщения: Пойнтеры - великие и ужасные |
|
|
Перевожу игру на SNESе (вернее практически перевел ), да вот только меню вызывает много нехороших чувств и слов . Некоторые пункты меню получаются больше оригинала, что есть очень плохо, думал пойнтеры помогут начитался доков и полез вычислять их, вычислил но в итоге бред какой-то получается .
И кто-нить может нормально объяснить как потом после вычисления эти указатели использовать, куда их вставлять и т.д. Приведу конкретный пример моего меню:
и т.д., т.е. 03h и 08h обозначают кол-во символов которые могут быть в слове. Перед этим текстом идут такие пары ...5x 5x 6x 6x 7x 7x... если их изменить то меняются строки меню, может енто и есть эти самые ужасные пойнтеры . Опять же назад к примеру при переводе получится ...03большая08гора... , т.е. в первом слове места не хватает, а во втором оно есть так вот как его использовать что-бы первое слово нормально написать? |
|
Вернуться к началу |
|
|
gottax
Зарегистрирован: 16.11.2003 Сообщения: 588 Откуда: Курск
|
Добавлено: Пн Янв 29, 2007 8:12 am Заголовок сообщения: |
|
|
Во-первых, напиши название игры. Тогда можно будет сказать точно, что и как.
Во-вторых, ты же сам пишешь:
Цитата: | т.е. 03h и 08h обозначают кол-во символов которые могут быть в слове |
Тогда просто напиши: 07большая04гора.
В-третьих,
Цитата: | Перед этим текстом идут такие пары ...5x 5x 6x 6x 7x 7x... если их изменить то меняются строки меню |
Это, вероятно, младшие байты поинтеров. Правда, из твоих объяснений сложно сделать однозначный вывод. Так что см. п.1. |
|
Вернуться к началу |
|
|
Overlord
Зарегистрирован: 29.01.2007 Сообщения: 8
|
Добавлено: Пн Янв 29, 2007 2:37 pm Заголовок сообщения: |
|
|
Игра под названием "Demon's Crest".
Цитата: | Тогда просто напиши: 07большая04гора. |
Если бы все было так просто я бы так и написал , но если написать 07....04... то получим в р-те что-то очень страшное
большая
ьшая*гора + (куча разных строк)
*-козебряка соответствующая 04h
Т.е. первое слово я могу так написать а второе все-равно начинается с того места где начиналось в английском варианте , да и еще добавляется куча ненужного мусора.
Надеюсь написал понятно |
|
Вернуться к началу |
|
|
gottax
Зарегистрирован: 16.11.2003 Сообщения: 588 Откуда: Курск
|
Добавлено: Пн Янв 29, 2007 6:02 pm Заголовок сообщения: |
|
|
Эй, а версия игры какая?
Тебе точно нужно вычислять указатели? Может ты имеешь в виду находить (т.е. найти адрес, по которому указатель на нужную строку находится в роме)? На SNES указатели относительные. Это значит, что реальный адрес строки состоит из базового адреса + значение указателя.
После того как увеличил длину строки, изменяешь значение найденного указателя по нужному адресу. В итоге игра начинает считывать изменённую тобой строку относительно того значения, которое ты записал в указателе на эту строку. |
|
Вернуться к началу |
|
|
Overlord
Зарегистрирован: 29.01.2007 Сообщения: 8
|
Добавлено: Пн Янв 29, 2007 9:26 pm Заголовок сообщения: |
|
|
Demon's Crest (U) [!]
Короче раньше я пойнтерами НИКОГДА не пользовался (не доводилось ), поэтому мне просто надо найти место для написания слова, как енто сделать я НЕ ЗНАЮ (вернее знаю но не получается) . В доках написано много всего, но когда переходишь к практике то ничего не выходит. Т.е. в моем примере меню состоит из слов Attack Jump и т.д. Смещение у буквы "A" 96DBh (т.е. пойнтер будет 94DB ) у буквы "J" 96E2h (пойнтер 94E2), потом пытаюсь найти таблицу пойнтеров и .... все процесс нахождения закончен из-за невозможности нахождения таких пар байтов
ЗЫ. Может я их не так высчитываю |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Пн Янв 29, 2007 11:28 pm Заголовок сообщения: |
|
|
Помнится, на одном из сайтов magicteam долгое время висел проект перевода этой игры, но потом куда-то исчез. Может быть, Джину есть что сказать по теме. |
|
Вернуться к началу |
|
|
gottax
Зарегистрирован: 16.11.2003 Сообщения: 588 Откуда: Курск
|
Добавлено: Вт Янв 30, 2007 8:52 am Заголовок сообщения: |
|
|
У менюшных строк отсутствует стоп-байт, так что поинтер должен указывать на байт перед ним, чтобы игра могла знать, сколько байт ей считывать в строку. Но относительный поиск ничего не дал. Возможно, указатели разбросаны, а возможно тут более трудный случай. Надо копать глубже.
Кстати, твой способ вычиления указателей (простым отниманием хедера от адреса строки) очень сомнителен. Мне, например, не встречались игры на SNES, в которых значения указателей соответствовали бы этой формуле. Кроме заголовка всегда присутствует ещё какое-то дополнительное смещение относительно реального адреса строки. |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Вт Янв 30, 2007 9:17 am Заголовок сообщения: |
|
|
Да это всё старые доки дезориентируют народ. |
|
Вернуться к началу |
|
|
Гость
|
Добавлено: Вт Янв 30, 2007 11:08 am Заголовок сообщения: |
|
|
АнС писал(а): | Помнится, на одном из сайтов magicteam долгое время висел проект перевода этой игры, но потом куда-то исчез. Может быть, Джину есть что сказать по теме. |
Он и сейчас там висит.
Пойнтеры на текст диалогов находятся по адресу 8C49.
Пойнтеры на текст интро находятся по адресу 1E0200.
Пойнтеры на фразы босса и ещё кого-то мне найти не удалось.
Это было 2 года назад. Думаю, они находятся прямо в программном коде. Чтобы найти их, нужен debug. |
|
Вернуться к началу |
|
|
Djinn RRC2008
Зарегистрирован: 16.03.2004 Сообщения: 633 Откуда: Москва
|
Добавлено: Вт Янв 30, 2007 11:10 am Заголовок сообщения: |
|
|
Что-то форум меня не признал. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Вт Янв 30, 2007 2:06 pm Заголовок сообщения: |
|
|
Djinn писал(а): | Чтобы найти их, нужен debug. |
Совсем необязательно. Четыре раза(Crimsonland, DSA(посвящённые знают ), Pac-Man 2 и Toejam & Earl 2) с таким сталкивался и обходился без дебага. В случае с Кримсой и DSA искал вручную - на поиск одного поинтера уходило ~5 сек(больше на запись ), а в остальных писал прогу для поиска - очень мала вероятность, что сеговский абсолютный четырёхбайтный поинтер(вернее, адрес в команде) будет равен набору каких-нить левых четырёх байт. |
|
Вернуться к началу |
|
|
gottax
Зарегистрирован: 16.11.2003 Сообщения: 588 Откуда: Курск
|
Добавлено: Вт Янв 30, 2007 2:27 pm Заголовок сообщения: |
|
|
HoRRoR, раскрой глаза пошире - это снесовская игра, абсолютных указателей тут и в помине нет. |
|
Вернуться к началу |
|
|
Overlord
Зарегистрирован: 29.01.2007 Сообщения: 8
|
Добавлено: Вт Янв 30, 2007 3:10 pm Заголовок сообщения: |
|
|
Цитата: | Да это всё старые доки дезориентируют народ |
удалить надо эту дезу
Цитата: | Пойнтеры на текст интро находятся по адресу 1E0200. |
Пойнтеров там быть не может, т.к. там сам текст интро идет! Да и при переводе интро пойнтеры не нужны там места хватит на 2 таких интро :D
Цитата: | Кстати, твой способ вычиления указателей (простым отниманием хедера от адреса строки) очень сомнителен. |
Тогда объясните нормальным языком как их вычислять
Читал доки про пойнтеры на инглише, там тоже через отнимание хедера и т.д., правда пару раз встречал что там надо было еще что-то добавлять, считать... короче что-то непонятное |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Вт Янв 30, 2007 3:15 pm Заголовок сообщения: |
|
|
gottax писал(а): | HoRRoR, раскрой глаза пошире - это снесовская игра, абсолютных указателей тут и в помине нет. |
А почему они должны быть абсолютные? С относительными это тоже спокойно проходит(DSA - относительные двухбайтовые, Crimsonland - размер не помню, но относительные). |
|
Вернуться к началу |
|
|
Djinn RRC2008
Зарегистрирован: 16.03.2004 Сообщения: 633 Откуда: Москва
|
Добавлено: Вт Янв 30, 2007 5:14 pm Заголовок сообщения: |
|
|
Overlord писал(а): | Пойнтеров там быть не может, т.к. там сам текст интро идет! Да и при переводе интро пойнтеры не нужны там места хватит на 2 таких интро
|
Нужны там пойнтери или нет, но в моём роме они именно там. Возможно у тебя ром без заголовка. У меня текст интро начинается с адреса 1E0284 - как раз после таблицы пойнтеров.
HoRRoR писал(а): | Совсем необязательно. Четыре раза(Crimsonland, DSA(посвящённые знают ), Pac-Man 2 и Toejam & Earl 2) с таким сталкивался и обходился без дебага. В случае с Кримсой и DSA искал вручную - на поиск одного поинтера уходило ~5 сек(больше на запись ), а в остальных писал прогу для поиска - очень мала вероятность, что сеговский абсолютный четырёхбайтный поинтер(вернее, адрес в команде) будет равен набору каких-нить левых четырёх байт. |
Я разбираюсь в пойнтерах, и знаю как их искать. На тот момент найти их мне не удалось. Сейчас может и удастся, если время на эту игрушку найдётся. Мне кажется, без дебага там не обойтись. Попробуй, если хочешь. Кстати, в этой игре они двухбайтовые. |
|
Вернуться к началу |
|
|
gottax
Зарегистрирован: 16.11.2003 Сообщения: 588 Откуда: Курск
|
Добавлено: Вт Янв 30, 2007 5:44 pm Заголовок сообщения: |
|
|
Overlord писал(а): | Тогда объясните нормальным языком как их вычислять
Читал доки про пойнтеры на инглише, там тоже через отнимание хедера и т.д., правда пару раз встречал что там надо было еще что-то добавлять, считать... короче что-то непонятное |
Суть одна: простого и общего для всех случаев способа поиска указателей нет. Но в большинстве случаев значение поинтера будет содержать в себе как минимум младший адрес строки. Этим и можно воспользоваться.
В общем случае (не прибегая к дебагу) алгоритм поиска указателей следующий:
Например, если у тебя строка начинается с адреса 14638Ah, то двухбайтный указатель будет иметь вид 8Aххh. То есть тебе будет известен первый байт каждого поинтера в таблице поинтеров. (Например, цепочка вида 8A*9D*A3*C7*E9*FC, где * - неизвестный байт). Теперь с помощью любой программы, умеющей выполнять относительный поиск по цепочке байтов с неизвестными байтами, найди все встречающиеся комбинации. Обычно, если ты ищешь по четырём-пяти байтам, то найдётся всего одна такая цепочка, она и будет искомой.
Всё это справедливо лишь для случая, когда указатели сведены в таблицу и идут друг за другом в порядке следования строк. Т. е. не для твоего случая.
HoRRoR писал(а): | А почему они должны быть абсолютные? С относительными это тоже спокойно проходит(DSA - относительные двухбайтовые, Crimsonland - размер не помню, но относительные). |
Ой ли? Может, и пройдёт, но времени на это ты угрохаешь предостаточно. Если быстрый поиск по ближайшим соседним адресам ничего не дал, то все остальные попытки найти методом тыка бессмыслены. Или как минимум нерациональны. Конечно, фактор везения нельзя исключать. Но тогда нужно быть очень везучим. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Вт Янв 30, 2007 5:57 pm Заголовок сообщения: |
|
|
Djinn писал(а): | Я разбираюсь в пойнтерах, и знаю как их искать. На тот момент найти их мне не удалось. Сейчас может и удастся, если время на эту игрушку найдётся. Мне кажется, без дебага там не обойтись. Попробуй, если хочешь. Кстати, в этой игре они двухбайтовые. |
Всегда обходился без дебагга, т.к. не знаю асма
Поищу, но не сегодня.
gottax писал(а): | Ой ли? Может, и пройдёт, но времени на это ты угрохаешь предостаточно. Если быстрый поиск по ближайшим соседним адресам ничего не дал, то все остальные попытки найти методом тыка бессмыслены. Или как минимум нерациональны. Конечно, фактор везения нельзя исключать. Но тогда нужно быть очень везучим. |
Всегда проходило(кста, вспомнил, в EarthBound тоже такая фигня была с указателями на строки тайлов), и времени не так уж и много надо(уж точно меньше, чем на дебаггинг), и почему это методом тыка? Узнаёшь разницу смещений и порядок. Обычно есть от одного до трёх мест концентрации кодов с указателями, в них и надо искать. Уделил полчаса на прогу и готово. Можно и вручную(по лени своей так частенько делаю), если текста не так много.
Выходит, я сверхвезучий. |
|
Вернуться к началу |
|
|
Overlord
Зарегистрирован: 29.01.2007 Сообщения: 8
|
Добавлено: Вт Янв 30, 2007 8:54 pm Заголовок сообщения: |
|
|
Всем пасиб за ответы пошел я мучаться может что-нибудь получится
Если на работу раньше времени не вызовут может попробую дебаггер поюзать |
|
Вернуться к началу |
|
|
Overlord
Зарегистрирован: 29.01.2007 Сообщения: 8
|
Добавлено: Ср Янв 31, 2007 11:51 pm Заголовок сообщения: |
|
|
Посмотрел переводы игры на другие языки (немецкий, испанский и т.д.), и те же проблемы никто не смог увеличить длину строк меню и названий предметов в магазинах, или оставлены английские названия или же сделаны сокращения |
|
Вернуться к началу |
|
|
evgeny RRC2008
Зарегистрирован: 08.02.2006 Сообщения: 188
|
Добавлено: Чт Фев 01, 2007 2:46 pm Заголовок сообщения: |
|
|
Не надо на других ориентироваться. Например, в "Утиных Историях" на Денди в главном меню тоже ни в одном из переводов длинна стороки и(/либо) координаты курсора не изменены, а я заменил, и еще много чего по-своему сделал. |
|
Вернуться к началу |
|
|
Overlord
Зарегистрирован: 29.01.2007 Сообщения: 8
|
Добавлено: Чт Фев 01, 2007 6:05 pm Заголовок сообщения: |
|
|
evgeny писал(а): | Не надо на других ориентироваться ... и еще много чего по-своему сделал. |
Понимаешь я на других не ориентируюсь, я лишь констатирую факты. А вообще попробой измени меню настроек в данной игре. Если сможешь скажу тебе "большое спасибо" .
Последний раз редактировалось: Overlord (Чт Фев 01, 2007 11:43 pm), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
gottax
Зарегистрирован: 16.11.2003 Сообщения: 588 Откуда: Курск
|
Добавлено: Чт Фев 01, 2007 7:53 pm Заголовок сообщения: |
|
|
Поинтеры на меню в магазинах есть. Названия предметов в этих меню можно увеличить, просто надо сдвигать и все управляющие байты в этих пунктах. Например: на меню по адресу 28A42h указывает поинтер (8842h), находящийся по адресу 8C6Eh. Следующее за ним меню лежит по адресу 28AA0h, поинтер (88A0h) - 8C70h. Ты можешь увеличивать длину названий предметов в каждом меню, только не забывай сдвигать управляющие байты, и после того как переведёшь первое меню, не забудь поменять поинтер для следующего.
Гораздо проще будет это делать не вручную, а прогой, вытаскивающей/записывающей текст по поинтерам. Например, прогой от Джина или моей. Тогда будет достаточно указать границы для таблицы поинтеров и текста, не заморачиваясь с перестановками кусков текста и кода. |
|
Вернуться к началу |
|
|
Overlord
Зарегистрирован: 29.01.2007 Сообщения: 8
|
Добавлено: Чт Фев 01, 2007 10:10 pm Заголовок сообщения: |
|
|
Ок, пасиб сейчас гляну :wink:
Глянул, всё гуд. Только вот придется мне перерисовать часть букв алфавита т.к. раньше я предметы в магазинах не трогал, а переводил только тексты диалогов неписей и все было хорошо, а вот сейчас попробовал и оказалось что коды некоторых моих руских букв соответствуют спец. кодам меню (перенос строк и т.д.). |
|
Вернуться к началу |
|
|
Stealth
Зарегистрирован: 21.11.2008 Сообщения: 139 Откуда: Петербург
|
Добавлено: Вт Янв 20, 2009 1:35 am Заголовок сообщения: |
|
|
Кто-нибудь вычислял пойнтеры для Pokemon Sapphire? Я уже себе мозг сломал; подозреваю, что в них 4 байта:
|
|
Вернуться к началу |
|
|
Djinn RRC2008
Зарегистрирован: 16.03.2004 Сообщения: 633 Откуда: Москва
|
Добавлено: Вт Янв 20, 2009 8:18 am Заголовок сообщения: |
|
|
Stealth писал(а): | Кто-нибудь вычислял пойнтеры для Pokemon Sapphire? Я уже себе мозг сломал; подозреваю, что в них 4 байта:
|
Ну и чего тут вычислять? Стандартные гбашные пойнтеры. Вычислять их вообще не надо - они абсолютные. |
|
Вернуться к началу |
|
|
|