Post 13 lip 2015, o 14:49

[1.13c] Jak użyć pSpell 10 i pSpell 11

Wykorzystanie pSpell 10 oraz pSpell 11!

Domyślnie w grze pSpell 10 oraz 11 mają ustawione użycie skila Fire Ball. Możemy to wykorzystać i zrobić zwój lub miksturę która po użyciu wystrzeli ognistą kulę. Dlaczego by nie wykorzystać tego i zrobić sobie dzięki temu przedmioty dające użyć wybranego przez nas skila. Żeby nie podmieniać wpisów w pliku Skills.txt i wykorzystać pSpell 10 oraz dodatkowo też 11 trzeba wprowadzić sobie zmiany w kodzie.

W kodzie szukamy ID skila czyli 47, po zamianie na kod binarny jest to 2F. Ponieważ w kodzie nie ma miejsca na to żeby wpisać tam większą liczbę (np biorąc sobie skila z samego dołu pliku Skills.txt) musimy zrobić jump gdzieś na dół pliku dll i wpisać tam brakujący kod, inaczej będziemy ograniczeni jedynie do skili z przedziału od 0 do 79. Reszta nie będzie działać lub będzie powodować błędy gry.


Zmiany dotyczą pliku D2Game.dll.

Kod pSpell 11:


  Kod:
Address   Hex dump          Command                                  Comments
6FCCDEE0  /.  8B4424 04     MOV EAX,DWORD PTR SS:[ARG.1]
6FCCDEE4  |.  85C0          TEST EAX,EAX
6FCCDEE6  |.  56            PUSH ESI
6FCCDEE7  |.  8BF2          MOV ESI,EDX
6FCCDEE9  |.  75 05         JNZ SHORT 6FCCDEF0
6FCCDEEB  |.  83C8 FF       OR EAX,FFFFFFFF
6FCCDEEE  |.  EB 03         JMP SHORT 6FCCDEF3
6FCCDEF0  |>  8B40 04       MOV EAX,DWORD PTR DS:[EAX+4]
6FCCDEF3  |>  50            PUSH EAX                                 ; /Arg1
6FCCDEF4  |.  E8 45C6F5FF   CALL <JMP.&D2Common.#10695>              ; \D2Common.#10695
6FCCDEF9  |.  85C0          TEST EAX,EAX
6FCCDEFB  |.  75 04         JNZ SHORT 6FCCDF01
6FCCDEFD  |.  5E            POP ESI
6FCCDEFE  |.  C2 1400       RETN 14
6FCCDF01  |>  0FB74424 10   MOVZX EAX,WORD PTR SS:[ARG.3]
6FCCDF06  |.  53            PUSH EBX
6FCCDF07  |.  0FB75C24 18   MOVZX EBX,WORD PTR SS:[ARG.4]
6FCCDF0C  |.  6A 00         PUSH 0                                   ; /Arg4 = 0
6FCCDF0E  |.  50            PUSH EAX                                 ; |Arg3
6FCCDF0F  |.  6A 01         PUSH 1                                   ; |Arg2 = 1
6FCCDF11  |.  6A 2F         PUSH 2F                                  ; |Arg1 = 2F
6FCCDF13  |.  8BC6          MOV EAX,ESI                              ; |
6FCCDF15  |.  E8 16380400   CALL 6FD11730                            ; \D2Game.6FD11730
6FCCDF1A  |.  5B            POP EBX
6FCCDF1B  |.  5E            POP ESI
6FCCDF1C  \.  C2 1400       RETN 14

Kod pSpell 10:

  Kod:
Address   Hex dump          Command                                  Comments
6FCCDF20  /.  8B4424 04     MOV EAX,DWORD PTR SS:[ARG.1]
6FCCDF24  |.  85C0          TEST EAX,EAX
6FCCDF26  |.  56            PUSH ESI
6FCCDF27  |.  57            PUSH EDI
6FCCDF28  |.  8BF2          MOV ESI,EDX
6FCCDF2A  |.  8BF9          MOV EDI,ECX
6FCCDF2C  |.  75 05         JNZ SHORT 6FCCDF33
6FCCDF2E  |.  83C8 FF       OR EAX,FFFFFFFF
6FCCDF31  |.  EB 03         JMP SHORT 6FCCDF36
6FCCDF33  |>  8B40 04       MOV EAX,DWORD PTR DS:[EAX+4]
6FCCDF36  |>  50            PUSH EAX                                 ; /Arg1
6FCCDF37  |.  E8 02C6F5FF   CALL <JMP.&D2Common.#10695>              ; \D2Common.#10695
6FCCDF3C  |.  85C0          TEST EAX,EAX
6FCCDF3E  |.  75 05         JNZ SHORT 6FCCDF45
6FCCDF40  |.  5F            POP EDI
6FCCDF41  |.  5E            POP ESI
6FCCDF42  |.  C2 1400       RETN 14
6FCCDF45  |>  8BC6          MOV EAX,ESI
6FCCDF47  |.  8BCF          MOV ECX,EDI
6FCCDF49  |.  E8 52280300   CALL 6FD007A0
6FCCDF4E  |.  8B46 2C       MOV EAX,DWORD PTR DS:[ESI+2C]
6FCCDF51  |.  50            PUSH EAX                                 ; /Arg1
6FCCDF52  |.  E8 41C6F5FF   CALL <JMP.&D2Common.#10392>              ; \D2Common.#10392
6FCCDF57  |.  3BC6          CMP EAX,ESI
6FCCDF59  |.  74 16         JE SHORT 6FCCDF71
6FCCDF5B  |.  85C0          TEST EAX,EAX
6FCCDF5D  |.  74 12         JZ SHORT 6FCCDF71
6FCCDF5F  |.  6A 00         PUSH 0                                   ; /Arg3 = 0
6FCCDF61  |.  6A 01         PUSH 1                                   ; |Arg2 = 1
6FCCDF63  |.  6A 2F         PUSH 2F                                  ; |Arg1 = 2F
6FCCDF65  |.  8BCE          MOV ECX,ESI                              ; |
6FCCDF67  |.  E8 74380400   CALL 6FD117E0                            ; \D2Game.6FD117E0
6FCCDF6C  |.  5F            POP EDI
6FCCDF6D  |.  5E            POP ESI
6FCCDF6E  |.  C2 1400       RETN 14
6FCCDF71  |>  8B46 2C       MOV EAX,DWORD PTR DS:[ESI+2C]
6FCCDF74  |.  53            PUSH EBX
6FCCDF75  |.  6A 00         PUSH 0                                   ; /Arg4 = 0
6FCCDF77  |.  50            PUSH EAX                                 ; |/Arg1
6FCCDF78  |.  E8 5BCBF5FF   CALL <JMP.&D2Common.#10764>              ; |\D2Common.#10764
6FCCDF7D  |.  8B4E 2C       MOV ECX,DWORD PTR DS:[ESI+2C]            ; |
6FCCDF80  |.  51            PUSH ECX                                 ; |/Arg1
6FCCDF81  |.  8BD8          MOV EBX,EAX                              ; ||
6FCCDF83  |.  E8 3ECBF5FF   CALL <JMP.&D2Common.#10983>              ; |\D2Common.#10983
6FCCDF88  |.  50            PUSH EAX                                 ; |Arg3
6FCCDF89  |.  6A 01         PUSH 1                                   ; |Arg2 = 1
6FCCDF8B  |.  6A 2F         PUSH 2F                                  ; |Arg1 = 2F
6FCCDF8D  |.  8BC6          MOV EAX,ESI                              ; |
6FCCDF8F  |.  E8 9C370400   CALL 6FD11730                            ; \D2Game.6FD11730
6FCCDF94  |.  5B            POP EBX
6FCCDF95  |.  5F            POP EDI
6FCCDF96  |.  5E            POP ESI
6FCCDF97  \.  C2 1400       RETN 14

2F jest widoczne jak na dłoni. W pSpell 10, 2F mamy w dwóch miejscach. Sądzę iż jest to użycie przedmiotu w mieście i poza miastem dając inne efekty. Najlepiej zmienić obydwa argumenty na takie same.


Oto przykład jump'u. Bierzemy kod pSpell 11:


  Kod:
6FCCDF0C  |.  6A 00         PUSH 0                                   ; /Arg4 = 0
6FCCDF0E  |.  50            PUSH EAX                                 ; |Arg3
6FCCDF0F  |.  6A 01         PUSH 1                                   ; |Arg2 = 1
6FCCDF11  |.  6A 2F         PUSH 2F                                  ; |Arg1 = 2F

Wprowadzamy w tym miejscu jump:

  Kod:
Address   Hex dump          Command                                  Comments
6FCCDF0C     /E9 BFA00400   JMP 6FD17FD0
6FCCDF11     |90            NOP
6FCCDF12     |90            NOP

W miejscu do którego prowadzi natomiast, wprowadzamy nasze ID skila oraz dalszą częśc kodu i jump powrót:

  Kod:
Address   Hex dump          Command                                  Comments
6FD17FD0      6A 00         PUSH 0
6FD17FD2      50            PUSH EAX
6FD17FD3      6A 01         PUSH 1
6FD17FD5      68 67010000   PUSH 167
6FD17FDA    ^ E9 345FFBFF   JMP 6FCCDF13

W ten sposób zrobiliśmy więcej miejsca żeby móc wpisać większe wartości ID. W tym przypadku jest to 167 czyli ID skila 359.
Motto:
Spoiler:

Grupa

Alchemic