还是老样子
以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
然后在
这边加入你的特性描述和相关内容
比如:
这样
下面的英文
我就直接搬来文献解释了
这样第二步就完成了
第三步 对战效果的添加
打开src\battle_util.c
搜索这个
这个是不挠之剑特性的代码
由于ex的特性有详细的类型分类,但特性太多,我懒得找这个类型的开头
就这样解决了
然后我们来确定下特性需要什么限制
确定完后就开始写了(想想效果有没有别的特性可以借鉴)
由于没写好到底要啥效果就随便照着上面那玩意改了下
然后保存
接下来就是随便找只精灵然后实践下啦(记得编译)
由于没有找到好用的录制gif的工具
就懒得发效果gif了
已经测试过了
是有效的
以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了
已经测试过了
是有效的