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

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

基于反编译项目的改版教程集

[复制链接]

100

回帖

699

现金

0

勋章券

手举徽章的兴奋

Rank: 6Rank: 6

积分
372

时光印记Lv.1

发表于 2024-8-12 22:34:23 | 显示全部楼层 |阅读模式
最近突然想发发教程,就来这里发了,这个教程结合各方文献和本人学习成果,将不定期更新
参考文献:gba-dev的lib-tonc教程,gbatek,pokecommunity的帖子,github上的wiki
回复

使用道具 举报

40

回帖

0

现金

2

勋章券

手举徽章的兴奋

Rank: 6Rank: 6

积分
357

时光印记Lv.1


超精灵 Lv:37
发表于 2024-8-19 16:24:10 | 显示全部楼层
744865306 发表于 2024-8-18 15:39
图像进阶——仿射变换(实例演示)
事实上GF有预留一些宏定义之类的来帮助进行仿射变换,但我对图像研究不多 ...

看完了前面讲的,插楼回复一下抱歉。
没猜错的话,楼主应该是Pokecommunity的MapleFall氏吧,之前关注过你写的那个滚动开始菜单。
前面讲到的缩放变换,个人以前也是用过的。比如,个人之前用这个试着简单做过一个给四天王转场上添加VS符号的动画。具体方法很简单,把调色板,贴图以及Callback定义好,再在原本那一长串代码里找地方添加一个CreateSprite函数让其显示就可以。
CallBack里就用到了affineAnims缩放变换代码,具体结果如下,本来是想添到Pokecommunity的帖子里,但个人觉得这本就是个缩放的小应用而已,没有特地回复上一帖的必要。



效果个人感觉还行吧,直接定义调色板可能会有冲突,但个人用之前由Jaizu氏在火叶里发现的一个值已经修正了,不然会乱。
应该是"gReservedSpritePaletteCount"这个,可以具体分配调色板。
个人貌似从火叶移植了过来,还是原版绿宝石就有但未使用?不太确定。
另外,把缩放函数弄到技能动画里的话,应该可能就是这个样子吧。个人之前做过。
(个人没见过RHH的「极巨化」长什么样子,毕竟本身原版里这好像就是七八代的东西了过于超前,没玩过也完全没兴趣。但之前用这个函数做过技能动画。
和三代原版里就有的「黑夜魔影(夜首)」还有「锻炼(组合上升)」的技能动画不一样,这个是实体放大大概3倍外加停顿几帧,原理无非也就是用了affineAnims变换。
另外做这个属实也是有一段时间了,很久也是没碰技能动画了)





除了技能动画之外,其实这个缩放旋转函数的应用得还是相当广的,比如火红叶绿原版给精灵使用道具时播放的那一小段动画。
另外,清楚记得火红完全升级CFRU里面有一个得到道具后,将道具图片在主角的行走图上缩放并旋转显示一下的小功能,没有记错的话,应用的也是这个函数。
想要移植到反编译上的话,应该复制并修改一下代码大致就可以了吧。
外加一句,前面的一长串基本理论,个人初中数学水平都不到因此完全没看懂。在这里说的也只是基于个人的一些改版经验简单做出的东西而已。没什么技术力还请见谅。
(中间的三张图,要是看不见的话还麻烦说一下,因为网盘直链挂了)
長い歳月が流れて、一人に残されるはめになった時、恐らくその「子」は、沢山の友達とGBAで「ポケモン」という生き物を初めて見たあの夏を思い出してきた。
回复 支持 1 反对 0

使用道具 举报

100

回帖

699

现金

0

勋章券

手举徽章的兴奋

Rank: 6Rank: 6

积分
372

时光印记Lv.1

 楼主| 发表于 2024-8-12 22:47:28 | 显示全部楼层
本帖最后由 744865306 于 2024-8-13 22:18 编辑

工具安装与使用
首先需要安装的就是devkitARM,另外需要有agbcc,这些在每个反编译项目的install.md里都有,就不多余描述了,但此处特别讲解Android端的方案
对于Android端,首先需要zerotermux,此处提供下载链接(这个比较慢,最好翻墙):http://d.icdown.club/repository/ ... Termux-0.118.39.apk
接着需要利用zerotermux安装一个Linux系统,我已经准备了一个被我配置好环境的系统:https://www.123pan.com/s/W3Yojv-6k9Hd.html
将该文件放到sd卡的xinhao/data目录下(没有就自己建),在zerotermux左边的菜单中点击备份/恢复,选择恢复并点击该文件,等待恢复完成后,点击切换容器,切换到新的,重启zerotermux即可使用,之后的使用全都只需按照Linux来用就行
一些常用的软件包括porymap,poryscript和tilemap-studio,可以在github搜索,直接就能找到,也有安装教程在里面
对于文件修改,可在左侧菜单点击"打开目录",下载提供的文件进行管理,或是用mt管理器"添加目录"功能添加,也可以用右侧菜单自带的文件管理,但速度较慢
对于获取反编译项目,下方提供一些链接:
美版绿宝石:https://github.com/pret/pokeemerald
rh的九代绿宝石:https://github.com/rh-hideout/pokeemerald-expansion
半废弃的汉化版rh绿宝石:https://github.com/rh-hideout-chinese/pokeemerald-expansion
获取项目可以使用git进行,git在我给的系统里已经自带,一些软件的显示需要在桌面环境下,可以使用startvnc命令打开Linux系统的桌面,并使用vnc打开,你可以很容易的利用浏览器获取到一个vnc软件,将地址填为localhost:5902就可打开桌面,密码是123456

最后的说明:如果有电脑还是用电脑吧,手机虽然可以用,但并不方便

评分

参与人数 1积分 +10 现金 +20 收起 理由
jiangzhengwenjz + 10 + 20 感谢分享

查看全部评分

回复 支持 反对

使用道具 举报

100

回帖

699

现金

0

勋章券

手举徽章的兴奋

Rank: 6Rank: 6

积分
372

时光印记Lv.1

 楼主| 发表于 2024-8-13 22:59:23 | 显示全部楼层
本帖最后由 744865306 于 2024-8-18 13:27 编辑

图像进阶——矩阵
GBA能对图像进行旋转,缩放,剪切的操作,这三种操作统称为仿射变换,这些操作由pa,pb,pc,pd四个参数描述,对于BG和Sprite,修改的地方各不相同,但这一部分我们讲解的是仿射变换需要用到的重要知识——矩阵
我们可以将这四个参数视为一个二维矩阵的四个元素。什么是矩阵?我也描述不清具体的定义,我们可以暂且认为它是个二维数组,以下是矩阵的常用运算:
Screenshot_20240818_132541.jpg
回复 支持 反对

使用道具 举报

100

回帖

699

现金

0

勋章券

手举徽章的兴奋

Rank: 6Rank: 6

积分
372

时光印记Lv.1

 楼主| 发表于 2024-8-13 22:59:58 | 显示全部楼层
744865306 发表于 2024-8-13 22:59
图像进阶——矩阵
GBA能对图像进行旋转,缩放,剪切的操作,这三种操作统称为仿射变换,这些操作由pa,pb ...

额,这些符号完全乱掉了

点评

可以考虑直接截图  发表于 2024-8-14 12:00
回复 支持 反对

使用道具 举报

100

回帖

699

现金

0

勋章券

手举徽章的兴奋

Rank: 6Rank: 6

积分
372

时光印记Lv.1

 楼主| 发表于 2024-8-18 14:05:56 | 显示全部楼层
图像进阶——仿射变换(基本理论)
对于图片显示,我们通常考虑二维矩阵和向量,我们设原图片是个单位矩阵I,有如下公式:
IMG_20240818_133915.jpg
利用这些,我们可以对图片进行变换:
IMG_20240818_134152.jpg
为什么要旋转负数角度?因为GBA的BIOS中自带的函数是逆时针旋转的,还是统一一下标准为好
在GBA中进行仿射变换需要P矩阵,我们可以这样获得:
Screenshot_20240818_134912.jpg
因此,我们可以得到:
Screenshot_20240818_135021.jpg
这就是最终的矩阵P,仿射变换是数学,使用实数,然而若是对P使用浮点型,你会得到令人惊讶的结果,因为GBA没有浮点单元,一切浮点运算都必须在FPU中完成,这导致GBA的浮点运算超级慢!!!为了解决这个问题,GBA的缩放使用了定点型,而不是浮点型,例如你可以这样写:
pa= pd= 1<<8;
pb= pc= 0;
此处的pa和pb实际上是1.0,在进行定点型运算时,建议使用有符号类型,我需要在此说明:GBA是armv7-tdmi架构,在GBA中使用32位运算将比其他位数快的多,因此一个比较好的做法是在此处全都定义为s32类型
然而还有问题!!!
GBA预留的三角函数返回值是浮点型,而且是双精度浮点型double,这会导致运算超级慢,幸运的是,GF已经编写了几个返回s16类型数据的三角函数,虽然它们只支持整数角度,但是这已经足够了
回复 支持 反对

使用道具 举报

100

回帖

699

现金

0

勋章券

手举徽章的兴奋

Rank: 6Rank: 6

积分
372

时光印记Lv.1

 楼主| 发表于 2024-8-18 14:39:36 | 显示全部楼层
本帖最后由 744865306 于 2024-8-18 14:42 编辑

图像进阶——仿射变换(实例演示)
事实上GF有预留一些宏定义之类的来帮助进行仿射变换,但我对图像研究不多,暂且不清楚这些,但我知道有这么几个宏定义控制sprite的仿射变换(sprite具体应该翻译成什么我并不清楚,但宝可梦图片是属于sprite)
这个宏定义控制缩放和旋转:
  1. #define AFFINEANIMCMD_FRAME(_xScale, _yScale, _rotation, _duration)
复制代码

_xScale和_yScale越大,缩放速度越快,这不是我们想要的缩放比例
接下来,我将缩短变量名方便称呼,x对应_xScale,y对应_yScale,d对应_duration,k是缩放比,我们有一个公式:
  1. d=256k/x
复制代码

为了减少浮点数出现,我们接下来使用这样一个变形的公式:
  1. d=240k/x
复制代码

在starter_choose.c中有如下程序控制开局选择宝可梦时,显示出的宝可梦图片大小:
  1. static const union AffineAnimCmd sAffineAnim_StarterPokemon[] =
  2. {
  3.     AFFINEANIMCMD_FRAME(16, 16, 0, 0),
  4.     AFFINEANIMCMD_FRAME(16, 16, 0, 15),
  5.     AFFINEANIMCMD_END,
  6. };
复制代码

尝试将其修改为这样:
  1. static const union AffineAnimCmd gSpriteAffineAnim_StarterPokemon[] =
  2. {
  3.     AFFINEANIMCMD_FRAME(8, 8, 0, 0),
  4.     AFFINEANIMCMD_FRAME(8, 8, 0, 15),
  5.     AFFINEANIMCMD_END,
  6. };
复制代码

此时我们得到了更小的图片,如图所示:
Screenshot_20240818_142555.jpg
我们还可以进行旋转操作,1代表22.5度,所以我们可以写如下代码旋转90度:
  1.     AFFINEANIMCMD_FRAME(16, 16, 0, 0),
  2.     AFFINEANIMCMD_FRAME(16, 16, 0, 15),
  3.     AFFINEANIMCMD_FRAME(16, 16, 0, 16),
  4.     AFFINEANIMCMD_FRAME(-16, -16, -4, 16),
  5.     AFFINEANIMCMD_END,
复制代码

值得一提的是,宏定义写仿射变换伴随着变换过程中的动画,因此你可以利用它们进行多次缩放来营造非常有趣的动画效果,rhh的pokeemerald-expansion中的极巨化动画就是这样的
以下是一些其他宏定义
控制仿射变换动画结束:
  1. AFFINEANIMCMD_END
复制代码

动画循环次数(我想rhh的极巨化应该就用了这个):
  1. AFFINEANIMCMD_LOOP(count)
复制代码

每行动画都存在一个AffineAnimCmd类型的数组中,你可以用这个语句跳转到第target+1行:
  1. AFFINEANIMCMD_JUMP(target)
复制代码

这个不清楚有啥效果,但它可以起到结束动画的效果:
  1. AFFINEANIMCMD_END_ALT(val)
复制代码


参考资料:
pokecommunity的Inmortal的帖子和Anon822的回复
回复 支持 反对

使用道具 举报

100

回帖

699

现金

0

勋章券

手举徽章的兴奋

Rank: 6Rank: 6

积分
372

时光印记Lv.1

 楼主| 发表于 2024-8-21 23:16:23 | 显示全部楼层
K.SKT 发表于 2024-8-19 16:24
看完了前面讲的,插楼回复一下抱歉。
没猜错的话,楼主应该是Pokecommunity的MapleFall氏吧,之前关注过 ...

是的,那个确实是我,另外还有个maplefall537也是我(因为maplefall那个账号的密码邮箱一起忘记了),你的技术挺不错,这些我没仔细研究过,这个帖子十分有用,后续要是考虑做个索引的话我会添加进去
回复 支持 反对

使用道具 举报

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

本版积分规则

手机版|Archiver|Pokemon Center

GMT+8, 2024-10-26 04:29 , Processed in 0.134239 second(s), 43 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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