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/1MLCOzdk1DV70qB66lQDZgVV3EiSwgd7a/view?usp=sharing)
(https://i.postimg.cc/WbBscT7P/imagem-2023-02-15-214651775.png)
https://drive.google.com/file/d/1Pp5Qt04qDBGfQ5SH3--SQuJZgD9WBllB/view?usp=sharing (https://drive.google.com/file/d/1Pp5Qt04qDBGfQ5SH3--SQuJZgD9WBllB/view?usp=sharing)
(https://i.postimg.cc/Qx40FdyR/imagem-2023-02-15-214731586.png)
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 (https://drive.google.com/file/d/1e-CZmdRpIFSFBKJcIw3b6m4t4h5jO5Lv/view?usp=share_link)
(https://i.postimg.cc/SKQ5wvHh/imagem-2023-02-15-220636562.png)
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.
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
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.
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.
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á.
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
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
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.
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.
Muito legal, abriu algumas possibilidades.
Obrigado.
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.
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
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.
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.
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
Modifiquei a fonte do jogo para aceitar os caracteres latinos, tive que colocar no lugar de "()<>" e alguns outros que aparentemente não são usados no jogo(espero).
Porem está sendo um trampo mudar os ponteiros. Quando o não é código python que não trabalha direito, é o jogo que coloca uns ponteiros fora de padrão.
Acho que vou fazer a parte da tradução e inserir os textos de volta, e no fim, vejo como fazer essa troca de ponteiros mais eficiente.
Finalmente consegui criar uns códigos em phyton que modifica os ponteiros, porem encontrei um problema.
Não sei muito bem aonde começa e aonde termina esses ponteiros, sendo assim, o código que criei acaba mudando alguma parte do arquivo que não está relacionado aos textos, limitei a área de substituição, porem sem sucesso, fazendo com que o jogo bug em algumas partes.