MacGyvering el desafío de saltar la cuerda de Mario Odyssey

Super Mario Odyssey es posiblemente mi juego favorito de Mario. Tanto es así que salí de mi camino para completar hasta el último desafío. Pero uno de ellos me dio más problemas que todos los demás juntos: Jump-Rope Genius en Metro Kingdom.

Ni siquiera necesitas moverte. Solo necesitas saltar con éxito 100 veces seguidas. Pero el truco es que cada cinco saltos se acelera hasta los 50, hasta que estás saltando casi dos veces por segundo. Presione saltar demasiado pronto y fallará. Presione saltar demasiado tarde y fallará. Presiona saltar por mucho tiempo y ... lo adivinaste, fallas.

Después de unas pocas docenas de intentos fallidos, comencé a bromear diciendo que simplemente construiría algo para vencerlo ... y a medida que pasaban los días y aún no había terminado el desafío, mis bromas se volvieron más serias y comencé a preguntarme cómo hacerlo. hazlo.

Mi primer pensamiento fue simplemente programar un Arduino para unir los conectores para el botón de salto en un controlador Switch, pero afortunadamente verifiqué primero el desmontaje de iFixit porque los controladores de Nintendo desde la Wii usan interruptores de domo en lugar de las almohadillas de goma conductoras, lo que lo hace imposible. (para leer un poco de diversión, vea la evolución de los controladores de Nintendo a lo largo de los años).

Mentalmente estaba dándome vueltas entre comprar un controlador GameCube más antiguo (con adaptador) que sería fácil de piratear, o usar un solenoide para presionar físicamente un botón en un controlador Switch, ambas parecían soluciones viables, pero después de obtener una oferta superior en las primeras Los controladores de GameCube que se venden en eBay me decidí por la ruta del solenoide.

Después de completar 835 de los 836 desafíos únicos en Mario, volví toda mi atención a la luna final. Para programar algo que lo supere, primero necesito medir el tiempo, así que mi intención era grabar la pantalla y luego contar los fotogramas. Antes de configurar una cámara, puse algunas rondas de práctica y, para mi horror, en realidad le gané la cosa legítimamente.

Después de haber pasado dos semanas diciéndole a todo el mundo que sabía que iba a programar algo para superarlo (y que la mayoría de ellos se burlaran), perder la excusa para hacerlo fue bastante decepcionante.

Sin embargo, siendo un adulto, me di cuenta de que realmente no necesitaba una excusa para perder mi tiempo y dinero (eso es prácticamente todo lo que hacemos), así que Express ordenó un Arduino y los componentes necesarios para comenzar mi proyecto.

El primer paso fue descubrir cómo usar un Arduino, que ... fue bastante sencillo en realidad, el editor en línea y los tutoriales son súper fáciles, y después de programar algunos LED parpadeantes, me sentí listo para comenzar. El mayor obstáculo fue encontrar un cable USB-B porque, honestamente, ¿quién todavía los usa?

El segundo paso fue averiguar el momento y me lo puse impresionantemente difícil. Pensé que estaba siendo inteligente al grabar desde la vista aérea y que podía usar el pie de la mujer para alinear los marcos, cuando su mano tocó su pie , lo llamaría una revolución, y revisé minuciosamente QuickTime presionando las teclas de flecha para dar un paso. fotograma a la vez y contando uno, dos, tres ... sesenta y ocho, sesenta y nueve, setenta .

El segundo paso y medio fue darme cuenta de que el recuento de saltos era una medida más confiable y que Final Cut Pro me mostraría el tiempo y el recuento de fotogramas, lo que me permitía recorrer el video con mucha rapidez.

Haga esto 50 veces ... y ponga todos los resultados en una hoja de cálculo y tendrá el secreto del éxito de Jump-Rope. ¿Esos últimos 50 saltos? Tienes que hacer uno cada 0,58 segundos.

Con los tiempos completados, dirigí mi atención a la mitad electrónica del problema, y ​​afortunadamente alguien que entiende de electrónica (yo definitivamente no) ya había compartido cómo controlar un solenoide con un Arduino.

Para aquellos que no lo saben, un solenoide es en realidad solo una bobina cilíndrica de alambre que cuando pasa una corriente produce un campo magnético. El nombre es intercambiable con algunas cosas que usan solenoides (la parte de la bobina) para hacer algo más complejo, en este caso empujar una pequeña varilla de metal. Encienda la corriente y la varilla empuja hacia afuera, apáguela y el resorte la mueve hacia atrás.

Conecté un circuito con un simple interruptor y solenoide, y escribí un programa que lo atravesaría y lo activaría, acortando progresivamente el tiempo a medida que avanzaba. Activar el interruptor iniciaría el bucle, apagarlo se restablecería.

Esto me permitiría ejecutar manualmente a Mario en posición y activar el interruptor para comenzar, y también me brindaría una manera fácil de volver a intentarlo si me equivocaba (lo que anticipé que sería a menudo). Después de unas horas (y algunos consejos de mi hermano) ¡tenía un circuito de trabajo!

En este punto, básicamente asumí el éxito, y luego la realidad entró en acción (o más bien, me pateó). En mi ingenuidad, asumí que el solenoide podría presionar trivialmente un botón de interruptor, el que compré fue un solenoide de 5 V capaz de moverse 3 mm y aplicar 80 gramos de fuerza, eso parecía mucho (en realidad es menos de una newton).

Lo sostuve contra el controlador y ... nada. Sin movimiento, el botón rechazó el movimiento. Buscar en Google cuánta fuerza se necesita para presionar un controlador Switch no arrojó resultados, y en mi casa no tenía buenas herramientas para medirlo.

Entonces, sin buenas herramientas, fui a buscar algunas malas.

¿Y las medidas de cocción? Llené 1/3 de taza con agua y la equilibré sobre un botón, sin movimiento. Llené 1/2 taza con agua y deprimí. Así que ahí está tu respuesta, un botón Joy-Con necesita entre un tercio y medio vaso de agua.

Convirtiéndolos en unidades reales, 1 taza = 250 ml y lo fácil del sistema métrico es que el peso se deriva del volumen de agua. 250 ml son 250 gramos, por lo que mi Joy-Con necesitaba entre 83 gramos y 125 gramos para bajar.

De repente, mi solenoide de 80 gramos no parecía tener tanta potencia, ¿y si yo ... lo dominaba? Le estaba dando los 5 voltios que pedía, pero tenía una fuente de alimentación de 9 voltios. La fuerza magnética de un solenoide aumenta con el voltaje (en realidad aumenta con el cuadrado del voltaje), por lo que a 9 voltios, mi solenoide debería aplicarse más cerca de 250 gramos, o como me gusta pensar, ¡1 taza de agua!

El paso cuatro implicó conectar el solenoide al controlador. Dado lo poco que pensé en la planificación de esta parte, no me sorprendió lo poco elegante que resultó la solución. Unos trozos de madera la levantaron sobre los otros botones, algunos trozos de cinta aislante mantenían la madera en su lugar y una banda de goma mantenía el solenoide en posición.

Finalmente estaba listo para ponerlo todo a prueba, me mudé al Reino Metro, corrí al desafío y me preparé para disfrutar de la dulce gloria de mi éxito engreído.

Y casi de inmediato falló ... No fue el momento adecuado. Modifiqué manualmente algunos de los tiempos en mi código y acerqué a Mario, más cerca de nuevo y más cerca aún, hasta que pudo llegar de manera bastante confiable a 86.

En ese momento, en lugar de ajustar las cosas al azar, lo grabé y volví a Final Cut Pro para contar los fotogramas (esta vez centrándome en cuántos fotogramas más cerca / más lejos se acercaba la cuerda por cada segmento de 5 saltos), y mientras estaba un poco alejado en en algunos lugares, como Mario siempre llegaba a los 50, lo único que requería cambiar era el tiempo de 50+. Lo reduje a un salto cada 35,2 fotogramas y lo intenté de nuevo.

¡Éxito! 261 saltos. Esto se sintió como una gran victoria, se puede ver en el video que superó fácilmente mi escaso esfuerzo humano de 102 saltos. Inmediatamente fui y desperté a mi esposa y traté de explicarle lo genial que era, y cuando eso no consiguió atraerme mucha adulación, recurrí a contárselo a mi hermano, que estaba mucho más impresionado.

Sin embargo, es un robot, ¿por qué 261 debería ser un límite? ¿Por qué no puede ser perfecto? Analicé los marcos de nuevo y noté que la cuerda estaba alcanzando a Mario muy lentamente, ¡necesitaba ir más rápido!

Reducir el tiempo de un salto cada 35,2 fotogramas a uno cada 35,15 fotogramas (un cambio de solo 0,14%) resultó en un Mario mucho más exitoso.

Tan exitoso que pudo jugar el exasperante desafío de Mario Jump-Rope durante 35 minutos y 21 segundos antes de fallar ... estableciendo una nueva puntuación alta (para mí) de 3613.

Al principio asumí que había fallado porque mi tiempo todavía estaba imperceptiblemente fuera de tiempo, pero después de una inspección más cercana del video, se mantuvo perfectamente sincronizado hasta que ... ¡presionado por mucho tiempo! Qué error humano para una computadora, en lugar de hacer un salto rápido, mantuvo presionado el botón demasiado tiempo y envió a Mario demasiado alto, saltó en el momento adecuado pero aterrizó tarde.

En realidad, creo que fue porque el solenoide pobre se estaba sobrecalentando, más temprano en la noche, mientras jugaba con los tiempos, también había dejado de funcionar, creo que conducirlo a casi el doble de voltaje fue problemático. En el video incluso puedes ver que presionó por segunda vez durante el salto en el momento correcto.

¿En cuanto al código? Esa fue la parte más simple. Solo 76 líneas de código pueden jugar a Mario mejor que yo

En aras de la simplicidad, medí todos los tiempos en cuántos fotogramas entre saltos, podía contar los fotogramas fácilmente en el video y luego dividirlos por 60 para convertir eso en segundos.

El código calcula todo utilizando la navegación a estima desde el momento en que comenzó el desafío, asumí que las imprecisiones al desencadenar cualquier salto se promediarían. En cada bucle, el código calcula cuántos milisegundos deberían haber transcurrido antes del siguiente salto y, si se alcanza ese umbral, enciende el solenoide; hay una duración corta que mantiene el solenoide encendido antes de reiniciar (tal vez deba ser más corto para evitar la presión prolongada).

Y eso es todo ... casi estúpidamente simple, como corresponde, dada la naturaleza del desafío del salto.

Podría intentarlo de nuevo, pero con casi 40 minutos por intento, simplemente no estoy lo suficientemente interesado. Además, desde entonces descubrí que alguien fue un paso mejor que yo, aunque en una dirección ligeramente diferente.

En lugar de presionar físicamente un botón en su controlador, usan una biblioteca para simular ser un controlador que les permite enviar señales trivialmente. Cuando se encontraron con el mismo desafío de tiempo que yo (solo obtenían unos pocos cientos de saltos antes de fallar, estaban usando la constante 35.18 para sus saltos finales), lo resolvieron monitoreando programáticamente la señal de video, verificando la región de puntuación y cuándo cambia. haz otro salto. ¡Con este método pueden alcanzar la puntuación máxima de 99,999!

Pensarías con todo esto que tendría una de las puntuaciones más altas del juego ... ¡estarías equivocado! Hace solo una semana probablemente estaría en el top 100, pero se descubrió un error en el juego que permite a cualquiera fallar en este desafío, casi sin esfuerzo puedes obtener saltos ilimitados y más de 10,000 personas lo han hecho. Tal vez si Nintendo parche esto y reinicia el tablero de puntajes, quitaré el polvo de mi solenoide nuevamente, siento que si puedes construir algo para jugar usando solo el controlador, entonces eso es algo legítimo.