曉月圓舞曲的flag的額外用途
本文所述的一些改動用dsvania編輯器可以方便的完成,所以基本上改動是在這個(gè)編輯器里進(jìn)行的,你也可以對照rom map用16進(jìn)制編輯器修改,不過這樣很麻煩。
flag就是一些標(biāo)記,以美版曉月為例,這是他們的地址和用途。(從dsvania編輯器文檔翻譯而來)
0200033C - Event flags.事件的標(biāo)記,記錄發(fā)生過的事情,已發(fā)生過就不再發(fā)生。
02000344 - Bitfield of miscellaneous flags.雜項(xiàng),是特殊物體相關(guān)的,如可被攻擊破壞墻是否已經(jīng)破裂,可被道具破壞的墻是否已經(jīng)破裂,機(jī)關(guān)門,鐵球是否達(dá)到過足夠的擺幅,按鈕是否按過之類的。
02000360-02000373 - Bitfield of pickup flags.可拾取物品,記錄地圖上已經(jīng)撿過的東西,所以地圖上撿過就不會再次生成了。但如果物品的設(shè)置的var A是0,則不會設(shè)置flag。
02000378,4 - Bitfield of what warp rooms you've unlocked.記錄了你開過的傳送的點(diǎn),與查看地圖界面上是否有黃色標(biāo)記的房間無關(guān)。此外,一旦進(jìn)入任何一個(gè)傳送點(diǎn),荒城回廊的傳送點(diǎn)就會自動開啟。
0200037C,2 - Bitfield of which area names you've seen.記錄你見過的區(qū)域名,就是進(jìn)新區(qū)域會彈出的那行地名。下次進(jìn)入就不會顯示名字了。
0200037E,2 - Boss death flags. boss死亡標(biāo)記,記錄已經(jīng)打敗的boss,這樣已打敗的boss就不會再出現(xiàn)了。
? 00 0001 Graham????????????格拉罕
? 01 0002 Death????????????????死神
? 02 0004 Julius????????????????尤利烏斯
? 03 0008 (Unused)??????????未使用
? 04 0010 Headhunter??????收集者
? 05 0020 Legion????????????? ? 死人軍團(tuán)
? 06 0040 Balore????????????????巴洛爾
? 07 0080 Chaos????????????????混沌(混沌擊敗時(shí)會設(shè)置這個(gè)flag,但是讀檔后又會變回沒打過混沌的狀態(tài),這樣讀檔后就能再打混沌了。)
? 08 0100 (Unused)????????????未使用
? 09 0200 (Unused)? ? ????????未使用
? 0A 0400 Manticore????????????曼提科亞(蝎尾獅)
? 0B 0800 Creaking Skull????大骷髏
? 0C 1000 Big Golem????????????巨人
? 0D 2000 (Unused)????????????未使用,經(jīng)測試似乎是食人蟲
? 0E 4000 (Unused)? ? ????????未使用
? 0F 8000 Great Armor????????大裝甲(此怪物的flag可以自己設(shè)置,是放置怪物時(shí)的var A,dsv編輯器內(nèi)可改)
大骷髏和大裝甲的換皮怪大骸骨、終極衛(wèi)兵、影子騎士作為boss和他們的本體flag是一樣的。大骸骨是0B,大裝甲flag是自己設(shè)置。
上面就是所謂的flag了,可以看出這是用來記錄各種事項(xiàng)的。所以如果有東西共用flag就能相互影響。比如原版的按鈕和機(jī)關(guān)門,按鈕按下,改變了flag,機(jī)關(guān)門檢測到flag已經(jīng)設(shè)置為1,就打開了。而兩個(gè)物品共用flag,就會在拾取一個(gè)物品以后設(shè)置flag,之后兩個(gè)物品都不會再生成了。
而設(shè)置flag是把這位標(biāo)記從0變成1,但是具體是哪一位?這需要看地址。這里用gba模擬器VisualBoyAdvance自帶的內(nèi)存查看器看看這些值。先看記錄拾取物品的區(qū)域。

撿起這把武器??纯磧?nèi)存的變化。從02000360開始是撿到的物品的標(biāo)記。

我們可以看見第三個(gè)數(shù)字變成了02,這里是小端模式,16進(jìn)制,低位地址更低。那么為什么是02?換成2進(jìn)制就明確了。00 00 02,換成二進(jìn)制看。從左到右,00 00 02四組數(shù)在不同的地址,右邊的地址更大,所以位數(shù)更高。實(shí)際上是02 00 00,而每組數(shù)都是兩位16進(jìn)制數(shù)8位2進(jìn)制數(shù),即一個(gè)地址存一個(gè)字節(jié)。
??十六進(jìn)制? ? ? ? ? 00????????????????????????????????00? ? ? ? ? ? ? ? ? ? ?????????????02???????????????????????????...
??二進(jìn)制? ? ? ?0000 0000????????????????????0000 0000????????????????????0000 0010???????????????????...
???位數(shù)? ? ??????7654 3210????????????????????7654 3210????????????????????7654 3210? ? ????????????? ?...??????
???????????????7,6,5,4 3,2,1,0? ? ???15,14,13,12,11,10,9,8?? ?23,22,21,20,19,18,17,16????????...
這就一目了然了,17對應(yīng)的位置被設(shè)置成了1.所以那里看起來就是02了。所以flag就是以文章開頭的地址為最低位的一個(gè)很長的數(shù)的每一位。但這個(gè)地址是有范圍的,所以這個(gè)數(shù)的位數(shù)是有范圍的,編輯超出位數(shù)的flag就是編輯不屬于自己類型的flag了。我們可以很容易地讓一個(gè)能自由編輯flag位置的東西設(shè)置或者檢測的flag因?yàn)樽銐虼蠖膭觿e的區(qū)。這就是重點(diǎn)了。
能自由控制設(shè)置flag的位置的,有按鈕,鐵球,可破壞墻,可拾取物品等。能修改要檢測的flag的位置的,有可被道具破壞墻,機(jī)關(guān)墻,商店物品池(僅限bossflag)等。bossflag等則是不可修改的。

以打完boss地板碎裂為例。需要boss和可被機(jī)關(guān)破壞墻。拿食人蟲當(dāng)被打的對象,因?yàn)樗恍枰驹诘匕迳?。效果如下?/p>
bossflag的地址是0200037E。地板是雜項(xiàng),起始地址是02000344。兩者起始地址不同,所以flag值不同。食人蟲varA設(shè)為1,讓他作為boss登場。地板形狀要合適,varA取000B。食人蟲bossflag是0D,即?20 00,小端模式下是00 20,是擊敗后在第13位上設(shè)置flag。
問題在于,地板檢測的的flag,即地板的var B要如何設(shè)置?
每個(gè)地址下有一個(gè)字節(jié),8位二進(jìn)制數(shù),就是8個(gè)flag。(0200037E-02000344)*8=1D0,這就是bossflag的地址和miscellaneous flags的地址之間的這些數(shù)據(jù)的位數(shù)對應(yīng)的flag的偏移值,bossflag的第0位對于miscellaneous flags來說就是1D0。而bossflag值是相對bossflag的第0位,格拉罕的死亡標(biāo)記在miscellaneous flags的值中是0x01D0,死神是0x01D1,而食人蟲是0x01DD。所以地板值varB設(shè)為1DD,就能檢測到食人蟲的bossflag,在食人蟲被擊敗時(shí)自動碎掉了。

我比較懶所以不寫太多,微機(jī)原理也學(xué)的不算好,有些概念講的不清楚,但也不再多說了,原理大致如此。flag是四位有符號16進(jìn)制數(shù),所以負(fù)數(shù)flag能影響到地址在前面的flag。計(jì)算方法也給出來了,剩下的自行摸索吧。日版和美版可能存在地址上的差異,沒有查看過日版(或者漢化rom),所以無法下定論。