本站第一萌新 发表于 2020-5-2 21:06:30

ASM杂项集合【802/绿宝石】

本帖最后由 本站第一萌新 于 2021-7-27 15:59 编辑

来这个论坛已经有不少时间了,一直也没什么好分享的,随便改一点以前写过的ASM代码给入门者参考一下吧。(虽然现在用ASM意义不大了:()
前排提示:本人也是新手,编程方面完全是业余水平,故逻辑可能不是特别清楚。如有错误欢迎大佬指正。
蓝本:绿宝石802 3.0版本 理论上绿宝石原版也可以,如果遇到只适用于802 3.0版本的我会标注。本人主要使用绿宝石802作为蓝本,固可能有不少只适用于802的例程
工具:armips
文中需要的文件以及放在下方
注意:绿宝石802的精灵数据没有加密,而原版绿宝石是有加密的。所以有的例程我虽然没有标出仅适用于802,但可能并不适用于原版绿宝石!如果想要解决此问题,请使用下面的《解除原版绿宝石精灵加密检测》!
欢迎各位改版者用于改版,但请使用前至少留个言!
目录:
内置内存锁
滚动式多选框
洗髓丹
恢复之石
穿墙术
多初始宠
禁止购买作弊
std0显示道具图片
64X64头像
精灵献祭
火箭队扭蛋机
恐惧黑802
觉醒石
脚本执行器
所有野生精灵闪光
显示觉醒力量属性,威力
昼夜不同调色板
随机对战
王者状态
能力值界面查看精灵个体,努力
死亡模式
精灵可使用对应属性的野外技能
命名界面支持中文输入
随机商店
简易个体努力查看器
修改等级上限
802大师球修复
梦特系统
战斗条款
全随机
不遇敌
火箭队模式
明雷
解除原版绿宝石精灵加密检测
调高闪光率

本站第一萌新 发表于 2020-5-2 21:07:51

本帖最后由 本站第一萌新 于 2020-5-6 07:32 编辑

搭建内置金手指(内存锁)系统
本系统并不是实现了真正的锁住内存,而是不停往指定内存里写数据
此系统根据输入数据的大小来判断应该用什么指令储存,但事实上有时我们要求将某一区域的值全部写0。有兴趣者可以自行更改程序
和初始村中蓝色胖子对话查看效果.gba
.thumb
.loadtable "header/CharTable.txt"
.include "header/ArmipsMacros.asm"
.create "3.0.gba",0x8000000
.close
.open "test.gba","3.0.gba", 0x8000000

.org 0x08F80000
.func GoldfingerPutIn
        push {r4-r5, lr}
        ldr r0, =0x020375E0
        ldrh r0,
        lsl r0, #3
        ldr r2, =0x0203F000
        add r0, r2
        mov r1, r2
        add r1, #40
        ldr r2,
        str r2,
        ldr r2,
        str r2,
        ldr r0, =(Task_GfProcessInput|1)
        mov r1, #0
        ldr r3, =(0x080A8FB0|1)
        bl call_bx
        ldr r5, =0x03005E00
        mov r1, #40
        mul r0, r1
        add r5, r0
        mov r0, #0 ;X
        mov r1, #0 ;Y
        mov r2, #18 ;W
        mov r3, #2 ;H
        ldr r4, =(0x080E2A1C|1)
        bl call_bx2
        strh r0, ;twindowId
        mov r1, #0
        strh r1, ;tstate
        mov r1, #3
        strh r1, ;tslot
        mov r1, #0
        ldr r3, =(0x08197854|1)
        bl call_bx
        mov r0, #0
        ldr r3, =(0x081999BC|1)
        bl call_bx
        pop {r4-r5, pc}
.endfunc
.pool

.func Task_GfProcessInput
        push {r4-r6, lr}
        mov r4, r0
        ldr r6, =0x03005E00
        mov r1, #40
        mul r0, r1
        add r6, r0
        ldrh r5, ;twindowId
        ldrh r0, ;tstate
        cmp r0, #0
        beq ShowGoldfinger
        ldr r0, =0x030022C0
        ldrh r0,
        cmp r0, #1
        beq A_Pressed
        cmp r0, #2
        beq B_Pressed
        cmp r0, #0x10
        beq Right_Pressed
        cmp r0, #0x20
        beq Left_Pressed
        cmp r0, #0x40
        beq Up_Pressed
        cmp r0, #0x80
        beq Down_Pressed
        b InputEnd
A_Pressed:
        ldr r0, =0x020375E0
        ldrh r0,
        lsl r0, #3
        ldr r2, =0x0203F000
        add r0, r2
        mov r1, r2
        add r1, #40
        ldr r2,
        str r2,
        ldr r2,
        str r2,
        mov r2, #0
        str r2,
        str r2,
        ldr r0, =0x020375E0
        mov r1, #1
        strh r1,
        b DeleteTaskAndFreeWindow
B_Pressed:
        mov r2, #0
        str r2,
        str r2,
        ldr r0, =0x020375E0
        mov r1, #0
        strh r1,
DeleteTaskAndFreeWindow:
        mov r0, r4
        ldr r3, =(0x080A909C|1)
        bl call_bx
        mov r0, r5
        ldr r3, =(0x080E2A78|1)
        bl call_bx
        b InputEnd
Right_Pressed:
        ldrb r0,
        cmp r0, #4
        beq InputEnd
        cmp r0, #0
        beq ChangeSide1
        sub r0, #1
        b UpdateNumber1
ChangeSide1:
        mov r0, #7
UpdateNumber1:
        strb r0,
        mov r1, r5
        bl UpdateGoldfinger
        b InputEnd
Left_Pressed:
        ldrb r0,
        cmp r0, #3
        beq InputEnd
        cmp r0, #7
        beq ChangeSide2
        add r0, #1
        b UpdateNumber2
ChangeSide2:
        mov r0, #0
UpdateNumber2:
        strb r0,
        mov r1, r5
        bl UpdateGoldfinger
        b InputEnd
Up_Pressed:
        ldrb r0,
        ldr r1, =0x0203F000
        add r1, #40
        ldrb r2,
        cmp r2, #0xFF
        bge InputEnd
        add r2, #1
        strb r2,
        mov r1, r5
        bl UpdateGoldfinger
        b InputEnd
Down_Pressed:
        ldrb r0,
        ldr r1, =0x0203F000
        add r1, #40
        ldrb r2,
        cmp r2, #0
        ble InputEnd
        sub r2, #1
        strb r2,
        mov r1, r5
        bl UpdateGoldfinger
        b InputEnd
ShowGoldfinger:
        mov r0, #3
        mov r1, r5
        bl UpdateGoldfinger
        mov r0, #1
        strh r0,
InputEnd:
        pop {r4-r6, pc}
.endfunc
.pool

.func UpdateGoldfinger
        push {r4-r7, lr}
        add sp, #-8
        mov r7, r0
        mov r5, r1
        mov r0, r1
        mov r1, #17
        ldr r3, =(0x08003C48|1)
        bl call_bx
        mov r6, #0
PrintPointerLoop:
        cmp r6, #4
        bge PrintColon
        mov r0, r6
        mov r1, r7
        mov r2, r5
        bl PrintNumberWithClour
        add r6, #1
        b PrintPointerLoop
PrintColon:
        mov r0, #0
        str r0,
        str r0,
        mov r0, r5
        ldr r1, =gText_Colon
        mov r2, #65
        mov r3, #1
        ldr r4, =(0x080E04A4|1)
        bl call_bx2
PrintInputLoop:
        cmp r6, #8
        bge PrintEnd
        mov r0, r6
        mov r1, r7
        mov r2, r5
        bl PrintNumberWithClour
        add r6, #1
        b PrintInputLoop
PrintEnd:
        add sp, #8
        pop {r4-r7, pc}
.endfunc
.pool

.func PrintNumberWithClour
        push {r4-r7, lr}
        add sp, #-8
        mov r5, r0
        mov r6, r1
        mov r7, r2
        ldr r0, =0x02021FC4
        ldr r1, =0x0203F000
        add r1, #40
        ldrb r1,
        mov r2, #2
        mov r3, #2
        ldr r4, =(0x08008E20|1)
        bl call_bx2
        cmp r5, r6
        bne NotHighLight
        ldr r0, =0x02021EC4
        ldr r1, =gText_HignLight
        ldr r3, =(0x08008EE0|1)
        bl call_bx
        ldr r0, =0x02021EC4
        ldr r1, =0x02021FC4
        ldr r3, =(0x08008BC0|1)
        bl call_bx
        mov r0, #0
        str r0,
        str r0,
        mov r0, r7
        ldr r1, =0x02021EC4
        ldr r2, =poi
        ldr r2,
        mov r3, #1
        ldr r4, =(0x080E04A4|1)
        bl call_bx2
        b PrintWithColourEnd
NotHighLight:
        mov r0, #0
        str r0,
        str r0,
        mov r0, r7
        ldr r1, =0x02021FC4
        ldr r2, =poi
        ldr r2,
        mov r3, #1
        ldr r4, =(0x080E04A4|1)
        bl call_bx2
PrintWithColourEnd:
        add sp, #8
        pop {r4-r7, pc}
.endfunc
.pool

.func GoldfingerRun
        mov r4, #0
RunGfLoop:
        cmp r4, #6
        bge LoopEnd
        ldr r0, =0x4012
        add r0, r4
        ldr r3, =(0x0809D790|1)
        bl call_bx
        cmp r0, #0
        beq PrepareForNext
        ldr r0, =0x0203F000
        lsl r1, r4, #3
        add r1, r0
        ldr r0,
        ldr r1,
        mov r2, #1
        neg r2, r2 ;0xFFFFFFFF
        lsr r3, r2, #24 ;0xFF
        cmp r1, r3
        bls OneByte
        lsr r3, r2, #16 ;0xFFFF
        cmp r1, r3
        bls TwoByte
        str r1,
        b PrepareForNext
OneByte:
        strb r1,
        b PrepareForNext
TwoByte:
        strh r1,
PrepareForNext:
        add r4, #1
        b RunGfLoop
LoopEnd:
        ldrb r0,
        lsl r4, r0, #0x1F
        lsr r4, r4, #0x1F
        mov r1, #1
        ldr r3, =(0x08006A28|1)
        bx r3
.endfunc
.pool

.func DeleteGoldfinger
        ldr r0, =0x020375E0
        ldrh r0,
        lsl r0, #3
        ldr r1, =0x0203F000
        add r0, r1
        mov r1, #0
        str r1,
        str r1,
        bx lr
.endfunc
.pool

.func OpenGoldfinger
        push {lr}
        ldr r0, =0x020375E0
        ldrh r0,
        ldr r1, =0x4012
        add r0, r1
        ldr r3, =(0x0809D740|1)
        bl call_bx
        pop {pc}
.endfunc
.pool

.func CloseGoldfinger
        push {lr}
        ldr r0, =0x020375E0
        ldrh r0,
        ldr r1, =0x4012
        add r0, r1
        ldr r3, =(0x0809D768|1)
        bl call_bx
        pop {pc}
.endfunc
.pool

.func call_bx
        bx r3
.endfunc
.pool

.func call_bx2
        bx r4
.endfunc
.pool

poi:
.byte 49, 33, 17, 1, 129, 113, 97, 80

gText_Colon:
.string ":"

gText_HignLight:
.string "[文本色_红]"

Script_BiGoldfinger:
        lock
        faceplayer
        msgbox gText_Weclome, 0x6
Script_ChooseGf:
        preparemsg gText_ChooseGf
        waitmsg
        multichoice 0x0, 0x0, 0x74, 0x00 ;如果你打算手动扩充或者修改了下面写入的地址,把0x74改成你的多选框Id
        compare 0x800D, 0x7F
        if1 0x1, Script_End
        copyvar 0x8004, 0x800D
Script_ChooseOperate:
        preparemsg gText_ChooseOperate
        waitmsg
        multichoice 0x0, 0x0, 0x75, 0x00 ;如果你打算手动扩充或者修改了下面写入的地址,把0x75改成你的多选框Id
        compare 0x800D, 0x7F
        if1 0x1, Script_ChooseGf
        compare 0x800D, 0x0
        if1 0x1, Script_OpenGf
        compare 0x800D, 0x1
        if1 0x1, Script_CloseGf
        compare 0x800D, 0x2
        if1 0x1, Script_AddGf
        callasm (DeleteGoldfinger|1)
        msgbox gText_DeleteSuccess, 0x6
        goto Script_ChooseOperate
Script_OpenGf:
        callasm (OpenGoldfinger|1)
        msgbox gText_OpenSuccess, 0x6
        goto Script_ChooseOperate
Script_CloseGf:
        callasm (CloseGoldfinger|1)
        msgbox gText_CloseSuccess, 0x6
        goto Script_ChooseOperate
Script_AddGf:
        preparemsg gText_PleaseAddGf
        waitmsg ;这个waitmsg非常重要,因为文本框也是用的第四个buffer,必须等待文本输出完毕
        callasm (GoldfingerPutIn|1)
        waitkeypress
        compare 0x800D, 0x0
        if1 0x1, Script_AddCancel
        msgbox gText_AddSuccess, 0x6
        goto Script_ChooseOperate
Script_AddCancel:
        msgbox gText_AddCancel, 0x6
        goto Script_ChooseOperate
Script_End:
        release
        end

.align 4
Mult_ChooseSlot:
.word gText_Goldfinger1
.word 0x0
.word gText_Goldfinger2
.word 0x0
.word gText_Goldfinger3
.word 0x0
.word gText_Goldfinger4
.word 0x0
.word gText_Goldfinger5
.word 0x0
Mult_Operate:
.word gText_OpenGf
.word 0x0
.word gText_CloseGf
.word 0x0
.word gText_AddGf
.word 0x0
.word gText_DeleteGf
.word 0x0

gText_Goldfinger1:
.string "金手指一"

gText_Goldfinger2:
.string "金手指二"

gText_Goldfinger3:
.string "金手指三"

gText_Goldfinger4:
.string "金手指四"

gText_Goldfinger5:
.string "金手指五"

gText_OpenGf:
.string "开启金手指"

gText_CloseGf:
.string "关闭金手指"

gText_AddGf:
.string "添加金手指"

gText_DeleteGf:
.string "删除金手指"

gText_Weclome:
.string "欢迎使用内置金手指!"

gText_ChooseGf:
.string "请选择金手指槽:"

gText_ChooseOperate:
.string "请选择操作:"

gText_DeleteSuccess:
.string "成功删除金手指!"

gText_OpenSuccess:
.string "成功开启金手指!"

gText_CloseSuccess:
.string "成功关闭金手指!"

gText_PleaseAddGf:
.string "请输入金手指!"

gText_AddSuccess:
.string "成功添加金手指!"

gText_AddCancel:
.string "取消添加金手指!"

.org 0x08006A20 ;选择一个被调用及其频繁的地方
        ldr r3, =(GoldfingerRun|1)
        bx r3
.pool

.org 0x097003A0 ;这里是扩充多选框,注意此处是绿宝石802版本的。如果你用的是绿宝石原版请自行更改此地址(需要重定向)
.align 4
.word Mult_ChooseSlot
.word 0x05
.word Mult_Operate
.word 0x04

.org 0x089C0DFC
.word Script_BiGoldfinger

.close

本站第一萌新 发表于 2020-5-2 21:14:30

本帖最后由 本站第一萌新 于 2020-5-6 07:30 编辑

模仿jzw聚聚早期做的一个滚动式多选框(虽说是模仿其实我根本没看他的是怎么实现的,也没看效果,只是觉得创意不错就顺手写了一个).gba
.thumb
.create "3.0.gba",0x8000000
.close
.open "test.gba","3.0.gba", 0x8000000

.org 0x08F80000
.func RollingMul
        push {r4-r7, lr}
        ldr r0, =(Task_MulProcessInput|1)
        mov r1, #0
        ldr r4, =(0x080A8FB0|1)
        bl call_bx
        ldr r5, =0x03005E00
        mov r1, #40
        mul r0, r1
        add r5, r0
        mov r6, #0
        mov r7, #0
GetLengthLoop:
        ldr r0, =0x09700000 ;如果你用的绿宝石原版,这个改成绿宝石的多选框地址
        ldr r1, =0x020375E0
        ldrh r1, ;var8004 储存多选Id
        lsl r1, #3
        add r0, r1
        ldrb r1,
        cmp r6, r1
        bge LoopEnd
        ldr r1,
        lsl r0, r6, #3
        ldr r0,
        mov r1, r7
        ldr r4, =(0x080E2D2C|1)
        bl call_bx
        mov r7, r0
        add r6, #1
        b GetLengthLoop
LoopEnd:       
        mov r0, r7
        ldr r4, =(0x080E2D40|1)
        bl call_bx
        mov r2, r0
        ldr r1, =0x020375E0
        ldrh r0, ;var8005 储存X坐标
        ldrh r1, ;var8006 储存Y坐标
        mov r3, #10
        ldr r4, =(0x080E2A1C|1)
        bl call_bx
        strh r0, ;twindowId
        mov r1, #0
        strh r1, ;tchoice
        strh r1, ;tstate
        mov r5, r0
        mov r1, #0
        ldr r4, =(0x08197854|1)
        bl call_bx
        mov r0, #0
        ldr r4, =(0x081999BC|1)
        bl call_bx
        mov r0, r5
        mov r1, #0
        bl UpdateChoices
        pop {r4-r7, pc}
.endfunc
.pool

.func Task_MulProcessInput ;r0 = taskId
        push {r4-r7, lr}
        mov r5, r0
        ldr r2, =0x03005E00
        mov r1, #40
        mul r0, r1
        add r2, r0
        ldrh r6,
        mov r7, r2
        ldrh r0,
        cmp r0, #0
        beq InputEnd
        ldr r0, =0x030022C0
        ldrh r0,
        cmp r0, #1
        beq A_Pressed
        cmp r0, #2
        beq B_Pressed
        cmp r0, #0x40
        beq Up_Pressed
        cmp r0, #0x80
        beq Down_Pressed
        b InputEnd
A_Pressed:
        ldr r0, =0x020375E0
        ldrh r7,
        strh r7,
        b DeleteTaskAndFreeWindow
B_Pressed:
        ldr r0, =0x020375E0
        mov r1, #0x7F
        strh r1,
        b DeleteTaskAndFreeWindow
Up_Pressed:
        ldrh r1,
        cmp r1, #0
        ble InputEnd
        sub r1, #1
        strh r1,
        mov r0, r6
        bl UpdateChoices
        b InputEnd
Down_Pressed:
        ldr r0, =0x09700000 ;如果你用的绿宝石原版,这个改成绿宝石的多选框地址
        ldr r1, =0x020375E0
        ldrh r1,
        lsl r1, #3
        add r0, r1
        ldrb r0,
        sub r0, #1
        ldrh r1,
        cmp r1, r0
        bge InputEnd
        add r1, #1
        strh r1,
        mov r0, r6
        bl UpdateChoices
        b InputEnd
DeleteTaskAndFreeWindow:
        mov r0, r5
        ldr r4, =(0x080A909C|1)
        bl call_bx
        mov r0, r6
        ldr r4, =(0x080E2A78|1)
        bl call_bx
InputEnd:
        mov r0, #1
        strh r0,
        pop {r4-r7, pc}
.endfunc
.pool

.func UpdateChoices ;r0 = windowId r1 = 选中选项
        push {r4-r7, lr}
        mov r4, r8
        push {r4}
        add sp, #-8
        mov r8, r0
        mov r6, r1
        mov r1, #17
        ldr r4, =(0x08003C48|1)
        bl call_bx
        mov r7, #0
        sub r5, r6, #2
PrintChoiceLoop:
        cmp r7, #5
        bge PrintEnd
        mov r0, #2
        sub r0, r7
        cmp r6, r0
        blt Skip
        ldr r0, =0x09700000 ;如果你用的绿宝石原版,这个改成绿宝石的多选框地址
        ldr r1, =0x020375E0
        ldrh r1,
        lsl r1, #3
        add r0, r1
        ldrb r1,
        cmp r5, r1
        bge Skip
        mov r1, #0
        str r1,
        str r1,
        ldr r0,
        lsl r1, r5, #3
        ldr r1,
        lsl r3, r7, #4
        add r3, #1
        mov r0, r8
        mov r2, #8
        ldr r4, =(0x080E04A4|1)
        bl call_bx
Skip:
        add r7, #1
        add r5, #1
        b PrintChoiceLoop
PrintEnd:       
        mov r0, r8
        ldr r1, =gText_Arrow
        mov r2, #0
        mov r3, #0x21
        ldr r4, =(0x080E04A4|1)
        bl call_bx
        add sp, #8
        pop {r4}
        mov r8, r4
        pop {r4-r7, pc}
.endfunc
.pool

.func call_bx
        bx r4
.endfunc
.pool

gText_Arrow:
.byte 0xEF, 0xFF

.close示例脚本:
lock
faceplayer
preparemsg 0x和多选框同时出现的文本地址
setvar 0x8004 多选Id
setvar 0x8005 X坐标
setvar 0x8006 Y坐标
callasm 0xF80001 //显示多选框
waitkeypress //需使用 waitkeypress 辅助
msgbox 0x选完后的文本地址 0x6
release
end

本站第一萌新 发表于 2020-5-2 21:18:11

本帖最后由 本站第一萌新 于 2020-5-2 21:19 编辑

前面发的可能不适于纯新手。今天最后发个入门级别的。明天再更新吧。不然貌似违反版规了。
使得指定位置的精灵变成6V.gba
.thumb
.create "3.0.gba",0x8000000
.close
.open "test.gba","3.0.gba", 0x8000000

.org 0x08F80000
.func ChangePMTo6V
        push {r4-r5, lr}
        add sp, #-4
        ldr r0, =0x020375E0 ;var8004中储存所选PM在队伍中的位置
        ldrh r0,
        mov r1, #0x64
        mul r0,r1
        ldr r4, =0x020244EC
        add r4, r0
        mov r5, #0
ChangeLoop:
        mov r1, #0x27
        add r1, r5
        mov r0, #0x1F
        str r0,
        mov r2, sp
        mov r0, r4
        ldr r3, =(0x0806ACAC|1)
        bl call_bx
        add r5, #1
        cmp r5, #5
        bls ChangeLoop
LoopEnd:
        mov r0, r4
        ldr r3, =(0x08068D0C|1)
        bl call_bx
        add sp, #4
        pop {r4-r5, pc}
.endfunc
.pool
       
.func call_bx
        bx r3
.endfunc
.pool

.close
示例脚本:
lock
faceplayer
msgbox 文本 6
special 0xA2
waitstate
callasm 插入位置 //记得加一
msgbox 文本 6
end

jiangzhengwenjz 发表于 2020-5-2 22:34:57

本站第一萌新 发表于 2020-5-2 21:18
前面发的可能不适于纯新手。今天最后发个入门级别的。明天再更新吧。不然貌似违反版规了。
使得指定位置的 ...

It's OK.
每条回复有独立内容,你想连发多少都可以

本站第一萌新 发表于 2020-5-3 08:24:11

jiangzhengwenjz 发表于 2020-5-2 22:34
It's OK.
每条回复有独立内容,你想连发多少都可以

好的{:5_doge01:}

本站第一萌新 发表于 2020-5-3 08:28:10

走一步恢复全队精灵10点血量.gba
.thumb
.create "3.0.gba",0x8000000
.close
.open "test.gba","3.0.gba", 0x8000000

.org 0x08F80000
.func RcoverStone
        push {lr}
        lsl r0, r0, #24
        lsr r1, r0, #24
        push {r1, r4-r6}
        add sp, #-4
        mov r4, #0
RcoverLoop:
        ldr r0, =0x020244E9
        ldrb r0,
        cmp r4, r0
        bge LoopEnd
        ldr r5, =0x020244EC
        mov r0, #100
        mul r0, r4
        add r5, r0
        mov r0, r5
        mov r1, #0x3A
        mov r2, #0
        ldr r3, =(0x0806A518|1)
        bl call_bx
        mov r6, r0
        mov r0, r5
        mov r1, #0x39
        mov r2, #0
        ldr r3, =(0x0806A518|1)
        bl call_bx
        add r0, #10
        cmp r0, r6
        bge MoreThanMax
        mov r6, r0
MoreThanMax:
        mov r0, r6
        str r0,
        mov r2, sp
        mov r0, r5
        mov r1, #0x39
        ldr r3, =(0x0806ACAC|1)
        bl call_bx
        add r4, #1
        b RcoverLoop
LoopEnd:
        add sp, #4
        pop {r1, r4-r6}
        cmp r1, #0x33
        ldr r3, =(0x080846FE|1)
        bx r3
.endfunc
.pool

.func call_bx
        bx r3
.endfunc
.pool

.org 0x080847F8
        ldr r3, =(RcoverStone|1)
        bx r3
.pool

.close

本站第一萌新 发表于 2020-5-3 08:32:49

根据flag0x4012的值判断是否开启穿墙
和初始村蓝胖对话查看效果.gba
.thumb
.loadtable "header/CharTable.txt"
.include "header/ArmipsMacros.asm"
.create "3.0.gba",0x8000000
.close
.open "test.gba","3.0.gba", 0x8000000

.org 0x08F80000
.func AcrossWall
        push {r4}
        mov r8, r0
        ldr r0, =0x4012
        ldr r3, =(0x0809D790|1)
        bl call_bx
        cmp r0, #0
        bne CanAcrossWall
        mov r0, r8
        mov r1, r5
        mov r2, r4
        mov r3, r6
        ldr r4, =(0x08092BC8|1)
        bl call_bx2
        b Back
CanAcrossWall:
        mov r0, #0
Back:
        pop {r4}
        ldr r3, =(0x0808B0C8|1)
        bx r3
.endfunc
.pool

.func call_bx
        bx r3
.endfunc
.pool

.func call_bx2
        bx r4
.endfunc
.pool

Script_AcrossWall:
        lock
        faceplayer
        checkflag 0x4012
        if1 0x0, Script_Open
        clearflag 0x4012
        msgbox gText_Close, 0x6
        release
        end
Script_Open:
        setflag 0x4012
        msgbox gText_Open, 0x6
        release
        end
       
gText_Close:
.string "关闭穿墙术!"

gText_Open:
.string "打开穿墙术!"

.org 0x0808B0C0
        ldr r3, =(AcrossWall|1)
        bx r3
.pool

.org 0x089C0DFC
.word Script_AcrossWall

.close这个解法可能不是最优的。貌似可以不用hook实现穿墙。

本站第一萌新 发表于 2020-5-3 08:43:25

本帖最后由 本站第一萌新 于 2020-5-29 17:36 编辑

很久以前写的了类似究极绿宝石那样的初始宠物系统,可以选择1-7代所有初始宠物。不过我看了一下这个应该和究极绿的实现方式不同。
注意1:此代码未经试验,因为我当时并没有研究主角选择的宠物对劲敌所选宠物的影响。所以此系统可以可能造成各种各样的BUG,请谨慎使用!
注意2:此代码仅适用于绿宝石802,当然,如果你的ROM也支持802只精灵且顺序和正版一样的话那也没有问题.gba
.thumb
.create "3.0.gba",0x8000000
.close
.open "test.gba","3.0.gba", 0x8000000

.org 0x08F80000
.func SaveStarterMonHack
        ldr r0, =0x020375F0
        ldrh r0,
        str r0,
        mov r1, #3
        ldr r3, =(0x082E7650|1)
        bl call_bx
        ldr r1, =0x02026DE2
        strh r0,
        ldr r0,
        ldr r3, =(0x080B116A|1)
        bx r3
.endfunc
.pool

.func call_bx
        bx r3
.endfunc
.pool

.align 2
NewsPokeballCoords:
.byte 0x3C, 0x40
.byte 0x78, 0x58
.byte 0xB4, 0x40
.byte 0x3C, 0x40
.byte 0x78, 0x58
.byte 0xB4, 0x40
.byte 0x3C, 0x40
.byte 0x78, 0x58
.byte 0xB4, 0x40
.byte 0x3C, 0x40
.byte 0x78, 0x58
.byte 0xB4, 0x40
.byte 0x3C, 0x40
.byte 0x78, 0x58
.byte 0xB4, 0x40
.byte 0x3C, 0x40
.byte 0x78, 0x58
.byte 0xB4, 0x40
.byte 0x3C, 0x40
.byte 0x78, 0x58
.byte 0xB4, 0x40
NewLabelCoords:
.byte 0x00, 0x09
.byte 0x10, 0x0A
.byte 0x08, 0x04
.byte 0x00, 0x09
.byte 0x10, 0x0A
.byte 0x08, 0x04
.byte 0x00, 0x09
.byte 0x10, 0x0A
.byte 0x08, 0x04
.byte 0x00, 0x09
.byte 0x10, 0x0A
.byte 0x08, 0x04
.byte 0x00, 0x09
.byte 0x10, 0x0A
.byte 0x08, 0x04
.byte 0x00, 0x09
.byte 0x10, 0x0A
.byte 0x08, 0x04
.byte 0x00, 0x09
.byte 0x10, 0x0A
.byte 0x08, 0x04
NewHandsPosition:
.byte 0x3C, 0x20
.byte 0x78, 0x38
.byte 0xB4, 0x20
.byte 0x3C, 0x20
.byte 0x78, 0x38
.byte 0xB4, 0x20
.byte 0x3C, 0x20
.byte 0x78, 0x38
.byte 0xB4, 0x20
.byte 0x3C, 0x20
.byte 0x78, 0x38
.byte 0xB4, 0x20
.byte 0x3C, 0x20
.byte 0x78, 0x38
.byte 0xB4, 0x20
.byte 0x3C, 0x20
.byte 0x78, 0x38
.byte 0xB4, 0x20
.byte 0x3C, 0x20
.byte 0x78, 0x38
.byte 0xB4, 0x20
NewsStarterMon:
.halfword 0x1, 0x4, 0x7
.halfword 0x98, 0x9B, 0x9E
.halfword 0x115, 0x118, 0x11B
.halfword 0x1B8, 0x1BB, 0x1BE
.halfword 0x224, 0x227, 0x22A
.halfword 0x2BF, 0x2C2, 0x2C5
.halfword 0x307, 0x30A, 0x30D

.org 0x0813431E
        cmp r4, #19
.pool

.org 0x08133EE2
        cmp r1, #21
.pool

.org 0x081341D8
.word NewsPokeballCoords

.org 0x081342E4
.word NewsPokeballCoords

.org 0x081345F0
.word NewLabelCoords

.org 0x08133EF4
.word NewsStarterMon

.org 0x08134734
.word NewHandsPosition

.org 0x080B115C
        ldr r3, =(SaveStarterMonHack|1)
        bx r3
.pool

.close

本站第一萌新 发表于 2020-5-3 09:14:18

一个对于积极禁金的人来说可能较有用的代码
在确认支付时会检查现在在购买的商品是否在商店列表中,如果不是则提示请不要作弊
注意1:此代码仅能防住03005E12 XXXX这类金手指,并不能防住直接更改商店商品的金手指
注意2:请打开CharTable.txt,在末尾输入FC09=[按键] 当然如果你懒的搞直接用十六进制写进去也行.gba
.thumb
.loadtable "header/CharTable.txt"
.create "3.0.gba",0x8000000
.close
.open "test.gba","3.0.gba", 0x8000000

.org 0x08F80000
.func AntiBuyCheat
        ldr r3, =0x02039F68
        ldr r3,
Check:
        ldrh r2,
        cmp r0, r2
        beq DontCheat
        cmp r2, #0x0
        beq HasCheat
        add r3, #0x2
        b Check
DontCheat:
        ldr r3, =(0x080D6928|1)
        bl call_bx
        ldr r3, =(0x080E0F08|1)
        bx r3
HasCheat:
        ldr r1, =gText_DontCheat
        ldr r3, =(0x080E0F32|1)
        bx r3
.endfunc
.pool

.func call_bx
        bx r3
.endfunc
.pool

gText_DontCheat:
.string "请不要作弊![按键]"

.org 0x080E0F00
        ldr r3, =(AntiBuyCheat|1)
        bx r3
.pool

.close
       

本站第一萌新 发表于 2020-5-3 09:21:08

修改std0, 使得NPC给道具的时候可以显示出道具图片
我这里是使用OBJ实现的,貌似std1使用的不是这种方法.gba
.thumb
.include "header/ArmipsMacros.asm"
.create "3.0.gba",0x8000000
.close
.open "test.gba","3.0.gba", 0x8000000

.org 0x08F80000
.func ShowItemSprite
        push {r4-r5, lr}
        add sp, #-24
        ldr r0, =0x200
        ldr r4, =(0x08000B4C|1)
        bl call_bx
        str r0,
        ldr r0, =0x120 ;24X24
        bl call_bx
        str r0, ;buffer4x4
        ldr r0, =0x020375D8
        ldrh r0,
        lsl r0, #3
        ldr r5, =0x08FCBFF4 ;这个地方是绿宝石802的道具图片结构体(不知道怎么解释)数据地址,如果你用的绿宝石原版请自行搜索对应数据更改
        add r5, r0
        ldr r0,
        ldr r1,
        swi #0x11
        ldr r0,
        ldr r1,
        ldr r4, =(0x081AFE44|1)
        bl call_bx
        ldr r0,
        mov r1, sp
        str r0,
        ldr r0, =0x200
        strh r0,
        ldr r0, =0x1300
        strh r0,
        add r0, sp, #8
        ldr r4, =(0x080084F8|1)
        bl call_bx
        ldr r0,
        mov r1, sp
        str r0,
        ldr r0, =0x1300
        strh r0,
        add r0, sp, #16
        ldr r4, =(0x0803458C|1)
        bl call_bx
        ldr r0, =SpriteTemplate
        mov r1, #0xDA
        mov r2, #0x88
        mov r3, #0
        ldr r4, =(0x08006DF4|1)
        bl call_bx
        ldr r1, =0x020375D8
        strb r0,
        ldr r0,
        ldr r4, =(0x08000B60|1)
        bl call_bx
        ldr r0,
        bl call_bx
        add sp, #24
        pop {r4-r5, pc}
.endfunc
.pool

.func DeleteItemSprite
        push {r4, lr}
        ldr r0, =0x020375D8
        ldrb r0,
        mov r1, #0x44
        mul r0, r1
        ldr r2, =0x02020630
        add r0, r2
        ldr r4, =(0x08007620|1)
        bl call_bx
        pop {r4, pc}
.endfunc
.pool

.func call_bx
        bx r4
.endfunc
.pool

.align 4
OamData:
.halfword 0x0 ;方形
.halfword 0x8000 ;32X32
.halfword 0x0

.align 4       
SpriteTemplate:
.halfword 0x1300
.halfword 0x1300
.word OamData
.word 0x08614FF0
.word 0x0
.word 0x082EC6A8
.word (0x08007428|1)

ScriptGiveItem:
        callasm (ShowItemSprite|1)
        additem 0x8000, 0x8001
        copyvar 0x8007, LASTRESULT
        call 0x8271AE3
        callasm (DeleteItemSprite|1)
        return

.org 0x081DC2A0
.word ScriptGiveItem

.close

本站第一萌新 发表于 2020-5-3 09:25:27

本帖最后由 本站第一萌新 于 2020-5-3 09:29 编辑

显示隐藏64X64头像,应该比贴吧早期翻译的那个老外的要更安全
不过由于是随手写的,所以并没有翻转等各种功能,有兴趣可以自行实现.gba
.thumb
.create "3.0.gba",0x8000000
.close
.open "test.gba","3.0.gba", 0x8000000

.org 0x08F80000
.func ShowMugshots
        push {r4, lr}
        add sp, #-16
        ldr r0, =0x08F85000 ;头像表 [图片1][色盘1] [图片2][色盘2] [图片3][色盘3] ... 可以自行更改位置
        ldr r1, =0x020375E0
        ldrh r1,
        lsl r1, #3
        add r4, r0, r1
        mov r1, sp
        ldr r0,
        str r0,
        mov r0, #1
        lsl r0, #11 ;0x800
        strh r0,
        ldr r0, =0x1300
        strh r0,
        mov r0, r1
        ldr r3, =(0x08034530|1)
        bl call_bx
        add r1, sp, #8
        ldr r0,
        str r0,
        ldr r0, =0x1300
        strh r0,
        mov r0, r1
        ldr r3, =(0x0803458C|1)
        bl call_bx
        ldr r0, =SpriteTemplate
        mov r1, #0x25
        mov r2, #0x55
        mov r3, #0
        ldr r4, =(0x08006DF4|1)
        bl call_bx2
        ldr r1, =0x020375E0
        strb r0,
        add sp, #16
        pop {r4, pc}
.endfunc
.pool
       
.func DeleteMugshots
        push {lr}
        ldr r0, =0x020375E0
        ldrb r0,
        mov r1, #0x44
        mul r0, r1
        ldr r2, =0x02020630
        add r0, r2
        ldr r3, =(0x08007620|1)
        bl call_bx
        pop {pc}
.endfunc
.pool

.func call_bx
        bx r3
.endfunc
.pool

.func call_bx2
        bx r4
.endfunc
.pool

.align 4
OamData:
.halfword 0x0 ;方形
.halfword 0xC000 ;64X64
.halfword 0x0

.align 4       
SpriteTemplate:
.halfword 0x1300
.halfword 0x1300
.word OamData
.word 0x08614FF0
.word 0x0
.word 0x082EC6A8
.word (0x08007428|1)
       
.close
var8004里面储存头像在头像表ID

本站第一萌新 发表于 2020-5-3 14:54:52

一个简单的源码,删除首位精灵,将其个体值复制给后面一只精灵,并将后面所有精灵向前移动一位.gba
.thumb
.create "3.0.gba",0x8000000
.close
.open "test.gba","3.0.gba", 0x8000000

.org 0x08F80000
.func Sacrifice
        push {r4, lr}
        add sp, #-4
        ldr r0, =0x020244E9
        ldrb r0,
        cmp r0, #2
        blt Wrong
        mov r4, #0
SacrificeLoop:
        cmp r4, #6
        bge DeletePoke
        ldr r0, =0x020244EC
        mov r1, #0x27
        add r1, r4
        mov r2, #0
        ldr r3, =(0x0806A518|1)
        bl call_bx
        str r0,
        mov r2, sp
        ldr r0, =0x020244EC
        add r0, #100
        mov r1, #0x27 ;HP_IV
        add r1, r4
        ldr r3, =(0x0806ACAC|1)
        bl call_bx
        add r4, #1
        b SacrificeLoop
DeletePoke:
        mov r4, #0
DeletePokeLoop:
        ldr r0, =0x020244E9
        ldrb r0,
        sub r0, #1
        cmp r4, r0
        bge LoopEnd
        ldr r0, =0x020244EC
        mov r1, #100
        mul r1, r4
        add r0, r1 ;精灵地址
        mov r1, r0
        add r1, #100
        mov r2, #100
        ldr r3, =(0x0806B408|1)
        bl call_bx
        add r4, #1
        b DeletePokeLoop
LoopEnd:
        ldr r0, =0x020244E9
        ldrb r0,
        sub r0, #1
        mov r1, #100
        mul r0, r1
        ldr r1, =0x020244EC
        add r0, r1
        ldr r3, =(0x08067A8C|1)
        bl call_bx
        ldr r0, =0x020244EC
        ldr r3, =(0x08068D0C|1)
        bl call_bx
        mov r1, #1
        b Back
Wrong:
        mov r1, #0
Back:
        ldr r0, =0x020375F0
        strh r1,
        add sp, #4
        pop {r4, pc}
.endfunc
.pool

.func call_bx
        bx r3
.endfunc
.pool

.close

本站第一萌新 发表于 2020-5-3 14:57:50

一个简单的源码,实现剑盾动漫中火箭队的扭蛋机 消耗一只喵喵 随机获得1-2只精灵.gba
.thumb
.loadtable "header/CharTable.txt"
.include "header/ArmipsMacros.asm"
.create "3.0.gba",0x8000000
.close
.open "test.gba","3.0.gba", 0x8000000

.org 0x08F80000
.func REggMachine
        push {r4-r5, lr}
        mov r4, #0
CheckMeowthLoop:
        cmp r4, #6
        bge NoMeowth
        ldr r0, =0x020244EC
        mov r1, #100
        mul r1, r4
        add r0, r1
        mov r1, #0xB
        mov r2, #0
        ldr r3, =(0x0806A518|1)
        bl call_bx
        cmp r0, #0x34 ;喵喵
        beq HasMeowth
        add r4, #1
        b CheckMeowthLoop
NoMeowth:
        mov r0, #0
        ldr r1, =0x020375F0
        strh r0,
        b Back
HasMeowth:
        ldr r0, =0x020244EC
        mov r1, #100
        mul r1, r4
        add r0, r1
        ldr r3, =(0x08067A8C|1)
        bl call_bx
        ldr r3, =(0x0806F5CC|1)
        bl call_bx
        mov r1, #1
        and r0, r1
        add r0, #1
        ldr r1, =0x020375F0
        strh r0,
        mov r4, r0
GivePokeLoop:
        cmp r4, #0
        ble Back
        ldr r3, =(0x0806F5CC|1)
        bl call_bx
        mov r1, #16
        lsl r1, #6
        add r1, #45 ;0x42D 绿宝石802有0x42D只精灵,如果你用的绿宝石改成绿宝石的精灵数
        ldr r3, =(0x082E7650|1)
        bl call_bx
        add r5, r0, #1
        mov r1, #2
        sub r0, r1, r4
        mov r1, #0xFF
        add r1, #1 ;0x100
        mul r0, r1
        ldr r1, =0x02021CC4
        add r0, r1
        ldr r1, =0x08F2B790
        mov r2, #11
        mul r2, r5
        add r1, r2
        ldr r3, =(0x08008B10|1)
        bl call_bx
        ldr r3, =(0x0806F5CC|1)
        bl call_bx
        mov r1, #100
        ldr r3, =(0x082E7650|1)
        bl call_bx
        add r1, r0, #1
        mov r0, r5
        mov r2, #0
        ldr r3, =(0x080F9244|1)
        bl call_bx
        sub r4, #1
        b GivePokeLoop
Back:
        pop {r4-r5, pc}
.endfunc
.pool

.func call_bx
        bx r3
.endfunc
.pool

Script_REggMachine:
        lock
        faceplayer
        msgbox gText_UseOrNot, 0x5
        compare 0x800D, 0x0
        if1 0x1, Script_End
        callasm (REggMachine|1)
        compare 0x800D, 0x1
        if1 0x0, Script_NoMeowth
        if1 0x1, Script_GetOnePoke
        msgbox gText_GetTwoPoke, 0x6
Script_End:       
        release
        end
Script_NoMeowth:
        msgbox gText_NoMeowth, 0x6
        release
        end
Script_GetOnePoke:
        msgbox gText_GetOnePoke, 0x6
        release
        end
       
gText_UseOrNot:
.string "是否使用秘密武器?"
       
gText_NoMeowth:
.string "队伍中没有喵喵!"

gText_GetOnePoke:
.string "获得了!"

gText_GetTwoPoke:
.string "获得了和!"

.org 0x089C0DFC
.word Script_REggMachine

.close

本站第一萌新 发表于 2020-5-3 15:09:16

绿宝石802 3.0专享:
由于802重写了伤害计算函数,此代码无法作用于绿宝石原版
制造恐惧黑中的ghost
专属技能:诅咒 无视一切秒杀,且不消耗PP
专属特性:恐惧 敌方会因为恐惧而无法行动
在选择初始宠物的时候会把ghost放到你的背包里
至于被击败的训练师变成墓碑没搞,有兴趣的可以自己去尝试实现
这个是好久以前搞得东西了,又因为是自娱自乐之作且有版本限制应该没人会要。故我也懒得去改写了,直接发出来供大家参考.gba
.thumb
.create "3.0.gba",0x8000000
.close
.open "picture.gba","3.0.gba", 0x8000000

.org 0x08F80000
DmgHack:
        ldr r3,
        add r3, #1
        str r3,
        ldr r0, =0x020241EA
        ldrh r0,
        mov r1, #180
        lsl r1, #2 ;诅咒技能代码:0x2D0
        cmp r0, r1
        bne DmgHackBack
        ldr r0, =0x020241F0
        mov r1, #1
        neg r1, r1
        strh r1,
        ldr r3, =0x0202427C
        mov r0, #0x10
        strb r0,
        ldr r3, =(0x08E1AB28|1)
        bx r3
DmgHackBack:
        mov r3, #0x58
        ldr r0, =(0x08E1A930|1)
        bx r0
CannotAttackHack:
        mov r2, #0
        ldr r0, =(0x02024084 + 32)
        mov r3, r0
CannotAttackHackLoop:
        ldrb r1,
        cmp r1, #0xE9 ;恐惧特性代码:0xE9
        beq CheckItSelfAbility
        add r0, #0x58
        add r2, #1
        cmp r2, #4
        blt CannotAttackHackLoop
CannotAttackHackBack:
        mov r2, #0x58
        mov r1, #8
        mul r2, r5
        ldr r3, =0x02024084
        ldr r0, =(0x08E0EB00|1)
        bx r0
CheckItSelfAbility:
        mov r0, #0x58
        mul r0, r5
        add r0, r3
        ldrb r0,
        cmp r0, #0xE9
        beq CannotAttackHackBack
        ldr r1, =(0x08E0EB10|1)
        bx r1
PPReduceHack:
        lsl r0, r0, #4
        and r4, r0
        cmp r4, #0
        bne NoPPReduce
        ldr r0, =0x020241EA
        ldrh r0,
        mov r1, #180
        lsl r1, #2
        cmp r0, r1
        beq NoPPReduce
        ldr r3, =(0x08046B04|1)
        bx r3
NoPPReduce:
        ldr r3, =(0x08046BDC|1)
        bx r3
GiveGhostToPlayer:
        mov r1, #5
        mov r2, #0
        ldr r3, =(0x080F9244|1)
        bl call_bx
        mov r0, #133
        lsl r0, #3
        add r0, #6 ;Ghost编号:0x42E
        mov r1, #1
        mov r2, #0
        ldr r3, =(0x080F9244|1)
        bl call_bx
        ldr r3, =(0x080B1182|1)
call_bx:
        bx r3
.pool
STR_CURSE:
.byte 0x0C, 0x12, 0x03, 0xC8, 0x0D, 0xA4, 0x07, 0x51, 0x03, 0x0B, 0x11, 0x1F, 0x10, 0xB5, 0x10, 0x7F, 0x08, 0x79, 0xB8, 0xFE, 0x0B, 0xF5, 0x03, 0x17, 0x03, 0xC0, 0x07, 0x5B, 0x08, 0xBC, 0x01, 0xB1, 0x0C, 0x63, 0xAD, 0xFF
STR_FRIGHTEN:
.byte 0x0B, 0xF5, 0x03, 0x17, 0x0F, 0x42, 0x07, 0xE4, 0x07, 0x95, 0x03, 0x9D, 0x03, 0x54, 0x02, 0xED, 0x01, 0xD6, 0x03, 0x0A, 0xFF
MOVES_TO_LEARN:
.halfword 0x2D0, 0x01, 0x00, 0xFF

.org 0x08E2D98A
.byte 0x9 ;属性:Egg

.org 0x08E2D98C
.byte 0x1 ;PP:1

.org 0x08E2D992
.byte 0x1 ;类型:特殊攻击

.org 0x08DFAFB0
.byte 0x11, 0x1F, 0x10, 0xB5, 0xFF ;技能名称:诅咒

.org 0x08DF593C
.word STR_CURSE

.org 0x08DEBC40
.word 0x082D3BFB ;使用鬼系诅咒的动画

.org 0x08DE5D05
.byte 0x07, 0xE4, 0x07, 0x95 ,0xFF ;特性名称:恐惧

.org 0x08DE44A4
.word STR_FRIGHTEN

.org 0x08F2E58A
.byte 0xC1, 0xDC, 0xE3, 0xE7, 0xE8, 0xFF ;精灵名称:Ghost

.org 0x08F22B90 ;精灵图象,自己导入和更换地址
.word 0x08F80110

.org 0x08F27690
.word 0x08F80530

.org 0x08F25110
.word 0x08F80558

.org 0x08F29C10
.word 0x08F80970

.org 0x08F2B0D8 ;使用 鬼斯通 的小图标以及 耿鬼 的图鉴(模仿究极绿的)
.word 0x08C6FBC4

.org 0x08F2B70E
.byte 0x02

.org 0x08F50BCA
.halfword 0x5E

.org 0x08F1FBE8 ;基本能力
.byte 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
.byte 0x09, 0x09
.byte 0xFF
.byte 0x00
.halfword 0x00
.halfword 0x00
.halfword 0x00
.byte 0xFF
.byte 0xFF
.byte 0xFF
.byte 0x05
.byte 0x0F, 0x0F
.byte 0xE9, 0xE9
.byte 0x00
.byte 0x04
.halfword 0x00

.org 0x08E21174
.word MOVES_TO_LEARN

.org 0x08E1A928
        ldr r3, =(DmgHack|1)
        bx r3
.pool

.org 0x08E0EAF8
        ldr r3, =(CannotAttackHack|1)
        bx r3
.pool

.org 0x08046AFC
        ldr r3, =(PPReduceHack|1)
        bx r3
.pool

.org 0x080B1178
        ldr r3, =(GiveGhostToPlayer|1)
        bx r3
.pool

.close
页: [1] 2 3 4 5 6
查看完整版本: ASM杂项集合【802/绿宝石】