口袋妖怪綠寶石——數(shù)據(jù)提取與代碼分析(0-工具&資源)
系列專(zhuān)欄前言:
????本系列專(zhuān)欄是上個(gè)系列專(zhuān)欄——究極綠寶石5-金手指原理介紹(下面簡(jiǎn)稱(chēng)為《金手指原理介紹》)——的后續(xù),旨在利用若干常用的分析工具,對(duì)口袋妖怪綠寶石這款游戲進(jìn)行數(shù)據(jù)提取與代碼分析。雖然作者是從尋找金手指的角度來(lái)切入這一話(huà)題,但在探索的過(guò)程中卻發(fā)現(xiàn)了許多遠(yuǎn)遠(yuǎn)超出金手指范疇的知識(shí)。為此特開(kāi)一系列專(zhuān)欄,記錄探索過(guò)程中的經(jīng)驗(yàn)與心得。
????國(guó)內(nèi)有許多基于口袋妖怪綠寶石的改版作品,其中不乏優(yōu)秀之作,至今還可以在百度貼吧等平臺(tái)看到它們活躍的身影。出于對(duì)各個(gè)制作組的尊重,本系列專(zhuān)欄只分析口袋妖怪綠寶石的原版游戲,而不是哪一個(gè)具體的改版游戲。分析原版游戲還有一個(gè)好處,就是網(wǎng)絡(luò)上對(duì)于原版游戲的分析已經(jīng)達(dá)到了一個(gè)相當(dāng)成熟的地步,分析起來(lái)有很多現(xiàn)成的資源。
????本專(zhuān)欄希望通過(guò)對(duì)綠寶石游戲的分析,對(duì)其中涉及的各種計(jì)算機(jī)知識(shí)(如匯編語(yǔ)言、正則表達(dá)式、靜態(tài)分析)做一個(gè)簡(jiǎn)要介紹,知識(shí)的難度和深度會(huì)遠(yuǎn)遠(yuǎn)超過(guò)《金手指原理介紹》的內(nèi)容。掌握這些知識(shí)后,作者在綠寶石游戲中找到了許多“高級(jí)”的金手指,而這些“高級(jí)”的金手指也僅僅是學(xué)習(xí)過(guò)程中的一些副產(chǎn)品而已。
????感興趣的讀者不妨先從《金手指原理介紹》這一系列的專(zhuān)欄入手,對(duì)綠寶石這款游戲和一些基本的計(jì)算機(jī)知識(shí)有一個(gè)大致的了解。歡迎讀者們對(duì)專(zhuān)欄的內(nèi)容提出意見(jiàn)和建議,這對(duì)改善專(zhuān)欄的內(nèi)容質(zhì)量很有幫助!

說(shuō)在前面:
????許多編程語(yǔ)言在給一系列對(duì)象編號(hào)時(shí),習(xí)慣從0開(kāi)始,本期專(zhuān)欄為第0期專(zhuān)欄,正是遵循了這一慣例。這一期主要介紹分析綠寶石過(guò)程中可能用到的各種資源和工具,“工欲善其事,必先利其器”。

口袋妖怪綠寶石 游戲本體與模擬器
????先來(lái)引用一段百度百科上對(duì)《口袋妖怪》的介紹:
《寶可夢(mèng)》(曾譯名《精靈寶可夢(mèng)》)另有常見(jiàn)非官方譯名:《口袋妖怪》(中國(guó)大陸曾譯名)、《寵物小精靈》(中國(guó)香港曾譯名)、《神奇寶貝》(中國(guó)臺(tái)灣曾譯名)。是由Game Freak和Creatures株式會(huì)社開(kāi)發(fā),任天堂發(fā)行的系列游戲,是寶可夢(mèng)媒體作品的主要部分。
——《百度百科》
????最初的《口袋妖怪》系列游戲是在任天堂公司開(kāi)發(fā)的游戲機(jī)(也被稱(chēng)作掌機(jī))上運(yùn)行的。到了綠寶石問(wèn)世的時(shí)候,《口袋妖怪》已經(jīng)來(lái)到了第三世代,與此相對(duì)應(yīng)的游戲機(jī)也發(fā)展到了第二代,被稱(chēng)作GBA(Game Boy Advance)。游戲以卡帶的形式插入到游戲機(jī)的卡槽中進(jìn)行游玩。
? ? GBA游戲機(jī)誕生于21世紀(jì)初,二十多年過(guò)去了,這款游戲機(jī)已成為游戲機(jī)歷史上的古董。對(duì)于使用電腦或者手機(jī)的玩家來(lái)說(shuō),現(xiàn)在能玩到早期的口袋妖怪系列游戲需要?dú)w功于模擬器。同一種游戲機(jī)往往會(huì)有多個(gè)模擬器,比如GBA游戲機(jī)對(duì)應(yīng)的模擬器就有VBA、myBoy、mGBA等等。
????模擬器在電腦或手機(jī)上模擬了游戲機(jī)的運(yùn)行環(huán)境,此時(shí)游戲本體也就不再是原來(lái)的卡帶,而是電腦或者手機(jī)上存儲(chǔ)的游戲文件。這類(lèi)游戲文件的常用名稱(chēng)是ROM(Read-Only Memory,只讀存儲(chǔ)器),這個(gè)名稱(chēng)會(huì)貫穿整個(gè)系列專(zhuān)欄的始終。所謂的口袋妖怪綠寶石系列改版,就是對(duì)ROM這個(gè)游戲文件進(jìn)行修改。
????由于許多分析工具需要在電腦上才能使用,因此專(zhuān)欄推薦使用的模擬器是VBA(Visual Boy Advance),而不是myBoy這種運(yùn)行在手機(jī)平臺(tái)上的模擬器。VBA模擬器是GBA游戲機(jī)對(duì)應(yīng)的一種模擬器,最新的版本是1.8.0 Beta3。
????游戲本體文件是一個(gè)大小為16MB的ROM文件,全名是Pokemon - Emerald Version (U)。后面那個(gè)(U)表示這是它是發(fā)行在北美洲的美版綠寶石,游戲語(yǔ)言是英文。
? ? 資源的鏈接會(huì)在專(zhuān)欄最后給出。

十六進(jìn)制編輯器
????游戲ROM文件是一個(gè)二進(jìn)制文件,本質(zhì)上就是一串0和1,通常被稱(chēng)作0/1序列。查看或者編輯這種類(lèi)型的文件,使用十六進(jìn)制編輯器(Hex Editor)是很方便的。十六進(jìn)制編輯器有許多版本,這里專(zhuān)欄推薦一個(gè)叫做HxD的編輯器,功能簡(jiǎn)潔實(shí)用。

????下載地址位于:https://mh-nexus.de/downloads/HxDSetup.zip

游戲源代碼
????對(duì)于原版綠寶石的分析,前人的工作已經(jīng)非常成熟了。一個(gè)以C語(yǔ)言編寫(xiě)的口袋妖怪綠寶石項(xiàng)目可以在這個(gè)網(wǎng)址找到:
????https://github.com/pret/pokeemerald
????這個(gè)項(xiàng)目可以看做是游戲ROM文件的源代碼。如果用更專(zhuān)業(yè)一點(diǎn)的說(shuō)法,這個(gè)項(xiàng)目是由游戲ROM反編譯得到的結(jié)果。網(wǎng)址內(nèi)有一個(gè)綠色的Code按鈕,點(diǎn)擊后下拉列表里會(huì)有一個(gè)Download ZIP選項(xiàng),點(diǎn)擊后就可以下載所有的源代碼文件,如下圖所示:

????在這個(gè)項(xiàng)目中,還有一個(gè)重要的資源被稱(chēng)為符號(hào)表。網(wǎng)址位于:
????https://raw.githubusercontent.com/pret/pokeemerald/symbols/pokeemerald.sym
????列表中給出的是源代碼中的變量名、函數(shù)名對(duì)應(yīng)到ROM文件中的地址。從某種程度上來(lái)說(shuō),似乎只要有了這個(gè)符號(hào)表,就可以找到所有的金手指,但實(shí)際上符號(hào)表只是提供了一個(gè)便捷的查找功能,在不了解游戲邏輯的情況下許多金手指是不能起到作用的。
????如果有的讀者無(wú)法訪(fǎng)問(wèn)到這兩個(gè)網(wǎng)址,可以通過(guò)專(zhuān)欄最后給出的資源鏈接下載。

代碼編輯器
? ?為了方便地瀏覽、查找源代碼中的各種變量或者函數(shù),一個(gè)功能強(qiáng)大的代碼編輯器是必不可少的。這里專(zhuān)欄推薦VS Code,一個(gè)相對(duì)輕量級(jí)的代碼編輯器,安裝各類(lèi)插件十分方便。在配置好對(duì)應(yīng)的編譯器、鏈接器等工具后甚至可以直接運(yùn)行源代碼來(lái)生成游戲ROM文件(這應(yīng)該是一些改版制作組的改版方法),當(dāng)然在本系列專(zhuān)欄中用不到這么復(fù)雜的功能。
????圖為使用VS Code打開(kāi)源代碼文件中的main.c文件,里面的?函數(shù)就是整個(gè)綠寶石游戲的主函數(shù),會(huì)在后面的專(zhuān)欄中介紹到。

????官方網(wǎng)站:https://code.visualstudio.com/

Excel
????在對(duì)提取出來(lái)的游戲數(shù)據(jù)進(jìn)行進(jìn)一步分析時(shí),Excel表格是個(gè)很好用的工具。其實(shí)它就是一個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng),方便保存和處理在ROM文件中提取出的各種數(shù)據(jù)。
????作者之前曾經(jīng)處理出來(lái)一個(gè)精靈分布表,可以作為這個(gè)工具的一個(gè)使用示例:


匯編指令和機(jī)器碼的在線(xiàn)轉(zhuǎn)換
????一個(gè)好用的匯編指令和機(jī)器碼相互轉(zhuǎn)換的網(wǎng)址:
????https://armconverter.com
????ROM文件中的代碼部分都是機(jī)器碼,也就是0/1序列,只有轉(zhuǎn)換成匯編指令才方便查看。VBA模擬器中也有類(lèi)似的功能,但是VBA模擬器只能查看ROM中已有的代碼,而這個(gè)在線(xiàn)網(wǎng)址轉(zhuǎn)換起來(lái)更加靈活方便。
????這個(gè)網(wǎng)址可以簡(jiǎn)稱(chēng)為ARM to HEX,當(dāng)然反過(guò)來(lái)的HEX to ARM也是可以的,之后的專(zhuān)欄也會(huì)用這個(gè)簡(jiǎn)稱(chēng)來(lái)指代這種功能。

No$GBA Debugger
????在上個(gè)系列專(zhuān)欄的第十期(究極綠寶石5.3——科普向,什么是金手指(十))介紹過(guò)這個(gè)工具,它的斷點(diǎn)功能可以根據(jù)游戲內(nèi)容迅速定位到對(duì)應(yīng)的代碼處。與此同時(shí),No&GBA也提供了反匯編的功能,可以將0/1序列轉(zhuǎn)換為匯編指令并導(dǎo)出成文件,它也是GBA好用的模擬器之一。


反匯編工具
????這一部分不是必須的,主要是因?yàn)樽詈糜玫姆磪R編工具——IDA Pro——價(jià)格昂貴,一般來(lái)說(shuō)只有公司、學(xué)校這種機(jī)構(gòu)會(huì)購(gòu)買(mǎi),作為個(gè)人而言,如果只是像專(zhuān)欄這樣愛(ài)好式的探索實(shí)在是沒(méi)有必要。VBA模擬器中也有類(lèi)似的功能(這句話(huà)似曾相識(shí)?推薦VBA模擬器不是沒(méi)有原因的),只不過(guò)不太好用。在分析復(fù)雜函數(shù)的時(shí)候,IDA Pro可以提供一個(gè)更“好看”的視圖方便理解。

資源鏈接
? ? 這里給一個(gè)百度網(wǎng)盤(pán)鏈接,包含原版綠寶石ROM、VBA模擬器、游戲源代碼和符號(hào)表。
????https://pan.baidu.com/s/1Opf22407MonxyaRwDQE0BQ
????至于提取碼,因?yàn)閷?zhuān)欄是和金手指相關(guān)的,這里給讀者們一個(gè)簡(jiǎn)單的小題目。有的金手指是“背包獲得999個(gè)大師球”類(lèi)型的,這類(lèi)“999”金手指需要在金手指代碼中填入對(duì)應(yīng)的數(shù)字。因此提取碼就是:十進(jìn)制數(shù)字999的十六進(jìn)制形式,補(bǔ)零補(bǔ)足4位,字母大寫(xiě)。

萬(wàn)事俱備

????下期專(zhuān)欄,關(guān)于綠寶石ROM的分析就正式開(kāi)始了。上面提到的工具或早或晚都會(huì)在專(zhuān)欄中出現(xiàn)。其實(shí),有了源代碼之后,分析ROM的難度就大大降低了,相當(dāng)于分析的過(guò)程總有一個(gè)“標(biāo)準(zhǔn)答案”作為參考。但是當(dāng)遇到?jīng)]有“標(biāo)準(zhǔn)答案”的ROM時(shí),本專(zhuān)欄給出的一些分析方法應(yīng)該是能夠起到提示作用的。
????謝謝眾位讀者的支持,歡迎大家對(duì)專(zhuān)欄的內(nèi)容提出意見(jiàn)和建議!