顯示廣告
隱藏 ✕
※ 本文轉寄自 ptt.cc 更新時間: 2020-09-02 16:44:12
看板 C_Chat
作者 Append (鴉片)
標題 [討論] TAS的任意代碼執行(ACE)(上)
時間 Wed Sep  2 13:12:05 2020



╭────────────╮
前言 ── 什麼是 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 (上)
[討論] 夢幻卡車@AGDQ2016 (上) - 看板 PokeMon - 批踢踢實業坊
[圖]
[圖]
[圖]

 # 開始之前先說一下。這東西我並沒有完全看懂── # 特別是觸發ACE的部分,還是有個很關鍵的地方猜不出來怎麼辦到。 # 如果下面寫的有不對的地方請不吝指正, # 有我沒有寫清楚的地方歡迎提問, # 而有我沒有想到的部分也歡迎提供想法。
#1R5j5WKM (PokeMon) [ptt.cc] [討論] 夢幻卡車@AGDQ2016 (下)
[討論] 夢幻卡車@AGDQ2016 (下) - 看板 PokeMon - 批踢踢實業坊
[圖]
[圖]
[圖]

 # 接續上一篇。開始之前再次說一下。這東西我並沒有完全看懂── # 這篇會比上一篇難很多。 # 我沒有實作過。我甚至沒有玩過四色版。 # 事實上我也是這兩天才爬文嘗試看懂的。 # 我覺得必要的拼圖還缺了一塊。希望有看得懂的人可以補上。

(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 (臺灣)
※ 文章代碼(AID): #1VJocfe_ (C_Chat)
※ 文章網址: https://www.ptt.cc/bbs/C_Chat/M.1599023529.A.A3F.html
bben900911: 推。1F 09/02 13:19
hotbread: 說這麼多不就外掛仔(誤)2F 09/02 13:20
DarkyIsCat: 有趣3F 09/02 13:20
eightyseven: 原來是玩弄記憶體的遊戲4F 09/02 13:21
FeiYue: 推鴉片5F 09/02 13:28
gipo776: 推6F 09/02 13:29
Lex4193: 很多人連金手指和外掛可以逆向操作拿來增加遊戲難度都不7F 09/02 13:31
Lex4193: 知道了
RYOTSUKI: 推鴉片9F 09/02 13:33
catinclay: 推10F 09/02 13:37
DaYehNO1: 好有趣,之前我看過比較簡單的TAS是玩弄任天堂大腦鍛鍊11F 09/02 13:43
DaYehNO1: 遊戲
AllanCat: 推鴉片13F 09/02 13:49
Segal: 那個用薩爾達跑N64真的是巫術,手把匯流排的頻寬不夠傳送14F 09/02 14:00
Segal: 每幀的畫面吧,雖然看得出來有降低解析度。要怎麼送過去還
Segal: 是很不可思議,畢竟超任的硬體也不太可能在上面跑硬解
Append: 我覺得頻寬問題這點可以搭配下一篇的直方圖統計來看17F 09/02 14:04
Append: 那一個黃版TAS有放了幾秒的海綿寶寶,不只降低解析度,
Append: 它同時也仔細的調整了色盤,才能用每frame3251次輸出達成
Append: 影片的播放。就這點來說,TASbot要作的其實會很接近,
Append: 就是先準備好降好頻寬降好規格的無壓縮影片,然後用八隻手
david7112123: 有夠酷22F 09/02 14:07
Append: 把每個frame送超多的訊號過去。GBC只有8個按鈕,SFC可是有23F 09/02 14:08
Append: 八隻手把;而且事實上它音效還用了另外兩台NES來處理,
Append: 就是TASbot前兩個節目的那兩台
Segal: 嗯嗯剛看完下篇,整個把硬體尬到極限啊天啊。誰會在GB實作26F 09/02 14:09
Segal: 媒體撥放啦@@
b0920075: 看到標題還以為走錯板XD28F 09/02 14:24
Cubelia: 真的有喔,Cannon Fodder(GBC)遊戲開頭直接塞~15秒的FMV29F 09/02 14:27
smart0eddie: 姆咪30F 09/02 14:33
Minesweeper: 好文推31F 09/02 14:44
tw15: 推32F 09/02 14:49
Neil000: 推33F 09/02 14:52
alanqq0624: 推34F 09/02 14:57
notinservice: 推35F 09/02 15:26
tearcross: 推36F 09/02 15:37
reigon1126: 專業推37F 09/02 15:56
y1896547: 很屌38F 09/02 16:03
knight77: 推39F 09/02 16:07
aegius1r: 專業推40F 09/02 16:15

--
※ 看板: ACG 文章推薦值: 1 目前人氣: 0 累積人氣: 283 
分享網址: 複製 已複製
( ̄︶ ̄)b clisan 說讚!
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇