FC 魂斗罗汉化日记 (第五集)
第五集 - 隐藏结局汉化
(目录)
上传 RHDN 之后,翻阅前辈的英文翻译介绍发现这么一句:
The game has a hidden ending message which is not translated.
后面跟着开启隐藏信息的说明,“在打爆异形老巢后,一直按下 Start
+Select
直到制作人员信息结束为止”。
进去一看,好家伙,这么一堆文字,都不知道怎么翻:
根据英文翻译版,简单的翻译如下:
愚蠢的地球人啊!
你真的以为「红隼」完了吗?的确,我们失去了在地球的
基地。但是做好准备吧,
我们还会再回来的。因为「红隼」永垂不朽……
因为整个屏幕用来显示文字,因此可以塞进去的文字数量还是挺可观的。
这破玩意折腾了一个下午,把字模导入到游戏后发现在读取 PPU 缓存区的程序代码有点不对… 因为强行照着以前的办法改写代码会灰屏,直接改打印屏幕的代码则会造成游戏的正常执行卡顿。
于是我把目光转向了 07:CB30
这个函数,跟踪在打印序章的执行过程与打印隐藏结局过程。
打印流程的不同取决于 $0023
这个值的内容。如果为 0
,那么之前灰屏的代码就能正常显示到屏幕了。
; 04:AF60:FF UNDEFINED
; 012F70:FF UNDEFINED
.org $AF60
LoadNextEndingChar:
LDA #$00
STA $0023
; 拷贝字符串地址
LDA $855B,Y
STA $0000
LDA $855C,Y
STA $0001
; Y = 读取的字符偏移
_GET_NEXT_CHAR:
LDY $0042
INC $0042
LDA ($00),Y
BEQ _SED_EXIT
CMP #$FB
BNE _SKIP_SET_WAIT
LDA #$01
STA $001A
RTS
_SKIP_SET_WAIT:
CMP #$FF
BEQ _EXIT_FINISH_DIALOG
CMP #$FE
BEQ _NEW_LINE
CMP #$FD
BNE _SKIP_ENABLE_CHINESE
; LDA #$03
; STA $07EE
; Read next char
JMP _GET_NEXT_CHAR
_SKIP_ENABLE_CHINESE:
; Loop - 检查中文字符
_Loop_SearchForChinese:
LDA ($00),Y ; A = 当前字符
AND #$C0 ; 检查第一位是不是 1
CMP #$C0 ; 中文控制符
BNE _END_CHINESE; 跳过中文字符处理
; 是中文控制符
; 加入两个字符,并,自循环
; 写出 2 个控制符
LDA ($00),Y ; A = ChineseCtrlChar
AND #$7 ;
TAX ; X = A
INY ; Y++
; 此时的 stack: X
; 此时的值: X = PPU 序号
; Y = 正常的序号
LDA ($00),Y ; A = NextChar
STA $07F0,X ; [07FX] = A (CHR_BANK_X)
INY ; Y++
STY $0042 ; 储存对话偏移
INC $0042
JSR $FACE
JMP _Loop_SearchForChinese
_END_CHINESE:
LDX $0021
LDA #$01
STA $0700,X
; 检查是否为中文字符.
AND #$C0
CMP #$80
BEQ _ADD_CHINESE
JMP _END_ADD_CHAR
_ADD_CHINESE:
; 定位
; LO ADDR
LDA $0043
STA $0702,X
CLC
ADC #$20
STA $0708,X
; HI ADDR
LDA $0044
STA $0701,X
ADC #$00
STA $0707
; 写出第一个贴图块
LDA ($00),Y
STA $0703,X
; 写出后续贴图块
CLC
ADC #$01
STA $0704,X
CLC
ADC #$01
STA $0709,X
CLC
ADC #$01
STA $070A,X
; 写出终止符
LDA #$FF
STA $0705,X
STA $070B,X
INC $0043
TXA
CLC
ADC #$0C ; 下次写出的偏移
STA $0021
LDA #$10
JSR $F9BC ; Play sound
_SED_EXIT:
INC $0043
_EXIT:
RTS
_EXIT_FINISH_DIALOG:
LDA #$00
STA $07EE
LDA #$FF
RTS
_NEW_LINE:
; 0043:
LDA $0043
AND #$E0
STA $0043
; [0043] = [0043] + #$45
LDA #$43 ; Position next line; Original Value #$45
LDX #$43
JSR _C72D
LDA #$01
RTS
_C72D:
CLC
ADC $00,X
STA $00,X
BCC _C736
INC $01,X
_C736:
RTS
▲ 被重写的“读取下一个隐藏信息字符”过程,最初的修改版本没有保留。
在此处为了防止卡顿,尝试模仿标题画面的游戏介绍打印过程,将贴图块事先填充到缓冲区。
碎碎念
这个相比之前的大工程,反而简单很多…