MacGyvering Маріо Одісея Виклик на стрибках

Super Mario Odyssey - цілком можливо моя улюблена гра Маріо. Настільки, що я з усіх сил намагався виконати кожен останній виклик. Але один з них завдав мені більше клопоту, ніж усі інші разом: Геній стрибків у Королівському метро.

Навіть не потрібно рухатися. Вам просто потрібно успішно стрибнути 100 разів поспіль. Але фокус у тому, що кожні п’ять стрибків він прискорюється до 50, поки ви не стрибаєте майже двічі на секунду. Натискайте на стрибок занадто рано, і у вас не виходить. Натисніть стрибок занадто пізно, і ви не вдаєтеся. Натискайте на стрибок занадто довго і ... як ви здогадалися, ви не зможете.

Після кількох десятків або декількох невдалих спроб я почав жартувати, що я просто будую щось, щоб перемогти це за мене ... і, як дні проходили, і я все ще не закінчив виклик, моє жартування стало більш серйозним, і я почав гадати, як це зробити Зроби це.

Моя перша думка полягала в тому, щоб просто запрограмувати Arduino для з'єднання з'єднувачів кнопки перемикання на контролері комутатора, але, на щастя, я спочатку перевірив відключення iFixit, оскільки контролери Nintendo, оскільки Wii використовують купольні перемикачі замість провідних гумових накладок, що робить це неможливим (для приємного читання див. еволюцію контролерів Nintendo протягом багатьох років).

Я подумки кидався між купівлею старішого контролера GameCube (з адаптером), який було б легко зламати, або використанням соленоїда для фізичного натискання кнопки на контролері комутатора, і те, і інше здавалося життєздатним рішенням, але після того, як перші кілька перекупили Контролери GameCube, що продаються на eBay, я зупинився на електромагнітному маршруті.

Виконавши 835 з 836 унікальних викликів у Маріо, я звернув усю свою увагу на останню Місяць. Для того, щоб запрограмувати щось, щоб обіграти це, спочатку мені потрібно було б виміряти час, тому мій намір був записати екран, а потім порахувати кадри. Перед тим, як налаштувати камеру, я провів кілька практичних раундів, і, на мій жах, я насправді побив цю справу.

Провівши два тижні, розповідаючи всім, що я знаю, що я збираюся запрограмувати щось, щоб перемогти це (і змусити більшість із них) втратити привід для цього, було досить розчаровуючим.

Хоча, будучи дорослим, я зрозумів, що мені насправді не потрібен привід витрачати свій час і гроші (це майже все, що ми робимо), тому Express замовив Arduino та необхідні компоненти для запуску мого проекту.

Першим кроком було з’ясувати, як використовувати Arduino, який… насправді був досить прямим, онлайн-редактор та навчальні посібники надзвичайно прості, і після програмування декількох блимаючих світлодіодів я відчув себе готовим до роботи. Найбільшою перешкодою було насправді знайти кабель USB-B, бо, чесно кажучи, хто все ще ними користується?

Другим кроком було визначити час, і я надзвичайно ускладнив це для себе. Я думав, що я розумний, записуючи з вигляду зверху, і можу використовувати ногу жінки для вирівнювання кадрів, коли її рука торкається її ноги, я називав би це революцією, і кропітко пройшов QuickTime, натискаючи клавіші зі стрілками, щоб зробити крок кадр за раз і рахуючи один, два, три ... шістдесят вісім, шістдесят дев'ять, сімдесят .

Другим з половиною кроком було усвідомити, що кількість стрибків є більш надійним показником, і Final Cut Pro покаже мені час і кількість кадрів, що дозволить мені по-справжньому швидко прокрутити відео.

Зробіть це 50 разів ... і помістіть усі результати в електронну таблицю, і у вас є секрет успіху в стрибках. Ці останні 50 стрибків? Вам потрібно робити це кожні 0,58 секунди.

По завершенню синхронізації я звернув свою увагу на електронну половину проблеми, і, на щастя, хтось, хто розуміється на електроніці (я точно не знаю), вже поділився, як керувати соленоїдом за допомогою Arduino.

Для тих, хто не знає, соленоїд - це насправді просто циліндрична котушка дроту, яка при проходженні струму створює магнітне поле. Назва взаємозамінна з кількома речами, які використовують соленоїди (частина котушки) для виконання чогось більш складного, в цьому випадку штовхають невеликий металевий стрижень. Увімкніть живлення, і шток штовхне, вимкніть його, а пружина перемістить назад.

Я підключив ланцюг за допомогою простого перемикача та соленоїда, і написав програму, яка буде циклічно спрацьовувати та запускати його, поступово скорочуючи терміни по мірі прогресу. Перемикання перемикача запускало б цикл, його вимкнення - скидало.

Це дозволило б мені вручну запустити Маріо на позицію і перевести перемикач для запуску, а також дало б мені простий спосіб повторити спробу, якщо я зіпсуюся (що, як я очікував, буде часто). Через кілька годин (і кілька порад від мого брата) у мене вийшов робочий контур!

На цьому етапі я фактично припустив успіх, а потім реальність почала (вірніше, підштовхнула мене). У своїй наївності я припускав, що соленоїд зможе тривіально натиснути кнопку перемикача; той, який я купив, був соленоїдом 5 В, здатним рухатись на 3 мм і прикладати 80 грамів сили, що здавалося багато (це насправді менше, ніж одиничний Ньютон).

Я затримав його проти контролера і ... нічого. Руху не було, кнопка відмовила зрушити. Погуглити, скільки сил потрібно для натискання контролера комутатора, не дало результатів, і навколо мого будинку у мене не було хороших інструментів, щоб виміряти його.

Тож, не маючи хороших інструментів, я пішов шукати погані.

А як щодо кулінарних заходів? Я наповнив 1/3 склянки водою і збалансував, що над кнопкою, жодного руху. Я наповнив 1/2 склянки водою, і вона пригнічилася. Отже, є ваша відповідь, кнопці Joy-Con потрібно десь від третини до половини склянки води.

Перетворюючи їх назад на реальні одиниці, 1 склянка = 250 мл, і найпростіша річ у метричній системі полягає в тому, що вага походить від об'єму води. 250 мл - це 250 грамів, тому моєму Joy-Con потрібно було десь від 83 до 125 грамів, щоб придушити.

Раптом мій 80-грамовий соленоїд здавався не таким слабким, що, якби я ... його здолав? Я давав йому 5 вольт, про які він просив, але у мене було джерело живлення 9 вольт. Магнітна сила соленоїда зростає із збільшенням напруги (насправді вона зростає разом із квадратом напруги), тому при 9 вольтах мій соленоїд повинен подавати ближче до 250 грам, або, як я люблю думати про це, 1 склянку води!

Крок четвертий передбачав приєднання соленоїда до контролера. З огляду на те, як мало думки я вклав у планування цієї частини, не дивно, наскільки неелегантним виявилося рішення. Кілька шматочків дерева підняли його над іншими кнопками, кілька шматочків стрічки утримували дерево на місці, а гумка утримувала соленоїд у положенні.

Я нарешті був готовий випробувати все це, я перекосився до Королівства Метро, ​​підбіг виклик і підготувався погрітися в солодкій славі мого самовдоволеного успіху.

І майже відразу не вдалося ... Мої терміни були неправильні. Я вручну налаштував кілька таймінгів у своєму коді і наблизив Маріо, ще ближче і ще ближче, поки він не міг досить надійно дійти до 86.

У той момент, замість випадкового налаштування речей, я записав його програвання і повернувся до Final Cut Pro, щоб перерахувати кадри (цього разу зосередившись на тому, скільки кадрів було ближче / далі мотузка набирала на 5 сегментів стрибка), і хоча мені трохи не вистачало кілька місць, оскільки Маріо завжди добирався до 50, єдине, що вимагало зміни, - це терміни 50+. Я зменшив його до стрибка кожні 35,2 кадру і спробував знову.

Успіху! 261 стрибок. Це відчувалося величезною перемогою, ви можете бачити на відео, що це легко стривожило мої мізерні людські зусилля в 102 стрибки. Я негайно пішов і розбудив мою дружину і спробував пояснити, як це було круто, а коли це не допомогло мені отримати велике сподобання, вдався до того, щоб сказати своєму братові, який був набагато більш вражений.

Однак це робот, чому 261 повинен бути обмеженням? Чому він не може бути ідеальним? Я ще раз проаналізував рамки і помітив, як мотузка наздоганяла Маріо так повільно, що йому потрібно було їхати швидше!

Зменшення часу з стрибка кожні 35,2 кадру до одного кожні 35,15 кадру (зміна всього 0,14%) призвело до набагато більш успішного Маріо.

Настільки успішний, що він зміг зіграти розлючений виклик Mario Jump-Rope протягом 35 хвилин і 21 секунди, перш ніж провалився ... встановивши новий високий бал (для мене) 3613.

Спочатку я припустив, що це не вдалося, тому що мій час все ще був непомітно вимкнений, але при більш уважному огляді відео воно залишалося абсолютно синхронізованим, поки воно… довго не натискалося! Яку людську помилку зробив комп’ютер, замість того, щоб зробити короткий швидкий стрибок, він занадто довго тримав кнопку і послав Маріо занадто високо, він стрибнув у потрібний момент, але приземлився пізно.

Насправді я думаю, що це було так, що бідний соленоїд перегрівався, раніше вночі, коли я грав з таймінгами, він також перестав працювати, я думаю, що керувати ним майже вдвічі більше напруги було проблематично. На відео ви навіть можете побачити, що воно натиснуло вдруге під час стрибка в правильний час.

Що стосується коду? Це була найпростіша частина. Всього 76 рядків коду можуть відтворити Маріо краще за мене

Для простоти я виміряв всі таймінги у кількості кадрів між стрибками, міг легко підрахувати кадри у відео, а потім просто розділити на 60, щоб перетворити це на секунди.

Код обчислює все, використовуючи мертві рахунки з моменту початку виклику, я припустив, що неточності в ініціюванні будь-якого окремого стрибка в середньому будуть. Кожен цикл коду обчислює, скільки мілісекунд повинно пройти до наступного стрибка, і якщо цей поріг досягнуто, включається соленоїд; існує короткий час, коли він утримує соленоїд перед скиданням (можливо, це потрібно було коротше, щоб уникнути тривалого натискання).

І все ... майже по-дурному просто, доречно, враховуючи природу виклику стрибків.

Я міг би спробувати ще раз, але майже за 40 хвилин на спробу я просто не зацікавлений. Крім того, я з тих пір виявив, що хтось пішов на крок краще за мене, хоча в дещо іншому напрямку.

Замість того, щоб фізично натискати кнопку на своєму контролері, вони використовують бібліотеку, щоб імітувати, що є контролером, що дозволяє їм тривіально надсилати сигнали. Коли вони зіткнулися з тим самим тимчасовим завданням, що і я (лише отримавши кілька сотень стрибків перед невдачею - вони використовували константу 35,18 для своїх фінальних стрибків), вони вирішили це шляхом програмного моніторингу відеосигналу, перевірки області оцінки та коли вона змінюється зробити ще один стрибок. За допомогою цього методу вони можуть досягти максимального балу 99 999!

Ви б подумали, що з усім цим я мав би один із найвищих балів у грі ... ви б помилилися! Лише тиждень тому я, мабуть, потрапив би в топ-100, але в грі була виявлена ​​помилка, яка дозволяє будь-кому зіпсувати цей виклик, майже без жодних зусиль ви можете отримати необмежені стрибки, і зараз це зробили понад 10 000 людей. Можливо, якщо Nintendo виправить це і скине таблицю результатів, я знову випилю соленоїд, я думаю, якщо ви зможете побудувати щось, щоб грати в гру, використовуючи лише сам контролер, то це напевно законно.