跳至内容

Jixun's Blog 填坑还是开坑,这是个好问题。

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

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

就是这样。

知识共享许可协议 本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

评论区