Новости :: Переводы :: Наши проекты :: Документация :: Утилиты :: Ромхакинг :: TAS :: GameFAQs
Гостевая книга :: Форум :: 2RTeam :: CaH4e3 :: Zelda64Rus :: RRC2008 :: О нас
Пойнтеры - это очень полезная, но и достаточно сложная для понимания вещь. Не волнуйтесь. Я постараюсь объяснить ее как можно проще.
Пускай у нас есть РОМ для Super Nintendo (SNES), а в нем такой текст:

0123456789ABCDEF <-Номера байтов (чтобы было удобней считать)

АДРЕС:|	  ТЕКСТ:
======+=================
2F8400| Интересно, а я с
2F8410| могу разобраться
2F8420| в пойнтерах?~Кон
2F8430| ечно сможешь!

   Символ ~ обозначает конец сообщения (в дампах скриптов обычно обозначается <END>). Если вы не знали об этом, то советую сначала прочитать раздел, посвященный созданию таблиц.

   Пойнтер - это два (реже несколько) байтов, которые указывают на адрес, где начинается новое сообщение. В нашем случае первый пойнтер будет указывать на букву "И" в слове "Интересно", а второй пойнтер будет указывать на букву "К" в слове "Конечно". Символ конца сообщения нужен лишь для того, чтобы прекратить его вывод. Если заменить этот байт на какой-нибудь другой, например на обозначающий букву "Ё", то там, где раньше выводилась фраза "Интересно, а я смогу разобраться в пойнтерах?" появится следующий текст: "Интересно, а я смогу разобраться в пойнтерах?ЁКонечно сможешь!". ВАЖНОЕ ЗАМЕЧАНИЕ: пойнтер указывает на первую букву нового сообщения, то есть на следующий после байта "конец сообщения", байт.

   Для начинающих переводчиков, не знающих о пойнтерах, это настоящая головная боль, ведь приходится втискивать все фразы в то место, что было отведено для ее английского варианта. Как, например, вы переведете фразу "What if I'll say no?", без потери смысла 20 символами? Выход один: научиться изменять пойнтеры! А чтобы научиться их менять, нужно знать, как они выглядят.

   Мы рассмотрим только одну, наиболее распространенную систему пересчета пойнтеров, поскольку она самая легкая из всех существующих. Называется она Standart Header. Называется она так потому что при ее вычислении надо знать размер хедера РОМа (хедер - набор байтов, который записывается в начало РОМа и хранит в себе некоторую информацию, нужную для запуска игры в эмуляторе). Размер хедера меняется в зависимости от типа системы. Мы рассмотрим два типа: NES и SNES. Запомните, размер хедера на NES - 10h, а для SNES - 200h. Все! Мы готовы к пересчету пойнтеров!

   Чтобы найти значение пойнтера (мы будем считать его для фразы "Интересно, а я смогу разобраться в пойнтерах?") нужно проделать следующие операции:

  1. Найти начальный адрес : у нас это $2F8400
  2. Отнять 200h (ведь мы переводим игру на SNES!): $2F8200
  3. Взять четыре самых правых значения: 8200
  4. Разделить это число на две пары: 8200 на 82 и 00
  5. Теперь поменять эти пары местами: 82 и 00 на 00 и 82
  6. И соединить пары обратно: 00 и 82 получится 0082
  7. И вот он, ваш пойнтер: 0082

   Мои поздравления! Пока все идет нормально, не так ли? Для закрепления попробуйте найти пойнтер для второй фразы, "Конечно сможешь!". Если у вас получилось число 2D82, то значит вы отлично поняли, что такое пойнтеры, и с чем их едят.

   Теперь нам нужно найти таблицу пойнтеров. Так называется место в РОМе, где кучкуются все пойнтеры игры (точнее не совсем все. Дело в том, что, как вы уже наверное догадались, каждый пойнтер действует только в пределах 10000h, из-за своей двухбайтной сущности. Это значит, что в данном примере пойнтер потенциально может указывать лишь на тот текст, который находится ТОЛЬКО между адресами $2F0200 и $3001FF (ну, или $2F0000 и $2FFFFF, если считать хедер). Поэтому вы сможете писать строку где угодно, но в указанных пределах. То есть в той таблице, которую мы сейчас найдем, будут находиться пойнтеры тех сообщений, что расположены между адресами $2F0000 и $2FFFFF).

   Способ поиска совсем несложен. Он не всегда работает, но именно он используется в играх наиболее часто. Как правило, таблица пойнтеров находится ПРЯМО перед блоком с сообщениями. Просто проскролльтесь немного верх. Смотрите, видите, как странно ведут себя некоторые байты? Из них, как бы, получается столбик, где они постепенно изменяют свое значение. Это выглядит примерно так:

	   ,--.
	 A3|A2|E9 A2 03 A3 5C A3 78 A3 8A A3 95 A3 BB A3
	 E5|A3|35 A4 65 A4 94 A4 DA A4 F8 A4 16 A5 5C A5
	 7D|A5|CA A5 0F A6 30 A6 4F A6 89 A6 A1 A6 CB A6
	 DF|A6|23 A7 3D A7 63 A7 94 A7 F1 A7 1E A8 4E A8
	 6E|A8|7C A8 CF A8 12 A9 36 A9 6F A9 9D A9 C1 A9
	   `--'

   Смотрим дальше... Потом эта последовательность обрывается:

	 01 01 01 01 05 05 05 05 05 05 05 03 05 05 05 03
	 01[01]01 01 01 01 01 01 01 02 00 03 03 03 03 03
	 00[82]2D 82 5C 82 BD 82 D9 82 30 83 53 83 D1 83
	 FF 83 5E 84 78 84 94 84 CF 84 08 85 27 85 80 85

   В 99% случаев, первым пойнтером будет 00 82.

	 [00]82 2D 82 5C 82 BD 82 D9 82 30 83 53 83 D1 83

   Вот и все! Заметьте, следующий пойнтер указывает точь-в-точь на следующее сообщение. Теперь, в случае необходимости мы сможем, например, немного вылезти за пределы первой фразы, сократив немного вторую... или третью... или какую-нибудь. Главное - изменить пойнтеры так, чтобы в новом, измененном варианте текста они продолжали указывать на первый символ сообщения!

   Не правда ли, довольно несложно?

DimOK, KEN

Ссылками мы не меняемся.
Страница админа
        © 2001-2023 Shedevr Team.