nos últimos 12 meses, trabalhei de maneira árdua pra mostrar ao mundo uma verdade que, embora óbvia para nós, ainda não é reconhecida internacionalmente: o fato de que nada é impossível diante de uma gambiarra brasileira. como toda boa história, é preciso ter um certo contexto, então segure minha mão e conheça nesta jornada cheia de amor e esperança...
no momento da escrita deste texto, existem vários homens brancos no planeta terra cujas carreiras consistem em falar sobre jogos no youtube. é um terreno fértil, e especialistas no assunto (normalmente outros homens brancos) seriam capazes de te dizer todas as nuances e particularidades das espécimes deste ecossistema -- não muito diferente de uma tia ou avó que consegue facilmente discernir plantas e passarinhos que para leigos parecem idênticos.
um desses homens brancos que fala sobre videogames no youtube se chama Tim Rogers, e no dia 1º de janeiro de 2021, foi publicado em seu canal um vídeo de 5 horas e 56 minutos contendo uma review do jogo "Tokimeki Memorial". como você está lendo esse texto, é altamente provável que não apenas conheça como tenha assistido ao vídeo em questão, mas peço a sua paciência durante os próximos parágrafos enquanto me dirijo e explico tudo aos outros 99% da humanidade
ao ler o título de seu mais recente vídeo, boa parte do público de Rogers (que não é pequeno) se mostrou assustada, pois apesar das reviews do homem apresentarem uma perspectiva incomum sobre diversos assuntos, o objeto da perspectiva normalmente era o mais comum possível; a exemplo da review anterior, que tinha sido de Pac-man (um jogo que praticamente todo mundo já ouviu falar de alguma maneira, até mesmo a sua tia ou vó que gosta de plantas e pássaros ("é o tal do... come-come que fala, né?"))
mas havia um bom motivo pra que Rogers fizesse um vídeo sobre um jogo tão pouco-conhecido como Tokimeki Memorial: apesar de não ter inventado o conceito de dating simulator, esse jogo foi o que popularizou o gênero, de modo que a indústria de videogames de hoje certamente não seria a mesma caso esse jogo não tivesse sido lançado em 1994.
...e tem um bom motivo, também, pro público de tim rogers não conhecer muito bem esse jogo: ele nunca foi lançado fora do Japão.
então veja: estamos diante aqui não apenas de um vídeo de 6 horas de duração, mas de um vídeo de 6 horas de duração sobre um jogo que muita gente não só não jogou, como não conhece, e mesmo ao conhecer, não vai poder jogar!!! é difícil de explicar por que alguém iria querer assistir um vídeo como esses, ainda mais milhões de alguéns (considerando que a review tem 1,7 milhões de visualizações, sendo a 2ª mais assistida do canal). a explicação mais imediata pra essa loucura coletiva é que a review não é sobre Tokimeki Memorial, mas sobre o que Tokimeki Memorial significa pra Tim Rogers -- as memórias de quando ele encontrou o jogo pela primeira vez, as histórias tangenciais de sua vida no Japão, as pessoas que passaram pela sua vida e que o jogo lhe faz lembrar... pensando assim, não é nem um pouco estranho que o vídeo tenha 6 horas e milhões de visualizações; o público do canal assistiria com a maior empolgação do mundo uma review de 10 horas sobre uma privada -- desde que fosse Rogers que estivesse sentado nela, enquanto conta pela enésima vez a história de quando viu alguém jogar Final Fantasy VII pela primeira vez num dormitório na Universidade de Indianápolis nos anos 90, ou enquanto gesticula fervorosamente sobre jaquetas de centenas de dólares
...mas tipo, o vídeo também é meio que sobre o jogo, né? não adianta ignorar: é sempre mais legal ver alguém falando sobre algo quando se conhece o "algo" do qual esse alguém está falando. em sua infinita astúcia, Rogers busca contornar essa questão. logo no início da review, ele diz: "não se preocupe com não ter jogado, ou poder jogar, tokimeki memorial! eu joguei o jogo para você", e o que ele quer dizer com isso é que 2 das 6 seções do vídeo (que juntas somam 1/3 da duração total da review) são, na verdade, playthroughs completas editadas e comentadas do jogo, de modo que tudo que você precisa saber sobre o jogo está contido nestas duas seções (que o Tim Rogers inclusive sugere que você pule, caso esteja sem tempo!! (o que pra mim faz tanto sentido quanto ir no cinema pra tirar um cochilo, mas cada um com seu cada um))
funciona? funciona. Rogers sabe o que está fazendo, e o fato de você não ter jogado o jogo certamente não compromete a experiência de assistir o vídeo de forma alguma.
mas assim.
é impossível ficar ouvindo uma pessoa discorrer sobre um jogo durante seis horas, um jogo labirintino com zilhões de escolhas e dúzias de finais diferentes, um jogo especificamente descrito pelo dito homem branco como "um teste de personalidade"...
...e não ficar com vontade de jogar o diabo do jogo.
o jogo não lançou fora do japão, beleza, mas certamente existe uma versão "extra-oficial", certo? considerando que estamos falando de um título tão fundamental e historicamente relevante como esse, que foi lançado há quase trinta anos, certamente ALGUÉM fez uma fan translation, certo?? certo?!?
...
mais ou menos.
"Tokimeki Memorial" foi lançado originalmente em 1994 pra PC Engine. no entanto, como o jogo fez bastante sucesso no Japão, ele foi relançado posteriormente em um zilhão de plataformas:
dentre essas versões, as de Sega Saturn e PS1 -- lançadas em 1996 -- são tidas como superiores, por conta de vários fatores como a riqueza gráfica e dublagem completa, sem falar no roteiro expandido; elas funcionam como um Director's Cut do jogo original. essas versões nunca foram traduzidas. a versão que foi traduzida é a de SNES, lançada em março de 2022 pela equipe Translated.Games. no entanto, nas próprias palavras de Tim Rogers...
“Playing Tokimeki Memorial for Super Famicom before playing it for Sony PlayStation, Sega Saturn, Windows, or PC Engine would be like watching a movie for the first time with the TV muted and two lines of subtitles displaying both the movie’s dialogue and the director’s commentary,” Rogers told Kotaku via email. “It’s not a Full Film; it’s a DVD bonus feature you throw on while waiting for your laundry to finish while also waiting for an important phone call.” Kotaku
ouch! essa doeu! imagina você assistir um vídeo sobre um jogo, reconhecer que muitas outras pessoas também viram o vídeo e se interessaram pelo jogo, decidir passar centenas de horas da sua finita vida trabalhando de graça pra traduzir o jogo, lançar a tradução pra comunidade... e o cara que fez o vídeo, o cara que te inspirou originalmente, dizer de maneira crua e simples: "ih, nem esquenta. não vale a pena." há de doer, e muita gente achou essa postura do rogers meio filhadaputagem (eu incluso)
...ainda assim, ele meio que tem um ponto. dá uma olhada na diferença entre a versão de SNES (que foi traduzida) e a versão do PS1 (a versão boladona que nunca foi traduzida).
a diferença é meio brutal, né? apesar de Rogers ter se expressado de uma forma meio infeliz, ele não estava exagerando tanto assim.
e aí a pergunta óbvia que fica é: por que que eles não traduziram a versão de PS1 então? e a resposta sendo: porque é difícil pra cacete!!! fazer engenharia reversa de um jogo é tipo desatar um nó; fazer engenharia reversa de um jogo como Tokimeki Memorial, que como mencionei, tem zilhões de caminhos possíveis, falas, finais, cenas secretas... é tipo desatar um nó cego no escuro, debaixo d'água, enquanto o nó tenta te matar. segundo fontes secundárias (i.e. pessoas no reddit), a versão de SNES pôde ser traduzida porque é mais simples, mas a programação das versões de Saturn e PS1 é um caos completo, de modo que todos os projetos para traduzí-las foram eventualmente abandonados diante da complexidade da tarefa, e elas permanecem sem tradução...
...até agora.
no dia 23 de outubro de 2023, por alguma razão a qual não me recordo exatamente, acabei decidindo re-assistir o vídeo do Tim Rogers. meu ritual pra esses vídeos longos, desde sempre, é assisti-los ao longo de vários dias enquanto almoço, e nesse dia não foi diferente: botei o vídeo no celular, apoiei o dispositivo numa garrafa de azeite que custa quase tanto quanto o celular, comi meu arroz com frango e batatas, e ao término da refeição, pausei o vídeo para continuar no dia seguinte.
exceto que, durante o período da manhã desse dia específico, eu estava escrevendo a minha tese de doutorado na área de inteligência artificial. em particular, eu estava escrevendo a parte da tese que não significa absolutamente nada, aqueles primeiros parágrafos que contém frases genéricas e vazias como "hoje, a inteligência artificial está por todos os cantos. ela nos permite fazer coisas que antes se acreditavam impossíveis, como direção automática, reconhecimento de voz, geração de imagens, ganhar "R$ 40 mil por mês" com pornografia, compor músicas fakes na voz da pabllo vittar que depois se tornam reais, tirar dúvidas sobre como instaurar a lei marcial no seu país, etc
e nesse dia, enquanto pensamentos desse tipo estavam frescos na minha cabeça e eu assistia um homem branco falando sobre um jogo japonês nunca-antes traduzido, meu monólogo interno resmungou: "a inteligência artificial consegue mandar o homem à lua mas não consegue traduzir um jogo!?!". ignorando-o, continuei vendo o vídeo.
só que apesar de ignorado, ele continuou trabalhando. enquanto eu era absorvido pela tela do jogo e pela voz melíflua de Tim Rogers murmurando coisas como "Keanu Reeves" e "Indianapolis", meu célebro foi entrando na onda alfa até que de repente fui fulminado por um acontecimento: dois neurônios da minha cabeça que não se conheciam acabaram tropeçando um no outro enquanto iam no bebedouro, e um falou desculpe desculpe mas que bagunça causei sou tão desastrado e o outro disse oh não eu que peço desculpas não o vi caminhando por aí, logo um neurônio tão forte e imponente como você, tão jovem e rígido, e as mãos dos meus neurônios se tocaram sem querer, e eles rapidamente as recolheram com vergonha, mas também com tentação, e eles olharam um pro outro de um jeito em iguais partes sensual e perigoso, e eu pausei o vídeo, e pronunciei -- em voz alta, tamanho meu entusiasmo -- o mesmo início de frase que as piores e melhores mentes da história pronunciaram antes de cometerem crimes e sacrilégios dos mais hediondos e perversos, antes de liderarem revoluções e decifrarem enigmas, a mesma frase que alexandre o grande apocrifamente deve ter dito enquanto ele olhava pro nó górdio e pra sua espada, e a mesma frase que alexandre de moraes disse quando caiu a ficha que ele havia se tornado um ministro do STF:
e se fizéssemos um programa que, a cada frame:
OCR significa "Optical Character Recognition", ou "Reconhecimento Ótico de Caracteres", e basicamente é um programa que recebe uma imagem e te devolve o texto contido naquela imagem
exemplo de OCRpode parecer uma tarefa fácil, mas é mais complicado do que parece -- especialmente quando você tem mais de 8.000 caracteres possíveis, como no caso do japonês!!
o resultado seria, efetivamente, uma versão do Google Lens que funcionasse em tempo real e de maneira diretamente integrada com a tela do jogo. vai ficar travado? não sei. vai ficar bom? não faço ideia. mas funcionaria -- no sentido de "seria possível jogar o jogo dessa forma"? com certeza sim; a estratégia fazia sentido.
peguei um lápis e rascunhei algo compreensível apenas para mim naquele exato momento:
rabiscos loucos à parte, nesse momento, quero deixar uma coisa 100% clara: não é assim que fan-translations são normalmente feitas!!!
suponhamos que você tem, na sua sala de estar, um quebra-cabeças emoldurado com um vidro de proteção, e que você quer -- não me pergunte o porquê -- trocar uma peça específica em seu centro (talvez ela tenha uma mancha, ou tenha sido roubada por uma aranha, ou quem sabe talvez ela contenha a imagem de um líder político cujos traços o Estado deseja apagar); seja como for, vamos partir do pressuposto de que você já tem a peça substituta, sendo que só falta enfiar ela lá.
a maneira sensata de fazer isso (i.e. como fan-translations são normalmente feitas) envolve:
é um processo longo e chato, mas se você fizer tudo certinho, é capaz de ninguém notar que o quebra-cabeça tenha sido alterado. o crime perfeito.
compare isso, por sua vez, com a maneira que eu estou propondo de fazer a troca: simplesmente colar a peça substituta por cima do vidro.
parece imbecil? pois é mesmo. mas como já se passaram 30 anos e ninguém conseguiu fazer do jeito certo... então vai do jeito estúpido mesmo!!
intoxicado com a imbecilidade da possível solução, mandei um áudio pro meu amigo pessoal cientista da computação ex-servidor público e músico da banda emerald hill disponível no spotify e agora também no netflix vitor figueiredo explicando a ideia, e ele me passou um link de uma funcionalidade do Retroarch que faz exatamente o que eu descrevi acima. vasculhando mais um pouco, encontrei um vídeo de um homem branco que fala sobre jogos no Youtube e usou a ferramenta do Retroarch pra jogar Tokimeki Memorial 2, mas os resultados não me impressionaram.
um software com objetivo parecido, mas específico pra visual novels, é o Textractor. da forma que eu vejo, ele traz duas inovações que elevam imensamente a qualidade dos resultados:
saca só:
infelizmente, o Textractor só funciona pra jogos Windows. adaptar ele pra funcionar pra Saturn/PS1/PC-98 seria tão fácil quanto adaptar um carro pra funcionar debaixo d'água: isto é, seria preciso construir outra coisa completamente diferente, e de preferência, do zero.
mas as ideias do Textractor podem ser reaproveitadas... e serão!!
pra recapitular, esse é o processo que a nossa ferramenta deve seguir:
pode parecer simples, mas dentro de cada um desses quatro passos existe um mundo de detalhes -- e é exatamente disso que vamos falar agora:
esse é o passo conceitualmente mais simples de todos, só que curiosamente, é o que mais me dava medo. tem uma tirinha clássica do XKCD que resume a situação:
basicamente, se não existisse uma biblioteca pro Python que tirasse screenshots de um outro programa de maneira simples e rápida, esse projeto estaria morto antes mesmo de nascer, porque não faço a menor ideia de como que eu poderia fazer isso. seria necessário se comunicar com o próprio sistema operacional, algo que eu definitivamente não queria fazer. felizmente existe uma biblioteca que faz exatamente o que eu precisava, então esse passo foi só fácil mesmo.
(mas óbvio que não dá pra vencer todas: quando você abre o emulador, a biblioteca tem uma chance de 1% de bugar, e aí você tem que reabrir o emulador pra ela voltar a funcionar. eu tentei descobrir porque ela faz isso e não consegui. é mais fácil só reabrir o emulador e seguir a vida)
agora sim a brincadeira começa a ficar legal!!
há alguns parágrafos atrás, introduzi o conceito de OCR, e falei sobre como podemos usar técnicas desse tipo pra transformar imagens em texto -- dando o exemplo do Google Lens. em seguida, falei que o Textractor não usa OCR, e que por conta disso ele é "melhor". afinal de contas, vamos usar o tal do OCR ou não?
de forma bem clara:
técnicas OCR demoram pra rodar.
o quanto é "demorar"? bom, depende do computador obviamente, mas pra você ter uma noção: no meu "PC gamer", uma textbox do jogo demora cerca de 60ms pra ser processada completamente, usando a biblioteca MangaOCR que é especializada em caracteres japoneses.
60ms pode parecer rápido, mas leve em conta que num jogo a 30fps, cada frame deve tomar no máximo 33ms -- praticamente metade do tempo! e pra piorar, 60ms é só pra detecção do texto, sem contar todos os outros passos (como por exemplo a tradução do texto em si). inviável!!
técnicas OCR são suscetíveis a erro.
sob condições ideais essas técnicas acertam os caracteres quase 100% das vezes, mas a vida real raramente atua sob condições ideais. as screenshots do jogo estão próximas disso (o texto sempre está de frente, sem blur, sem distorção, etc) mas elas apresentam um outro desafio bem cabeludo: a resolução.
como a resolução do PS1 é baixa (o jogo roda a 400x320), os caracteres são beem pequenininhos, de modo que certos kanjis ficam super difíceis de decifrar:
pasme, mas técnicas normais de OCR acabam errando alguns dos kanjis!
por conta disso, o ideal mesmo seria não usar OCR. só que tipo, como que a gente vai detectar os caracteres então? não tem nenhuma outra forma, tem?
mais ou menos.
vamos olhar uma screenshot do jogo mais de perto.
se você prestar bem atenção, vai perceber que cada caractere na textbox tem exatamente 11x11 pixels. isso é o que chamamos de uma fonte monospace
, pois todos os caracteres tem o mesmo tamanho (perceba que esse não é o caso pra maior parte das fontes que usamos no computador, como por exemplo a fonte na qual esse texto está sendo apresentado). por conta dessa característica, podemos facilmente extrair, a partir de uma screenshot do jogo, todos os caracteres mostrados na textbox na parte inferior da tela:
com isso, o desafio se torna: como que a gente, dada uma imagem 11x11, descobre qual o caractere japonês representado nesse espaço? se soubermos fazer esse mapeamento, o problema de descobrir qual o texto da textbox está resolvido!*
*(ignorando todas as exceções que vou falar mais pra frente)
a primeira coisa que fiz foi criar um catálogo de todos os caracteres japoneses que aparecem ao longo do jogo. a forma mais óbvia de fazer isso é jogando o jogo e extraindo os caracteres, mas depois de pensar um pouco acabei notando que tem uma forma muito mais fácil: analisando a tela de criação do save, já que na hora de decidir o nome do personagem, são apresentados 2,971 caracteres pro jogador (hiragana + katakana + kanji):
uf!
como eu ainda gostaria de jogar o jogo nessa encarnação, mapear cada caractere manualmente estava fora de cogitação. a questão se torna: como fazer isso de forma automática?
então comecei a pensar na fonte em si. a Konami era braba nos anos 90, mas eles não devem ter inventado uma fonte pra esse jogo especificamente, certo? são milhares de kanjis! provavelmente era uma fonte utilizada em vários outros lugares, mas qual fonte... nessas e noutras comecei a fazer umas buscas meio desesperadas no google, tipo "japanese font tokimeki memorial", "japanese font visual novels", "japanese font konami 1995"...
até que percebi que a resposta estava bem debaixo do meu nariz: é a MS Gothic, caceta!
MS Gothic, pra quem não sabe, é a Arial dos japoneses -- a fonte básica que vem com o Windows e que eles usam pra tudo, principalmente naquela época em que computadores pessoais estavam começando a aparecer. por conta disso, se você pega um software aleatório antigo em japonês na internet, há uma probabilidade razoável do texto estar em MS Gothic.
sendo MS Gothic a fonte do jogo, podemos resolver o nosso problema de um jeito bem sacana: basta procurar "lista de todos os kanjis hiragana e katakana" no google, copiar eles todos prum bloco de notas, alterar a fonte pra ser MS Gothic em tamanho 11, tirar uma screenshot, separar os caracteres da imagem... e pronto! agora temos uma lista de zilhões de caracteres japoneses e sabemos suas respectivas imagens 11x11!
em seguida, passei por todos os caracteres da tela de criação de save, checando se estavam todos contemplados nessa lista ou se havia algum kanji obscuro. para minha surpresa, havia mais ou menos uns 100 kanjis que você podia usar como nome do seu personagem, mas que simplesmente não existiam na MS Gothic. eles tinham matches próximos, mas não exatos, tipo:
e eu fiquei tipo... ahn!?! é 99% MS Gothic, e 1% diferente? que diabo é isso?
primeiro pensamento que veio à minha mente: a versão da MS Gothic que usamos hoje em dia não é a mesma versão que eles usavam naquela época. com um pouco de pesquisa, descobri que a fonte é mantida pela Ricoh, uma empresa japonesa de tecnologia (que inclusive manufaturou diversos componentes do NES). e de fato, segundo o site deles, o Windows 10 vem com a versão 5.11 da MS Gothic, sendo que a primeira versão publicada era... v2.3!?!
nesse momento, fiz o que qualquer pessoa sã faria, e instalei uma máquina virtual com o Windows 98 em japonês (o mais antigo que consegui fazer funcionar (vocês sabiam que é bem difícil instalar um sistema operacional sem ter a mínima noção do que está escrito!?)). abri o mesmo arquivo lá dentro e dei uma olhada nos kanjis...
de fato, alguns estavam iguais aos do jogo -- como eu tinha imaginado --, mas nem todos! e aí eu voltei na página da Ricoh e fui percebendo a profundidade do buraco.
vamos lá: o "MS" de "MS Gothic" significa "Microsoft", justamente porque a fonte foi criada pra ser a fonte padrão da versão japonesa do Windows. exceto que não, ela não foi criada pro Windows -- como vocês talvez tenham notado na imagem das versões da MS Gothic logo acima, a primeira versão publicada da MS Gothic é equivalente à versão 4.8 de uma fonte que já existia chamada HG Gothic. provavelmente, o texto de Tokimeki Memorial usa uma dessas versões mais antigas da HG Gothic, em que alguns kanjis eram representados de maneira diferente!
encurralado e sem opções, não tive muita escolha a não ser mapear cada um desses kanjis faltantes individualmente -- um trabalhinho de corno para o qual solicitei a ajuda de alguns amigos como o já-citado vitor d'emeraldi e o multidisciplinar victor de paiva. depois de algum tempo, eu tinha a lista final da qual eu precisava:
e com isso, finalmente conseguimos fazer o fluxo completo sem a ferramenta peidar pra nenhum kanji:
perfeito! podemos continuar pro próximo passo... certo?
meio que sim, mas me sinto compelido a comentar que há uma infinidade de detalhes, como por exemplo:
dentre outras coisas. tudo tem uma solução, mas de longe, esses pequenos detalhezinhos (muitos dos quais não são óbvios à primeira vista) são responsáveis por 90% do tempo de desenvolvimento. não vou entrar nos detalhes de nada disso pra poupar o meu tempo e o de vocês, mas acreditem quando digo: o método pode ser imbecil, mas não é fácil!
agora, um desafio completamente diferente: como pegar esse texto em japonês e traduzir pro inglês (ou português)?
idealmente, essa tarefa não teria nenhum mistério: é só pegar o script do jogo em japonês, traduzir ele pro inglês, e na hora que o texto que estiver na tela, a gente simplesmente procura a entrada no script e pega a tradução correspondente. fácil, né? infelizmente, o que a gente vai fazer não tem nada a ver com isso. por um motivo simples:
eu não tenho o script do jogo.
lembra quando eu falei que as versões de Saturn e PS1 tinham um código extraordinariamente complexo e que era basicamente impossível fazer engenharia reversa deles? pois então, é igualmente difícil extrair o script dos arquivos do jogo. o já-citado victor de paiva trouxe à minha atenção a existência de um script parcial na internet japonesa, mas essa versão é incompleta, e aí temos um outro problema pra resolver: o que fazer se encontramos uma linha de diálogo que não está no script? meio que continuamos no zero-a-zero.
mas espera... a versão de Saturn e PS1 é difícil de fazer engenharia reversa -- mas e a versão de SNES que foi traduzida? certamente os autores da tradução tinham um script do jogo! as versões são diferentes, mas... o quão diferentes? será que o overlap é de 99%? entrei em contato com o tradutor responsável e... nada. fui sumariamente ignorado pelo famigerado Tom (não confundir com Tim)
pois bem, como diz o ditado: fudido, fudido e meio. junto a meus botões, pensei: e se a gente partisse de um script incompleto mesmo, e caso a ferramenta encontrasse uma fala que não estivesse contemplada no script, ela usasse machine translation pra fazer a tradução -- e adicionasse ela ao script? tudo bem que machine translation não é tão bom quanto uma tradução humana, claro, mas a ideia central é que a fala teria sido adicionada ao script com uma tradução default -- se um tradutor humano quisesse botar uma tradução melhor, ele estaria totalmente livre pra fazer isso, e o próximo jogador poderia aproveitar a tradução dele!! dessa forma, seria quase algo colaborativo: cada jogador encontraria falas novas, e juntando as falas novas encontradas por cada um, teríamos um script do jogo cada vez mais completo.
o fluxograma ficaria assim:
e o script seria um arquivo CSV (tipo um excel) da seguinte forma, que poderia ser editado livremente entre sessões de jogo:
simples, flexível e eficaz!!! fiz alguns testes e funcionou que uma beleza. basicamente estaríamos aproveitando o melhor dos dois mundos: a tradução just-in-time do machine translation, com a qualidade de uma tradução humana.
testes preliminares mostraram que isso funciona pra 99% dos casos, mas infelizmente, é aquele 1% que traz a maior dor de cabeça. um exemplo de problema, pros nerdes de plantão: algumas linhas de diálogo mencionam o nome do jogador (ex.: "Ah, obrigado, VINICIUS-kun!"). como lidar com o fato de que diferentes jogadores podem ter diferentes nomes? isto é, como evitar que a ferramenta detecte algo como uma fala nova, quando na verdade é uma fala que já foi mapeada -- mas com outro nome de jogador?
<PNAME>
ou <PNICKNAME>
.problema que surge: e se o nome do jogador for algo genérico, tipo "おはよう/ohayou/bom dia"? toda linha de diálogo que tiver "おはよう/ohayou/bom dia" no meio vai ser afetada pela substituição, de modo que a frase "Ah, não te vi aí! Bom dia!" será salva como "Ah, não te vi aí! <PNAME>
!" e um jogador com o nome "CARLOS" a lerá como "Ah, não te vi aí! CARLOS!". vai ficar tudo cagado...
<PNAME>
; salva no script a frase com o nome do jogador customizado mesmo. mas altere a ferramenta pra que ela não precise encontrar um match idêntico no script: se ela encontrar um match com até 3 caracteres de diferença (tamanho máximo do nome do jogador), ele o retorna.problema que surge: existem linhas de diálogo que são idênticas exceto por 1 ou 2 caracteres -- e esses caracteres fazem toda a diferença na compreensão da frase. a tradução vai ficar toda cagada
PLA
e sobrenome YER
, em caracteres românticos mesmo, que raramente são usados no japonês. é basicamente uma versão mais estúpida da solução 1 logo acima, mas sem o problema que ela cria. agora você sabe por que diabos tem um PLA
nas screenshotsresolvido isso, a única questão que resta é: qual serviço de tradução automática utilizar? minhas pesquisas levantaram três candidatos:
sem sombra de dúvidas, o DeepL pareceu a melhor opção. a única desvantagem dele é que você precisa botar teu cartão de crédito pra liberar a API, mas considerando que todas as três ferramentas tem essa mesma desvantagem... ele continua sendo a escolha superior. e se 500,000 caracteres gratuitos parece pouco: zerar o jogo uma vez, traduzindo absolutamente tudo, consome aproximadamente 40,000 caracteres. é mais provável que você fique sem tempo pra jogar do que sem uso restante na sua conta da DeepL
com isso resolvido, resta apenas o último passo: pegar o texto traduzido e mostrar ele na tela.
esse passo não tem muito mistério: usei uma biblioteca do python chamada tkinter pra apresentar o texto traduzido na tela. felizmente a biblioteca me permite customizar várias coisas, tipo: adicionar uma imagem de fundo, remover a barra de ferramentas e posicionar a janela sempre na frente de tudo. de modo que isso:
se torna isso:
muito melhor, né?
a pegadinha (porque sempre tem uma pegadinha) é que até agora eu só falei da textbox, mas tem zilhões de outros textos pequenos na tela que precisam ser traduzidos pra experiência estar completa -- como por exemplo o painel no canto direito da imagem acima, que mostra que a data atual é segunda-feira 8/5/95. cada uma dessas coisinhas possui uma posição, background e estrutura próprias, o que significa que na prática, vamos ter de criar um overlay pra cada um, totalizando mais de duzentos overlays. em outras palavras, o programa cria mais de duzentas janelas no teu windows quando ele abre. essa é a razão por trás desse samba durante o setup:
eu experimentei com a ideia de fazer uma tela única, que a cada frame renderizaria a screenshot do jogo original e posicionaria de maneira correta todo o texto necessário. de certa forma, ficaria mais "limpo"; o problema é que aí o programa teria que fazer malabarismos pra conseguir manter o framerate do jogo original, e como Python é uma linguagem meio lenta (isso sem considerar o machine translation sendo feito na hora), acabei concluindo que não valeria a pena toda a dor de cabeça. abrir duzentos overlays ainda é menos doloroso do que ter que garantir que toda iteração do teu game loop dure menos de 16.67ms.
reunindo cada um dos passos, temos esse fluxograma confuso e terrível:
e acredite em mim, isso é uma versão simplificada do programa, sem considerar os detalhes que me deixaram louco...
como por exemplo o fato de que no painel de data à direita, o dia da semana é sempre branco, exceto o sábado que é azul e o domingo que é rosa:
ou então o fato de que a textbox de vez em quando apresenta escolhas:
escolhas estas que, obviamente, possuem várias maneiras diferentes de serem apresentadas -- não apenas a coluna única acima, mas dupla coluna:
e quádrupla coluna:
uma variedade de escolhas, claro, que também pode ser encontrada nos "menus do telefone": quando você vai ligar pra uma garota, são três colunas de escolhas:
mas quando você liga pra garota e quer escolher um local pra vocês saírem, o menu tem duas colunas apenas, e um botão pra passar de página:
que, veja bem, é um menu de duas colunas completamente diferente do menu de duas colunas usado na tela de configuração do jogo (note a diferença na linha do meio):
isso sem falar na tela infernal da revista in-game, que diz os eventos que estão por vir (show de rock, jogo de baseball, etc):
ou no fodendo fim do jogo, em que existe uma cutscene completamente voice-acted na qual a garota que você estava paquerando decide confessar seu amor por você (caso tenhas conseguido paquerá-la corretamente):
todas essas telas e casos excepcionais requisitaram uma atenção especial. depois de muito sufoco e mais ou menos um ano de desenvolvimento on-off, fui capaz de deixar a ferramenta num estado que considerava satisfatório. no dia 14 de setembro de 2024, publiquei no youtube um vídeo de gameplay de 1 hora mostrando o estado da ferramenta, e criei um discord pra que as pessoas pudessem entrar e pedir ajuda / compartilhar coisas.
pra minha agradável surpresa, a recepção foi super positiva! hoje, 5 meses depois da publicação do vídeo, o discord já tem mais de 100 membros e várias pessoas conseguiram jogar o jogo graças à ferramenta, que nomeei "xeupiu". o nome vem de um trecho específico do vídeo do Tim Rogers, no qual ele reconta uma anedota relatada pelo Tim Rogers na sua review:
nada mais adequado pra um projeto brasileiro de tradução quebrada!!
na data de redação desse texto (13/03/2025), o projeto se encontra no seguinte estágio: várias pessoas jogaram o jogo, e graças a elas, o script já tem mapeadas cerca de 7.000 linhas de diálogo (bem acima dos 3.000 iniciais do script incompleto). uma guria nipófona chamada evelyn se voluntariou pra fazer a tradução manual do jogo, então estou aguardando ela concluir essa parte pra poder dizer que o jogo é traduzido manualmente; enquanto isso não acontece, todas as traduções foram feitas de forma automática usando o DeepL (como falei acima) e o GPT mais boladão que existe (que eu pago do meu bolso pra passar pelo script de vez em quando, já que a qualidade é um pouco melhor do que a do DeepL).
estou satisfeito com o projeto. a tradução às vezes é um pouco quebrada, mas é perfeitamente possível zerar o jogo de cabo a rabo sem falar um pingo de japonês (como vocês podem ver no vídeo de showcase acima). ainda tem alguns pequenos bugs, mas honestamente, é um jank raro que não vou consertar: considere-o um tempero especial que faz parte da experiência.
só tem um problema...
durante a Nintendo Direct do dia 27 de agosto de 2024, um silêncio de décadas foi quebrado, quando anunciaram que no dia 5 de maio de 2025 seria lançado um remaster oficial de Tokimeki Memorial pra Switch.
nada foi dito a respeito de uma possível localização do jogo, mas a internet se encheu de rumores sobre a inevitabilidade de uma tradução: mesmo que nenhuma publisher aceite localizá-la, a versão do jogo pra Switch será sem dúvida muito mais maleável a engenharia reversa do que as versões ancestrais de PS1 e Sega Saturn -- de modo que no curto/médio-prazo, teremos uma versão traduzida do jogo oficial ou extra-oficial, e todas as gambiarras acima serão tidas como desnecessárias.....
tipo, vamos lá. por um lado é ótimo, já que mais pessoas vão poder jogar o jogo, e poderão ter suas vidas revitalizadas pela existência de Yuina Himoo... só que por outro lado, significa que todo o tempo que eu passei fazendo esse projeto foi criando uma ferramenta que, pouco tempo depois do seu lançamento, já se tornou obsoleta!
eu poderia dizer que o verdadeiro xeupiu foram os amigos que fizemos pelo caminho e que o que importa é a jornada, ou qualquer outra trivialidade (fundamentalmente correta) como essas, mas honestamente, quando você passa 5 horas mapeando kanjis, é difícil dizer que "a jornada está valendo a pena". eu prefiro olhar por outro ângulo:
tudo é meio que "em vão", né?
tudo eventualmente é esquecido, por um motivo ou outro. nenhum dos jogos do neopets funciona mais. zilhões de jogos de cd-roms não rodam de jeito nenhum nos computadores modernos. por deus, vinizinho's circle showdown, o multiplayer battle arena que consumiu minha vida durante quase 1 ano, simplesmente não pode ser jogado hoje em dia com 4 jogadores por conta de uns mal-entendidos entre a unity e o windows!
e tá tudo bem. como disse o _why: "programming is rather thankless. u see your works become replaced by superior ones in a year. unable to run at all in a few more." são as regras do jogo, todos sabemos quando entramos. como contrapõe bad bunny: el que tenga miedo a morir que no nazca!
durante toda minha vida vou poder dizer que, graças à tradição ancestral da gambiarra brasileira, concretizei meu sonho de fazer uma fan-translation. isso nunca vai deixar de ser verdade!
o fato de eu não ter que responder mais issues no github sobre o assunto? é a cereja no bolo