Introduction: Hackear Juego Clicker Heroes Con Arduino

About: Fundador de The Inventor's House Hackerspace, Movimiento Maker y Hardware Libre, DIY, Workaholic

Hace poco descubrimos en Steam un juego llamado "Clicker Heroes" en el que por medio de clicks obtienes monedas en el juego para mejorar habilidades de monstruos.

Gabo un amigo del hackerspace realizo un pequeño hack con el Arduino Micro (o Leonardo) y su emulación de USB HID de un mouse en el que automatiza los click que se requieren y con eso te ahorras miles de horas perdidas obtenido monedas.

Este hack se puede aplicar a otros juegos, espero ver sus mods ;)

Step 1: Material

Lo único que necesitamos en esta ocasión es

  • Arduino Micro o Leonardo
  • Cable USB

Step 2: Codigo Y USB HID

Los Arduino Micro o Leonardo tienen un microcontrolador 32u4 que a diferencia del 328p del Arduino UNO, el 32u4 tiene integrada la emulación USB HID (human interface device) que nos permite emular un teclado o mouse como el que usamos cotidianamente en nuestra computadora.

Arduino nos proporciona unas librerías para que podamos manejar la emulación de una manera sencilla, este es el código usado para automatizar los clicks

<br><p>/*<br>By Gabo Redfield - The inventors House
programa para el arduino leonardo</p><p>Manda pulsaciones y mueve el raton de forma cuadrangular en la pantalla del juego presentado.
Los procesos no son seriales, así que en el instante que se active o se desactive, va a estar en el estado que se quedo hasta que se reanude.</p><p>*/
short int bot = 8; // declaramos variable de cuál va a ser nuestro botón para que trabaje
int endw = 250; // declaramos cuánto va a medir la longitud de "pixeles" hacia los lados
int endh = 70; // declaramos cuánto va a medir la longitud de "pixeles" en altura
int tmp = 0; // una variable donde va a guardar el conteo de movimientos
int led = 13; // indicamos el pin del led del arduino (por default es 13)
int step1 = 0; // bandera del proceso que va a ejecutar(mover mouse x/y dirección)
void setup() {
  //Serial.begin(9600); // opción de imprimir en el puerto serial
  pinMode(bot, INPUT); // Creamos el botón que va a controlar el proceso
  pinMode(led, OUTPUT); // prenderá el led 13 en caso de que se active el proceso
  digitalWrite(13, 0);  // empieza el led del arduino apagado
  Mouse.begin(); // llamamos llamar a las clase del mouse
}</p><p>void loop(){
  if(digitalRead(bot) == 1){ // si está activo el estado del botón, procede a trabajar
    digitalWrite(led, 1);  
    //Mouse.move(xDistance, yDistance, 0); // opcion de enviar las coordenadas al puerto serial
    //Serial.print(tmp);
    //Serial.print(",");
    //Serial.println(step1);
     // a base de banderas, indica la acción que va a ejecutar
    if(step1 == 0) Mouse.move(1, 0, 0); // mover uno a la derecha
    else if(step1 == 1) Mouse.move(0, 1, 0); // mover uno abajo
    else if(step1 == 2) Mouse.move(-1, 0, 0); // mover uno a la  izquierda
    else if(step1 == 3) Mouse.move(0, -1, 0); // mover uno arriba
    if((tmp >= endw) && (step1 == 0)){ // espera a que el contador TMP sea menor al ancho puesto, si lo cumple y la bandera es 0 (mover uno a la derecha) hace lo sigueinte:
      step1 = 1; // Cambia la bandera a 1 (mover abajo)
      tmp = 0; // Cambia el valor de la variable contador TMP a 0
    }else if((tmp >= endh) && (step1 == 1)){ // espera a que cumpla la condición similar a la anterior, solo que esta vez con la bandera en 1(mover abajo)
      step1 = 2; //  // Cambia la bandera a 2 (mover a la izquierda)
      tmp = 0;
    }else if((tmp >= endw) && (step1 == 2)){
      step1 = 3; // Cambia la bandera a 3 (mover hacia arriba)
      tmp = 0;
    }else if((tmp >= endh) && (step1 == 3)){
      step1 = 0;
      tmp = 0;
    }else tmp++; // la variable va a aumentar uno
    if((tmp == 50)||(tmp == 100)||(tmp == 90)||(tmp == 80)||(tmp == 85)){ // indicamos en que valores del contador va a precionar el boton izquierdo del mouse
      Mouse.press(MOUSE_LEFT); // mantiene precionado el botón izquierdo del mouse
      Mouse.release(MOUSE_LEFT); // ya no mantiene precionado el botón izquierdo del mouse
    }
  }else{
    digitalWrite(led, 0); // como no está activo, mantiene el led(arduino) apagado
  }
}</p>

Step 3: Trabajando

Una vez cargado nuestro sketch empezaremos a ver como nuestro mouse empieza con los clicks y moverse en una área de nuestra pantalla, ahora solo debemos iniciar nuestro juego y colocarlo en el área adecuada como se puede ver en el vídeo y empezara a generar monedas para nosotros :D.

Espero les sirva este pequeño truco para otros juegos, espero sus coemtarios

Hasta la próxima