Uma tradução amadora de contos visuais, quando comparada com traduções de outros jogos, possui vários recursos e envolve trabalhar com muito texto. Talvez a grande maioria de todos os romances visuais tenha sido lançada em japonês, apenas alguns foram traduzidos para o inglês (oficialmente ou por amadores), e menos ainda foram traduzidos para outros idiomas.
Portanto, ao trabalhar com tradução, você precisa lidar com os mecanismos japoneses, muitos dos quais não são muito amigáveis para os localizadores. Por causa disso, rapidamente se percebe que a presença de habilidades de tradução, conhecimento do idioma, grande entusiasmo e tempo livre não significa que a versão traduzida do jogo em breve verá a luz do dia.
Muito grosso modo, o processo de tradução de qualquer jogo (não apenas histórias curtas visuais) implica:
- Descompactando recursos do jogo (se não estiverem em domínio público)
- Tradução das peças necessárias
- Transferência de embalagem reversa
No entanto, no caso de contos visuais japoneses, isso geralmente se parece com:
- Desempacotando recursos do jogo
- Tradução da parte do texto do jogo (script do jogo)
- Tradução da parte gráfica do jogo
- Transferência de embalagem reversa
- Alteração do mecanismo para fazê-lo funcionar com conteúdo traduzido
Espero que nossa experiência seja útil para alguém.
Em 2013 (e possivelmente mais cedo), decidi traduzir do japonês o romance visual Bishoujo Mangekyou-Norowareshi Densetsu no Shoujo- (美 少女 万 華 鏡 - 呪 わ れ し 伝 説 少女 -). Eu já tinha experiência em traduzir jogos, mas antes tinha que traduzir apenas histórias curtas em mecanismos relativamente simples e conhecidos como
Kirikiri .
Aqui, nossa equipe de tradutores teve que abrir o mecanismo deste conto, mesmo antes de chegarmos ao texto propriamente dito.
Vamos começar com uma descrição do arquivo .exe, onde são mencionadas as palavras QLIE e IMOSURUME. O arquivo em si contém a linha FastMM Borland Edition 2004, 2005 Pierre le Riche, o que significa que o mecanismo provavelmente está escrito em Delphi.
Uma rápida pesquisa revela que Qlie é o nome do mecanismo de romance visual lançado pela Warmth Entertainment. Aparentemente, IMOSURUME é o nome interno do mecanismo de script e Qlie é o nome comercial. Existe um site
qlie.net , que lista os jogos lançados neste mecanismo e o site oficial da Warmth Entertainment.
Mas em nenhum lugar do domínio público não há ferramentas oficiais para trabalhar com o mecanismo, nem documentação para isso, o que é esperado.
Portanto, você deve lidar com o jogo, contando com utilitários não oficiais. Para começar, você deve encontrar todas as partes do jogo que precisam ser traduzidas.
Os arquivos do jogo estão localizados nos arquivos data0.pack, data1.pack e data7.pack na subpasta \ GameData. Os protetores de tela estão na pasta \ GameData \ Movie, mas você ainda pode deixá-los em paz.
O editor hexadecimal mostra que não há cabeçalhos reconhecíveis para os arquivos .pack do jogo, mas no final do arquivo há uma peça semelhante ao sumário e ao rótulo FilePackVer3.0
Felizmente, para este formato, já existe um desempacotador e nem mesmo um. Usamos o console exfp3_v3 da asmodean.
Desembalar não é tão fácil quanto parece. Como o mecanismo suporta vários formatos de arquivo morto (FilePackVer1.0, FilePackVer1.0, FilePackVer3.0) e, neste caso, o FilePackVer3.0 é usado, para a descompactação correta, você também precisará de um arquivo de chave especial key.fkey, que criptografou o arquivo. Ele está localizado na subpasta \ Dll
Além disso, exfp3_v3 deve esclarecer o arquivo de qual jogo está descompactando.
Portanto, você também precisa especificar o número do jogo na lista proposta pelo desempacotador (os jogos da série Bishoujo Mangekyou estão no número 15) ou especificar o arquivo executável do jogo como o terceiro parâmetro para o desempacotador.
Depois de descompactar os arquivos do jogo, surgiu um pensamento lógico: como no futuro como empacotar o jogo com uma tradução pronta? Afinal, o desembalador não suporta a operação reversa.
A nosso pedido, o w8m (muito obrigado por isso) adicionou a capacidade de compactar arquivos do jogo em seu programa arc_conv.exe. É o suficiente para empacotar todos os arquivos alterados em um novo arquivo (por exemplo, data8.pack), colocá-lo na pasta GameData e eles entrarão automaticamente no jogo.
Voltar para os recursos descompactados. Os arquivos de script do jogo do arquivo data0.pack podem ser encontrados na subpasta \ scenery \ ks_01 \
Todos os arquivos de script com a extensão .s são codificados longe da codificação Shift Jis mais conveniente, e o mecanismo não suporta nenhuma codificação unicode. As linhas da tradução se parecem aproximadamente com estas:
【キリエ】 %1_kiri1478% 「へえ……分かっているじゃない」 私が献上したロシアンティーを見て、キリエは嬉しそうに目を細める。 ^cface,,赤目微笑01 【キリエ】 %1_kiri1479% 「日本人は、ジャムを紅茶に入れて飲むのが、ロシアンティーだと勘違いしている人が多いのだけれど……」
Você pode perceber que cada frase em japonês é precedida pelo nome do herói entre colchetes japoneses. (【】), Que pronuncia esta frase (no jogo ela é exibida no topo da janela com texto). Ou, se essas são as palavras do autor, o nome não é adicionado.
Mas ainda existem equipes de serviço.
Os comandos do mecanismo no script lembram um pouco a linguagem de marcação TeX, mas são muito mais intuitivos e inconvenientes em comparação com os
comandos Kirikiri ou
RenPy .
Aqui estão alguns deles:
@@@
é um cão triplo. Geralmente, os arquivos de script começam com este comando. Aparentemente, carregando definições de arquivos de terceiros.
Por exemplo:
@@@Library\Avg\header.s
@@
é um cachorro duplo. O rótulo no arquivo de script. Você pode mudar para isso mais tarde.
%1_kiri1478%
- reproduz o arquivo de voz. Esses comandos são inseridos entre o nome do herói e o texto exibido na tela. “1_kiri1478” - nesse caso, o nome do arquivo da pasta \ voice \ do arquivo data1.pack É interessante que a equipe use a porcentagem em japonês (%), em vez da usual.
^savedate, ^saveroute, ^savescene,
- três equipes que provavelmente são usadas no sistema de salvamento do jogo e devem inserir informações sobre o local e a hora em que o jogador foi salvo no jogo salvo.
Por exemplo:
^savedate,"現在" ^saveroute,"美少女万華鏡-1-" ^savescene,"呪われし伝説の少女 オープニング"
Ou seja, data: presente, filial: Bishoujo Mangekyou -1-, cena: Norowareshi Densetsu no Shoujo Opening. Esses dados deveriam ter sido exibidos no slot de salvamento, mas aparentemente os desenvolvedores decidiram abandoná-lo. Como resultado, o
^saveroute
em todas as partes do script,
^savedate
alterações do "momento presente" para "sonhos" e, na
^savescene
os dias no jogo (ou melhor, as noites) mudam.
^facewindow,
- estado da caixa de texto com o texto exibido na tela. (Mostrado - 1 ou não - 0)
^sload,
- reproduz sons do jogo na pasta \ sound \ no canal correspondente.
sload,Env1,◆セミ01アブラゼミ
Tocando cigarras no Env1
A equipe tem dois parâmetros opcionais, o primeiro é responsável por repetir o som e o segundo permanece um mistério, mas raramente é usado no jogo.
^sload,SE1,■クチュ音01,1
Reproduzir som de loopback no canal SE1.
^eeffect
- exibe um efeito especial na tela por um determinado número de segundos. Aparentemente, ele suporta saída sequencial de vários efeitos.
^eeffect,WhiteFlash
O efeito de um flash branco.
^ffade
- efeito de transição ao alterar a tela.
Ele tem vários parâmetros adicionais, mas apenas alguns são realmente úteis: o nome do efeito de transição, uma imagem adicional, se necessário, e o tempo de conclusão da transição.
^ffade,Overlap,,1000
Dissolvendo uma imagem em outra, em 1 segundo.
^iload
- carrega a imagem de fundo na tela. É possível atribuir à imagem um ID para referência futura.
^iload,BG1,0_black.png
Arquivo de saída 0_black.png como plano de fundo com o ID BG1
^we
e
^wd
- liga e desliga a imagem na janela.
^facewindow,1
e
^facewindow,0
Ativa e desativa a imagem do herói na caixa de diálogo.
^mload
- reproduz música em um canal específico.
^mload,BGM1,nbgm13
Reproduzindo a faixa nbgm13 no canal BGM1
Algumas das equipes mais importantes:
\jmp
- pula para o rótulo com o nome especificado.
^select
- exibe a janela de seleção na tela, onde o jogador deve escolher uma das opções.
Por exemplo:
^select, , \jmp,"@@route01a"+ResultBtnInt[0] @@route01a0
Aqui a transição será realizada após a resposta à pergunta e o número da resposta (0 ou 1) é retornado de ResultBtnInt [0]. Como resultado,
\jmp
moverá a história para o rótulo @@ route01a + número de resposta. Ou seja, @@ route01a0 ou @@ route01a1
Um recurso desagradável é que a vírgula usual nesses comandos serve como separador e não pode ser usada nas próprias opções de resposta. Os japoneses não têm esse problema, eles usam a vírgula japonesa (、). Nesse caso, podemos substituir a vírgula por ‚(U + 201A ÚNICA MARCA DE COTAÇÃO BAIXA-9).
Por exemplo:
^select, ‚ , ‚
As demais equipes não são tão importantes na primeira aproximação.
Obviamente, antes de traduzir o script, você deve transcodificá-lo para algo mais conveniente, por exemplo, em UTF-8, para combinar caracteres cirílicos e japoneses.
Depois de mudar o mecanismo (sobre a próxima parte), o jogo percebe o texto em russo e o japonês. Mas, por enquanto, para compatibilidade, você precisa codificar caracteres japoneses em Shift Jis e caracteres cirílicos na codificação cp1251.
Esboçamos rapidamente um programa em Python para transcodificação, levando em consideração o alfabeto cirílico:
UTF8 para cp1251 e ShiftJIS No entanto, houve alguns problemas. O programa, ao tentar recodificar o símbolo “til” U (U + FF5E LARGURA TOTAL), gerou um erro “UnicodeEncodeError: o codec 'Shift Jis' não pode codificar o caractere '\ uff5e' na posição 0: sequência ilegal de multibytes”
No começo, pequei no Python, mas no final descobri uma nuance bastante incomum. Há uma ambiguidade entre os métodos de correlação das codificações em japonês Unicode e não Unicode, dependendo da implementação específica.
Como resultado, o Windows associa o caractere Shift Jis ao código 0x8160 ao unicode ~ (U + FF5E FULLWIDTH TILDE) e outros transcodificadores (por exemplo, utilitário iconv) correlacionam o mesmo caractere com 〜 (U + 301C WAVE DASH), de acordo com a tabela oficial de taxas Unicode -
ftp://ftp.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFT JIS.TXTPara determinar a correspondência entre os caracteres, a Microsoft aparentemente decidiu usar os esquemas da codificação cp932, que é uma versão estendida do Shift Jis.
A mesma situação ocorre com o código de caractere 0x817C, codificado em UTF8 como - (U + FF0D HYPHEN-MINUS) no Windows ou como - (U + 2212 MENOS SIGN) no iconv.
Como todos os arquivos de script foram convertidos pela primeira vez do Shift Jis para UTF8 usando o Notepad ++ (e ele usa a tabela de correspondência adotada no Windows), ao converter novamente de UTF8 para Shift Jis por meio do nosso programa Python, o notório erro de conversão apareceu.
Portanto, era necessário levar em consideração a ocorrência de ~ e - condições separadas.
Havia outras falhas menores - por exemplo, as reticências ... (U + 2026 ELLIPSIS HORIZONTAL) foram substituídas pelas reticências cirílicas da cp1251, e não as japonesas da Shift Jis.
Depois de traduzir o texto, você pode continuar trabalhando com gráficos de jogos.
Os arquivos gráficos do jogo estão nos mesmos arquivos, mas após descompactar, eles ainda precisam trabalhar duro. Por exemplo, quase todas as imagens png são descompactadas como arquivos do tipo sample + DPNG000 + x32y0.png Em outras palavras, as imagens png são cortadas em faixas horizontais com 88 cm de espessura e cada faixa é gravada em um arquivo separado. O nome do arquivo mostra o número de série da faixa (DPNG000 ... 009) e as coordenadas x, y.
Ainda estou me perguntando por que isso era necessário. Se pela dificuldade de extrair recursos do jogo, esse claramente não é o melhor método.
Para colar os arquivos png recortados, um pequeno script merge_dpng no Pearl da asmodeus, que usa o ImageMagick, foi criado ao mesmo tempo. Infelizmente, houve problemas com ele. Primeiro, eu precisava do Pearl, que não usava, e mesmo depois de instalá-lo, o script não estava funcionando corretamente.
Por esse motivo, escrevemos um programa semelhante em python:
Qlie engine dpng fusão de arquivos Parece que agora temos todo o conjunto de imagens que aparece no jogo? Nem um pouco - se você olhar para todas as fotos conectadas de todos os arquivos, ainda verá que algumas estão faltando, embora estejam no jogo. O fato é que existe outro tipo de arquivo no mecanismo - com a extensão .b. É um pouco de animação com imagens e sons gravados dentro.
É muito fácil obter os recursos armazenados, mas, infelizmente, nenhum dos descompactadores de arquivos .b já funcionou no nosso caso, como deveria. Alguns arquivos permaneceram descompactados ou houve erros devido a nomes em japonês, e eu não queria inicializar a partir do código do idioma japonês.
Aqui mais um script foi útil. Desde então, não estávamos familiarizados com algo como o
Kaitai Struct , tivemos que agir quase do zero.
O formato dos arquivos .b acabou sendo simples e, além disso, nosso desempacotador foi obrigado a poder desempacotar recursos somente deste jogo. Em outros jogos no mecanismo Qlie, tipos adicionais de recursos apareceram nos arquivos .b, mas não iremos nos aprofundar neles em detalhes.
Portanto, abra qualquer arquivo .b em um editor hexadecimal e observe o início. Antes de avaliar, observe que a ordem dos bytes de todos os valores numéricos será Little-endian.
- Cabeçalho do arquivo Abmp12
- Dez bytes 0x00
- O título da primeira seção abdata12 com informações gerais.
- Oito bytes 0x00
- Tamanho da seção abdata12, número inteiro de quatro bytes. Você pode ignorá-lo com segurança.
- Cabeçalho da seção Abimage10
- Sete bytes 0x00
- Número de arquivos em uma seção, número inteiro de byte único. Nesse caso, há um arquivo na seção
- Cabeçalho da seção abgimgdat13
- Seis bytes 0x00
- O comprimento do nome do arquivo dentro da seção, um número inteiro de dois bytes. Nesse caso, o comprimento é de 4 bytes.
- Nome do arquivo codificado Shift Jis
- Comprimento do registro da soma de verificação do arquivo, número inteiro de byte duplo.
- A soma de verificação do próprio arquivo.
- O byte desconhecido parece ser sempre 0x03 ou 0x02
- Doze bytes desconhecidos, possivelmente relacionados à animação
- O tamanho do arquivo png dentro da seção é um número inteiro de quatro bytes.
E, finalmente, o próprio arquivo png.
A seção absound é semelhante em estrutura à imagem.
O script deve descompactar automaticamente os arquivos png, jpg, bmp, ogg e wav encontrados. Mas além disso, arquivos imoavi desconhecidos também são encontrados dentro.
A conclusão é que, no jogo, todas as animações são feitas como um vídeo completo no formato ogv ou como imagens animadas por mecanismo que são gravadas em arquivos .b ou como sequências animadas de arquivos jpg no formato imoavi.
Nesse caso, também estávamos interessados em imagens jpg, então tivemos que lidar com elas também.
Existem duas seções no imoavi: SOUND e MOVIE. Na seção FILME, 47 bytes após o cabeçalho, há quatro bytes do tamanho do arquivo jpg. Os arquivos são gravados um após o outro em sua forma original, separados por uma sequência de 19 bytes, onde o tamanho do próximo arquivo é gravado.
Os imoavi dublados no jogo não apareceram, então a seção SOUND está sempre vazia.
Bem, desde que começamos a extrair todos os recursos do jogo, ao mesmo tempo um pequeno script foi escrito para extrair jpg do imoavi.
Após descompactar, você pode garantir que a animação da tela inicial no menu seja armazenada apenas no arquivo 1_ no formato imoavi (arquivo 1_ タ イ ト 画面 画面 ム ー ビ .b).Isso é tudo com recursos do jogo.Infelizmente, o processo de tradução revelou várias nuances mais desagradáveis que não puderam ser superadas. O jogo, como já escrevi, não suporta codificações Unicode. Portanto, todo o texto traduzido é exibido com o espaçamento incorreto das letras. Houve mais alguns problemas com arquivos de mochila e início de um jogo sem alterar a codificação do sistema para japonês.Em algum momento, nós (ou melhor, o responsável pela parte técnica da tradução em nossa equipe) pensamos: talvez não devêssemos ficar com o mecanismo antigo, mas portar o romance para o mecanismo Renpy, ao mesmo tempo em que recebemos plataformas cruzadas?Talvez estivéssemos com pressa, mas em algum momento foi uma pena abandonar o que começamos e não havia mais nada a fazer além de terminar a tradução.O que encontramos durante a portabilidade?Sobre isso na segunda parte.Links:Nossos scripts de bitbucketSobre atabela de codificação Shift Jis do mecanismo japonês QlieLeia mais sobre o problema da transcodificação de Shift Jis para UTF-8Utilitário asmodean exfp3_v3