看板 C_Chat作者 Append (鴉片)標題 [討論] TAS的任意代碼執行(ACE)(上)時間 Wed Sep 2 13:12:05 2020
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影片,
包含了許多不同方向的作法。
(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 中,他們實際上作的是,
「把畫面資訊通過八隻手把傳給超任,
然後
把超任當作一個螢幕」。
超任實際執行的程式碼,
其實只有處理「
把畫面顯示出來」的工作。
------
TASvideo.org 有一篇對於 ACE 的介紹,
對ACE的原理描述大概是這樣的:
http://tasvideos.org/ArbitraryCodeExecutionHowTo.html
每個遊戲系統都會有一格記憶體去紀錄「
現在要執行的程式碼」;
這是理所當然的,不然遊戲也不知道自己現在執行到哪裡了。
通常遊戲的程式碼會存在遊戲卡匣/光碟/磁片這些唯讀裝置中,
在正常遊玩下,這些部分通常是沒辦法被更改的。
然而,如果我們能夠去寫入
「現在要跑哪一段程式碼」的那一格記憶體,
把它指向某個我們能夠比較自由操作的記憶體空間──
例如 Pokemon,他有比較大的背包/攜帶道具的系統,
因此玩家可以透過更換隊伍順序/物品順序的方式,
在那一段記憶體中
安排好「要執行的程式碼」,
然後讓遊戲去執行他。
然而,TAS 常常更傾向,
把「要執行的程式碼」指向「
按鍵輸入」的記憶體位址。
只要能夠辦到這件事,程式碼多長都不怕──
用所有手把上的所有按鈕打進去就是了。
當然有時候這件事情很難一步到位,
所以你可能會在一些 ACE 的 TAS的投稿紀錄中,
可以看到作者 Comment 的欄位中寫著,
他們做了不同階段的記憶體調整,
一開始先用比較容易達成的方式,
然後再寫一小段程式碼讓遊戲去讀取手把輸入,
甚至用更高頻率讀取。
好,我知道上面這些句子仍然有些抽象,
可能不太容易看懂這怎麼連到實際運作方式,
但實際的運作原理真的是很冗長而困難,
我覺得不太適合放在這樣一篇介紹性的文章裡面。
真的有興趣的話,
可以參考我之前寫來介紹 AGDQ2016 的夢幻卡車的文章:
#1R5j5WKM (PokeMon) [ptt.cc] [討論] 夢幻卡車@AGDQ2016 (下)
------
- 經典的 ACE 里程碑 - 2017 年的
Pokemon 黃版
- 後記──
如果 TAS 不再玩遊戲
------
(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), 來自: 220.135.48.54 (臺灣)
※ 文章代碼(AID): #1VJocfe_ (C_Chat)
※ 文章網址: https://www.ptt.cc/bbs/C_Chat/M.1599023529.A.A3F.html
推 Lex4193: 很多人連金手指和外掛可以逆向操作拿來增加遊戲難度都不知道了7F 09/02 13:31
推 DaYehNO1: 好有趣,之前我看過比較簡單的TAS是玩弄任天堂大腦鍛鍊遊戲11F 09/02 13:43
推 Segal: 那個用薩爾達跑N64真的是巫術,手把匯流排的頻寬不夠傳送每幀的畫面吧,雖然看得出來有降低解析度。要怎麼送過去還是很不可思議,畢竟超任的硬體也不太可能在上面跑硬解14F 09/02 14:00
→ Append: 我覺得頻寬問題這點可以搭配下一篇的直方圖統計來看
那一個黃版TAS有放了幾秒的海綿寶寶,不只降低解析度,
它同時也仔細的調整了色盤,才能用每frame3251次輸出達成影片的播放。就這點來說,TASbot要作的其實會很接近,
就是先準備好降好頻寬降好規格的無壓縮影片,然後用八隻手17F 09/02 14:04
→ Append: 把每個frame送超多的訊號過去。GBC只有8個按鈕,SFC可是有八隻手把;而且事實上它音效還用了另外兩台NES來處理,
就是TASbot前兩個節目的那兩台23F 09/02 14:08
推 Segal: 嗯嗯剛看完下篇,整個把硬體尬到極限啊天啊。誰會在GB實作媒體撥放啦@@26F 09/02 14:09
推 Cubelia: 真的有喔,Cannon Fodder(GBC)遊戲開頭直接塞~15秒的FMV29F 09/02 14:27
--