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

▲ 被重写的“读取下一个隐藏信息字符”过程,最初的修改版本没有保留。
  在此处为了防止卡顿,尝试模仿标题画面的游戏介绍打印过程,将贴图块事先填充到缓冲区。

就是这样。

Jixun的头像

Jixun