[PSX] Guardian's Crusade-Ponteiros

Iniciado por douglaskraft, Fevereiro 15, 2023, 22:17:09 PM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

douglaskraft

Ola, Sou novo aqui, porem já há muito tempo acompanho o trabalho da comunidade.
Estou tentando traduzir esse jogo: Guardian's Crusade, EN para o PT porem estou com dificuldades para achar os ponteiros.
A parte de TIM já achei um jeito de modificá-las, esse jogo possui muitas CLUTS que dificulta as ferramentas de extrair e repor corretamente, no entanto, após algumas tentativas não tenho problemas. Os textos, estou usando uma ferramenta Russa "Kruptar7", apesar que em letras latinas ter que repetir a letra para o jogo aceitar o caractere.

Agora os ponteiros eu não encontro, meio que até achei aonde eles deveriam estar, só não consigo um modo prático de encontrá-los

https://drive.google.com/file/d/1MLCOzdk1DV70qB66lQDZgVV3EiSwgd7a/view?usp=sharing

https://drive.google.com/file/d/1Pp5Qt04qDBGfQ5SH3--SQuJZgD9WBllB/view?usp=sharing

A parte em azul muda sequencialmente a cada bloco de texto.
Verde e vermelha se mantêm.
No final do bloco, todas as partes destacadas mudam.
Usando um editor, sempre tem esse conjunto de códigos entre um bloco e outro, mesmo que em jogo uma frase seja em uma janelá, ela pode começar em um bloco e terminar em outro.
https://drive.google.com/file/d/1e-CZmdRpIFSFBKJcIw3b6m4t4h5jO5Lv/view?usp=share_link

Essa parte selecionada não aparece no CDmage, não sei pq.

Se alguém, puder ajudar, agradeço.

Obs: já vi vários vídeos e manuais sobre ponteiros.

Luke

Boa tarde,

Esse jogo tem arquivos ocultos, fica muito difícil e meio que uma tarefa bem inviável traduzir direto na bin.
O fato de você abrir o jogo diretamente pelo arquivo bin, você acaba lendo junto os pedaços de dados de controle (chunks), por isso que fica um monte de códigos juntos com o texto.

O que dá pra fazer, é eliminar esses dados de controle provisoriamente, para que eles não te atrapalhem na hora de fazer a tradução, mas mesmo assim, é um trabalho muito árduo traduzir diretamente da Bin/ISO.

Baixe o programa quickbms e use esse script.
Copia e cola esse código em um arquivo .txt e use no programa junto com a bin, o script deve recriar a bin/iso sem os pedaços de dados de controle.

get SIZE asize
putvarchr MEMORY_FILE SIZE 0
log MEMORY_FILE 0 0
append
for OFFSET = 0 u< SIZE
    idstring "\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00"
    get DUMMY long
    get DUMMY long
    get DUMMY long
    savepos OFFSET
    log MEMORY_FILE OFFSET 0x800
    math OFFSET + 0x800
    math OFFSET + 0x118
    goto OFFSET
next
append

get SIZE asize MEMORY_FILE
get NAME basename
get EXT extension
string NAME + "_unchunked."
string NAME + EXT
log NAME 0 SIZE MEMORY_FILE


douglaskraft

Citação de: Luke online Fevereiro 16, 2023, 14:34:19 PM
Boa tarde,

Esse jogo tem arquivos ocultos, fica muito difícil e meio que uma tarefa bem inviável traduzir direto na bin.
O fato de você abrir o jogo diretamente pelo arquivo bin, você acaba lendo junto os pedaços de dados de controle (chunks), por isso que fica um monte de códigos juntos com o texto.

O que dá pra fazer, é eliminar esses dados de controle provisoriamente, para que eles não te atrapalhem na hora de fazer a tradução, mas mesmo assim, é um trabalho muito árduo traduzir diretamente da Bin/ISO.

Baixe o programa quickbms e use esse script.
Copia e cola esse código em um arquivo .txt e use no programa junto com a bin, o script deve recriar a bin/iso sem os pedaços de dados de controle.

get SIZE asize
putvarchr MEMORY_FILE SIZE 0
log MEMORY_FILE 0 0
append
for OFFSET = 0 u< SIZE
    idstring "\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00"
    get DUMMY long
    get DUMMY long
    get DUMMY long
    savepos OFFSET
    log MEMORY_FILE OFFSET 0x800
    math OFFSET + 0x800
    math OFFSET + 0x118
    goto OFFSET
next
append

get SIZE asize MEMORY_FILE
get NAME basename
get EXT extension
string NAME + "_unchunked."
string NAME + EXT
log NAME 0 SIZE MEMORY_FILE


Ressumindo: esses dados não contam para o cálculo dos ponteiros?
Usando um emulador com debug + Cheat engine, consigo ver apenas as partes dos textos, sem esses dados atrapalhando entre um bloco e outro, não sei se seria um modo de fazer.
Ainda vou tentar usar o programa que tu falou.

douglaskraft

  offset           filesize   filename
--------------------------------------

- signature of 12 bytes at offset 0x0000000005a3c3f0 doesn't match the one
  expected by the script:

  this one: "333333333333"
  33 33 33 33 33 33 33 33 33 33 33 33               333333333333

  expected: ""
  00 ff ff ff ff ff ff ff ff ff ff 00               ............

- 0 files found in 4 seconds
  coverage file 0    19%   83354500   437436720  . offset 0000000005a3c3fc
  coverage file -1    0%   0          82388992   . offset 0000000004e92800

Press ENTER or close the window to quit


Acho que não deu certo, como o programa define o offset? está direcionando para um lugar que nem está escrito no script.

Luke

Você está fazendo errado.
Acabei de fazer aqui e deu certo.

Pega a iso original.

abra o programa, selecione o txt depois a iso, depois a pasta onde quer que ela vá.

douglaskraft

Citação de: Luke online Fevereiro 16, 2023, 15:37:41 PM
Você está fazendo errado.
Acabei de fazer aqui e deu certo.

Pega a iso original.

abra o programa, selecione o txt depois a iso, depois a pasta onde quer que ela vá.

Deu certo kkkk
tenho tanta versão do jogo, que a original se perdeu.
Agora vou ver o resultado

douglaskraft

Certo tenho os arquivos " limpos", porem não resolvi o problema principal: achar os ponteiros e modificá-los.
Extra:Quem tiver intersere, esse jogo tem uma versão original em japonês, aparentemente possui algumas mudanças em relação à Ocidental 

douglaskraft

Citação de: Luke online Fevereiro 16, 2023, 15:37:41 PM
Você está fazendo errado.
Acabei de fazer aqui e deu certo.

Pega a iso original.

abra o programa, selecione o txt depois a iso, depois a pasta onde quer que ela vá.


Para voltar o processo é mais complexo(tem que fazer um script próprio)? Pois tentei fazer usando reimport e simplesmente não vai.

denim

Aplique esse patch que eu gerei para você que mostra todos os arquivos do jogo. Como as tabelas de arquivos foram apagadas na iso original, não tem como saber o nome dos arquivos originalmente. Então criei arquivos com nomes genéricos, sequenciais e prefixados com o nome da pasta pai.


douglaskraft

Muito legal, abriu algumas possibilidades.
Obrigado.

denim

#10
Sobre os ponteiros em si, a melhor forma de encontrar é pelo debugger. Mas pode tentar fazer a busca pela força bruta mesmo.

Um exemplo, o arquivo npc-07 possui a primeira frase do jogo, "[05][03]Good morning! Wake up, wake up!", no arquivo, essa está em 1dd0. Subtraia este valor de 0204, resultando em 1bcc. Este é o valor do "ponteiro relativo" que deverá buscar no arquivo. Pela busca vai ver que no offset 2249 há um 1bcc, basta modificá-lo como for conveniente. Para os demais, use o mesmo método. No caso deste jogo, os ponteiros estão dentro de um script de eventos e não sequenciais, então vai ter que buscar de um em um.

E sobre o 0204, você vai perguntar de onde tirei isso, ele é o valor encontrado no offset 4 do arquivo.

Fiz uma atualização no patch que enviei, removendo um arquivo duplicado além de corrigir a ordem de uns arquivos para que fiquem em ordem crescente de lba.


douglaskraft

Citação de: denim online Março 05, 2023, 10:06:17 AM
Sobre os ponteiros em si, a melhor forma de encontrar é pelo debugger. Mas pode tentar fazer a busca pela força bruta mesmo.

Um exemplo, o arquivo npc-07 possui a primeira frase do jogo, "[05][03]Good morning! Wake up, wake up!", no arquivo, essa está em 1dd0. Subtraia este valor de 0204, resultando em 1bcc. Este é o valor do "ponteiro relativo" que deverá buscar no arquivo. Pela busca vai ver que no offset 2249 há um 1bcc, basta modificá-lo como for conveniente. Para os demais, use o mesmo método. No caso deste jogo, os ponteiros estão dentro de um script de eventos e não sequenciais, então vai ter que buscar de um em um.

E sobre o 0204, você vai perguntar de onde tirei isso, ele é o valor encontrado no offset 4 do arquivo.

Fiz uma atualização no patch que enviei, removendo um arquivo duplicado além de corrigir a ordem de uns arquivos para que fiquem em ordem crescente de lba.

Rapaz tu me ajudou demais.
Antes disso, estava pensando em pegar a versão alemã do jogo pq tinha mais espaço, o problema que eu não sei alemão kkkkk, então era um duplo trabalho, além de ficar achando aonde o texto acabava e ter que adicionar espaço ou apagar alguma coisa.

Vou tentar aplicar o patch e tentar usar essa lógica de ponteiros, porem fica uma pergunta: como apliquei esse patch, se eu criar um patch ele vai ser sobre o patch ou sobre a Iso original, resumindo, uma pessoa poderá usar minhas mudanças na iso dela ou teria que usar (baixar) a iso que modifiquei

Luke

#12
Citação de: douglaskraft online Março 05, 2023, 11:43:00 AM
Citação de: denim online Março 05, 2023, 10:06:17 AM
Sobre os ponteiros em si, a melhor forma de encontrar é pelo debugger. Mas pode tentar fazer a busca pela força bruta mesmo.

Um exemplo, o arquivo npc-07 possui a primeira frase do jogo, "[05][03]Good morning! Wake up, wake up!", no arquivo, essa está em 1dd0. Subtraia este valor de 0204, resultando em 1bcc. Este é o valor do "ponteiro relativo" que deverá buscar no arquivo. Pela busca vai ver que no offset 2249 há um 1bcc, basta modificá-lo como for conveniente. Para os demais, use o mesmo método. No caso deste jogo, os ponteiros estão dentro de um script de eventos e não sequenciais, então vai ter que buscar de um em um.

E sobre o 0204, você vai perguntar de onde tirei isso, ele é o valor encontrado no offset 4 do arquivo.

Fiz uma atualização no patch que enviei, removendo um arquivo duplicado além de corrigir a ordem de uns arquivos para que fiquem em ordem crescente de lba.

Rapaz tu me ajudou demais.
Antes disso, estava pensando em pegar a versão alemã do jogo pq tinha mais espaço, o problema que eu não sei alemão kkkkk, então era um duplo trabalho, além de ficar achando aonde o texto acabava e ter que adicionar espaço ou apagar alguma coisa.

Vou tentar aplicar o patch e tentar usar essa lógica de ponteiros, porem fica uma pergunta: como apliquei esse patch, se eu criar um patch ele vai ser sobre o patch ou sobre a Iso original, resumindo, uma pessoa poderá usar minhas mudanças na iso dela ou teria que usar (baixar) a iso que modifiquei

Depois que você finalizar a tradução basta pegar a iso original, a sua modificada e criar outro xdelta.

douglaskraft

Citação de: denim online Março 05, 2023, 10:06:17 AM
Sobre os ponteiros em si, a melhor forma de encontrar é pelo debugger. Mas pode tentar fazer a busca pela força bruta mesmo.

Um exemplo, o arquivo npc-07 possui a primeira frase do jogo, "[05][03]Good morning! Wake up, wake up!", no arquivo, essa está em 1dd0. Subtraia este valor de 0204, resultando em 1bcc. Este é o valor do "ponteiro relativo" que deverá buscar no arquivo. Pela busca vai ver que no offset 2249 há um 1bcc, basta modificá-lo como for conveniente. Para os demais, use o mesmo método. No caso deste jogo, os ponteiros estão dentro de um script de eventos e não sequenciais, então vai ter que buscar de um em um.

E sobre o 0204, você vai perguntar de onde tirei isso, ele é o valor encontrado no offset 4 do arquivo.

Fiz uma atualização no patch que enviei, removendo um arquivo duplicado além de corrigir a ordem de uns arquivos para que fiquem em ordem crescente de lba.

Fiz como vc ensinou e deu certo, só tive que achar dois ponteiros que não tem o padrão [05][03].

Só falta duas coisas para a tradução fluir normalmente(se é que exite um fluxo normal):
1° Encontrar um método para sub. os ponteiros automaticamente, tentei criar um código em phyton para fazer isso, porem ainda não está funcionando como esperado.
2° Os caracteres latinos tendem a ser problema, o jogo tende a não reconhecer o caractere ex: "Nós", apenas se escrever "Nóos. Tenho que achar algum lugar na fonte que o jogo não considere ser "dublo espaço".

Quem sabe, após isso, posso lançar uma versão beta, kkkkk.


douglaskraft

Citação de: douglaskraft online Março 08, 2023, 16:46:54 PM
Citação de: denim online Março 05, 2023, 10:06:17 AM
Sobre os ponteiros em si, a melhor forma de encontrar é pelo debugger. Mas pode tentar fazer a busca pela força bruta mesmo.

Um exemplo, o arquivo npc-07 possui a primeira frase do jogo, "[05][03]Good morning! Wake up, wake up!", no arquivo, essa está em 1dd0. Subtraia este valor de 0204, resultando em 1bcc. Este é o valor do "ponteiro relativo" que deverá buscar no arquivo. Pela busca vai ver que no offset 2249 há um 1bcc, basta modificá-lo como for conveniente. Para os demais, use o mesmo método. No caso deste jogo, os ponteiros estão dentro de um script de eventos e não sequenciais, então vai ter que buscar de um em um.

E sobre o 0204, você vai perguntar de onde tirei isso, ele é o valor encontrado no offset 4 do arquivo.

Fiz uma atualização no patch que enviei, removendo um arquivo duplicado além de corrigir a ordem de uns arquivos para que fiquem em ordem crescente de lba.

Fiz como vc ensinou e deu certo, só tive que achar dois ponteiros que não tem o padrão [05][03].

Só falta duas coisas para a tradução fluir normalmente(se é que exite um fluxo normal):
1° Encontrar um método para sub. os ponteiros automaticamente, tentei criar um código em phyton para fazer isso, porem ainda não está funcionando como esperado.
2° Os caracteres latinos tendem a ser problema, o jogo tende a não reconhecer o caractere ex: "Nós", apenas se escrever "Nóos. Tenho que achar algum lugar na fonte que o jogo não considere ser "dublo espaço".

Quem sabe, após isso, posso lançar uma versão beta, kkkkk.

Aqui está o código de sub. os ponteiros em phyton, tem outro código para calcular os novos ponteiros, depois posso organizar tudo e fazer um passo a passo.

import binascii
import struct
import os

# define o intervalo de bytes que você deseja ler
start = 0x0000093C
end = 0x00002B9C

# define o nome do arquivo de saída
output_file = 'NPC-07-substituido.bin'

# abre o arquivo binário e lê os bytes correspondentes ao intervalo especificado
file_size = os.path.getsize('/content/NPC-07.bin')
if end > file_size:
    end = file_size
bytes_to_read = end - start

with open('/content/NPC-07.bin', 'rb') as f:
    f.seek(start)
    data = f.read(bytes_to_read)

# lê os valores a serem pesquisados do arquivo txt e os converte em uma lista de inteiros
with open('/content/hexanovo.txt', 'r') as f:
    search_values = [int(line.strip(), 16) for line in f]

# lê os valores de substituição do arquivo txt e os converte em uma lista de inteiros
with open('/content/hexavelho.txt', 'r') as f:
    replace_values = [int(line.strip(), 16) for line in f]

# converte os bytes em uma lista de inteiros
int_list = list(struct.unpack('>' + 'H' * (bytes_to_read // 2), data))

# substitui os valores encontrados pelos valores de substituição correspondentes
sub_count = 0
for i, value in enumerate(int_list):
    if value in search_values:
        index = search_values.index(value)
        int_list[i] = replace_values[index]
        sub_count += 1

# escreve os valores substituídos no arquivo de saída
with open(output_file, 'wb') as f:
    for value in int_list:
        f.write(struct.pack('>H', value))

# imprime a contagem de substituições feitas
print(f'Foram feitas {sub_count} substituições no arquivo binário.')


Este código trabalha com o arquivo bin, os ponteiros originais e os novos depois do texto traduzido.
As tabela txt estão como exemplo:
0x5507
0xb707
0x5d08
0x8208
0x500a
que são já os ponteiros calculados.
Deve servir para qualquer jogo que use a mesma lógica