MacGyvering la sfida Jump-Rope di Mario Odyssey

Super Mario Odyssey è probabilmente il mio gioco preferito di Mario. Tanto che ho fatto di tutto per completare ogni ultima sfida. Ma uno di loro mi ha dato più problemi di tutti gli altri messi insieme: Jump-Rope Genius nel Metro Kingdom.

Non hai nemmeno bisogno di muoverti. Devi solo saltare con successo 100 volte in successione. Ma il trucco è ogni cinque salti che accelera fino a 50, finché non salti quasi due volte al secondo. Premi salta troppo presto e fallisci. Premi salta troppo tardi e fallisci. Premi Jump per troppo tempo e ... hai indovinato, non ci riesci.

Dopo qualche decina di tentativi falliti ho iniziato a scherzare sul fatto che avrei solo costruito qualcosa per batterlo per me ... e con il passare dei giorni e non avevo ancora finito la sfida il mio scherzo è diventato più serio e ho iniziato a chiedermi come fallo.

Il mio primo pensiero è stato semplicemente programmare un Arduino per collegare i connettori per il pulsante di salto su un controller Switch, ma per fortuna ho controllato prima lo smontaggio dell'iFixit perché i controller Nintendo dal momento che Wii usano gli switch dome invece dei cuscinetti di gomma conduttivi, il che rende impossibile (per una lettura divertente vedi l'evoluzione dei controller Nintendo nel corso degli anni).

Cambia controller Joy-Con

Mi stavo inventando mentalmente tra l'acquisto di un vecchio controller GameCube (con adattatore) che sarebbe stato facile da hackerare, o l'utilizzo di un solenoide per premere fisicamente un pulsante su un controller Switch, entrambi sembravano soluzioni praticabili, ma dopo essere stato superato i primi I controller GameCube che vendevano su eBay mi sono stabilito sulla rotta del solenoide.

Dopo aver completato 835 delle 836 sfide uniche di Mario, ho riportato tutta la mia attenzione sulla luna finale. Per programmare qualcosa da battere, prima avrei dovuto misurare i tempi, quindi la mia intenzione era quella di registrare lo schermo e quindi contare i frame. Prima di installare una macchina fotografica ho fatto un paio di prove e, con mio grande orrore, ho battuto la cosa legittimamente.

Dopo aver trascorso due settimane a dire a tutti che sapevo che avrei programmato qualcosa per sconfiggerlo (e che la maggior parte di loro si faceva beffe) perdere la scusa per farlo era piuttosto deludente.

Pur essendo un adulto, mi sono reso conto che non avevo davvero bisogno di una scusa per perdere tempo e denaro (è praticamente tutto ciò che facciamo), quindi Express ha ordinato un Arduino e i componenti necessari per avviare il mio progetto.

Il primo passo è stato capire come usare un Arduino, che ... in realtà era piuttosto semplice, l'editor online e i tutorial sono semplicissimi e dopo aver programmato alcuni LED lampeggianti mi sono sentito pronto per partire. Il più grande ostacolo era in realtà trovare un cavo USB-B perché onestamente chi li usa ancora?

Il secondo passo è stato quello di capire i tempi e l'ho reso incredibilmente difficile per me stesso. Pensavo di essere intelligente registrando dalla vista dall'alto e potevo usare il piede della donna per allineare i fotogrammi, quando la sua mano toccava il suo piede chiamerei quella rivoluzione, e ho scrupolosamente attraversato QuickTime premendo i tasti freccia per fare un passo fotogramma alla volta e contando uno, due, tre ... sessantotto, sessantanove, settanta.

La cornice centrale mostra la sua mano allineata con il piede

Il secondo passo e mezzo è stato realizzare che il conteggio dei salti era una misura più affidabile e che Final Cut Pro mi avrebbe mostrato il tempo e il conteggio dei fotogrammi, permettendomi di scorrere rapidamente il video.

Final Cut Pro

Fallo 50 volte ... e metti tutti i risultati in un foglio di calcolo e hai il segreto del successo di Jump-Rope. Quegli ultimi 50 salti? Devi fare uno ogni 0,58 secondi.

Tempi misurati per la sfida Mario Jump-Rope

Con il cronometraggio completato ho rivolto la mia attenzione alla metà elettronica del problema e fortunatamente qualcuno che capisce l'elettronica (sicuramente non lo so) aveva già condiviso il modo di controllare un solenoide con un Arduino.

Per coloro che non lo sanno, un solenoide è in realtà solo una bobina cilindrica di filo che quando si fa passare una corrente produce un campo magnetico. Il nome è intercambiabile con alcune cose che usano i solenoidi (la parte della bobina) per fare qualcosa di più complesso, in questo caso spingere una piccola asta di metallo. Accendi l'alimentazione e l'asta si spegne, la spegni e la molla la sposta indietro.

Circuito completato

Ho collegato un circuito con un semplice interruttore e un solenoide, e ho scritto un programma che lo collegherebbe e lo innescerebbe, accorciando progressivamente i tempi man mano che progrediva. Lanciando l'interruttore si avvia il loop, spegnendolo si reimposta.

Ciò mi consentirebbe di far girare manualmente Mario in posizione e di girare l'interruttore per avviarlo, e inoltre mi darebbe un modo semplice per riprovare se mi sbagliassi (cosa che anticipavo sarebbe spesso). Dopo alcune ore (e alcuni consigli da mio fratello) avevo un circuito funzionante!

A questo punto avevo praticamente assunto il successo, e poi la realtà ha preso il via (o meglio, mi ha dato un calcio). Nella mia ingenuità avevo supposto che il solenoide sarebbe stato in grado di premere banalmente un pulsante Switch, quello che ho comprato era un solenoide da 5 V in grado di spostare 3 mm e applicare 80 grammi di forza, che sembrava molto (è in realtà meno di un singolo newton).

L'ho tenuto contro il controller e ... niente. Nessun movimento, il pulsante ha rifiutato il movimento. Cercare su Google quanta forza è necessaria per premere un controller Switch non ha prodotto risultati e in casa mia non avevo buoni strumenti per misurarlo.

Quindi, senza buoni strumenti, sono andato alla ricerca di alcuni cattivi.

E le misure di cottura? Ho riempito 1/3 di una tazza di acqua e ho bilanciato quello sopra un pulsante, nessun movimento. Ho riempito 1/2 di una tazza di acqua e ho depresso. Quindi c'è la tua risposta, un pulsante Joy-Con ha bisogno di un posto tra un terzo e mezzo bicchiere d'acqua.

Trasformandoli in unità reali, 1 tazza = 250 ml e la cosa facile riguardo al sistema metrico è che il peso è derivato dal volume di acqua. 250 ml sono 250 grammi, quindi il mio Joy-Con aveva bisogno di un valore compreso tra 83 grammi e 125 grammi per deprimere.

Improvvisamente il mio solenoide da 80 grammi non mi è sembrato così poco potente, e se io ... lo avessi sopraffatto? Gli stavo dando i 5 volt richiesti, ma avevo un alimentatore da 9 volt. La forza magnetica di un solenoide aumenta con la tensione (in realtà sale con il quadrato della tensione), quindi a 9 volt il mio solenoide dovrebbe applicarsi più vicino a 250 grammi, o come mi piace pensarci, 1 tazza d'acqua!

La fase quattro prevedeva il collegamento del solenoide al controller. Considerato il poco pensiero che avevo messo nella pianificazione di questa parte, non è stata una sorpresa quanto sia risultata inelegante la soluzione. Alcuni pezzi di legno lo sollevarono sopra gli altri pulsanti, alcuni pezzi di nastro isolante tenevano il legno in posizione e un elastico manteneva il solenoide in posizione.

Ero finalmente pronto a mettere tutto alla prova, mi sono presentato al Metro Kingdom, mi sono presentato alla sfida e mi sono preparato a crogiolarmi nella dolce gloria del mio compiaciuto successo.

E quasi immediatamente fallito ... Il mio tempismo era sbagliato. Ho modificato manualmente alcuni dei tempi nel mio codice e ho avvicinato Mario, sempre più vicino e ancora più vicino, fino a quando non è riuscito a raggiungere in modo abbastanza affidabile l'86.

A quel punto, invece di modificare casualmente le cose, l'ho registrato suonando e sono tornato su Final Cut Pro per raccontare i fotogrammi (questa volta concentrandomi su quanti fotogrammi più vicini / più lontani la corda stava ottenendo per 5 segmenti di salto), e mentre ero un po 'fuori in alcuni posti, dato che Mario arrivava sempre a 50, l'unica cosa che richiedeva il cambio era il 50+ tempismo. L'ho ridotto a un salto ogni 35.2 fotogrammi e riprovato.

Successo! 261 salti. Sembrava una grande vittoria, puoi vedere nel video che ha facilmente distrutto il mio scarso sforzo umano di 102 salti. Andai immediatamente a svegliare mia moglie e provai a spiegare quanto fosse bello, e quando ciò non riuscì a farmi molta adulazione, ricorsi a dire a mio fratello che era molto più adeguatamente impressionato.

Tuttavia, è un robot, perché 261 dovrebbe essere un limite? Perché non può essere perfetto? Ho analizzato di nuovo i fotogrammi e ho notato che la corda stava raggiungendo Mario così lentamente, che doveva andare più veloce!

Salta i tempi, la media è stata misurata, reale è ciò che è nel codice

Ridurre i tempi da un salto ogni 35,2 fotogrammi a uno ogni 35,15 fotogrammi (una variazione di appena lo 0,14%) ha comportato un Mario di maggior successo.

Così riuscito che è stato in grado di giocare alla sfida esasperante Mario Jump-Rope per 35 minuti e 21 secondi prima di fallire ... stabilendo un nuovo punteggio elevato (per me) di 3613.

All'inizio ho pensato che fosse fallito perché il mio tempismo era ancora impercettibilmente fuori, ma dopo un'attenta ispezione del video è rimasto perfettamente sincronizzato fino a quando ... a lungo premuto! Che errore umano commettere un computer, invece di fare un breve salto veloce ha tenuto il pulsante troppo a lungo e ha mandato Mario troppo in alto, è saltato al momento giusto ma è arrivato tardi.

In realtà penso che il povero solenoide si stesse surriscaldando, di notte mentre stavo giocando con i tempi anche lui aveva smesso di funzionare, penso che guidarlo a quasi il doppio della tensione fosse problematico. Nel video puoi persino vedere che è stato premuto una seconda volta durante il salto al momento giusto.

Per quanto riguarda il codice? Questa è stata la parte più semplice. Solo 76 righe di codice possono riprodurre Mario meglio di me

Per motivi di semplicità, ho misurato tutti i tempi in quanti fotogrammi tra i salti, ho potuto contare facilmente i fotogrammi nel video e quindi dividerli per 60 per trasformarli in secondi.

Il codice calcola tutto usando i calcoli morti dal momento in cui è iniziata la sfida, ho ipotizzato che le imprecisioni nell'innescare qualsiasi singolo salto sarebbero state nella media. Ogni ciclo il codice calcola quanti millisecondi dovrebbero essere trascorsi prima del salto successivo e se tale soglia viene raggiunta attiva il solenoide; c'è una breve durata che mantiene il solenoide prima del ripristino (forse per evitare la pressione prolungata potrebbe essere necessario essere più corto).

Ed è tutto ... quasi stupidamente semplice, giustamente, data la natura della sfida del salto.

Potrei riprovare, ma a quasi 40 minuti per tentativo non sono abbastanza interessato. Inoltre, da allora ho scoperto che qualcuno ha fatto un passo in più rispetto a me, anche se in una direzione leggermente diversa.

Invece di premere fisicamente un pulsante sul controller, usano una libreria per simulare l'essere un controller che consente loro di inviare banalmente segnali. Quando si sono imbattuti nella mia stessa sfida di tempismo (facendo solo poche centinaia di salti prima di fallire - stavano usando la costante 35.18 per i loro salti finali) hanno risolto il problema programmando il segnale video, controllando la regione del punteggio e quando cambia fai un altro salto. Con questo metodo possono raggiungere il punteggio massimo di 99.999!

Con tutto questo penseresti che avrei avuto uno dei punteggi più alti nel gioco ... ti sbaglieresti! Solo una settimana fa sarei probabilmente tra i primi 100, ma nel gioco è stato scoperto un bug che consente a chiunque di superare questa sfida, quasi senza sforzo è possibile ottenere salti illimitati e oltre 10.000 persone lo hanno fatto ora. Forse se Nintendo correggerà questo problema e resetterà il tabellone, rispolvererò di nuovo il mio solenoide, sento che puoi costruire qualcosa per giocare usando solo il controller stesso, quindi è un po 'legittimo.