看板 Emulator 關於我們 聯絡資訊
╭────────────╮ 前言 ── 什麼是 ACE? ╰────────────╯ TAS 的全名是 "Tool-Assisted Speedrun/Superplay", 也就是「用輔助工具製作的通關/遊玩影片」, 他們可以透過不斷的存檔讀檔、監控記憶體、放慢速度錄製動作...等等輔助工具, 達成非人力可及的操作技巧, 進而完成「最快速度通關」或是「某些指定目標」。 大概在 2008 年左右, 網路上出現了不少「不務正業」的TAS, 他們看起來不太打算破關, 像是在 Pokemon 黑白版裡面努力的阻礙交通, https://youtu.be/crb-qQ58EGo
然而這些「不務正業」大致上都還是在遊戲設計的範圍之內。 過了幾年之後這現象越發嚴重, 大約在 2013 年左右, 我發現 TAS 開始不務正業, 開始做一些「跟目前這個遊戲本身沒什麼關係」的事; 同時,這些TAS的標題上,大多都會寫上 "Arbitrary Code Execution" (ACE, 任意代碼執行)。 我大概能想像這個詞彙好像有些抽象, 不太容易馬上看懂這想幹嘛, 所以讓我們來看一個例子──也就是「ACE」這個技術真的紅起來的瞬間。 2014年的一月, 在全世界的遊戲快速通關社群一年一度的盛會 AGDQ2014 之中, 由 DwangoAC 帶領的團隊設計了一台機器人 "TASbot", 讓他們能夠在實機上現場表演TAS。 他們在當時玩了幾個遊戲, 其中最讓人印象深刻, 甚至我覺得震驚世界的 是超任的 Super Mario World 瑪利歐世界。 https://youtu.be/Uep1H_NvZS0?t=31m48s
遊戲開始之後,可以看到瑪利歐騎上耀西, 沿路像雜耍一樣的玩弄一些路上的物件, 然而大約在影片的 33:28 處, 事情變得不太一樣,畫面開始出現一些不太對勁的東西 ... 幾秒鐘後,畫面上出現了兩個可以操作的小遊戲, 就在一台實機超任的瑪利歐世界裡面。 非常明顯,這兩個小遊戲絕對不是任天堂當初設計的部分。 沒錯,這就是他們自己寫的。 他們在實機超任的瑪利歐世界中, 利用一些遊戲的Bug, 在超任的記憶體裡面寫了這兩個小遊戲的程式碼, 然後執行他。 於是這時候可以回到我們這次的主題,「什麼是ACE?」 看過上面的例子,應該大致能夠想像, 他們在遊戲中「執行了一段由他們自己決定的程式碼」, 這就是所謂的「任意代碼執行」。 題外話,在節目裡面他們說, 他們原本想要寫一個紅白機瑪利歐一代, 然後再來跑他的 TAS, 但是實在是趕不上節目, 光是這兩個小遊戲就是表演前一天晚上才作好的。 於是,一年後,有了充裕的開發時間, 他們就在 AGDQ2015 現場端出來紅白機瑪利歐了。 https://youtu.be/HvCoNSq3GEM?t=5m48s
GDQ 後來幾年也都會有 TAS Block, TASbot 團隊也經常端出稀奇古怪的東西, 非常精彩,極度強烈推薦喜歡TAS的人們都可以看看。 ------ ╭─────────╮ ACE 影片範例精選 ╰─────────╯ 「任意代碼執行」從字面上理解, 他幾乎能夠做到任何事情; 那麼大家究竟用ACE做過哪些事情呢? 這裡提供一些經典的ACE影片, 包含了許多不同方向的作法。 (1) 最早期的 ACE TAS 我最早注意到的 ACE 是 2012 年年底的 Pokemon 黃版https://youtu.be/p5T81yHkHtI
他在10分47秒開始花了一分半的時間用按鍵進行大量輸入, 最後放出了彩虹小馬的主題曲。 當時出現的時候, 圈子內的大家多少都知道一些很嚴重的記憶體bug, 「我們可以透過一些 bug 來改變記憶體的數值,達成奇怪的效果」。 就這個概念上,直接寫一段 code 來執行好像也不算是太奇怪的事情, 但是真的作出來還是非常驚豔。 (2) 手動輸入的 ACE 「任意代碼執行」不見得需要透過 TAS。 事實上有些遊戲只憑人力輸入, 就能夠控制好一整段的記憶體代碼, 然後只要有觸發執行的手段, 就能夠不倚賴 TAS 的方式完成ACE。 SethBling 在 2015 年在實機超任的 Super Mario World 中, 透過 ACE 的手段執行了 Credits Warp, 也就是直接跳到破關畫面結束遊戲,總時間花費 5 分 59 秒。 https://youtu.be/14wqBA5Q1yc
後來有許多遊戲有找到類似的手段作出 Credit Warp, 在遊戲開始不久之後直接跳到破關畫面, 讓這成為 Speedrun / TAS 的一種常見的分類。 我自己平常也很喜歡 Pokemon 黃版的 Save Corruption, 自己打一輪通常不用五分鐘的時間,很適合當小遊戲調劑身心。 https://youtu.be/VlmoEpNNiVI
(3) 手動輸入了一整個新遊戲的 ACE TAS 同樣是 SethBling, 同樣在實機超任上, 同樣是 Super Mario World, 2016 年他花了一個小時用人力輸入了 由 p4plus2 撰寫的 Flappy Bird 程式碼並執行他。 https://youtu.be/hB6eY73sLV0
這就是很大的工程了, 能夠不依賴 TAS 就做到這麼複雜的 code 真的非常非常不容易。 (4) 推卡車抓夢幻 @ AGDQ2016 AGDQ2016 有一段節目 "Pokemon Glitch Showcase", 表演很多 Pokemon 第一世代遊戲中的各種遊戲漏洞花式表演, 其中我覺得最震驚世界的一段: https://youtu.be/mCoQm8bIyyw?t=24m
他利用存檔轉向之後讀檔衝浪穿過 S.S. Anne 號遊艇的剪票員, 然後走到了傳說中的卡車旁邊。 這卡車非常有名, 我想不少人小時候大概聽過謠傳, 「聽說用勁力推這個卡車就會跳出夢幻」。 於是,跑者 Shenanagans 就這麼說了, 「我想我在這邊可以澄清一個謠言, 我知道很多人說在對著卡車使用勁力可以獲得夢幻, 但是這並不是真的,(手上一邊按勁力), 我可以現場示範一下這並不是...真的...What??」 (畫面上跑出一隻夢幻,對話框"Mew!",全場歡聲雷動) 這在節目上沒有解釋是怎麼做到, 顯然也沒有時間特別詳細解釋, 但現場、聊天室還有當時的 Reddit 都快暴動了。 畢竟推卡車已經有無數人親手試驗過了, 那應該只是個謠言, 因此許多人懷疑這是改造的 ROM。 跑者後來在推特上解釋, 這並不是一個改造 ROM,而是 ACE。 當然,節目上其實沒有太多時間可以讓跑者操作ACE, 所以這個ACE其實是 在「遊戲存檔」中預先安排好所有需要的程式碼, 讓跑者打開遊戲就自動啟動的。 比較詳細的原理討論可以參考我的另外兩篇文章: #1R5j0WyX (PokeMon) [ptt.cc] [討論] 夢幻卡車@AGDQ2016 (上) #1R5j5WKM (PokeMon) [ptt.cc] [討論] 夢幻卡車@AGDQ2016 (下) (5) 用超任玩 N64 / 傳送門 / Skype @ AGDQ2017 AGDQ2017 TASbot - 對,又是 TASbot。 這次他們選擇的遊戲是超任上的薩爾達傳說https://youtu.be/7CgXvIuZR40?t=1400
前幾分鐘看起來還像是在玩遊戲, 但影片27分5秒左右畫面淡出, 幾秒後回來的是 N64 上的 Super Mario 64, 竟然是比他高一階的主機上的遊戲, 而且還花了五分鐘跑了一次 Speedrun; 然後馬上接著的是另一次的傳送門 Speedrun, 然後接上來的是──他們現場打了一通 Skype。 好,看到這裡大概能夠想像, 上面這些非常非常明顯的超出了超任這台主機的性能; 所以實際上這很明顯不是以超任為主來執行的內容。 在這個 ACE 中,他們實際上作的是, 「把畫面資訊通過八隻手把傳給超任, 然後把超任當作一個螢幕」。 超任實際執行的程式碼, 其實只有處理「把畫面顯示出來」的工作。 ------ ╭───────────────╮ 所以 ACE 到底是怎麼發生的? ╰───────────────╯ TASvideo.org 有一篇對於 ACE 的介紹, 對ACE的原理描述大概是這樣的: http://tasvideos.org/ArbitraryCodeExecutionHowTo.html 每個遊戲系統都會有一格記憶體去紀錄「現在要執行的程式碼」; 這是理所當然的,不然遊戲也不知道自己現在執行到哪裡了。 通常遊戲的程式碼會存在遊戲卡匣/光碟/磁片這些唯讀裝置中, 在正常遊玩下,這些部分通常是沒辦法被更改的。 然而,如果我們能夠去寫入 「現在要跑哪一段程式碼」的那一格記憶體, 把它指向某個我們能夠比較自由操作的記憶體空間── 例如 Pokemon,他有比較大的背包/攜帶道具的系統, 因此玩家可以透過更換隊伍順序/物品順序的方式, 在那一段記憶體中安排好「要執行的程式碼」, 然後讓遊戲去執行他。 然而,TAS 常常更傾向, 把「要執行的程式碼」指向「按鍵輸入」的記憶體位址。 只要能夠辦到這件事,程式碼多長都不怕── 用所有手把上的所有按鈕打進去就是了。 當然有時候這件事情很難一步到位, 所以你可能會在一些 ACE 的 TAS的投稿紀錄中, 可以看到作者 Comment 的欄位中寫著, 他們做了不同階段的記憶體調整, 一開始先用比較容易達成的方式, 然後再寫一小段程式碼讓遊戲去讀取手把輸入, 甚至用更高頻率讀取。 好,我知道上面這些句子仍然有些抽象, 可能不太容易看懂這怎麼連到實際運作方式, 但實際的運作原理真的是很冗長而困難, 我覺得不太適合放在這樣一篇介紹性的文章裡面。 真的有興趣的話, 可以參考我之前寫來介紹 AGDQ2016 的夢幻卡車的文章: #1R5j5WKM (PokeMon) [ptt.cc] [討論] 夢幻卡車@AGDQ2016 (下) ------ ╭───╮ 預告 ╰───╯ - 經典的 ACE 里程碑 - 2017 年的 Pokemon 黃版 - 後記──如果 TAS 不再玩遊戲 ------ ╭────────────╮ 給按End的人的重點整理 ╰────────────╯ (1) ACE 是利用遊戲的漏洞,在記憶體中安排程式碼並執行。 (2) ACE TAS 可以做到很多很多事情,從2012年開始越來越匪夷所思。 (3) 上面的幾個 ACE 影片都很精采,特別是 TASbot 相關的那些。 AGDQ2014 ACE紅起來的瞬間 https://youtu.be/Uep1H_NvZS0?t=31m48s
AGDQ2016 推卡車抓夢幻 https://youtu.be/mCoQm8bIyyw?t=24m
AGDQ2017 用超任打N64/傳送門/Skype https://youtu.be/7CgXvIuZR40?t=1400
-- ███◣ ◢██◣ ◢██◣ █ ◢█ ◣ ◢ ◢██◣ ◣ █ █ ██ █ ██ █ ██ █◢█◤ █◣◢█ █ ██ █◣ █ █ ██ █ ██ █ ██◤ ████ █ ██ ██◣█ @ ptt.cc ███◤ █ ██ █ ██◣ █◥◤█ ████ ████ █◥█◣ █ ██ █ ██ █◥█◣ █ ██ ◥█ 鴉片(Append) ◥█ ◥██◤ ◥██◤ █ ◥█ █ █ █ ██ twitch.tv/append -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.135.48.54 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Emulator/M.1599023597.A.03A.html
srwcc: 推 09/02 13:24
jazon: 先推一個 這邊的概念是如果有在寫程式的版友才比較容易看懂 09/02 15:05
napdh: 好文推薦 09/02 15:20
Jay915: 推 09/02 20:52
darknote: 紅白機時期記得有幾個遊戲有搞過 09/02 22:07
superrockman: 不會寫程式 有看沒有懂XD 09/03 02:08
icf10076328: 太厲害了 09/03 09:58
kkssffaa: 這個太屌了,不管是精神還是技術,都值得敬佩 09/05 08:45
bgworld: 好酷,對遊戲很有愛 09/06 18:15
AmosYang: 推 09/09 21:17
longlongint: 利用漏洞修改記憶體內容,把二進位程式輸入到記憶體 10/23 13:16
longlongint: 原理簡單實際上很難弄 10/23 13:16