MacGyvering Mario Odyssey Jump-Rope Challenge

Super Mario Odyssey er muligvis mit foretrukne Mario-spil. Så meget, at jeg gik ud af min måde at gennemføre hver eneste sidste udfordring. Men en af ​​dem gav mig mere problemer end alle de andre sammen: Jump-Rope Genius i Metro Kingdom.

Du behøver ikke engang at flytte. Du skal bare springe 100 gange i rækkefølge. Men tricket er hvert femte spring, det fremskynder indtil 50, indtil du hopper næsten to gange i sekundet. Tryk på spring for tidligt, og du fejler. Tryk på spring for sent, og du fejler. Tryk på spring for længe og ... du gættede det, du fejler.

Efter et par dusin mislykkede forsøg begyndte jeg at joke, at jeg bare ville bygge noget for at slå det for mig ... og som dagene gik, og jeg stadig ikke var færdig med udfordringen, blev min sjov mere alvorlig, og jeg begyndte at undre mig over gør det.

Min første tanke var simpelthen at programmere en Arduino til at bygge bro over stikkene til springknappen på en Switch-controller, men heldigvis kontrollerede jeg iFixit-nedrivningen først, fordi Nintendo-controllere, da Wii bruger dome-switches i stedet for de ledende gummipuder, hvilket gør det umuligt (for sjov læsning se udviklingen af ​​Nintendo-controllere gennem årene).

Jeg kastede mentalt op mellem at købe en ældre GameCube-controller (med adapter), som det ville være let at hacke, eller bruge en solenoid til fysisk at trykke på en knap på en Switch-controller, begge virkede som levedygtige løsninger, men efter at være blevet overbudt på de første par GameCube-controllere, der sælger på eBay, slog mig ned på solenoidruten.

Efter at have gennemført 835 af de 836 unikke udfordringer i Mario vendte jeg hele min opmærksomhed tilbage til den sidste måne. For at programmere noget, der skulle slå det, skulle jeg først måle timingen, så min hensigt var at optage skærmen og derefter tælle rammerne. Før jeg satte et kamera op, satte jeg et par øvelsesrunder ind, og meget til min rædsel slog jeg faktisk sagen lovligt.

Efter at have brugt to uger på at fortælle alle, at jeg vidste, at jeg skulle programmere noget for at slå det (og få de fleste til at spotte) at miste undskyldningen for det var ret skuffende.

Men som voksen indså jeg, at jeg ikke rigtig havde brug for en undskyldning for at spilde min tid og penge (det er stort set alt, hvad vi gør), så ekspres bestilte en Arduino og de nødvendige komponenter til at starte mit projekt.

Det første trin var at finde ud af, hvordan man bruger en Arduino, som ... faktisk var ret ligetil, online-editoren og vejledningerne er super nemme, og efter programmering af et par blinkende lysdioder følte jeg mig klar til at gå. Den største forhindring var faktisk at finde et USB-B-kabel, for hvem bruger ærligt nok dem stadig?

Det andet trin var at finde ud af timingen, og jeg gjorde det imponerende svært for mig selv. Jeg troede, at jeg var klog ved at optage fra ovenfra og kunne bruge kvindens fod til at justere rammer, når hendes hånd rørte ved hendes fod, ville jeg kalde det en revolution, og jeg gik omhyggeligt igennem QuickTime ved at trykke på piletasterne for at træde et ramme ad gangen og tæller en, to, tre ... otteogtres, ni og tres, halvfjerds .

Det andet og et halvt trin var at indse, at springtællingen var en mere pålidelig foranstaltning, og at Final Cut Pro ville vise mig antallet af tid og rammer, så jeg virkelig hurtigt kunne skrubbe igennem videoen.

Gør dette 50 gange ... og læg alle resultaterne i et regneark, så har du hemmeligheden bag Jump-Rope-succes. De sidste 50 spring? Du skal gøre en hvert 0,58 sekund.

Når timingen var afsluttet, vendte jeg opmærksomheden mod den elektroniske halvdel af problemet, og heldigvis havde en person, der forstår elektronik (det gør jeg bestemt ikke) allerede delt, hvordan man styrer en solenoid med en Arduino.

For dem der ikke ved det, er en solenoid virkelig bare en cylindrisk trådspole, som når du løber en strøm igennem, producerer et magnetfelt. Navnet kan udskiftes med et par ting, der bruger solenoider (spoledelen) til at gøre noget mere komplekst, i dette tilfælde skubbe en lille metalstang. Tænd for strømmen, og stangen skubber ud, slukker den, og fjederen flytter den tilbage.

Jeg tilsluttede et kredsløb med en simpel afbryder og magnetventil og skrev et program, der skulle løbe igennem og udløse det, gradvist forkorte timingen, efterhånden som den skred frem. Hvis du vender kontakten, starter sløjfen, hvis den slukkes, nulstilles den.

Dette ville gøre det muligt for mig manuelt at køre Mario i position og vende kontakten for at starte, og også give mig en nem måde at prøve igen, hvis jeg ødelagde (som jeg forventede ville være ofte). Efter et par timer (og nogle tip fra min bror) havde jeg et arbejdskredsløb!

På dette tidspunkt havde jeg grundlæggende antaget succes, og så sparkede virkeligheden ind (eller rettere sparket mig). I min naivitet antog jeg, at solenoiden ville være i stand til trivielt at trykke på en switch-knap, den jeg købte var en 5V solenoid, der kunne bevæge sig 3 mm og anvende 80 gram kraft, der virkede som meget (det er faktisk mindre end en enkelt newton).

Jeg holdt det mod controlleren og ... intet. Ingen bevægelse, knappen nægtede skuddet. Googling for, hvor meget kraft der er nødvendigt for at trykke på en Switch-controller, gav ingen resultater, og omkring mit hus havde jeg ingen gode værktøjer til at måle det med.

Så uden gode værktøjer søgte jeg efter nogle dårlige.

Hvad med madlavningstiltag? Jeg fyldte 1/3 af en kop med vand og afbalancerede den over en knap, ingen bevægelse. Jeg fyldte 1/2 kop med vand, og det var deprimeret. Så der er dit svar, en Joy-Con-knap har brug for et sted mellem en tredjedel og en halv kop vand.

At vende dem tilbage til reelle enheder, 1 kop = 250 ml, og det lette ved det metriske system er, at vægten stammer fra vandmængden. 250 ml er 250 gram, så min Joy-Con havde brug for et sted mellem 83 gram og 125 gram for at trænge ned.

Pludselig virkede min 80 gram solenoid ikke så underpowered, hvad hvis jeg ... overmægtede den? Jeg gav den de 5 volt, den bad om, men jeg havde en 9 volt strømforsyning. Magnetkraften i en solenoid øges med spændingen (faktisk går den op med spændingens firkant), så ved 9 volt skal min solenoid påføres tættere på 250 gram, eller som jeg gerne vil tænke på det, 1 kop vand!

Trin fire involverede fastgørelse af solenoiden til controlleren. I betragtning af hvor lidt tænkt jeg havde lagt mig i planlægningen af ​​denne del, var det ingen overraskelse, hvor uelegant løsningen blev. Et par stykker træ løftede det over de andre knapper, et par stykker elektrisk tape holdt træet på plads, og et gummibånd holdt solenoiden på plads.

Jeg var endelig klar til at sætte det hele på prøve, jeg skævede mod Metro Kingdom, løb op til udfordringen og forberedte mig på at baske i den søde herlighed af min selvtilfredse succes.

Og næsten øjeblikkeligt mislykkedes ... Min timing var forkert. Jeg justerede manuelt et par af tidsindstillingerne i min kode og fik Mario tættere, tættere igen og tættere stadig, indtil han ret pålideligt kunne komme til 86.

På det tidspunkt indspillede jeg det i stedet for tilfældigt at tilpasse det og spillede og vendte tilbage til Final Cut Pro for at genoptage rammer (denne gang med fokus på hvor mange rammer tættere / længere rebet fik pr. 5 spring segment), og mens jeg var lidt væk et par steder, da Mario altid var på 50, var det eneste, der krævede skift, 50+ timing. Jeg reducerede det til et spring hver 35,2 ramme og prøvede igen.

Succes! 261 spring. Dette føltes som en kæmpe sejr, kan du se i videoen, at det let trak min beskedne menneskelige indsats på 102 spring. Jeg gik straks og vækkede min kone og forsøgte at forklare, hvor sejt det var, og da det ikke gav mig meget beundring, tyede jeg mig til at fortælle min bror, som var meget mere imponeret.

Det er dog en robot, hvorfor skulle 261 være en grænse? Hvorfor kan det ikke være perfekt? Jeg analyserede rammerne igen og bemærkede, at rebet fangede Mario nogensinde så langsomt, at han havde brug for at gå hurtigere!

At reducere timingen fra et spring hver 35,2 ramme til en hver 35,15 ramme (en ændring på kun 0,14%) resulterede i en meget mere succesrig Mario.

Så vellykket, at det var i stand til at spille den oprørende Mario Jump-Rope-udfordring i 35 minutter og 21 sekunder, før den mislykkedes ... indstilling af en ny høj score (for mig) på 3613.

Først antog jeg, at det mislykkedes, fordi min timing stadig var umærkeligt ude, men ved nærmere inspektion af videoen forblev den perfekt synkroniseret, indtil den ... længe trykkede! Hvilken menneskelig fejltagelse for en computer at lave, i stedet for at lave et kort hurtigt spring, holdt den knappen for længe og sendte Mario for højt, han sprang på det rigtige tidspunkt, men landede sent.

I virkeligheden tror jeg, det var, at den dårlige solenoid var overophedet, tidligere på natten, mens jeg spillede med timings, var den også stoppet med at køre, jeg tror, ​​at køre den næsten dobbelt så spændingen var problematisk. I videoen kan du endda se, at den trykkede en anden gang under springet med den korrekte timing.

Hvad angår koden? Det var den enkleste del. Bare 76 linjer kode kan spille Mario bedre end mig

For enkelheds skyld skyldte jeg alle tidspunkter i hvor mange rammer mellem spring, jeg kunne nemt tælle rammerne i videoen og derefter bare dele med 60 for at gøre det til sekunder.

Koden beregner alt ved hjælp af død regning fra det tidspunkt, hvor udfordringen startede, antog jeg, at upræcision i at udløse et enkelt spring ville være gennemsnitligt. Hver løkke koden beregner, hvor mange millisekunder der skulle være gået inden næste spring, og hvis denne tærskel er nået, tænder solenoiden; der er en kort varighed, at den holder solenoiden tændt, inden den nulstilles (måske skulle den være kortere for at undgå langt tryk).

Og det er det ... næsten dumt enkelt, passende nok i betragtning af springudfordringens art.

Jeg kunne prøve igen, men med næsten 40 minutter pr. Forsøg er jeg bare ikke interesseret nok. Jeg har også siden opdaget, at nogen gik et skridt bedre end mig, selvom det var i en lidt anden retning.

I stedet for fysisk at trykke på en knap på deres controller bruger de et bibliotek til at simulere at være en controller, der gør det muligt for dem trivielt at sende signaler. Da de løb ind i den samme timingudfordring som mig (kun få nogle få hundrede spring før de mislykkedes - de brugte konstanten 35.18 til deres sidste spring), løste de det ved programmatisk at overvåge videosignalet, kontrollere scoreområdet og når det ændrede sig spring igen. Med denne metode kan de nå den maksimale score på 99.999!

Man skulle tro med alt dette, at jeg ville have en af ​​de højeste score i spillet ... du ville tage fejl! For kun en uge siden ville jeg sandsynligvis være i top 100, men der er opdaget en fejl i spillet, der gør det muligt for enhver at fejle denne udfordring, for næsten ingen anstrengelse kan du få ubegrænsede spring og over 10.000 mennesker har nu gjort det. Måske hvis Nintendo lapper dette og nulstiller scorebordet, støver jeg min solenoid af igen, jeg føler, at hvis du kan bygge noget til at spille spillet ved kun at bruge selve controlleren, er det lidt legitimt.