跳至内容

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

(GBA) 最终幻想 I+II 无限金币

200% 金币返还;但是需要有原始本金。

支持 D商 汉化版 + 日文原版;欧美版应该不通用吧?

使用 IPS 补丁程序打入即可。

IPS 下载:Final.Fantasy.I+II.Advanced.(GBA)(J)(C).Inf.Gold.Patch.ips


左为 FF1 武器店 右为 FF2 防具店

相关实现代码:

; ------------------------------------------------------------------------------
; 游戏: (GBA) 最终幻想 I+II
; 类型: 无限金币
; 说明: 需要本金,有了本金之后可以实现 200% 返利。
; ------------------------------------------------------------------------------
; 作者: Jixun
; 地址: https://jixun.moe/  --  季寻日志
; ------------------------------------------------------------------------------

.gba

.open "FF1+2.gba", "FF1+2_GOLD.gba", 0x08000000

; ------------------------------------------------------------------------------
; 补丁原始指令 (FF1 的扣钱函数)
; ------------------------------------------------------------------------------
.org 0x0807dd9c
.thumb
  FN_FF1_COST_GOLD_ORIG:
    LDR r3, =FN_FF1_COST_GOLD + 1
    BX r3          ; jmp_thumb FN_FF1_COST_GOLD
    .pool

; ------------------------------------------------------------------------------
; 补丁原始指令 (FF2 的扣钱代码部分)
; ------------------------------------------------------------------------------
; 08178f7c  4a13 ldr r2, [$08178fcc] (=$00004bdf)
; 08178f7e  18bb add r3, r7, r2
; 08178f80  781a ldrb r2, [r3, #0x0]        ; r2 = [r7 + $4bdf]
.org 0x08178f82
.thumb
  FN_FF2_COST_GOLD_ORIG:
    push {r2}        ; 备份 r2 值
    LDR r2, =FN_FF2_COST_GOLD + 1
    BX r2             ; jmp_thumb FN_FF2_COST_GOLD
    .pool

.org 0x08178f8E
  FN_FF2_CONTINUE:

; 08178F7C:  4A13       ldr r2, [$08178FCC]   ; $4bdf
; 08178F7E:  18BB       add r3, r7, r2
; 08178F80:  781A       ldrb r2, [r3, #0]

; 从此处开始放置钩子跳到自己的代码
; 08178F82:  4C13       ldr r4, [$08178FD0]   ; $4bdc
; 08178F84:  1938       add r0, r7, r4
; 08178F86:  8800       ldrh r0, [r0, #0]
; 08178F88:  4342       mul r2, r0            ; r2 = [r7 + $4bdc]*[r7 + $4bdf]

; 08178F8A:  6808       ldr r0, [r1, #0]
; 08178F8C:  1A80       sub r0, r0, r2

; 跳回来到这里
; 08178F8E:  6008       str r0, [r1, #0]      ; [r1] = [r1] - r2


; ------------------------------------------------------------------------------
; 随便找的一段空位
; 此处执行真正的代码。
; ------------------------------------------------------------------------------
.org 0x0881a640
; ------------------------------------------------------------------------------
; FF1 的补丁
; ------------------------------------------------------------------------------
.thumb
  FN_FF1_COST_GOLD:
    ; r0: BASE_ADDR
    ; r1: COST
    push {lr}               ; push [ret addr]

    ldr r3, =$0b84          ; r3 = GOLD_OFFSET
    add r2, r0, r3          ; r2 = 02001ec8 + $0b84 = 2002A4C[GOLD]
    ldr r0, [r2, #0x0]
    add r0, r0, r1          ; r0 = [r2] + r1
    ldr r3, =#999999
    cmp r0, r3              ; if r0 > 999999
  ble FF1_SKIP_RESET_MONEY  ;   goto FF1_SKIP_RESET_MONEY
    mov r0, r3              ; r0 = [DAT_SOME_MONEY]
  FF1_SKIP_RESET_MONEY:
    str r0, [r2, $0]        ; [r2] = r0

    pop {r0}
    bx r0                   ; ret
; ------------------------------------------------------------------------------
; FF2 的补丁
; ------------------------------------------------------------------------------
.thumb
  FN_FF2_COST_GOLD:
    pop {r2}                ; 还原 r2 值
; 08178F82:  4C13       ldr r4, [$08178FD0]
; 08178F84:  1938       add r0, r7, r4
; 08178F86:  8800       ldrh r0, [r0, #0]
; 08178F88:  4342       mul r2, r0          ; r2 = [r7 + $4bdf] * [r7 + $0b84]
    ldr r4, =$4bdc
    add r0, r7, r4
    ldrh r0, [r0, #0x0]   ; r2: COST
    mul r2, r0            ; r2 = r2 * [r7 + $4bdc]

; 08178F8A:  6808       ldr r0, [r1, #0]
; 08178F8C:  1A80       sub r0, r0, r2      ; 
; 08178F8E:  6008       str r0, [r1, #0]    ; [r1] = [r1] - r2
    ldr r0, [r1, #0]      ; r0 = [r1]
    add r0, r0, r2        ; r0 += r2

    ; 因为 r2 在之后的代码通过 ldr 赋值了,可以用来随意修改而不必备份
    ldr r2, =#999999      ; 防止数据过大溢出
    cmp r0, r2
  ble FF2_SKIP_RESET_MONEY
    mov r0, r2
  FF2_SKIP_RESET_MONEY:
    ldr r2, =FN_FF2_CONTINUE + 1
    bx r2
.pool
; ------------------------------------------------------------------------------


; ------------------------------------------------------------------------------
.Close
; ------------------------------------------------------------------------------

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

评论区