Trace Once chỉ ghi lại các code chính, còn subroutine thì nó bỏ qua nên file log rất nhẹ. Muốn xác định hình ảnh thì phải: 1/ Xác định hình ảnh đối tượng là BG nào (nhấn các phím số để bật/tắt) hay Obj. Nếu là obj (sprite) sẽ phức tạp hơn. 2/ Sau khi xác định BG, click vào What's used trong debugger để biết thông tin trong Vram của nó. 3/ Nhảy tới địa chỉ được cung cấp trong What's used để thử xác định hình ảnh trong Vram. Vào Show Hex --> Vram để xác định. 4/ Đặt write breakpoint với địa chỉ Vram đã xác định, từ đó truy ngược lại. 5/ Cần một số kiến thức về phần cứng để xác định: a. Cổng $2116: tọa độ để ghi hình ảnh. Bạn dò theo $2116 sẽ tìm được tọa độ của các thành phần đồ họa trên màn hình b. Cổng $2118: để ghi đồ họa. c. Các cổng DMA, HDMA: ghi đồ họa.
Bài này mình diễn giải đầy đủ hơn ý ở bài trước. Hẳn là bạn biết, mọi thành phần hiển thị trên màn hình Snes đều là đồ họa, kể cả font chữ. Chẳng hạn, ở màn hình này, sau khi dịch sang tiếng Việt thì câu chữ dài quá, lém vào khung thoại trông rất xấu. Giờ mình muốn chỉnh lại tọa độ của câu chữ. Lúc này cần phải can thiệp vào Asm. Trước khi đi sâu vào ví dụ này, mình đề cập một chút lý thuyết ở đây. $2116: là register ghi tọa độ của mọi thành phần đồ họa vào Vram. $2118: là regrêtr ghi thành phần đồ họa vào Vram. Vd: nếu bạn chọn tilemap bắt đầu từ $00 trong Vram REP #$20 ; chuyển A về 16 bit LDA #$0001 STA $2116 LDA #$201A STA $2118 Đoạn code trên sẽ vẽ tile #1A vào toạ độ 0001 x 2 = 0002 trong Vram. Đó là tile (ô) thứ 2 tính từ góc trên, bên trái của màn hình. Trở lại ví dụ trên. Trước khi chuyển sang màn hình này thì ta ghi log. Tìm trong log "$2116" và ta sẽ được nhiều kết quả. Ta được kết quả LDA $0101,x STA $2116 Nghĩa là register A sẽ đọc các giá trị từ địa chỉ $7E0101 + X và lần lượt ghi các giá trị này vào $2116. Đây chính là các giá trị tọa độ của các thành phần sẽ hiển thị trên màn hình. Như vậy thì giá trị tọa độ này từ đâu mà xuất hiện trong $7E0101? Ta tìm tiếp với từ khóa "STA $0101" và được LDA ($13), y CLC ADC $00 STA $0101,x Có nghĩa là CPU sẽ đọc 2 byte từ địa chỉ $13 + y, sau đó cộng thêm giá trị tại địa chỉ $00 rồi cuối cùng ghi kết quả vào $7E0101. Giờ nhấn vào nút What's used để xem thông tin về BG ta đang xác định. Phần text nằm ở BG 3 (trên debug console để là BG2) Thông tin cho biết tilemap của BG3 bắt đầu tại $7C00 x 2= $F800 Vào Show hex --> Vram, cuộn xuống địa chỉ $F800, thử thay đổi một vài giá trị tile. Rõ ràng, ta thấy chuỗi câu "mọi người chiến thôi!" bắt đầu tại $FC92 trong Vram. Chia đôi số này, được $FC92/2 = $7E49. Chắc chắn ở đâu đó trong file log, sẽ có đoạn mã tải vào A giá trị 7E49 rồi ghi vào $7E0101, sau đó ghi vào $2116. Do vậy, dò file log với đoạn code "A:7E49" và ta được kết quả Như vậy, sau khi đọc tại địa chỉ 04:E465, A được cộng thêm giá trị tại $00 để có giá trị 7E49. 04:E465 là địa chỉ Snes. Trên PC thì đó là $026465. Tìm tới địa chỉ này, thay đổi giá trị tại đó thành số nhỏ hơn và kết quả.
@asm65816 : bác cho hỏi như trong hình này, làm cách nào để xác định được sprite hiện tại đang ở vùng Vram 800? P/S : clip trên có phải là bị nhầm tên một số cầu thủ như Matsuyama, Wakashimazu, Hernandes hay không ?
Một số tên cầu thủ dài quá, vượt quá giới hạn của khung nên mình đổi thành tên khác cho gọn. Trong hình trên không có sprite, chỉ là BG thôi. Điều bạn hỏi chính là tilemap. Nhấn vào What's used sẽ có thông tin. Địa chỉ Vram là địa chỉ word nên phải nhân đôi nó lên. P/s: các thành phần trong Vram nằm ở địa chỉ nào đều được đăng ký qua các register $2107 ~ $210A.
Thanks Asm va Ozone @asm65816 Bình luận viên liên tục phải kêu lên Aii daaa voi cac pha xử lý cua cac ieu sao, ban dich rat dep va cong phu bạn a.Kieu nay mà add ảngy code nửa thì chỉ co cach lừa qua thủ môn luôn @ozone and @asm65816 Mình đang có thắc mắc về pointer all skill, ở đây lấy ví dụ Subasa ( bản 4 ) ; nhan vat Subasa 1.Ram value : 01; sau đó *2+9000 = 9002. 2.Trong hex editor , go to 9002 sẽ có pointer DE 90; 3.Goto 90DE sẽ tới bảng sau tương ứng Shoot/Pass/Drible/Combi/Block /Tackle/Pass 0095 - 1796-1b96-2B96-0000-0000-0000 4.Tiếp tục goto 95 00; duoc hinh sau Mình có thể hiểu như bên dưới được hay không Ứng với các Skill Shoot trong PAr code cua Tsubasa 00 : bóng thường; 02 : bóng cao - mac định đội đầu nếu cầu thủ ko co chiêu special; 01 bóng thấp, mặc định volley nêu ko có special 1.Drive shoot : 00 - 04 2.Overhead kick : 02 - 03 3.Drive over head : 02 - 05 4.Twin shoot : 01- 0A, voi ram Misaki là 04 5.Cyclone : 13 ( 00 - 01 - 02 ) 6.NeoCyclone : 16 ( 00 - 01 - 02 ) 7.Drive Tiger : 12; voi Hyuga là 03. ( 00 - 12 - 03 ) Chỗ vòng tròn đỏ, có phải la kết thúc chuỗi shoot cua Tsubasa hay không. ? Thêm Drive Tiger , không cần điều kiện 02 lần shoot fail ở đâu; Nếu thay vào vùng dữ liệu mới do mình mở rộng bằng Lunar thì pointer phải đặt ra sao. ( smc gốc kết thúc ở 0017fff0)
- Game này qui định dãy giá trị các cú sút theo nhóm : 2, 3 hoặc 4. Giá trị đầu tiên của mỗi nhóm sẽ qui định vị trí bóng khi sút (dưới đất, banh thấp, banh cao) và giá trị kết thúc chuỗi sút (03), giá trị thứ 2 qui định cú sút (ram value), giá trị 3 là của cầu thủ phối hợp để sút (nếu có), giá trị 4 là của cầu thủ thứ 3 phối hợp sút (nếu có - cái này mình dự đoán chứ không tìm thử - một số cú sút có 3 người phối hợp). Nếu bạn thử ghi log lúc Tsubasa bắt đầu chọn sút cho tới khi menu sút hiện ra thì sẽ hiểu rõ hơn cách game xử lý (search các địa chỉ liên quan ( ":90DE".....) ). Ví dụ 00-04 : game check giá trị đầu của nhóm và so sánh với 03, nếu không phải 03 thì sẽ nạp tiếp giá trị tiếp theo, kết thúc nhóm đó sẽ xử lý tiếp nhóm kế tiếp, cho tới khi check giá trị đầu của nhóm = 03 thì sẽ cho biết kết thúc dãy sút của cầu thủ đó. (0-12-13) là 1 nhóm, sau đó tiếp theo là 03 đầu nhóm tiếp, vì = 03 nên kết thúc chuỗi tại đó. - Bạn tham khảo lại 2 bài post của mình về thêm Drive Tiger, Fire Drive vào menu sút ở trên của Tsubasa 3, cách tìm trên đó khá thủ công nhưng có thể áp dụng được, tsubasa 4 cũng không khác nhiều so với tsubasa 3. - 17 FFF0 : 17 còn gọi là phần data bank, khi mở rộng rom thì phía sau sẽ gán thành vùng trống ( toàn 00 hoặc FF). Muốn nhảy tới xử lý ở các data bank khác với data bank hiện tại thì phải dùng lệnh JML hoặc JSL. Bạn xem lại các bài của bác asm65816 hướng dẫn cho mình ở trang 1, 2. Các Pointer trỏ đến các vùng dữ liệu trong cùng 1 bank (data bank).
@asm65816 : mình có thử làm như bác hướng dẫn ở hình "Meeting" đầu trận áp dụng cho Fire Shoot thì được kết quả như sau : Tại vùng Vram FD56 là nơi chứ giá trị của chữ đầu tiên trong câu text : giá trị là 5C. Lấy FD56 / 2 = 7E3B. Thực hiện ghi log từ lúc chọn sút Fire Shoot cho tới lúc kết thúc cảnh avatar Schnider ở trên. Nhưng tìm trong log lại không thể tìm được chuỗi "A:7EAB" hoặc "7EAB". Không biết đã làm sai ở đâu, bác hướng dẫn giúp với?
Phần dùng lệnh này chăc minh ko thể hiểu được, do không co kiến thức cơ bản. Ngoài ra không tìm thấy dự liệu trống dể viết lại giá trị của phần shoot cho Tsubasa trong rom gốc, hix...Cũng ko biết là nếu minh thay dự liệu shoot trong rom, cac skill unlock theo event trong game co bi ảnh hưởng hoặc ko xuất hiện hay không ...( Tạm thời minh chỉ tìm được cách thêm skill drible, tackle, pass ( không unique - tuc la ko phải của cầu thủ ngôi sao) cho nhân vật ko co skill; ví dụ thêm , drible pass special cho Misugi, Mísaki bằng cách thay pointer , coi nhu dat duoc thành quả nho nhỏ
@traitim_virus: không ai là thần thánh để biết được chỗ nào trong Rom có ý nghĩa gì. Tất cả muốn biết thì phải nhờ file log, và để hiểu được file log thì cần nắm được ý nghĩa của các câu lệnh 65816. Bạn có thể tham khảo bài dưới đây để hiểu thêm về cách xử lý cũng như ý nghĩa của lệnh điều khiển Snes. http://wiki.superfamicom.org/snes/show/ASM+Tutorial+Part+1 @ozone: để có cùng một kết quả thì có rất nhiều cách xử lý và tiếp cận khác nhau. Trong trường hợp của Fire shot thì nó không dùng cách như ở đoạn đầu trận như trước. Kiểm tra file log, thấy có đoạn này: $03/B05C BF 00 80 07 LDA $078000,x[$07:8124] $03/B060 85 07 STA $07 [$00:1107] và $03/B08B B7 07 LDA [$07],y[$07:8E3D] Đây chính là đoạn đọc pointer của phần text và chứa vào $1107. 07:8E3D ($38E3D) là vị trí của phần text. <$FA><$FF><$F1><$00><$F3><$03> ファイヤ<$EA><$09>!<$FC><$F8> Trong đó, <$F3><$03> chỉ định vị trí ghi của phần text ファイヤ. Về cơ bản, muốn tìm vị trí của bất cứ thành phần đồ họa nào thì chỉ việc tìm $2116 trong file log. $00/8185 BD 89 00 LDA $0089,x[$00:00A9] $00/8188 8D 16 21 STA $2116 [$00:2116] Ta thấy A đọc giá trị từ 0089 + x, như vậy chỉ việc tìm xem giá trị được ghi vào 0089 xuất phát từ đâu. $03/AF3A A5 C8 LDA $C8 [$00:0DC8] $03/AF3C 9D 89 00 STA $0089,x[$03:00A9] Lại tìm tiếp giá trị ghi vào $C8 từ đâu $03/AF65 A5 C8 LDA $C8 [$00:0DC8] $03/AF67 18 CLC $03/AF68 69 40 01 ADC #$0140 $03/AF6B 85 C8 STA $C8 [$00:0DC8] Thử thay đổi giá trị tại $03/AF68 và ta thấy kết quả Rõ ràng là vị trí của các tile trên mặt Schneider đã không còn đúng. Làm tương tự, cứ truy dần nguồn gốc xuất phát của dữ liệu thì sẽ tìm được dữ liệu đồ họa của font/hình ảnh và vị trí ghi trên màn hình của chúng xuất phát từ đâu trong Rom. Dĩ nhiên là cũng cần phải biết các đặc tính phần cứng của Snes để việc tìm kiếm có hiệu quả. Chẳng hạn $00/A0DA A9 00 00 LDA #$0000 $00/A0DD 9D 89 00 STA $0089,x[$00:00E9] $00/A0E0 A9 00 20 LDA #$2000 $00/A0E3 99 02 43 STA $4302,y[$00:4362] $00/A0E6 E2 20 SEP #$20 $00/A0E8 A9 7E LDA #$7E $00/A0EA 99 04 43 STA $4304,y[$00:4364] $00/A0ED A9 00 LDA #$00 $00/A0EF 99 00 43 STA $4300,y[$00:4360] $00/A0F2 A9 22 LDA #$22 $00/A0F4 99 01 43 STA $4301,y[$00:4361] $00/A0F7 A9 00 LDA #$00 $00/A0F9 99 05 43 STA $4305,y[$00:4365] Đây là một đoạn truyền dữ liệu kiểu DMA. Dựa vào đâu để biết? Dựa vào các regiter $4300~$4305 xuất hiện trong đoạn này. $00/A0F2 A9 22 LDA #$22 $00/A0F4 99 01 43 STA $4301,y Đoạn này nói lên rằng dữ liệu được ghi vào cổng $2122, tức là Color ram. Vậy đoạn code trên đây là để ghi các giá trị màu sắc vào pallette. Như vậy, $0089 còn được dùng để chứa các giá trị màu sắc xuất hiện trong đoạn này. $00/A0DA A9 00 00 LDA #$0000 $00/A0DD 9D 89 00 STA $0089,x[$00:00E9] Sau đó là $00/8196 BD 89 00 LDA $0089,x[$00:00E9] $00/8199 8D 21 21 STA $2121 Cho thấy #$0000 đã được ghi vào Register màu. Thử thay đổi sang một vài giá trị khác và được kết quả. Áp dụng cách tìm kiếm tương tự với $2118 nếu muốn biết tile đồ họa nào đã được ghi vào Vram.
Command "cắt chuyền" không thể hiển thị hết vì cái khung hạn chế. Giờ làm sao để khắc phục? Việc đầu tiên là debug ra log. Tìm STA $2116 và ta được Như vậy, ta thấy trước khi ghi vào $2116 thì A đã đọc giá trị tại $0101,x. Vậy cái gì đã ghi vào $0101,x? Tiếp tục dò tìm và ta được Rõ ràng là trước khi ghi vào $0101,X thì A đã đọc giá trị tại ($13),y và cụ thể ở trường hợp này là 04A00. Thử thay đổi giá trị tại 04A00 (đang là 7E21) thành giá trị khác và ta được Để ý cái khung bên trái đã thay đổi. Do vậy ta biết 04A00 là nơi chứa toạ độ của cái khung này. Do vậy, ta biết LDA ($13),y chính là địa chỉ đọc các giá trị từ Rom để ghi vào $0101,x. Tiếp tục tìm kiếm với từ khóa này. Tại 04:EF2F là giá trị 7E10. Thử thay đổi thành 7E13 và kết quả Vị trí của cái khung ta cần tìm đã thay đổi. Thử quan sát quanh vị trí 02/DCF2 và ta thấy $02/DCDA B1 13 LDA ($13),y[$04:EF31] $02/DCDC 9D 00 01 STA $0100,x[$04:0100] Thử thay đổi giá trị tại 04:EF31 Vậy ta biết là đã tìm được thứ cần tìm. Bên dưới là $02/DD1B B1 13 LDA ($13),y[$04:EF35] Thử thay đổi tại 04:EF35
1.6. Chỉnh sửa linh tinh các chỉ số trong game (phần này còn có thể cập nhật tùy theo khả năng của người post ) Xin được tiếp tục phần vọc Tsubasa 3. Mình sẽ minh họa bằng Rom Việt ngữ của bác asm65816. Một số trường hợp đã có sẵn nguồn từ Internet nên mình chỉ thống kê lại, không trình bày cách tìm. 1.6.1 All Stars List : Dễ thấy danh sách all star đã list sẵn tên cầu thủ, chỉ việc search dãy Hex tương ứng với 1 số cầu thủ trong danh sách trong rom là có được vị trí của all star list. Ví dụ : all stars list bắt đầu từ Tsubasa - Hyuga - Misaki - Misugi ... - ứng với value ram : 01 19 21 1F ... Mở rom bằng hex Editor và Ctrl+F để search chuỗi Hex : 0119211F Ta có tại offset 25200 lưu chuỗi value ram qui định các cầu thủ trong all star list. Kết thúc bằng 3D (TM Dino của Italy). Vậy việc thay thế cầu thủ trong all star list khá đơn giản, chỉ cần thay value ram vào vị trí tương ứng. Ví dụ như trong hình, mình đã thay thế 2 cầu thủ khựa bằng Bossis (N.11 France) và Rolima (N.9 England) Một số điểm cần lưu ý : - Shaka (Mihael - N.11 USA) : là cầu thủ ẩn, chỉ unlock được khi đá xong trận thứ 8 Kick Off. Nếu cố tính add vào list này cũng không chọn được. - Một số cầu thủ khác chỉ có trong dữ liệu của đội CPU, cố tính add vào có thể gây lỗi game. Ví dụ thủ môn Lamkane của Belgium. 1.6.2. Các chỉ số cơ bản - Level : hiện chỉ có thể tác động vào Level thông qua Ram, nếu có tìm hiểu Assembly và code theo hướng dẫn của asm65816 thì có thể qui định cho các vùng nhớ Ram này luôn có giá trị nhất định. Phần chỉnh chỉ số trong Ram có thể xem ở web gamefaqs mình post ở bài đầu, qui định cho từng vị trí trên sân. Công thức tính Level cho 1 vị trí (slot) như sau : Level = 16 x A + (B+1) . Với AB là 1 số Hex mang giá trị từ 00 - FF (0-255). Ví dụ muốn vị trí / slot đó có Level 100 thì 100 = 16 x 6 + (3+1). Vậy con số phải điền vào vùng nhớ Ram đó là 63 (hex). Vì tăng 1 level thì các chỉ số cơ bản của cầu thủ đó sẽ được +1. Nên chỉnh level sẽ tác động vào các chỉ số cơ bản. Giả sử lúc đầu chỉ số cơ bản của Tsubasa như sau (Slot 10 - Sao Paulo - trận 1) Với Tsubasa, chỉ số Through / Bỏ bóng là cao nhất (19). Giá trị max là 255 (1 byte) nên 255 - 19 = 236 = EC (hex). Vậy level tối đa ta có thể áp vào được là EC. Khi lấy con số vượt quá 236 (EC) thì chỉ số cơ bản nào bị + vượt 255 sẽ trả về 0, 1, 2, .... Như trong trường hợp này . Set freeze vùng ram 7E3525 (qui định level của slot số 10) với giá trị EC. Thì ta có chỉ số của Tsubasa như sau : Lưu ý việc chỉnh sửa này chỉ mang giá trị tạm thời vì là chỉnh trên Ram. - Chỉ số cơ bản : minh họa bằng Tsubasa. Không đơn giản như ở Tsubasa 2, tìm được vị trí các chỉ số cơ bản xong chỉ cần thay thế bằng giá trị mong muốn (hex) sẽ dễ dàng có giá trị cao (ví dụ FF - 255). Ghi log cho Tsubasa khi bắt đầu nhấn A vào tên Tsubasa để vào màn hình Level 1 như ở trên. Ở đây mình chỉ xét 6 chỉ số cơ bản khi bóng dưới đất (Rê - Chuyền - Sút - Chuồi - Chặn - Cắt) Các chỉ số cơ bản không được lấy trực tiếp từ trong Rom ra để lưu vào Ram mà là phải trải qua bước /8 (trả về số nguyên 8 bit int8). Tức là các chỉ số cơ bản mà ta thấy hiện lên màn hình phải đem x8 sau đó chuyển thành số Hex sẽ là số qui địnnh trong Rom. Như hình level 1 của Tsubasa có chỉ số : 18 17 15 15 12 15, tạm thời lấy 3 số đó là chỉ số khi có bóng tấn công : 18 17 15, đem x8 thì được 144 136 120 -> Hex : 90 88 78 Thử search chuỗi hex 90 88 78 thì không tìm được trong rom. Vậy tức là game không bắt đầu nạp theo thứ tự 90 88 78. Thử đảo thứ tự thành 78 88 90 thì tìm được chuỗi hex này tại : 220B0 . Dùng Lunar Address đổi offset 220B0 ra địa chỉ LoRom được $04:A0B0. Mở log và search chuỗi : " [$04:A0" ta có đoạn xử lý : Mã: $00/8581 B3 01 LDA ($01,s),y[$04:A0B2] A:A004 X:0006 Y:0002 D:1800 DB:04 S:1C07 P:envMXdIzc HC:0300 VC:018 FC:05 I:00 $00/8583 FA PLX A:A090 X:0006 Y:0002 D:1800 DB:04 S:1C07 P:eNvMXdIzc HC:0360 VC:018 FC:05 I:00 $00/8584 FA PLX A:A090 X:00B0 Y:0002 D:1800 DB:04 S:1C08 P:eNvMXdIzc HC:0396 VC:018 FC:05 I:00 $00/8585 EB XBA A:A090 X:00A0 Y:0002 D:1800 DB:04 S:1C09 P:eNvMXdIzc HC:0432 VC:018 FC:05 I:00 $00/8586 A9 00 LDA #$00 A:90A0 X:00A0 Y:0002 D:1800 DB:04 S:1C09 P:eNvMXdIzc HC:0460 VC:018 FC:05 I:00 $00/8588 C2 20 REP #$20 A:9000 X:00A0 Y:0002 D:1800 DB:04 S:1C09 P:envMXdIZc HC:0484 VC:018 FC:05 I:00 $00/858A 4A LSR A A:9000 X:00A0 Y:0002 D:1800 DB:04 S:1C09 P:envmXdIZc HC:0514 VC:018 FC:05 I:00 $00/858B 4A LSR A A:4800 X:00A0 Y:0002 D:1800 DB:04 S:1C09 P:envmXdIzc HC:0536 VC:018 FC:05 I:00 $00/858C 4A LSR A A:2400 X:00A0 Y:0002 D:1800 DB:04 S:1C09 P:envmXdIzc HC:0598 VC:018 FC:05 I:00 $00/858D A0 04 LDY #$04 A:1200 X:00A0 Y:0002 D:1800 DB:04 S:1C09 P:envmXdIzc HC:0620 VC:018 FC:05 I:00 $00/858F 18 CLC A:1200 X:00A0 Y:0004 D:1800 DB:04 S:1C09 P:envmXdIzc HC:0644 VC:018 FC:05 I:00 $00/8590 77 C0 ADC [$C0],y[$7E:3524] A:1200 X:00A0 Y:0004 D:1800 DB:04 S:1C09 P:envmXdIzc HC:0690 VC:018 FC:05 I:00 Vậy game sẽ nạp từ 4A0B2 trước : value 90 rồi mới tới 4A0B1: 88 , rồi 4A0B0 : 78. Vậy vùng offset 220B0 sẽ bắt đầu qui định các chỉ số cơ bản ban đầu của Tsubasa. Bây giờ tiến hành thay đổi chỉ số cơ bản. Do chỉ số hiện ra trên màn hình game x8 rồi đổi sang số Hex mới ra số qui định trong Rom. Nên ứng với FF (255) ta có 255 / 8 = 31. (Bởi vì 32 x 8 = 256 vượt 255). Kết luận chỉ số cơ bản tối đa mà ta có thể chỉnh được trong Rom là FF, nhưng áp vào game thì là 31. Thử thay 78 88 90 bằng FF FF FF tại 220B0. Reload game và kiểm tra : Tương tự cho các chỉ số còn lại của Tsubasa. Max sẽ là 31 trong game. Muốn chỉnh cho các cầu thủ khác thì cũng kết hợp dãy chỉ số trong game x8 và ghi log để chỉnh sửa. - Chỉ số thể lực: Chỉ sổ thể lực của Tsubasa trong phần Kick Off khá dễ tìm. Nhận xét nó là số 600 đầu tiên xuất hiện (cả đội Sao Paulo chỉ có Tsubasa có thể lực 600), các chỉ số 600 còn lại là của phần All Stars. Đổi 600 qua Hex được 0258. Để tìm trong rom thì đảo ngược lại là 5802. Vào rom và search chuỗi hex 5802. Ta có : 23D22 : 58 02 Có 9999 = 270F. Đảo ngược thành 0F27 và thay vào vị trí : 23D22. Reload game vào lại phần kick off trận 1. Ta có : Các cầu thủ xung quanh có thể lực 408 = 0198 => đảo ngược là 9801, vậy tìm 9801 xung quanh khu vực 23D22 để thay đổi. Lưu ý : Sửa chỉ số ở đây chỉ tác động ở phần Kick Off, khi ở các trận sau, chỉ số thể lực còn bị tác động bởi tăng level nên sẽ bị trả về giá trị 6xx. Chuyển sang chỉnh chỉ số thể lực cho các cầu thủ All Star. Từ vị trí lúc nãy của Tsubasa (Kick Off). Search tiếp value 5802. Ta có : 2530E : 5802 =>thay bằng 0F27. Reload game và kiểm tra lại phần All Star ta có : Để ý, tại 2530E, sau khi thay 0F 27, ở vị trí kế tiếp là 60 02 => 260 = 608. Đây là chỉ số thể lực cho các cầu thủ All Stars tại level tiếp theo. Cứ tiếp tục cho đến : 2537C : D403 -> 3D4 = 980. Với 980 là chỉ số thể lực max. Kết luận, để chỉnh chỉ số Thể lực 9999 cho toàn bộ các level của các cầu thủ All Stars: 2350E -> 2537C : thay từng cặp 2 giá trị thành cặp 0F27.
1.6.3. Chỉ số của các skill - cụ thể là skill sút (chưa được hoàn chỉnh) Cũng tương tự như ở Tsubasa 2. Một skill sút sẽ có 3 chỉ số cơ bản : một là thể lực tiêu hao khi dùng, hai là chỉ số gọi là "Violence", ba là chỉ số "Power Add" (theo như các bản hack Tsubasa 2). "Violence" càng cao thì càng có khả năng hất văng cầu thủ chặn bóng. "Power Add" càng cao thì càng có khả năng bóng bay vượt khỏi cầu thủ chặn bóng. "Thể lực" là số 2 bytes (2 giá trị hex trong Rom) Lưu ý : - 2 chỉ số có sự kết hợp nhất định, không phải chỉnh cả 2 lên max FF thì sẽ có max hiệu ứng. - Với Tsubasa 2, 2 chỉ số tác động lên cầu thủ chặn bóng và cả thủ môn. Ở Tsubasa 3 thì chủ yếu tác động lên cầu thủ chặn bóng, về phần thủ môn sẽ có 1 phần khác xử lý riêng. VD : thử tìm nơi lưu các giá trị của Sút Lái (Drive Shoot) có chỉ số thể lực 200 - C8 (hex). Hoặc là search chuỗi hex "C800" trong rom => không khả thi do có nhiều giá trị bằng C8. Search theo cách này sẽ dễ tìm với các skill có thể lực > 255 ví dụ Cyclone (400 - 0190 hex). Ở đây ghi log từ đoạn bấm "A" ở màn hình chỉ số cơ bản của Tsubasa chuyển sang màn hình các skill của Tsubasa (Sao Paulo trận 1). Trong log (vùng nhớ LoRom) thì search trực tiếp " A:00C8". Bỏ qua các vị trí A:00C8 do code game xử lý hoặc nạp vào từ vùng nhớ Ram, chỉ lưu ý các vị trí nạp từ offset trong Rom để có A:00C8. Kết quả : Mã: $00/8A1A B3 01 LDA ($01,s),y[$04:C036] A:C010 X:0000 Y:0010 D:1800 DB:04 S:1C0C P:envmXdIzc HC:0108 VC:072 FC:50 I:00 $00/8A1C 8D 7E 04 STA $047E [$04:047E] A:00C8 X:0000 Y:0010 Ở trên nạp từ vùng Rom $04:C036 (LoRom) mang giá trị 00C8 vào A. Vậy đổi $04:c036 thành 24036. Goto 24036 trong rom game ta có chuỗi : C8 00 88 14. Vậy vùng offset 240xx này là vùng lưu các chỉ số của các skill (sút). Lưu ý vùng này để có thể tìm các skill khác dễ dàng hơn. Với 00 C8 là giá trị thể lực của Sút Lái. 88 là giá trị "Violence". 14 là giá trị "Power Add". Bản thân Sút Lái là cú sút không đủ lực để hất văng cầu thủ chặn bóng. Ta sẽ chỉnh sửa lại như sau : Chỉnh 00 C8 thành 00 00 để Sút Lái không tốn thể lực khi sút. Chỉnh 88 lên thành FF để đạt max "Violence", có thể hất văng các cầu thủ chặn bóng. Kết quả : 24036 : 00 00 FF 14. Reload game và test (Tsubasa - SaoPaulo trận 1). Và trong trận : Tương tự cho các skill sút khác. Đến đây mình tạm dừng phần chỉ số trong game. 1.6.4. Chỉnh sửa Speed - tốc độ di chuyển của các cầu thủ Ở phần này mình sẽ lấy các cầu thủ trong All Stars để chỉnh. Ví dụ chỉnh cho Tsubasa và Hyuga. Không có tiêu chí nào để tìm Speed của các cầu thủ, nên sẽ kế thừa kết quả từ các bản hack Tsubasa 2. Theo đó : 03 tốc độ di chuyển trung bình của Tsubasa. 06 là tốc độ di chuyển max của game. Thử tìm vùng Ram qui định : chọn State của Tsubasa khi di chuyển 1-2 bước trên sân và search theo value = (Equal To) - Entered value : 03. Sau đó chyển sang State của cầu thủ có bước di chuyển khác (ví dụ Coimbra) và search theo dạng > Previous Value. Cuối cùng ta có vùng Ram 7E0A07 lưu giá trị Speed tại 1 thời điểm. Ghi log khi Tsubasa di chuyển trên san 1-2 bước. Trong log, search thử " :0A07]", chỉ xét các vị trí có nạp A mang giá trị 03 vào ":0A07". Kết quả không tìm được. Vậy dự đoán nó là 1 cặp giá trị dạng xx 03. Khi đó nó sẽ lưu vào 7E0A06 + 7E0A07 nên vùng ram được gọi ra là :0A06, lưu thành 1 cặp nên nó sẽ kèm theo :0A07. Vậy search log lại như trên với ":0A06" và xét các vị trí có nạp vào vùng này giá trị 03 xx (đảo ngược). Kết quả : Mã: $00/85C1 B3 01 LDA ($01,s),y[$04:AE6E] A:AE6C X:0001 Y:0002 D:0A00 DB:04 S:1C35 P:eNvmXdIzc HC:1118 VC:261 FC:20 I:00 $00/85C3 FA PLX A:03B0 X:0001 Y:0002 D:0A00 DB:04 S:1C35 P:envmXdIzc HC:1186 VC:261 FC:20 I:00 $00/85C4 FA PLX A:03B0 X:006C Y:0002 D:0A00 DB:04 S:1C36 P:envmXdIzc HC:1222 VC:261 FC:20 I:00 $00/85C5 28 PLP A:03B0 X:00AE Y:0002 D:0A00 DB:04 S:1C37 P:eNvmXdIzc HC:1258 VC:261 FC:20 I:00 $00/85C6 AB PLB A:03B0 X:00AE Y:0002 D:0A00 DB:04 S:1C38 P:envMXdIzc HC:1294 VC:261 FC:20 I:00 $00/85C7 7A PLY A:03B0 X:00AE Y:0002 D:0A00 DB:02 S:1C39 P:envMXdIzc HC:1330 VC:261 FC:20 I:00 $00/85C8 FA PLX A:03B0 X:00AE Y:0000 D:0A00 DB:02 S:1C3A P:envMXdIZc HC:1366 VC:261 FC:20 I:00 $00/85C9 6B RTL A:03B0 X:0001 Y:0000 D:0A00 DB:02 S:1C3B P:envMXdIzc HC:0104 VC:000 FC:20 I:00 $02/877E C2 20 REP #$20 A:03B0 X:0001 Y:0000 D:0A00 DB:02 S:1C3E P:envMXdIzc HC:0156 VC:000 FC:20 I:00 $02/8780 85 06 STA $06 [$00:0A06] A:03B0 X:0001 Y:0000 D:0A00 DB:02 S:1C3E P:envmXdIzc HC:0186 VC:000 FC:20 I:00 Theo trên, game load giá trị B003 từ vùng rom $04:AE6E. Chuyển 04AE6E thành 22E6E Vậy vùng offset 22Exx hoặc 22E6x sẽ qui định tốc độ của các cầu thủ Goto 22E6E : B0 03 | 70 04 | E5 03 Mỗi cầu thủ sẽ có 3 cặp giá trị qui định tốc độ. Như ở Tsubasa : - Cặp 1 : B0 03 : qui định tốc độ khi giữ bóng - Cặp 2 : 70 04 : qui định tốc độ di chuyển khi đội nhà (cầu thủ khác cùng đội) đang giữ bóng. - Cặp 3 : E5 03 : qui định tốc độ di chuyển khi đội địch (cầu thủ đội địch) đang giữ bóng Lưu ý : tốc độ di chuyển ở cặp 2 và 3 không nên chỉnh lên quá cao sẽ gây ra lỗi khi di chuyển (xem vị trí trên sân). Thay đổi thử cặp chỉ số 1 của Tsubasa (tốc độ lúc Tsubasa giữ bóng) : thay B0 03 thành B0 0F. Kết quả : Tương tự, cũng ghi log khi cho Hyuga di chuyển 1-2 bước trên sân. Sau đó xem log. Dựa trên kết quả vừa rồi, có thể tìm nhanh " [$04:AE" Mã: $00/85C1 B3 01 LDA ($01,s),y[$04:AE86] A:AE84 X:0001 Y:0002 D:0A00 DB:04 S:1C35 P:eNvmXdIzc HC:1134 VC:261 FC:45 I:00 $00/85C3 FA PLX A:0370 X:0001 Y:0002 Vậy chuỗi giá trị qui định speed cho Hyuga là : 4AE86 -> 22E86 Goto 22E86 : 70 03 60 04 A5 03 -> thay thử 70 03 thành 70 1F (cao hơn chỉnh cho Tsubasa). Reload game và test : Tốc độ di chuyển khi giữ bóng của Hyuga nhanh hơn của Tsubasa. Tương tự cho các cầu thủ khác. (Còn tiếp .....)
Bạn onzone chơi bản cũ kìa --> một số chỗ không hiện dấu. Bản mới nhất trong link tải đã khắc phục các lỗi này.
Do lỡ tay chỉnh sửa trên bản Việt ngữ đầu tiên nhiều quá nên lười đổi. Sang phần số 2 mình sẽ dùng bản mới nhất để minh hoạ.
Bổ sung cho 1.6.2 - Chỉnh Level cao cho Kick Off : Phần này là kiến thức tìm được từ Internet, chỉnh 2 mức level cho chế độ Kick Off là 46 và 90. Và chỉ áp 2 Level này cho tất cả các trận kick off. Nguồn từ Internet nên mình trình bày ngắn gọn : Bỏ 1 vài đoạn xử lý trong giai đoạn trước khi bắt đầu 1 trận đấu : ghi log tại thời điểm chuyển từ Story Mode sang đến hình ảnh có 2 lá cờ của 2 team vs nhau. - Chỉnh Level cả team thành 46 : Goto : 17F75 ($02:FF75) : 85 78 80 => EA EA EA Cụ thể trong log có đoạn sau : Mã: $02/FF74 4A LSR A A:002D X:00B0 Y:0002 D:0A00 DB:02 S:1C39 P:envMXdIzc HC:0384 VC:121 FC:22 I:00 $02/FF75 85 78 STA $78 [$00:0A78] A:0016 X:00B0 Y:0002 D:0A00 DB:02 S:1C39 P:envMXdIzC HC:0406 VC:121 FC:22 I:00 $02/FF77 80 B9 BRA $B9 [$FF32] A:0016 X:00B0 Y:0002 D:0A00 DB:02 S:1C39 P:envMXdIzC HC:0438 VC:121 FC:22 I:00 Thay EA cho các giá trị 85 78 80 sẽ dẫn đến bỏ đi 2 dòng xử lý STA $78 và BRA $B9. Và sau cùng là kết quả có được (trận 1 Sao Paulo): - Level 90 : giữ nguyên kết quả vừa chỉnh của Level 46 ở trên, tiếp tục chỉnh sửa : Goto 17F7C ($02:FF7C) : 78 80 06 => 0A EA EA Cụ thể trong log : Mã: $02/FF7B A5 78 LDA $78 [$00:0A78] A:0030 X:00B0 Y:0002 D:0A00 DB:02 S:1C39 P:envMXdIzC HC:0600 VC:121 FC:13 I:00 $02/FF7D 80 06 BRA $06 [$FF85] A:002D X:00B0 Y:0002 D:0A00 DB:02 S:1C39 P:envMXdIzC HC:0632 VC:121 FC:13 I:00 Sau khi thay đổi thì lệnh xử lý trên trở thành : LDA $0A và bỏ lệnh BRA $06. Và kết quả : Done. 1.6.5. Thay đổi các đoạn cắt cảnh Story Mode - Chỉnh sửa text 1.6.5.a. Phần này chỉ giới thiệu cách thay đổi các đoạn cắt cảnh Story Mode, ví dụ đoạn cắt cảnh đầu tiên là đoạn giới thiệu đầu trận 1 (Sao Paulo - Corinthians) Vùng offset các Pointer cho các đoạn cắt cảnh bắt đầu từ : 8430 Trong đó : 8430 : 01 80 là cắt cảnh đầu trận 1 (Lưu ý : trận 1 Sao Paulo - Corinthians chỉ có 1 đoạn cắt cảnh đầu trận, không có cắt cảnh cuối trận. Tiếp tục 8432 : 0280 : cắt cảnh đầu trận 2 (Champ Elyss) Dãy này sẽ tiếp tục với 8434 : 04 80 : cắt cảnh đầu trận 3 (Mexico) Vậy cặp giá trị 03 80 và 05 80 sẽ được đưa vào dãy offset tiếp theo khi kết thúc hết các đoạn cắt cảnh đầu trận của story mode, và khu vực này là khu vực cho các value pointer của các cắt cảnh cuối trận, v.v... Ví dụ : goto 8430 : thay 01 80 thành 05 80. Kết quả là đoạn cắt cảnh giới thiệu đầu trận Sao Paulo - Corinthians sẽ thay bằng đoạn cắt cảnh cuối trận Mexico City (Hyuga). Trường hợp muốn bỏ đoạn cắt cảnh nào đó. Thay cặp giá trị Pointer thành FFFF. Để chỉnh sửa trực tiếp trong các đoạn cắt cảnh này (thay hình ảnh, màu sắc, nhạc v.v...) : mình sẽ giới thiệu ở các phần tiếp theo (chỉnh sửa hiệu ứng hình ảnh, màu sắc, v.v...) 1.6.5.b. Chỉnh sửa text : Cách đơn giản để chỉnh sửa câu text là biết được các giá trị hex của các ký tự hiện ra trên màn hình, sau đó search chuỗi value hex trong rom và chỉnh sửa (không phải game nào cũng làm được theo cách này). Ngoài ra với bản Việt ngữ của bác asm65816 đã được cung cấp thêm bộ công cụ chỉnh sửa text để hỗ trợ dịch thuật nên việc chỉnh sửa các câu text rất dễ dàng. Ví dụ : tải file Archive do bác asm65816 cung cấp tại http://forum.gamevn.com/threads/j2v-subasa-3.1289638/ Nội dung của folder Archive : Folder Script chứa file rom .smc cần chỉnh sửa, sau khi chạy chương trình (file Exe.bat) sẽ tạo thành file rom .smc mới ở folder Archive. Giả sử muốn chỉnh đoạn text tại đoạn cắt cảnh story mode đầu trận 1 như sau : Trong folder trên, các đoạn text chủ yếu lưu trong các file Atlasx.asm. Sử dụng Notepad++ mở các file này và tìm chuỗi text của hình trên (nhớ backup file gốc lại). Ví dụ tìm chữ "Năm nay", kết quả nằm tại file atlas2.asm : Ở đây thay thử đoạn text của phần "Năm nay... Corinthians" thành nội dung mới : Save nội dung file atlat2.asm này lại. Bây giờ chạy file Exe.bat để chỉnh sửa, kết quả sẽ tạo ra 1 file mới tên Tsubasa3V.smc trong folder Archive. Mở rom này lên và kiểm tra lại kết quả : Lưu ý : do hạn chế về hiển thị text của game, nên không thể biểu diễn 1 số ký tự chữ hoa có dấu : ví dụ Ă. Những trường hợp này phải thay bằng chữ thường (ă). Hoặc các ký tự chưa được biểu diễn (ví dụ các ký tự đặc biệt như - ) cũng sẽ gây treo game. Để biết được những ký tự nào có thể sử dụng thì mở file Tsu3V.tbl trong folder Archive và kiểm tra. Done. Kết thúc phần 1
Phần 2 - Chỉnh sửa hiệu ứng hình ảnh, màu sắc : Phần này rất rộng, kiến thức rất nhiều và phụ thuộc vào khả năng tìm tòi, sáng tạo và kiên nhẫn. Mình chỉ trình bày một số mục cơ bản để nếu ai cần thì có thể tận dụng để tạo ra một số bản hack rom giống như các bản hack trên Youtube (hầu hết là tiếng Arab). Phần lớn kiến thức ở Tsubasa 3 kế thừa từ Tsubasa 2, và có thể tận dụng cho các bản Tsubasa khác hoặc game snes khác. 2.1. Palette (bảng màu) và một số code khác (nguồn Internet) : 2.1.1 Một số code phục vụ cho việc chỉnh sửa team/club theo ý muốn : - Offset vị trí các cầu thủ của các team/club cho Player 1 : nguồn Internet nên một số tên dịch ra không chính xác. Spoiler Team players The order in which I put is GK, No.2, No.3, No.4, No.5, No.6, No.7, No.8, No.9, No.10 and No.11 ---- Sao Paulo 2181B to 2183B Renato: 00 00 02 Lima: 00 00 03 Marini: 01 00 04 Amaral: 02 00 05 Dotoru: 03 00 06 Batista: 04 00 07 Tahama: 05 00 08 Babin: 06 00 09 Gil: 07 00 0A Tsubasa: 08 00 01 Platon: 09 00 0B ----- Elyss 2183D to 2185D Justo: 09 00 4B Marco: 45 01 01 Dminic: 45 01 02 Abreu: 45 01 03 Cardan. 45 01 04 Edmond: 45 01 05 Lujan: 45 01 06 Sam 45 01 07 Napoleon: 0A 00 23 Misaki 0B 00 21 Morris: 47 01 08 ------ MexicoCity 2185F to 2187F Wakashimazu: 01 00 22 Cstero: 48 01 09 Ferro: 48 01 0A Bruno: 48 01 0B Crnlio: 48 01 0C Fdrico: 49 01 0D Estrda: 4A 01 0E Pio: 49 01 0F Hyuga: 0C 00 19 Niclas: 49 01 10 Mateo: 4A 01 11 ----- Yorshire 21881 to 218A1 Tomas: 0A 00 4C Branco: 4B 01 13 Ricrdo: 4B 01 14 Mcnill: 4B 01 15 Baxter: 4B 01 16 Jonson: 4C 01 17 Casa: 4D 01 18 Kent: 4C 01 19 Ted: 4D 01 1A Matsuyama: 0D 00 1C Jones: 4D 01 1B ------ Hamburg 218A3 to 218C3 Wakabayashi: 02 00 20 Nº2: 4E 01 1C Nº3: 4E 01 1D Nº4: 4E 01 1E Nº5: 4E 01 1F Nº6: 4F 01 20 Nº7: 50 01 21 Nº8: 4F 01 22 Nº9: 50 01 23 Nº10: 4F 01 24 Nº11: 50 01 25 ---------- Japan1 218C5 to 218FD Morisaki: 03 00 0F Soda: 0E 00 1A Jito: 0F 00 1B Ishizaki: 10 00 13 Saul: 11 00 10 Sawada: 12 00 1E Kazuo: 13 00 17 Mazao: 14 00 16 Nitta: 15 00 14 Matsuyama: 0D 00 1C Sorimachi: 16 00 1D Bench Urade: 17 00 0C Car: 18 00 0D Raul: 19 00 0E Izawa: 1A 00 11 Taki: 1B 00 12 Kisugi: 1C 00 15 Sano: 1D 00 18 Misugi: 1E 00 1F -------- Japan2 218FF to 2193B Morisaki: 03 00 0F Soda: 0E 00 1A Jito: 0F 00 1B Ishizaki: 10 00 13 Saul: 11 00 10 Sawada: 12 00 1E Kazuo: 13 00 17 Mazao: 14 00 16 Nitta: 15 00 14 Matsuyama: 0D 00 1C Sorimachi: 16 00 1D Bench Urade: 17 00 0C Car: 18 00 0D Raul: 19 00 0E Izawa: 1A 00 11 Taki: 1B 00 12 Kisugi: 1C 00 15 Sano: 1D 00 18 Misugi: 1E 00 1F Misaki: 0B 00 21 ---------- Japan3 2193C to 2197D Wakashimazu: 01 00 22 Soda: 0E 00 1A Jito: 0F 00 1B Ishizaki: 10 00 13 Matsuyama: 0D 00 1C Sawada: 12 00 1E Kazuo: 13 00 17 Mazao: 14 00 16 Huyga: 0C 00 19 Misaki: 0B 00 21 Nitta: 15 00 14 Bench Urade: 17 00 0C Car: 18 00 0D Raul: 19 00 0E Izawa: 1A 00 11 Taki: 1B 00 12 Kisugi: 1C 00 15 Sano: 1D 00 18 Misugi: 1E 00 1F Saul: 11 00 10 Sorimachi: 16 00 1D Morisaki 03 00 0F -------- Japan4 2197F to 219C3 Wakashimazu: 01 00 22 Soda: 0E 00 1A Jito: 0F 00 1B Ishizaki: 10 00 13 Matsuyama: 0D 00 1C Kazuo: 13 00 17 Mazao: 14 00 16 Misaki: 0B 00 21 Huyga: 0C 00 19 Tsubasa: 0B 00 21 Nitta: 15 00 14 Bench Urade: 17 00 0C Car: 18 00 0D Raul: 19 00 0E Izawa: 1A 00 11 Taki: 1B 00 12 Kisugi: 1C 00 15 Sano: 1D 00 18 Misugi: 1E 00 1F Saul: 11 00 10 Sorimachi: 16 00 1D Morisaki 03 00 0F ------- Japan5 219C5 to 21A06 Wakashimazu: 01 00 22 Soda: 0E 00 1A Jito: 0F 00 1B Ishizaki: 10 00 13 Matsuyama: 0D 00 1C Kazuo: 13 00 17 Mazao: 14 00 16 Misaki: 0B 00 21 Nitta: 15 00 14 Tsubasa: 08 00 01 Sorimachi: 16 00 1D Bench Urade: 17 00 0C Car: 18 00 0D Raul: 19 00 0E Izawa: 1A 00 11 Taki: 1B 00 12 Kisugi: 1C 00 15 Sano: 1D 00 18 Misugi: 1E 00 1F Saul: 11 00 10 Morisaki 03 00 0F ------------ Japan6 21A08 to 21A4C Wakabayashi: 02 00 20 Soda: 0E 00 1A Jito: 0F 00 1B Ishizaki: 10 00 13 Matsuyama: 0D 00 1C Kazuo: 13 00 17 Mazao: 14 00 16 Misaki: 0B 00 21 Nitta: 15 00 14 Tsubasa: 08 00 01 Sorimachi: 16 00 1D Bench Urade: 17 00 0C Car: 18 00 0D Raul: 19 00 0E Izawa: 1A 00 11 Taki: 1B 00 12 Kisugi: 1C 00 15 Sano: 1D 00 18 Misugi: 1E 00 1F Saul: 11 00 10 Sawada: 12 00 1E Morisaki 03 00 0F Wakashimazu: 01 00 22 ---------- Japan7 21A4E hasta 21A92 Wakabayashi: 02 00 20 Soda: 0E 00 1A Jito: 0F 00 1B Ishizaki: 10 00 13 Matsuyama: 0D 00 1C Sawada: 12 00 1E Kazuo: 13 00 17 Mazao: 14 00 16 Huyga: 0C 00 19 Misaki: 0B 00 21 Nitta: 15 00 14 Bench: Urade: 17 00 0C Car: 18 00 0D Raul: 19 00 0E Izawa: 1A 00 11 Taki: 1B 00 12 Kisugi: 1C 00 15 Sano: 1D 00 18 Misugi: 1E 00 1F Saul: 11 00 10 Sorimachi: 16 00 1D Morisaki 03 00 0F Wakashimazu: 01 00 22 ---------- Japan 8 21A94 to 21ADB Wakabayashi: 02 00 20 Soda: 0E 00 1A Jito: 0F 00 1B Ishizaki: 10 00 13 Matsuyama: 0D 00 1C Kazuo: 13 00 17 Mazao: 14 00 16 Misaki: 0B 00 21 Huyga: 0C 00 19 Tsubasa: 08 00 01 Nitta: 15 00 14 Bench: Urade: 17 00 0C Car: 18 00 0D Raul: 19 00 0E Izawa: 1A 00 11 Taki: 1B 00 12 Kisugi: 1C 00 15 Sano: 1D 00 18 Misugi: 1E 00 1F Saul: 11 00 10 Sorimachi: 16 00 1D Sawada: 12 00 1E Morisaki 03 00 0F Wakashimazu: 01 00 22 Để ý thấy vùng offset của các đội thuộc Player 1 - Kick Off- liên tiếp nhau, cách nhau bởi 1 value (có thể = 0B ) Ví dụ cách sử dụng : ở đây thay thử Misaki và Nitta vào đội Sao Paulo. Đầu tiên value cho Misaki là : 0B 00 21 và Nitta là 15 00 04. Xét dãy offset của Sao Paulo : thay No.9 Gil - 07 00 0A (goto offset 21833) bằng 15 00 04. thay No.11 Platon - 09 00 0B (goto offset 21839) bằng 0B 00 21. Save lại, vào game và test : Và trong trận : Sau khi thay xong, phải xử lý việc cầu thủ thay vào khi sử dụng skill có hiện hình avatar thì game không có dữ liệu ở các trận đấu này (Sao Paulo) nên hình avatar sẽ bị thay bằng màu đen. Vấn đề này sẽ được đề cập ở các mục sau của Phần 2 này. Hiện tại có thể thay bất kỳ cầu thủ nào trong các team/clb thuộc Player 1. Bây giờ nếu muốn thay các cầu thủ của team Enemy vào đội mình thì sao ? Hiện trên web không có liệt kê offset / code cho các team / club enemy nên phải tự tìm. Ví dụ với Sao Paulo : vùng offset đi từ 2181B đến 2183B, đổi ra địa chỉ Lo Rom bằng Lunar Addres ta được vùng Lo Rom : $04:981B đến $04:983B. Khi vào tới phần màn hình "Meeting" đầu trận thì danh sách cầu thủ đã được tính toán xong và hiện lên, nên sẽ tiến hành ghi lại log từng đoạn kể từ lúc bắt đầu chọn vào Kick Off để đá trận đầu tiên cho tới khi hiện lên màn hình "Meeting". Và tìm trong các file log 2 địa chỉ Lo Rom ở trên. Kết quả cuối cùng, giai đoạn cần ghi log là từ lúc chọn Kick Off (nhấn nhanh để bỏ qua đoạn Story Mode) và dừng log ở màn hình hiện lên 2 lá cờ của clb San Paulos và Corinthians. Mở log và tìm : $04:983B kết quả không có, vậy dự đoán nó không load 1 giá trị hex mà load 1 cặp 2 giá trị hex, nên sẽ load từ $04:983A , search $04:983A ta được Mã: $02/FA68 C2 20 REP #$20 A:0901 X:0012 Y:0020 D:0A00 DB:02 S:1C36 P:envMXdIzc HC:0100 VC:098 FC:15 I:00 $02/FA6A B7 B0 LDA [$B0],y[$04:983A] A:0901 X:0012 Y:0020 D:0A00 DB:02 S:1C36 P:envmXdIzc HC:0154 VC:098 FC:15 I:00 $02/FA6C 5A PHY A:0B00 X:0012 Y:0020 D:0A00 DB:02 S:1C36 P:envmXdIzc HC:0218 VC:098 FC:15 I:00 $02/FA6D A0 00 LDY #$00 A:0B00 X:0012 Y:0020 D:0A00 DB:02 S:1C35 P:envmXdIzc HC:0248 VC:098 FC:15 I:00 $02/FA6F 97 C0 STA [$C0],y[$7E:3540] A:0B00 X:0012 Y:0000 D:0A00 DB:02 S:1C35 P:envmXdIZc HC:0296 VC:098 FC:15 I:00 Ta thấy sau khi nạp vào A value 0B 00 tại offset $04:983A (vị trí No.11 của Sao Paulo) thì cặp value này được lưu trữ vào vùng nhớ Ram 7E 3540. Nếu xem lại web gamefaqs phần hack ram thì vùng nhớ 7E3540 , 7E3541 là vị trí vùng nhớ Ram của slot No.11 của đội Player 1. Đây là vị trí cuối cùng của cầu thủ đội Sao Paulo. Từ đây có 2 cách để tìm vùng value của đội enemy (Corinthians) : hoặc là search tiếp vùng Lo Rom $04:98 hoặc thu gọn hơn $04:9 ; hoặc là tận dụng kiến thức đã có về vùng Ram lưu trữ các value của team enemy (web gamefaqs). Xem lại web gamefaqs phần chỉnh sửa các vị trí của 2 đội ta có : Mã: COM Portero 7E3561-- Đây là vùng nhớ lưu trữ vị trí của GK đội enemy. Trong trường hợp này nó sẽ lưu thông tin GK của Corinthians (ta sẽ dùng 7E3560 và 7E3561). Nên tại vị trí hiện thời trong log vừa rồi, ta search tiếp chuỗi " :3560]" sẽ có : Mã: $02/FB09 BF DC 9A 04 LDA $049ADC,x[$04:9AE1] A:000B X:0005 Y:0012 D:0A00 DB:02 S:1C35 P:envmxdIzC HC:1276 VC:100 FC:15 I:00 $02/FB0D A0 00 00 LDY #$0000 A:2601 X:0005 Y:0012 D:0A00 DB:02 S:1C35 P:envmxdIzC HC:1332 VC:100 FC:15 I:00 $02/FB10 97 C0 STA [$C0],y[$7E:3560] A:2601 X:0005 Y:0000 Vị trí này sẽ không nằm cách quá xa vị trí xử lý của No.11 đội Sao Paulo (Player 1). Theo trên ta được vùng Lo Rom : $04:9AE1 (vùng này load 2 giá trị hex). Và vẫn còn 1 giá trị hex ở trước đó nên vị trí của GK Corthians sẽ bắt đầu từ $04:9AE0 Mã: $02/FAF6 BF DC 9A 04 LDA $049ADC,x[$04:9AE0] A:0000 X:0004 Y:0004 D:0A00 DB:02 S:1C35 P:envMxdIZC HC:0846 VC:100 FC:15 I:00 $02/FAFA DA PHX A:000B X:0004 Y:0004 Đổi $04:9AE0 ra địa chỉ PC File là : 2 1AE0 Vậy vùng offset chứa thông tin các cầu thủ của Corinthians bắt đầu từ 21AE0. Mỗi cầu thủ mang 3 value hex kế tiếp nhau. Vậy xác định vị trí của No.10 Corinthians - Liberio là : 21AFB : 20 00 25. Thử thay Liberio vào cho No.9 Gil của Sao Paulo 21833 07 00 0A (goto offset 21833 thay 07 00 0A thành 20 00 25). Save lại và test : Và trong trận, Liberio không có dữ liệu Avatar khi sút skill nên không cần phải để ý tới hình ảnh nền đen khi dùng skill "Sút quả chuối". Trên sân hiện tại sẽ có 2 Liberio của Sao Paulo và của Corinthians. ------------------------------------------- - Một số code khác - nguồn Internet - các code này nhằm phục vụ Ví dụ ở cuối phần 2.1 này : Spoiler + Flag shape - Flag palette : Starting flag palette details: x255c7, address = x2556c Flag Shape address: x25464 + Team name address: x13c0 + Team palette : Sao Paolo palette: x36024 Blue palette Japan: x36164, x36144 Corinthians palette: x361c4 Korean palette: x36344 + GK Palette Renato palette: x36424 Morisaki palette = x364c4 GK Korea palette = x366a4 + Close up / avatar palette Tsubasa palette closeup = x37204 Morisaki = x374e4 palette closeup + Name of players: Tsubasa address = xc31 Morisaki = xc4d Begin generic names: xe4f GK Korean name = xf7b (E2 92) + Instructions to modifying closeup Morisaki as seen on the video to make CT3 GK Korea: South Korea vs. Uruguay: Change x374e6 to D4 11 FF 26 Change of x374f0 64 to 70 7D Change to 7D 01 5F 1 x374f4 Palette Readiness Team (Blue Japan 05) = x37084
2.1.2. Bảng màu - Palette Phần này hướng dẫn cách thay đổi màu sắc của hình ảnh hiện ra trên màn hình game, có thể áp dụng cho game khác. Thay đổi palette là thay đổi các thành phần qui định màu có thể xem như nằm ở lớp "dưới cùng". Từ đó dễ dàng thay được màu sắc mong muốn vượt ngoài qui định của game. Trong phần này mình sử dụng tính năng Palette Editor của trình giả lập bsnes debugger để xác định chính xác các thành phần hiển thị màu trên màn hình. Ngoài ra là công thức chuyển đổi giá trị màu của hệ màu máy tính 24 bit RGB (Red-Green-Blue) sang hệ màu trên hệ snes 15 bit : R = Red / 8 ; G = Green / 8 ; B = Blue / 8 với Red Green Blue là giá trị 3 màu tương ứng ở hệ 24 bit màu. C (15 bit) = (B x 1024) + (G x 32) + R Giả sử dùng mspaint của Microsoft và chọn 1 màu như sau (Edit Colors) : Công thức kết hợp Red Green Blue để tạo ra màu xám này là Red = 192 , Green = 192, Blue = 192 Chia cho 8 : R = 192/8 = 24 ; G = 192 / 8 = 24 ; B = 192 / 8 = 24 Vậy tính để ra được màu xám ở hệ 15 bit snes là : (24 x1024) + (24 x 32) + 24 = 24576 + 768 + 24 = 25368 . Đổi sổ này ra hệ hexa được 6318 hoặc 0x6318. Vậy mã màu xám chọn từ bảng màu của mspaint có value hex là 6318. Ví dụ 1 : muốn đổi nền trời trong game (lúc giữ bóng) thành màu xám. Dùng bsnes debugger mở game. Sau đó nhấn Pause (có thể phải nhấn Pause 2 lần để bật / tắt) để Pause game lại ở màn hình cần chọn. Sau đó trên menu của chương trình bsnes chọn Tools > Debugger. Trên của sổ Debugger chọn S-PPU > Palette Viewer. Quan sát bảng Palatte và so sánh các ô màu với các màu hiện có trên màn hình. Dự kiến ô đang xét (value 7F15) là có màu giống với nền trời. Vị trí ô này cũng nằm gần khu vực ở phía trên của màn hình. Bây giờ quay lại dùng snes9x debugger để ghi log (do bsnes debugger trình bày log không rõ ràng như của snes9x). Có thể ghi log ở giai đoạn ngay trước chuyển sang hình ảnh có cảnh bầu trời như trên. Mở log và search A:7F15 ta có : Mã: $00/845D BF 00 E0 06 LDA $06E000,x[$06:ECC8] A:0008 X:0CC8 Y:0088 D:0C00 DB:0F S:1CF4 P:envmxdIzc HC:0104 VC:016 FC:56 I:00 $00/8461 DA PHX A:7F15 X:0CC8 Y:0088 D:0C00 DB:0F S:1CF4 P:envmxdIzc HC:0160 VC:016 FC:56 I:00 $00/8462 BB TYX A:7F15 X:0CC8 Y:0088 D:0C00 DB:0F S:1CF2 P:envmxdIzc HC:0198 VC:016 FC:56 I:00 $00/8463 9F 00 20 7E STA $7E2000,x[$7E:2088] A:7F15 X:0088 Y:0088 D:0C00 DB:0F S:1CF2 P:envmxdIzc HC:0220 VC:016 FC:56 I:00 Vậy có vùng Lo Rom : $06:ECC8 mang value 7F15. Chuyển ra offset PC File là 36CC8. Goto offset 36CC8 ta thấy mang value 15 7F (đảo ngược). Tại đây để ý sẽ thấy cặp value ngay trước nó là B1 7E đảo ngược lại thành 7E B1. Là mã màu của ô vuông màu xanh đậm hơn ở bên canh ô đang xét (xem lại cửa sổ Palette Viewer của bsnes). Dự kiến nó cũng là màu xanh đậm hơn của nền bầu trời. Nền trời sẽ gồm nhiều ô màu xanh đậm nhạt khác nhau ghép lại. Vậy tiến hành thay 2 cặp value này thành màu xám ta đã tính toán ra ở trên : 6318 đảo ngược. Vậy tại offset 36CC6 : thay B1 7E 15 7F thành 18 63 18 63. Save lại. Vào game kiểm tra lại : Ta thấy đã thay được gần hết nền trời sang màu xám, chỉ còn lại vài vạch màu xanh (cùng màu). Reload lại game ở bsnes, xem lại bảng Palette : Ở hàng ô màu vừa xét, 2 ô vừa thay đổi đã thành màu xám. Ở cuối hàng này có 1 ô màu khá giống với màu còn sót lại trên nền trời : dự kiến : 7ED3. Ở đây có 2 cách tìm : 1 là vừa rồi tại offset 36CC6 là vị trí của 2 ô vừa thay, ô dự kiến cần tìm nằm ở bên phải (phía sau) nên nhìn lên 1 chút ở vị trí trong rom game tại offset 36CDE mang value D3 7E (đảo ngược 7ED3). 2 là quay lại log vừa rồi và search tiếp tại vị trí lúc nãy : A:7ED3 được Mã: $00/845D BF 00 E0 06 LDA $06E000,x[$06:ECDE] A:001E X:0CDE Y:009E D:0C00 DB:0F S:1CF4 P:envmxdIzc HC:0070 VC:028 FC:46 I:00 $00/8461 DA PHX A:7ED3 X:0CDE Y:009E D:0C00 DB:0F S:1CF4 P:envmxdIzc HC:0126 VC:028 FC:46 I:00 Ta có Lo Rom : $06:ECDE -> 3 6CDE, khớp với cách tìm 1. Vậy tại 36CDE thay tiếp D3 7E thành 18 63. Save rom lại và test : Vậy ta đã thay màu nền trời trong game thành màu xám. Việc thay đổi Palette ảnh hưởng đến tất cả tình huống trong game có sử dụng Palette này. Vẫn còn lại một số trường hợp khi trái bóng bay đi từ cú sút hay khi nhảy lên chặn bóng, có thể áp dụng cách tương tự như trên để đổi nền trời cho hoàn chỉnh. --- Áp dụng cách trên có thể đổi màu sắc bất kỳ hình ảnh nào trong game. Ví dụ 2 : thử đổi màu tóc của Tsubasa sang màu khác (lúc dẫn bóng). Ví dụ chọn màu tím có mã hex : 44AE. Xem Palette Viewer của Tsubasa khi đang dẫn bóng ta có : Dự kiến màu tóc của Tsubasa là 2 màu ghép lại (đen + đen nâu), khả năng là 2 ô có mã hex như trên hình : 0086 và 00C9. Ghi log (snes9x) giai đoạn chuẩn bị chuyển sang hình Tsubasa dẫn bóng và search A:0086, chỉ xét khu vực nạp từ Lo Rom (dự kiến là vùng $06:) và gần đó sẽ là nạp A:00C9, nếu không khớp thì search next. Ta được : Mã: $00/845D BF 00 E0 06 LDA $06E000,x[$06:E04C] A:000C X:004C Y:012C D:0C00 DB:0F S:1CF4 P:envmxdIzc HC:0764 VC:052 FC:57 I:00 $00/8461 DA PHX A:0086 X:004C Y:012C D:0C00 DB:0F S:1CF4 P:envmxdIzc HC:0820 VC:052 FC:57 I:00 $00/8462 BB TYX A:0086 X:004C Y:012C D:0C00 DB:0F S:1CF2 P:envmxdIzc HC:0858 VC:052 FC:57 I:00 $00/8463 9F 00 20 7E STA $7E2000,x[$7E:212C] A:0086 X:012C Y:012C D:0C00 DB:0F S:1CF2 P:envmxdIzc HC:0880 VC:052 FC:57 I:00 $00/8467 FA PLX A:0086 X:012C Y:012C D:0C00 DB:0F S:1CF2 P:envmxdIzc HC:0936 VC:052 FC:57 I:00 $00/8468 E8 INX A:0086 X:004C Y:012C D:0C00 DB:0F S:1CF4 P:envmxdIzc HC:0980 VC:052 FC:57 I:00 $00/8469 E8 INX A:0086 X:004D Y:012C D:0C00 DB:0F S:1CF4 P:envmxdIzc HC:1002 VC:052 FC:57 I:00 $00/846A C8 INY A:0086 X:004E Y:012C D:0C00 DB:0F S:1CF4 P:envmxdIzc HC:1024 VC:052 FC:57 I:00 $00/846B C8 INY A:0086 X:004E Y:012D D:0C00 DB:0F S:1CF4 P:envmxdIzc HC:1046 VC:052 FC:57 I:00 $00/846C 8A TXA A:0086 X:004E Y:012E D:0C00 DB:0F S:1CF4 P:envmxdIzc HC:1068 VC:052 FC:57 I:00 $00/846D 29 1F 00 AND #$001F A:004E X:004E Y:012E D:0C00 DB:0F S:1CF4 P:envmxdIzc HC:1090 VC:052 FC:57 I:00 $00/8470 D0 EB BNE $EB [$845D] A:000E X:004E Y:012E D:0C00 DB:0F S:1CF4 P:envmxdIzc HC:1188 VC:052 FC:57 I:00 $00/845D BF 00 E0 06 LDA $06E000,x[$06:E04E] A:000E X:004E Y:012E D:0C00 DB:0F S:1CF4 P:envmxdIzc HC:1218 VC:052 FC:57 I:00 $00/8461 DA PHX A:00C9 X:004E Y:012E Ta thấy có 2 vùng nạp vào A value 0086 và 00C9 liên tiếp nhau. Vậy xét Lo Rom : $06:E04C - 3604C Goto offset 3604C và thay : 86 00 C9 00 thành AE 44 AE 44. Vào lại game và test : Vậy đã thay màu tóc cho Tsubasa lúc đang dẫn bóng (đội Sao Paulo) Lưu ý việc thay Palette sẽ ảnh hưởng đến mọi trường hợp sử dụng chung Palette này. Dễ gặp trường hợp này nếu chỉnh sửa màu liên quan tới cầu thủ trong các trận All Stars. (còn tiếp)