前言: 我想大家都看过ghost9988(2years)在v1.10初期的大作1.10 怪物元素抵抗及免疫的总结分析,从中应该受益良多。
近日,Nefarius公布了对超级和随机金怪防御和抗性相关Mod奖励的解析结果This function handles boss AC and all boss resistance boni,从中我们可以看到一些新的东西。
由于Nefarius基本是直接给出的v1.10各程序段的结论,所以我找到了v1.11b的相关程序,并对每个程序段重新作了较为详细的注释(基本是逐句注释,考虑到其中涉及的基本都是固定的代码及其名称,所以全部用英文注释)。
鉴于我极其有限的汇编水平,如有错误纰漏的地方,勿怪。
*由于从v1.11开始,Blizzard把许多Functions拆开放到不同的地方。对电脑来说,只不过是换了一行内存地址,但对Reader来说实在是增加了许多麻烦。
v1.11b,Blizzard又让其变了一次。
所以,许多Reader都宁可解析v1.10,况且,v1.11/v1.11b各程序只是有些小改动(如某些函数语句的改变),其功能基本都没有改变。
*v1.10的Function由Nefarius解析。
≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈清新脱俗的分割线≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
程序起始及几个退出设定
CF D2Game.6FD08B10
Copy code6FD08B10 /$ 83EC 0C SUB ESP,0C
6FD08B13 |. 56 PUSH ESI
6FD08B14 |. 8BF1 MOV ESI,ECX
6FD08B16 |. 85F6 TEST ESI,ESI
6FD08B18 |. 895424 0C MOV DWORD PTR SS:[ESP+C],EDX
6FD08B1C |. 0F84 82020000 JE D2GAME.6FD08DA4
6FD08B22 |. 8B06 MOV EAX,DWORD PTR DS:[ESI]
6FD08B24 |. 83F8 01 CMP EAX,1
6FD08B27 |. 0F85 77020000 JNZ D2GAME.6FD08DA4
6FD08B2D |. 8B4424 14 MOV EAX,DWORD PTR SS:[ESP+14]
6FD08B31 |. 85C0 TEST EAX,EAX
6FD08B33 |. 0F84 6B020000 JE D2GAME.6FD08DA4
######################################################
Stone Skin AC Function
CF D2Game.6FD08B39
Copy code6FD08B39 |. 83FA 1C CMP EDX,1C ; uniquemod 28 (Stone Skin)
6FD08B3C |. 75 17 JNZ SHORT D2GAME.6FD08B55 ; not Stone Skin, jump the Get Monster Quondam Resistances Function
6FD08B3E |. 6A 00 PUSH 0
6FD08B40 |. 6A 1F PUSH 1F ; StatID 31 (armorclass)
6FD08B42 |. 56 PUSH ESI
6FD08B43 |. E8 A818F2FF CALL ; get inherent armorclass
6FD08B48 |. 6A 00 PUSH 0
6FD08B4A |. D1E0 SHL EAX,1 ; EAX ← armorclass*2
6FD08B4C |. 50 PUSH EAX
6FD08B4D |. 6A 1F PUSH 1F
6FD08B4F |. 56 PUSH ESI
6FD08B50 |. E8 E918F2FF CALL ; armorclass = armorclass*2
如果没检测到Stone Skin,则跳到Get Monster Quondam Resistances Function
如果有Stone Skin,则怪物防御=基础防御×2
依序执行D2Game.6FD08B55地址的指令
*Stone Skin仅仅使怪物防御×2,而非AS所言的×3
*CALL 是得到当前属性原有数值的Function
*CALL 是得到当前属性经过增加后的数值的Function
*SHL EAX,1 二进制逻辑左移一位即十进制×2
*16进制1Ch = 十进制28d,1Fh = 31d
######################################################
Get Monster Quondam Resistances Function
CF D2Game.6FD08B55
Copy code6FD08B55 |> 53 PUSH EBX
6FD08B56 |. 55 PUSH EBP
6FD08B57 |. 57 PUSH EDI
6FD08B58 |. 6A 00 PUSH 0
6FD08B5A |. 6A 27 PUSH 27 ; StatID 39 (fireresist)
6FD08B5C |. 56 PUSH ESI
6FD08B5D |. C74424 2C 0000>MOV DWORD PTR SS:[ESP+2C],0
6FD08B65 |. E8 8618F2FF CALL ; get fireresist
6FD08B6A |. 6A 00 PUSH 0
6FD08B6C |. 6A 29 PUSH 29 ; StatID 41 (lightresist)
6FD08B6E |. 56 PUSH ESI
6FD08B6F |. 8BF8 MOV EDI,EAX ; EDI ← fireresist
6FD08B71 |. E8 7A18F2FF CALL ; get lightresist
6FD08B76 |. 6A 00 PUSH 0
6FD08B78 |. 6A 2B PUSH 2B ; StatID 43 (coldresist)
6FD08B7A |. 56 PUSH ESI
6FD08B7B |. 894424 1C MOV DWORD PTR SS:[ESP+1C],EAX ; ESP+1Ch ← lightresist
6FD08B7F |. E8 6C18F2FF CALL ; get coldresist
6FD08B84 |. 6A 00 PUSH 0
6FD08B86 |. 6A 2D PUSH 2D ; StatID 45 (poisonresist)
6FD08B88 |. 56 PUSH ESI
6FD08B89 |. 8BD8 MOV EBX,EAX ; EBX ← coldresist
6FD08B8B |. E8 6018F2FF CALL ; get poisonresist
6FD08B90 |. 6A 00 PUSH 0
6FD08B92 |. 6A 24 PUSH 24 ; StatID 36 (damageresist)
6FD08B94 |. 56 PUSH ESI
6FD08B95 |. 8BE8 MOV EBP,EAX ; EBP ← poisonresist
6FD08B97 |. E8 5418F2FF CALL ; get damageresist
6FD08B9C |. 6A 00 PUSH 0
6FD08B9E |. 6A 25 PUSH 25 ; StatID 37 (magicresist)
6FD08BA0 |. 56 PUSH ESI
6FD08BA1 |. 894424 20 MOV DWORD PTR SS:[ESP+20],EAX ; ESP+20h ← damageresist
6FD08BA5 |. E8 4618F2FF CALL ; get magicresist
得到当前怪物的原有抗性
各抗性存放的寄存器
EDI = fireresist
ESP+1Ch = lightresist
EBX = coldresist
EBP = poisonresist
ESP+20h = damageresist
EAX = magicresist
依序执行D2Game.6FD08BAA地址的指令
*27h = 39d, 29h = 41d, 2Bh = 43d, 2Dh = 45d, 24h = 36d, 25h = 37d
######################################################
Check Immunities Function
CF D2Game.6FD08BAA
Copy code6FD08BAA |. 83FF 64 CMP EDI,64
6FD08BAD |. 7C 08 JL SHORT D2GAME.6FD08BB7 ; fireresist < 100, jump D2GAME.6FD08BB7
6FD08BAF |. C74424 20 0100>MOV DWORD PTR SS:[ESP+20],1 ; immunities = 1
6FD08BB7 |> 837C24 10 64 CMP DWORD PTR SS:[ESP+10],64
6FD08BBC |. 7C 04 JL SHORT D2GAME.6FD08BC2 ; lightresist < 100, jump D2GAME.6FD08BC2
6FD08BBE |. FF4424 20 INC DWORD PTR SS:[ESP+20] ; immunities+1
6FD08BC2 |> 83FB 64 CMP EBX,64
6FD08BC5 |. 7C 04 JL SHORT D2GAME.6FD08BCB ; coldresist < 100, jump D2GAME.6FD08BCB
6FD08BC7 |. FF4424 20 INC DWORD PTR SS:[ESP+20] ; immunities+1
6FD08BCB |> 83FD 64 CMP EBP,64
6FD08BCE |. 7C 04 JL SHORT D2GAME.6FD08BD4 ; poisonresist < 100, jump D2GAME.6FD08BD4
6FD08BD0 |. FF4424 20 INC DWORD PTR SS:[ESP+20] ; immunities+1
6FD08BD4 |> 8B5424 14 MOV EDX,DWORD PTR SS:[ESP+14]
6FD08BD8 |. 83FA 64 CMP EDX,64
6FD08BDB |. 7C 04 JL SHORT D2GAME.6FD08BE1 ; damageresist < 100, jump D2GAME.6FD08BE1
6FD08BDD |. FF4424 20 INC DWORD PTR SS:[ESP+20] ; immunities+1
6FD08BE1 |> 83F8 64 CMP EAX,64
6FD08BE4 |. 7C 04 JL SHORT D2GAME.6FD08BEA ; magicresist < 100, jump
6FD08BE6 |. FF4424 20 INC DWORD PTR SS:[ESP+20] ; immunities+1
6FD08BEA |> 837C24 20 02 CMP DWORD PTR SS:[ESP+20],2
6FD08BEF |. 0F8D AC010000 JGE D2GAME.6FD08DA1 ; immunities >= 2, jump the Exit Function
检测当前怪物是否有免疫
检测顺序为fireresist, lightresist, coldresist, poisonresist, damageresist, magicresist
≥ 100 即标记为免疫
统计其有几系免疫
若免疫数 ≥ 2,则跳到Exit Function
若免疫数〈 2,依序执行D2Game.6FD08BF5地址的指令
*64h = 100d
######################################################
Magic Resistant Function
CF D2Game.6FD08BF5
Copy code6FD08BF5 |. 8B4C24 18 MOV ECX,DWORD PTR SS:[ESP+18]
6FD08BF9 |. 83F9 08 CMP ECX,8 ; uniquemod 8 (Magic Resistant)
6FD08BFC |. 0F85 81000000 JNZ D2GAME.6FD08C83 ; not Magic Resistant, jump the Fire Enchanted Function
6FD08C02 |. 83FB 64 CMP EBX,64
6FD08C05 |. 7D 17 JGE SHORT D2GAME.6FD08C1E ; EBX >= 100, jump D2GAME.6FD08C1E
6FD08C07 |. 6A 00 PUSH 0
6FD08C09 |. 83C3 28 ADD EBX,28 ; EBX ← EBX+40
6FD08C0C |. 53 PUSH EBX
6FD08C0D |. 6A 2B PUSH 2B ; StatID 43 (coldresist)
6FD08C0F |. 56 PUSH ESI
6FD08C10 |. E8 2918F2FF CALL ; coldresist = coldresist+40
6FD08C15 |. 83FB 64 CMP EBX,64
6FD08C18 |. 7C 04 JL SHORT D2GAME.6FD08C1E ; EBX < 100, jump D2GAME.6FD08C1E
6FD08C1A |. FF4424 20 INC DWORD PTR SS:[ESP+20] ; immunities+1
6FD08C1E |> 837C24 20 02 CMP DWORD PTR SS:[ESP+20],2
6FD08C23 |. 0F8D 78010000 JGE D2GAME.6FD08DA1 ; immunities >= 2, jump the Exit Function
6FD08C29 |. 83FF 64 CMP EDI,64
6FD08C2C |. 7D 17 JGE SHORT D2GAME.6FD08C45 ; EDI >= 100, jump D2GAME.6FD08C45
6FD08C2E |. 6A 00 PUSH 0
6FD08C30 |. 83C7 28 ADD EDI,28 ; EDI ← EDI+40
6FD08C33 |. 57 PUSH EDI
6FD08C34 |. 6A 27 PUSH 27 ; StatID 39 (fireresist)
6FD08C36 |. 56 PUSH ESI
6FD08C37 |. E8 0218F2FF CALL ; fireresist = fireresist+40
6FD08C3C |. 83FF 64 CMP EDI,64
6FD08C3F |. 7C 04 JL SHORT D2GAME.6FD08C45 ; EDI < 100, jump D2GAME.6FD08C45
6FD08C41 |. FF4424 20 INC DWORD PTR SS:[ESP+20] ; immunities+1
6FD08C45 |> 837C24 20 02 CMP DWORD PTR SS:[ESP+20],2
6FD08C4A |. 0F8D 51010000 JGE D2GAME.6FD08DA1 ; immunities >= 2, jump the Exit Function
6FD08C50 |. 8B7C24 10 MOV EDI,DWORD PTR SS:[ESP+10]
6FD08C54 |. 83FF 64 CMP EDI,64
6FD08C57 |. 0F8D 44010000 JGE D2GAME.6FD08DA1 ; lightresist >= 100, jump the Exit Function
6FD08C5D |. 6A 00 PUSH 0
6FD08C5F |. 83C7 28 ADD EDI,28 ; EDI ← EDI+40
6FD08C62 |. 57 PUSH EDI
6FD08C63 |. 6A 29 PUSH 29 ; StatID 41 (lightresist)
6FD08C65 |. 56 PUSH ESI
6FD08C66 |. E8 D317F2FF CALL ; lightresist = lightresist+40
6FD08C6B |. 83FF 64 CMP EDI,64
6FD08C6E |. 0F8C 2D010000 JL D2GAME.6FD08DA1 ; lightresist < 100, jump the Exit Function
6FD08C74 |. 8B4424 20 MOV EAX,DWORD PTR SS:[ESP+20] ; EAX ← immunities
6FD08C78 |. 5F POP EDI
6FD08C79 |. 5D POP EBP
6FD08C7A |. 5B POP EBX
6FD08C7B |. 40 INC EAX ; immunities+1
6FD08C7C |. 5E POP ESI
6FD08C7D |. 83C4 0C ADD ESP,0C
6FD08C80 |. C2 0400 RETN 4 ; Exit
如果没有检测到Magic Resistant,则跳到Fire Enchanted Function
如有Magic Resistant,若resist < 100,则resist+40
检测顺序coldresist, fireresist, lightresist
coldresist, fireresist步骤若免疫数 ≥ 2,则跳到Exit Function
若免疫数〈 2,依序执行下一地址的指令,在执行到最后的lightresist后,若lightresist < 100,则直接跳到Exit Function,若lightresist >= 100,则在依序执行完免疫数量+1后退出程序
*Magic Resistant依次增加冰冷、火焰、闪电各40%抗性,但前提是怪物当前其抗性 < 100%且免疫数量小于2
*64h = 100d, 28h = 40d, 2Bh = 43d, 27h = 39d, 29h = 41d
######################################################
Fire Enchanted Function
CF D2Game.6FD08C83
Copy code6FD08C83 |> 83F9 09 CMP ECX,9 ; uniquemod 9 (Fire Enchanted)
6FD08C86 |. 75 18 JNZ SHORT D2GAME.6FD08CA0 ; not Fire Enchanted, jump the Cold Enchanted Function
6FD08C88 |. 6A 00 PUSH 0
6FD08C8A |. 83C7 4B ADD EDI,4B ; fireresist ← fireresist+75
6FD08C8D |. 57 PUSH EDI
6FD08C8E |. 6A 27 PUSH 27 ; StatID 39 (fireresist)
6FD08C90 |. 56 PUSH ESI
6FD08C91 |. E8 A817F2FF CALL ; fireresist = fireresist+75
6FD08C96 |. 5F POP EDI
6FD08C97 |. 5D POP EBP
6FD08C98 |. 5B POP EBX
6FD08C99 |. 5E POP ESI
6FD08C9A |. 83C4 0C ADD ESP,0C
6FD08C9D |. C2 0400 RETN 4 ; Exit
如果没有检测到Fire Enchanted,则跳到Cold Enchanted Function
如有Fire Enchanted,则火焰抗性增加75%
退出程序
*4Bh = 75d, 27h = 39d
=============================================
Cold Enchanted Function
CF D2Game.6FD08CA0
Copy code6FD08CA0 |> 83F9 12 CMP ECX,12 ; uniquemod 18 (Cold Enchanted)
6FD08CA3 |. 75 18 JNZ SHORT D2GAME.6FD08CBD ; not Cold Enchanted, jump the Lightning Enchanted Function
6FD08CA5 |. 6A 00 PUSH 0
6FD08CA7 |. 83C3 4B ADD EBX,4B ; coldresist ← coldresist+75
6FD08CAA |. 53 PUSH EBX
6FD08CAB |. 6A 2B PUSH 2B ; StatID 43 (coldresist)
6FD08CAD |. 56 PUSH ESI
6FD08CAE |. E8 8B17F2FF CALL ; coldresist = coldresist+75
6FD08CB3 |. 5F POP EDI
6FD08CB4 |. 5D POP EBP
6FD08CB5 |. 5B POP EBX
6FD08CB6 |. 5E POP ESI
6FD08CB7 |. 83C4 0C ADD ESP,0C
6FD08CBA |. C2 0400 RETN 4 ; Exit
如果没有检测到Cold Enchanted,则跳到Lightning Enchanted Function
如有Cold Enchanted,则冰冷抗性增加75%
退出程序
*12h = 18d, 4Bh = 75d, 2Bh = 43d
######################################################
Lightning Enchanted Function
CF D2Game.6FD08CBD
Copy code6FD08CBD |> 83F9 11 CMP ECX,11 ; uniquemod 17 (Lightning Enchanted)
6FD08CC0 |. 75 1C JNZ SHORT D2GAME.6FD08CDE ; not Lightning Enchanted, jump the Poison Hit Function
6FD08CC2 |. 8B4424 10 MOV EAX,DWORD PTR SS:[ESP+10] ; EAX ← lightresist
6FD08CC6 |. 6A 00 PUSH 0
6FD08CC8 |. 83C0 4B ADD EAX,4B ; lightresist ← lightresist+75
6FD08CCB |. 50 PUSH EAX
6FD08CCC |. 6A 29 PUSH 29 ; StatID 41 (lightresist)
6FD08CCE |. 56 PUSH ESI
6FD08CCF |. E8 6A17F2FF CALL ; lightresist = lightresist+75
6FD08CD4 |. 5F POP EDI
6FD08CD5 |. 5D POP EBP
6FD08CD6 |. 5B POP EBX
6FD08CD7 |. 5E POP ESI
6FD08CD8 |. 83C4 0C ADD ESP,0C
6FD08CDB |. C2 0400 RETN 4 ; Exit
如果没有检测到Lightning Enchanted,则跳到Poison Hit Function
如有Lightning Enchanted,则闪电抗性增加75%
退出程序
*11h = 17d, 4Bh = 75d, 29h = 41d
######################################################
Poison Hit Function
CF D2Game.6FD08CDE
Copy code6FD08CDE |> 83F9 17 CMP ECX,17 ; uniquemod 23 (Poison Hit)
6FD08CE1 |. 75 18 JNZ SHORT D2GAME.6FD08CFB ; not Poison Hit, jump the Mana Burn Function
6FD08CE3 |. 6A 00 PUSH 0
6FD08CE5 |. 83C5 4B ADD EBP,4B ; poisonresist ← poisonresist+75
6FD08CE8 |. 55 PUSH EBP
6FD08CE9 |. 6A 2D PUSH 2D ; StatID 45 (poisonresist)
6FD08CEB |. 56 PUSH ESI
6FD08CEC |. E8 4D17F2FF CALL ; poisonresist = poisonresist+75
6FD08CF1 |. 5F POP EDI
6FD08CF2 |. 5D POP EBP
6FD08CF3 |. 5B POP EBX
6FD08CF4 |. 5E POP ESI
6FD08CF5 |. 83C4 0C ADD ESP,0C
6FD08CF8 |. C2 0400 RETN 4 ; Exit
如果没有检测到Poison Hit,则跳到Mana Burn Function
如有Poison Hit,则毒素抗性增加75%
退出程序
*17h = 23d, 4Bh = 75d, 2Dh = 45d
######################################################
Mana Burn Function
CF D2Game.6FD08CFB
Copy code6FD08CFB |> 83F9 19 CMP ECX,19 ; uniquemod 25(Mana Burn)
6FD08CFE |. 75 18 JNZ SHORT D2GAME.6FD08D18 ; not Mana Burn, jump the Spectral Hit Function
6FD08D00 |. 6A 00 PUSH 0
6FD08D02 |. 83C0 14 ADD EAX,14 ; magicresist ← magicresist+20
6FD08D05 |. 50 PUSH EAX
6FD08D06 |. 6A 25 PUSH 25 ; StatID 37 (magicresist)
6FD08D08 |. 56 PUSH ESI
6FD08D09 |. E8 3017F2FF CALL ; magicresist = magicresist+20
6FD08D0E |. 5F POP EDI
6FD08D0F |. 5D POP EBP
6FD08D10 |. 5B POP EBX
6FD08D11 |. 5E POP ESI
6FD08D12 |. 83C4 0C ADD ESP,0C
6FD08D15 |. C2 0400 RETN 4 ; Exit
如果没有检测到Mana Burn,则跳到Spectral Hit Function
如有Mana Burn,则魔法抗性增加20%
退出程序
*19h = 25d, 14h = 20d, 25h = 37d
######################################################
Spectral Hit Function
CF D2Game.6FD08D18
Copy code6FD08D18 |> 83F9 1B CMP ECX,1B ; uniquemod 27 (Spectral Hit)
6FD08D1B |. 75 71 JNZ SHORT D2GAME.6FD08D8E ; not Spectral Hit, jump the Stone Skin Function
6FD08D1D |. 83FB 4B CMP EBX,4B
6FD08D20 |. 7D 17 JGE SHORT D2GAME.6FD08D39 ; coldresist >= 75, jump D2GAME.6FD08D39
6FD08D22 |. 6A 00 PUSH 0
6FD08D24 |. 83C3 14 ADD EBX,14 ; coldresist ← coldresist+20
6FD08D27 |. 53 PUSH EBX
6FD08D28 |. 6A 2B PUSH 2B ; StatID 43 (coldresist)
6FD08D2A |. 56 PUSH ESI
6FD08D2B |. E8 0E17F2FF CALL ; coldresist = coldresist+20
6FD08D30 |. 83FB 64 CMP EBX,64
6FD08D33 |. 7C 04 JL SHORT D2GAME.6FD08D39 ; coldresist < 100, jump D2GAME.6FD08D39
6FD08D35 |. FF4424 20 INC DWORD PTR SS:[ESP+20] ; immunities+1
6FD08D39 |> 837C24 20 02 CMP DWORD PTR SS:[ESP+20],2
6FD08D3E |. 7D 61 JGE SHORT D2GAME.6FD08DA1 ; immunities >= 2, jump the Exit Function
6FD08D40 |. 83FF 4B CMP EDI,4B
6FD08D43 |. 7D 17 JGE SHORT D2GAME.6FD08D5C ; fireresist >= 75, jump D2GAME.6FD08D5C
6FD08D45 |. 6A 00 PUSH 0
6FD08D47 |. 83C7 14 ADD EDI,14 ; fireresist ← fireresist+20
6FD08D4A |. 57 PUSH EDI
6FD08D4B |. 6A 27 PUSH 27 ; StatID 39 (fireresist)
6FD08D4D |. 56 PUSH ESI
6FD08D4E |. E8 EB16F2FF CALL ; fireresist = fireresist+20
6FD08D53 |. 83FF 64 CMP EDI,64
6FD08D56 |. 7C 04 JL SHORT D2GAME.6FD08D5C ; fireresist < 100, jump D2GAME.6FD08D5C
6FD08D58 |. FF4424 20 INC DWORD PTR SS:[ESP+20] ; immunities+1
6FD08D5C |> 837C24 20 02 CMP DWORD PTR SS:[ESP+20],2
6FD08D61 |. 7D 3E JGE SHORT D2GAME.6FD08DA1 ; immunities >= 2 , jump the Exit Function
6FD08D63 |. 8B7C24 10 MOV EDI,DWORD PTR SS:[ESP+10] ; EDI ← lightresist
6FD08D67 |. 83FF 4B CMP EDI,4B
6FD08D6A |. 7D 35 JGE SHORT D2GAME.6FD08DA1 ; lightresist >= 75, jump the Exit Function
6FD08D6C |. 6A 00 PUSH 0
6FD08D6E |. 83C7 14 ADD EDI,14 ; lightresist ← lightresist+20
6FD08D71 |. 57 PUSH EDI
6FD08D72 |. 6A 29 PUSH 29 ; StatID 41 (lightresist)
6FD08D74 |. 56 PUSH ESI
6FD08D75 |. E8 C416F2FF CALL ; lightresist = lightresist+20
6FD08D7A |. 83FF 64 CMP EDI,64
6FD08D7D |. 7C 22 JL SHORT D2GAME.6FD08DA1 ; lightresist < 100, jump the Exit Function
6FD08D7F |. 8B4424 20 MOV EAX,DWORD PTR SS:[ESP+20] ; EAX ← immunities
6FD08D83 |. 5F POP EDI
6FD08D84 |. 5D POP EBP
6FD08D85 |. 5B POP EBX
6FD08D86 |. 40 INC EAX ; immunities+1
6FD08D87 |. 5E POP ESI
6FD08D88 |. 83C4 0C ADD ESP,0C
6FD08D8B |. C2 0400 RETN 4 ; Exit
如果没有检测到Spectral Hit,则跳到Stone Skin Res Function
如有Spectral Hit,若resist < 75,则resist+20
检测顺序coldresist, fireresist, lightresist
coldresist, fireresist步骤若免疫数 ≥ 2,则跳到Exit Function
若免疫数〈 2,依序执行下一地址的指令,在执行到最后的lightresist后,若lightresist < 100,则直接跳到Exit Function,若lightresist >= 100,则在依序执行完免疫数量+1后退出程序
*Spectral Hit增加冰冷、火焰、闪电各20%抗性,但前提是怪物当前抗性 < 75。这也是为什么大部分情况下Spectral Hit不能增加抗性的原因。
*1Bh = 27d, 4Bh = 75d, 14h = 20d, 2Bh = 43d, 64h = 100d, 27h = 39d, 29h = 41d
######################################################
Stone Skin Res Function
CF D2Game.6FD08D8E
Copy code6FD08D8E |> 83F9 1C CMP ECX,1C ; uniquemod 28 (Stone Skin)
6FD08D91 |. 75 0E JNZ SHORT D2GAME.6FD08DA1 ; not Stone Skin , jump the Exit Function
6FD08D93 |. 6A 00 PUSH 0
6FD08D95 |. 83C2 32 ADD EDX,32 ; damageresist ← damageresist+50
6FD08D98 |. 52 PUSH EDX
6FD08D99 |. 6A 24 PUSH 24 ; StatID 36 (damageresist)
6FD08D9B |. 56 PUSH ESI
6FD08D9C |. E8 9D16F2FF CALL ; damageresist = damageresist+50
如果没有检测到Stone Skin,则跳到Exit Function
如有Stone Skin,则物理抗性增加50%
依序执行下一地址D2Game.6FD08DA1的指令
*1Ch = 28d, 32h = 50d, 24h = 36d
######################################################
Exit Function
CF D2Game.6FD08DA1
Copy code6FD08DA1 |> 5F POP EDI
6FD08DA2 |. 5D POP EBP
6FD08DA3 |. 5B POP EBX
6FD08DA4 |> 5E POP ESI
6FD08DA5 |. 83C4 0C ADD ESP,0C
6FD08DA8 \\. C2 0400 RETN 4
退出程序段
*这里的POP/ADD和程序最初的PUSH/SUB相对应
由以上的解析我们可以看到,对金怪的Mod奖励检测是周而复始的,也就是说每检测到一个Mod奖励,执行后退出程序 → 然后检测到下一个Mod奖励,再执行再退出程序 → 再检测到下一个Mod奖励,再执行再退出程序…………
皮肤硬化(Stone Skin)增加怪物1倍的防御值,即防御值 = 原基础防御值×2
魔法抵抗(Magic Resistant)当前相关抗性小于100%,则依次增加怪物 40% 冰抗、火抗、电抗
火焰强化(Fire Enchanted)增加怪物 75% 火抗
冰冷强化(Cold Enchanted)增加怪物 75% 冰抗
闪电强化(Lightning Enchanted)增加怪物 75% 电抗
毒素一击(PoisonHit) 增加怪物 75% 毒抗,这个Mod名称不显示在怪物名字下方
燃烧法力(Mana Burn)增加怪物 20% 魔抗
幽灵一击(Special Hit)当前相关抗性小于75%,则依次增加怪物 20% 冰抗、火抗、电抗
皮肤硬化(Stone Skin)增加怪物 50% 物抗
以上只要即时检测到免疫数≥2即退出程序
≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈清新脱俗的分割线≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
我们来举些例子
①Hell难度的Pindleskin 基础抗性 火抗 0% , 电抗 33% ,冰抗 50% ,毒抗 100%,物抗 50%,魔抗 50%
固定奖励技能是Fire Enchanted
随机奖励依次为Spectral Hit、Cold Enchanted
Fire Enchanted作用:冰抗 50% ,火抗 0%+75% = 75% ,电抗 33% ,毒抗 100%,物抗 50%,魔抗 50%
Spectral Hit作用:冰抗 50%+20% = 70% ,火抗 ≥ 75% 不加,电抗 33%+20% = 53%,毒抗 100%,物抗 50%,魔抗 50%
Cold Enchanted作用:冰抗 70%+75% = 145% ,火抗 75% ,电抗 53%,毒抗 100%,物抗 50%,魔抗 50%
最终抗性为 冰抗 145% ,火抗 75% ,电抗 53%,毒抗 100%,物抗 50%,魔抗 50%,冰毒两系免疫
②还是Hell难度的Pindleskin基础抗性 火抗 0% , 电抗 33% ,冰抗 50% ,毒抗 100%,物抗 50%,魔抗 50%
固定奖励技能是Fire Enchanted
随机奖励依次为Cold Enchanted、Spectral Hit
Fire Enchanted作用:冰抗 50% ,火抗 0%+75% = 75% ,电抗 33% ,毒抗 100%,物抗 50%,魔抗 50%
Cold Enchanted作用:冰抗 50%+75% = 125% ,火抗 75% ,电抗 33%,毒抗 100%,物抗 50%,魔抗 50%
检测到免疫 ≥ 2
不进行Spectral Hit的抗性奖励
最终抗性为 冰抗 125% ,火抗 75% ,电抗 33%,毒抗 100%,物抗 50%,魔抗 50%,冰毒两系免疫
③假设Hell难度的某随机金怪
基础抗性 火抗 60% ,电抗 60% ,冰抗 60% ,毒抗 50%,物抗 50%,魔抗 50%
奖励依次为Cold Enchanted、Magic Resistant、Special Hit
Cold Enchanted作用:冰抗 60%+75% = 135% ,火抗 60% ,电抗 60%,毒抗 50%,物抗 50%,魔抗 50%
Magic Resistant作用: 冰抗 ≥ 100% 不加,火抗 60%+40% = 100%
检测到免疫 ≥ 2
不进行Magic Resistant对电抗的奖励
不进行Spectral Hit的抗性奖励
最终抗性为 冰抗 135% ,火抗 100% ,电抗 60%,毒抗 50%,物抗 50%,魔抗 50%,冰火两系免疫
≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈清新脱俗的分割线≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
附1: StatID List
CF ItemStatCost
Copy codeStat ID
armorclass 31
damageresist 36
magicresist 37
fireresist 39
lightresist 41
coldresist 43
poisonresist 45
附2: UniquemodID List
CF MonUMod
Copy codeuniquemod id
resist 8
fire 9
lightning 17
cold 18
poisonhit 23
manahit 25
spectralhit 27
stoneskin 28
附3: D2Common.#10590 Function
CF D2Common.6FD5CDA0
Copy code6FD5CDA0 >/$ 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C]
6FD5CDA4 |. 53 PUSH EBX
6FD5CDA5 |. 8B5C24 0C MOV EBX,DWORD PTR SS:[ESP+C]
6FD5CDA9 |. 56 PUSH ESI
6FD5CDAA |. 8B7424 0C MOV ESI,DWORD PTR SS:[ESP+C]
6FD5CDAE |. 8B4E 5C MOV ECX,DWORD PTR DS:[ESI+5C]
6FD5CDB1 |. 57 PUSH EDI
6FD5CDB2 |. 8B7C24 1C MOV EDI,DWORD PTR SS:[ESP+1C]
6FD5CDB6 |. 57 PUSH EDI
6FD5CDB7 |. 50 PUSH EAX
6FD5CDB8 |. 53 PUSH EBX
6FD5CDB9 |. 51 PUSH ECX
6FD5CDBA |. E8 21FBFFFF CALL D2COMMON.#10564
6FD5CDBF |. 85C0 TEST EAX,EAX
6FD5CDC1 |. 74 17 JE SHORT D2COMMON.6FD5CDDA
6FD5CDC3 |. 833E 00 CMP DWORD PTR DS:[ESI],0
6FD5CDC6 |. 75 12 JNZ SHORT D2COMMON.6FD5CDDA
6FD5CDC8 |. 8BC3 MOV EAX,EBX
6FD5CDCA |. 8B5E 5C MOV EBX,DWORD PTR DS:[ESI+5C]
6FD5CDCD |. 0FB7D7 MOVZX EDX,DI
6FD5CDD0 |. C1E0 10 SHL EAX,10
6FD5CDD3 |. 03C2 ADD EAX,EDX
6FD5CDD5 |. E8 A6DEFFFF CALL D2COMMON.6FD5AC80
6FD5CDDA |> 5F POP EDI
6FD5CDDB |. 5E POP ESI
6FD5CDDC |. 5B POP EBX
6FD5CDDD \\. C2 1000 RETN 10
附4: D2Common.#10061 Function
CF D2Common.6FD5B2A0
Copy code6FD5B2A0 >/$ 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
6FD5B2A4 |. 85C0 TEST EAX,EAX
6FD5B2A6 |. 75 03 JNZ SHORT D2COMMON.6FD5B2AB
6FD5B2A8 |. C2 0C00 RETN 0C
6FD5B2AB |> 53 PUSH EBX
6FD5B2AC |. 8B58 5C MOV EBX,DWORD PTR DS:[EAX+5C]
6FD5B2AF |. 85DB TEST EBX,EBX
6FD5B2B1 |. 75 06 JNZ SHORT D2COMMON.6FD5B2B9
6FD5B2B3 |. 33C0 XOR EAX,EAX
6FD5B2B5 |. 5B POP EBX
6FD5B2B6 |. C2 0C00 RETN 0C
6FD5B2B9 |> 57 PUSH EDI
6FD5B2BA |. 8B7C24 10 MOV EDI,DWORD PTR SS:[ESP+10]
6FD5B2BE |. 85FF TEST EDI,EDI
6FD5B2C0 |. 7C 20 JL SHORT D2COMMON.6FD5B2E2
6FD5B2C2 |. 8B0D 8CEEDE6F MOV ECX,DWORD PTR DS:[sgptDataTables] ; D2COMMON.6FDF0790
6FD5B2C8 |. 3BB9 D40B0000 CMP EDI,DWORD PTR DS:[ECX+BD4]
6FD5B2CE |. 7D 12 JGE SHORT D2COMMON.6FD5B2E2
6FD5B2D0 |. 8B91 CC0B0000 MOV EDX,DWORD PTR DS:[ECX+BCC]
6FD5B2D6 |. 8BC7 MOV EAX,EDI
6FD5B2D8 |. 69C0 44010000 IMUL EAX,EAX,144
6FD5B2DE |. 03C2 ADD EAX,EDX
6FD5B2E0 |. 75 07 JNZ SHORT D2COMMON.6FD5B2E9
6FD5B2E2 |> 5F POP EDI
6FD5B2E3 |. 33C0 XOR EAX,EAX
6FD5B2E5 |. 5B POP EBX
6FD5B2E6 |. C2 0C00 RETN 0C
6FD5B2E9 |> 50 PUSH EAX
6FD5B2EA |. 0FB74424 18 MOVZX EAX,WORD PTR SS:[ESP+18]
6FD5B2EF |. C1E7 10 SHL EDI,10
6FD5B2F2 |. 03F8 ADD EDI,EAX
6FD5B2F4 |. E8 97FDFFFF CALL D2COMMON.6FD5B090
6FD5B2F9 |. 5F POP EDI
6FD5B2FA |. 5B POP EBX
6FD5B2FB \\. C2 0C00 RETN 0C