Salve, cheaters!
Para quem gosta de abrir o capô do carro e ficar observando o motor sem entender nada, chegou a hora de fazermos o mesmo com códigos de jogo! E com sorte, daqui alguns parágrafos vai ser possível até entender alguma coisa.
Esse texto é a sequência da semana passada – GameShark (A Teoria) – e nele vamos dar mais um passinho para entender todas as engrenagens que mantém nossos jogos rodando e como podemos substituir algumas delas, seja para trapacear ou para criar mods e novas mecânicas.
Como um código é escrito?
Para aqueles que não programam, pode parecer meio místico as sequências hexadecimais inseridas no Gameshark e em outros mecanismos de cheat, como naquele exemplo do último texto.
E de fato programação é mágico mesmo, não há dúvidas de que os seres humanos desenvolveram essa tecnologia fazendo engenharia reversa em naves alienígenas. No entanto isso não nos impede de entender, escrever e modificar códigos independente da linguagem usada.
No primeiro texto da coluna já falamos brevemente sobre algumas linguagens de programação e hoje vamos focar em uma delas, o JavaScript. Escrevi um pequeno exemplo para dissecarmos:
Esse é um script bem enxuto que pode ser usado para controlar uma barra de vida, o total de hitpoints e coisas do tipo. Para entender o que aconteceu aqui em cima vamos separar em partes.
var vidaJogador = int;
Logo de início temos a criação de uma variável, ou seja, um valor que pode ser alterado ao longo do jogo, sendo “var” o que precisamos escrever para explicar ao processador que virá uma variável na sequência. Foi definido o nome “vidaJogador” mas poderia ser absolutamente qualquer coisa, o importante é nos lembrarmos do que se trata. Finalizamos com “= int”, para definir que o valor da vida será um número inteiro, sem vírgulas ou firulas matemáticas.
function Awake ( )
Essa função é nativa da engine que eu utilizei, o Unity3D. Ela faz com que tudo que estiver dentro das chaves seja executado quando a fase for carregada, apenas uma vez.
vidaJogador = 100;
Esse trecho é auto explicativo, a variável que definimos no início foi preenchida com o valor 100 e pode representar 100 hitpoints, 100% de vida, etc.
function Update ( )
Diferente do Awake ( ) que roda o código apenas 1 vez, o Update roda códigos e checa valores uma vez a cada atualização de frames. Isso significa pelo menos 30 vezes por segundo nos consoles.
if (vidaJogador == 0) {Application.Quit( ); }
O “if” é um dos pilares da programação e está presente de diferentes formas em todas as linguagens. Ele faz com que um código seja executado quando e “Se” um critério for alcançado, por exemplo, você ganhará uma vida extra “Se” conseguir 100 moedas no Super Mario World. Já no exemplo acima, estabeleci um destino um pouco punitivo para o jogador que zerar seus pontos de vida, com o código Application.Quit o jogo será brutalmente fechado sem ao menos uma mensagem de game over.
Hackeando o código
Para hackear um script primeiro você precisa ter acesso a ele. Perfeito se o script é seu e está salvo na sua área de trabalho, dois cliques e pronto. Mas raramente as coisas são tão simples e os desenvolvedores em geral não querem ninguém bisbilhotando suas linhas de código.
Seja por desejarem um jogo mais justo ou por medo de ter o código fonte roubado, as empresas normalmente adicionam mecanismos que bloqueiam acesso direto ao código ou tornam ele ainda mais difícil de ler usando criptografia. E é aí que entram ferramentas como o Game Shark e outros Trainers conhecidos por quem joga no PC.
Vamos imaginar que, para fins de exemplo, o desenvolvedor descuidado deixou aquele script de vida dando bobeira, solto dentro da pasta do jogo. Você abriu e agora o que dá pra se fazer?
Linha tênue entre quebrar e “aprimorar” a experiência
Sabendo o que cada código significa vamos direto para a linha 6 que, conforme a imagem, representa a vida do personagem. Vamos ampliar isso aí, que tal transformar 100 em 1000…. ou 100 mil! Há chances disso dar certo.
E que tal ousar? Sabendo que o processador do videogame é uma calculadora potente, podemos tentar preencher a variável com uma equação que retornará um número infinito como a do Pi (π) e assim teremos vida infinita também, certo? Sinto dizer que na segunda linha foi estabelecido que a variável só aceitará números inteiros e ao tentar realizar o cálculo, o resultado será 3,14159… e assim o jogo irá quebrar e precisará ser reiniciado.
Outra pequena modificação que podemos fazer é apagar a linha 13 “Application.Quit ( )” e preencher o espaço com o conteúdo da linha 6 “vidaJogador = 100;”. Alguém chuta o que pode acontecer?
Criando novas mecânicas
Mudando alguns valores em um código, podemos criar um jogo completamente novo. Vai exigir também algum retrabalho nas skins e modelos dos personagens, mas só modificando os códigos já conseguimos alcançar um feeling de jogo novo.
Nas próximas colunas podemos retomar o assunto e ver como isso foi feito em jogos como Half Life para criar o Counter Strike e vários outros mods, como seu irmão menos popular o Ricochet.
E se o código que analisamos hoje não espantou você, podemos abrir um jogo de Playstation ou Nintendo 64 e desenvolver nosso próprio código de game shark para ele. Que tal?
Nos vemos nas próximas semanas!