mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-26 03:34:15 +01:00
Merge branch 'upcoming' into ultraburst
This commit is contained in:
commit
f95b4fdb4c
@ -5050,7 +5050,7 @@ BattleScript_EffectBatonPass::
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
BattleScript_EffectRapidSpin::
|
||||
.if B_SPEED_BUFFING_RAPID_SPIN == GEN_8
|
||||
.if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8
|
||||
call BattleScript_EffectHit_Ret
|
||||
jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd
|
||||
setmoveeffect MOVE_EFFECT_RAPIDSPIN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN
|
||||
|
@ -1468,11 +1468,10 @@ bool32 IsMegaTriggerSpriteActive(void)
|
||||
|
||||
void HideMegaTriggerSprite(void)
|
||||
{
|
||||
if (gBattleStruct->mega.triggerSpriteId != 0xFF)
|
||||
{
|
||||
ChangeMegaTriggerSprite(gBattleStruct->mega.triggerSpriteId, 0);
|
||||
gSprites[gBattleStruct->mega.triggerSpriteId].tHide = TRUE;
|
||||
}
|
||||
if (gBattleStruct->mega.triggerSpriteId >= MAX_SPRITES)
|
||||
return;
|
||||
ChangeMegaTriggerSprite(gBattleStruct->mega.triggerSpriteId, 0);
|
||||
gSprites[gBattleStruct->mega.triggerSpriteId].tHide = TRUE;
|
||||
}
|
||||
|
||||
void HideTriggerSprites(void)
|
||||
|
@ -13656,7 +13656,7 @@ static void Cmd_jumpifnopursuitswitchdmg(void)
|
||||
&& !(gBattleMons[gBattlerTarget].status1 & (STATUS1_SLEEP | STATUS1_FREEZE))
|
||||
&& gBattleMons[gBattlerAttacker].hp
|
||||
&& !gDisableStructs[gBattlerTarget].truantCounter
|
||||
&& gChosenMoveByBattler[gBattlerTarget] == MOVE_PURSUIT)
|
||||
&& gBattleMoves[gChosenMoveByBattler[gBattlerTarget]].effect == EFFECT_PURSUIT)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
@ -13666,7 +13666,7 @@ static void Cmd_jumpifnopursuitswitchdmg(void)
|
||||
gActionsByTurnOrder[i] = B_ACTION_TRY_FINISH;
|
||||
}
|
||||
|
||||
gCurrentMove = MOVE_PURSUIT;
|
||||
gCurrentMove = gChosenMoveByBattler[gBattlerTarget];
|
||||
gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerTarget);
|
||||
gBattlescriptCurrInstr = cmd->nextInstr;
|
||||
gBattleScripting.animTurn = 1;
|
||||
@ -15086,10 +15086,10 @@ static void Cmd_pursuitdoubles(void)
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
|
||||
&& !(gAbsentBattlerFlags & gBitTable[gActiveBattler])
|
||||
&& gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_MOVE
|
||||
&& gChosenMoveByBattler[gActiveBattler] == MOVE_PURSUIT)
|
||||
&& gBattleMoves[gChosenMoveByBattler[gActiveBattler]].effect == EFFECT_PURSUIT)
|
||||
{
|
||||
gActionsByTurnOrder[gActiveBattler] = B_ACTION_TRY_FINISH;
|
||||
gCurrentMove = MOVE_PURSUIT;
|
||||
gCurrentMove = gChosenMoveByBattler[gActiveBattler];
|
||||
gBattlescriptCurrInstr = cmd->nextInstr;
|
||||
gBattleScripting.animTurn = 1;
|
||||
gBattleScripting.savedBattler = gBattlerAttacker;
|
||||
|
@ -10142,14 +10142,14 @@ bool32 CanMegaEvolve(u8 battlerId)
|
||||
species = GetMonData(mon, MON_DATA_SPECIES);
|
||||
itemId = GetMonData(mon, MON_DATA_HELD_ITEM);
|
||||
|
||||
if (itemId == ITEM_ENIGMA_BERRY_E_READER)
|
||||
holdEffect = gEnigmaBerries[battlerId].holdEffect;
|
||||
else
|
||||
holdEffect = ItemId_GetHoldEffect(itemId);
|
||||
|
||||
// Check if there is an entry in the evolution table for regular Mega Evolution.
|
||||
if (GetBattleFormChangeTargetSpecies(battlerId, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM) != SPECIES_NONE)
|
||||
{
|
||||
if (itemId == ITEM_ENIGMA_BERRY_E_READER)
|
||||
holdEffect = gEnigmaBerries[battlerId].holdEffect;
|
||||
else
|
||||
holdEffect = ItemId_GetHoldEffect(itemId);
|
||||
|
||||
// Can Mega Evolve via Mega Stone.
|
||||
if (holdEffect == HOLD_EFFECT_MEGA_STONE)
|
||||
return TRUE;
|
||||
@ -10157,7 +10157,11 @@ bool32 CanMegaEvolve(u8 battlerId)
|
||||
|
||||
// Check if there is an entry in the evolution table for Wish Mega Evolution.
|
||||
if (GetBattleFormChangeTargetSpecies(battlerId, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE) != SPECIES_NONE)
|
||||
return TRUE;
|
||||
{
|
||||
// Can't Wish Mega Evolve if holding a Z Crystal.
|
||||
if (holdEffect != HOLD_EFFECT_Z_CRYSTAL)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// No checks passed, the mon CAN'T mega evolve.
|
||||
return FALSE;
|
||||
|
@ -159,7 +159,6 @@ void QueueZMove(u8 battlerId, u16 baseMove)
|
||||
bool32 IsViableZMove(u8 battlerId, u16 move)
|
||||
{
|
||||
struct Pokemon *mon;
|
||||
struct MegaEvolutionData *mega = &(((struct ChooseMoveStruct *)(&gBattleResources->bufferA[gActiveBattler][4]))->mega);
|
||||
u8 battlerPosition = GetBattlerPosition(battlerId);
|
||||
u8 partnerPosition = GetBattlerPosition(BATTLE_PARTNER(battlerId));
|
||||
u32 item;
|
||||
@ -185,15 +184,6 @@ bool32 IsViableZMove(u8 battlerId, u16 move)
|
||||
if ((GetBattlerPosition(battlerId) == B_POSITION_PLAYER_LEFT || (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && GetBattlerPosition(battlerId) == B_POSITION_PLAYER_RIGHT)) && !CheckBagHasItem(ITEM_Z_POWER_RING, 1))
|
||||
return FALSE;
|
||||
|
||||
if (mega->alreadyEvolved[battlerPosition])
|
||||
return FALSE; // Trainer has mega evolved
|
||||
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
|
||||
{
|
||||
if (IsPartnerMonFromSameTrainer(battlerId) && (mega->alreadyEvolved[partnerPosition] || (mega->toEvolve & gBitTable[BATTLE_PARTNER(battlerId)])))
|
||||
return FALSE; // Partner has mega evolved or is about to mega evolve
|
||||
}
|
||||
|
||||
if (item == ITEM_ENIGMA_BERRY_E_READER)
|
||||
return FALSE; // HoldEffect = gEnigmaBerries[battlerId].holdEffect;
|
||||
else
|
||||
@ -350,9 +340,12 @@ bool32 IsZMoveTriggerSpriteActive(void)
|
||||
|
||||
void HideZMoveTriggerSprite(void)
|
||||
{
|
||||
struct Sprite *sprite = &gSprites[gBattleStruct->zmove.triggerSpriteId];
|
||||
sprite->tHide = TRUE;
|
||||
struct Sprite *sprite;
|
||||
gBattleStruct->zmove.viable = FALSE;
|
||||
if (gBattleStruct->zmove.triggerSpriteId >= MAX_SPRITES)
|
||||
return;
|
||||
sprite = &gSprites[gBattleStruct->zmove.triggerSpriteId];
|
||||
sprite->tHide = TRUE;
|
||||
}
|
||||
|
||||
static void ShowZMoveTriggerSprite(u8 battlerId)
|
||||
|
@ -9942,7 +9942,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
||||
.priority = 0,
|
||||
.split = SPLIT_SPECIAL,
|
||||
.zMoveEffect = Z_EFFECT_NONE,
|
||||
.soundMove = TRUE,
|
||||
.sheerForceBoost = TRUE,
|
||||
.thawsUser = TRUE,
|
||||
.metronomeBanned = TRUE,
|
||||
},
|
||||
|
@ -6,7 +6,7 @@
|
||||
#define EVO_HELD_ITEM_FIELD_FUNC ItemUseOutOfBattle_CannotUse
|
||||
#endif
|
||||
|
||||
#if I_GEM_BOOST_POWER >= GEN_5
|
||||
#if I_GEM_BOOST_POWER >= GEN_6
|
||||
#define GEM_BOOST_PARAM 30
|
||||
#else
|
||||
#define GEM_BOOST_PARAM 50
|
||||
|
23
test/battle/move_flags/damages_airborne_double_damage.c
Normal file
23
test/battle/move_flags/damages_airborne_double_damage.c
Normal file
@ -0,0 +1,23 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
SINGLE_BATTLE_TEST("Being airborne causes the target to take double damage from certain moves", s16 damage)
|
||||
{
|
||||
bool32 useDive;
|
||||
PARAMETRIZE { useDive = FALSE; }
|
||||
PARAMETRIZE { useDive = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_TWISTER].damagesAirborneDoubleDamage);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }
|
||||
} WHEN {
|
||||
if (useDive)
|
||||
TURN { MOVE(opponent, MOVE_FLY); MOVE(player, MOVE_TWISTER); }
|
||||
else
|
||||
TURN { MOVE(player, MOVE_TWISTER); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, UQ_4_12(2.0), results[1].damage);
|
||||
}
|
||||
}
|
23
test/battle/move_flags/damages_underground.c
Normal file
23
test/battle/move_flags/damages_underground.c
Normal file
@ -0,0 +1,23 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
SINGLE_BATTLE_TEST("Being underground causes the target to take double damage from certain moves", s16 damage)
|
||||
{
|
||||
bool32 useDig;
|
||||
PARAMETRIZE { useDig = FALSE; }
|
||||
PARAMETRIZE { useDig = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_EARTHQUAKE].damagesUnderground);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }
|
||||
} WHEN {
|
||||
if (useDig)
|
||||
TURN { MOVE(opponent, MOVE_DIG); MOVE(player, MOVE_EARTHQUAKE); }
|
||||
else
|
||||
TURN { MOVE(player, MOVE_EARTHQUAKE); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, UQ_4_12(2.0), results[1].damage);
|
||||
}
|
||||
}
|
23
test/battle/move_flags/damages_underwater.c
Normal file
23
test/battle/move_flags/damages_underwater.c
Normal file
@ -0,0 +1,23 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
SINGLE_BATTLE_TEST("Being underwater causes the target to take double damage from certain moves", s16 damage)
|
||||
{
|
||||
bool32 useDive;
|
||||
PARAMETRIZE { useDive = FALSE; }
|
||||
PARAMETRIZE { useDive = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_SURF].damagesUnderwater);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }
|
||||
} WHEN {
|
||||
if (useDive)
|
||||
TURN { MOVE(opponent, MOVE_DIVE); MOVE(player, MOVE_SURF); }
|
||||
else
|
||||
TURN { MOVE(player, MOVE_SURF); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, UQ_4_12(2.0), results[1].damage);
|
||||
}
|
||||
}
|
27
test/battle/move_flags/minimize_double_damage.c
Normal file
27
test/battle/move_flags/minimize_double_damage.c
Normal file
@ -0,0 +1,27 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
SINGLE_BATTLE_TEST("MinimizeDoubleDamage flag makes moves cause double damage to Minimized targets", s16 damage)
|
||||
{
|
||||
bool32 useMinimize;
|
||||
PARAMETRIZE { useMinimize = FALSE; }
|
||||
PARAMETRIZE { useMinimize = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_MINIMIZE].effect == EFFECT_MINIMIZE);
|
||||
ASSUME(gBattleMoves[MOVE_STEAMROLLER].minimizeDoubleDamage);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }
|
||||
} WHEN {
|
||||
if (useMinimize)
|
||||
TURN { MOVE(opponent, MOVE_MINIMIZE); MOVE(player, MOVE_STEAMROLLER); }
|
||||
else
|
||||
TURN { MOVE(player, MOVE_STEAMROLLER); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, UQ_4_12(2.0), results[1].damage);
|
||||
}
|
||||
}
|
||||
|
||||
// Remember to add ASSUME(B_MINIMIZE_DMG_ACC >= GEN_6)
|
||||
TO_DO_BATTLE_TEST("MinimizeDoubleDamage flag allows moves to skip accuracy checks towards Minimized targets")
|
@ -1,90 +0,0 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
ASSUMPTIONS {
|
||||
ASSUME(gBattleMoves[MOVE_MINIMIZE].effect == EFFECT_MINIMIZE);
|
||||
ASSUME(gBattleMoves[MOVE_STEAMROLLER].minimizeDoubleDamage);
|
||||
ASSUME(gBattleMoves[MOVE_EARTHQUAKE].damagesUnderground);
|
||||
ASSUME(gBattleMoves[MOVE_SURF].damagesUnderwater);
|
||||
ASSUME(gBattleMoves[MOVE_TWISTER].damagesAirborneDoubleDamage);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Minimize causes the target to take double damage from certain moves", s16 damage)
|
||||
{
|
||||
bool32 useMinimize;
|
||||
PARAMETRIZE { useMinimize = FALSE; }
|
||||
PARAMETRIZE { useMinimize = TRUE; }
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }
|
||||
} WHEN {
|
||||
if (useMinimize)
|
||||
TURN { MOVE(opponent, MOVE_MINIMIZE); MOVE(player, MOVE_STEAMROLLER); }
|
||||
else
|
||||
TURN { MOVE(player, MOVE_STEAMROLLER); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, UQ_4_12(2.0), results[1].damage);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Being underground causes the target to take double damage from certain moves", s16 damage)
|
||||
{
|
||||
bool32 useDig;
|
||||
PARAMETRIZE { useDig = FALSE; }
|
||||
PARAMETRIZE { useDig = TRUE; }
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }
|
||||
} WHEN {
|
||||
if (useDig)
|
||||
TURN { MOVE(opponent, MOVE_DIG); MOVE(player, MOVE_EARTHQUAKE); }
|
||||
else
|
||||
TURN { MOVE(player, MOVE_EARTHQUAKE); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, UQ_4_12(2.0), results[1].damage);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Being underwater causes the target to take double damage from certain moves", s16 damage)
|
||||
{
|
||||
bool32 useDive;
|
||||
PARAMETRIZE { useDive = FALSE; }
|
||||
PARAMETRIZE { useDive = TRUE; }
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }
|
||||
} WHEN {
|
||||
if (useDive)
|
||||
TURN { MOVE(opponent, MOVE_DIVE); MOVE(player, MOVE_SURF); }
|
||||
else
|
||||
TURN { MOVE(player, MOVE_SURF); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, UQ_4_12(2.0), results[1].damage);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Being airborne causes the target to take double damage from certain moves", s16 damage)
|
||||
{
|
||||
bool32 useDive;
|
||||
PARAMETRIZE { useDive = FALSE; }
|
||||
PARAMETRIZE { useDive = TRUE; }
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }
|
||||
} WHEN {
|
||||
if (useDive)
|
||||
TURN { MOVE(opponent, MOVE_FLY); MOVE(player, MOVE_TWISTER); }
|
||||
else
|
||||
TURN { MOVE(player, MOVE_TWISTER); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, UQ_4_12(2.0), results[1].damage);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user