修改曉月圓舞曲怪物的攻擊屬性(以三種特殊狀態(tài)為主)
在dsvania_editor中我們可以輕易地勾選人物武器、紅魂、裝備的屬性和抗性。但是對(duì)于怪物,卻沒(méi)有復(fù)選框供人修改。因?yàn)楣治锏墓魧傩圆⒉缓?jiǎn)單。持有武器、或者發(fā)射投射物的怪物,身體和武器算作不同的物體,攻擊力和屬性也不相同。蝎尾獅蝎尾有毒但身體無(wú)毒。石化牛/石化雞本體不石化,但是他們的霧和激光會(huì)石化。所以屬性不能簡(jiǎn)單的修改。
此方法可能產(chǎn)生無(wú)法估計(jì)的后果。為了減少bug對(duì)您的rom產(chǎn)生的不可逆轉(zhuǎn)的破壞,先備份再修改。修改需要能看內(nèi)存的gba模擬器,這里我用VisualBoyAdvance(vba)。no$gba也行,順便可以自己設(shè)置中斷或者修改指令看看會(huì)發(fā)生什么。還需要一個(gè)16進(jìn)制編輯器,我用的是crystaltile2(ct2)。再準(zhǔn)備一份曉月圓舞曲rom,我用美版,漢化版同理。
從dsv的文檔,可以知道一些重要信息。
=== 020004E4-02007863: Entity memory. Each entity is 0x84 bytes long. Entities range from 00-DF.
What each range of entity slots is for:
00,4: Pointer to update code。實(shí)體的updatecode(似乎是每幀要執(zhí)行的東西)
。。。。。。
1B-48? 020012D0-02002A87? Room entities, including enemies and special objects.
房間內(nèi)的實(shí)體,敵人/特殊物品
。。。。。。
敵人的數(shù)據(jù)就在加粗的位置了。
Memory used for entities in AoS is 020004E4 - 02007863. Each entity is 0x84 bytes long. They range from 0-DF.
。。。。。。
40,4: X pos on the screen in subpixels.
? In the GBA games, each pixel is 0x10000 subpixels.
? Note that unlike the DSVanias, there is no X/Y pos in the room. Only on the screen.
44,4: Y pos on the screen in subpixels.
? In the GBA games, each pixel is 0x10000 subpixels.
? Note that unlike the DSVanias, there is no X/Y pos in the room. Only on the screen.
這兩個(gè)是橫縱坐標(biāo),可以改動(dòng)這兩個(gè)的值,然后看有什么實(shí)體發(fā)生了移動(dòng),從而確定這段內(nèi)存是哪個(gè)實(shí)體的。
。。。。。。
7C,4: On-hurt-player callback.
? This function pointer is called when the entity collides with the player.
擊中玩家時(shí)調(diào)用的函數(shù)指針
80,4: On-damaged callback.
? This function pointer is called when the entity collides with a player weapon.
? It calculates the damage that should be done and kills the enemy if its HP is 0 or below.被玩家擊中時(shí)調(diào)用的函數(shù)指針,關(guān)系到怪物的死亡,不要亂改,但是在這方法里有其他用途。
。。。。。。
這函數(shù)關(guān)系到傷害計(jì)算和屬性了。所以要改屬性就從這里下手。
打開(kāi)gba模擬器,打開(kāi)曉月圓舞曲。進(jìn)入一個(gè)你要改/用的怪的房間。比如我現(xiàn)在要史萊姆的毒。

用dsv看到史萊姆的updatecode是080C1349(49 13 0C 08),打開(kāi)內(nèi)存查看器。每0x84字節(jié)是一只怪的數(shù)據(jù)。轉(zhuǎn)到020012d0。找到49130c08.

打敗史萊姆,這一段全變成00了,說(shuō)明這里就是史萊姆的數(shù)據(jù)。從這里開(kāi)始,地址往后0x7c就是攻擊代碼了。

經(jīng)過(guò)測(cè)試,得到一些重要的攻擊函數(shù)指針(以小端模式記錄)。
319B0908????????詛咒魔
DD130C08???????史萊姆
CDE30A08???????毒蟲(chóng)
CD990808???????牛的霧
牛的霧是重點(diǎn),因?yàn)檫@個(gè)是牛生成后會(huì)自動(dòng)消失的,也找不到updatecode,只能看這段內(nèi)存有沒(méi)有哪里會(huì)突然隨著霧出現(xiàn)又隨著霧消失了。其他投射物同理。在消失之前趕緊暫停然后查看。
接下來(lái)是修改。這里找到了史萊姆,試著把它改成詛咒屬性。把上面圖中的dd 13 0c 08改成31 9b 09 08,結(jié)果如下。

成功,也沒(méi)有什么異常,那就可以這么改了?,F(xiàn)在我只改了內(nèi)存,所以只影響這一只史萊姆。要改動(dòng)rom才行。幸運(yùn)的是,怪物受擊代碼和攻擊代碼存放在一塊。攻擊代碼有復(fù)用,受擊代碼的復(fù)用可能沒(méi)那么多。而兩個(gè)代碼都符合的就更少了。打開(kāi)ct2,打開(kāi)曉月,搜索dd130c080d140308。

dd130c08改成詛咒魔(還是叫外質(zhì)?太久不看中文版,忘了)的攻擊指針319b0908,保存,重新打開(kāi)rom,找史萊姆看看效果。

改成石化霧的CD990808試試。

大致就是這樣了。敵人的投射物也可以這么改。比如讓飛刀鬼的刀帶毒。

原理就是改變怪打中人調(diào)用的函數(shù),因?yàn)閷傩允苓@個(gè)函數(shù)控制。大致如此,可能有未發(fā)現(xiàn)的不明后果,謹(jǐn)慎使用。比如改換皮怪,改了藍(lán)色米諾陶斯,紅色的也跟著變了。美杜莎頭的函數(shù)別的怪用了沒(méi)反應(yīng)。也許存在很多我沒(méi)發(fā)現(xiàn)的問(wèn)題和錯(cuò)誤。