[Gen III][Game Mechanic + Hacktool]Pokemon data

Status
Không mở trả lời sau này.

PaiN_Agent

Youtube Master Race
Đầu tiên xin lỗi dark_dragons vì đã trễ hẹn, cũng vì thi đại học xong bận đủ thứ, đến giờ vẫn đang đợi điểm nên dành thời gian rỗi post bài. Mọi người thông cảm :)
Mình định nói về RNG nhưng vấn đề này có quá nhiều lĩnh vực liên quan chắc phải dùng clip để mô tả thì mới dễ hiểu, vậy nên sẽ tạm chưa post bài về RNG, xin phép được post bài về pokemon data. Xin phép bắt đầu luôn nhé:

Bài viết thuộc Gen III, có vẻ lỗi thời nhưng cũng mong đóng góp những gì nghiên cứu trong hè :)

POKEMON DATA

Forum đã có bài viết chi tiết về PID (Personality Value) của dark_dragons nên mình không nhắc lại. Nếu ai từng đọc thì chắc hẳn sẽ nắm được phần nào về PID. Để hiểu rõ hơn về PID, chúng ta cùng tìm hiểu cách khám phá "chỉ số" PID của pokemon và cách game tạo/lưu dữ liệu về 1 pokemon.

MEMORY VIEWER - VBA

Trong giả lập VBA, chọn Tools > Memory viewer..., một bảng toàn mã số hiện ra. Trông rắc rối như vậy nhưng lại rất hữu ích đặc biệt với hacker. Toàn bộ thông tin đc lưu ở đây. Nếu bạn vô tình chỉnh sửa 1 kí tự có thể gây ra hậu quả khủng khiếp như đơ game, pokemon biến thành bad egg... Vì thế nên cẩn thận khi dùng memory viewer.
Chúng ta đều biết trong pokemon có 2 nơi để "cất giữ" pokemon: party và PC, (Daycare cũng có thể kể đến nhưng không phổ biến lắm). Bạn có bao giờ tự hỏi tại sao cất pokemon vào PC thì nó lại trở về bình thường như vừa được hồi ở pokemon center? Câu trả lời chính là vì cách game lưu dữ liệu của pokemon trong party và PC khác nhau. Đối với PC, dữ liệu về pokemon không có phần stats và status (Poison, par, sleep...) còn pokemon trong party có đầy đủ cả. Tổng dữ liệu cho 1 pokemon trong party là 100 bytes còn trong PC là 80 bytes. 100 bytes này được lưu trong memory viewer, address khác nhau với mỗi bản: FR/LG; R/S; Emerald. Sau đây là các address tương ứng với party slot (vị trí của PC sẽ cập nhật sau):

[SPOIL]Emerald

Party Slot 1 - 020244EC
Party Slot 2 - 02024550
Party Slot 3 - 020245B4
Party Slot 4 - 02024618
Party Slot 5 - 0202467C
Party Slot 6 - 020246E0

Ruby/Sapphire

Party Slot 1 - 03004360
Party Slot 2 - 030043C4
Party Slot 3 - 03004428
Party Slot 4 - 0300448C
Party Slot 5 - 030044F0
Party Slot 6 - 03004554

Fire Red/Leaf Green

Party Slot 1 - 02024284
Party Slot 2 - 020242E8
Party Slot 3 - 0202434C
Party Slot 4 - 020243B0
Party Slot 5 - 02024414
Party Slot 6 - 02024478
PC SLOT 1 Box ? - 0202A644
[/SPOIL]


---------- Post added at 16:33 ---------- Previous post was at 15:44 ----------

100 BYTES POKEMON DATA​

[SPOIL]
Help10.png

[/SPOIL]
Đây là 1 hình ảnh về dữ liệu lưu trong Memory Viewer. Metagross ở party slot 2 trong pokemon Emerald sẽ có dữ liệu tương ứng lưu ở 0x02024550. Ở chế độ view 32-bit, cứ mỗi cụm XXXXYYZZ là 1 dword = 4 byte, cụm XXXX và YYZZ là 1 word = 2 byte, cụm XX, YY, ZZ là 1 byte. Nếu để chế độ view là 16-bit cụm XXXXYYZZ sẽ chuyển thành YYZZ XXXX và ở 8-bit là ZZ YY XX XX. Thứ tự sắp xếp được đảo lại

[SPOIL]
byte 1: XX
byte 2: YY
byte 3: ZZ
byte 4: TT
8-bit view: XX YY ZZ TT
16-bit view: YYZZ TTZZ
32-bit view: TTZZYYXX
[/SPOIL]

Tất cả dữ liệu lưu dưới hệ Hex (khác với hệ thập phân quen thuộc).
Trong hình trên, phần trong khung màu đỏ chính là PID, nghĩa là PID sẽ nằm ở đầu tiên trong phần lưu thông tin về pokemon. Các thông tin lưu như sau:

[SPOIL]
Help15.png


Đếm từ trái qua phải, từ trên xuống dưới, byte đầu tiên là byte 0:
Byte 0 đến Byte 3: PID (giá trị bằng 1 dword).
Byte 4 đến Byte 5: Trainer ID (giá trị bằng 1 word).
Byte 6 đến Byte 7: Secret ID (giá trị bằng 1 word).
Byte 8 đến Byte 17: Tên pokemon, mỗi kí tự là 1 byte, thứ tự kí tự từ trái qua phải (kí tự 1: Byte 8, kí tự 2: Byte 9,...).
Byte 18 đến Byte 19: Game language (giá trị bằng 1 word): English, Japanese,...
Byte 20 đến Byte 26: Trainer name, tương tự tên pokemon.
Byte 27: thông tin về mark (giá trị bằng 1 byte), các biểu tượng đánh dấu: trái tim, vuông, tròn, tam giác.
Byte 28 đến Byte 29: Checksum, quan trọng vô cùng, nếu sai sẽ biến pokemon thành bad egg.
Byte 30 đến Byte 31: luôn là 00 00
Byte 32 đến Byte 79: dữ liệu về pokemon, phần dữ liệu chính được chia thành 4 phần nhỏ
Phần chỉ có trong Party
Byte 80 đến Byte 83: Status (giá trị bằng 1 dword): thông tin poison, par...
Byte 84: Level
Byte 85: Luôn là FF (trong bulbapedia nói phần này liên quan đến pokerus nhưng theo mình thì không phải???)
Byte 86 đến Byte 87: HP hiện tại
Byte 88 đến Byte 89: Tổng HP
Byte 90 đến Byte 91: Attack stat
Byte 92 đến Byte 93: Defence stat
Byte 94 đến Byte 95: Speed stat
Byte 96 đến Byte 97: Special Attack stat
Byte 98 đến Byte 99: Special Defence stat
[/SPOIL]

Xin mod đừng khóa topic để tối viết nốt
 
48 BYTES MAIN DATA

48 Bytes dữ liệu chính phức tạp hơn một chút. Nó được chia thành 4 nhóm, mỗi nhóm 12 bytes tương đương 3 chuỗi hay 3 dword. Các nhóm có cấu trúc riêng
[SPOIL]Nhóm Growth
Byte 0 đến Byte 1: loài (giá trị bằng 1 word)
Byte 2 đến Byte 3: item mà pokemon đang cầm (giá trị bằng 1 word)
Byte 4 đến Byte 7: exp (giá trị bằng 1 dword)
Byte 8: PP Ups đã dùng
Byte 9: chỉ số happiness/friendship
Byte 10 đến Byte 11: luôn là 0000

Nhóm Attack
Byte 0 đến Byte 1; Byte 2 đến Byte 3; Byte 4 đến Byte 5; Byte 6 đến Byte 7: tương ứng với move 1, move 2, move 3, move 4
Byte 8, Byte 9, Byte 10, Byte 11: PP ứng với move 1, move 2, move 3, move 4; không tính PP Ups đã dùng

Nhóm Effort:
Lần lượt HP EV, Attack EV, Defence EV, Speed EV, SP.Attack EV, SD.Defence EV, Cool, Beauty, Cute, Smart, Tough, Feel: mỗi chỉ số chiêm 1 byte.

Nhóm Misc:
Byte 0: Pokerus (có, còn bao nhiêu ngày hoặc khỏi)
Byte 1: Nơi bắt pokemon/trứng nở
Byte 2 đến Byte 3: cấu trúc phức tạp, chi có giá trị 1 word nhưng mang thông của loại ball dùng để bắt pokemon, giới tính của trainer và game mà pokemon được tạo ra đầu tiên
Byte 4 đến Byte 7: giá trị bằng 1 dword mang thông tin về IVs, trạng thái (trứng hay pokemon), ability của pokemon
Byte 8 đến Byte 11: giá trị bằng 1 dword, mang thông tin về Ribbon và obey, thường chỉ số obey chỉ dùng với mew và deoxys, các pokemon khác obey gần như không phải set.
[/SPOIL]
Các chuỗi trong từng cấu trúc chỉ thay đổi giá trị, không thay đổi vị trí. Cấu trúc được sắp xếp dựa vào PID.

[SPOIL]Với n = PID-dạng thập phân Mod 24

Ứng với giá trị mỗi giá trị n có 1 cách sắp xếp riêng các nhóm:
[table="width: 500, align: center"]
[tr]
[td]0[/td]
[td]1[/td]
[td]2[/td]
[td]3[/td]
[td]4[/td]
[td]5[/td]
[td]6[/td]
[td]7[/td]
[td]8[/td]
[td]9[/td]
[td]10[/td]
[td]11[/td]
[td]12[/td]
[td]13[/td]
[td]14[/td]
[td]15[/td]
[td]16[/td]
[td]17[/td]
[td]18[/td]
[td]19[/td]
[td]20[/td]
[td]21[/td]
[td]22[/td]
[td]23[/td]
[/tr]
[tr]
[td]GAEM[/td]
[td]GAME[/td]
[td]GEAM[/td]
[td]GEMA[/td]
[td]GMAE[/td]
[td]GMEA[/td]
[td]AGEM[/td]
[td]AGME[/td]
[td]AEGM[/td]
[td]AEMG[/td]
[td]AMGE[/td]
[td]AMEG[/td]
[td]EGAM[/td]
[td]EGMA[/td]
[td]EAGM[/td]
[td]EAMG[/td]
[td]EMGA[/td]
[td]EMAG[/td]
[td]MGAE[/td]
[td]MGEA[/td]
[td]MAGE[/td]
[td]MAEG[/td]
[td]MEGA[/td]
[td]MEAG[/td]
[/tr]
[/table]
[/SPOIL]

Sau khi các chỉ số được tính xong, chúng được mã hóa bằng thuật toán XOR và lưu vào bộ nhớ.

[SPOIL]PID = 1 dword dạng Hex
TrainerID dạng Dec, SecretID dạng Dec:
MergeID = Hex(TrainerID + SecretID*2^16)
MergeID chính là chuỗi thứ 2 sau PID trong dữ liệu về pokemon:
Ta có: XKey = PID XOR MergeID

XKey hay XorKey chính là chìa khóa để mã hóa và giải mã thông tin
[/SPOIL]

CheckSum nằm ở 32 byte đầu nhưng liên quan mật thiết đến 48 byte dữ liệu
[SPOIL]CheckSum = 1 word
Sau khi thông tin trong 48 byte dữ liệu được tính và chưa mã hóa, đỗi các chuỗi 1 dword thành dạng word như sau:

Chuỗi XXYYZZWW:
16-bit view: ZZWW XXYY

Sau đó các thông tin chưa mã hóa được cộng lại, cứ 1 word là 1 số hạng, như vậy sẽ có tất cả 24 số hạng. Kết quả thu được chỉ lấy 4 chữ số từ hàng thấp nhất chuyển thành check sum. Trong thuật toán checksum được tính bằng tổng các word mod 10000-Hex hay 65536-Dec
Việc tính sai checksum sẽ biến pokemon thành bad egg!
[/SPOIL]
Khi chuyển pokemon vào PC, phần thông tin 20 byte cuối được bỏ đi. Do đó, toàn bộ thông tin khi lấy pokemon ra được tính lại từ 48 byte dữ liệu trên.

Hãy cùng xem xét một ví dụ cụ thể như sau:
[SPOIL]
Help10.png


Đây là 1 con Metagross, nếu có phần mềm kiểm tra, chắc chắn sẽ cho là pokemon hợp lệ (legal) nhưng thực ra đây là sản phẩm coding bằng tay

Mình sẽ viết lại 80 byte dữ liệu chính của pokemon theo cách mà mình thường làm (20 byte cuối do game tính nên hoàn toàn không cần quan tâm):

/XKEY = EF9CEF9E
/DATA MOD = 14 EAGM
/FIRST CODE
E3CB58AE
0C57B730
BBCEBFC7
CDC9CCC1
0202FFCD
C8C3C2CD
00BBC2C3
0000FDFF
/DATA CODE
EFA4EF0E
EF9CD760
EF9CEF9E
EF95EFC0
EFC5EEAB
E596E094
EF9CEE0E
EF9E8ABE
EF9CAE9E
4E1CCF9E
D0631061
EF9CEF9E
/LAST CODE
...


Tất cả đều ở hệ Hex
- Dòng đầu tiên là PID, ta có PID = E3CB58AE hay 3821754542 ở Dec
- Dòng thứ 2 là tổ hợp của Trainer ID và Secret ID, theo đúng thứ tự đảo byte có kêt quả:
30 B7 57 0C
Vì Trainer ID và Secret ID đều có giá trị 2 byte = 1 word nên Trainer ID = B730 hay 46896 ở Dec và Secret ID = 0C57 hay 3159 ở Dec
- DataMod = n = Dec(PID) mod 24 = 3821754542 mod 24 = 14
so sánh với bảng giá trị ta có thứ tự sắp xếp là "EAGM"
- Kiểm tra pokemon là shiny hay không: đổi PID sang 16-bit view, PID chia thành 2 phần: P1 = 58AE, P2 = E3CB
Lấy P1 XOR P2 XOR TrainerID XOR SecretID = 58AE XOR E3CB XOR B730 XOR 0C57 = 1
Vì 1 < 8 nên pokemon shiny!
- MergeID chính là chuỗi thứ hai: MergeID = 0C57B730
Có: XKey = MergeID XOR PID = E3CB58AE XOR 0C57B730 = EF9CEF9E
- Tên pokemon: 10 byte theo thứ tự đảo byte sẽ cho kết quả:
C7 BF CE BB C1 CC C9 CD CD FF
M E T A G R O S S <END>

FF mang ý nghĩa kết thúc, nếu trong tên có FF thì phần sau FF dù được set byte nhưng sẽ không được tính vào tên. Tên pokemon là "METAGROSS"
- Game language: 0202 tương đương với bản tiếng anh
- Trainer name tương tự tên pokemon:
CD C2 C3 C8 C3 C2 BB
S H I N I H A
Không có kí tự FF nhưng cả 7 byte đã được set nên tên kết thúc. Vậy tên trainer là "SHINIHA"
-Mark: Byte 27 được tính bằng công thức:
mỗi mark check được tính = 1, không check tính = 0 sau đó cộng lại theo công thức:
tổng mark = tròn + vuông * 2 + tam giác * 4 + trái tim * 8
sau đó quy ra Hex. Ở đây Byte 27 bằng 0, nên không có mark nào được check
- Tiếp theo luôn là 0000
- Checksum = FDFF sẽ được kiểm tra sau
- Giải mã toàn bộ phần DATA CODE, kết hợp thứ tự nhóm:
Nhóm Effort
00380090
000038FE
00000000
Nhóm Attack
0009005E
00590135
0A0A0F0A
Nhóm Growth
00000190
00026520
00004100
Nhóm Misc
A1802000
3FFFFFFF
00000000

Nhóm Effort: đối chiếu các chỉ số theo thứ tự đảo byte:
HP: 90-Hex = 144-Dec
Attack: 00-Hex = 0-Dec
Defence: 38-Hex = 56-Dec
Speed: 00-Hex = 0-Dec
Sp.Attack: FE-Hex = 254-Dec
Sp.Defence: 38-Hex = 56-Dec
Các stat khác đều bằng 00-Hex = 0-Dec

Nhóm Attack:
Move 1: 005E-Hex = 94-Dec: Psychic
Move 2: 0009-Hex = 9-Dec: Thunder Punch
Move 3: 0135-Hex = 309-Dec: Meteor Mash
Move 4: 0059-Hex = 89-Dec: Earthquake
PP move 1: 0A-Hex = 10-Dec
PP move 2: 0F-Hex = 15-Dec
PP move 3: 0A-Hex = 10-Dec
PP move 4: 0A-Hex = 10-Dec

Nhóm Growth:
Loài: 0190-Hex = 400-Dec: Metagross (chỉ số index pokemon không hoàn toàn giống với national number)
Item held: 0000-Hex = 0-Dec: Không có gì
Exp: 26520-Hex = 156960-Dec
PP Ups: 00-Hex = 0-Dec: chưa có PP Ups đã dùng
Happiness: 41-Hex = 65-Dec
Còn lại luôn là: 0000

Nhóm Misc:
PokeRus: 00-Hex = 0-Dec: Chưa từng có pokerus (01, 02 ,03... 0F: số ngày còn lại; 10: cured, ngoài ra còn được lập lại với 11 -> 1F và 20)
Địa điểm: 20-Hex = 32-Dec
Phần tiếp theo gồm 3 thông tin, trước tiên đổi tất sang hệ Bin (nhị phân):
A1 80
10100001 10000000
1 | 0100 | 0011 | 0000000
7 bit cuối đưa ra level khi bắt. Ở đây level = 0 nên là egg hatched
4 bit tiếp theo đưa ra game mà pokemon được tạo ra. 0011-Bin = 3-Dec nên game là Emerald
4 bit tiếp theo là loại ball dùng để bắt. 0100-Bin = 4-Dec nên ball đã dùng là pokeball
bit cuối là giới tính của Original trainer: 1: male, 2: female
Với IVs, Ability và Egg?: giá trị là 3FFFFFFF đổi sang hệ Bin:
00111111111111111111111111111111
0 | 0 | 11111 | 11111 | 11111 | 11111 | 11111 | 11111
từ phải qua trái:
HP IV = 11111-Bin = 31-Dec
Attack IV = 11111-Bin = 31-Dec
Defence IV = 11111-Bin = 31-Dec
Speed IV = 11111-Bin = 31-Dec
Sp.Attack = 11111-Bin = 31-Dec
Sp.Defence = 11111-Bin = 31-Dec
Egg? = 0: không phải egg
Ability = 0: ability là ability 0 hay first ability (thường chỉ những pokemon có 2 ability mới set bit này dựa trên PID, các pokemon khác không hề dựa vào PID mà được set ability mặc định là 0 để tránh bị "No special ability"
Ribbon = 0: không có ribbon, metagross không cần set chỉ số obey

- Tiếp theo cùng tính checksum. Đầu tiên phải chia các dword thành các word nhỏ
0038 | 0090
0000 | 38FE
0000 | 0000
0009 | 005E
0059 | 0135
0A0A | 0F0A
0000 | 0190
0002 | 6520
0000 | 4100
A180 | 2000
3FFF | FFFF
0000 | 0000

ta có:
CheckSum = (0038 + 0090 + 0000 + 38FE + 0000 + 0000 + 0009 + 005E + 0059 + 0135 + 0A0A + 0F0A + 0000 + 0190 + 0002 + 6520 + 0000 + 4100 + A180 + 2000 + 3FFF + FFFF + 0000 + 0000) Mod 10000 = 2FDFF Mod 10000 = FDFF
checksum này khớp với checksum ở phần đầu nên code chính xác
Lưu ý rằng phép tính trên được tính hoàn toàn ở hệ Hex!
[/SPOIL]


---------- Post added at 00:38 ---------- Previous post was at 00:03 ----------

Pokemon Maker - Code Generator

Xin được giới thiệu tới mọi người chương trình viết code cho pokemon dựa trên 100 byte pokemon data của mình. Ngày xưa viết tay nhiều nên giờ làm hẳn 1 chương trình tự động hết cho nhanh đỡ phải tra bảng. Nếu bạn đã đọc và hiểu được phần đầu thì bạn sẽ sử dụng chương trình này dễ dàng!

[SPOIL]
Help16.png
[/SPOIL]

Vùng 1: Các thông tin về pokemon ở các nhóm Growth, Attack, Effort, Misc
Vùng 2: Phần tên
Vùng 3: Phần Info có PID, Trainer ID, Secret ID...
Vùng 4: Mark cho pokemon
Vùng 5: Ability. Sau khi kiểm tra kĩ thấy có nhiều vấn đề về ability. Nếu để auto thì ability dựa vào PID nên pokemon có 1 ability có thể bị mất ability (có lợi cho slaking, I know >:))
Force Ability 0/1 thì code chọn ability cho pokemon
Vùng 6: Vùng code chính, điền vào đúng address của party slot trong memory viewer để có pokemon bạn cần
Vùng 7: Phần để debug. Nếu sau khi điền code cẩn thận nhiều lần mà vẫn bị bad egg thì chụp chương trình có cả phần này để mình tìm bug. Vì là bản alpha nên chưa biết sẽ có những lỗi gì nữa...
Vùng 8: Menu

Trong menu có tích hợp các bảng thông tin để tra cứu offline luôn cho tiện, cũng có cả phần tính hidden power, tính stats và tính IVs dựa trên memory viewer.

Trình độ tiếng anh cũng vừa thôi nhưng dù sao cũng thích viết bằng tiếng anh vì dịch ra thấy gượng lắm. Các bạn dùng có gì không hiểu hỏi mình. Mà chắc cũng ít người còn chơi gen III lắm nên có lẽ sẽ không được để ý mấy. Dù sao cũng mong được ủng hộ ^^!

Bài viết có tham khảo từ nhiều nguồn:
- Bulbapedia
- Smogons
- Serebii
- Psypokes
- ppnstudio
- ...

Link liên quan:
http://bulbapedia.bulbagarden.net/wiki/Pokémon_data_substructures_in_the_GBA
http://bulbapedia.bulbagarden.net/wiki/Pokémon_data_structure_in_Generation_III
http://www.ppnstudio.com/maker/PokemonMakerHelp.txt

Link down Pokemon Code Gen: here
 
Last edited by a moderator:
Status
Không mở trả lời sau này.
Back
Top