Merge branch '_RHH/master' into _RHH/upcoming

This commit is contained in:
Eduardo Quezada 2024-04-25 12:37:31 -04:00
commit d42de03ddc
17 changed files with 284 additions and 145 deletions

View File

@ -1633,6 +1633,11 @@
callnative BS_TryGulpMissile
.endm
.macro tryquash failInstr:req
callnative BS_TryQuash
.4byte \failInstr
.endm
@ various command changed to more readable macros
.macro cancelmultiturnmoves battler:req
various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES
@ -1824,11 +1829,6 @@
various \battler, VARIOUS_SET_LAST_USED_ABILITY
.endm
.macro tryquash failInstr:req
various BS_ATTACKER, VARIOUS_TRY_QUASH
.4byte \failInstr
.endm
.macro tryafteryou failInstr:req
various BS_ATTACKER, VARIOUS_AFTER_YOU
.4byte \failInstr

View File

@ -7829,6 +7829,7 @@ BattleScript_IntimidateEffect:
statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_IntimidateLoopIncrement
setgraphicalstatchangevalues
jumpifability BS_TARGET, ABILITY_CONTRARY, BattleScript_IntimidateContrary
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_IntimidateWontDecrease
playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
printstring STRINGID_PKMNCUTSATTACKWITH
BattleScript_IntimidateEffect_WaitString:
@ -7845,6 +7846,10 @@ BattleScript_IntimidateEnd:
pause B_WAIT_TIME_MED
end3
BattleScript_IntimidateWontDecrease:
printstring STRINGID_STATSWONTDECREASE
goto BattleScript_IntimidateEffect_WaitString
BattleScript_IntimidateContrary:
call BattleScript_AbilityPopUpTarget
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_IntimidateContrary_WontIncrease
@ -7884,6 +7889,7 @@ BattleScript_SupersweetSyrupEffect:
statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_SupersweetSyrupLoopIncrement
setgraphicalstatchangevalues
jumpifability BS_TARGET, ABILITY_CONTRARY, BattleScript_SupersweetSyrupContrary
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_SupersweetSyrupWontDecrease
playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
printfromtable gStatDownStringIds
BattleScript_SupersweetSyrupEffect_WaitString:
@ -7900,6 +7906,10 @@ BattleScript_SupersweetSyrupEnd:
pause B_WAIT_TIME_MED
end3
BattleScript_SupersweetSyrupWontDecrease:
printstring STRINGID_STATSWONTDECREASE
goto BattleScript_SupersweetSyrupEffect_WaitString
BattleScript_SupersweetSyrupContrary:
call BattleScript_AbilityPopUpTarget
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_SupersweetSyrupContrary_WontIncrease

View File

@ -131,113 +131,112 @@
#define VARIOUS_SET_SIMPLE_BEAM 39
#define VARIOUS_TRY_ENTRAINMENT 40
#define VARIOUS_SET_LAST_USED_ABILITY 41
#define VARIOUS_TRY_QUASH 42
#define VARIOUS_INVERT_STAT_STAGES 43
#define VARIOUS_TRY_ME_FIRST 44
#define VARIOUS_JUMP_IF_BATTLE_END 45
#define VARIOUS_TRY_ELECTRIFY 46
#define VARIOUS_TRY_REFLECT_TYPE 47
#define VARIOUS_TRY_SOAK 48
#define VARIOUS_HANDLE_MEGA_EVO 49
#define VARIOUS_TRY_LAST_RESORT 50
#define VARIOUS_SET_ARG_TO_BATTLE_DAMAGE 51
#define VARIOUS_TRY_HIT_SWITCH_TARGET 52
#define VARIOUS_TRY_AUTOTOMIZE 53
#define VARIOUS_ABILITY_POPUP 54
#define VARIOUS_JUMP_IF_TARGET_ALLY 55
#define VARIOUS_TRY_SYNCHRONOISE 56
#define VARIOUS_PSYCHO_SHIFT 57
#define VARIOUS_CURE_STATUS 58
#define VARIOUS_POWER_TRICK 59
#define VARIOUS_AFTER_YOU 60
#define VARIOUS_BESTOW 61
#define VARIOUS_JUMP_IF_NOT_GROUNDED 62
#define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 63
#define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 64
#define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 65
#define VARIOUS_SET_AURORA_VEIL 66
#define VARIOUS_TRY_THIRD_TYPE 67
#define VARIOUS_ACUPRESSURE 68
#define VARIOUS_SET_POWDER 69
#define VARIOUS_SPECTRAL_THIEF 70
#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 71
#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 72
#define VARIOUS_JUMP_IF_ROAR_FAILS 73
#define VARIOUS_TRY_INSTRUCT 74
#define VARIOUS_JUMP_IF_NOT_BERRY 75
#define VARIOUS_TRACE_ABILITY 76
#define VARIOUS_UPDATE_NICK 77
#define VARIOUS_TRY_ILLUSION_OFF 78
#define VARIOUS_SET_SPRITEIGNORE0HP 79
#define VARIOUS_HANDLE_FORM_CHANGE 80
#define VARIOUS_GET_STAT_VALUE 81
#define VARIOUS_JUMP_IF_FULL_HP 82
#define VARIOUS_LOSE_TYPE 83
#define VARIOUS_TRY_ACTIVATE_SOULHEART 84
#define VARIOUS_TRY_ACTIVATE_RECEIVER 85
#define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 86
#define VARIOUS_TRY_FRISK 87
#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 88
#define VARIOUS_TRY_FAIRY_LOCK 89
#define VARIOUS_JUMP_IF_NO_ALLY 90
#define VARIOUS_POISON_TYPE_IMMUNITY 91
#define VARIOUS_JUMP_IF_HOLD_EFFECT 92
#define VARIOUS_INFATUATE_WITH_BATTLER 93
#define VARIOUS_SET_LAST_USED_ITEM 94
#define VARIOUS_PARALYZE_TYPE_IMMUNITY 95
#define VARIOUS_JUMP_IF_ABSENT 96
#define VARIOUS_DESTROY_ABILITY_POPUP 97
#define VARIOUS_TOTEM_BOOST 98
#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 99
#define VARIOUS_MOVEEND_ITEM_EFFECTS 100
#define VARIOUS_TERRAIN_SEED 101
#define VARIOUS_MAKE_INVISIBLE 102
#define VARIOUS_ROOM_SERVICE 103
#define VARIOUS_EERIE_SPELL_PP_REDUCE 104
#define VARIOUS_JUMP_IF_TEAM_HEALTHY 105
#define VARIOUS_TRY_HEAL_QUARTER_HP 106
#define VARIOUS_REMOVE_TERRAIN 107
#define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 108
#define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 109
#define VARIOUS_GET_ROTOTILLER_TARGETS 110
#define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 111
#define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 112
#define VARIOUS_CONSUME_BERRY 113
#define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 114
#define VARIOUS_JUMP_IF_SPECIES 115
#define VARIOUS_UPDATE_ABILITY_POPUP 116
#define VARIOUS_JUMP_IF_WEATHER_AFFECTED 117
#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 118
#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 119
#define VARIOUS_SHELL_SIDE_ARM_CHECK 120
#define VARIOUS_TRY_NO_RETREAT 121
#define VARIOUS_TRY_TAR_SHOT 122
#define VARIOUS_CAN_TAR_SHOT_WORK 123
#define VARIOUS_CHECK_POLTERGEIST 124
#define VARIOUS_CUT_1_3_HP_RAISE_STATS 125
#define VARIOUS_TRY_END_NEUTRALIZING_GAS 126
#define VARIOUS_JUMP_IF_UNDER_200 127
#define VARIOUS_SET_SKY_DROP 128
#define VARIOUS_CLEAR_SKY_DROP 129
#define VARIOUS_SKY_DROP_YAWN 130
#define VARIOUS_CURE_CERTAIN_STATUSES 131
#define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 132
#define VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY 133
#define VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT 134
#define VARIOUS_SAVE_BATTLER_ITEM 135
#define VARIOUS_RESTORE_BATTLER_ITEM 136
#define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 137
#define VARIOUS_SET_BEAK_BLAST 138
#define VARIOUS_SWAP_SIDE_STATUSES 139
#define VARIOUS_SWAP_STATS 140
#define VARIOUS_TEATIME_INVUL 141
#define VARIOUS_TEATIME_TARGETS 142
#define VARIOUS_TRY_WIND_RIDER_POWER 143
#define VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES 144
#define VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES 145
#define VARIOUS_STORE_HEALING_WISH 146
#define VARIOUS_HIT_SWITCH_TARGET_FAILED 147
#define VARIOUS_TRY_REVIVAL_BLESSING 148
#define VARIOUS_INVERT_STAT_STAGES 42
#define VARIOUS_TRY_ME_FIRST 43
#define VARIOUS_JUMP_IF_BATTLE_END 44
#define VARIOUS_TRY_ELECTRIFY 45
#define VARIOUS_TRY_REFLECT_TYPE 46
#define VARIOUS_TRY_SOAK 47
#define VARIOUS_HANDLE_MEGA_EVO 48
#define VARIOUS_TRY_LAST_RESORT 49
#define VARIOUS_SET_ARG_TO_BATTLE_DAMAGE 50
#define VARIOUS_TRY_HIT_SWITCH_TARGET 51
#define VARIOUS_TRY_AUTOTOMIZE 52
#define VARIOUS_ABILITY_POPUP 53
#define VARIOUS_JUMP_IF_TARGET_ALLY 54
#define VARIOUS_TRY_SYNCHRONOISE 55
#define VARIOUS_PSYCHO_SHIFT 56
#define VARIOUS_CURE_STATUS 57
#define VARIOUS_POWER_TRICK 58
#define VARIOUS_AFTER_YOU 59
#define VARIOUS_BESTOW 60
#define VARIOUS_JUMP_IF_NOT_GROUNDED 61
#define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 62
#define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 63
#define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 64
#define VARIOUS_SET_AURORA_VEIL 65
#define VARIOUS_TRY_THIRD_TYPE 66
#define VARIOUS_ACUPRESSURE 67
#define VARIOUS_SET_POWDER 68
#define VARIOUS_SPECTRAL_THIEF 69
#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 70
#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 71
#define VARIOUS_JUMP_IF_ROAR_FAILS 72
#define VARIOUS_TRY_INSTRUCT 73
#define VARIOUS_JUMP_IF_NOT_BERRY 74
#define VARIOUS_TRACE_ABILITY 75
#define VARIOUS_UPDATE_NICK 76
#define VARIOUS_TRY_ILLUSION_OFF 77
#define VARIOUS_SET_SPRITEIGNORE0HP 78
#define VARIOUS_HANDLE_FORM_CHANGE 79
#define VARIOUS_GET_STAT_VALUE 80
#define VARIOUS_JUMP_IF_FULL_HP 81
#define VARIOUS_LOSE_TYPE 82
#define VARIOUS_TRY_ACTIVATE_SOULHEART 83
#define VARIOUS_TRY_ACTIVATE_RECEIVER 84
#define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 85
#define VARIOUS_TRY_FRISK 86
#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 87
#define VARIOUS_TRY_FAIRY_LOCK 88
#define VARIOUS_JUMP_IF_NO_ALLY 89
#define VARIOUS_POISON_TYPE_IMMUNITY 90
#define VARIOUS_JUMP_IF_HOLD_EFFECT 91
#define VARIOUS_INFATUATE_WITH_BATTLER 92
#define VARIOUS_SET_LAST_USED_ITEM 93
#define VARIOUS_PARALYZE_TYPE_IMMUNITY 94
#define VARIOUS_JUMP_IF_ABSENT 95
#define VARIOUS_DESTROY_ABILITY_POPUP 96
#define VARIOUS_TOTEM_BOOST 97
#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 98
#define VARIOUS_MOVEEND_ITEM_EFFECTS 99
#define VARIOUS_TERRAIN_SEED 100
#define VARIOUS_MAKE_INVISIBLE 101
#define VARIOUS_ROOM_SERVICE 102
#define VARIOUS_EERIE_SPELL_PP_REDUCE 103
#define VARIOUS_JUMP_IF_TEAM_HEALTHY 104
#define VARIOUS_TRY_HEAL_QUARTER_HP 105
#define VARIOUS_REMOVE_TERRAIN 106
#define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 107
#define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 108
#define VARIOUS_GET_ROTOTILLER_TARGETS 109
#define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 110
#define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 111
#define VARIOUS_CONSUME_BERRY 112
#define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 113
#define VARIOUS_JUMP_IF_SPECIES 114
#define VARIOUS_UPDATE_ABILITY_POPUP 115
#define VARIOUS_JUMP_IF_WEATHER_AFFECTED 116
#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 117
#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 118
#define VARIOUS_SHELL_SIDE_ARM_CHECK 119
#define VARIOUS_TRY_NO_RETREAT 120
#define VARIOUS_TRY_TAR_SHOT 121
#define VARIOUS_CAN_TAR_SHOT_WORK 122
#define VARIOUS_CHECK_POLTERGEIST 123
#define VARIOUS_CUT_1_3_HP_RAISE_STATS 124
#define VARIOUS_TRY_END_NEUTRALIZING_GAS 125
#define VARIOUS_JUMP_IF_UNDER_200 126
#define VARIOUS_SET_SKY_DROP 127
#define VARIOUS_CLEAR_SKY_DROP 128
#define VARIOUS_SKY_DROP_YAWN 129
#define VARIOUS_CURE_CERTAIN_STATUSES 130
#define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 131
#define VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY 132
#define VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT 133
#define VARIOUS_SAVE_BATTLER_ITEM 134
#define VARIOUS_RESTORE_BATTLER_ITEM 135
#define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 136
#define VARIOUS_SET_BEAK_BLAST 137
#define VARIOUS_SWAP_SIDE_STATUSES 138
#define VARIOUS_SWAP_STATS 139
#define VARIOUS_TEATIME_INVUL 140
#define VARIOUS_TEATIME_TARGETS 141
#define VARIOUS_TRY_WIND_RIDER_POWER 142
#define VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES 143
#define VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES 144
#define VARIOUS_STORE_HEALING_WISH 145
#define VARIOUS_HIT_SWITCH_TARGET_FAILED 146
#define VARIOUS_TRY_REVIVAL_BLESSING 147
// Cmd_manipulatedamage
#define DMG_CHANGE_SIGN 0

View File

@ -171,14 +171,14 @@ static inline const u8 GetTrainerClassFromId(u16 trainerId)
static inline const u8 *GetTrainerClassNameFromId(u16 trainerId)
{
if (trainerId > TRAINER_PARTNER(PARTNER_NONE))
return gTrainerClasses[gBattlePartners[trainerId].trainerClass].name;
return gTrainerClasses[gBattlePartners[trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerClass].name;
return gTrainerClasses[GetTrainerClassFromId(trainerId)].name;
}
static inline const u8 *GetTrainerNameFromId(u16 trainerId)
{
if (trainerId > TRAINER_PARTNER(PARTNER_NONE))
return gBattlePartners[trainerId].trainerName;
return gBattlePartners[trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName;
return gTrainers[SanitizeTrainerId(trainerId)].trainerName;
}

View File

@ -3262,6 +3262,9 @@ void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle)
if (B_ABILITY_POP_UP == FALSE)
return;
if (gBattleScripting.abilityPopupOverwrite != 0)
ability = gBattleScripting.abilityPopupOverwrite;
if (gTestRunnerEnabled)
{
TestRunner_Battle_RecordAbilityPopUp(battlerId, ability);
@ -3269,9 +3272,6 @@ void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle)
return;
}
if (gBattleScripting.abilityPopupOverwrite != 0)
ability = gBattleScripting.abilityPopupOverwrite;
if (!gBattleStruct->activeAbilityPopUps)
{
LoadSpriteSheet(&sSpriteSheet_AbilityPopUp);

View File

@ -286,7 +286,16 @@ static const s32 sExperienceScalingFactors[] =
static const u16 sTrappingMoves[NUM_TRAPPING_MOVES] =
{
MOVE_BIND, MOVE_WRAP, MOVE_FIRE_SPIN, MOVE_CLAMP, MOVE_WHIRLPOOL, MOVE_SAND_TOMB, MOVE_MAGMA_STORM, MOVE_INFESTATION, MOVE_SNAP_TRAP,
MOVE_BIND,
MOVE_WRAP,
MOVE_FIRE_SPIN,
MOVE_CLAMP,
MOVE_WHIRLPOOL,
MOVE_SAND_TOMB,
MOVE_MAGMA_STORM,
MOVE_INFESTATION,
MOVE_SNAP_TRAP,
MOVE_THUNDER_CAGE
};
static const u16 sBadgeFlags[8] = {
@ -9589,20 +9598,6 @@ static void Cmd_various(void)
gLastUsedAbility = gBattleMons[battler].ability;
break;
}
case VARIOUS_TRY_QUASH:
{
VARIOUS_ARGS(const u8 *failInstr);
if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) // It's true if foe is faster, has a bigger priority, or switches
{
gBattlescriptCurrInstr = cmd->failInstr; // This replaces the current battlescript with the "fail" script.
}
else // If the condition is not true, it means we are faster than the foe, so we can set the quash bit
{
gProtectStructs[gBattlerTarget].quash = TRUE;
gBattlescriptCurrInstr = cmd->nextInstr; // and then we proceed with the rest of our battlescript
}
return;
}
case VARIOUS_INVERT_STAT_STAGES:
{
VARIOUS_ARGS();
@ -16828,3 +16823,36 @@ void BS_TryGulpMissile(void)
else
gBattlescriptCurrInstr = cmd->nextInstr;
}
void BS_TryQuash(void)
{
NATIVE_ARGS(const u8 *failInstr);
u32 i;
// It's true if foe is faster, has a bigger priority, or switches
if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget))
{
gBattlescriptCurrInstr = cmd->failInstr;
return;
}
// If the above condition is not true, it means we are faster than the foe, so we can set the quash bit
gProtectStructs[gBattlerTarget].quash = TRUE;
for (i = 0; i < gBattlersCount; i++)
{
gBattlerByTurnOrder[i] = i;
}
for (i = 0; i < gBattlersCount - 1; i++)
{
s32 j;
for (j = i + 1; j < gBattlersCount; j++)
{
if (!gProtectStructs[i].quash
&& !gProtectStructs[j].quash
&& GetWhichBattlerFaster(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], FALSE) == -1)
SwapTurnOrder(i, j);
}
}
gBattlescriptCurrInstr = cmd->nextInstr;
}

View File

@ -1371,7 +1371,7 @@ u8 GetFrontierOpponentClass(u16 trainerId)
}
else if (trainerId > TRAINER_PARTNER(PARTNER_NONE))
{
trainerClass = gBattlePartners[GetTrainerClassFromId(trainerId - TRAINER_PARTNER(PARTNER_NONE))].trainerClass;
trainerClass = gBattlePartners[trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerClass;
}
else if (trainerId < FRONTIER_TRAINERS_COUNT)
{

View File

@ -5807,6 +5807,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
// Set the target to the original target of the mon that first used a Dance move
gBattlerTarget = gBattleScripting.savedBattler & 0x3;
// Edge case for dance moves that hit multiply targets
gHitMarker &= ~HITMARKER_NO_ATTACKSTRING;
// Make sure that the target isn't an ally - if it is, target the original user
if (GetBattlerSide(gBattlerTarget) == GetBattlerSide(gBattlerAttacker))
gBattlerTarget = (gBattleScripting.savedBattler & 0xF0) >> 4;

View File

@ -10771,7 +10771,7 @@ const struct Item gItemsInfo[] =
.importance = 1,
.description = COMPOUND_STRING(
"A catalog full of\n"
"deviced liked by\n"
"devices liked by\n"
"Rotom."),
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_PARTY_MENU,

View File

@ -6358,7 +6358,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] =
[MOVE_WILL_O_WISP] =
{
.name = COMPOUND_STRING("Will-o-Wisp"),
.name = COMPOUND_STRING("Will-O-Wisp"),
.description = COMPOUND_STRING(
"Inflicts a burn on the foe\n"
"with intense fire."),

View File

@ -1761,7 +1761,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
.frontPicYOffset = 0,
.frontAnimFrames = sAnims_LycanrocMidnight,
.frontAnimId = ANIM_SHRINK_GROW_VIBRATE_SLOW,
.backPic = gMonBackPic_LycanrocMidday,
.backPic = gMonBackPic_LycanrocMidnight,
.backPicSize = MON_COORDS_SIZE(64, 56),
.backPicYOffset = 7,
.backAnimId = BACK_ANIM_SHRINK_GROW_VIBRATE,
@ -1814,9 +1814,9 @@ const struct SpeciesInfo gSpeciesInfoGen7[] =
.frontPicYOffset = 6,
.frontAnimFrames = sAnims_LycanrocDusk,
.frontAnimId = ANIM_V_SHAKE,
.backPic = gMonBackPic_LycanrocMidday,
.backPic = gMonBackPic_LycanrocDusk,
.backPicSize = MON_COORDS_SIZE(64, 56),
.backPicYOffset = 5,
.backPicYOffset = 6,
.backAnimId = BACK_ANIM_V_SHAKE,
.palette = gMonPalette_LycanrocDusk,
.shinyPalette = gMonShinyPalette_LycanrocDusk,

View File

@ -386,7 +386,7 @@ struct PokemonStats
u8 eggGroup1;
u8 eggGroup2;
u8 eggCycles;
u8 expYield;
u16 expYield;
u8 friendship;
u16 ability0;
u16 ability1;

View File

@ -1706,7 +1706,7 @@ void GiveBoxMonInitialMoveset_Fast(struct BoxPokemon *boxMon) //Credit: Asparagu
u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL);
s32 level = GetLevelFromBoxMonExp(boxMon);
s32 i;
u16 moves[MAX_MON_MOVES] = {0};
u16 moves[MAX_MON_MOVES] = {MOVE_NONE};
u8 addedMoves = 0;
const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species);
@ -1720,13 +1720,15 @@ void GiveBoxMonInitialMoveset_Fast(struct BoxPokemon *boxMon) //Credit: Asparagu
if (learnset[i].level == 0)
continue;
for (j = 0; j < addedMoves + 1; j++)
for (j = 0; j < addedMoves; j++)
{
if (moves[j] == learnset[i].move)
{
alreadyKnown = TRUE;
break;
}
}
if (!alreadyKnown)
{
if (addedMoves < MAX_MON_MOVES)

View File

@ -36,11 +36,11 @@ SINGLE_BATTLE_TEST("Dancer can copy Teeter Dance")
DOUBLE_BATTLE_TEST("Dancer can copy Teeter Dance and confuse both opposing targets")
{
KNOWN_FAILING; // Fails because copied move that targets both opposing mons, targets only one when copied by Dancer
GIVEN {
ASSUME(gMovesInfo[MOVE_TEETER_DANCE].danceMove == TRUE);
ASSUME(gItemsInfo[ITEM_LUM_BERRY].holdEffect == HOLD_EFFECT_CURE_STATUS);
PLAYER(SPECIES_WOBBUFFET)
PLAYER(SPECIES_WYNAUT)
PLAYER(SPECIES_WYNAUT) { Item(ITEM_LUM_BERRY); }
OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Item(ITEM_LUM_BERRY); }
OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }
} WHEN {
@ -50,6 +50,6 @@ DOUBLE_BATTLE_TEST("Dancer can copy Teeter Dance and confuse both opposing targe
ABILITY_POPUP(opponentLeft, ABILITY_DANCER);
ANIMATION(ANIM_TYPE_MOVE, MOVE_TEETER_DANCE, opponentLeft);
MESSAGE("Wobbuffet became confused!");
MESSAGE("Wynaut became confusef!");
MESSAGE("Wynaut became confused!");
}
}

View File

@ -184,3 +184,29 @@ DOUBLE_BATTLE_TEST("Intimidate activates immediately after the mon was switched
EXPECT_EQ(playerLeft->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1);
}
}
SINGLE_BATTLE_TEST("Intimidate can not further lower opponents Atk stat if it is at minimum stages")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); }
} WHEN {
TURN { MOVE(opponent, MOVE_CHARM); }
TURN { MOVE(opponent, MOVE_CHARM); }
TURN { MOVE(opponent, MOVE_CHARM); }
TURN { SWITCH(opponent, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_CHARM, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CHARM, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CHARM, opponent);
ABILITY_POPUP(opponent, ABILITY_INTIMIDATE);
NONE_OF {
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
MESSAGE("Foe Arbok's Intimidate cuts Wobbuffet's attack!");
}
MESSAGE("Wobbuffet's Attack won't go lower!");
} THEN {
EXPECT_EQ(player->statStages[STAT_ATK], MIN_STAT_STAGE);
}
}

View File

@ -45,3 +45,29 @@ DOUBLE_BATTLE_TEST("Supersweet Syrup lowers evasion of both opposing mon's in ba
EXPECT_EQ(playerRight->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1);
}
}
SINGLE_BATTLE_TEST("Supersweet Syrup can not further lower opponents evasion if it is at minimum stages")
{
GIVEN {
PLAYER(SPECIES_ODDISH);
OPPONENT(SPECIES_ODDISH);
OPPONENT(SPECIES_HYDRAPPLE) { Ability(ABILITY_SUPERSWEET_SYRUP); }
} WHEN {
TURN { MOVE(opponent, MOVE_SWEET_SCENT); }
TURN { MOVE(opponent, MOVE_SWEET_SCENT); }
TURN { MOVE(opponent, MOVE_SWEET_SCENT); }
TURN { SWITCH(opponent, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent);
ABILITY_POPUP(opponent, ABILITY_SUPERSWEET_SYRUP);
NONE_OF {
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
MESSAGE("Oddish's evasiveness fell!");
}
MESSAGE("Oddish's evasiveness won't go lower!");
} THEN {
EXPECT_EQ(player->statStages[STAT_EVASION], MIN_STAT_STAGE);
}
}

View File

@ -0,0 +1,45 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(gMovesInfo[MOVE_QUASH].effect == EFFECT_QUASH);
}
DOUBLE_BATTLE_TEST("Quash-affected target will move last in the priority bracket")
{
GIVEN {
PLAYER(SPECIES_VOLBEAT) { Speed(10); Ability(ABILITY_PRANKSTER); }
PLAYER(SPECIES_WOBBUFFET) { Speed(30); }
OPPONENT(SPECIES_TORCHIC) { Speed(20); }
OPPONENT(SPECIES_TREECKO) { Speed(40); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_QUASH, target: opponentRight); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerLeft);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight);
}
}
DOUBLE_BATTLE_TEST("Quash is not affected by dynamic speed")
{
GIVEN {
ASSUME(B_RECALC_TURN_AFTER_ACTIONS >= GEN_8);
ASSUME(gMovesInfo[MOVE_TAILWIND].effect == EFFECT_TAILWIND);
PLAYER(SPECIES_VOLBEAT) { Speed(10); Ability(ABILITY_PRANKSTER); }
PLAYER(SPECIES_WOBBUFFET) { Speed(30); }
OPPONENT(SPECIES_TORCHIC) { Speed(50); }
OPPONENT(SPECIES_TREECKO) { Speed(40); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_QUASH, target: opponentRight);
MOVE(opponentLeft, MOVE_TAILWIND);
}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerLeft);
ANIMATION(ANIM_TYPE_MOVE, MOVE_TAILWIND, opponentLeft);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight);
}
}