反编译 添加一个新的特性_P1(风之子)

还是老样子
以pokeemerald-expansion为基础

特性名称:
风之子
特性效果:
开局速度增幅拉满


第一步 添加特性编号
打开项目后
include\constants\abilities.h

#define ABILITY_POISON_PUPPETEER 310
这里

这是最新的特性编号
#define ABILITY_POISON_PUPPETEER 310
然后新建特性编号
#define ABILITY_A_0 311
(前面的英文你爱咋写咋,写编号不能重复)

然后改
#define ABILITIES_COUNT_GEN9 311
改成
#define ABILITIES_COUNT_GEN9 312
这是为什么呢?
因为
#define ABILITIES_COUNT ABILITIES_COUNT_GEN9
这段定义了特性的总数
ABILITIES_COUNT_GEN9是其所参考的

这样第一步添加特性编号就好了


第二步 添加特性相关信息(文本描述)
src\data\abilities.h
然后在

[ABILITY_POISON_PUPPETEER] =
{
.name = _("毒傀儡"),
.description = COMPOUND_STRING("因其招式而中毒时会混乱"),
.aiRating = 8,
.cantBeCopied = TRUE,
.cantBeSwapped = TRUE,
.cantBeTraced = TRUE,
},

这边加入你的特性描述和相关内容
比如:

[ABILITY_POISON_PUPPETEER] =
{
.name = _("毒傀儡"),
.description = COMPOUND_STRING("因其招式而中毒时会混乱"),
.aiRating = 8,
.cantBeCopied = TRUE,
.cantBeSwapped = TRUE,
.cantBeTraced = TRUE,
},
[ABILITY_A_0] =
{
.name = _("风之子"),
.description = COMPOUND_STRING("受到风的祝福,得到速度增幅."),
.aiRating = 5,
.cantBeCopied = TRUE,
.cantBeSwapped = TRUE,
.cantBeTraced = TRUE,
},

这样
下面的英文
我就直接搬来文献解释了

* `cantBeCopied`: Cannot be copied by Role Play or Doodle.
* `cantBeSwapped`: Cannot be swapped with Skill Swap or Wandering Spirit.
* `cantBeTraced`: Cannot be copied by Trace.

这样第二步就完成了

第三步 对战效果的添加
打开src\battle_util.c

搜索这个

case ABILITY_INTREPID_SWORD:
if (!gSpecialStatuses[battler].switchInAbilityDone && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)
&& !(gBattleStruct->intrepidSwordBoost[GetBattlerSide(battler)] & (1u << gBattlerPartyIndexes[battler])))
{
gBattleScripting.savedBattler = gBattlerAttacker;
gBattlerAttacker = battler;
if (B_INTREPID_SWORD == GEN_9)
gBattleStruct->intrepidSwordBoost[GetBattlerSide(battler)] |= 1u << gBattlerPartyIndexes[battler];
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
SET_STATCHANGER(STAT_ATK, 1, FALSE);
BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn);
effect++;
}
break;

这个是不挠之剑特性的代码
由于ex的特性有详细的类型分类,但特性太多,我懒得找这个类型的开头
就这样解决了
然后我们来确定下特性需要什么限制
确定完后就开始写了(想想效果有没有别的特性可以借鉴)

case ABILITY_A_0:
if (!gSpecialStatuses[battler].switchInAbilityDone && CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN))
{
gBattleScripting.savedBattler = gBattlerAttacker;
gBattlerAttacker = battler;
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
SET_STATCHANGER(STAT_SPEED, 6, FALSE);
BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn);
effect++;
}
break;

由于没写好到底要啥效果就随便照着上面那玩意改了下
然后保存
接下来就是随便找只精灵然后实践下啦(记得编译)
由于没有找到好用的录制gif的工具
就懒得发效果gif了
已经测试过了
是有效的
 

在线成员

最新帖子

论坛统计

主题
525
消息
2,391
成员
3,018
最新成员
林木森森