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

 找回密码
 加入口袋中心
搜索
查看: 268|回复: 6

《宝可梦绿宝石》中与大吾在绿岭宇宙中心组队双打的一处程序疏忽(修正)

[复制链接]

2万

回帖

13万

现金

355

勋章券

管理员

起源の钻角犀兽

Rank: 27Rank: 27Rank: 27

积分
52090

Missingno论坛十周年纪念物挥金如土勋章Lv3水中王者勋章Lv3时光印记Lv.3Omega红宝石发售确认纪念章Alpha蓝宝石发售确认纪念章

发表于 2025-2-22 23:42:01 | 显示全部楼层 |阅读模式
今天是2月22日,很巧合的在修补自己的绿宝石改版时发现了一处官方非常2的程序疏忽,于是开个夜车分享一下:

与大吾在绿岭宇宙中心组队双打对抗火岩队的剧情相信大家都记得。如果我记忆没出错的话,这是宝可梦正统游戏中首个和NPC组队双打的剧情???而且队友可是地区冠军呢,想必大家都在队伍列表中查看过大吾的三只宝可梦的数据吧?



从中我们知道了官方给大吾设置的训练师ID是61226这样的有趣信息。还有就是盔甲鸟的性格竟然是减防御,于是我好奇地打开MH修改器读取信息看看。其实很多朋友应该也看过,这里大吾的三只宝可梦数据个体值为6V,努力值为标准的两项252一项6!说明什么呢?要知道在那个年代,除了战斗塔的NPC,其他人的宝可梦都是没有努力值的(所以你VS最终的大吾时可以认为他把队伍努力值全洗了跟你放水打?)既然官方特意设置,那么应该是挺奔着实战配置去的才对,没有道理盔甲鸟减物防是吧?

于是我挖掘了一下数据,发现这三只确实是单独设置了性格的,但结果却不对。继续深挖,果然,代码有一处错误!在创建这3只宝可梦的数据时,程序员误将它们的序列号(0、1、2)代替了它们的性格值(PID)作为参数传递了过去。而性格值如果在0x0 ~ 0x18区间,性格代码 = 性格值,所以金属怪性格是“努力”,因为“努力”代码是00;盔甲鸟性格“孤独”恰好是代码01、波士可多拉性格“勇敢”则是代码02。以前做改版的朋友肯定也有发现了大吾这三只宝可梦的数据但是性格的字节怎么改都无效的情况,是因为程序有个glitch啦~

=============开夜车犯2了,这段修正只读对了性格=============
现在,我把程序修正,给大家看看大吾这三只原本设置的是什么性格吧~

(特性变成了锐利目光
(特性变成了石头脑袋


(比较搞笑的是,这只波士可多拉全部是特攻技能,程序修正后性格反而减了特攻,让本不富裕的特攻能力值雪上加霜,笑~

至于为啥第几特性也会变呢?这要从第三世代的第1/2特性还是从性格值(PID)中运算得出说起。从上面盔甲鸟数据MH截图可以看到,性格值就等于性格。官方给盔甲鸟设置的是代码08(淘气),那么现在这只盔甲鸟的性格值就变成了0x00000008,结合其他信息算出此情况下应为第一特性“锐利目光”。

附,代码hex修正(美版及以其为蓝本的新汉化版):

0x816548C处:        DA789B789C460124009453460193
改为                        1A790192DA789B789C4601240094

=============以下才是正确修正方式及结果=============
一觉醒来被JZW大大指出我修复的并不对,还真是-_,-|||
要知道创建宝可梦的函数传递的是性格值(PID)不是性格,而三只宝可梦的性格只占用1B,我想当然的认为是把性格当成性格值传递过去(见上文蓝字),算是投机取巧了。
事实上在这之前的语句,性格这个字节已经发挥过作用了,程序会根据该性格生成一个随机的性格值(PID),并且不允许宝可梦闪光(早期锁闪!)。
所以直接从内存里取出该预设的性格值即可。换句话说呢,我没留意到前面的语句,把问题搞复杂了,其实正确的修改方式只要改动两字节就成:
0x8165496处改为119B即可。
当然,性格值(PID)真正的结果既然是随机的,那么第几特性也是随机的了,连性别也是随机的,在修正后我们SL几次试试便不难发现,以下图盔甲鸟为例:


啊咧咧,又挖坑不填哎╮(╯▽╰)╭

告别真新镇后不知经过多久,擦伤,砍伤,朋友的数目,让我有点自豪,那时候因为流行而跑去买的,这双轻便的运动鞋,现在成了,找遍全世界也找不到的,最棒的破鞋子……
口袋中心·绿宝石·改(更新1.6.4版)
【口袋中心出品】魂银·壹式改点壹(全493)    【科普向】魂银中少有人注意到的洛奇亚传说故事
宝可梦卡牌 / 限定精灵图示    好吧,这是官方微博-_-    好吧,这是我的微博-_-
我的B站号    美术作品之我的宝可梦人设画    个人制作的FC魂斗罗2代hack版
回复

使用道具 举报

2万

回帖

13万

现金

355

勋章券

管理员

起源の钻角犀兽

Rank: 27Rank: 27Rank: 27

积分
52090

Missingno论坛十周年纪念物挥金如土勋章Lv3水中王者勋章Lv3时光印记Lv.3Omega红宝石发售确认纪念章Alpha蓝宝石发售确认纪念章

 楼主| 发表于 3 天前 | 显示全部楼层
771027 发表于 2025-3-3 15:46
請教如果要用UE修改的話
----------------------------------------------------------------------
附, ...

只需要修改「0x8165496处改为119B」就好,这是GF的本意。
啊咧咧,又挖坑不填哎╮(╯▽╰)╭

告别真新镇后不知经过多久,擦伤,砍伤,朋友的数目,让我有点自豪,那时候因为流行而跑去买的,这双轻便的运动鞋,现在成了,找遍全世界也找不到的,最棒的破鞋子……
口袋中心·绿宝石·改(更新1.6.4版)
【口袋中心出品】魂银·壹式改点壹(全493)    【科普向】魂银中少有人注意到的洛奇亚传说故事
宝可梦卡牌 / 限定精灵图示    好吧,这是官方微博-_-    好吧,这是我的微博-_-
我的B站号    美术作品之我的宝可梦人设画    个人制作的FC魂斗罗2代hack版
回复 支持 1 反对 0

使用道具 举报

3370

回帖

323

现金

487

勋章券

超级版主

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
22309
QQ

时光印记Lv.3挥金如土勋章水中王者勋章Lv3Omega红宝石发售确认纪念章Alpha蓝宝石发售确认纪念章金银好CP-Ho-oh/LUGIA【里】金银好CP-Ho-oh/LUGIA【真·正常向】异化型LUGIA【M超梦版】

发表于 2025-2-23 06:40:32 | 显示全部楼层
这修复是有问题的。你所做的就是直接把nature数值作为argument 6传给CreateMon,而实际上应该传送的是PID(nature从PID中可以计算得到,但数值并不相同)
以下是pokeemerald中计算代后怪兽PID的代码(即,匹配预设的性格且不闪光的随机PID)
  1.             do
  2.             {
  3.                 j = Random32();
  4.             } while (IsShinyOtIdPersonality(STEVEN_OTID, j) || sStevenMons[i].nature != GetNatureFromPersonality(j));
复制代码

故在传递argument 6时应该使用j的值,即正确的修改方法:
把0x8165496的mov r3, sl改为ldr r3, [sp, #0x44] (11 9B)
回复 支持 反对

使用道具 举报

2万

回帖

13万

现金

355

勋章券

管理员

起源の钻角犀兽

Rank: 27Rank: 27Rank: 27

积分
52090

Missingno论坛十周年纪念物挥金如土勋章Lv3水中王者勋章Lv3时光印记Lv.3Omega红宝石发售确认纪念章Alpha蓝宝石发售确认纪念章

 楼主| 发表于 2025-2-23 11:17:03 | 显示全部楼层
jiangzhengwenjz 发表于 2025-2-23 06:40
这修复是有问题的。你所做的就是直接把nature数值作为argument 6传给CreateMon,而实际上应该传送的是PID( ...


还真是,我没注意到上面这部分,原来不是直接取性格作为PID投机取巧,而是根据性格已经预先生成好了随机的PID,直接拿来用就行了…我把文章修正一下。
啊咧咧,又挖坑不填哎╮(╯▽╰)╭

告别真新镇后不知经过多久,擦伤,砍伤,朋友的数目,让我有点自豪,那时候因为流行而跑去买的,这双轻便的运动鞋,现在成了,找遍全世界也找不到的,最棒的破鞋子……
口袋中心·绿宝石·改(更新1.6.4版)
【口袋中心出品】魂银·壹式改点壹(全493)    【科普向】魂银中少有人注意到的洛奇亚传说故事
宝可梦卡牌 / 限定精灵图示    好吧,这是官方微博-_-    好吧,这是我的微博-_-
我的B站号    美术作品之我的宝可梦人设画    个人制作的FC魂斗罗2代hack版
回复 支持 反对

使用道具 举报

300

回帖

1931

现金

62

勋章券

碧蓝大海飞溅的水滴

Rank: 9

积分
872
QQ

时光印记Lv.1水中王者勋章Lv1


大剑鬼 Lv:47
发表于 3 天前 | 显示全部楼层
老游戏到底还能被你们挖掘出多少东西来……
有事找我请微博联系(如果没被夹的话)
名字跟论坛一致
Ps. 不必关注微博
回复 支持 反对

使用道具 举报

15

回帖

73

现金

1

勋章券

口袋学堂外的努力

Rank: 2Rank: 2

积分
47
发表于 3 天前 | 显示全部楼层
請教如果要用UE修改的話
----------------------------------------------------------------------
附,代码hex修正(美版及以其为蓝本的新汉化版):
0x816548C处:        DA789B789C460124009453460193
改为                        1A790192DA789B789C4601240094
----------------------------------------------------------------------
上面這部分也要修改嗎
還是只需要修改「0x8165496处改为119B」就好呢?
回复 支持 反对

使用道具 举报

2万

回帖

13万

现金

355

勋章券

管理员

起源の钻角犀兽

Rank: 27Rank: 27Rank: 27

积分
52090

Missingno论坛十周年纪念物挥金如土勋章Lv3水中王者勋章Lv3时光印记Lv.3Omega红宝石发售确认纪念章Alpha蓝宝石发售确认纪念章

 楼主| 发表于 3 天前 | 显示全部楼层
EiMos 发表于 2025-3-3 00:16
老游戏到底还能被你们挖掘出多少东西来……

要不是这几年又回头在改绿宝石至少我是发现不了XD
啊咧咧,又挖坑不填哎╮(╯▽╰)╭

告别真新镇后不知经过多久,擦伤,砍伤,朋友的数目,让我有点自豪,那时候因为流行而跑去买的,这双轻便的运动鞋,现在成了,找遍全世界也找不到的,最棒的破鞋子……
口袋中心·绿宝石·改(更新1.6.4版)
【口袋中心出品】魂银·壹式改点壹(全493)    【科普向】魂银中少有人注意到的洛奇亚传说故事
宝可梦卡牌 / 限定精灵图示    好吧,这是官方微博-_-    好吧,这是我的微博-_-
我的B站号    美术作品之我的宝可梦人设画    个人制作的FC魂斗罗2代hack版
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入口袋中心

本版积分规则

手机版|Archiver|Pokemon Center

GMT+8, 2025-3-6 14:47 , Processed in 0.240501 second(s), 59 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表