Phi long quyền III

I. Khái quát

Phi long quyền 3: ngũ long chiến sĩ (飛龍の拳III 五人の戦士) là một phiên bản trong series Phi long quyền (Hiryū no ken) của hãng Culture Brain. Phiên bản này được Culture Brain phát hành năm 1990 trên máy Famicom. Tại Việt Nam, series Phi long quyền này rất ít được biết đến với độ khó của nó quá cao so với "đám con nít" đương thời. Tuy nhiên, những tên "con nít" nào nắm bắt được lối chơi của nó thì rất dễ nghiện vì lối đánh độc đáo, yếu tố phiêu lưu, biến thân bắn chưởng,... Tôi biết Phi long quyền vào khoảng năm 1990, không rõ lúc đó là phiên bản nào. Mặc dù cảm giác lúc đó là nó quá khó để hiểu được lối chơi, nhưng tôi vẫn say mê hình ảnh mấy bộ giáp của nhân vật trong game. Lúc đó chỉ biết kính viễn, đứng từ xa mà nhìn những đứa lớn tuổi hơn chơi mà thôi. Sau này, Phi long quyền luôn là một nỗi canh cánh trong lòng. Tôi muốn có một bản dịch cho series này. 

Đây cũng là dòng game đặc biệt mà không được dịch sang bất cứ ngôn ngữ nào khác, kể cả tiếng Anh. Sau bản dịch tiếng Việt Phi long quyền Golden Fighter trên máy Super Famicom/SNES, giờ đây tôi cảm thấy đủ kiến thức về Famicom để tiếp nối những phiên bản còn lại cho dòng máy này. Hẳn bản dịch tiếng Việt này sẽ là bản dịch ngôn ngữ ngoài tiếng Nhật đầu tiên trên Thế giới.

II. Đoạn Intro

Phi long quyền III có kiểu mapping là MMC3, giống với Ninja mèo. Đoạn Intro đầu game gồm hình ảnh nhân vật Long Phi (Ryūhi) và chữ "Phi long quyền III" được viết bằng Hán tự cùng tên Culture Brain. Hình ảnh nhân vật là lớp sprite, những thành phần còn lại là background. Không khó để khôi phục những điểm ảnh bị xóa, nhưng vấn đề là hình ảnh nhân vật này đã chiếm toàn bộ 64 sprite trong PPU. Đây là giới hạn của Famicom/NES, cho nên những phần khuyết của hình nhân vật sẽ được thay thế bằng background.

Phần chữ được ghi vào PPU qua routine ở bank thường trú từ địa chỉ $F2D3.


LDA ($48),Y

STA $2007

Pointer này dẫn đến địa chỉ $0148 với cấu trúc: địa chỉ PPU - tổng số byte cần ghi - các byte cần ghi. Sau khi kết thúc chuỗi byte cần ghi thì CPU đọc địa chỉ PPU mới tại $51 và nối tiếp các byte cần ghi tại chuỗi $014X. Chuỗi giá trị tại đây lại được copy từ $1B5E8 trong CHR ROM thay vì PRG ROM như thông thường.


org $F897

LDY #$00

LDA $54

STA $2006 //lấy địa chỉ CHR ROM

LDA $53

STA $2006

LDA $2007

LDA $2007

STA ($48),y

Dữ liệu graphic của màn hình mở đầu là bank $3C từ CHR ROM. CHR bank này được chỉ định ở $BE3F tại bank $05 PRG ROM. Bằng cách đổi lại CHR bank thì vẽ được màn hình đại khái như này.

Sau khi tinh chỉnh một chút thì được như hình dưới.

Điểm đặc biệt nhất ở màn hình mở đầu là hiệu ứng sao rơi vào phần chữ "Phi long quyền III" (tên game) được hiển thị từng phần theo chiều dọc. Hiệu ứng này được thực hiện nhờ vào routine IRQ phát sinh sau khi đường scanline của Tivi quét đến những vị trí (chiều dọc) nhất định. Số scanline này được chỉ định ở tọa độ Y của sprite 0 trong sprite table. Bằng cách đọc Register $2002 ở mỗi frame, CPU nhận biết được khi nào đường scanline chạm tọa độ của sprite 0, từ đó phát sinh IRQ.

III. Phần text chính

Trước khi đi vào phần text chính thì ta cần làm một việc là mở rộng khung thoại. Cũng như hầu hết game có yếu tố RPG khác, Phi long quyền 3 cũng đóng khung cho phần thoại chính của các nhân vật, nhưng kích thước khung khá hẹp, không có nhiều không gian trống để thể hiện hết ý của bản dịch.

Khung thoại trong game được vẽ theo từng dòng mỗi frame, lần lượt từ trên xuống. Routine này nằm ở bank thường trú cuối cùng.


LDA ($48),y

STA $2007

Pointer ($48) dẫn đến địa chỉ $140 trong CPU Memory. Mở đầu chuỗi này là 2 byte chỉ định địa chỉ PPU của khung thoại, tiếp đến là 1 byte chỉ số lượng các byte tiếp theo sẽ được ghi vào PPU, nối tiếp là các byte thể hiện pattern của khung thoại. Chuỗi kết thúc bằng giá trị 0x00. Giá trị được ghi vào chuỗi $140 qua routine ở PRG bank $02.


LDY #$5B //góc trên bên trái của khung thoại

LDX $47

LDA $01

STA $0140,x

INX

LDA $00

STA $0140,x

INX

CLC

LDA $12

ADC #$00

STA $0140,x

INX

LDA $12

STA $02 //số lượng byte cần ghi

TYA

-

STA $0140,x

INX

DEC $02

BNE -


Vị trí bắt đầu của khung thoại được chỉ định ở $01. Giá trị này xuất phát từ $87B7 tại PRG bank $03, chuyển qua trung gian $14 trước khi được ghi vào $01. Độ rộng của khung thoại cũng được quy định tại PRG bank này.


LDX #$00

LDA ($00),y  //$A7B7

STA $13,x


Sau khi chỉnh lại các giá trị địa chỉ PPU và độ rộng khung thoại thì được kết quả như sau.

Tọa độ text được quy định tại $51B8 trong PRG bank $02.

Từng ký tự được ghi vào PPU mỗi frame qua pointer ($48) chỉ đến chuỗi ở $0140. Chuỗi này gồm 6 byte, trong đó 2 byte đầu tiên là địa chỉ PPU, byte tiếp theo được ghi vào Register $2000, xác định địa chỉ PPU sẽ tăng theo chiều ngang hay chiều dọc. Đối với chế độ ghi text thì địa chỉ PPU gia tăng theo hàng dọc (giống cách thức ghi trong Ninja mèo). Byte thứ tư là nơi chứa giá trị của dấu trọc âm và bán trọc âm, còn byte thứ 5 là giá trị của ký tự. Byte thứ 6 là 0x00 báo kết thúc chuỗi. Như vậy, trong mỗi frame chỉ tồn tại 6 byte tại chuỗi này, và mỗi frame chỉ có 1 ký tự + dấu trọc âm/bán trọc âm được ghi ra màn hình.

Cơ chế đọc text từ Rom rồi ghi ra màn hình của Phi long quyền 3 có 2 điểm khác biệt so với nhiều game khác. Thứ nhất, với hầu hết game khác thì Hex code của ký tự chính là số ID của từng ký tự trong CHR PPU, nhưng Hex code của ký tự trong game này lại được tham chiếu qua một table với trật tự sắp xếp khác với CHR PPU. Giá trị của ký tự chính là giá trị của Register Y.


bank $02

org $9099

JSR $91F0 //đọc text tại chuỗi $0580

CMP #$FF  //kết thúc câu

BNE _90C7

LDA #$03

JSR $FF0F

LDA #$00

STA $43

STA $47

STA $0140

LDA $070C

AND #$7F

BEQ +

TAY

-

PLA

PLA

DEY

BNE -

RTS

_90BC:

LDA $2A  //text ptr

STA $0706

LDA $2B

STA $0707

RTS


_90C7:

CMP #$FE  //line break code

BNE +

INC $072A //line; tọa độ Y của ký tự

INC $072A

LDA $072D //tọa độ X của ký tự

STA $072B

JMP $9099

+

CMP #$FA

BNE +

PLA

STA $0706

PLA

STA $0707

DEC $070C

JMP $9099

+

CMP #$F9 //Katakana

BNE +

LDA $070C

ORA #$80

BNE _9100

+

CMP #$F8 //Hiragana

BNE +

LDA $070C

AND #$7F

STA $070C

JMP $9099

+

CMP #$80 //MTE

BCC _915B

CMP #$90

BCS _9158

AND #$0F

STA $0D

JSR $91F0

STA $0C

JSR $FF39

RTI



Đang cập nhật.