GameShark – Act 2: A Prática

por Ricardo Ribeiro em 19 de fevereiro de 2018

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 ( )

Leia também:  Programação - Act 1: Introdução à lógica

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.

“Eu nem vejo mais códigos, tudo que eu vejo são loiras, morenas e ruivas.” (Matrix, 1999)

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?

Leia também:  Está aberta a Oficina Retrogamer

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.

Counter Strike, jogo construído originalmente modificando os recursos do Half Life

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!


Leia mais sobre: , , , ,