最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

口袋妖怪綠寶石——數(shù)據(jù)提取與代碼分析(A-穿墻金手指的原理)

2022-12-21 16:40 作者:圍巾胖頭魚  | 我要投稿

說(shuō)在前面:

? ? 這個(gè)系列的專欄停止更新了大概4個(gè)月的時(shí)間。在上期的結(jié)尾。作者說(shuō)可能會(huì)拿一個(gè)真正的改版“開刀”,不過(guò)在反復(fù)審視專欄的這些內(nèi)容之后,作者發(fā)現(xiàn)有一類金手指一直沒(méi)有被提及,就是穿墻金手指,這個(gè)金手指算是比較出名的一類。因此,拿改版“開刀”的事還是再緩緩,先用本期內(nèi)容把穿墻金手指的原理講清楚。

????為什么作者在之前的專欄中一直沒(méi)有提到穿墻金手指呢?尤其是作者的另一個(gè)專門討論金手指的專欄系列(究極綠寶石5-金手指原理介紹),也沒(méi)有提,這是因?yàn)楫?dāng)時(shí)那個(gè)專欄提供的知識(shí)不足以找到或者解釋穿墻金手指的原理,要說(shuō)也只能提供一個(gè)代碼,這樣一來(lái)就和網(wǎng)絡(luò)上那些只給代碼不給解釋的網(wǎng)站沒(méi)區(qū)別了。作者不希望對(duì)讀者說(shuō)“拿去用就好,別問(wèn)為什么”這么不負(fù)責(zé)任的話?,F(xiàn)在加上本系列專欄的知識(shí),穿墻金手指的原理就可以解釋了,所以放到本期內(nèi)容來(lái)說(shuō)。

穿墻與碰撞檢測(cè)

????先來(lái)說(shuō)一下穿墻金手指的效果:開啟穿墻金手指之后,所有原先因地形或者人物阻擋而無(wú)法到達(dá)的位置,現(xiàn)在都可以到達(dá)了。比如說(shuō)因?yàn)閴Ρ?、石塊、樹木、欄桿或者NPC阻擋的位置,開啟了穿墻金手指之后就可以“如入無(wú)人之境”,想走到哪就走到哪,“穿墻”二字也是由此而來(lái),下圖就是一個(gè)開了穿墻金手指的效果:

二周目天空之柱,開啟穿墻金手指

????這張圖中,主角竟然站在了石頭上,這在正常情況下是不可能的。二周目的天空之柱布滿了讓人掉落的陷阱,只有騎著音速自行車快速通過(guò)才能避免掉落,比較考驗(yàn)玩家的自行車水平。和原版相比,有的綠寶石改版加大了這里的難度,掉落的格子變得更多、自行車軌跡變得更曲折,讓許多想要攀登到塔頂抓烈空坐的玩家經(jīng)受了不小的考驗(yàn)。

????于是就有玩家求助于穿墻金手指,原本遠(yuǎn)在天邊、被各種陷阱隔開的兩道門,一個(gè)穿墻直接穿過(guò)去就萬(wàn)事大吉了。還有另一種解決方案是瞬移金手指,這在究極綠寶石5.3——科普向,什么是金手指(八)里有詳細(xì)說(shuō)明。

????這里可以說(shuō)一下穿墻金手指的原理了。首先介紹一個(gè)概念:碰撞檢測(cè)。這是一種游戲機(jī)制,字面意思不難理解,就是檢測(cè)兩個(gè)物體是否碰撞,或者用數(shù)學(xué)上的概念來(lái)說(shuō),兩個(gè)點(diǎn)集在空間中是否有交集。碰撞檢測(cè)在游戲領(lǐng)域的存在極其廣泛,一些相當(dāng)古老的游戲,例如吃豆人、合金彈頭、街頭霸王等等都存在碰撞檢測(cè)機(jī)制。

????舉個(gè)例子就能說(shuō)明碰撞檢測(cè)機(jī)制有多么普遍:在射擊類游戲中,玩家打出的子彈有沒(méi)有命中敵人就需要碰撞檢測(cè)。這個(gè)機(jī)制是如此基礎(chǔ)、如此底層,以至于許多玩家將其當(dāng)做理所應(yīng)當(dāng)?shù)氖?。碰撞檢測(cè)機(jī)制也有做得不好的時(shí)候,3D游戲中的“穿?!本褪桥鲎矙z測(cè)實(shí)現(xiàn)不好的后果。

????在綠寶石中,玩家可以用上下左右四個(gè)方向鍵控制游戲主角進(jìn)行移動(dòng),被障礙物阻擋時(shí),主角便無(wú)法前進(jìn),這就是說(shuō)此時(shí)碰撞檢測(cè)的結(jié)果是發(fā)生了碰撞,因此游戲機(jī)制認(rèn)定主角無(wú)法按照原有的方向繼續(xù)移動(dòng),只能停在原地。而穿墻金手指就是要破壞碰撞檢測(cè)機(jī)制、讓碰撞檢測(cè)機(jī)制失效,從而達(dá)到“穿墻”的目的。

原版綠寶石的碰撞檢測(cè)機(jī)制

????下面介紹的是游戲中的主角在行走狀態(tài)下的碰撞檢測(cè)。除了行走狀態(tài),主角還可以騎自行車,此時(shí)的碰撞檢測(cè)和行走狀態(tài)是有區(qū)別的(比如說(shuō)一些只有自行車才能去的地方)。在源代碼項(xiàng)目中,這個(gè)碰撞檢測(cè)機(jī)制的關(guān)鍵函數(shù)是CheckForPlayerAvatarCollision(檢查游戲主角碰撞),先來(lái)看一下它被調(diào)用的地方,一處是在PlayerNotOnBikeMoving內(nèi),位于src/field_player_avatar.c中:

PlayerNotOnBikeMoving

????PlayerNotOnBikeMoving函數(shù)名的字面意思是主角沒(méi)騎自行車時(shí)的運(yùn)動(dòng),函數(shù)的第一行(607行)就在執(zhí)行碰撞檢測(cè):

? ? 從這個(gè)函數(shù)的內(nèi)容可以看出,主角在走路狀態(tài)下的運(yùn)動(dòng)情況,由函數(shù)第一行執(zhí)行的碰撞檢測(cè)結(jié)果collision變量決定,這個(gè)變量表示的就是碰撞類型,例如611行的COLLISION_LEDGE_JUMP,指的就是主角從坡上跳到坡下(碰撞到了坡的分界線),如下圖:

從坡上跳到坡下

?????因此,從CheckForPlayerAvatarCollision函數(shù)的外部可以得知它的返回值類型,表示的就是不同的碰撞類型,這些碰撞類型是以COLLISION_開頭的常量,它的定義如下:

碰撞類型的定義

????碰撞類型是由enum定義的枚舉類型常量,其中COLLISION_NONE(無(wú)碰撞)的取值是0,COLLISION_OUTSIDE_RANGE(超出邊界)的取值是1,COLLISION_IMPASSABLE(不可通過(guò))的取值是2,以此類推。

????碰撞類型中還涉及了怪力術(shù)推石、飛行道館中的旋轉(zhuǎn)門等等碰撞檢測(cè),有興趣的讀者可以在這些碰撞類型上做做文章。

????這樣一來(lái),穿墻金手指的思路就很明確了,如果能讓CheckForPlayerAvatarCollision函數(shù)的返回值總為0,也就是總為COLLISION_NONE,那么主角在走路時(shí)就不會(huì)碰到任何障礙,碰撞檢測(cè)機(jī)制失效了、被破壞了,穿墻的目的也就達(dá)到了。具體的代碼是什么,讀者可以仿照本系列專欄介紹反作弊機(jī)制的6、7、8三期專欄,自行探索這種修改ROM的金手指。

穿墻金手指的另一種思路

????上面那種直接破壞碰撞檢測(cè)機(jī)制的思路,得到的穿墻金手指非常“暴力”,無(wú)論是石頭,是樹,還是NPC,都是直接對(duì)穿而過(guò)。還有另一種思路,改的是地圖,這種穿墻金手指穿越石頭、樹這樣的障礙沒(méi)問(wèn)題,但是碰到NPC還是會(huì)被阻擋住。

????在本系列專欄第3、4期的時(shí)候提到了地圖信息提取,在AdvaceMap這個(gè)工具中可以看到地圖是由一個(gè)個(gè)小正方形拼起來(lái)的:? ?

由小正方形拼起來(lái)的地圖

? ? 在“設(shè)置”菜單中,勾選了第一個(gè)選項(xiàng)“顯示網(wǎng)格”就可以看到地圖被分割成了小正方形,這就是組成地圖的最基本單元,在源代碼項(xiàng)目中,這個(gè)基本單元被稱作metatile(元地圖塊)。

????地圖上方的五個(gè)標(biāo)簽欄中,第二個(gè)是“運(yùn)動(dòng)許可”,打開看一下:

地圖的運(yùn)動(dòng)許可

????可以看到,每個(gè)元地圖塊都有一個(gè)數(shù)字標(biāo)號(hào),和地圖進(jìn)行比對(duì),可以發(fā)現(xiàn)所有標(biāo)1的元地圖塊對(duì)應(yīng)到了樹木、建筑、圍墻等等,都是運(yùn)動(dòng)障礙。因此,如果能夠修改地圖,改變這些元地圖塊的“運(yùn)動(dòng)許可”,就可以做到穿墻金手指的效果了。

????目前為止還有一個(gè)很大的問(wèn)題,改地圖的話工作量太大了。前一個(gè)思路,一條代碼就可以破壞碰撞檢測(cè)機(jī)制,可以做到在任何位置都能穿墻;而這個(gè)思路打算改多少個(gè)元地圖塊呢?改哪些元地圖塊呢?會(huì)不會(huì)讓金手指的行數(shù)變得特別龐大呢?

????碰巧的是,作者最近在網(wǎng)上找到了一條符合這個(gè)思路的穿墻金手指,接下來(lái)就從分析這個(gè)金手指的角度來(lái)反推一下它能夠?qū)崿F(xiàn)穿墻的原理。

一條可以引起思考的穿墻金手指

????這條穿墻金手指是這樣的:

????格式是V1/V2格式碼,這個(gè)格式的代碼之前沒(méi)有介紹過(guò),但是它的“近親”V3格式碼的信息可以參考另一個(gè)系列專欄的究極綠寶石5.3——科普向,什么是金手指(九)。V3格式碼可以看做是V1/V2格式碼的進(jìn)化版本,也就是說(shuō)V1/V2格式碼相對(duì)V3格式碼要落后一些,能夠?qū)崿F(xiàn)的功能比V3格式碼少一些,但是代碼類型、中間代碼、加密這些概念還是通用的。

????在VBA模擬器中,V1/V2格式碼和V3格式碼的輸入方式是相同的,都是在“金手指列表”的GameShark按鍵彈出的輸入框內(nèi)輸入。

? ? 關(guān)于這條中間沒(méi)有空格的代碼,VBA模擬器也有一些誤導(dǎo)之處:在輸入代碼時(shí),無(wú)論中間有沒(méi)有空格,最后顯示在列表里的都是沒(méi)有空格的樣子。但是,上面這條穿墻金手指中間一旦加了空格,含義就發(fā)生了變化,也就不能起到穿墻的作用了,具體來(lái)說(shuō)看下圖:

金手指中間有沒(méi)有空格

????第一條金手指,輸入的時(shí)候在中間加了一個(gè)空格;第二條保持原樣??墒窃谧詈笤诮鹗种噶斜碇?,顯示的都是沒(méi)有空格的樣子。雖然看上去一樣,但只有第二條是能夠穿墻的金手指,第一條不會(huì)起作用。

????雖說(shuō)格式有了變化,不過(guò)將V1/V2格式碼轉(zhuǎn)換為原始代碼的流程還是可以類比到V3格式碼的。在這里,作者把這個(gè)過(guò)程再重復(fù)一遍(就像在究極綠寶石5.3——科普向,什么是金手指(九)里一樣),就當(dāng)是復(fù)習(xí)了。

????首先是AR Crypt解密,注意代碼類型左邊選擇AR v1/2,右邊選擇RAW:

解密的到中間代碼

????得到的中間代碼沒(méi)有空格,但是,對(duì)于中間代碼來(lái)說(shuō),有沒(méi)有中間的空格已經(jīng)無(wú)關(guān)緊要,它是不會(huì)影響內(nèi)容的,完全可以看做:

????接下來(lái)是去查文檔,這次要到GameShark V1/V2的區(qū)域去找:

V1/V2格式碼介紹

????這個(gè)中間代碼以6開頭,右半邊的8位十六進(jìn)制數(shù)以4個(gè)0開頭,符合16-bit ROM Patch這個(gè)代碼類型的定義,含義是在ROM的某個(gè)地址處寫入半字xxxx(兩個(gè)字節(jié))。這里插句話,對(duì)于ROM(只讀存儲(chǔ)器),說(shuō)“寫入”有些不太合適(只讀的東西怎么能寫入呢),這只是為了方便理解,英文用的是Patch而不是Write就是進(jìn)行了嚴(yán)謹(jǐn)?shù)膮^(qū)分。

????下一步是計(jì)算在ROM內(nèi)寫入的地址,按照規(guī)則的說(shuō)明,需要把6后面的aaaaaaa這個(gè)7位2進(jìn)制數(shù)乘2,才能得到真實(shí)地址

????這樣就最終得到了原始代碼:

????然后可以去符號(hào)表查一下這條金手指究竟改的是哪個(gè)函數(shù):

根據(jù)原始代碼的左半邊找對(duì)應(yīng)的修改函數(shù)

????MapGridGetCollissionAt這個(gè)函數(shù)的范圍位于[080881b0,08088224),正好是0808820C所在的范圍,這就是穿墻金手指修改的函數(shù)。這個(gè)函數(shù)其實(shí)就是根據(jù)元地圖塊的“運(yùn)動(dòng)許可”信息來(lái)計(jì)算碰撞類型的函數(shù),修改它也就相當(dāng)于同時(shí)修改了所有元地圖塊,這也就解決了修改地圖是否會(huì)工作量過(guò)大的問(wèn)題。

為什么要把金手指寫得這么晦澀

????通過(guò)上一節(jié)的討論,我們知道下面這兩條金手指是等價(jià)的:

? ? 如果不借助工具,或者對(duì)V1/V2格式碼了解不多,從第一行金手指中完全無(wú)從得知它能夠?qū)崿F(xiàn)穿墻的原理;相比之下,第二行的原始代碼則是簡(jiǎn)單直接地告訴人們它修改了什么地方,研究它的原理要簡(jiǎn)便得多。

????作者在另一個(gè)系列的專欄里提到過(guò),V3格式碼可以實(shí)現(xiàn)原始代碼實(shí)現(xiàn)不了的功能,比如條件判斷之類,在那種情況下,使用V3格式碼,或者它的前身V1/V2格式碼有充足的理由。但是,對(duì)于這條穿墻金手指來(lái)說(shuō),明明可以用原始代碼寫得這么簡(jiǎn)單明了,為什么還要用晦澀的V1/V2格式碼來(lái)寫?它們明明在功能上是等價(jià)的。

????下面來(lái)說(shuō)一下作者自己的看法。

????本系列專欄提到過(guò)綠寶石的反作弊機(jī)制,讓金手指的使用變得沒(méi)有那么容易。但是反作弊機(jī)制再?gòu)?qiáng)大,在原版綠寶石不再更新的背景下,這就是個(gè)死東西,任何被確認(rèn)有效的金手指以后將一直有效下去。而基于綠寶石改版的游戲則不同,如果它會(huì)不斷更新下去,制作組可能就會(huì)在新的一次更新中考慮讓一些能夠在舊版里生效的金手指失效。

????此時(shí)去看那些原始代碼寫成的金手指,一眼就能看到它修改了哪里,到時(shí)候在游戲更新時(shí)稍微改改函數(shù)的語(yǔ)句、數(shù)據(jù)的位置,就能廢掉相當(dāng)一部分金手指。如何應(yīng)對(duì)這一點(diǎn)呢?制作金手指的人也有自己的“反反作弊”機(jī)制,那就是用V3格式碼(或者V1/V2格式碼)加密,讓制作組不那么輕易地看出自己制作的這條金手指究竟改的是哪里,也就無(wú)從對(duì)癥下藥讓它不再生效。

????又說(shuō)到“魔和道究竟誰(shuí)高一尺,誰(shuí)高一丈”的問(wèn)題了。以上僅代表個(gè)人觀點(diǎn)~

????雖說(shuō)作者通過(guò)寫個(gè)這系列的專欄想讓讀者了解到一些知識(shí),但作者其實(shí)也學(xué)到了不少東西。這次寫穿墻金手指給作者一個(gè)提示,那就是專欄的內(nèi)容遠(yuǎn)稱不上完善,那就隨緣繼續(xù)更新,看看下次還能補(bǔ)充進(jìn)來(lái)什么內(nèi)容。繼續(xù)感謝眾位讀者的支持!

口袋妖怪綠寶石——數(shù)據(jù)提取與代碼分析(A-穿墻金手指的原理)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
波密县| 德昌县| 安顺市| 香港 | 惠安县| 新晃| 浮梁县| 晋宁县| 循化| 弥渡县| 汶上县| 柘城县| 诸城市| 廉江市| 张掖市| 济阳县| 浮山县| 皮山县| 洱源县| 若尔盖县| 镇江市| 积石山| 焦作市| 襄汾县| 龙胜| 赣州市| 平武县| 加查县| 潼关县| 汉川市| 社旗县| 青河县| 南岸区| 遂溪县| 多伦县| 德清县| 巴南区| 澜沧| 孟连| 江西省| 乳山市|