Home Colunas Oficina Retrogamer GameShark – Act 2: A Prática

GameShark – Act 2: A Prática

0

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.

“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?

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!

Mais textos relacionados
Leia mais por Ricardo Ribeiro
Leia mais em Oficina Retrogamer

Veja também

Programação – Act 1: Introdução à lógica

Ah, os computadores! Sempre tão inteligentes e prontos para nos servir. Basta fazer uma so…