Автор Тема: Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)  (Прочитано 1527 раз)

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

Оффлайн ViToTiV

  • Пользователь
  • Сообщений: 172
    • Просмотр профиля
Всем доброго дня!
На днях наконец-то вышел наш перевод "Lunar 2", ура!  :cool:
Но переводчик жаждет перевести первую часть, а перевода первой части не существует ни в каком виде!
Поковырял игру - шрифт и графика есть, но текст с сожалению сжат по словарю. В нете есть прога для сжатия и распаковки, но запаковка только для Saturn версии - https://github.com/MrConan1/lsb (возможно в исходниках есть все ответы, но я не спец по Си)
Прошу помощи знатоков в распаковке и запаковке текста для PS1.

Что есть:

1. Исходный файл с запакованный текстом - https://disk.yandex.ru/d/QCsebJIuEQKN1A
Формат вроде понятен: первые 0х800 байт - блок поинтеров, по 2 байта на поинтер, пустые поинтеры (0000) игнорятся. Значение поинтера * 2 = реальная позиция текстовой строки в файле.

2. Файл словаря - https://disk.yandex.ru/d/6Z_OU9refnuIcA

3. Файлы с распакованным текстом, полученные через прогу, которую я указал выше - https://disk.yandex.ru/d/uJeejzt6pYWbyw
В этих файлах есть куча информации, которая возможно содержит всё, что нужно, но без опыта в сжатии сложно понять о чём там речь.

Подарим перевод этой игры русскому сообществу!)

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2455
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #1 : 17 Май 2024, 03:51:07 »
А какие hex коды соответствуют словам словаря? ta каким символом(лами) обозначается? И какими последнее history of our world.?

Оффлайн ViToTiV

  • Пользователь
  • Сообщений: 172
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #2 : 17 Май 2024, 08:33:11 »
Guyver(X.B.M.), так откуда ж я знаю то?) я поэтому и прошу помочь разобраться

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8119
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #3 : 17 Май 2024, 13:06:45 »
Я бы назвал это шифрованием, а не сжатием. При составлении соответствующей таблицы, текст в привычном виде можно вполне легко отобразить, например, в круптаре.
Например, в самом начале игры ,если подойти к камню возле дерева, вылезет фраза "It say: "In Honor of the Great Dragonmaster, Dyne."
Поинтер этой строки находится в файле TEXT001.DAT  по адресу 104h, текст начинается с адреса 389Bh (в памяти это адрес 801E041Bh). Играясь кодами символов, можно составить необходимую таблицу.
« Последнее редактирование: 17 Май 2024, 13:14:27 от paul_met »

Оффлайн ViToTiV

  • Пользователь
  • Сообщений: 172
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #4 : 17 Май 2024, 16:18:17 »
paul_met, не совсем понимаю о какой таблице идёт речь. Файла словаря не достаточно? надо ещё что-то?
в исходниках программы, которая извлекает текст (ссылку на которую я выложил в первом посте) есть такой код:

/*****************************************************************************/
/* psx_string_decode.c : Code to decode WD's Text in Lunar's Script files.   */
/*                      PSX English Edition - Created using Supper's notes,  */
/*                      comparing with Saturn version, and taking some       */
/*                      guesses.  (I didn't feel like staring at PSX ASM).   */
/*****************************************************************************/
#ifdef _MSC_VER
#pragma warning(disable:4996)
#endif

/* Includes */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Defines */
#define psxBufferSize (10*1024) //Should be Overkill

/* Function Prototypes */
int loadPSXStringTable(char* inFname);
int releasePSXStringTable();
int getPSXComprStr(int compressionIndex, char* target, int* tlen);
int convertPSXText(char* strIn, char** strOut, int len, int* lenOut);


static unsigned char tmpPsxBuf[psxBufferSize];
static int G_NumPSXTableEntries = 0;
static char** pPSXTableEntries = NULL;


/******************************************************************************/
/* loadPSXStringTable - Loads in a table of NULL-terminated lookup strings.   */
/* Input - Name of file to load.                                              */
/* Returns 0 on success, -1 on failure.                                       */
/******************************************************************************/
int loadPSXStringTable(char* inFname){

FILE* infile;
int entryIndex;
int x = 0;
infile = fopen(inFname, "rb");
if (infile == NULL){
printf("Error opening %s\n", inFname);
return -1;
}

/* Part 1, count # entries */
while (1){
fread(tmpPsxBuf, 1, 1, infile);
if (feof(infile))
break;

if (*tmpPsxBuf == 0x00)
G_NumPSXTableEntries++;
}

/* Part 2, Allocate Space and add entries */
fseek(infile, 0, SEEK_SET);
entryIndex = 0;

pPSXTableEntries = (char**)malloc(sizeof(char*)*G_NumPSXTableEntries);
if (*pPSXTableEntries == NULL){
printf("Error allocating memory for table entries.\n");
return -1;
}

while (1){
x = 0;
fread(&tmpPsxBuf[x], 1, 1, infile);
if (feof(infile))
break;

while (tmpPsxBuf[x] != 0x00){
x++;
fread(&tmpPsxBuf[x], 1, 1, infile);
}
pPSXTableEntries[entryIndex] = (char*)malloc(x+1);
if (pPSXTableEntries[entryIndex] == NULL){
printf("Error allocating memory for table entry.\n");
return -1;
}
memset(pPSXTableEntries[entryIndex], 0,x+1);
memcpy(pPSXTableEntries[entryIndex], tmpPsxBuf, x);
entryIndex++;
}
fclose(infile);

return 0;
}


/******************************************************************************/
/* releasePSXStringTable - Removes resources used by a loaded string table.   */
/* Returns 0 on success, -1 on failure.                                       */
/******************************************************************************/
int releasePSXStringTable(){

int x;
for (x = 0; x < G_NumPSXTableEntries; x++){
if (pPSXTableEntries[x] != NULL){
free(pPSXTableEntries[x]);
pPSXTableEntries[x] = NULL;
}
}
if (pPSXTableEntries != NULL){
free(pPSXTableEntries);
}
pPSXTableEntries = NULL;
G_NumPSXTableEntries = 0;

return 0;
}


/******************************************************************************/
/* getPSXComprStr - Looks up a compression string by an index value and       */
/*                  copies the string and length of the string.               */
/* Input - Lookup index.                                                      */
/* Returns 0 on success, -1 on failure.                                       */
/******************************************************************************/
int getPSXComprStr(int compressionIndex, char* target, int* tlen){

if (compressionIndex >= G_NumPSXTableEntries){
printf("Invalid index in getPSXComprStr\n");
return -1;
}
else{
strcpy(target, pPSXTableEntries[compressionIndex]);
*tlen = strlen(pPSXTableEntries[compressionIndex]);
}
return 0;
}


/******************************************************************************/
/* convertPSXText - Decompresses a compressed string.                         */
/*                  I took a lot of guessing here.  Seems to work fine for all*/
/*                  files except maybe File51?  iOS has 3 text statements     */
/*                  there that print as "{10}" whereas this outputs "ta{10}I "*/
/*                  Maybe thats normal, not a big deal if it isn't.           */
/* Input - Compressed String.                                                 */
/* Returns 0 on success, -1 on failure.                                       */
/******************************************************************************/
int convertPSXText(char* strIn, char** strOut, int len, int* lenOut){

unsigned char* ptarget, *optr;
unsigned char input, inputNext;
int compressionIndex, x, stroutIndex;
int offset = 0;
int out_offset = 0;
int enableCtrlCodes = 1;
*lenOut = 0;
ptarget = tmpPsxBuf;
memset(ptarget, 0, psxBufferSize);

/* Decode the message */
while (offset < len){

int tlen = 0;
input = (unsigned char)strIn[offset];
inputNext = (unsigned char)strIn[offset+1];

if (input == 0x0){
offset++;  //maybe this re-enables control codes?
            enableCtrlCodes = 1;
continue;
}
else if (input == 0xFF){
printf("End of input text stream detected.\n");
ptarget[out_offset++] = 0xFF;
ptarget[out_offset++] = 0xFF;
offset++;
break;
}



if (enableCtrlCodes){

if (input == 0xE){
enableCtrlCodes = 0;
offset++;
continue;
}
if ((input == 0x1) || (input == 0x2) || (input == 0x3)){
ptarget[out_offset++] = 0xFF;
ptarget[out_offset++] = input;
offset++;
continue;
}
if (input == 0x4){
ptarget[out_offset++] = 0xFF;
ptarget[out_offset++] = 0x00;
offset++;
continue;
}

if (((input == 0xF9) || (input == 0xF8) || (input == 0xFA) || (input == 0xFB) ||
(input == 0xFC) || (input == 0xF6) || (input == 0xF1))){

//Copy Ctrl Code
ptarget[out_offset++] = input;
ptarget[out_offset++] = inputNext;
offset += 2;
continue;
}

if (input == 0xFF){
printf("End of input text stream detected.\n");
ptarget[out_offset++] = 0xFF;
ptarget[out_offset++] = 0xFF;
offset++;
break;
}

//If you get here, assume not a control code, enter Text Mode
//printf("Unknown value 0x%X encountered. '%c'\n",input, input+0x1F);
}

enableCtrlCodes = 0;
if (input < 0x5C){

if (input == 0xB){
ptarget[out_offset++] = 0xFF;
ptarget[out_offset++] = 0x00;
ptarget[out_offset++] = 0xFF;
ptarget[out_offset++] = 0x01;
offset++;
continue;
}
else if (input == 0x21){
ptarget[out_offset++] = 0xFF;
ptarget[out_offset++] = 0x02;
offset++;
continue;
}
else if (input == 0x6){
ptarget[out_offset++] = 0xFF;
ptarget[out_offset++] = 0x00;
offset++;
continue;
}
else if (input == 0x5){
ptarget[out_offset++] = 0xFF;
ptarget[out_offset++] = 0x00;
ptarget[out_offset++] = 0xFF;
ptarget[out_offset++] = 0x03;
ptarget[out_offset++] = 0xFF;
ptarget[out_offset++] = 0xFF;
offset++;
break;
}
else{
//Uncompressed ASCII Literal
ptarget[out_offset] = input + (unsigned char)0x1F;
out_offset++;
}
}
else if (input == 0xFD){
//Compression Extended Lkup Version 1
offset++;
input = (unsigned char)strIn[offset];
compressionIndex = (unsigned int)input + 0x00A1;
getPSXComprStr(compressionIndex, (char*)&ptarget[out_offset], &tlen);
out_offset += tlen;
}
else if (input == 0xFE){
//Compression Extended Lkup Version 2
offset++;
input = (unsigned char)strIn[offset];
compressionIndex = (unsigned int)input + 0x019E;
getPSXComprStr(compressionIndex, (char*)&ptarget[out_offset], &tlen);
out_offset += tlen;
}
else{
//Std Lookup
compressionIndex = input - 0x005C;
getPSXComprStr(compressionIndex, (char*)&ptarget[out_offset], &tlen);
out_offset += tlen;
}

offset++;

/* End of text */
if (ptarget[out_offset - 1] == '$')
break;
}


/* Copy out actual decompressed string */
*strOut = (char*)malloc(2*(out_offset + 1));
if (*strOut == NULL){
printf("Error allocating memory for string buffer.\n");
return -1;
}

optr = (unsigned char*)(*strOut);
stroutIndex = 0;
memset(optr, 0, 2 * (out_offset + 1));
for (x = 0; x < out_offset; x++){

if (ptarget[x] >= 0xF0){  //ctrl code
optr[stroutIndex++] = ptarget[x++];
optr[stroutIndex++] = ptarget[x];
}
else{
optr[stroutIndex++] = ptarget[x];
}
}
*lenOut = stroutIndex;

return offset;
}

но я в Си не силён, может кто-нить сможет разобраться?

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8119
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #5 : 17 Май 2024, 16:31:31 »
paul_met, не совсем понимаю о какой таблице идёт речь. Файла словаря не достаточно? надо ещё что-то?
Толку то от файла словаря, когда ты не знаешь каким кодам соответствуют слова в таблице.
Обычная MTE таблица:
0100=Hello
0101=World
...

В качестве примера, я декодировал первую реплику:
276539-0
« Последнее редактирование: 17 Май 2024, 16:57:40 от paul_met »

Оффлайн ViToTiV

  • Пользователь
  • Сообщений: 172
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #6 : 17 Май 2024, 17:10:08 »
paul_met, не понял, так у тебя уже получилось декодировать???

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8119
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #7 : 17 Май 2024, 17:16:00 »
paul_met, не понял, так у тебя уже получилось декодировать???
Это же обычное DTE/MTE кодирование. Просто составляешь соответствующую таблицу и всё.
Таблица этой реплики:
01=
03="
0f=.
1B=:
21=_
28=G
29=H
2A=I
54=s
5a=y
64=t
6D=sa
6E=,
87=on
8D=n
AF=re
B1=at
FD1B=or
FDBB=Dyne
FDD8=Dragonmaster
FE5A=of the

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2455
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
ViToTiV, хотя бы шрифт игровой приложи картинкой, чтобы обычную таблицу можно было вообще составить... А ведь надо и русскую таблицу сразу составить. Сразу, чтобы потом не оказалось, что букв не хватает и т.п. И ещё, символы словаря и текста должны быть тождественны, а в словаре используется другая "кодировка", к примеру, 22=А против 41=А. И нужно сразу составить русскую таблицу и для словаря, чтобы все буквы выводились и были тождественны таблице с текстом.

Таблица словаря (не уверен, что она полная, но вроде бы всё ОК.):

Цитата
20=
21=!
27='
2C=,
2E=.
3F=?
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z

Влезет весь русский алфавит в неё? Какие будут hex коды у недостающих букв? Будут ли они "тождественно" выводиться в тексте?

Вот таблица для твоего текста (её надо дополнять знаками препинания и, может, ещё какими-то спецсимволами, пока там 572 "символа"):

https://dropmefiles.com/cRvRD

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

02=!
03="
08='
0D=,
0F=.
1B=:
20=?

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

Добавлено позже:
И ещё, я не хочу считать, умножать на два и т.д. Дай мне для примера пойнтеры в таком виде:

адрес поинтера, сам поинтер, адрес текста

Цитата
Значение поинтера * 2 = реальная позиция текстовой строки в файле.
Поинтеры в начале файла:

0000 0004 4B04 4F04 7404 8804

4B04 это h044Вх2 и получаем адрес текста h8E8? Не вижу текста по такому адресу...

И я составлю проект для круптара (если там не сложно). Я не знаю, как в игре устроено всё, в моей игре текст шёл вперемешку с информацией вывода самого текста, рамок и т.п. и перемещать его на другое место было ОЧЕНЬ сложно, поэтому я перемещал только те фразы, что никак не влезали. А меню всякие у меня шли блоками, и их изменять/перемещать было проще намного.



Как я понимаю, словарь один на все файлы dat с текстом, а ты приложил только один из них? В самом словаре 512 "слов" и ты потом просто заменишь все из них на наиболее повторяемые русские такой же длины, это не сложно, тем более что почти все слова словаря сгруппированы по длине. Только перед этим придётся перевести ВЕСЬ текст, потом составить словарь, и уже потом можно будет вставлять текст в каждый из файлов. Причём сразу нужно учитывать, что переводить не стоит слишком размашисто, а делать это нужно более "сжато и сухо". Нужно сразу использовать много повторяющихся конструкций, чтобы потом получить как можно меньше текста в итоге.



В круптаре можно подключать внешний словарь и перед вставкой текста "генерировать его на лету", но я не помню как это делается и поэтому могу работать только с "тупым" многозатратным методом с обычными таблицами, в которые и вносится сам словарь... В теории я могу "повспоминать", так как у меня должны быть готовые проекты перевода игр со словарными системами, составленные грамотными людьми. Но не факт, что я их найду. Вроде Кристалис на гейм бой должен валяться где-то, там как раз словарь подключали нормальные люди...
« Последнее редактирование: 17 Май 2024, 23:03:01 от Guyver(X.B.M.) »

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8119
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #9 : 17 Май 2024, 23:06:27 »
И ещё, я не хочу считать, умножать на два и т.д. Дай мне для примера пойнтеры в таком виде:
Нет нужны умножать на 2 - круптар сделает это за тебя (ptAlignment=2). Так как на ps1 обратный порядок байт, то ptBIG_ENDIAN=false. Размер поинтеров 2 байта, значит ptPointerSize=2. Ресурсы игры находятся в одном файле (LUNADATA.FIL), который нет нужны разбивать на отдельные. Внутри файла есть наглядный список с именами файлов и их номерами секторов (адрес файла = номер сектора * 800h). Так что, очень легко определить ptReference (например, файл TEXT001.DAT будет находится по адресу 0E59h*800h=72C800h).
« Последнее редактирование: 18 Май 2024, 12:12:55 от paul_met »

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2455
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #10 : 17 Май 2024, 23:08:30 »
В любом случае у меня нет этих файлов, но раз так всё просто, то составить проект тогда можно без труда. Таблицу я скинул, недостающее можно в неё дописать... По крайней мере, можно вынуть и перевести весь текст для начала...

Проект для словаря: https://dropmefiles.com/im26D

В нём надо добавить в русскую таблицу русские буквы (именно добавить, а не переписать на месте английских) и в самом словаре в словах использовать ту же длину слов, что и у оригинала (раз пойнтеров на слова словаря не предоставлено, но, обычно, они и не нужны).
« Последнее редактирование: 17 Май 2024, 23:15:26 от Guyver(X.B.M.) »

Оффлайн ViToTiV

  • Пользователь
  • Сообщений: 172
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #11 : 18 Май 2024, 09:26:35 »
paul_met, Guyver(X.B.M.), спасибо большое!

вот шрифт игры - https://disk.yandex.ru/d/wpLqDYZDuuSl_w
словарь да, один на весь текст

Вот таблица для твоего текста (её надо дополнять знаками препинания и, может, ещё какими-то спецсимволами, пока там 572 "символа"):
так а как ты её получил? откуда ты взял все эти коды?  :?
и сразу поправочка в твою таблицу: 01=пробел, 21=перенос строки

круптар я только знаю, что есть такая программа, но никогда не пользовался
и мысли в слух - теоретически же текст назад не обязательно кодировать, ведь можно не использовать словарь, а писать прямым текстом?
« Последнее редактирование: 18 Май 2024, 10:09:48 от ViToTiV »

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2455
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #12 : 18 Май 2024, 10:45:03 »
Мне было достаточно знать код одной буквы и одного слова из словаря. Остальное я чисто на предположениях подключил (игры у меня нет, есть только пара файлов из неё).

1. Составил шаблон таблицы (это умеет Djinn Tile Mapper в один клик) вида:
00=
01=
...
FE=
FF=
2. Посмотрел что в сообщении paul_met написал, что есть коды вида FDD8=Dragonmaster и FE5A=of the. Дополнил таблицу (онлайн сервисом, который добавил в уже существующую таблицу в каждую строку нужные мне префиксы FD и FE), которая приобрела вид:
00=
01=
...
FE=
FF=
FD00=
FD01=
...
FDFE=
FDFF=
FE00=
FE01=
...
FEFE=
FEFF=
3. Вытащил словарь с помощью Kruptar'а в текстовой файл. Коды таблицы видно в хексредакторе Translhextion (стандартная таблица). Сделал простейший проект и вынул словарь в виде, где просто каждое новое слово находится на новой строке. Всего 512 строк.
4. 28=G, 54=s - забил весь остальной алфавит.
5. 6D=sa - забил все остальные слова на соответствующие места в таблице от 6D до FF по порядку.
6. FD1B=or - забил все остальные слова на соответствующие места в таблице от FD1B до FDFF по порядку.
7. FE5A=of the - забил все остальные слова на соответствующие места в таблице от FE5A до скольки хватило оставшихся слов словаря по порядку. У последнего слова оказался код FE61=history of our world.
8. Забил все оставшиеся слова в таблицу, двигаясь уже вверх от известных символов. Выяснилось, что символы FD00, FD01, FD02 и FE00, FE01, FE02 оказались "пустыми". Т.е. весь словарь идёт не по порядку, а с небольшими сдвигами.

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

8. Составил в круптаре проект для текста, где просто подключил вновьсозданную таблицу и вынул весь текст из файла без поинтеров (с нулевыми поинтерами), чтобы увидеть текст. Увидел его, внёс поправки в таблицу, добавив некоторые символы.

В теории текст не обязательно опять "кодировать", если:
а. В образе есть свободное место, куда его можно перенести.
б. Можно расширить образ, но тогда там нужно много ещё чего изменить.
С этим тебе подскажут специалисты.

Дополненная таблица для текста: https://dropmefiles.com/zg3Af
Таблицу для словаря можно дополнить, используя начало этой, сделав необходимые сдвиги.
« Последнее редактирование: 18 Май 2024, 11:28:02 от Guyver(X.B.M.) »

Оффлайн ViToTiV

  • Пользователь
  • Сообщений: 172
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #13 : 18 Май 2024, 11:44:27 »
Guyver(X.B.M.), в рот мне ноги)) столько телодвижений пришлось сделать?))
Спасибо ещё раз, с декодированием текста всё понятно!  :drinks:

Копаюсь, самое стрёмное - это отделить спецкоды от текста, и это капец. Но тут уже придётся разбираться, что сделаешь

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2455
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #14 : 18 Май 2024, 11:48:11 »
А в чём ты текст смотришь? В хексредакторе? Если тебе его нужно просто вынуть, можно использовать круптар с нулевыми поинтерами. Это несколько кликов...



Мусора хватает, но можно его удалить...
« Последнее редактирование: 18 Май 2024, 12:13:38 от Guyver(X.B.M.) »

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8119
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #15 : 18 Май 2024, 12:10:12 »
ViToTiV, Мой тебе совет - освой отладчик PCSX (благо там всё просто) и твои возможности сразу возрастут в 1000 раз.
Порядок определения кодов прост как 5 копеек.
  • Сохраняешься перед тем, как активировать определённую реплику.
  • Переходишь в адрес начала строки реплики и меняешь код символа на произвольный (например, самый первый код в строке).
  • Активируешь реплику и смотришь как поменялся символ (или набор символов).
  • Записываешь код и соответствующий ему символ (или набор символов) в свою таблицу.
  • Повторяешь процедуру заново (благо словарь не большой и ты быстро его разберёшь по кодам).
PS: Многие люди пишут софт под конкретный случай, тратя кучу времени на код и отладку вместо того, чтобы адаптировать свой случай под уже существующий софт.

Оффлайн ViToTiV

  • Пользователь
  • Сообщений: 172
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #16 : 18 Май 2024, 13:47:10 »
paul_met, согласен, но у меня, к сожалению, уже давно нет времени на изучение чего-то нового (занимаюсь этим всем исключительно на работе, дома свои дела)
Guyver(X.B.M.), ну мне не очистить текст надо, а отделить от кодов, чтобы потом правильно собрать это всё при вставке текста назад.

в общем, буду копать, всем спасибо за помощь  :thumbup:

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2455
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #17 : 18 Май 2024, 16:17:32 »
Как отделить от кодов. Так?

https://dropmefiles.com/g1BqL

Если да, то это пара кликов...
« Последнее редактирование: 18 Май 2024, 18:12:16 от Guyver(X.B.M.) »

Оффлайн ViToTiV

  • Пользователь
  • Сообщений: 172
    • Просмотр профиля
Re: Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #18 : 18 Май 2024, 17:19:03 »
Guyver(X.B.M.), ты разделяешь строки по 0х00, а они не разделяются по нулю, они вообще вроде как никаким кодом не разделяются, как до текста могут быть любые коды, так и после текста могут быть любые коды
« Последнее редактирование: 18 Май 2024, 17:26:11 от ViToTiV »

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2455
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #19 : 18 Май 2024, 17:26:56 »
Я это понимаю (хотя /00 является стопбайтом в словаре), но я ведь не собираюсь вставлять текст. Я его вынимаю только, поэтому сделал так, чтобы текст не был одним сплошным предложением :neznayu: Зачем для перевода всякие спецсимволы? В будущем при составлении словаря тебе нужен только переведённый текст, вообще без спецсимволов.
« Последнее редактирование: 18 Май 2024, 17:38:09 от Guyver(X.B.M.) »

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8119
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #20 : 18 Май 2024, 18:45:11 »
Guyver(X.B.M.), ты разделяешь строки по 0х00, а они не разделяются по нулю, они вообще вроде как никаким кодом не разделяются, как до текста могут быть любые коды, так и после текста могут быть любые коды
В блоках с текстом, если внимательно посмотреть, есть пара байт, отвечающих за окончание строки (0500h). Игре ведь надо как-то понимать, когда закончить работу с текущим блоком и начать оную со следующим. Да и как вставлять без кода окончания строки? Это же строка на строку залезать будет. Кроме того, текст надо вставлять с системными кодами, иначе придётся втискиваться в отведённое для текста место и не байтом больше (такое себе решение). Поэтому следует по максимуму выяснить какие системные коды (какой они длины) за что отвечают и сделать их в форме тегов. Например перед текстом идёт 3 байта, отвечающие за вид портрета персонажа текущей реплики. Их можно пометить в духе {IMG_ХХ}, иксы - это порядковый номер портрета. Таким образом теги будут визуально отделяться от текста реплики и будет чётко видно что за чем идёт.

Оффлайн ViToTiV

  • Пользователь
  • Сообщений: 172
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #21 : 20 Май 2024, 08:59:58 »
paul_met, ну это то всё понятно, как по твоему мы вторую часть перевели?)) и даже исправили ошибку разрабов/локализаторов с перепутанными портретами в конце игры

Оффлайн ViToTiV

  • Пользователь
  • Сообщений: 172
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #22 : 26 Май 2024, 09:19:36 »


Ещё раз всем спасибо)

Оффлайн mlegion

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #23 : 26 Май 2024, 12:21:57 »
ViToTiV, если получится осилить хакинг "Mahou Gakuen Lunar!" для Сатурна, то, как я писал тебе ранее, перевод с японского я готов обеспечить. С версией для GameGear я, по всей видимости, совладал, однако вся соль именно в версии для Сатурна.

Оффлайн Nereid

  • Пользователь
  • Сообщений: 250
  • Пол: Мужской
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #24 : 01 Июнь 2024, 21:09:55 »
(Ссылка на вложение)

Ещё раз всем спасибо)
Глянь еще версию Lunar Silver Star Story Touch для андройда. Там вроде ресурсы на поверхности лежат :) (да и в ней есть переключение яп/англ войса  :wow: )

Оффлайн ViToTiV

  • Пользователь
  • Сообщений: 172
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #25 : 01 Июнь 2024, 21:49:36 »
Игры на телефоне я не воспринимаю в принципе.
В общем с текстом разобрался, редактор почти готов.
За основу будет взята французская версия, её прохакали ппц, даже новый пункт в настройках добавили с выбором сложности японской или английской версии. А что ещё более удивительно - это добавили субтитры в видео через саму игру, а не хардсабом

Оффлайн Nereid

  • Пользователь
  • Сообщений: 250
  • Пол: Мужской
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #26 : 01 Июнь 2024, 21:57:16 »
Игры на телефоне я не воспринимаю в принципе.
В общем с текстом разобрался, редактор почти готов.
За основу будет взята французская версия, её прохакали ппц, даже новый пункт в настройках добавили с выбором сложности японской или английской версии. А что ещё более удивительно - это добавили субтитры в видео через саму игру, а не хардсабом
Почему на телефоне. На твбоксе тож норм играется. :)
Все что ты перечислил про хакнутую версию, есть в андройд версии... А на пс1, надеюсь она не паловская, 50фыпысы - не надо.

Оффлайн Lance_Kalzas

  • Пользователь
  • Сообщений: 931
  • Пол: Мужской
  • Властелин Глупости
    • ВКонтакте
    • Steam
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #27 : 02 Июнь 2024, 08:18:45 »
(Ссылка на вложение)

Ещё раз всем спасибо)
Секретный сайд-квест по историческим документам подъехал :lol:

Оффлайн SavitarSvit

  • Пользователь
  • Сообщений: 1351
  • Пол: Мужской
  • Хирург личности
    • Youtube
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #28 : 06 Июнь 2024, 08:50:38 »
А на пс1, надеюсь она не паловская, 50фыпысы - не надо.
Тоже надеюсь что не 50Гц будет...

Оффлайн ViToTiV

  • Пользователь
  • Сообщений: 172
    • Просмотр профиля
Сжатие текста в "Lunar - Silver Star Story Complete" (PS1)
« Ответ #29 : 06 Июнь 2024, 12:55:36 »
На французский переводили usa версию