Chief-NET

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Chief-NET » Переводы » Phantom 2040 (SNES)


Phantom 2040 (SNES)

Сообщений 1 страница 100 из 319

1

http://tvconsoles.ru/photo-small/kartridzh_dlya_sega_phantom_2040_kod_tovara_20382.jpg
Решил создать темку.
Алекс, нужна твоя помощь. Выбрал версию для СНЕС, так ты в этой платформе хорошо разбираешься. На СЕГЕ вообще и текст пожат и графика.
Помоги найти графику на скриншоте во вложении (титульник), плюс шрифт которым выводится надпись на втором скрине.
В идеале нужен пакер-анпакер.

Отредактировано Mefistotel (2012-02-07 14:43:29)

2

Ром без хедера (U) (европейский ром не смотрел, что первое подвернулось, то и описываю)

"PHANTOM 2040":
Шрифт - 0x33C17, 2bpp(GB), странно, что ты сам его не нашел.
таблица DTE - 0x31B27
source "PHANTOM 2040" - 0x59120 - сам разберёшься?

титульник:
шрифт - 0x8650A
графика запакована, пакер/анпакер нужно будет подождать
данные графики заставки начинаются где-то тут - 0x1AD348

Отредактировано alex_231 (2012-02-09 07:45:18)

3

"Эй, кто-нибудь дома?
...
Я спрашиваю: "Эй, кто-нибудь дома?"

Разобрался в алгоритме, нарисовал блок-схему процесса, к понедельнику попробую анпакер написать.

4

Блин, почему-то форум не выявил нового сообщения в этой теме. :)
Ром:Phantom 2040 (U).smc.
По поводу шрифта. Действительно затупил. У меня записан адрес шрифта 0x344f7, но это нижний, а вот верхний вылетел.

source "PHANTOM 2040" - 0x59120 - сам разберёшься?

Разберусь, если будет пакер и анпакер.

5

Алекс, таблица что ниже шрифта для фрагментов, выделенных рамкой?

6

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

Разберусь, если будет пакер и анпакер.


Пакер/анпакер нужен только для графики, к тексту он отношения не имеет.

Под словом source я имел в виду исходные данные, по которым строится надпись.

Отредактировано alex_231 (2012-02-11 10:56:08)

7

Теперь понятно.
Игрушка  довольно запутанная с кучей концовок.

8

Анпакер готов. А вот пакера придется с неделю ждать - по будням писать - особо времени нет, да и алгоритм там будь здоров, не то, что в CT или BL.

9

Хорошо, подожду. А что за алгоритм, если не секрет?

10

Ну что-то немного (совсем чуть-чуть) напоминающее LZ, только с здоровенным ветвлением, так, что во флаговых байтах одному копированию последовательности может соответствовать до 11! флаговых бит, а минимально - 1 нолевой бит означает копирование 1 байта из рома, но это проще нарисовать, чем описывать.

11

Саня, не забыл про меня? :)

12

"Неделю, не меньше!"

Вот как-то так :)

13

Пакер готов, по крайней мере игра понимает, что он ей подсовывает :)
Однако с оптимальностью пока засада, если сравнивать с оригиналом, то соотношение составляет где-то 103-104% от оригинального пакета из РОМа, т.е. шанс того, что после перерисовки пакет не поместится в отведенное место очень велика, если только не извращаться подобным образом:

Отредактировано alex_231 (2012-02-18 10:26:50)

14

Выложи сырцы к пакеру. Может, у Джина получится допилить код, чтобы улучшить оптимизацию сжатия.
Жалко, что в роме места свободного почти нет. На крайняк можно ром расширить.

15

Без понимания алгоритма сжатия ему будет сложно ориентироваться по коду, нужно сначала описать алгоритм, а потом уже смотреть.

16

Понятно. Выложи сорцы, готовую прогу пакер/анпакер и адрес пакета в роме.

17

Вот, адрес пакета в проге указан (в memo)

18

Алекс, помоги найти текст сюжетной линии игры.

19

Хех, мало того, что там МТЕ, так он еще и пожат :)

Причем не так, как графика, отсюда вывод: нужно писать анпакер.
Как говорится: "ждёмс".

20

Чувствовал недоброе. А плагин к круптару не можешь написать? Или расширить ром, убра мте и сжатик. Интро все равно надо будет делать.

21

Не, я с Круптаром не работаю.
Расширить LoROM вряд ли получится.
И убирать сжатие из-за этого не следует.

22

Тогда нужна вставлялка и вынималка для текста, чтобы с указателями работала. :)

Отредактировано Mefistotel (2012-03-21 05:25:54)

23

Для начала нужно декомпрессор написать, а потом результат можно будет и круптаром обрабатывать (наверно :) )

24

Я то думал об этом. Но если круптару кормить, то надо в одном блоке и текст и указатели.

25

Не обязательно. Я как делал - просто сшивал 2 файла с указателями и с текстом в один файл, переводил, а потом опять их разбирал на 2 файла...

26

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

27

Хех, вон оно как :D
Я на неделю уезжаю, поэтому распаковщиком займусь немного попозже.
Буду пока дальше Лагуну тестить.

28

Ну что там, Санёк? :) Я скоро лагуну всю пройду уже)

29

Да пока со скрипом, я нашел начало пакета, нашел код декомпрессора в игре, но разобраться пока не могу - нужно разом большой период времени выделить, иначе (частями) у меня не получается отследить логику обработки данных: первые 17 байт пакета, по-видимому, содержат данные разметки пакета или что-то подобное, потому что распаковка начинается с 18-го и вот эти 17 не могу понять пока.

30

Небольшой прогресс: по тем 17-ти байтам строятся 2 таблицы соответствий и смещений, по которым производится копирование основных данных пакета.
Теперь нужно отследить всю программу построения таблиц.

31

Это уже радует. yess1

32

Сделал лог программы распаковки, теперь буду изучать :)

Кому интересно:

Отредактировано alex_231 (2012-05-05 15:42:42)

33

По выложенному выше написал анпакер (вернее попытался), но что-то не сходится: или код не полностью отследил, или при переводе накосячил. Без глубокого изучения ничего не получится :(

P.S.: прога получилась - помесь "бульдога с носорогом" - часть кода повторяет SNES-овский асм, часть - оптимизирована под паскаль.

34

Жесть. :(
А расширить ром и перенести распакованный текст в конец с заменой процедуры распаковки возможно?

35

Повторюсь: у нас LoROM размером 2Mb, как такое расширять я не знаю, потому что адресация заканчивается $BFFFFF, и при увеличении рома то, что свыше 2Mb в память не попадает.

36

Остаётся только трудный путь?

37

Перечитай наши подписи и всё встанет на свои места :)

Отредактировано alex_231 (2012-05-08 11:58:19)

38

Я решительно ничего не понимаю. Пока пошагово отслеживаю работу программы всё совпадает с оригиналом в эмуляторе (больше 160 байт распакованного пакета), стоит отпустить отладчик и дать программе свободно исполняться, начинаются такие глюки, что страшно становится.

Отредактировано alex_231 (2012-05-08 18:19:54)

39

Фух, декомпрессор работает, правда как он работает я так и не понимаю ;)
Однако, до того как думать о компрессии нужно разобраться, как быть с переводом того, что получается после декомпрессии. Я уже вроде писал, что здесь используется система событий подобная Final Fantasy Adventure, однако про поинтеры пока ничего не ясно да и их здесь вообще может не быть. Нужно полностью изучить скрипт обработки событий, чтобы можно было менять длину предложений.

40

Немного покопавшись в пакете выяснил, что текст выводится по коду &0810, со стопбайтом &00, плюс перед этим всем стоит код вида &XX00, определяющий параметры вывода текста (количество и положение строк как минимум).

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

Так что, прийдется разбираться в алгоритме раньше, чем предполагалось :(

41

Так, я разобрался что делают все пять подпрограмм, правда как они это делают понятно пока только в трёх:
1. сдвигает флаговые байты на заданное аккумулятором количество бит, + грузит из рома новое значение аккумулятора.
2. строит таблицы смещений для двух режимов копирования - из рома и из распакованных данных (как пока не разобрался).
3. в зависимости от входного Y определяет смещение для копирования из распакованных данных или количество байт для копирования (из рома или из распаковки) (тоже пока не разобрался).
4. записывает значение аккумулятора в распаковку как 2 байта - это просто ;)
5. тоже, что и 4, но 1 байт.

Основная логика распаковки заключена в подпрограмме 3, так как основа программы просто циклично повторяет её с тремя разными Y (32, 160, 288) попеременно, и записывает результаты подпрограммами 4 и 5.

Однако для полного понимания алгоритма нужно разобраться в таблицах смещений второй подпрограммы.

42

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

43

Надеюсь и верю.:)

44

Я тоже, я тоже...

45

Так, в алгоритме третьей подпрограммы я, вроде, разобрался, даже могу немного сам расчитывать значения флаговых битов по смещению и количеству байт для копирования. Попробую написать пакер без учета второй подпрограммы, просто копируя исходные данные по таблицам смещений из начала пакета в роме (только пока не ясно, как определять их размер, но, думаю, должно получиться).

46

Хотя нет, :( не получится: сразу за данными таблиц идет последовательность из 16 бит (не обязательно в два байта, может быть и в три, если последовательность начинается не с начала флаговых байтов), которая определяет количество повторений основного цикла (того, в котором третья подпрограмма повторяется по три раза за цикл), а это значит, что заранее узнать какое значение записывать в эти  флаговые байты не получится (да и само расположение второй половины последовательности может меняться), так как количество повторений вычислится только после запаковки пакета.

47

Хе-хе-хе, обратные подпрограммы 1 и 2 написаны и работают: заголовок пакета генерируется нормально, теперь нужно решить, как оставить место под счетчик основного цикла и можно будет браться за обратную подпрограмму 3 (4 и 5 простые, так что я на них даже напрягаться не буду :) )

48

Крутяк. Какой алшоритм для сжатия текста используется, кроме МТЕ?

49

Никакого, после распаковки пакета событий весь текст в нем можно увидеть применив таблицу МТЕ.

50

Потратив полдня на отладку, я получил таки рабочий алгоритм, правда отпускать его, думаю, пока рано, хоть он и делает 2-3 цикла выдавая на выходе данные идентичные оригинальному пакету, за ним еще следует последить (да и запись счетчика еще нужно дописать). Скоро уже закончу.

P.S.: Mefistotel, ответь в ЛС.

51

Да, был прав... Всё работает нормально, за исключением случаев, когда флаговые байты должны записываться за копируемыми из рома, а они пишутся перед ними :'( такая проблема была и с предыдущим пакером, буду дальше ковыряться, может пойму, где косяк.

52

Еще полдня экспериментов принесли плоды: пакер работает, правда с эффективностью пока проблемы, но это решаемо, главное - он сжимает по правилам, так, что анпакер всё обратно распаковывает.
Фух, умаялся...

53

:blink:  я в недоумении... Пакер работает лучше анпакера: после пробы пакета, запакованного пакером, помещенного на место оригинального в роме выявлена проблемка - при работе с оригинальным ромом данные, распакованные анпакером, не совпадают с данными распаованными игрой, однако, данные, запакованные пакером, после распаковки игрой, совпадают с теми, которые запаковывались пакером. Во как, по неисправному анпакеру был написан исправный пакер.
Буду теперь анпакер пытать...

54

Хех, всего-то надо было один мелкий недочет поправить и анпакер заработал как надо :) осталось довести до ума пакер и можно переключаться на работу с текстом.

55

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

56

Есть же вероятность, что русский текст будет меньше английского. А если нет, то придётся сделать так. :)

57

Вероятность, конечно, есть, только вот еще нужно научиться укорачивать строки (да и вообще разобраться с командами событий), а то я пока определил несколько (два ;) ) управляющих байт, отвечающих за вывод текста (да и то не полностью).

58

Не, с командами событий разбираться не придется, оказывается разметка (поинтеры) пакетов событий находятся не в пакетах, а в роме :blink: так что теперь нужно просто найти всё пакеты и поинтеры и можно будет вытаскивать текст (ну и писать скриптер, учитывающий длину строк в пакет и в ром. Да такого еще не было, чтобы скриптер работал с двумя файлами и сохранял смещения текста в оба, причем по-разному: в ром поинтеры на блоки событий, в пакет смещения строк (однобайтовые относительно начала строки) предстоит немало попотеть  Sman

59

Решил разбить работу на два этапа:
1. Распознавание данных и их извлечение в текстовый файл (машинный скрипт)
2. Применение таблицы МТЕ к машинному скрипту и получение игрового текста (скрипт для перевода)

Возврат текста будет происходить аналогично, двумя этапами в обратной последовательности:
1. (3) Применение таблицы МТЕ к скрипту (тексту) и генерация машинного скрипта
2. (4) Вставка машинного скрипта в пакеты (с параллельным расчетом поинтеров и записью их в ром)

Причем программку для распознавания (пункт 1) я уже наваял, работает четко и быстро, аж сам не ожидал, думал, будет глючить нещадно, но нет.

60

Применялка МТЕ тоже готова, можно заниматься поиском пакетов и поинтеров ;)

61

Э-э-э... Однако, во время поисков (распределения, они там все толпой лежат, нужно только понять, какой куда) поинтеров обнаружилось, что поинтеры на события содержат и ссылки на пакеты, в которые запакованы эти события, то есть, зная поинтер события, можно его (событие) найти без дополнительных вычислений. Нужно теперь поправить скриптер-распознаватель (тот, который из первого пункта) и весь скрипт разом сдампить, ну или двумя-тремя - таблица поинтеров разбита на блоки отделяющиеся пустыми последовательностями 00-байт.

62

Собственно, скрипт вынут, больше пока не нашел.
Структура: Блоки состоят из строк, каждая строка выводится отдельной командой, поэтому, чтобы удлиннить или укоротить предложение (изменить количество строк)  нужно добавить/убрать строку текста до строки "EOL" (конец вывода предложения). "EOL" используется для определения количества строк на странице (после "EOL" обыяно идет код стирания текста, либо смены страницы).
Пустые блоки содержат лишь голый код без текста, их трогать не нужно.
Дублирующиеся блоки - на самом деле один и тот же блок использованный многократно (их там немало таких).
Можешь браться за перевод, а я пока возвращалку напишу, да попробую придумать, как текст поделить между пакетами, чтобы сжать поэффективней.

Отредактировано alex_231 (2012-07-06 21:08:23)

63

Отлично. :)

Дублирующиеся блоки - на самом деле один и тот же блок использованный многократно (их там немало таких).

Их можно переводить по-разному для разнообразия перевода или нет?

64

Не желательно, хотя возможно, однако в итоге может не поместиться в исходный размер (а про расширение я уже говорил) :( .

65

Алгоритм возвращалки готов и работает, только его теперь нужно как-то привязать к рому, но для этого нужно определиться с тем, какие блоки в какие пакеты будут записываться. Самое сложное в этом распределении то, что блоки поинтеров побиты на разные части, которые совсем не совпадают по размеру с пакетами (эдакий пазл получается) да ещё блоки повторяются в разных скриптах и надо как-то это учесть. Конечно если всё вручную отслеживать, то проблем не будет, но времени на это уйдет немерено.

Хотя можно в машинном скрипте сделать привязку блока к пакету (только что придумал) и тогда останется только с повторялками разобраться (видимо всё-таки вручную).

66

Санек, чему равно максимальное количество символов в строке?  30?
И кто текст вставлять будет? Привычнее мне бы было самому.  :rolleyes:
P. S. Эх, сто лет не переводил текст. Надеюсь, вы мне поможете не напороть чепухи с временами. Пересмотрел все русские серии фантома и теперь более-менее в курсе вселенной.

Отредактировано Mefistotel (2012-07-26 16:36:26)

67

Да, 30, но иногда 31, однако максимально возможная длина - 32, но при условии сдвига координаты на 0, но лучше его не использовать, а делать 31.

Вставку буду делать сам, но если смогу упростить процесс, то передам тебе.

68

ОК.
Перевожу в RJ TEXT ED. Отличный редактор, поддерживающий двухоконный режим.
Текст ужасный.  В результате чего русский перевод будет куда больше английского...
Надо думать о расширении рома.
Повествование идёт то от первого, то от третьего лица, как в театре.

69

Печально :(

70

Я сначало переведу, а потом посмотрим.
В скрипте используется байт {21}. Это восклицательный знак. Так и использовать байт или это глюк и можно ставить знак "!"? :)

71

Ай, точно, забыл в таблицу добавить, можешь писать "!" вместо кода.

72

Алекс, достань, пожалуйста, картинки для перерисовки. Сейв для Snes9x  1.43 во вложении.
http://chiefnet.1bb.ru/uploads/chiefnet/post-6-1344287007.png

Отредактировано Mefistotel (2012-08-07 05:07:34)

73

Ок! Вечером гляну.

74

Вот, пока только надпись нашел. Я грешным делом подумал, что она запакована тем же алгоритмом, что и титульник, ан - нет, оказывается алгоритм, которым сжаты пакеты событий также используется и тут :)

75

Ага, вот морда доктора. С ней побыстрее получилось :)

76

Ок.
Помимо восклицательного знака не подключены также и скобки и другое.
(=23
)=24.

77

Вот взрывное устройство запущено (активировано ну никак не влезает)

78

Вот шоу доктора ДЖЕКА, влезло полностью

79

Эх, как же я так...

Надпись норм, пакет вроде помещается в старое место :)

80

А вот шоу не влезает :(

81

Попробую перерисовать, заффффтра...

82

Вложил расширенный ром на 128 кб. Алекс, ты сможешь перенести пакет, чтобы нормально всё выглядело? Это касается и титульного экрана...

83

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

84

На пожатые пакеты какие указатели? Двухбайтовые?

85

Не помню точно, вроде трехбайтовые.

86

Так в чём же проблема перенести пакет в свободное место? Три байта - это же абсолютный указатель.

87

Э, нет, брат, я же писал, что это LoROM, тут адресация по-любому относительная: банкование рома идет по 32 кб через 32 кб, то есть в памяти приставки это выглядит так:
Начиная с адресcа h800000
Блок нулей 32 кб
Блок рома 32 кб
Блок нулей 32 кб
Блок рома 32 кб
Блок нулей 32 кб
и так далее...
Таким образом 2мб рома превращаются в 4мб в памяти, но я пытался грузить расширенный ром и получить доступ к памяти в диапазоне hС00000-hFFFFFF - процессор обращался к памяти из диапазона h800000-hBFFFFF, то есть идет зацикливание памяти и как этого избежать я не знаю :(

Позже: ой наврал, ой наврал, не 64 кб, а 32 :)

Отредактировано alex_231 (2012-08-10 06:59:11)

88

Саня, погляди блок:
[BLOCK 37]
MAD SCIENTIST OR INNOCENT MAN?{00}
ON-LINE: WANTED--JACK ARCHER! {00}
EOL
MAXIMUM, INC. AND SEAN ONE ARE{00}
CREATING A SHIP WITH ENOUGH{00}
FIRE POWER TO LEVEL THE CITY.{00}
THEY'LL USE IT ON THE{00}
POLITICAL SUMMIT.{00}
EOL
PROFESSOR ARCHER'S A PARANOID{00}
FOOL. THE SHIP WILL PROTECT{00}
THE SUMMIT, NOT DESTROY IT.{00}
EOL
WHO'S LYING? I'LL BE THE JUDGE{00}
OF THE THAT!  YOU STAY PLUGGED{00}
IN.{00}
EOL
TIST OR INNOCENT MAN?{00}
EOL
Последняя строка так и должна быть вынута? это огрызок строки:
MAD SCIENTIST OR INNOCENT MAN?{00}
Как переводить в этом случае?
EOL
ЁНЫЙ ИЛИ НЕВИНОВНЫЙ ЧЕЛОВЕК?{00}
EOL
???

89

А этот блок в игре отображается? Может там этой строки вовсе нет? Скриптер может иногда извлекать строки, которые строками не являются, потому что он не просматривает всё команды событий, а лишь ищет код h04 и проверяет минимальный набор условий, чтобы определить выводится ли по этой команде текст или нет. Но ведь может же быть, что сочетание байт удовлетворяющее условиям кодом вывода текста не является. Отсюда ошибочное извлечение строки.
Если же текст в игре всё же выводится, то нужно определиться, с какого места он будет выводиться в переводе и поправить управляющие коды.
А если нет, то исправить машинный скрипт, убрав эту строку из скрипта и добавив в код управляющие байты.

90

Допустим. последняя строка извлечена случайно. Я ее удалил, а что за управляющий байт ставить на ее место?

91

Тебе ничего добавлять не надо, просто ридмик сделай, с номером блока и указанием удаленной строки. Я сам всё сделаю.

92

Ок.

93

В который раз убеждаюсь в своей "ишачности" ;)
Адресация действительно продолжается после xC08000 как и положено, я просто вместо C08011 вводил указатель на адрес C80011 :) вот и глючило по-черному.
Ром можно расширять и пихать в него всё, что угодно.
В следующий раз меня пинайте сильнее, чтобы внимательней был ;)

94

Ну вот. Я так и думал. :)
Ну тогда будь, добр, вставь то, что Гайвер нарисовал в оригинальный ром Phantom 2040 (U).smc. А также вытащи титульник для перерисовки.  ;)
Уж теперь можно развернуться, да и с текстом ограничений быть не должно.)

95

Ага, жутко не хочется мне перерисовывать это опять ;о)))

96

Вставим, не боись ;)
Вот графика титульника.

97

А карта тайлов? Или там тайлы не повторяются и можно без карты обойтись?

98

Гайв, букву Ф нужно сделать, похожей на череп.

99

Да, там без карты тайлов, как и остальное.

100

Осё:


Вы здесь » Chief-NET » Переводы » Phantom 2040 (SNES)