Pokemon Center | 口袋中心 以口袋妖怪为主题并带有其他动漫游戏的讨论

标题: 求助,我写的特性未能达成想要的效果: [打印本页]

作者: 744865306    时间: 2021-7-25 20:39
标题: 求助,我写的特性未能达成想要的效果:
.gba
.thumb
.create "test.gba",0x8000000
.close
.open "绿宝石.gba","test.gba",0x8000000

.org 0x08F00000
.func new
        lsl r0,r0,#4
        and r4,r0
        cmp r4,#0
        bne NoPPReduce
        mov r1,#0x58
        ldr r0,=0x0202420B
        ldrb r0,[r0]
        mul r0,r1
        ldr r1,=0x020240A4
        add r0,r1
        ldrb r0,[r0]
        cmp r0, #79 ;"饱了又饿"特性编号
        beq yes1
end:
        ldr r3,=(0x08046B04|1)
        bx r3
yes1:
        ldr r0,=0x02024084
        ldrh r0,[r0]
        cmp r0,#1 ;空腹花纹编号
        bne changenull
        mov r1,#2 ;满腹花纹编号
keep:
        strh r1,[r0]
        b end
changenull:
        mov r1,#1 ;空腹花纹编号
NoPPReduce:
        ldr r3,=(0x08046BDC|1)
        bx r3
.endfunc
.pool

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

.close
作者: 744865306    时间: 2021-7-25 21:26
重新修改了下,不过还是没成功,话说果然只有电脑端能回复这么多行呢

.gba
.thumb
.create "test.gba",0x8000000
.close
.open "绿宝石.gba","test.gba",0x8000000

.org 0x08F00000
.func new
        lsl r0,r0,#4
        and r4,r0
        cmp r4,#0
        bne NoPPReduce
        mov r1,#0x58
        ldr r0,=0x0202420B
        ldrb r0,[r0]
        mul r0,r1
        ldr r1,=0x02024084
        add r0,r1
        add r0,#0x20
        ldrb r0,[r0]
        cmp r0, #79 ;"饱了又饿"特性编号
        beq yes1
end:
        ldr r3,=(0x08046B04|1)
        bx r3
yes1:
        ldr r3,=0x0202420B
        ldrb r3,[r3]
        mov r0,#0x58
        mul r3,r0
        add r1,r3
        ldrh r1,[r1]
        cmp r1,#1 ;空腹花纹编号
        bne changenull
        mov r0,#2 ;满腹花纹编号
keep:
        strh r0,[r1]
        b end
changenull:
        mov r0,#1 ;空腹花纹编号
NoPPReduce:
        ldr r3,=(0x08046BDC|1)
        bx r3
.endfunc
.pool

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

.close
作者: 本站第一萌新    时间: 2021-7-25 21:26
战斗中变更种族不是这么直接改的...不记得绿宝石里有没有了,反正802里面是有一个函数专门完成这个操作,逻辑如下:
  1. static void species_change(u8 bank, u16 new_species)
  2. {
  3.     battle_participants[bank].species = new_species;
  4.     active_bank = bank;
  5.     bb2_setattributes_in_battle(0, 1, 0, 2, &battle_participants[bank].species); //0x08033900|1
  6.     mark_buffer_bank_for_execution(bank); //0x0803F800|1
  7. }
复制代码
如果绿宝石石里没有你可以自己写一个。然后在战斗脚本的callasm库里面加一个函数即可
作者: 本站第一萌新    时间: 2021-7-25 21:28
另外,建议你把代码用代码框框起来 看着好看点。全部选中点击上面的<>就行了
  1. 就像这样
复制代码

作者: 744865306    时间: 2021-7-26 09:54
本站第一萌新 发表于 2021-7-25 21:26
战斗中变更种族不是这么直接改的...不记得绿宝石里有没有了,反正802里面是有一个函数专门完成这个操作,逻 ...

……emmm,看不太懂
作者: 本站第一萌新    时间: 2021-7-26 10:53
744865306 发表于 2021-7-26 09:54
……emmm,看不太懂

你仿照绿宝石战斗系统完全升级里面小陨星那个特性或者古老之歌,流星冲闪这些做就行了。
作者: 744865306    时间: 2021-7-26 16:00
本站第一萌新 发表于 2021-7-26 10:53
你仿照绿宝石战斗系统完全升级里面小陨星那个特性或者古老之歌,流星冲闪这些做就行了。

emmm,找不到特性代码,而且技能效果是用BS脚本的吧
作者: 本站第一萌新    时间: 2021-7-26 17:15
744865306 发表于 2021-7-26 16:00
emmm,找不到特性代码,而且技能效果是用BS脚本的吧

战斗系统完全升级工程里面搜索ABILITY_SHIELDS_DOWN然后看相关逻辑 说实话用hook实现的话确实有点复杂
作者: 744865306    时间: 2021-7-26 21:31
本站第一萌新 发表于 2021-7-26 17:15
战斗系统完全升级工程里面搜索ABILITY_SHIELDS_DOWN然后看相关逻辑 说实话用hook实现的话确实有点复杂

好的,谢谢大佬
作者: 744865306    时间: 2021-7-27 11:48
本站第一萌新 发表于 2021-7-26 17:15
战斗系统完全升级工程里面搜索ABILITY_SHIELDS_DOWN然后看相关逻辑 说实话用hook实现的话确实有点复杂

大佬,我之前去看了一下,找到了如下代码:
  1. case ABILITY_SHIELDS_DOWN:
  2.                 if(battle_participants[bank].species==POKE_MINIOR_CORE && (battle_participants[bank].current_hp >= (battle_participants[bank].max_hp >> 1)) && !battle_participants[bank].status2.transformed)
  3.                 {
  4.                     common_effect = 1;
  5.                     new_battlestruct->various.var1 = POKE_MINIOR_METEOR;
  6.                     new_battlestruct->various.var2 = 0x242;
  7.                     script_ptr = BS_STAT_ONLY_FORMCHANGE_END3;
  8.                 }
  9.                 break;
复制代码
但我还是有些地方不太理解,为什么common_effect要写入1,还有后面那个为什么要写入0x242,以及后面的BS脚本我并没有找到代码
作者: 本站第一萌新    时间: 2021-7-27 14:33
744865306 发表于 2021-7-27 11:48
大佬,我之前去看了一下,找到了如下代码:但我还是有些地方不太理解,为什么common_effect要写入1,还有 ...

为什么要写入1,因为后面有这些代码
  1. if (common_effect)
  2. {
  3.     effect = true;
  4.     battle_scripting.active_bank = bank;
  5.     bs_execute(script_ptr);
  6. }
复制代码
另外这个bs_execute就是我之前说的执行战斗脚本的函数 位于0x08E073E4(802 3.0版本)
至于BS脚本你也是直接搜索就行,在battlescritps.s里面
作者: 744865306    时间: 2021-7-27 15:35
本站第一萌新 发表于 2021-7-27 14:33
为什么要写入1,因为后面有这些代码另外这个bs_execute就是我之前说的执行战斗脚本的函数 位于0x08E073E4 ...

感谢大佬,话说大佬之前说的那个用了ASM杂项集合代码没说的人可能是我,真的非常抱歉
作者: 本站第一萌新    时间: 2021-7-27 15:57
744865306 发表于 2021-7-27 15:35
感谢大佬,话说大佬之前说的那个用了ASM杂项集合代码没说的人可能是我,真的非常抱歉

没事,下次用之前记得说一下就行
作者: 744865306    时间: 2021-7-27 16:08
本站第一萌新 发表于 2021-7-27 15:57
没事,下次用之前记得说一下就行

好的,谢谢大佬
作者: 744865306    时间: 2021-7-27 17:46
本站第一萌新 发表于 2021-7-27 15:57
没事,下次用之前记得说一下就行

那个……这个特性应该在哪跳转
作者: 本站第一萌新    时间: 2021-7-27 17:50
744865306 发表于 2021-7-27 17:46
那个……这个特性应该在哪跳转

界限盾壳在哪里跳转,你就在哪里跳转
作者: 744865306    时间: 2021-7-27 18:13
本站第一萌新 发表于 2021-7-27 17:50
界限盾壳在哪里跳转,你就在哪里跳转

我找不到它在哪跳转……
作者: 本站第一萌新    时间: 2021-7-27 19:38
744865306 发表于 2021-7-27 18:13
我找不到它在哪跳转……

是说你看我教你搜索的特性(就是界限盾壳)是在什么函数里面的什么位置跳转的。当然802直接重写了这整个函数,你不需要这样做,只需要用hook就行了
解释的有点抽象 可能很难理解 但我也不知道该怎么解释比较好
作者: 744865306    时间: 2021-7-27 20:15
本站第一萌新 发表于 2021-7-27 19:38
是说你看我教你搜索的特性(就是界限盾壳)是在什么函数里面的什么位置跳转的。当然802直接重写了这整个函 ...

见到了两段代码,emmm,看不懂,hook的话应该在哪呢?我找不太来地址:
  1. static bool check_leafguard_shieldsdown(u8 ability, u8 bank)
  2. {
  3.     if ((ability == ABILITY_SHIELDS_DOWN && battle_participants[bank].species == POKE_MINIOR_METEOR) || (ability == ABILITY_LEAF_GUARD && weather_abilities_effect() && (SUN_WEATHER)))
  4.         return 1;
  5.     return 0;
  6. }


  7. case POKE_MINIOR_CORE:
  8.                                 if((battle_participants[bank].current_hp >= (battle_participants[bank].max_hp / 2)) && check_ability(bank,ABILITY_SHIELDS_DOWN))
  9.                                 {
  10.                                     effect = 1;
  11.                                     new_battlestruct->various.var1 = POKE_MINIOR_METEOR;
  12.                                     new_battlestruct->various.var2 = 0x242;
  13.                                     battle_scripting.active_bank=bank;
  14.                                     call_bc_move_exec(BS_STAT_ONLY_FORMCHANGE_END2);
  15.                                 }
  16.                                 break;
复制代码

作者: 本站第一萌新    时间: 2021-7-27 20:39
744865306 发表于 2021-7-27 20:15
见到了两段代码,emmm,看不懂,hook的话应该在哪呢?我找不太来地址:

简单的实现回合结束换种族的话不用管这两个,照着十楼的代码写就行了
hook位置: AbilityBattleEffects函数 case ABILITYEFFECT_ENDTURN: // 1 下
再结合nogba跑一下
作者: 本站第一萌新    时间: 2021-7-27 20:41
本站第一萌新 发表于 2021-7-27 20:39
简单的实现回合结束换种族的话不用管这两个,照着十楼的代码写就行了
hook位置: AbilityBattleEffects ...

这个函数在绿宝石工程里面搜索看逻辑 位于08042828
现在有反编译工程看逻辑,这些操作可以说变得太容易不过了。以前没有反编译工程的话,分析会难十倍
作者: 744865306    时间: 2021-7-28 17:33
本站第一萌新 发表于 2021-7-27 20:41
这个函数在绿宝石工程里面搜索看逻辑 位于08042828
现在有反编译工程看逻辑,这些操作可以说变得太容易 ...

大佬,我又重新修改了一下,但是拥有特性的精灵开始战斗会卡死,没这个特性的精灵没事,经过测试,我发现删除bl 0x08E073E4就不会卡死,但又不会改变形态,可以帮忙看下嘛?
  1. .gba
  2. .thumb
  3. .create "test.gba",0x8000000
  4. .close
  5. .open "永暗.gba","test.gba",0x8000000

  6. .org 0x08F2EB24
  7. .func new
  8.         ldr r5,=0x0202420B
  9.         ldrb r5,[r5]
  10.         mov r2,#0x58
  11.         mul r5,r2
  12.         ldr r2,=0x02024084
  13.         add r5,r2
  14.         add r5,#0x20
  15.         ldrb r5,[r5]
  16.         cmp r5,#0xE9 ;"饱了又饿"特性编号
  17.         beq yes
  18. end:
  19.         lsl r6,r2,#0
  20.         mov r2,#0x9B
  21.         sub sp,#0x2C
  22.         str r3,[sp,#12]
  23.         ldr r1,=0x08E0368A
  24.         mov pc,r1
  25. yes:
  26.         ldrh r5,[r2]
  27.         ; 经过计算将"空腹花纹"编号存入r2
  28.         cmp r5,#1
  29.         bne cmp
  30.         mov r2,#2
  31. keep:
  32.         mov r5,r0
  33.         mov r0,r2
  34.         mov r1,#0xFF
  35.         add r1,#0x22
  36.         lsl r1,r1,#1
  37.         ldr r2,=BS_Script
  38.         ldr r4,=0x02024214
  39.         ldr r4,[r4]
  40.         str r2,[r4]
  41.         bl 0x08E073E4
  42.         b end
  43. cmp:
  44.         ; 经过计算将"满腹花纹"编号存入r2
  45.         cmp r5,#2
  46.         bne end
  47.         mov r2,#1
  48.         b keep
  49. .endfunc
  50. .pool

  51. BS_Script:
  52. .byte 0x10,0x30,0x1,0x83,0x77,0x0,0x45,0xA,0x21,0x0,0x0,0x0,0x0,0x3A,0x83,0x7A,0x0,0x12,0x40,0x0,0x83,0x73,0x0,0x3F

  53. .org 0x08E03682
  54.         ldr r2,=new
  55.         mov pc,r2
  56. .pool

  57. .close
复制代码

作者: 本站第一萌新    时间: 2021-7-28 20:07
744865306 发表于 2021-7-28 17:33
大佬,我又重新修改了一下,但是拥有特性的精灵开始战斗会卡死,没这个特性的精灵没事,经过测试,我发现 ...


你蓝本是不是802啊,那个函数是802独有的,给你的地址又是802下的3.0版本独有的
没有的话要自己写一个 包括战斗脚本中如果又callasm的话也是802独有的,因为他重写了整个callasm table
作者: 744865306    时间: 2021-7-28 20:37
本站第一萌新 发表于 2021-7-28 20:07
你蓝本是不是802啊,那个函数是802独有的,给你的地址又是802下的3.0版本独有的
没有的话要自己写一个 ...

是802没错,所以为什么会这样呢?
作者: 744865306    时间: 2021-7-28 21:18
本站第一萌新 发表于 2021-7-28 20:07
你蓝本是不是802啊,那个函数是802独有的,给你的地址又是802下的3.0版本独有的
没有的话要自己写一个 ...

唔……感觉是callasm和802的不一样,这样就写不来战斗脚本了的说
作者: 本站第一萌新    时间: 2021-7-28 21:36
744865306 发表于 2021-7-28 20:37
是802没错,所以为什么会这样呢?

你结合nogba跑一下看看是哪里卡死了
作者: 本站第一萌新    时间: 2021-7-28 21:37
744865306 发表于 2021-7-28 21:18
唔……感觉是callasm和802的不一样,这样就写不来战斗脚本了的说

你看看界限盾壳他们的战斗脚本是怎么写的就知道了
作者: 本站第一萌新    时间: 2021-7-28 21:44
744865306 发表于 2021-7-28 17:33
大佬,我又重新修改了一下,但是拥有特性的精灵开始战斗会卡死,没这个特性的精灵没事,经过测试,我发现 ...

还有,千万不要用sub sp, XXX,用add sp, -XXX
这估计是armips的bug,每次用sub写入的时候都会莫名其妙变成其他的数
作者: 744865306    时间: 2021-7-29 06:57
本站第一萌新 发表于 2021-7-28 21:37
你看看界限盾壳他们的战斗脚本是怎么写的就知道了

我直接抄的战斗脚本
作者: 744865306    时间: 2021-7-29 06:58
本站第一萌新 发表于 2021-7-28 21:44
还有,千万不要用sub sp, XXX,用add sp, -XXX
这估计是armips的bug,每次用sub写入的时候都会莫名其妙 ...

这样啊,谢谢大佬
作者: 本站第一萌新    时间: 2021-7-29 09:19
744865306 发表于 2021-7-28 17:33
大佬,我又重新修改了一下,但是拥有特性的精灵开始战斗会卡死,没这个特性的精灵没事,经过测试,我发现 ...

看了一下逻辑
  1. keep:
  2.         mov r5,r0
  3.         mov r0,r2
  4.         mov r1,#0xFF
  5.         add r1,#0x22
  6.         lsl r1,r1,#1
  7.         ldr r2,=BS_Script
  8.         ldr r4,=0x02024214
  9.         ldr r4,[r4]
  10.         str r2,[r4]
  11.         bl 0x08E073E4 ;这是什么鬼?
  12.         b end
复制代码
这个函数是接受战斗脚本作为参数的,你正确的写法是
  1. ....
  2. ;ldr r2, =BS_Script 删掉注释的代码!
  3. ;ldr r4, =0x02024214
  4. ;ldr r4, [r4]
  5. ;str r2, [r4]
  6. ldr r0, =BS_Script
  7. bl 0x08E073E4
  8. ....
复制代码
另外
  1. ldr r4, =0x02024214
  2. ldr r4, [r4]
复制代码
这是什么意思?如果你想要将不用函数设置战斗脚本的话,去掉ldr r4, [r4],具体为什么你结合nogba跑一下就知道了
作者: 本站第一萌新    时间: 2021-7-29 09:21
744865306 发表于 2021-7-29 06:57
我直接抄的战斗脚本

脚本应该是正确的,具体问题看上一楼的回复
作者: 744865306    时间: 2021-7-29 11:29
本站第一萌新 发表于 2021-7-29 09:21
脚本应该是正确的,具体问题看上一楼的回复

我的新精灵编号是放在了r0,这样不会盖掉嘛?
作者: 744865306    时间: 2021-7-29 11:50
本站第一萌新 发表于 2021-7-29 09:21
脚本应该是正确的,具体问题看上一楼的回复

经过一番修改后,我发现变成了0号精灵,代码如下:
  1. .gba
  2. .thumb
  3. .create "test.gba",0x8000000
  4. .close
  5. .open "永暗.gba","test.gba",0x8000000

  6. .org 0x08F2EB24
  7. .func new
  8.         ldr r5,=0x0202420B
  9.         ldrb r5,[r5]
  10.         mov r2,#0x58
  11.         mul r5,r2
  12.         ldr r2,=0x02024084
  13.         add r5,r2
  14.         add r5,#0x20
  15.         ldrb r5,[r5]
  16.         cmp r5,#0xE9 ;"饱了又饿"特性编号
  17.         beq yes
  18. end:
  19.         lsl r6,r2,#0
  20.         mov r2,#0x9B
  21.         add sp,#-0x2C
  22.         str r3,[sp,#12]
  23.         ldr r1,=0x08E0368A
  24.         mov pc,r1
  25. yes:
  26.         ldrh r5,[r2]
  27.         ; 经过计算将"空腹花纹"编号存入r2
  28.         cmp r5,#4
  29.         bne cmp
  30.         mov r2,#5
  31. keep:
  32.         mov r5,r0
  33.         mov r0,r2
  34.         mov r1,#0xFF
  35.         add r1,#0x22
  36.         lsl r1,r1,#1
  37.         ldr r0,=BS_Script
  38.         bl 0x08E073E4
  39.         mov r0,r5
  40.         b end
  41. cmp:
  42.         ; 经过计算将"满腹花纹"编号存入r2
  43.         cmp r5,#5
  44.         bne end
  45.         mov r2,#4
  46.         b keep
  47. .endfunc
  48. .pool

  49. BS_Script:
  50. .byte 0x10,0x30,0x1,0x83,0x77,0x0,0x45,0xA,0x21,0x0,0x0,0x0,0x0,0x3A,0x83,0x7A,0x0,0x12,0x40,0x0,0x83,0x73,0x0,0x3F

  51. .org 0x08E03682
  52.         ldr r2,=new
  53.         mov pc,r2
  54. .pool

  55. .close
复制代码

作者: 744865306    时间: 2021-7-29 11:51
本站第一萌新 发表于 2021-7-29 09:21
脚本应该是正确的,具体问题看上一楼的回复

为什么会变成0号精灵呢?大佬帮我看看吧(话说还是用不来论坛的功能啊,我本来以为那个键是字体颜色,结果是字体背景颜色)
作者: 本站第一萌新    时间: 2021-7-29 14:09
744865306 发表于 2021-7-29 11:29
我的新精灵编号是放在了r0,这样不会盖掉嘛?

那你把他放到其他寄存器或者栈里保护起来不就行了
作者: 744865306    时间: 2021-7-29 14:30
本站第一萌新 发表于 2021-7-29 14:09
那你把他放到其他寄存器或者栈里保护起来不就行了

唔……可是不管哪个寄存器都会出现我说的这个bug唉
作者: 本站第一萌新    时间: 2021-7-29 14:36
744865306 发表于 2021-7-29 11:50
经过一番修改后,我发现变成了0号精灵,代码如下:

首先你hook的位置问题就很大 你应该在
  1. case 1: //end turn abilities
复制代码
下hook,因为如果我没记错的话饱了又饿特性是回合末发动的。
其次,这个函数的参数本来就有bank,而且并不一定是attacker,你写的这些操作
  1. ldr r5,=0x0202420B
  2. ldrb r5,[r5]
  3. .......
  4. ldrh r5,[r2]
  5.         ; 经过计算将"空腹花纹"编号存入r2
复制代码
是错误而且毫无意义的,建议你好好再看一下这个函数的逻辑
然后,
  1. mov r0,r2
  2. mov r1,#0xFF
  3. add r1,#0x22
  4. lsl r1,r1,#1
复制代码
这些是干什么的?不管是干什么的,他都起不到作用,因为后面调用了函数,重设了r0-r3的值
最后,你把需要变更的精灵的种族放在了r0,然后就没有操作了?直接执行变更的脚本,不出bug才怪了。
总而言之,还是老话:按照界限盾壳的写法写就可以了
作者: 744865306    时间: 2021-7-29 14:50
本站第一萌新 发表于 2021-7-29 14:36
首先你hook的位置问题就很大 你应该在下hook,因为如果我没记错的话饱了又饿特性是回合末发动的。
其次 ...

界限盾壳不是这样写的嘛?(懵)
作者: 744865306    时间: 2021-7-29 14:56
本站第一萌新 发表于 2021-7-29 14:36
首先你hook的位置问题就很大 你应该在下hook,因为如果我没记错的话饱了又饿特性是回合末发动的。
其次 ...

r1没有那些数据的话根本就转换不了,回合末的地址的话我找不到……
作者: 744865306    时间: 2021-7-29 14:57
本站第一萌新 发表于 2021-7-29 14:36
首先你hook的位置问题就很大 你应该在下hook,因为如果我没记错的话饱了又饿特性是回合末发动的。
其次 ...

啊,不是转换不了,是我上次改了点东西没换回来
作者: 744865306    时间: 2021-7-29 14:58
744865306 发表于 2021-7-29 14:57
啊,不是转换不了,是我上次改了点东西没换回来

唔……这个r1貌似确实是没用
作者: 本站第一萌新    时间: 2021-7-29 15:05
744865306 发表于 2021-7-29 14:50
界限盾壳不是这样写的嘛?(懵)
  1. new_battlestruct->various.var1 = POKE_MINIOR_METEOR; //应该是变化后的种族吧
  2. new_battlestruct->various.var2 = 0x242; //不知道是啥,应该照抄
复制代码
这个你有写吗?
作者: 本站第一萌新    时间: 2021-7-29 15:07
744865306 发表于 2021-7-29 14:56
r1没有那些数据的话根本就转换不了,回合末的地址的话我找不到……

你用nogba走一下就知道回合末在哪了
作者: 744865306    时间: 2021-7-29 15:29
本站第一萌新 发表于 2021-7-29 15:05
这个你有写吗?

有啊,那俩数据我存在了r0和r1
作者: 本站第一萌新    时间: 2021-7-29 15:36
744865306 发表于 2021-7-29 15:29
有啊,那俩数据我存在了r0和r1

那你把他们存起来了吗 我没有在你的代码里看到new_battlestruct的指针0x02024218
作者: 本站第一萌新    时间: 2021-7-29 15:38
744865306 发表于 2021-7-29 15:29
有啊,那俩数据我存在了r0和r1
  1. mov r0,r2
  2. mov r1,#0xFF
  3. add r1,#0x22
  4. lsl r1,r1,#1
复制代码
写出来没用啊,得存到对应的地方才行
作者: 744865306    时间: 2021-7-29 17:54
本站第一萌新 发表于 2021-7-29 15:36
那你把他们存起来了吗 我没有在你的代码里看到new_battlestruct的指针0x02024218

啊,原来要存到那里面,我都没看出这个词是什么,谢谢大佬
作者: 744865306    时间: 2021-7-29 19:27
本站第一萌新 发表于 2021-7-29 15:38
写出来没用啊,得存到对应的地方才行

大佬,我这样写,结果精灵转变成了妙蛙草且卡死,能看看是什么原因嘛?

.gba
.thumb
.include "编译工具/ArmipsBSMacros.asm"
.create "test.gba",0x8000000
.close
.open "永暗.gba","test.gba",0x8000000

.org 0x08F2EB24
.func new
        ldr r5,=0x0202420B
        ldrb r5,[r5]
        mov r2,#0x58
        mul r5,r2
        ldr r2,=0x02024084
        add r5,r2
        add r5,#0x20
        ldrb r5,[r5]
        cmp r5,#0xE9 ;"饱了又饿"特性编号
        beq yes
end:
        lsl r6,r2,#0
        mov r2,#0x9B
        add sp,#-0x2C
        str r3,[sp,#12]
        ldr r1,=0x08E0368A
        mov pc,r1
yes:
        ldrh r5,[r2]
        ; 经过计算将"空腹花纹"编号存入r2
        cmp r5,r2
        bne cmp
        mov r2,#5 ;满腹花纹编号
keep:
        mov r5,r0
        mov r0,r2
        push {r3}
        ldr r1,=0x02024218
        strh r0,[r1]
        mov r0,#0xFF
        add r0,#0x22
        lsl r0,r0,#1
        ldr r1,=0x02024218
        add r1,#2
        strh r0,[r1]
        ldr r0,=BS_Script
        bl 0x08E073E4
        pop {r3}
        mov r0,r5
        b end
cmp:
        ; 经过计算将"满腹花纹"编号存入r2
        cmp r5,r2
        bne end
        mov r2,#4 ;空腹花纹编号
        b keep
.endfunc
.pool

BS_Script:
printstring 0x130
callasm_cmd 119
playanimation 0xA 0x21 0x0
waitstate
callasm_cmd 122
waitmessage 0x40
callasm_cmd 115
end3

.org 0x08E03682
        ldr r2,=new
        mov pc,r2
.pool

.close
作者: 本站第一萌新    时间: 2021-7-29 20:35
744865306 发表于 2021-7-29 19:27
大佬,我这样写,结果精灵转变成了妙蛙草且卡死,能看看是什么原因嘛?

.gba

我比较忙,抽不出具体时间帮你分析,只能用零碎时间给你提点建议。
你用nogba看看哪里卡死的,是不是在你函数内部卡死的。
还有卡死是哪种卡死?是nogba崩溃了还是卡在战斗界面但无法操作?如果是第一种估计是你的函数有问题,第二种估计是战斗脚本有问题。不过既然都能变化形态说明函数估计也没有什么大问题,就是要看看为什么变得不是你想要的精灵。
另外,之前就说了,这个函数的参数里自带bank,不要
  1. ldr r5,=0x0202420B
  2. ldrb r5,[r5]
  3. ......
  4. ldrh r5,[r2]
复制代码
用他的bank
作者: 744865306    时间: 2021-7-29 21:03
本站第一萌新 发表于 2021-7-29 20:35
我比较忙,抽不出具体时间帮你分析,只能用零碎时间给你提点建议。
你用nogba看看哪里卡死的,是不是在 ...

崩溃,那应该是函数有问题了




欢迎光临 Pokemon Center | 口袋中心 以口袋妖怪为主题并带有其他动漫游戏的讨论 (http://162.218.49.243/) Powered by Discuz! X3