fix trainer theft, update config option

This commit is contained in:
Evan 2020-12-03 08:42:12 -05:00
commit 39cbc21925
41 changed files with 2074 additions and 959 deletions

View File

@ -143,7 +143,7 @@
.macro jumpifability param0:req, ability:req, ptr:req
.byte 0x1e
.byte \param0
.byte \ability
.2byte \ability
.4byte \ptr
.endm
@ -371,7 +371,7 @@
.macro jumpifabilitypresent ability:req, ptr:req
.byte 0x43
.byte \ability
.2byte \ability
.4byte \ptr
.endm

View File

@ -1327,13 +1327,19 @@
.2byte \count
.endm
@ Prepares to start a wild battle against a species at Level level holding item. Running this command will not affect
@ normal wild battles. You start the prepared battle with dowildbattle.
.macro setwildbattle species:req, level:req, item:req
@ Prepares to start a wild battle against a species at Level level holding item.
@ If species2 is something other than SPECIES_NONE, then the battle is a double battle with another pokemon
@ with species species2 at Level level2 holding item2.
@ Running this command will not affect normal wild battles. You start the prepared battle with dowildbattle.
@ If the player only has one pokemon, a scripted double battle will be buggy.
.macro setwildbattle species:req, level:req, item:req, species2=SPECIES_NONE, level2=0, item2=ITEM_NONE
.byte 0xb6
.2byte \species
.byte \level
.2byte \item
.2byte \species2
.byte \level2
.2byte \item2
.endm
@ Starts a wild battle against the Pokemon generated by setwildbattle. Blocks script execution until the battle finishes.

File diff suppressed because it is too large Load Diff

View File

@ -316,8 +316,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8
.4byte BattleScript_EffectClearSmog
.4byte BattleScript_EffectHitSwitchTarget
.4byte BattleScript_EffectFinalGambit
.4byte BattleScript_EffectTechnoBlast
.4byte BattleScript_EffectJudgment
.4byte BattleScript_EffectChangeTypeOnItem
.4byte BattleScript_EffectAutotomize
.4byte BattleScript_EffectCopycat
.4byte BattleScript_EffectDefog
@ -2046,8 +2045,7 @@ BattleScript_EffectPsyshock:
BattleScript_EffectWeatherBall:
BattleScript_EffectHiddenPower:
BattleScript_EffectTwoTypedMove:
BattleScript_EffectTechnoBlast:
BattleScript_EffectJudgment:
BattleScript_EffectChangeTypeOnItem:
BattleScript_EffectFusionCombo:
BattleScript_EffectRevelationDance:
BattleScript_EffectBelch:
@ -7689,6 +7687,13 @@ BattleScript_PrintPlayerForfeitedLinkBattle::
waitmessage 0x40
end2
BattleScript_AnnounceAirLockCloudNine::
call BattleScript_AbilityPopUp
printstring STRINGID_AIRLOCKACTIVATES
waitmessage 0x40
call BattleScript_WeatherFormChanges
end3
BattleScript_Pickpocket::
call BattleScript_AbilityPopUp
setmoveeffect MOVE_EFFECT_STEAL_ITEM
@ -7698,4 +7703,3 @@ BattleScript_Pickpocket::
swapattackerwithtarget
activateitemeffects BS_TARGET
return

View File

@ -229,7 +229,7 @@ struct WishFutureKnock
struct AI_SavedBattleMon
{
u8 ability;
u16 ability;
u16 moves[MAX_MON_MOVES];
u16 heldItem;
u16 species;
@ -254,7 +254,7 @@ struct AI_ThinkingStruct
struct BattleHistory
{
u8 abilities[MAX_BATTLERS_COUNT];
u16 abilities[MAX_BATTLERS_COUNT];
u8 itemEffects[MAX_BATTLERS_COUNT];
u16 usedMoves[MAX_BATTLERS_COUNT][MAX_MON_MOVES];
u16 moveHistory[MAX_BATTLERS_COUNT][AI_MOVE_HISTORY_COUNT]; // 3 last used moves for each battler
@ -477,7 +477,7 @@ struct BattleStruct
u16 lastTakenMove[MAX_BATTLERS_COUNT]; // Last move that a battler was hit with.
u16 hpOnSwitchout[2];
u32 savedBattleTypeFlags;
u8 abilityPreventingSwitchout;
u16 abilityPreventingSwitchout;
u8 hpScale;
u16 synchronizeMoveEffect;
bool8 anyMonHasTransformed;
@ -530,7 +530,7 @@ struct BattleStruct
u8 lastMoveFailed; // as bits for each battler, for the sake of Stomping Tantrum
u8 lastMoveTarget[MAX_BATTLERS_COUNT]; // The last target on which each mon used a move, for the sake of Instruct
u8 debugHoldEffects[MAX_BATTLERS_COUNT]; // These override actual items' hold effects.
u8 tracedAbility[MAX_BATTLERS_COUNT];
u16 tracedAbility[MAX_BATTLERS_COUNT];
u16 hpBefore[MAX_BATTLERS_COUNT]; // Hp of battlers before using a move. For Berserk
bool8 spriteIgnore0Hp;
struct Illusion illusion[MAX_BATTLERS_COUNT];
@ -753,7 +753,7 @@ extern s32 gBattleMoveDamage;
extern s32 gHpDealt;
extern s32 gTakenDmg[MAX_BATTLERS_COUNT];
extern u16 gLastUsedItem;
extern u8 gLastUsedAbility;
extern u16 gLastUsedAbility;
extern u8 gBattlerAttacker;
extern u8 gBattlerTarget;
extern u8 gBattlerFainted;

View File

@ -19,7 +19,7 @@ bool32 IsBattlerAIControlled(u32 battlerId);
void ClearBattlerMoveHistory(u8 battlerId);
void RecordLastUsedMoveBy(u32 battlerId, u32 move);
void RecordKnownMove(u8 battlerId, u32 move);
void RecordAbilityBattle(u8 battlerId, u8 abilityId);
void RecordAbilityBattle(u8 battlerId, u16 abilityId);
void ClearBattlerAbilityHistory(u8 battlerId);
void RecordItemEffectBattle(u8 battlerId, u8 itemEffect);
void ClearBattlerItemEffectHistory(u8 battlerId);

View File

@ -211,7 +211,7 @@ void BtlController_EmitChooseAction(u8 bufferId, u8 arg1, u16 arg2);
void BtlController_EmitUnknownYesNoBox(u8 bufferId);
void BtlController_EmitChooseMove(u8 bufferId, bool8 isDoubleBattle, bool8 NoPpNumber, struct ChooseMoveStruct *movePpData);
void BtlController_EmitChooseItem(u8 bufferId, u8* arg1);
void BtlController_EmitChoosePokemon(u8 bufferId, u8 caseId, u8 arg2, u8 abilityId, u8* arg4);
void BtlController_EmitChoosePokemon(u8 bufferId, u8 caseId, u8 arg2, u16 abilityId, u8* arg4);
void BtlController_EmitCmd23(u8 bufferId); // unused
void BtlController_EmitHealthBarUpdate(u8 bufferId, u16 hpValue);
void BtlController_EmitExpUpdate(u8 bufferId, u8 partyId, u16 expPoints);

View File

@ -105,7 +105,8 @@
textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
textVar[1] = B_BUFF_ABILITY; \
textVar[2] = abilityId; \
textVar[3] = B_BUFF_EOS; \
textVar[3] = (abilityId & 0xFF00) >> 8; \
textVar[4] = B_BUFF_EOS; \
}
#define PREPARE_TYPE_BUFFER(textVar, typeId) \
@ -209,13 +210,13 @@ struct BattleMsgData
u16 currentMove;
u16 originallyUsedMove;
u16 lastItem;
u8 lastAbility;
u16 lastAbility;
u8 scrActive;
u8 unk1605E;
u8 hpScale;
u8 itemEffectBattler;
u8 moveType;
u8 abilities[MAX_BATTLERS_COUNT];
u16 abilities[MAX_BATTLERS_COUNT];
u8 textBuffs[3][TEXT_BUFF_ARRAY_COUNT];
};

View File

@ -349,6 +349,7 @@ extern const u8 BattleScript_EmergencyExitNoPopUp[];
extern const u8 BattleScript_EmergencyExitWild[];
extern const u8 BattleScript_EmergencyExitWildNoPopUp[];
extern const u8 BattleScript_CheekPouchActivates[];
extern const u8 BattleScript_AnnounceAirLockCloudNine[];
extern const u8 BattleScript_Pickpocket[];
#endif // GUARD_BATTLE_SCRIPTS_H

View File

@ -24,6 +24,7 @@ void BattleSetup_StartBattlePikeWildBattle(void);
void BattleSetup_StartRoamerBattle(void);
void StartWallyTutorialBattle(void);
void BattleSetup_StartScriptedWildBattle(void);
void BattleSetup_StartScriptedDoubleWildBattle(void);
void BattleSetup_StartLatiBattle(void);
void BattleSetup_StartLegendaryBattle(void);
void StartGroudonKyogreBattle(void);

View File

@ -90,7 +90,7 @@ u8 AtkCanceller_UnableToUseMove2(void);
bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2);
u8 TryWeatherFormChange(u8 battlerId);
bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility);
u8 AbilityBattleEffects(u8 caseID, u8 battlerId, u8 ability, u8 special, u16 moveArg);
u8 AbilityBattleEffects(u8 caseID, u8 battlerId, u16 ability, u8 special, u16 moveArg);
u32 GetBattlerAbility(u8 battlerId);
u32 IsAbilityOnSide(u32 battlerId, u32 ability);
u32 IsAbilityOnOpposingSide(u32 battlerId, u32 ability);
@ -115,7 +115,7 @@ u8 GetBattleMonMoveSlot(struct BattlePokemon *battleMon, u16 move);
u32 GetBattlerWeight(u8 battlerId);
s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, bool32 isCrit, bool32 randomFactor, bool32 updateFlags);
u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities);
u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u8 abilityDef);
u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef);
u16 GetTypeModifier(u8 atkType, u8 defType);
s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId);
u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId);

View File

@ -77,184 +77,221 @@
#define ABILITY_WHITE_SMOKE 73
#define ABILITY_PURE_POWER 74
#define ABILITY_SHELL_ARMOR 75
#define ABILITY_CACOPHONY 76
#define ABILITY_AIR_LOCK 77
#define ABILITY_AIR_LOCK 76
#define ABILITIES_COUNT_GEN3 78
#define ABILITIES_COUNT_GEN3 77
// Gen4 abilities.
#define ABILITY_TANGLED_FEET 78
#define ABILITY_MOTOR_DRIVE 79
#define ABILITY_RIVALRY 80
#define ABILITY_STEADFAST 81
#define ABILITY_SNOW_CLOAK 82
#define ABILITY_GLUTTONY 83
#define ABILITY_ANGER_POINT 84
#define ABILITY_UNBURDEN 85
#define ABILITY_HEATPROOF 86
#define ABILITY_SIMPLE 87
#define ABILITY_DRY_SKIN 88
#define ABILITY_DOWNLOAD 89
#define ABILITY_IRON_FIST 90
#define ABILITY_POISON_HEAL 91
#define ABILITY_ADAPTABILITY 92
#define ABILITY_SKILL_LINK 93
#define ABILITY_HYDRATION 94
#define ABILITY_SOLAR_POWER 95
#define ABILITY_QUICK_FEET 96
#define ABILITY_NORMALIZE 97
#define ABILITY_SNIPER 98
#define ABILITY_MAGIC_GUARD 99
#define ABILITY_NO_GUARD 100
#define ABILITY_STALL 101
#define ABILITY_TECHNICIAN 102
#define ABILITY_LEAF_GUARD 103
#define ABILITY_KLUTZ 104
#define ABILITY_MOLD_BREAKER 105
#define ABILITY_SUPER_LUCK 106
#define ABILITY_AFTERMATH 107
#define ABILITY_ANTICIPATION 108
#define ABILITY_FOREWARN 109
#define ABILITY_UNAWARE 110
#define ABILITY_TINTED_LENS 111
#define ABILITY_FILTER 112
#define ABILITY_SLOW_START 113
#define ABILITY_SCRAPPY 114
#define ABILITY_STORM_DRAIN 115
#define ABILITY_ICE_BODY 116
#define ABILITY_SOLID_ROCK 117
#define ABILITY_SNOW_WARNING 118
#define ABILITY_HONEY_GATHER 119
#define ABILITY_FRISK 120
#define ABILITY_RECKLESS 121
#define ABILITY_MULTITYPE 122
#define ABILITY_FLOWER_GIFT 123
#define ABILITY_BAD_DREAMS 124
// Gen 4
#define ABILITY_TANGLED_FEET 77
#define ABILITY_MOTOR_DRIVE 78
#define ABILITY_RIVALRY 79
#define ABILITY_STEADFAST 80
#define ABILITY_SNOW_CLOAK 81
#define ABILITY_GLUTTONY 82
#define ABILITY_ANGER_POINT 83
#define ABILITY_UNBURDEN 84
#define ABILITY_HEATPROOF 85
#define ABILITY_SIMPLE 86
#define ABILITY_DRY_SKIN 87
#define ABILITY_DOWNLOAD 88
#define ABILITY_IRON_FIST 89
#define ABILITY_POISON_HEAL 90
#define ABILITY_ADAPTABILITY 91
#define ABILITY_SKILL_LINK 92
#define ABILITY_HYDRATION 93
#define ABILITY_SOLAR_POWER 94
#define ABILITY_QUICK_FEET 95
#define ABILITY_NORMALIZE 96
#define ABILITY_SNIPER 97
#define ABILITY_MAGIC_GUARD 98
#define ABILITY_NO_GUARD 99
#define ABILITY_STALL 100
#define ABILITY_TECHNICIAN 101
#define ABILITY_LEAF_GUARD 102
#define ABILITY_KLUTZ 103
#define ABILITY_MOLD_BREAKER 104
#define ABILITY_SUPER_LUCK 105
#define ABILITY_AFTERMATH 106
#define ABILITY_ANTICIPATION 107
#define ABILITY_FOREWARN 108
#define ABILITY_UNAWARE 109
#define ABILITY_TINTED_LENS 110
#define ABILITY_FILTER 111
#define ABILITY_SLOW_START 112
#define ABILITY_SCRAPPY 113
#define ABILITY_STORM_DRAIN 114
#define ABILITY_ICE_BODY 115
#define ABILITY_SOLID_ROCK 116
#define ABILITY_SNOW_WARNING 117
#define ABILITY_HONEY_GATHER 118
#define ABILITY_FRISK 119
#define ABILITY_RECKLESS 120
#define ABILITY_MULTITYPE 121
#define ABILITY_FLOWER_GIFT 122
#define ABILITY_BAD_DREAMS 123
#define ABILITIES_COUNT_GEN4 125
#define ABILITIES_COUNT_GEN4 124
// Gen5 abilities.
#define ABILITY_PICKPOCKET 125
#define ABILITY_SHEER_FORCE 126
#define ABILITY_CONTRARY 127
#define ABILITY_UNNERVE 128
#define ABILITY_DEFIANT 129
#define ABILITY_DEFEATIST 130
#define ABILITY_CURSED_BODY 131
#define ABILITY_HEALER 132
#define ABILITY_FRIEND_GUARD 133
#define ABILITY_WEAK_ARMOR 134
#define ABILITY_HEAVY_METAL 135
#define ABILITY_LIGHT_METAL 136
#define ABILITY_MULTISCALE 137
#define ABILITY_TOXIC_BOOST 138
#define ABILITY_FLARE_BOOST 139
#define ABILITY_HARVEST 140
#define ABILITY_TELEPATHY 141
#define ABILITY_MOODY 142
#define ABILITY_OVERCOAT 143
#define ABILITY_POISON_TOUCH 144
#define ABILITY_REGENERATOR 145
#define ABILITY_BIG_PECKS 146
#define ABILITY_SAND_RUSH 147
#define ABILITY_WONDER_SKIN 148
#define ABILITY_ANALYTIC 149
#define ABILITY_ILLUSION 150
#define ABILITY_IMPOSTER 151
#define ABILITY_INFILTRATOR 152
#define ABILITY_MUMMY 153
#define ABILITY_MOXIE 154
#define ABILITY_JUSTIFIED 155
#define ABILITY_RATTLED 156
#define ABILITY_MAGIC_BOUNCE 157
#define ABILITY_SAP_SIPPER 158
#define ABILITY_PRANKSTER 159
#define ABILITY_SAND_FORCE 160
#define ABILITY_IRON_BARBS 161
#define ABILITY_ZEN_MODE 162
#define ABILITY_VICTORY_STAR 163
#define ABILITY_TURBOBLAZE 164
#define ABILITY_TERAVOLT 165
// Gen 5
#define ABILITY_PICKPOCKET 124
#define ABILITY_SHEER_FORCE 125
#define ABILITY_CONTRARY 126
#define ABILITY_UNNERVE 127
#define ABILITY_DEFIANT 128
#define ABILITY_DEFEATIST 129
#define ABILITY_CURSED_BODY 130
#define ABILITY_HEALER 131
#define ABILITY_FRIEND_GUARD 132
#define ABILITY_WEAK_ARMOR 133
#define ABILITY_HEAVY_METAL 134
#define ABILITY_LIGHT_METAL 135
#define ABILITY_MULTISCALE 136
#define ABILITY_TOXIC_BOOST 137
#define ABILITY_FLARE_BOOST 138
#define ABILITY_HARVEST 139
#define ABILITY_TELEPATHY 140
#define ABILITY_MOODY 141
#define ABILITY_OVERCOAT 142
#define ABILITY_POISON_TOUCH 143
#define ABILITY_REGENERATOR 144
#define ABILITY_BIG_PECKS 145
#define ABILITY_SAND_RUSH 146
#define ABILITY_WONDER_SKIN 147
#define ABILITY_ANALYTIC 148
#define ABILITY_ILLUSION 149
#define ABILITY_IMPOSTER 150
#define ABILITY_INFILTRATOR 151
#define ABILITY_MUMMY 152
#define ABILITY_MOXIE 153
#define ABILITY_JUSTIFIED 154
#define ABILITY_RATTLED 155
#define ABILITY_MAGIC_BOUNCE 156
#define ABILITY_SAP_SIPPER 157
#define ABILITY_PRANKSTER 158
#define ABILITY_SAND_FORCE 159
#define ABILITY_IRON_BARBS 160
#define ABILITY_ZEN_MODE 161
#define ABILITY_VICTORY_STAR 162
#define ABILITY_TURBOBLAZE 163
#define ABILITY_TERAVOLT 164
#define ABILITIES_COUNT_GEN5 166
#define ABILITIES_COUNT_GEN5 165
// Gen6 abilities.
#define ABILITY_AROMA_VEIL 166
#define ABILITY_FLOWER_VEIL 167
#define ABILITY_CHEEK_POUCH 168
#define ABILITY_PROTEAN 169
#define ABILITY_FUR_COAT 170
#define ABILITY_MAGICIAN 171
#define ABILITY_BULLETPROOF 172
#define ABILITY_COMPETITIVE 173
#define ABILITY_STRONG_JAW 174
#define ABILITY_REFRIGERATE 175
#define ABILITY_SWEET_VEIL 176
#define ABILITY_STANCE_CHANGE 177
#define ABILITY_GALE_WINGS 178
#define ABILITY_MEGA_LAUNCHER 179
#define ABILITY_GRASS_PELT 180
#define ABILITY_SYMBIOSIS 181
#define ABILITY_TOUGH_CLAWS 182
#define ABILITY_PIXILATE 183
#define ABILITY_GOOEY 184
#define ABILITY_AERILATE 185
#define ABILITY_PARENTAL_BOND 186
#define ABILITY_DARK_AURA 187
#define ABILITY_FAIRY_AURA 188
#define ABILITY_AURA_BREAK 189
#define ABILITY_PRIMORDIAL_SEA 190
#define ABILITY_DESOLATE_LAND 191
#define ABILITY_DELTA_STREAM 192
// Gen 6
#define ABILITY_AROMA_VEIL 165
#define ABILITY_FLOWER_VEIL 166
#define ABILITY_CHEEK_POUCH 167
#define ABILITY_PROTEAN 168
#define ABILITY_FUR_COAT 169
#define ABILITY_MAGICIAN 170
#define ABILITY_BULLETPROOF 171
#define ABILITY_COMPETITIVE 172
#define ABILITY_STRONG_JAW 173
#define ABILITY_REFRIGERATE 174
#define ABILITY_SWEET_VEIL 175
#define ABILITY_STANCE_CHANGE 176
#define ABILITY_GALE_WINGS 177
#define ABILITY_MEGA_LAUNCHER 178
#define ABILITY_GRASS_PELT 179
#define ABILITY_SYMBIOSIS 180
#define ABILITY_TOUGH_CLAWS 181
#define ABILITY_PIXILATE 182
#define ABILITY_GOOEY 183
#define ABILITY_AERILATE 184
#define ABILITY_PARENTAL_BOND 185
#define ABILITY_DARK_AURA 186
#define ABILITY_FAIRY_AURA 187
#define ABILITY_AURA_BREAK 188
#define ABILITY_PRIMORDIAL_SEA 189
#define ABILITY_DESOLATE_LAND 190
#define ABILITY_DELTA_STREAM 191
#define ABILITIES_COUNT_GEN6 193
#define ABILITIES_COUNT_GEN6 192
// Gen7 abilities.
#define ABILITY_STAMINA 193
#define ABILITY_WIMP_OUT 194
#define ABILITY_EMERGENCY_EXIT 195
#define ABILITY_WATER_COMPACTION 196
#define ABILITY_MERCILESS 197
#define ABILITY_SHIELDS_DOWN 198
#define ABILITY_STAKEOUT 199
#define ABILITY_WATER_BUBBLE 200
#define ABILITY_STEELWORKER 201
#define ABILITY_BERSERK 202
#define ABILITY_SLUSH_RUSH 203
#define ABILITY_LONG_REACH 204
#define ABILITY_LIQUID_VOICE 205
#define ABILITY_TRIAGE 206
#define ABILITY_GALVANIZE 207
#define ABILITY_SURGE_SURFER 208
#define ABILITY_SCHOOLING 209
#define ABILITY_DISGUISE 210
#define ABILITY_BATTLE_BOND 211
#define ABILITY_POWER_CONSTRUCT 212
#define ABILITY_CORROSION 213
#define ABILITY_COMATOSE 214
#define ABILITY_QUEENLY_MAJESTY 215
#define ABILITY_INNARDS_OUT 216
#define ABILITY_DANCER 217
#define ABILITY_BATTERY 218
#define ABILITY_FLUFFY 219
#define ABILITY_DAZZLING 220
#define ABILITY_SOUL_HEART 221
#define ABILITY_TANGLING_HAIR 222
#define ABILITY_RECEIVER 223
#define ABILITY_POWER_OF_ALCHEMY 224
#define ABILITY_BEAST_BOOST 225
#define ABILITY_RKS_SYSTEM 226
#define ABILITY_ELECTRIC_SURGE 227
#define ABILITY_PSYCHIC_SURGE 228
#define ABILITY_MISTY_SURGE 229
#define ABILITY_GRASSY_SURGE 230
#define ABILITY_FULL_METAL_BODY 231
#define ABILITY_SHADOW_SHIELD 232
#define ABILITY_PRISM_ARMOR 233
#define ABILITY_NEUROFORCE 234
// Gen 7
#define ABILITY_STAMINA 192
#define ABILITY_WIMP_OUT 193
#define ABILITY_EMERGENCY_EXIT 194
#define ABILITY_WATER_COMPACTION 195
#define ABILITY_MERCILESS 196
#define ABILITY_SHIELDS_DOWN 197
#define ABILITY_STAKEOUT 198
#define ABILITY_WATER_BUBBLE 199
#define ABILITY_STEELWORKER 200
#define ABILITY_BERSERK 201
#define ABILITY_SLUSH_RUSH 202
#define ABILITY_LONG_REACH 203
#define ABILITY_LIQUID_VOICE 204
#define ABILITY_TRIAGE 205
#define ABILITY_GALVANIZE 206
#define ABILITY_SURGE_SURFER 207
#define ABILITY_SCHOOLING 208
#define ABILITY_DISGUISE 209
#define ABILITY_BATTLE_BOND 210
#define ABILITY_POWER_CONSTRUCT 211
#define ABILITY_CORROSION 212
#define ABILITY_COMATOSE 213
#define ABILITY_QUEENLY_MAJESTY 214
#define ABILITY_INNARDS_OUT 215
#define ABILITY_DANCER 216
#define ABILITY_BATTERY 217
#define ABILITY_FLUFFY 218
#define ABILITY_DAZZLING 219
#define ABILITY_SOUL_HEART 220
#define ABILITY_TANGLING_HAIR 221
#define ABILITY_RECEIVER 222
#define ABILITY_POWER_OF_ALCHEMY 223
#define ABILITY_BEAST_BOOST 224
#define ABILITY_RKS_SYSTEM 225
#define ABILITY_ELECTRIC_SURGE 226
#define ABILITY_PSYCHIC_SURGE 227
#define ABILITY_MISTY_SURGE 228
#define ABILITY_GRASSY_SURGE 229
#define ABILITY_FULL_METAL_BODY 230
#define ABILITY_SHADOW_SHIELD 231
#define ABILITY_PRISM_ARMOR 232
#define ABILITY_NEUROFORCE 233
#define ABILITIES_COUNT_GEN7 235
#define ABILITIES_COUNT_GEN7 234
#define ABILITIES_COUNT ABILITIES_COUNT_GEN7
// Gen 8
#define ABILITY_INTREPID_SWORD 234
#define ABILITY_DAUNTLESS_SHIELD 235
#define ABILITY_LIBERO 236
#define ABILITY_BALL_FETCH 237
#define ABILITY_COTTON_DOWN 238
#define ABILITY_PROPELLER_TAIL 239
#define ABILITY_MIRROR_ARMOR 240
#define ABILITY_GULP_MISSILE 241
#define ABILITY_STALWART 242
#define ABILITY_STEAM_ENGINE 243
#define ABILITY_PUNK_ROCK 244
#define ABILITY_SAND_SPIT 245
#define ABILITY_ICE_SCALES 246
#define ABILITY_RIPEN 247
#define ABILITY_ICE_FACE 248
#define ABILITY_POWER_SPOT 249
#define ABILITY_MIMICRY 250
#define ABILITY_SCREEN_CLEANER 251
#define ABILITY_STEELY_SPIRIT 252
#define ABILITY_PERISH_BODY 253
#define ABILITY_WANDERING_SPIRIT 254
#define ABILITY_GORILLA_TACTICS 255
#define ABILITY_NEUTRALIZING_GAS 256
#define ABILITY_PASTEL_VEIL 257
#define ABILITY_HUNGER_SWITCH 258
#define ABILITY_QUICK_DRAW 259
#define ABILITY_UNSEEN_FIST 260
#define ABILITY_CURIOUS_MEDICINE 261
#define ABILITY_TRANSISTOR 262
#define ABILITY_DRAGONS_MAW 263
#define ABILITY_CHILLING_NEIGH 264
#define ABILITY_GRIM_NEIGH 265
#define ABILITY_AS_ONE_ICE_RIDER 266
#define ABILITY_AS_ONE_SHADOW_RIDER 267
#define ABILITIES_COUNT_GEN8 268
#define ABILITIES_COUNT ABILITIES_COUNT_GEN8
#endif // GUARD_CONSTANTS_ABILITIES_H

View File

@ -3,26 +3,38 @@
// Species with peculiar battle effects.
#ifndef POKEMON_EXPANSION
#define SPECIES_DIALGA 0
#define SPECIES_PALKIA 0
#define SPECIES_GIRATINA 0
#define SPECIES_CHERRIM 0
#define SPECIES_ARCEUS 0
#define SPECIES_SILVALLY 0
#define SPECIES_GENESECT 0
#define SPECIES_AEGISLASH 0
#define SPECIES_AEGISLASH_BLADE 10000
#define SPECIES_MIMIKYU 0
#define SPECIES_MIMIKYU_BUSTED 10001
#define SPECIES_DARMANITAN 0
#define SPECIES_DARMANITAN_ZEN 10002
#define SPECIES_MINIOR_CORE 0
#define SPECIES_MINIOR 10003
#define SPECIES_WISHIWASHI 0
#define SPECIES_WISHIWASHI_SCHOOL 10004
#define SPECIES_ZYGARDE 0 // 50%
#define SPECIES_ZYGARDE_10 10005 // 10 %
#define SPECIES_ZYGARDE_COMPLETE 10006 // 100 %
#define SPECIES_DIALGA 0
#define SPECIES_PALKIA 0
#define SPECIES_GIRATINA 0
#define SPECIES_CHERRIM 0
#define SPECIES_ARCEUS 0
#define SPECIES_SILVALLY 0
#define SPECIES_GENESECT 0
#define SPECIES_AEGISLASH 0
#define SPECIES_AEGISLASH_BLADE 10000
#define SPECIES_MIMIKYU 0
#define SPECIES_MIMIKYU_BUSTED 10001
#define SPECIES_DARMANITAN 0
#define SPECIES_DARMANITAN_ZEN_MODE 10002
#define SPECIES_MINIOR_CORE_RED 0
#define SPECIES_MINIOR 10003
#define SPECIES_MINIOR_CORE_BLUE 0
#define SPECIES_MINIOR_METEOR_BLUE 10004
#define SPECIES_MINIOR_CORE_GREEN 0
#define SPECIES_MINIOR_METEOR_GREEN 10005
#define SPECIES_MINIOR_CORE_INDIGO 0
#define SPECIES_MINIOR_METEOR_INDIGO 10006
#define SPECIES_MINIOR_CORE_ORANGE 0
#define SPECIES_MINIOR_METEOR_ORANGE 10007
#define SPECIES_MINIOR_CORE_VIOLET 0
#define SPECIES_MINIOR_METEOR_VIOLET 10008
#define SPECIES_MINIOR_CORE_YELLOW 0
#define SPECIES_MINIOR_METEOR_YELLOW 10009
#define SPECIES_WISHIWASHI 0
#define SPECIES_WISHIWASHI_SCHOOL 10010
#define SPECIES_ZYGARDE 0 // 50%
#define SPECIES_ZYGARDE_10 10011 // 10 %
#define SPECIES_ZYGARDE_COMPLETE 10012 // 100 %
#endif
// Items with peculiar battle effects.
@ -133,7 +145,7 @@
#define B_PARALYZE_ELECTRIC GEN_6 // In Gen6+, Electric-type Pokémon can't be paralyzed.
#define B_POWDER_GRASS GEN_6 // In Gen6+, Grass-type Pokémon are immune to powder and spore moves.
#define B_STEEL_RESISTANCES GEN_6 // In Gen6+, Steel-type Pokémon are no longer resistant to Dark and Ghost moves.
#define B_TRAINERS_STEAL_ITEMS TRUE // If TRUE, trainer with thief/pickpocket will temporarily steal your items
#define B_TRAINERS_KNOCK_OFF_ITEMS TRUE // If TRUE, trainers can steal/swap your items (non-berries are restored after battle). In vanilla games trainers cannot steal items.
// Animation Settings
#define B_NEW_SWORD_PARTICLE TRUE // If set to TRUE, it updates Swords Dance's particle.

View File

@ -551,7 +551,30 @@
#define STRINGID_CLOAKEDINAFREEZINGLIGHT 547
#define STRINGID_STATWASNOTLOWERED 548
#define STRINGID_FERVENTWISHREACHED 549
#define STRINGID_AIRLOCKACTIVATES 550
#define STRINGID_PRESSUREENTERS 551
#define STRINGID_DARKAURAENTERS 552
#define STRINGID_FAIRYAURAENTERS 553
#define STRINGID_AURABREAKENTERS 554
#define STRINGID_COMATOSEENTERS 555
#define STRINGID_SCREENCLEANERENTERS 556
#define BATTLESTRINGS_COUNT 550
#define BATTLESTRINGS_COUNT 557
//// multichoice message IDs
// switch in ability message
#define MULTI_SWITCHIN_MOLDBREAKER 0
#define MULTI_SWITCHIN_TERAVOLT 1
#define MULTI_SWITCHIN_TURBOBLAZE 2
#define MULTI_SWITCHIN_SLOWSTART 3
#define MULTI_SWITCHIN_UNNERVE 4
#define MULTI_SWITCHIN_ANTICIPATION 5
#define MULTI_SWITCHIN_FOREWARN 6
#define MULTI_SWITCHIN_PRESSURE 7
#define MULTI_SWITCHIN_DARKAURA 8
#define MULTI_SWITCHIN_FAIRYAURA 9
#define MULTI_SWITCHIN_AURABREAK 10
#define MULTI_SWITCHIN_COMATOSE 11
#define MULTI_SWITCHIN_SCREENCLEANER 12
#endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H

View File

@ -359,7 +359,7 @@
#define MOVES_COUNT_GEN3 355
// Gen4 moves.
// Gen 4 moves.
#define MOVE_ROOST 355
#define MOVE_GRAVITY 356
#define MOVE_MIRACLE_EYE 357
@ -476,7 +476,7 @@
#define MOVES_COUNT_GEN4 468
// Gen5 moves.
// Gen 5 moves.
#define MOVE_HONE_CLAWS 468
#define MOVE_WIDE_GUARD 469
#define MOVE_GUARD_SPLIT 470
@ -572,7 +572,7 @@
#define MOVES_COUNT_GEN5 560
// Gen6 moves.
// Gen 6 moves.
#define MOVE_FLYING_PRESS 560
#define MOVE_MAT_BLOCK 561
#define MOVE_BELCH 562
@ -631,6 +631,7 @@
#define MOVE_THOUSAND_WAVES 615
#define MOVE_LANDS_WRATH 616
#define MOVE_LIGHT_OF_RUIN 617
// ORAS Moves
#define MOVE_ORIGIN_PULSE 618
#define MOVE_PRECIPICE_BLADES 619
#define MOVE_DRAGON_ASCENT 620
@ -638,7 +639,7 @@
#define MOVES_COUNT_GEN6 622
// Gen7 moves.
// Gen 7 moves.
#define MOVE_SHORE_UP 622
#define MOVE_FIRST_IMPRESSION 623
#define MOVE_BANEFUL_BUNKER 624
@ -690,52 +691,90 @@
#define MOVE_ZING_ZAP 670
#define MOVE_NATURES_MADNESS 671
#define MOVE_MULTI_ATTACK 672
// USUM Moves
#define MOVE_MIND_BLOWN 673
#define MOVE_PLASMA_FISTS 674
#define MOVE_PHOTON_GEYSER 675
#define MOVE_DOUBLE_IRON_BASH 676
// LGPE Moves
#define MOVE_ZIPPY_ZAP 676
#define MOVE_SPLISHY_SPLASH 677
#define MOVE_FLOATY_FALL 678
#define MOVE_PIKA_PAPOW 679
#define MOVE_BOUNCY_BUBBLE 680
#define MOVE_BUZZY_BUZZ 681
#define MOVE_SIZZLY_SLIDE 682
#define MOVE_GLITZY_GLOW 683
#define MOVE_BADDY_BAD 684
#define MOVE_SAPPY_SEED 685
#define MOVE_FREEZY_FROST 686
#define MOVE_SPARKLY_SWIRL 687
#define MOVE_VEEVEE_VOLLEY 688
#define MOVE_DOUBLE_IRON_BASH 689
#define MOVES_COUNT_GEN7 677
#define MOVES_COUNT_GEN7 690
// Gen 8 moves.
#define MOVE_DYNAMAX_CANNON (MOVES_COUNT_GEN7 + 0)
#define MOVE_SNIPE_SHOT (MOVES_COUNT_GEN7 + 1)
#define MOVE_JAW_LOCK (MOVES_COUNT_GEN7 + 2)
#define MOVE_STUFF_CHEEKS (MOVES_COUNT_GEN7 + 3)
#define MOVE_NO_RETREAT (MOVES_COUNT_GEN7 + 4)
#define MOVE_TAR_SHOT (MOVES_COUNT_GEN7 + 5)
#define MOVE_MAGIC_POWDER (MOVES_COUNT_GEN7 + 6)
#define MOVE_DRAGON_DARTS (MOVES_COUNT_GEN7 + 7)
#define MOVE_TEATIME (MOVES_COUNT_GEN7 + 8)
#define MOVE_OCTOLOCK (MOVES_COUNT_GEN7 + 9)
#define MOVE_BOLT_BEAK (MOVES_COUNT_GEN7 + 10)
#define MOVE_FISHIOUS_REND (MOVES_COUNT_GEN7 + 11)
#define MOVE_COURT_CHANGE (MOVES_COUNT_GEN7 + 12)
#define MOVE_CLANGOROUS_SOUL (MOVES_COUNT_GEN7 + 13)
#define MOVE_BODY_PRESS (MOVES_COUNT_GEN7 + 14)
#define MOVE_DECORATE (MOVES_COUNT_GEN7 + 15)
#define MOVE_DRUM_BEATING (MOVES_COUNT_GEN7 + 16)
#define MOVE_SNAP_TRAP (MOVES_COUNT_GEN7 + 17)
#define MOVE_PYRO_BALL (MOVES_COUNT_GEN7 + 18)
#define MOVE_BEHEMOTH_BLADE (MOVES_COUNT_GEN7 + 19)
#define MOVE_BEHEMOTH_BASH (MOVES_COUNT_GEN7 + 20)
#define MOVE_AURA_WHEEL (MOVES_COUNT_GEN7 + 21)
#define MOVE_BREAKING_SWIPE (MOVES_COUNT_GEN7 + 22)
#define MOVE_BRANCH_POKE (MOVES_COUNT_GEN7 + 23)
#define MOVE_OVERDRIVE (MOVES_COUNT_GEN7 + 24)
#define MOVE_APPLE_ACID (MOVES_COUNT_GEN7 + 25)
#define MOVE_GRAV_APPLE (MOVES_COUNT_GEN7 + 26)
#define MOVE_SPIRIT_BREAK (MOVES_COUNT_GEN7 + 27)
#define MOVE_STRANGE_STEAM (MOVES_COUNT_GEN7 + 28)
#define MOVE_LIFE_DEW (MOVES_COUNT_GEN7 + 29)
#define MOVE_OBSTRUCT (MOVES_COUNT_GEN7 + 30)
#define MOVE_FALSE_SURRENDER (MOVES_COUNT_GEN7 + 31)
#define MOVE_METEOR_ASSAULT (MOVES_COUNT_GEN7 + 32)
#define MOVE_ETERNABEAM (MOVES_COUNT_GEN7 + 33)
#define MOVE_STEEL_BEAM (MOVES_COUNT_GEN7 + 34)
#define MOVE_DYNAMAX_CANNON 690
#define MOVE_SNIPE_SHOT 691
#define MOVE_JAW_LOCK 692
#define MOVE_STUFF_CHEEKS 693
#define MOVE_NO_RETREAT 694
#define MOVE_TAR_SHOT 695
#define MOVE_MAGIC_POWDER 696
#define MOVE_DRAGON_DARTS 697
#define MOVE_TEATIME 698
#define MOVE_OCTOLOCK 699
#define MOVE_BOLT_BEAK 700
#define MOVE_FISHIOUS_REND 701
#define MOVE_COURT_CHANGE 702
#define MOVE_CLANGOROUS_SOUL 703
#define MOVE_BODY_PRESS 704
#define MOVE_DECORATE 705
#define MOVE_DRUM_BEATING 706
#define MOVE_SNAP_TRAP 707
#define MOVE_PYRO_BALL 708
#define MOVE_BEHEMOTH_BLADE 709
#define MOVE_BEHEMOTH_BASH 710
#define MOVE_AURA_WHEEL 711
#define MOVE_BREAKING_SWIPE 712
#define MOVE_BRANCH_POKE 713
#define MOVE_OVERDRIVE 714
#define MOVE_APPLE_ACID 715
#define MOVE_GRAV_APPLE 716
#define MOVE_SPIRIT_BREAK 717
#define MOVE_STRANGE_STEAM 718
#define MOVE_LIFE_DEW 719
#define MOVE_OBSTRUCT 720
#define MOVE_FALSE_SURRENDER 721
#define MOVE_METEOR_ASSAULT 722
#define MOVE_ETERNABEAM 723
#define MOVE_STEEL_BEAM 724
// Isle of Armor Moves
#define MOVE_EXPANDING_FORCE 725
#define MOVE_STEEL_ROLLER 726
#define MOVE_SCALE_SHOT 727
#define MOVE_METEOR_BEAM 728
#define MOVE_SHELL_SIDE_ARM 729
#define MOVE_MISTY_EXPLOSION 730
#define MOVE_GRASSY_GLIDE 731
#define MOVE_RISING_VOLTAGE 732
#define MOVE_TERRAIN_PULSE 733
#define MOVE_SKITTER_SMACK 734
#define MOVE_BURNING_JEALOUSY 735
#define MOVE_LASH_OUT 736
#define MOVE_POLTERGEIST 737
#define MOVE_CORROSIVE_GAS 738
#define MOVE_COACHING 739
#define MOVE_FLIP_TURN 740
#define MOVE_TRIPLE_AXEL 741
#define MOVE_DUAL_WINGBEAT 742
#define MOVE_SCORCHING_SANDS 743
#define MOVE_JUNGLE_HEALING 744
#define MOVE_WICKED_BLOW 745
#define MOVE_SURGING_STRIKES 746
#define MOVES_COUNT_GEN8 (MOVES_COUNT_GEN7 + 35)
#define MOVES_COUNT_GEN8 747
#define MOVES_COUNT MOVES_COUNT_GEN8
#define MOVES_COUNT MOVES_COUNT_GEN8
#endif // GUARD_CONSTANTS_MOVES_H

View File

@ -152,24 +152,24 @@ struct BattlePokemon
/*0x17*/ u32 spDefenseIV:5;
/*0x17*/ u32 abilityNum:2;
/*0x18*/ s8 statStages[NUM_BATTLE_STATS];
/*0x20*/ u8 ability;
/*0x21*/ u8 type1;
/*0x22*/ u8 type2;
/*0x23*/ u8 type3;
/*0x24*/ u8 pp[MAX_MON_MOVES];
/*0x28*/ u16 hp;
/*0x2A*/ u8 level;
/*0x2B*/ u8 friendship;
/*0x2C*/ u16 maxHP;
/*0x2E*/ u16 item;
/*0x30*/ u8 nickname[POKEMON_NAME_LENGTH + 1];
/*0x3B*/ u8 ppBonuses;
/*0x3C*/ u8 otName[PLAYER_NAME_LENGTH + 1];
/*0x44*/ u32 experience;
/*0x48*/ u32 personality;
/*0x4C*/ u32 status1;
/*0x50*/ u32 status2;
/*0x54*/ u32 otId;
/*0x20*/ u16 ability;
/*0x22*/ u8 type1;
/*0x23*/ u8 type2;
/*0x24*/ u8 type3;
/*0x25*/ u8 pp[MAX_MON_MOVES];
/*0x29*/ u16 hp;
/*0x2B*/ u8 level;
/*0x2C*/ u8 friendship;
/*0x2D*/ u16 maxHP;
/*0x2F*/ u16 item;
/*0x31*/ u8 nickname[POKEMON_NAME_LENGTH + 1];
/*0x3C*/ u8 ppBonuses;
/*0x3D*/ u8 otName[PLAYER_NAME_LENGTH + 1];
/*0x45*/ u32 experience;
/*0x49*/ u32 personality;
/*0x4D*/ u32 status1;
/*0x51*/ u32 status2;
/*0x55*/ u32 otId;
};
struct BaseStats
@ -198,9 +198,12 @@ struct BaseStats
/* 0x13 */ u8 growthRate;
/* 0x14 */ u8 eggGroup1;
/* 0x15 */ u8 eggGroup2;
/* 0x16 */ u8 abilities[2];
/* 0x18 */ u8 safariZoneFleeRate;
/* 0x19 */ u8 bodyColor : 7;
/* 0x16 */ u16 abilities[2];
#ifdef POKEMON_EXPANSION
u16 abilityHidden;
#endif
u8 safariZoneFleeRate;
u8 bodyColor : 7;
u8 noFlip : 1;
};
@ -327,8 +330,8 @@ u8 CalculatePlayerPartyCount(void);
u8 CalculateEnemyPartyCount(void);
u8 GetMonsStateToDoubles(void);
u8 GetMonsStateToDoubles_2(void);
u8 GetAbilityBySpecies(u16 species, u8 abilityNum);
u8 GetMonAbility(struct Pokemon *mon);
u16 GetAbilityBySpecies(u16 species, u8 abilityNum);
u16 GetMonAbility(struct Pokemon *mon);
void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord);
u8 GetSecretBaseTrainerPicIndex(void);
u8 GetSecretBaseTrainerClass(void);

View File

@ -4,6 +4,7 @@
u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8);
u8 ScriptGiveEgg(u16);
void CreateScriptedWildMon(u16, u8, u16);
void CreateScriptedDoubleWildMon(u16, u8, u16, u16, u8, u16);
void ScriptSetMonMoveSlot(u8, u16, u8);
void ReducePlayerPartyToSelectedMons(void);
void HealPlayerParty(void);

View File

@ -788,7 +788,7 @@ void RecordKnownMove(u8 battlerId, u32 move)
}
}
void RecordAbilityBattle(u8 battlerId, u8 abilityId)
void RecordAbilityBattle(u8 battlerId, u16 abilityId)
{
BATTLE_HISTORY->abilities[battlerId] = abilityId;
}

View File

@ -137,7 +137,7 @@ static bool8 ShouldSwitchIfWonderGuard(void)
static bool8 FindMonThatAbsorbsOpponentsMove(void)
{
u8 battlerIn1, battlerIn2;
u8 absorbingTypeAbility;
u16 absorbingTypeAbility;
s32 firstId;
s32 lastId; // + 1
struct Pokemon *party;
@ -188,7 +188,7 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
for (i = firstId; i < lastId; i++)
{
u16 species;
u8 monAbility;
u16 monAbility;
if (GetMonData(&party[i], MON_DATA_HP) == 0)
continue;
@ -369,7 +369,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u16 flags, u8 moduloPercent)
for (i = firstId; i < lastId; i++)
{
u16 species;
u8 monAbility;
u16 monAbility;
if (GetMonData(&party[i], MON_DATA_HP) == 0)
continue;

View File

@ -65,6 +65,20 @@ static const union AffineAnimCmd sSquishTargetAffineAnimCmds[] =
AFFINEANIMCMD_END,
};
//// GEN 4
// power trick
const struct SpriteTemplate gPowerTrickSpriteTemplate =
{
.tileTag = ANIM_TAG_POWER_TRICK,
.paletteTag = ANIM_TAG_POWER_TRICK,
.oam = &gOamData_AffineNormal_ObjNormal_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gAffineAnims_SpinningBone,
.callback = SpriteCB_SpriteOnMonForDuration
};
//// GEN 5
//wide guard
const struct SpriteTemplate gWideGuardBlueConversionTemplate =

View File

@ -2762,7 +2762,7 @@ static void PlayerHandleChoosePokemon(void)
gTasks[gUnknown_03005D7C[gActiveBattler]].data[0] = gBattleResources->bufferA[gActiveBattler][1] & 0xF;
*(&gBattleStruct->battlerPreventingSwitchout) = gBattleResources->bufferA[gActiveBattler][1] >> 4;
*(&gBattleStruct->field_8B) = gBattleResources->bufferA[gActiveBattler][2];
*(&gBattleStruct->abilityPreventingSwitchout) = gBattleResources->bufferA[gActiveBattler][3];
*(&gBattleStruct->abilityPreventingSwitchout) = (gBattleResources->bufferA[gActiveBattler][3] & 0xFF) | (gBattleResources->bufferA[gActiveBattler][7] << 8);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
gBattlerControllerFuncs[gActiveBattler] = OpenPartyMenuToChooseMon;
gBattlerInMenuId = gActiveBattler;

View File

@ -1186,14 +1186,15 @@ void BtlController_EmitChooseItem(u8 bufferId, u8 *arg1)
PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
void BtlController_EmitChoosePokemon(u8 bufferId, u8 caseId, u8 slotId, u8 abilityId, u8 *arg4)
void BtlController_EmitChoosePokemon(u8 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 *arg4)
{
s32 i;
sBattleBuffersTransferData[0] = CONTROLLER_CHOOSEPOKEMON;
sBattleBuffersTransferData[1] = caseId;
sBattleBuffersTransferData[2] = slotId;
sBattleBuffersTransferData[3] = abilityId;
sBattleBuffersTransferData[3] = abilityId & 0xFF;
sBattleBuffersTransferData[7] = (abilityId >> 8) & 0xFF;
for (i = 0; i < 3; i++)
sBattleBuffersTransferData[4 + i] = arg4[i];
PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 8); // Only 7 bytes were written.

View File

@ -1448,15 +1448,15 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data)
{
case LIST_ITEM_ABILITY:
data->modifyArrows.minValue = 0;
data->modifyArrows.maxValue = ABILITIES_COUNT_GEN7 - 1;
data->modifyArrows.maxValue = ABILITIES_COUNT_GEN8 - 1;
data->modifyArrows.maxDigits = 3;
data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].ability;
data->modifyArrows.typeOfVal = VAL_U8;
data->modifyArrows.typeOfVal = VAL_U16;
data->modifyArrows.currValue = gBattleMons[data->battlerId].ability;
break;
case LIST_ITEM_MOVES:
data->modifyArrows.minValue = 0;
data->modifyArrows.maxValue = MOVES_COUNT_GEN7 - 1;
data->modifyArrows.maxValue = MOVES_COUNT_GEN8 - 1;
data->modifyArrows.maxDigits = 3;
if (data->currentSecondaryListItemId == 4)
{

View File

@ -162,7 +162,7 @@ EWRAM_DATA s32 gBattleMoveDamage = 0;
EWRAM_DATA s32 gHpDealt = 0;
EWRAM_DATA s32 gTakenDmg[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u16 gLastUsedItem = 0;
EWRAM_DATA u8 gLastUsedAbility = 0;
EWRAM_DATA u16 gLastUsedAbility = 0;
EWRAM_DATA u8 gBattlerAttacker = 0;
EWRAM_DATA u8 gBattlerTarget = 0;
EWRAM_DATA u8 gBattlerFainted = 0;
@ -4819,7 +4819,7 @@ static void HandleEndTurn_FinishBattle(void)
sub_8186444();
BeginFastPaletteFade(3);
FadeOutMapMusic(5);
#if B_TRAINERS_STEAL_ITEMS
#if B_TRAINERS_KNOCK_OFF_ITEMS
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
TryRestoreStolenItems();
#endif
@ -4841,7 +4841,7 @@ static void HandleEndTurn_FinishBattle(void)
static void FreeResetData_ReturnToOvOrDoEvolutions(void)
{
if (!gPaletteFade.active)
{
{
ResetSpriteData();
if (gLeveledUpInBattle && (gBattleOutcome == B_OUTCOME_WON || gBattleOutcome == B_OUTCOME_CAUGHT))
{

View File

@ -53,7 +53,7 @@ static void ChooseTypeOfMoveUsedString(u8 *dst);
static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst);
// EWRAM vars
static EWRAM_DATA u8 sBattlerAbilities[MAX_BATTLERS_COUNT] = {0};
static EWRAM_DATA u16 sBattlerAbilities[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA struct BattleMsgData *gBattleMsgDataPtr = NULL;
// const rom data
@ -678,6 +678,13 @@ static const u8 sText_NoOneWillBeAbleToRun[] = _("No one will be able to run awa
static const u8 sText_DestinyKnotActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} fell in love\nfrom the {B_LAST_ITEM}!");
static const u8 sText_CloakedInAFreezingLight[] = _("{B_ATK_NAME_WITH_PREFIX} became cloaked\nin a freezing light!");
static const u8 sText_StatWasNotLowered[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\nwas not lowered!");
static const u8 sText_AirLockActivates[] = _("The effects of weather\ndisappeared.");
static const u8 sText_PressureActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is exerting its\npressure!");
static const u8 sText_DarkAuraActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating\na dark aura!");
static const u8 sText_FairyAuraActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating\na fairy aura!");
static const u8 sText_AuraBreakActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} reversed all\nother POKéMON's auras!");
static const u8 sText_ComatoseActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is drowsing!");
static const u8 sText_ScreenCleanerActivates[] = _("All screens on the field were\ncleansed!");
const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
{
@ -1219,6 +1226,13 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
[STRINGID_GRASSYTERRAINHEALS - 12] = sText_GrassyTerrainHeals,
[STRINGID_ELECTRICTERRAINPREVENTS - 12] = sText_ElectricTerrainPreventsSleep,
[STRINGID_PSYCHICTERRAINPREVENTS - 12] = sText_PsychicTerrainPreventsPriority,
[STRINGID_AIRLOCKACTIVATES - 12] = sText_AirLockActivates,
[STRINGID_PRESSUREENTERS - 12] = sText_PressureActivates,
[STRINGID_DARKAURAENTERS - 12] = sText_DarkAuraActivates,
[STRINGID_FAIRYAURAENTERS - 12] = sText_FairyAuraActivates,
[STRINGID_AURABREAKENTERS - 12] = sText_AuraBreakActivates,
[STRINGID_COMATOSEENTERS - 12] = sText_ComatoseActivates,
[STRINGID_SCREENCLEANERENTERS - 12] = sText_ScreenCleanerActivates,
};
const u16 gTerrainStringIds[] =
@ -1248,9 +1262,19 @@ const u16 gDmgHazardsStringIds[] =
const u16 gSwitchInAbilityStringIds[] =
{
STRINGID_MOLDBREAKERENTERS, STRINGID_TERAVOLTENTERS, STRINGID_TURBOBLAZEENTERS,
STRINGID_SLOWSTARTENTERS, STRINGID_UNNERVEENTERS, STRINGID_ANTICIPATIONACTIVATES,
STRINGID_FOREWARNACTIVATES
[MULTI_SWITCHIN_MOLDBREAKER] = STRINGID_MOLDBREAKERENTERS,
[MULTI_SWITCHIN_TERAVOLT] = STRINGID_TERAVOLTENTERS,
[MULTI_SWITCHIN_TURBOBLAZE] = STRINGID_TURBOBLAZEENTERS,
[MULTI_SWITCHIN_SLOWSTART] = STRINGID_SLOWSTARTENTERS,
[MULTI_SWITCHIN_UNNERVE] = STRINGID_UNNERVEENTERS,
[MULTI_SWITCHIN_ANTICIPATION] = STRINGID_ANTICIPATIONACTIVATES,
[MULTI_SWITCHIN_FOREWARN] = STRINGID_FOREWARNACTIVATES,
[MULTI_SWITCHIN_PRESSURE] = STRINGID_PRESSUREENTERS,
[MULTI_SWITCHIN_DARKAURA] = STRINGID_DARKAURAENTERS,
[MULTI_SWITCHIN_FAIRYAURA] = STRINGID_FAIRYAURAENTERS,
[MULTI_SWITCHIN_AURABREAK] = STRINGID_AURABREAKENTERS,
[MULTI_SWITCHIN_COMATOSE] = STRINGID_COMATOSEENTERS,
[MULTI_SWITCHIN_SCREENCLEANER] = STRINGID_SCREENCLEANERENTERS,
};
const u16 gMissStringIds[] =
@ -3409,7 +3433,7 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
break;
case B_BUFF_ABILITY: // ability names
StringAppend(dst, gAbilityNames[src[srcID + 1]]);
srcID += 2;
srcID += 3;
break;
case B_BUFF_ITEM: // item name
hword = T1_READ_16(&src[srcID + 1]);

View File

@ -811,7 +811,7 @@ static void HealMon(struct Pokemon *mon)
static bool8 DoesAbilityPreventStatus(struct Pokemon *mon, u32 status)
{
u8 ability = GetMonAbility(mon);
u16 ability = GetMonAbility(mon);
bool8 ret = FALSE;
switch (status)
@ -1627,7 +1627,7 @@ static bool8 CanEncounterWildMon(u8 enemyMonLevel)
{
if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
{
u8 monAbility = GetMonAbility(&gPlayerParty[0]);
u16 monAbility = GetMonAbility(&gPlayerParty[0]);
if (monAbility == ABILITY_KEEN_EYE || monAbility == ABILITY_INTIMIDATE)
{
u8 playerMonLevel = GetMonData(&gPlayerParty[0], MON_DATA_LEVEL);

View File

@ -2371,7 +2371,7 @@ static void CheckSetUnburden(u8 battlerId)
//slight difference in thief/pickpocket requires this
static void StealTargetItem(void)
{
{
gLastUsedItem = gBattleStruct->changedItems[gBattlerAttacker] = gBattleMons[gBattlerTarget].item;
gBattleMons[gBattlerTarget].item = 0;
@ -2392,7 +2392,7 @@ static void StealTargetItem(void)
gBattleStruct->choicedMove[gBattlerTarget] = 0;
#if B_TRAINERS_STEAL_ITEMS
#if B_TRAINERS_KNOCK_OFF_ITEMS == TRUE
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
gBattleStruct->itemStolen[gBattlerPartyIndexes[gBattlerTarget]] = gLastUsedItem;
#endif
@ -3421,7 +3421,7 @@ static void Cmd_jumpifability(void)
{
u32 battlerId;
bool32 hasAbility = FALSE;
u32 ability = gBattlescriptCurrInstr[2];
u32 ability = T2_READ_16(gBattlescriptCurrInstr + 2);
switch (gBattlescriptCurrInstr[1])
{
@ -3451,13 +3451,13 @@ static void Cmd_jumpifability(void)
if (hasAbility)
{
gLastUsedAbility = ability;
gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 3);
gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 4);
RecordAbilityBattle(battlerId, gLastUsedAbility);
gBattlerAbility = battlerId;
}
else
{
gBattlescriptCurrInstr += 7;
gBattlescriptCurrInstr += 8;
}
}
@ -4375,10 +4375,10 @@ static void Cmd_setroost(void)
static void Cmd_jumpifabilitypresent(void)
{
if (IsAbilityOnField(gBattlescriptCurrInstr[1]))
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
if (IsAbilityOnField(T1_READ_16(gBattlescriptCurrInstr + 1)))
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
else
gBattlescriptCurrInstr += 6;
gBattlescriptCurrInstr += 7;
}
static void Cmd_endselectionscript(void)
@ -5025,12 +5025,12 @@ static void Cmd_moveend(void)
for (i = 0; i < gBattlersCount; i++)
{
u8 battler = battlers[i];
//attacker is mon who made contact, battler is mon with pickpocket
if (battler != gBattlerAttacker //cannot pickpocket yourself
&& GetBattlerAbility(battler) == ABILITY_PICKPOCKET //'target' must have pickpocket ability
&& GetBattlerAbility(battler) == ABILITY_PICKPOCKET //'target' must have pickpocket ability
&& BATTLER_DAMAGED(battler) //obviously battler needs to have been damaged as well
&& !DoesSubstituteBlockMove(gCurrentMove, gBattlerAttacker, battler) //subsitute unaffected
&& IsBattlerAlive(battler) //battler must be alive to be pickpocketed
&& IsBattlerAlive(battler) //battler must be alive to pickpocket
&& gBattleMons[battler].item == ITEM_NONE //pickpocketer can't have an item already
&& CanStealItem(battler, gBattleMons[gBattlerAttacker].item)) //cannot steal plates, mega stones, etc
{
@ -10313,7 +10313,7 @@ static void Cmd_healpartystatus(void)
if (species != SPECIES_NONE && species != SPECIES_EGG)
{
u8 ability;
u16 ability;
if (gBattlerPartyIndexes[gBattlerAttacker] == i)
ability = gBattleMons[gBattlerAttacker].ability;
@ -11058,7 +11058,7 @@ static void Cmd_tryswapitems(void) // trick
| BATTLE_TYPE_FRONTIER
| BATTLE_TYPE_SECRET_BASE
| BATTLE_TYPE_x2000000
#if B_TRAINERS_STEAL_ITEMS
#if B_TRAINERS_KNOCK_OFF_ITEMS
| BATTLE_TYPE_TRAINER
#endif
))))
@ -11126,7 +11126,7 @@ static void Cmd_tryswapitems(void) // trick
PREPARE_ITEM_BUFFER(gBattleTextBuff1, *newItemAtk)
PREPARE_ITEM_BUFFER(gBattleTextBuff2, oldItemAtk)
#if B_TRAINERS_STEAL_ITEMS
#if B_TRAINERS_KNOCK_OFF_ITEMS
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
@ -11330,7 +11330,7 @@ static void Cmd_tryswapabilities(void) // skill swap
}
else
{
u8 abilityAtk = gBattleMons[gBattlerAttacker].ability;
u16 abilityAtk = gBattleMons[gBattlerAttacker].ability;
gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability;
gBattleMons[gBattlerTarget].ability = abilityAtk;
@ -11585,7 +11585,7 @@ static void Cmd_pickup(void)
{
s32 i;
u16 species, heldItem;
u8 ability;
u16 ability;
u8 lvlDivBy10;
if (InBattlePike())

View File

@ -499,6 +499,18 @@ void BattleSetup_StartScriptedWildBattle(void)
TryUpdateGymLeaderRematchFromWild();
}
void BattleSetup_StartScriptedDoubleWildBattle(void)
{
ScriptContext2_Enable();
gMain.savedCallback = CB2_EndScriptedWildBattle;
gBattleTypeFlags = BATTLE_TYPE_DOUBLE;
CreateBattleStartTask(GetWildBattleTransition(), 0);
IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
IncrementGameStat(GAME_STAT_WILD_BATTLES);
IncrementDailyWildBattles();
TryUpdateGymLeaderRematchFromWild();
}
void BattleSetup_StartLatiBattle(void)
{
ScriptContext2_Enable();

View File

@ -1318,6 +1318,7 @@ static bool32 IsGravityPreventingMove(u32 move)
case MOVE_SKY_DROP:
case MOVE_SPLASH:
case MOVE_TELEKINESIS:
case MOVE_FLOATY_FALL:
return TRUE;
default:
return FALSE;
@ -3472,8 +3473,14 @@ static bool32 ShouldChangeFormHpBased(u32 battler)
// Ability, form >, form <=, hp divided
static const u16 forms[][4] =
{
{ABILITY_ZEN_MODE, SPECIES_DARMANITAN, SPECIES_DARMANITAN_ZEN, 2},
{ABILITY_SHIELDS_DOWN, SPECIES_MINIOR, SPECIES_MINIOR_CORE, 2},
{ABILITY_ZEN_MODE, SPECIES_DARMANITAN, SPECIES_DARMANITAN_ZEN_MODE, 2},
{ABILITY_SHIELDS_DOWN, SPECIES_MINIOR, SPECIES_MINIOR_CORE_RED, 2},
{ABILITY_SHIELDS_DOWN, SPECIES_MINIOR_METEOR_BLUE, SPECIES_MINIOR_CORE_BLUE, 2},
{ABILITY_SHIELDS_DOWN, SPECIES_MINIOR_METEOR_GREEN, SPECIES_MINIOR_CORE_GREEN, 2},
{ABILITY_SHIELDS_DOWN, SPECIES_MINIOR_METEOR_INDIGO, SPECIES_MINIOR_CORE_INDIGO, 2},
{ABILITY_SHIELDS_DOWN, SPECIES_MINIOR_METEOR_ORANGE, SPECIES_MINIOR_CORE_ORANGE, 2},
{ABILITY_SHIELDS_DOWN, SPECIES_MINIOR_METEOR_VIOLET, SPECIES_MINIOR_CORE_VIOLET, 2},
{ABILITY_SHIELDS_DOWN, SPECIES_MINIOR_METEOR_YELLOW, SPECIES_MINIOR_CORE_YELLOW, 2},
{ABILITY_SCHOOLING, SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI, 4},
};
u32 i;
@ -3557,7 +3564,7 @@ static u8 ForewarnChooseMove(u32 battler)
free(data);
}
u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveArg)
u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 moveArg)
{
u8 effect = 0;
u32 speciesAtk, speciesDef;
@ -3649,7 +3656,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
case ABILITY_MOLD_BREAKER:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_MOLDBREAKER;
gSpecialStatuses[battler].switchInAbilityDone = 1;
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
effect++;
@ -3658,7 +3665,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
case ABILITY_TERAVOLT:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_TERAVOLT;
gSpecialStatuses[battler].switchInAbilityDone = 1;
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
effect++;
@ -3667,7 +3674,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
case ABILITY_TURBOBLAZE:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_TURBOBLAZE;
gSpecialStatuses[battler].switchInAbilityDone = 1;
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
effect++;
@ -3677,7 +3684,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
gDisableStructs[battler].slowStartTimer = 5;
gBattleCommunication[MULTISTRING_CHOOSER] = 3;
gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_SLOWSTART;
gSpecialStatuses[battler].switchInAbilityDone = 1;
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
effect++;
@ -3686,7 +3693,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
case ABILITY_UNNERVE:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
gBattleCommunication[MULTISTRING_CHOOSER] = 4;
gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_UNNERVE;
gSpecialStatuses[battler].switchInAbilityDone = 1;
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
effect++;
@ -3716,7 +3723,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
if (effect)
{
gBattleCommunication[MULTISTRING_CHOOSER] = 5;
gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_ANTICIPATION;
gSpecialStatuses[battler].switchInAbilityDone = 1;
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
}
@ -3734,7 +3741,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
ForewarnChooseMove(battler);
gBattleCommunication[MULTISTRING_CHOOSER] = 6;
gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_FOREWARN;
gSpecialStatuses[battler].switchInAbilityDone = 1;
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
effect++;
@ -3777,6 +3784,60 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
}
}
break;
case ABILITY_PRESSURE:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_PRESSURE;
gSpecialStatuses[battler].switchInAbilityDone = 1;
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
effect++;
}
break;
case ABILITY_DARK_AURA:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_DARKAURA;
gSpecialStatuses[battler].switchInAbilityDone = 1;
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
effect++;
}
break;
case ABILITY_FAIRY_AURA:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_FAIRYAURA;
gSpecialStatuses[battler].switchInAbilityDone = 1;
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
effect++;
}
break;
case ABILITY_AURA_BREAK:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_AURABREAK;
gSpecialStatuses[battler].switchInAbilityDone = 1;
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
effect++;
}
break;
case ABILITY_COMATOSE:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_COMATOSE;
gSpecialStatuses[battler].switchInAbilityDone = 1;
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
effect++;
}
break;
case ABILITY_SCREEN_CLEANER:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
gBattleCommunication[MULTISTRING_CHOOSER] = MULTI_SWITCHIN_SCREENCLEANER;
gSpecialStatuses[battler].switchInAbilityDone = 1;
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
effect++;
}
break;
case ABILITY_DRIZZLE:
if (TryChangeBattleWeather(battler, ENUM_WEATHER_RAIN, TRUE))
{
@ -3858,16 +3919,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
break;
case ABILITY_CLOUD_NINE:
case ABILITY_AIR_LOCK:
for (i = 0; i < gBattlersCount; i++)
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
effect = TryWeatherFormChange(i);
if (effect != 0)
{
BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
gBattleScripting.battler = i;
gBattleStruct->formToChangeInto = effect - 1;
break;
}
gSpecialStatuses[battler].switchInAbilityDone = 1;
BattleScriptPushCursorAndCallback(BattleScript_AnnounceAirLockCloudNine);
effect++;
}
break;
case ABILITY_SCHOOLING:
@ -6915,6 +6971,10 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b
if (gDisableStructs[battlerDef].isFirstTurn == 2) // just switched in
MulModifier(&modifier, UQ_4_12(2.0));
break;
case ABILITY_GUTS:
if (gBattleMons[battlerAtk].status1 & STATUS1_ANY && IS_MOVE_PHYSICAL(move))
MulModifier(&modifier, UQ_4_12(1.5));
break;
}
// target's abilities
@ -7417,7 +7477,7 @@ u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 bat
return modifier;
}
u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u8 abilityDef)
u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef)
{
u16 modifier = UQ_4_12(1.0);
u8 moveType = gBattleMoves[move].type;
@ -7615,8 +7675,14 @@ void UndoFormChange(u32 monId, u32 side)
{
{SPECIES_AEGISLASH_BLADE, SPECIES_AEGISLASH},
{SPECIES_MIMIKYU_BUSTED, SPECIES_MIMIKYU},
{SPECIES_DARMANITAN_ZEN, SPECIES_DARMANITAN},
{SPECIES_MINIOR, SPECIES_MINIOR_CORE},
{SPECIES_DARMANITAN_ZEN_MODE, SPECIES_DARMANITAN},
{SPECIES_MINIOR, SPECIES_MINIOR_CORE_RED},
{SPECIES_MINIOR_METEOR_BLUE, SPECIES_MINIOR_CORE_BLUE},
{SPECIES_MINIOR_METEOR_GREEN, SPECIES_MINIOR_CORE_GREEN},
{SPECIES_MINIOR_METEOR_INDIGO, SPECIES_MINIOR_CORE_INDIGO},
{SPECIES_MINIOR_METEOR_ORANGE, SPECIES_MINIOR_CORE_ORANGE},
{SPECIES_MINIOR_METEOR_VIOLET, SPECIES_MINIOR_CORE_VIOLET},
{SPECIES_MINIOR_METEOR_YELLOW, SPECIES_MINIOR_CORE_YELLOW},
{SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI},
};
@ -7831,14 +7897,14 @@ bool8 CanStealItem(u8 battlerId, u16 item)
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL)
return FALSE;
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT
if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT
&& !(gBattleTypeFlags &
(BATTLE_TYPE_EREADER_TRAINER
| BATTLE_TYPE_FRONTIER
| BATTLE_TYPE_LINK
| BATTLE_TYPE_x2000000
| BATTLE_TYPE_SECRET_BASE
#if B_TRAINERS_STEAL_ITEMS
#if B_TRAINERS_KNOCK_OFF_ITEMS
| BATTLE_TYPE_TRAINER
#endif
)))
@ -7851,11 +7917,11 @@ bool8 CanStealItem(u8 battlerId, u16 item)
| BATTLE_TYPE_LINK
| BATTLE_TYPE_x2000000
| BATTLE_TYPE_SECRET_BASE))
&& (gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerAttacker)] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]]))
&& (gWishFutureKnock.knockedOffMons[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]))
{
return FALSE;
}
return CanBattlerGetOrLoseItem(battlerId, item);
}

View File

@ -8923,8 +8923,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_SPECIAL, // restores 75% HP instead of 50% HP
.argument = 75,
.split = SPLIT_SPECIAL,
.argument = 75, // restores 75% HP instead of 50% HP
},
[MOVE_CRAFTY_SHIELD] =
@ -10319,15 +10319,271 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
.split = SPLIT_SPECIAL,
},
[MOVE_ZIPPY_ZAP] =
{
#if B_UPDATED_MOVE_DATA >= GEN_8
.power = 80,
.pp = 10,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#else
.power = 50,
.pp = 15,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#endif
.effect = EFFECT_ALWAYS_CRIT,
.type = TYPE_ELECTRIC,
.accuracy = 100,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 2,
.split = SPLIT_PHYSICAL,
},
[MOVE_SPLISHY_SPLASH] =
{
#if B_UPDATED_MOVE_DATA >= GEN_8
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#else
.flags = FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#endif
.effect = EFFECT_PARALYZE_HIT,
.power = 90,
.type = TYPE_WATER,
.accuracy = 100,
.pp = 15,
.secondaryEffectChance = 30,
.target = MOVE_TARGET_BOTH,
.priority = 0,
.split = SPLIT_SPECIAL,
},
[MOVE_FLOATY_FALL] =
{
#if B_UPDATED_MOVE_DATA >= GEN_8
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
#else
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED,
#endif
.effect = EFFECT_FLINCH_HIT,
.power = 90,
.type = TYPE_FLYING,
.accuracy = 95,
.pp = 15,
.secondaryEffectChance = 30,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
},
[MOVE_PIKA_PAPOW] =
{
#if B_UPDATED_MOVE_DATA >= GEN_8
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#else
.flags = FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#endif
.effect = EFFECT_RETURN,
.power = 1,
.type = TYPE_ELECTRIC,
.accuracy = 0,
.pp = 20,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
},
[MOVE_BOUNCY_BUBBLE] =
{
#if B_UPDATED_MOVE_DATA >= GEN_8
.power = 60,
.pp = 20,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.argument = 100, // restores 100% HP instead of 50% HP
#else
.power = 90,
.pp = 15,
.flags = FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#endif
.effect = EFFECT_ABSORB,
.type = TYPE_WATER,
.accuracy = 100,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
},
[MOVE_BUZZY_BUZZ] =
{
#if B_UPDATED_MOVE_DATA >= GEN_8
.power = 60,
.pp = 20,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#else
.power = 90,
.pp = 15,
.flags = FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#endif
.effect = EFFECT_PARALYZE_HIT,
.type = TYPE_ELECTRIC,
.accuracy = 100,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
},
[MOVE_SIZZLY_SLIDE] =
{
#if B_UPDATED_MOVE_DATA >= GEN_8
.power = 60,
.pp = 20,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#else
.power = 90,
.pp = 15,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#endif
.effect = EFFECT_BURN_HIT,
.type = TYPE_FIRE,
.accuracy = 100,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
},
[MOVE_GLITZY_GLOW] =
{
#if B_UPDATED_MOVE_DATA >= GEN_8
.power = 80,
.accuracy = 95,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#else
.power = 90,
.accuracy = 100,
.flags = FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#endif
.effect = EFFECT_PLACEHOLDER, //TODO (Light Screen + Hit)
.type = TYPE_PSYCHIC,
.pp = 15,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
},
[MOVE_BADDY_BAD] =
{
#if B_UPDATED_MOVE_DATA >= GEN_8
.power = 80,
.accuracy = 95,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#else
.power = 90,
.accuracy = 100,
.flags = FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#endif
.effect = EFFECT_PLACEHOLDER, //TODO (Reflect + Hit)
.type = TYPE_DARK,
.pp = 15,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
},
[MOVE_SAPPY_SEED] =
{
#if B_UPDATED_MOVE_DATA >= GEN_8
.power = 100,
.accuracy = 90,
.pp = 10,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#else
.power = 90,
.accuracy = 100,
.pp = 15,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#endif
.effect = EFFECT_PLACEHOLDER, //TODO (Leech Seed + Hit)
.type = TYPE_GRASS,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
},
[MOVE_FREEZY_FROST] =
{
#if B_UPDATED_MOVE_DATA >= GEN_8
.power = 100,
.accuracy = 90,
.pp = 10,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#else
.power = 90,
.accuracy = 100,
.pp = 15,
.flags = FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#endif
.effect = EFFECT_PLACEHOLDER, //TODO (Haze + Hit)
.type = TYPE_ICE,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
},
[MOVE_SPARKLY_SWIRL] =
{
#if B_UPDATED_MOVE_DATA >= GEN_8
.power = 120,
.accuracy = 85,
.pp = 5,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#else
.power = 90,
.accuracy = 100,
.pp = 15,
.flags = FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#endif
.effect = EFFECT_PLACEHOLDER, //TODO (Heal Bell + Hit)
.type = TYPE_FAIRY,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
},
[MOVE_VEEVEE_VOLLEY] =
{
#if B_UPDATED_MOVE_DATA >= GEN_8
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#else
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED,
#endif
.effect = EFFECT_RETURN,
.power = 1,
.type = TYPE_NORMAL,
.accuracy = 0,
.pp = 20,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
},
[MOVE_DOUBLE_IRON_BASH] =
{
.effect = EFFECT_FLINCH_HIT,
.effect = EFFECT_PLACEHOLDER, //TODO (EFFECT_FLINCH_HIT + EFFECT_DOUBLE_HIT)
.power = 60,
.type = TYPE_STEEL,
.accuracy = 100,
.pp = 5,
.secondaryEffectChance = 30,
.target = MOVE_TARGET_FOES_AND_ALLY,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DMG_MINIMIZE | FLAG_IRON_FIST_BOOST,
.split = SPLIT_PHYSICAL,
@ -10823,4 +11079,311 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_SPECIAL,
},
[MOVE_EXPANDING_FORCE] =
{
.effect = EFFECT_PLACEHOLDER, //TODO
.power = 80,
.type = TYPE_PSYCHIC,
.accuracy = 100,
.pp = 10,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_SPECIAL,
},
[MOVE_STEEL_ROLLER] =
{
.effect = EFFECT_PLACEHOLDER, //TODO
.power = 130,
.type = TYPE_STEEL,
.accuracy = 100,
.pp = 5,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_PHYSICAL,
},
[MOVE_SCALE_SHOT] =
{
.effect = EFFECT_PLACEHOLDER, //TODO (EFFECT_MULTI_HIT + ABILITY_WEAK_ARMOR,
.power = 25,
.type = TYPE_DRAGON,
.accuracy = 90,
.pp = 20,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_PHYSICAL,
},
[MOVE_METEOR_BEAM] =
{
.effect = EFFECT_PLACEHOLDER, //TODO
.power = 120,
.type = TYPE_ROCK,
.accuracy = 90,
.pp = 10,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_SPECIAL,
},
[MOVE_SHELL_SIDE_ARM] =
{
.effect = EFFECT_PLACEHOLDER, //TODO
.power = 90,
.type = TYPE_POISON,
.accuracy = 100,
.pp = 10,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_SPECIAL,
},
[MOVE_MISTY_EXPLOSION] =
{
.effect = EFFECT_PLACEHOLDER, //TODO
.power = 100,
.type = TYPE_FAIRY,
.accuracy = 100,
.pp = 5,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_FOES_AND_ALLY,
.priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_SPECIAL,
},
[MOVE_GRASSY_GLIDE] =
{
.effect = EFFECT_PLACEHOLDER, //TODO
.power = 70,
.type = TYPE_GRASS,
.accuracy = 100,
.pp = 20,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_PHYSICAL,
},
[MOVE_RISING_VOLTAGE] =
{
.effect = EFFECT_PLACEHOLDER, //TODO
.power = 70,
.type = TYPE_ELECTRIC,
.accuracy = 100,
.pp = 20,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_SPECIAL,
},
[MOVE_TERRAIN_PULSE] =
{
.effect = EFFECT_PLACEHOLDER, //TODO
.power = 50,
.type = TYPE_NORMAL,
.accuracy = 100,
.pp = 10,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_MEGA_LAUNCHER_BOOST,
.split = SPLIT_SPECIAL,
},
[MOVE_SKITTER_SMACK] =
{
.effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT,
.power = 70,
.type = TYPE_BUG,
.accuracy = 90,
.pp = 10,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_PHYSICAL,
},
[MOVE_BURNING_JEALOUSY] =
{
.effect = EFFECT_PLACEHOLDER, //TODO
.power = 70,
.type = TYPE_FIRE,
.accuracy = 100,
.pp = 5,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_BOTH,
.priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_SPECIAL,
},
[MOVE_LASH_OUT] =
{
.effect = EFFECT_PLACEHOLDER, //TODO
.power = 75,
.type = TYPE_DARK,
.accuracy = 100,
.pp = 5,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_PHYSICAL,
},
[MOVE_POLTERGEIST] =
{
.effect = EFFECT_PLACEHOLDER, //TODO
.power = 110,
.type = TYPE_GHOST,
.accuracy = 90,
.pp = 5,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_PHYSICAL,
},
[MOVE_CORROSIVE_GAS] =
{
.effect = EFFECT_PLACEHOLDER, //TODO
.power = 0,
.type = TYPE_POISON,
.accuracy = 100,
.pp = 40,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_FOES_AND_ALLY,
.priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
.split = SPLIT_STATUS,
},
[MOVE_COACHING] =
{
.effect = EFFECT_PLACEHOLDER, //TODO
.power = 0,
.type = TYPE_FIGHTING,
.accuracy = 0,
.pp = 10,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_ALLY,
.priority = 0,
.flags = 0,
.split = SPLIT_STATUS,
},
[MOVE_FLIP_TURN] =
{
.effect = EFFECT_HIT_ESCAPE,
.power = 60,
.type = TYPE_WATER,
.accuracy = 100,
.pp = 20,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_PHYSICAL,
},
[MOVE_TRIPLE_AXEL] =
{
.effect = EFFECT_TRIPLE_KICK, //TODO: Increase damage by 20 instead of 10
.power = 20,
.type = TYPE_ICE,
.accuracy = 90,
.pp = 10,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_PHYSICAL,
},
[MOVE_DUAL_WINGBEAT] =
{
.effect = EFFECT_DOUBLE_HIT,
.power = 40,
.type = TYPE_FLYING,
.accuracy = 90,
.pp = 10,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_PHYSICAL,
},
[MOVE_SCORCHING_SANDS] =
{
.effect = EFFECT_SCALD,
.power = 70,
.type = TYPE_GROUND,
.accuracy = 100,
.pp = 10,
.secondaryEffectChance = 30,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
.split = SPLIT_SPECIAL,
},
[MOVE_JUNGLE_HEALING] =
{
.effect = EFFECT_PLACEHOLDER, //TODO
.power = 0,
.type = TYPE_GRASS,
.accuracy = 0,
.pp = 10,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_USER,
.priority = 0,
.split = SPLIT_STATUS,
},
[MOVE_WICKED_BLOW] =
{
.effect = EFFECT_ALWAYS_CRIT,
.power = 80,
.type = TYPE_DARK,
.accuracy = 100,
.pp = 5,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_IRON_FIST_BOOST,
.split = SPLIT_PHYSICAL,
},
[MOVE_SURGING_STRIKES] =
{
.effect = EFFECT_PLACEHOLDER, //TODO (Multi hit + Always Crit)
.power = 25,
.type = TYPE_WATER,
.accuracy = 100,
.pp = 5,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_IRON_FIST_BOOST,
.split = SPLIT_PHYSICAL,
},
};

View File

@ -74,7 +74,6 @@ static const u8 sVitalSpiritDescription[] = _("Prevents sleep.");
static const u8 sWhiteSmokeDescription[] = _("Prevents ability reduction.");
static const u8 sPurePowerDescription[] = _("Raises Attack.");
static const u8 sShellArmorDescription[] = _("Blocks critical hits.");
static const u8 sCacophonyDescription[] = _("Avoids sound-based moves.");
static const u8 sAirLockDescription[] = _("Negates weather effects.");
static const u8 sTangledFeetDescription[] = _("Ups evasion if confused.");
static const u8 sMotorDriveDescription[] = _("Electricity raises Speed.");
@ -221,8 +220,42 @@ static const u8 sMistySurgeDescription[] = _("Field becomes misty.");
static const u8 sGrassySurgeDescription[] = _("Field becomes grassy.");
static const u8 sFullMetalBodyDescription[] = _("Prevents stat reduction.");
static const u8 sNeuroforceDescription[] = _("Ups “supereffective”.");
static const u8 sIntrepidSwordDescription[] = _("Ups Attack on entry.");
static const u8 sDauntlessShieldDescription[] = _("Ups Defense on entry.");
static const u8 sLiberoDescription[] = _("Changes type to move's.");
static const u8 sBallFetchDescription[] = _("Fetches failed Poké Ball.");
static const u8 sCottonDownDescription[] = _("Lower Speed of all when hit.");
static const u8 sPropellerTailDescription[] = _("Ignores foe's redirection.");
static const u8 sMirrorArmorDescription[] = _("Reflect stat decreases.");
static const u8 sGulpMissileDescription[] = _("If hit, spits prey from sea.");
static const u8 sStalwartDescription[] = _("Ignores foe's redirection.");
static const u8 sSteamEngineDescription[] = _("Fire or Water hits up Speed.");
static const u8 sPunkRockDescription[] = _("Ups and resists sound.");
static const u8 sSandSpitDescription[] = _("Creates a sandstorm if hit.");
static const u8 sIceScalesDescription[] = _("Halves special damage.");
static const u8 sRipenDescription[] = _("Doubles effect of Berries.");
static const u8 sIceFaceDescription[] = _("Take a free hit. Hail renews.");
static const u8 sPowerSpotDescription[] = _("Powers up ally moves.");
static const u8 sMimicryDescription[] = _("Changes type on terrain.");
static const u8 sScreenCleanerDescription[] = _("Removes walls of light.");
static const u8 sSteelySpiritDescription[] = _("Boosts ally's Steel moves.");
static const u8 sPerishBodyDescription[] = _("Foe faints in 3 turns if hit.");
static const u8 sWanderingSpiritDescription[] = _("Trade abilities on contact.");
static const u8 sGorillaTacticsDescription[] = _("Ups Attack and locks move.");
static const u8 sNeutralizingGasDescription[] = _("All Abilities are nullified.");
static const u8 sPastelVeilDescription[] = _("Protects team from poison.");
static const u8 sHungerSwitchDescription[] = _("Changes form each turn.");;
static const u8 sQuickDrawDescription[] = _("Moves first occasionally.");
static const u8 sUnseenFistDescription[] = _("Contact evades protection.");
static const u8 sCuriousMedicineDescription[] = _("Remove ally's stat changes.");
static const u8 sTransistorDescription[] = _("Ups Electric-type moves.");
static const u8 sDragonsMawDescription[] = _("Ups Dragon-type moves.");
static const u8 sChillingNeighDescription[] = _("KOs boost Attack stat.");
static const u8 sGrimNeighDescription[] = _("KOs boost Sp. Atk stat.");
static const u8 sAsOneIceRiderDescription[] = _("Unnerve and Chilling Neigh.");
static const u8 sAsOneShadowRiderDescription[] = _("Unnerve and Grim Neigh.");
const u8 gAbilityNames[ABILITIES_COUNT_GEN7][ABILITY_NAME_LENGTH + 1] =
const u8 gAbilityNames[ABILITIES_COUNT_GEN8][ABILITY_NAME_LENGTH + 1] =
{
[ABILITY_NONE] = _("-------"),
[ABILITY_STENCH] = _("Stench"),
@ -300,7 +333,6 @@ const u8 gAbilityNames[ABILITIES_COUNT_GEN7][ABILITY_NAME_LENGTH + 1] =
[ABILITY_WHITE_SMOKE] = _("White Smoke"),
[ABILITY_PURE_POWER] = _("Pure Power"),
[ABILITY_SHELL_ARMOR] = _("Shell Armor"),
[ABILITY_CACOPHONY] = _("Cacophony"),
[ABILITY_AIR_LOCK] = _("Air Lock"),
[ABILITY_TANGLED_FEET] = _("Tangled Feet"),
[ABILITY_MOTOR_DRIVE] = _("Motor Drive"),
@ -459,9 +491,43 @@ const u8 gAbilityNames[ABILITIES_COUNT_GEN7][ABILITY_NAME_LENGTH + 1] =
[ABILITY_SHADOW_SHIELD] = _("ShadowShield"),
[ABILITY_PRISM_ARMOR] = _("Prism Armor"),
[ABILITY_NEUROFORCE] = _("Neuroforce"),
[ABILITY_INTREPID_SWORD] = _("IntrepidSwor"),
[ABILITY_DAUNTLESS_SHIELD] = _("DauntlessShi"),
[ABILITY_LIBERO] = _("Libero"),
[ABILITY_BALL_FETCH] = _("Ball Fetch"),
[ABILITY_COTTON_DOWN] = _("Cotton Down"),
[ABILITY_PROPELLER_TAIL] = _("PropellerTai"),
[ABILITY_MIRROR_ARMOR] = _("Mirror Armor"),
[ABILITY_GULP_MISSILE] = _("Gulp Missile"),
[ABILITY_STALWART] = _("Stalwart"),
[ABILITY_STEAM_ENGINE] = _("Steam Engine"),
[ABILITY_PUNK_ROCK] = _("Punk Rock"),
[ABILITY_SAND_SPIT] = _("Sand Spit"),
[ABILITY_ICE_SCALES] = _("Ice Scales"),
[ABILITY_RIPEN] = _("Ripen"),
[ABILITY_ICE_FACE] = _("Ice Face"),
[ABILITY_POWER_SPOT] = _("Power Spot"),
[ABILITY_MIMICRY] = _("Mimicry"),
[ABILITY_SCREEN_CLEANER] = _("ScreenCleane"),
[ABILITY_STEELY_SPIRIT] = _("SteelySpirit"),
[ABILITY_PERISH_BODY] = _("Perish Body"),
[ABILITY_WANDERING_SPIRIT] = _("WanderingSpi"),
[ABILITY_GORILLA_TACTICS] = _("GorillaTacti"),
[ABILITY_NEUTRALIZING_GAS] = _("Neutralizing"),
[ABILITY_PASTEL_VEIL] = _("Pastel Veil"),
[ABILITY_HUNGER_SWITCH] = _("HungerSwitch"),
[ABILITY_QUICK_DRAW] = _("Quick Draw"),
[ABILITY_UNSEEN_FIST] = _("Unseen Fist"),
[ABILITY_CURIOUS_MEDICINE] = _("CuriousMedic"),
[ABILITY_TRANSISTOR] = _("Transistor"),
[ABILITY_DRAGONS_MAW] = _("Dragon's Maw"),
[ABILITY_CHILLING_NEIGH] = _("ChillingNeig"),
[ABILITY_GRIM_NEIGH] = _("Grim Neigh"),
[ABILITY_AS_ONE_ICE_RIDER] = _("As One"),
[ABILITY_AS_ONE_SHADOW_RIDER] = _("As One"),
};
const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT_GEN7] =
const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT_GEN8] =
{
[ABILITY_NONE] = sNoneDescription,
[ABILITY_STENCH] = sStenchDescription,
@ -539,7 +605,6 @@ const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT_GEN7] =
[ABILITY_WHITE_SMOKE] = sWhiteSmokeDescription,
[ABILITY_PURE_POWER] = sPurePowerDescription,
[ABILITY_SHELL_ARMOR] = sShellArmorDescription,
[ABILITY_CACOPHONY] = sCacophonyDescription,
[ABILITY_AIR_LOCK] = sAirLockDescription,
[ABILITY_TANGLED_FEET] = sTangledFeetDescription,
[ABILITY_MOTOR_DRIVE] = sMotorDriveDescription,
@ -698,4 +763,38 @@ const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT_GEN7] =
[ABILITY_SHADOW_SHIELD] = sMultiscaleDescription,
[ABILITY_PRISM_ARMOR] = sFilterDescription,
[ABILITY_NEUROFORCE] = sNeuroforceDescription,
[ABILITY_INTREPID_SWORD] = sIntrepidSwordDescription,
[ABILITY_DAUNTLESS_SHIELD] = sDauntlessShieldDescription,
[ABILITY_LIBERO] = sLiberoDescription,
[ABILITY_BALL_FETCH] = sBallFetchDescription,
[ABILITY_COTTON_DOWN] = sCottonDownDescription,
[ABILITY_PROPELLER_TAIL] = sPropellerTailDescription,
[ABILITY_MIRROR_ARMOR] = sMirrorArmorDescription,
[ABILITY_GULP_MISSILE] = sGulpMissileDescription,
[ABILITY_STALWART] = sStalwartDescription,
[ABILITY_STEAM_ENGINE] = sSteamEngineDescription,
[ABILITY_PUNK_ROCK] = sPunkRockDescription,
[ABILITY_SAND_SPIT] = sSandSpitDescription,
[ABILITY_ICE_SCALES] = sIceScalesDescription,
[ABILITY_RIPEN] = sRipenDescription,
[ABILITY_ICE_FACE] = sIceFaceDescription,
[ABILITY_POWER_SPOT] = sPowerSpotDescription,
[ABILITY_MIMICRY] = sMimicryDescription,
[ABILITY_SCREEN_CLEANER] = sScreenCleanerDescription,
[ABILITY_STEELY_SPIRIT] = sSteelySpiritDescription,
[ABILITY_PERISH_BODY] = sPerishBodyDescription,
[ABILITY_WANDERING_SPIRIT] = sWanderingSpiritDescription,
[ABILITY_GORILLA_TACTICS] = sGorillaTacticsDescription,
[ABILITY_NEUTRALIZING_GAS] = sNeutralizingGasDescription,
[ABILITY_PASTEL_VEIL] = sPastelVeilDescription,
[ABILITY_HUNGER_SWITCH] = sHungerSwitchDescription,
[ABILITY_QUICK_DRAW] = sQuickDrawDescription,
[ABILITY_UNSEEN_FIST] = sUnseenFistDescription,
[ABILITY_CURIOUS_MEDICINE] = sCuriousMedicineDescription,
[ABILITY_TRANSISTOR] = sTransistorDescription,
[ABILITY_DRAGONS_MAW] = sDragonsMawDescription,
[ABILITY_CHILLING_NEIGH] = sChillingNeighDescription,
[ABILITY_GRIM_NEIGH] = sGrimNeighDescription,
[ABILITY_AS_ONE_ICE_RIDER] = sAsOneIceRiderDescription,
[ABILITY_AS_ONE_SHADOW_RIDER] = sAsOneShadowRiderDescription,
};

View File

@ -2618,9 +2618,65 @@ static const u8 sPLASMA_FISTSDescription[] = _(
"Normal moves become Electric.");
static const u8 sPHOTON_GEYSERDescription[] = _(
"The foe's highest offensive\n"
"User's highest attack stat\n"
"determines its category.");
static const u8 sZIPPY_ZAPDescription[] = _(
"Electric bursts always go\n"
"first and land a critical hit.");
static const u8 sSPLISHY_SPLASHDescription[] = _(
"A huge electrified wave that\n"
"may paralyze the foe.");
static const u8 sFLOATY_FALLDescription[] = _(
"Floats in air and dives at\n"
"angle. May cause flinching.");
static const u8 sPIKA_PAPOWDescription[] = _(
"Pikachu's love increases its\n"
"power. It never misses.");
static const u8 sBOUNCY_BUBBLEDescription[] = _(
"An attack that absorbs\n"
#if B_UPDATED_MOVE_DATA >= GEN_8
"all the damage inflicted.");
#else
"half the damage inflicted.");
#endif
static const u8 sBUZZY_BUZZDescription[] = _(
"Shoots a jolt of electricity\n"
"that always paralyzes.");
static const u8 sSIZZLY_SLIDEDescription[] = _(
"User cloaked in fire charges.\n"
"Leaves the foe with a burn.");
static const u8 sGLITZY_GLOWDescription[] = _(
"Telekinetic force that sets\n"
"wall, lowering Sp. Atk damage.");
static const u8 sBADDY_BADDescription[] = _(
"Acting badly, attacks. Sets\n"
"wall, lowering Attack damage.");
static const u8 sSAPPY_SEEDDescription[] = _(
"Giant stalk scatters seeds\n"
"that drain HP every turn.");
static const u8 sFREEZY_FROSTDescription[] = _(
"Crystal from cold haze hits.\n"
"Eliminates all stat changes.");
static const u8 sSPARKLY_SWIRLDescription[] = _(
"Wrap foe with whirlwind of\n"
"scent. Heals party's status.");
static const u8 sVEEVEE_VOLLEYDescription[] = _(
"Eevee's love increases its\n"
"power. It never misses.");
static const u8 sDOUBLE_IRON_BASHDescription[] = _(
"The user spins and hits with\n"
"its arms. May cause flinch.");
@ -2766,10 +2822,97 @@ static const u8 sSTEEL_BEAMDescription[] = _(
"Fires a beam of steel from\n"
"its body. It hurts the user.");
static const u8 sEXPANDING_FORCEDescription[] = _(
"Power goes up and damages\n"
"all foes on Psychic Terrain.");
static const u8 sSTEEL_ROLLERDescription[] = _(
"Destroys terrain. Fails if\n"
"ground isn't terrain.");
static const u8 sSCALE_SHOTDescription[] = _(
"Shoots scales 2 to 5 times.\n"
"Ups Speed, lowers defense.");
static const u8 sMETEOR_BEAMDescription[] = _(
"A 2-turn move that raises\n"
"Sp. Attack before attacking.");
static const u8 sSHELL_SIDE_ARMDescription[] = _(
"Uses higher of physical and\n"
"special damage. May poison.");
static const u8 sMISTY_EXPLOSIONDescription[] = _(
"Hit everything and faint.\n"
"Powers up on Misty Terrain.");
static const u8 sGRASSY_GLIDEDescription[] = _(
"Gliding on ground, hits. Goes\n"
"first on Grassy Terrain.");
static const u8 sRISING_VOLTAGEDescription[] = _(
"This move's power doubles\n"
"when on Electric Terrain.");
static const u8 sTERRAIN_PULSEDescription[] = _(
"Type and power changes\n"
"depending on the terrain.");
static const u8 sSKITTER_SMACKDescription[] = _(
"User skitters behind foe to\n"
"attack. Lowers foe's Sp. Atk.");
static const u8 sBURNING_JEALOUSYDescription[] = _(
"Foes that have stats upped\n"
"during the turn get burned.");
static const u8 sLASH_OUTDescription[] = _(
"If stats lowered during this\n"
"turn, power is doubled.");
static const u8 sPOLTERGEISTDescription[] = _(
"Control foe's item to attack.\n"
"Fails if foe has no item.");
static const u8 sCORROSIVE_GASDescription[] = _(
"Highly acidic gas melts items\n"
"held by surrounding Pokémon.");
static const u8 sCOACHINGDescription[] = _(
"Properly coaches allies to\n"
"up their Attack and Defense.");
static const u8 sFLIP_TURNDescription[] = _(
"Attacks and rushes back to\n"
"switch with a party Pokémon.");
static const u8 sTRIPLE_AXELDescription[] = _(
"A 3-kick attack that gets\n"
"more powerful with each hit.");
static const u8 sDUAL_WINGBEATDescription[] = _(
"User slams the target with\n"
"wings and hits twice in a row.");
static const u8 sSCORCHING_SANDSDescription[] = _(
"Throws scorching sand at\n"
"the target. May leave a burn.");
static const u8 sJUNGLE_HEALINGDescription[] = _(
"Heals HP and status of\n"
"itself and allies in battle.");
static const u8 sWICKED_BLOWDescription[] = _(
"Mastering the Dark style,\n"
"strikes with a critical hit.");
static const u8 sSURGING_STRIKESDescription[] = _(
"Mastering the Water style,\n"
"strikes with 3 critical hits.");
static const u8 sNotDoneYetDescription[] = _(
"Not done yet.");
// MOVE_NONE is ignored in this table. Make sure to always subtract 1 before getting the right pointer.
const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] =
{
@ -3448,7 +3591,21 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] =
[MOVE_MIND_BLOWN - 1] = sMIND_BLOWNDescription,
[MOVE_PLASMA_FISTS - 1] = sPLASMA_FISTSDescription,
[MOVE_PHOTON_GEYSER - 1] = sPHOTON_GEYSERDescription,
[MOVE_ZIPPY_ZAP - 1] = sZIPPY_ZAPDescription,
[MOVE_SPLISHY_SPLASH - 1] = sSPLISHY_SPLASHDescription,
[MOVE_FLOATY_FALL - 1] = sFLOATY_FALLDescription,
[MOVE_PIKA_PAPOW - 1] = sPIKA_PAPOWDescription,
[MOVE_BOUNCY_BUBBLE - 1] = sBOUNCY_BUBBLEDescription,
[MOVE_BUZZY_BUZZ - 1] = sBUZZY_BUZZDescription,
[MOVE_SIZZLY_SLIDE - 1] = sSIZZLY_SLIDEDescription,
[MOVE_GLITZY_GLOW - 1] = sGLITZY_GLOWDescription,
[MOVE_BADDY_BAD - 1] = sBADDY_BADDescription,
[MOVE_SAPPY_SEED - 1] = sSAPPY_SEEDDescription,
[MOVE_FREEZY_FROST - 1] = sFREEZY_FROSTDescription,
[MOVE_SPARKLY_SWIRL - 1] = sSPARKLY_SWIRLDescription,
[MOVE_VEEVEE_VOLLEY - 1] = sVEEVEE_VOLLEYDescription,
[MOVE_DOUBLE_IRON_BASH - 1] = sDOUBLE_IRON_BASHDescription,
//GEN 8
[MOVE_DYNAMAX_CANNON - 1] = sDYNAMAX_CANNONDescription,
[MOVE_SNIPE_SHOT - 1] = sSNIPE_SHOTDescription,
@ -3485,4 +3642,27 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] =
[MOVE_METEOR_ASSAULT - 1] = sMETEOR_ASSAULTDescription,
[MOVE_ETERNABEAM - 1] = sETERNABEAMDescription,
[MOVE_STEEL_BEAM - 1] = sSTEEL_BEAMDescription,
[MOVE_EXPANDING_FORCE - 1] = sEXPANDING_FORCEDescription,
[MOVE_STEEL_ROLLER - 1] = sSTEEL_ROLLERDescription,
[MOVE_SCALE_SHOT - 1] = sSCALE_SHOTDescription,
[MOVE_METEOR_BEAM - 1] = sMETEOR_BEAMDescription,
[MOVE_SHELL_SIDE_ARM - 1] = sSHELL_SIDE_ARMDescription,
[MOVE_MISTY_EXPLOSION - 1] = sMISTY_EXPLOSIONDescription,
[MOVE_GRASSY_GLIDE - 1] = sGRASSY_GLIDEDescription,
[MOVE_RISING_VOLTAGE - 1] = sRISING_VOLTAGEDescription,
[MOVE_TERRAIN_PULSE - 1] = sTERRAIN_PULSEDescription,
[MOVE_SKITTER_SMACK - 1] = sSKITTER_SMACKDescription,
[MOVE_BURNING_JEALOUSY - 1] = sBURNING_JEALOUSYDescription,
[MOVE_LASH_OUT - 1] = sLASH_OUTDescription,
[MOVE_POLTERGEIST - 1] = sPOLTERGEISTDescription,
[MOVE_CORROSIVE_GAS - 1] = sCORROSIVE_GASDescription,
[MOVE_COACHING - 1] = sCOACHINGDescription,
[MOVE_FLIP_TURN - 1] = sFLIP_TURNDescription,
[MOVE_TRIPLE_AXEL - 1] = sTRIPLE_AXELDescription,
[MOVE_DUAL_WINGBEAT - 1] = sDUAL_WINGBEATDescription,
[MOVE_SCORCHING_SANDS - 1] = sSCORCHING_SANDSDescription,
[MOVE_JUNGLE_HEALING - 1] = sJUNGLE_HEALINGDescription,
[MOVE_WICKED_BLOW - 1] = sWICKED_BLOWDescription,
[MOVE_SURGING_STRIKES - 1] = sSURGING_STRIKESDescription,
};

View File

@ -676,7 +676,20 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] =
[MOVE_MIND_BLOWN] = _("Mind Blown"),
[MOVE_PLASMA_FISTS] = _("Plasma Fists"),
[MOVE_PHOTON_GEYSER] = _("PhotonGeyser"),
[MOVE_DOUBLE_IRON_BASH] = _("D. Iron Bash"),
[MOVE_ZIPPY_ZAP] = _("Zippy Zap"),
[MOVE_SPLISHY_SPLASH] = _("SplishSplash"),
[MOVE_FLOATY_FALL] = _("Floaty Fall"),
[MOVE_PIKA_PAPOW] = _("Pika Papow"),
[MOVE_BOUNCY_BUBBLE] = _("BouncyBubble"),
[MOVE_BUZZY_BUZZ] = _("Buzzy Buzz"),
[MOVE_SIZZLY_SLIDE] = _("Sizzly Slide"),
[MOVE_GLITZY_GLOW] = _("Glitzy Glow"),
[MOVE_BADDY_BAD] = _("Baddy Bad"),
[MOVE_SAPPY_SEED] = _("Sappy Seed"),
[MOVE_FREEZY_FROST] = _("Freezy Frost"),
[MOVE_SPARKLY_SWIRL] = _("SparklySwirl"),
[MOVE_VEEVEE_VOLLEY] = _("VeeveeVolley"),
[MOVE_DOUBLE_IRON_BASH] = _("DublIronBash"),
//GEN 8
[MOVE_DYNAMAX_CANNON] = _("Dyna Cannon"),
[MOVE_SNIPE_SHOT] = _("Snipe Shot"),
@ -713,4 +726,26 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] =
[MOVE_METEOR_ASSAULT] = _("Meteor Ass."),
[MOVE_ETERNABEAM] = _("Eternabeam"),
[MOVE_STEEL_BEAM] = _("Steel Beam"),
[MOVE_EXPANDING_FORCE] = _("Expand Force"),
[MOVE_STEEL_ROLLER] = _("Steel Roller"),
[MOVE_SCALE_SHOT] = _("Scale Shot"),
[MOVE_METEOR_BEAM] = _("Meteor Beam"),
[MOVE_SHELL_SIDE_ARM] = _("ShellSideArm"),
[MOVE_MISTY_EXPLOSION] = _("Misty Explos"),
[MOVE_GRASSY_GLIDE] = _("Grassy Glide"),
[MOVE_RISING_VOLTAGE] = _("Rising Volts"),
[MOVE_TERRAIN_PULSE] = _("TerrainPulse"),
[MOVE_SKITTER_SMACK] = _("SkitterSmack"),
[MOVE_BURNING_JEALOUSY] = _("BurnJealousy"),
[MOVE_LASH_OUT] = _("Lash Out"),
[MOVE_POLTERGEIST] = _("Poltergeist"),
[MOVE_CORROSIVE_GAS] = _("CorrosiveGas"),
[MOVE_COACHING] = _("Coaching"),
[MOVE_FLIP_TURN] = _("Flip Turn"),
[MOVE_TRIPLE_AXEL] = _("Triple Axel"),
[MOVE_DUAL_WINGBEAT] = _("DualWingbeat"),
[MOVE_SCORCHING_SANDS] = _("Scorch Sands"),
[MOVE_JUNGLE_HEALING] = _("Jungle Heal"),
[MOVE_WICKED_BLOW] = _("Wicked Blow"),
[MOVE_SURGING_STRIKES] = _("SurgeStrikes"),
};

View File

@ -872,7 +872,7 @@ u8 GetEggCyclesToSubtract(void)
{
if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_EGG))
{
u8 ability = GetMonAbility(&gPlayerParty[i]);
u16 ability = GetMonAbility(&gPlayerParty[i]);
if (ability == ABILITY_MAGMA_ARMOR || ability == ABILITY_FLAME_BODY)
return 2;
}

View File

@ -1833,7 +1833,7 @@ static bool8 Fishing_CheckForBite(struct Task *task)
{
if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
{
u8 ability = GetMonAbility(&gPlayerParty[0]);
u16 ability = GetMonAbility(&gPlayerParty[0]);
if (ability == ABILITY_SUCTION_CUPS || ability == ABILITY_STICKY_HOLD)
{
if (Random() % 100 > 14)

View File

@ -141,7 +141,7 @@ bool8 SetUpFieldMove_Cut(void)
s16 x, y;
u8 i, j;
u8 tileBehavior;
u8 userAbility;
u16 userAbility;
bool8 cutTiles[CUT_NORMAL_AREA];
bool8 ret;

View File

@ -4156,7 +4156,7 @@ u8 GetMonsStateToDoubles_2(void)
return (aliveCount > 1) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON;
}
u8 GetAbilityBySpecies(u16 species, u8 abilityNum)
u16 GetAbilityBySpecies(u16 species, u8 abilityNum)
{
if (abilityNum)
gLastUsedAbility = gBaseStats[species].abilities[1];
@ -4166,7 +4166,7 @@ u8 GetAbilityBySpecies(u16 species, u8 abilityNum)
return gLastUsedAbility;
}
u8 GetMonAbility(struct Pokemon *mon)
u16 GetMonAbility(struct Pokemon *mon)
{
u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
u8 abilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL);

View File

@ -3146,13 +3146,13 @@ static void PrintMonOTID(void)
static void PrintMonAbilityName(void)
{
u8 ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum);
u16 ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum);
PrintTextOnWindow(AddWindowFromTemplateList(sPageInfoTemplate, PSS_DATA_WINDOW_INFO_ABILITY), gAbilityNames[ability], 0, 1, 0, 1);
}
static void PrintMonAbilityDescription(void)
{
u8 ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum);
u16 ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum);
PrintTextOnWindow(AddWindowFromTemplateList(sPageInfoTemplate, PSS_DATA_WINDOW_INFO_ABILITY), gAbilityDescriptionPointers[ability], 0, 17, 0, 0);
}

View File

@ -62,6 +62,7 @@ static EWRAM_DATA u16 sMovingNpcMapId = 0;
static EWRAM_DATA u16 sFieldEffectScriptId = 0;
static u8 gBrailleWindowId;
static bool8 gIsScriptedWildDouble;
extern const SpecialFunc gSpecials[];
extern const u8 *gStdScripts[];
@ -1870,15 +1871,37 @@ bool8 ScrCmd_setwildbattle(struct ScriptContext *ctx)
u16 species = ScriptReadHalfword(ctx);
u8 level = ScriptReadByte(ctx);
u16 item = ScriptReadHalfword(ctx);
u16 species2 = ScriptReadHalfword(ctx);
u8 level2 = ScriptReadByte(ctx);
u16 item2 = ScriptReadHalfword(ctx);
if(species2 == SPECIES_NONE)
{
CreateScriptedWildMon(species, level, item);
gIsScriptedWildDouble = FALSE;
}
else
{
CreateScriptedDoubleWildMon(species, level, item, species2, level2, item2);
gIsScriptedWildDouble = TRUE;
}
CreateScriptedWildMon(species, level, item);
return FALSE;
}
bool8 ScrCmd_dowildbattle(struct ScriptContext *ctx)
{
BattleSetup_StartScriptedWildBattle();
ScriptContext1_Stop();
if(gIsScriptedWildDouble == FALSE)
{
BattleSetup_StartScriptedWildBattle();
ScriptContext1_Stop();
}
else
{
BattleSetup_StartScriptedDoubleWildBattle();
ScriptContext1_Stop();
}
return TRUE;
}

View File

@ -147,6 +147,29 @@ void CreateScriptedWildMon(u16 species, u8 level, u16 item)
SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem);
}
}
void CreateScriptedDoubleWildMon(u16 species1, u8 level1, u16 item1, u16 species2, u8 level2, u16 item2)
{
u8 heldItem1[2];
u8 heldItem2[2];
ZeroEnemyPartyMons();
CreateMon(&gEnemyParty[0], species1, level1, 32, 0, 0, OT_ID_PLAYER_ID, 0);
if (item1)
{
heldItem1[0] = item1;
heldItem1[1] = item1 >> 8;
SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem1);
}
CreateMon(&gEnemyParty[3], species2, level2, 32, 0, 0, OT_ID_PLAYER_ID, 0);
if (item2)
{
heldItem2[0] = item2;
heldItem2[1] = item2 >> 8;
SetMonData(&gEnemyParty[3], MON_DATA_HELD_ITEM, heldItem2);
}
}
void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot)
{

View File

@ -35,7 +35,7 @@ static void FeebasSeedRng(u16 seed);
static bool8 IsWildLevelAllowedByRepel(u8 level);
static void ApplyFluteEncounterRateMod(u32 *encRate);
static void ApplyCleanseTagEncounterRateMod(u32 *encRate);
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex);
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex);
static bool8 IsAbilityAllowingEncounter(u8 level);
// EWRAM vars
@ -248,7 +248,7 @@ static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon)
// check ability for max level mon
if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
{
u8 ability = GetMonAbility(&gPlayerParty[0]);
u16 ability = GetMonAbility(&gPlayerParty[0]);
if (ability == ABILITY_HUSTLE || ability == ABILITY_VITAL_SPIRIT || ability == ABILITY_PRESSURE)
{
if (Random() % 2 == 0)
@ -905,7 +905,7 @@ static bool8 IsWildLevelAllowedByRepel(u8 wildLevel)
static bool8 IsAbilityAllowingEncounter(u8 level)
{
u8 ability;
u16 ability;
if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
return TRUE;
@ -942,7 +942,7 @@ static bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, u
return TRUE;
}
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex)
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex)
{
if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
return FALSE;