Новости:

01.01.2017: Релиз испанской версии Naruto - Ninja Council (GBA)
02.12.2016: Добавлена документация по Kruptar 7
09.10.2015: Обновление перевода игры Battletoads (NES) [версия 1.3]
22.01.2015: Kruptar Open Source
18.10.2014: Релиз обновлённой русской версии Castlevania - Dawn of Sorrow (GBA) от Owls Group
01.05.2014: Релиз русской версии Taiyou no Yuusha Firebird (NES)
24.06.2012: Добавлена доработанная документация и инструкция
26.05.2012: Обновление ORITON [версия 2.050]
11.05.2012: Обновление ORITON [версия 2.048]
11.03.2012: Обновление Kruptar 7 [версия 7.1.1.17]
29.01.2012: Обновление LZ77Restructor 2 [версия 1.02]
01.01.2012: Релиз русской версии Drill Dozer (GBA)

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

Главное меню

Помощь с круптаром

Автор lupus, 19 июня 2011, 11:37:15

« назад - далее »

0 Пользователи и 4 гостей просматривают эту тему.

Oraculum

Цитата: Anton от 25 марта 2012, 00:01:44так убирать эту хрень (cp1251)?
Так-то да, но можешь ещё таблицу прикрепить, что ясно всё было.

Anton

Убрал... перестал ругаться. Надо же.
(в аттаче все прикреплено (только таблица с cp1251, архив просто уже был со всем барахлом, лень перепаковывать было), но у меня там другие проблемы есть)... некоторые строки текста не отображает.
Хотя визуально все выглядит правильно.

TrickZter, можно тебя попросить очередной раз о помощи?
(Ну или кто-нить еще может добрый поможет? :) )

Игра: Skyward Sword (Wii).
Имеем: проекты к части текстовых файлов, таблицы, плагин (в нем коды, где участвует стоп-байт), - которые мне сделал dnd1, но который очередной раз пропал.
Цель: доделать проекты к остальным файлам (если плагин сделан правильно, и если я пойму принцип)...

Текстовые файлы в формате *.msbt.
Пойнтеры начинаются в блоке TXT2, заканчиваются сразу перед текстом.
После заголовка "TXT2" идут 12 байт, нам не сильно нужные, потом идет 4 байта, указывающих, сколько всего текстовых блоков ("диалогов") в файле (в примере, который в аттаче: 00 00 00 98 (это якобы 152 диалога, так оно и в проекте), Дальше пошел первый пойнтер: 00 00 02 64. Последний: 00 00 0F F0 (?).
Текст в диапазоне 0000FF4-0004CAF.
Смещение, получается, FF4-264=D90.

Судя по тому, что в сделанных проектах, которые даже частично работают, параметры такие:
пойнтеры 4 байтные, интервал=0, shiftLeft=0, Multiply=2, Align=1, Motorola=True, SeekSame=True.

Теперь проблема: открыв проект, видим, например, строку 35 (слово "Saved"). (в строках 38 и 41 похожая проблема, тоже).
После нее идет строка {Tag 426} (это один из управляющих, или как их там, кодов: 00 0E 00 02 00 02 00 04 00 00), в таблице/плагине записан.
Сразу после этого кода идет стоп-байт "00 00", потом перенос "00 0A" (но в круптаре его не показывает - идет сразу следующий блок с текстом: "Are you sure you want to quit?".
Но в оригинальном файле между "Saved" и "Are you sure you want to quit?" есть еще коды, и надписи на кнопках: Save/Save and quit/Cancel ("quit" выделено красным цветом: 000E0000000300020001 quit 000E000000030002FFFF).
А круптар их не показывает...

Пробовал данный файл в игре, практически все нормально работает, но с этими Save/Save and quit/Cancel - косяк.
(Вместо трех кнопок с этими надписями показывает тоже три кнопки, но одна пустая, а на двух других надписи "Yes" и "No" почему-то. (Это даже и не переводя - это просто если пересчитать пойнтеры и вставить в игру).

Мне, собсно, интересно, где ошибка?
В проекте, таблице или плагине?

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

Джинни

Цитата: Anton от 25 марта 2012, 00:44:05Сразу после этого кода идет стоп-байт "00 00", потом перенос "00 0A" (но в круптаре его не показывает - идет сразу следующий блок с текстом: "Are you sure you want to quit?".
На стоп-байте чтение обычно прерывается.

Anton

Цитата: Джинни от 25 марта 2012, 06:30:14На стоп-байте чтение обычно прерывается.
Я это знаю, но стоп-байт присутствует же в других кодах.
Пусть продолжает считывать то, что СРАЗУ за этим стоп-байтом - 00 0A. Но не хочет. Дальше-то диалоги читает, но почему-то пропускает эти вот save/save and quit/cancel.
Пробовал в таблицу записывать и его, сразу за 00 0E 00 02 00 02 00 04 00 00, и последующий 000A, все равно спотыкается.
Т.е. делал и такую строку: 00 0E 00 02 00 02 00 04 00 00 00 00, и такую 00 0E 00 02 00 02 00 04 00 00 00 00 00 0A - не показывает save/save and quit/cancel...
Зато если поставить тупо неправильное смещение, начинает эти строки видеть, но остальное все, естественно, разлазится.

Джинни

Присутствует, не присутствует. Если плагин не определяет, что 0000 является частью другого контрольного кода, то считывание останавливается.

Anton

Ты не мог бы посмотреть приаттаченный выше проект и сказать, где ошибки?
Если в плагине, тогда облом. Но может и не в нем...

Джинни

В том архиве нет исходников плагина.

Anton

У меня их тоже нет. Нельзя просто посмотреть, правильно ли составлен проект/таблица, хотя бы?
Если все правильно - значит ошибка в плагине.
Если нет - укажи ошибки в проекте/таблице.
Если не хочешь смотреть - так и скажи.


Джинни

В таблице встречаются коды с большим количеством нулей. Какие-то из них плагин не учитывает и заканчивает чтение на 0000.

Anton

В данном файле - спотыкается именно на коде 00 0E 00 02 00 02 00 04 00 00 - {Tag 426}.
Дальше-то он читает текст: "Are you sure you want to quit?".
Но перед этим пропускается блок текста с "Save/Save and quit..." ?
(и дальше по файлу, после {Tag 426} - тоже спотыкается).

Это точно ошибка в плагине? Не в таблицах?
Просто в проектах к Wind Waker и Phantom Hourglass, которые тоже делал dnd1, ошибок в плагинах не было, поэтому я и в смущении...

Сам проект правильно составлен? Пойнтеры именно такие, и с такими параметрами, как в проекте?












Джинни

Цитата: Anton от 25 марта 2012, 21:35:21Это точно ошибка в плагине? Не в таблицах?
Точно в плагине.

Anton

Цитата: Джинни от 26 марта 2012, 07:51:00Точно в плагине.

Понятно, спасибо.
Тогда облом пока...

Джинни

Цитата: Джинни от 26 марта 2012, 07:51:00Multiply=2, Align=1,
Кстати, для двухбайтной кодировки нужно ставить Align = 2 (в новой версии этот пункт называется ptCharSize, а Multiply - ptAlignment).

Anton

Цитата: Джинни от 26 марта 2012, 11:31:28Кстати, для двухбайтной кодировки нужно ставить Align = 2

Где-то я об этом тут уже читал... Но оно одинаково показывает, что с 1, что с 2.
Поставлю 2, как скажешь.

В общем, залез я в дебри...
Поставил дельфи, скачал исходники плагинов.
Открыл null.dpr.
Куда и как вписывать нужные мне комбинации кодов... ? (вот эти все дела интересные: 000E000300010000 и т.д.)
Или не все так просто?




Джинни

Ну там нет такого. чтобы надо было что-то куда-то вписывать. Нужно переписать код чтения строки. Функция GetStrings.

Массив ROM содержит весь загруженный ROM-файл в памяти. Переменная X - адрес откуда считывать.
ROM[X] ссылается на первый байт считываемой строки.

function GetStrings(X, Sz: Integer): PTextStrings; stdcall;
var
PW: PWord;  PC: PAnsiChar absolute PW;
begin
New(Result, Init);
with Result.Add^ do
begin
  PW := Addr(ROM[X]);
  while PW^ <> 0 do
  begin
   if PW^ = $0E00 then // Если контрольный код, то считать 8 байтов данных в строку
   begin
    Str := Str + PC^ + PC^;
    Inc(PW);   
    Str := Str + PC^ + PC^;
    Inc(PW);   
    Str := Str + PC^ + PC^;
    Inc(PW);
    Str := Str + PC^ + PC^;
    Inc(PW);
   end; // Считать 2 байта в строку
   Str := Str + PC^ + PC^;
   Inc(PW);
  end;
end;
end;

Anton

Цитата: Джинни от 26 марта 2012, 12:50:19Переменная X - адрес откуда считывать.

А если там много файлов, и адреса все разные, а плагин нужен общий?

Что-то туго мне с этим всем...

Джинни

Плагин одновременно только с одним файлом работает. Но можно сделать так, что в массиве ROM будет храниться список файлов. Этот список загружать плагином. Вместо пойнтеров передавать номера файлов. Каждый файл загружать и сохранять внутри плагина самостоятельно.

Anton

Не для меня эта кухня, короче...
Смотрю готовый плагин (тот, который есть) в хексе - там куча этих кодов есть: 000Е. Т.е. все, которые прописаны в таблице, есть и в файле плагина. Разделены байтами 000А (перевод каретки), (в игре такой же код).
Ты говоришь, их вписывать не надо...
Названий файлов с текстом, для которых он делалася - не вижу.
Ничего не понимаю. Не моя это кухня, не моя. И до автора не могу достучаться, пропал...


Джинни

Код для простого плагина, который будет всё это загружать, парой постов выше. Просто замени функцию и скомпилируй.
Только проект NULL.dpr переименуй во что-нибудь другое и внутри файла, где написано null измени название.
Для функции GetData вот такой код:

function GetData(TextStrings: PTextStrings): AnsiString; stdcall;
var
R: PTextString;
I: Integer;
begin
Result := '';
If TextStrings = NIL then Exit;
With TextStrings^ do
begin
  R := Root;
  While R <> NIL do
  begin
   Result := Result + R^.Str + #0 + #0;
   R := R^.Next;
  end;
end;
end;


Anton

Попробовал. Заменил, скомпилил, подгрузил в проект, обновил список пойнтеров.
Вместо текста одни нолики показывает...


Джинни

Выложи файл проекта, файл с оригинальным текстом и исходники плагина, который ты сделал.

Anton

В аттаче.
Только я не "сделал" исходники. Поменял просто на тот код, который ты мне дал ).

Джинни

Да знаю я, как вы меняете.

[Дата добавления: 26 марта 2012, 17:37:09]

Окей. Моя ошибочка.

function GetStrings(X, Sz: Integer): PTextStrings; stdcall;
type
TWordRec = packed record
  A: Char;
  B: Char;
end;
var
PW: PWord;  PC: ^TWordRec absolute PW;
begin
New(Result, Init);
with Result.Add^ do
begin
  PW := Addr(ROM[X]);
  while PW^ <> 0 do
  begin
   if PW^ = $0E00 then
   begin
    Str := Str + PC.A + PC.B;
    Inc(PW);   
    Str := Str + PC.A + PC.B;
    Inc(PW);   
    Str := Str + PC.A + PC.B;
    Inc(PW);
    Str := Str + PC.A + PC.B;
    Inc(PW);
   end;
   Str := Str + PC.A + PC.B;
   Inc(PW);
  end;
end;
end;

Вот на это поменяй, всё будет работать.

Anton

Текст показало. Но - точно так же, как и было - после Saved (строка 35 в проекте) опять пишет код {Tag 426}, и опять выкинуло тексты:
{Tag 15}Save{Tag 18}Save and {Tag 2}quit{Tag 14}{Tag 19}Cancel

В строках 38 и 41 такая же ситуация - вместо {Tag 15}Save{Tag 18}Save and {Tag 2}quit{Tag 14}{Tag 19}Cancel - код {Tag 426}.

Почему оно их упорно выкидывает?..

И нолики (/00/00) в конце диалогов пропали (при kpflags h01). (при h00 появляются только байты переноса, а стопов нет).
Хотя нолики, это, наверное, не очень смертельно, да? )

И коды вот эти, которые с 000E начинаются, могут быть вроде не только 10-байтные, а еще и 12, и, по-моему, даже 14-байтными (в других файлах с текстом наблюдал).
И один код 8-байтный: 000E000200000000={Link} (имя игрока).





Джинни

Ноликов и не должно быть. Так плагин написан.
Проблемы-то какие? Вынимает он как положено. Если там есть ещё какие-то коды, которые начинаются не с 000У, то их тоже надо учесть.