CB碼/code breaker/代碼斷路器介紹——科普向,什么是金手指(十一)
說在前面:
????本期專欄起到一個(gè)補(bǔ)充作用,介紹代碼斷路器(Code?Breaker,或簡(jiǎn)稱CB碼)這一金手指類型。

代碼斷路器
????本系列專欄的第五期究極綠寶石5.3——科普向,什么是金手指(五)里面提及了代碼斷路器類型的金手指,但是當(dāng)時(shí)沒有詳細(xì)介紹:
第一行的四個(gè)按鈕,“代碼(C)...”“修改(H)...”“Gameshark...”“CodeBreaker...”,指的是金手指的格式。金手指的格式可以大致分為3類:
……
3. CodeBreaker,也被稱為代碼斷路器。這種類型的金手指沒有必要詳細(xì)介紹,因?yàn)樗茏龅降墓δ埽即a和GS碼也能做到,因此專欄的內(nèi)容只會(huì)涉及到前兩種代碼。
? ? 現(xiàn)在給出一個(gè)詳細(xì)的介紹:
????CodeBreaker,也被稱為代碼斷路器、CB碼。格式為:8位十六進(jìn)制數(shù) 4位十六進(jìn)制數(shù)。具體來說,CB碼的一行是由單個(gè)空格分隔的一個(gè)8位十六進(jìn)制數(shù)和一個(gè)4位十六進(jìn)制數(shù),這一行除了兩個(gè)數(shù)字、單個(gè)空格和結(jié)尾那個(gè)看不見的回車符,沒有任何其他符號(hào)。
????當(dāng)時(shí)作者說“它能做到的功能,原始代碼和GS碼也能做到”,其實(shí)這句話并不正確。作者后來了解到,CB碼支持對(duì)某個(gè)地址處的變量進(jìn)行邏輯運(yùn)算(邏輯與和邏輯或),這是原始代碼和V3格式碼做不到的,但是很少有金手指會(huì)用到這種運(yùn)算,至少在這個(gè)系列的專欄中介紹的金手指都沒有用到。如果當(dāng)時(shí)這種說法給讀者帶來了誤導(dǎo)或者困惑,作者在這里要說聲抱歉!
????在VBA模擬器的“金手指——金手指列表”功能窗口內(nèi),下方8個(gè)按鈕的右上角“CodeBreaker...”就是輸入CB碼的按鈕:


CB碼的代碼類型
????CB碼的理解難度介于原始代碼和V3格式碼之間。CB碼和V3格式碼有相似的地方,例如它們都具有代碼類型,不同的代碼類型實(shí)現(xiàn)的是不同的功能,而原始代碼就沒有代碼類型,因此原始代碼就只有一種功能:向指定地址寫入數(shù)據(jù)。CB碼和V3格式碼的不同之處在于CB碼不需要加密,因此看到一個(gè)CB碼格式的金手指時(shí),不需要借助AR Crypt這類的工具進(jìn)行解密就可以理解這條金手指的原理。
????在本系列專欄第九期究極綠寶石5.3——科普向,什么是金手指(九)中,作者詳細(xì)介紹了V3格式碼,它的代碼類型、轉(zhuǎn)換規(guī)則等在“The Secrets of Professional GameShark(tm) Hacking”文檔中被詳細(xì)地列出。事實(shí)上,這個(gè)文檔中同樣也有CB碼的介紹,但是內(nèi)容并不完整:
????

????這里對(duì)CB碼的介紹和對(duì)V3格式碼的介紹在形式上十分相近,都是在左側(cè)列出代碼類型和舉例,右側(cè)列出每類代碼的詳細(xì)說明。但是,這個(gè)表格并不完整,有些代碼類型并沒有在其中列出,還需要找其他的文檔來補(bǔ)充缺失的內(nèi)容。
????缺失的內(nèi)容可以在AR Crypt?3.12 beta版本中找到,在本系列第九期介紹過這個(gè)工具,當(dāng)時(shí)用的是這個(gè)工具的另一個(gè)版本(2.4B)。新的3.12 beta版本里面添加了對(duì)CB碼的介紹,打開這個(gè)工具,選中左上菜單欄的“Create...->CBA”:

????在這個(gè)選項(xiàng)上打?qū)︺^后,就可以查看每個(gè)CB碼格式對(duì)應(yīng)的介紹:在下拉菜單中選擇一個(gè)代碼類型,它的介紹會(huì)出現(xiàn)在標(biāo)題欄上。

????上圖顯示的是Type 4類型,介紹為Slide code。這個(gè)介紹十分簡(jiǎn)略,還需要結(jié)合上面文檔里的具體說明才能明確這個(gè)類型的金手指該如何使用,其他的代碼類型介紹同樣簡(jiǎn)略,這是它的不足之處,但好處是所有的代碼類型都有介紹,類型是完整的。因此,想要對(duì)CB碼有一個(gè)既全面又深入的了解,最好將上面文檔中的內(nèi)容和AR Crypt工具提供的簡(jiǎn)略介紹對(duì)比著看,互為補(bǔ)充。
????通過對(duì)比可以看到:CB碼的代碼格式就是這一行代碼的第一個(gè)數(shù)字。例如,代碼
????它的類型就是Type 8,含義是“16 Bits RAM Write”,也就是向RAM中寫入16位的數(shù)據(jù),其含義和原始代碼的0202450c:02b0是相同的。
????除了第一個(gè)數(shù)字(也就是“最高位”)之外,CB碼中左半部分的內(nèi)容表示的就是變量地址,這和原始代碼有很大的相似性,并且這條CB碼是直接可以輸入到VBA模擬器中使用的,不需要像V3格式碼那樣還要經(jīng)過一步加密操作。也就是說,CB碼沒有“中間代碼”這一步操作。

舉例說明:將一些金手指轉(zhuǎn)換到CB碼
????下面將對(duì)金手指中可能用的到的代碼類型進(jìn)行介紹,把之前專欄內(nèi)容涉及到的金手指轉(zhuǎn)換為CB碼作為舉例說明。

Type 3和Type 8,變量寫入
????Type 3類型的CB碼寫入一個(gè)字節(jié)的數(shù)據(jù),Type 8類型的CB碼寫入兩個(gè)字節(jié)的數(shù)據(jù),它們都可以直接對(duì)應(yīng)到原始代碼,例如下面兩行代碼是等價(jià)的:
? ?它們的含義都是將隊(duì)伍首位精靈的級(jí)別修改為100,但是因?yàn)檫@個(gè)變量是面板值,如果不修改它的非面板值(經(jīng)驗(yàn)值),這種金手指是不會(huì)生效的,所以在這里只是舉個(gè)例子。
????同樣等價(jià)的還有下面兩行代碼:
????它們的含義都是將隊(duì)伍首位精靈的種族修改為三首惡龍。

Type 2和Type 6,邏輯或和邏輯與
????這兩個(gè)類型的CB碼作用是對(duì)某個(gè)地址處的16位數(shù)據(jù)(兩個(gè)字節(jié))進(jìn)行“邏輯或”或者“邏輯與”操作。本系列專欄并沒有涉及該類型的金手指,因此在這里根據(jù)本系列專欄第七期究極綠寶石5.3——科普向,什么是金手指(七)的精靈映射表臨時(shí)創(chuàng)作兩個(gè)金手指。
????將隊(duì)伍中首位精靈的特性改為第二個(gè)普通特性(當(dāng)首位精靈不是隱藏特性的情況下):
????這里用到了“邏輯或”運(yùn)算,通過精靈映射表可以知道,02024535這個(gè)字節(jié)的最高位表示了隊(duì)伍首位精靈是第一特性還是第二特性,因此將該位“置為1”就是把特性修改為第二特性。在邏輯運(yùn)算中,“把某位置為1”使用“邏輯或”運(yùn)算最合適,因?yàn)樗粫?huì)影響其他位的數(shù)據(jù)。要是用成了原始代碼02024536:8000,不僅把特性修改了,連個(gè)體值也會(huì)被修改,因此這種只需要修改變量的某幾位的金手指用邏輯運(yùn)算更為合適。
????將隊(duì)伍中首位精靈的特性改為第一個(gè)普通特性(當(dāng)首位精靈不是隱藏特性的情況下):
????這里用到了“邏輯與”運(yùn)算,把02024537這個(gè)字節(jié)的最高位“置為0”。在邏輯運(yùn)算中,“把某位置為0”使用“邏輯與”運(yùn)算最合適,同樣是因?yàn)樗粫?huì)影響其他位的數(shù)據(jù)。上面兩條金手指的設(shè)計(jì)原理對(duì)于熟悉邏輯運(yùn)算的讀者來說理解起來應(yīng)該很容易。

Type 4,批量寫入
????這條代碼英文介紹為“Slide Code”,作者暫且將它翻譯為“批量寫入”。仔細(xì)看它在文檔中的說明,可以看到這個(gè)類型的CB碼有兩行,格式如下:
? ? 不過,經(jīng)過評(píng)論區(qū)讀者的提醒,這個(gè)文檔對(duì)Type 4類型的介紹有誤,非常感謝這位讀者,否則作者不知道還要被蒙騙多久……因此也給其他讀者提個(gè)醒:盡信書不如無書。
????Type 4類型的代碼真正的格式是這樣的:
????含義是從地址aaaaaaa開始,每相隔iiii的長(zhǎng)度寫入一次yyyy數(shù)據(jù),每次寫入之后內(nèi)容再加上zzzz,共寫入xxxx次。如果按照C語言的語法,這是一個(gè)循環(huán)寫入的代碼片段:
????舉個(gè)例子是專欄第九期提到的“全圖鑒發(fā)現(xiàn)”金手指,當(dāng)時(shí)用的是V3格式碼,它對(duì)應(yīng)的中間代碼是:
????根據(jù)這3行中間代碼可以很方便地轉(zhuǎn)換成CB碼:
????這里看一下CB碼的中間兩行,含義是從02025F62開始,每隔2個(gè)字節(jié)(0002)寫入一次FFFF,共寫入55(0037)次,由于每次寫入的都是FFFF,不需要變化,因此Type 4類型的第二行左側(cè)高四位是0000。
????由于每次寫入的字節(jié)數(shù)固定為2個(gè)(這是CB碼格式規(guī)定的,空格的右邊是4位十六進(jìn)制數(shù),也就是2個(gè)字節(jié)),所以使用Type 4的CB碼進(jìn)行連續(xù)地批量寫入時(shí),一般來說第二行的右半邊都是0002,也就是每隔2個(gè)字節(jié)寫入2個(gè)字節(jié),讓寫入的內(nèi)容連續(xù)起來。

Type 7,條件判斷
????Type 7類型最常用的地方是按鍵觸發(fā)類的金手指,以本系列專欄第十期究極綠寶石5.3——科普向,什么是金手指(十)中給出的“隨身回復(fù)”金手指為例,它的V3格式碼對(duì)應(yīng)的中間代碼是:
????對(duì)這兩條金手指還有印象的讀者,還能記得第一行執(zhí)行的是一個(gè)條件判斷:當(dāng)B+Select按鍵被按下時(shí),也就是04000130處的變量取值為03F9時(shí),執(zhí)行下一條代碼;第二行是將“對(duì)話程序”對(duì)應(yīng)的變量修改為和精靈中心護(hù)士對(duì)話的程序。這兩行代碼對(duì)應(yīng)的CB碼是:
????由于CB碼一次最多只能寫入2個(gè)字節(jié),而對(duì)話程序的地址都是4個(gè)字節(jié),所以需要用兩次條件判斷,分兩次寫入2個(gè)字節(jié),這也是CB碼相對(duì)于V3格式碼麻煩一點(diǎn)的地方。

關(guān)于主代碼Master Code的說明
????在CB碼和V3格式碼的文檔中,有一類代碼類型被稱作“主代碼”(Master Code),這類代碼在模擬器中沒有任何用處。作者對(duì)它們存在的原因進(jìn)行一個(gè)簡(jiǎn)要的介紹:
????在真正的GBA游戲機(jī)上使用金手指時(shí),需要借助額外的硬件設(shè)備和GBA游戲機(jī)進(jìn)行連接,這類作弊設(shè)備包括Action Replay (V3格式碼的來源)和Code Breaker(CB碼的來源),在使用這些作弊設(shè)備時(shí),需要根據(jù)游戲版本開啟對(duì)應(yīng)的主代碼。但是模擬器替玩家完成了這一功能,它能夠模擬作弊設(shè)備和GBA游戲機(jī)連接后的游戲狀態(tài),并已經(jīng)默認(rèn)開啟了主代碼,所以在模擬器中主代碼是毫無用處的。

說在后面:
????本期專欄是一個(gè)文檔性質(zhì)的專欄,對(duì)本系列專欄的內(nèi)容進(jìn)行補(bǔ)充。如果以后作者想起什么其他可以補(bǔ)充的內(nèi)容,會(huì)以類似本期專欄的形式放在本系列專欄的后面。