Merge branch 'upcoming' of https://github.com/rh-hideout/pokeemerald-expansion into rhh/dexnav

This commit is contained in:
ghoulslash 2024-10-16 10:26:55 -04:00
commit 43f184d0a5
10 changed files with 70 additions and 8 deletions

View file

@ -8023,9 +8023,12 @@ BattleScript_SupremeOverlordActivates::
BattleScript_CostarActivates:: BattleScript_CostarActivates::
pause B_WAIT_TIME_SHORT pause B_WAIT_TIME_SHORT
savetarget
copybyte gBattlerTarget, sBATTLER
call BattleScript_AbilityPopUp call BattleScript_AbilityPopUp
printstring STRINGID_PKMNCOPIEDSTATCHANGES printstring STRINGID_PKMNCOPIEDSTATCHANGES
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
restoretarget
end3 end3
BattleScript_ZeroToHeroActivates:: BattleScript_ZeroToHeroActivates::

View file

@ -18,7 +18,9 @@ struct Item
u8 pluralName[ITEM_NAME_PLURAL_LENGTH]; u8 pluralName[ITEM_NAME_PLURAL_LENGTH];
u8 holdEffect; u8 holdEffect;
u8 holdEffectParam; u8 holdEffectParam;
u8 importance; u8 importance:2;
u8 notConsumed:1;
u8 padding:5;
u8 pocket; u8 pocket;
u8 type; u8 type;
u8 battleUsage; u8 battleUsage;
@ -73,6 +75,7 @@ u32 ItemId_GetHoldEffect(u32 itemId);
u32 ItemId_GetHoldEffectParam(u32 itemId); u32 ItemId_GetHoldEffectParam(u32 itemId);
const u8 *ItemId_GetDescription(u16 itemId); const u8 *ItemId_GetDescription(u16 itemId);
u8 ItemId_GetImportance(u16 itemId); u8 ItemId_GetImportance(u16 itemId);
u8 ItemId_GetConsumability(u16 itemId);
u8 ItemId_GetPocket(u16 itemId); u8 ItemId_GetPocket(u16 itemId);
u8 ItemId_GetType(u16 itemId); u8 ItemId_GetType(u16 itemId);
ItemUseFunc ItemId_GetFieldFunc(u16 itemId); ItemUseFunc ItemId_GetFieldFunc(u16 itemId);

View file

@ -106,6 +106,5 @@ void MoveDeleterForgetMove(void);
void BufferMoveDeleterNicknameAndMove(void); void BufferMoveDeleterNicknameAndMove(void);
void GetNumMovesSelectedMonHas(void); void GetNumMovesSelectedMonHas(void);
void MoveDeleterChooseMoveToForget(void); void MoveDeleterChooseMoveToForget(void);
bool32 IsItemFlute(u16 item);
#endif // GUARD_PARTY_MENU_H #endif // GUARD_PARTY_MENU_H

View file

@ -384,8 +384,8 @@ static void HandleInputChooseAction(u32 battler)
&& !(gAbsentBattlerFlags & (1u << GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) && !(gAbsentBattlerFlags & (1u << GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)))
&& !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{ {
// Return item to bag if partner had selected one (except flutes). // Return item to bag if partner had selected one (if consumable).
if (gBattleResources->bufferA[battler][1] == B_ACTION_USE_ITEM && !IsItemFlute(itemId)) if (gBattleResources->bufferA[battler][1] == B_ACTION_USE_ITEM && ItemId_GetConsumability(itemId))
{ {
AddBagItem(itemId, 1); AddBagItem(itemId, 1);
} }

View file

@ -4980,10 +4980,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
&& CountBattlerStatIncreases(BATTLE_PARTNER(battler), FALSE)) && CountBattlerStatIncreases(BATTLE_PARTNER(battler), FALSE))
{ {
gSpecialStatuses[battler].switchInAbilityDone = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE;
gBattlerAttacker = battler; gBattlerAttacker = gBattlerAbility = battler;
for (i = 0; i < NUM_BATTLE_STATS; i++) for (i = 0; i < NUM_BATTLE_STATS; i++)
gBattleMons[battler].statStages[i] = gBattleMons[BATTLE_PARTNER(battler)].statStages[i]; gBattleMons[battler].statStages[i] = gBattleMons[BATTLE_PARTNER(battler)].statStages[i];
gBattlerTarget = BATTLE_PARTNER(battler); gBattleScripting.battler = BATTLE_PARTNER(battler);
BattleScriptPushCursorAndCallback(BattleScript_CostarActivates); BattleScriptPushCursorAndCallback(BattleScript_CostarActivates);
effect++; effect++;
} }

View file

@ -2036,6 +2036,7 @@ const struct Item gItemsInfo[] =
"A glass flute that\n" "A glass flute that\n"
"awakens sleeping\n" "awakens sleeping\n"
"Pokémon."), "Pokémon."),
.notConsumed = TRUE,
.pocket = POCKET_ITEMS, .pocket = POCKET_ITEMS,
.type = ITEM_USE_PARTY_MENU, .type = ITEM_USE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_Medicine, .fieldUseFunc = ItemUseOutOfBattle_Medicine,
@ -2054,6 +2055,7 @@ const struct Item gItemsInfo[] =
"A glass flute that\n" "A glass flute that\n"
"snaps Pokémon\n" "snaps Pokémon\n"
"out of confusion."), "out of confusion."),
.notConsumed = TRUE,
.pocket = POCKET_ITEMS, .pocket = POCKET_ITEMS,
.type = ITEM_USE_PARTY_MENU, .type = ITEM_USE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse, .fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@ -2072,6 +2074,7 @@ const struct Item gItemsInfo[] =
"A glass flute that\n" "A glass flute that\n"
"snaps Pokémon\n" "snaps Pokémon\n"
"out of attraction."), "out of attraction."),
.notConsumed = TRUE,
.pocket = POCKET_ITEMS, .pocket = POCKET_ITEMS,
.type = ITEM_USE_PARTY_MENU, .type = ITEM_USE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse, .fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@ -2093,6 +2096,7 @@ const struct Item gItemsInfo[] =
"A glass flute that\n" "A glass flute that\n"
"keeps away wild\n" "keeps away wild\n"
"Pokémon."), "Pokémon."),
.notConsumed = TRUE,
.pocket = POCKET_ITEMS, .pocket = POCKET_ITEMS,
.type = ITEM_USE_PARTY_MENU, .type = ITEM_USE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_BlackWhiteFlute, .fieldUseFunc = ItemUseOutOfBattle_BlackWhiteFlute,
@ -2109,6 +2113,7 @@ const struct Item gItemsInfo[] =
.description = COMPOUND_STRING( .description = COMPOUND_STRING(
"A glass flute that\n" "A glass flute that\n"
"lures wild Pokémon."), "lures wild Pokémon."),
.notConsumed = TRUE,
.pocket = POCKET_ITEMS, .pocket = POCKET_ITEMS,
.type = ITEM_USE_PARTY_MENU, .type = ITEM_USE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_BlackWhiteFlute, .fieldUseFunc = ItemUseOutOfBattle_BlackWhiteFlute,

View file

@ -916,6 +916,11 @@ u8 ItemId_GetImportance(u16 itemId)
return gItemsInfo[SanitizeItemId(itemId)].importance; return gItemsInfo[SanitizeItemId(itemId)].importance;
} }
u8 ItemId_GetConsumability(u16 itemId)
{
return !gItemsInfo[SanitizeItemId(itemId)].notConsumed;
}
u8 ItemId_GetPocket(u16 itemId) u8 ItemId_GetPocket(u16 itemId)
{ {
return gItemsInfo[SanitizeItemId(itemId)].pocket; return gItemsInfo[SanitizeItemId(itemId)].pocket;

View file

@ -4578,7 +4578,7 @@ static bool8 NotUsingHPEVItemOnShedinja(struct Pokemon *mon, u16 item)
return TRUE; return TRUE;
} }
bool32 IsItemFlute(u16 item) static bool32 IsItemFlute(u16 item)
{ {
if (item == ITEM_BLUE_FLUTE || item == ITEM_RED_FLUTE || item == ITEM_YELLOW_FLUTE) if (item == ITEM_BLUE_FLUTE || item == ITEM_RED_FLUTE || item == ITEM_YELLOW_FLUTE)
return TRUE; return TRUE;

View file

@ -1,7 +1,29 @@
#include "global.h" #include "global.h"
#include "test/battle.h" #include "test/battle.h"
TO_DO_BATTLE_TEST("Costar copies an ally's stat stages upon entering battle"); DOUBLE_BATTLE_TEST("Costar copies an ally's stat stages upon entering battle")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT);
OPPONENT(SPECIES_FLAMIGO) { Ability(ABILITY_COSTAR); }
} WHEN {
TURN { MOVE(opponentLeft, MOVE_SWORDS_DANCE); }
TURN { SWITCH(opponentRight, 2); MOVE(playerLeft, MOVE_CELEBRATE); }
} SCENE {
// Turn 1 - buff up
MESSAGE("Foe Wobbuffet used Swords Dance!");
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft);
// Turn 2 - Switch into Flamigo
MESSAGE("2 sent out Flamigo!");
ABILITY_POPUP(opponentRight, ABILITY_COSTAR);
MESSAGE("Foe Flamigo copied Foe Wobbuffet's stat changes!");
} THEN {
EXPECT_EQ(opponentRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2);
}
}
// Copy from Ruin ability tests // Copy from Ruin ability tests
TO_DO_BATTLE_TEST("Costar's message displays correctly after all battlers fainted - Player"); TO_DO_BATTLE_TEST("Costar's message displays correctly after all battlers fainted - Player");

View file

@ -94,3 +94,28 @@ SINGLE_BATTLE_TEST("Download doesn't activate if target hasn't been sent out yet
EXPECT_MUL_EQ(results[0].damageSpecial, Q_4_12(1.5), results[1].damageSpecial); EXPECT_MUL_EQ(results[0].damageSpecial, Q_4_12(1.5), results[1].damageSpecial);
} }
} }
DOUBLE_BATTLE_TEST("Download raises Sp.Attack if enemies have lower total Sp. Def than Def", s16 damage)
{
u32 ability;
PARAMETRIZE { ability = ABILITY_TRACE; }
PARAMETRIZE { ability = ABILITY_DOWNLOAD; }
GIVEN {
PLAYER(SPECIES_PORYGON) { Ability(ability); SpAttack(100); }
PLAYER(SPECIES_WYNAUT);
OPPONENT(SPECIES_WOBBUFFET) { Defense(200); SpDefense(100); }
OPPONENT(SPECIES_WOBBUFFET) { Defense(100); SpDefense(150); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_TRI_ATTACK, target: opponentLeft ); }
} SCENE {
if (ability == ABILITY_DOWNLOAD)
{
ABILITY_POPUP(playerLeft, ABILITY_DOWNLOAD);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft);
MESSAGE("Porygon's Download raised its Sp. Atk!");
}
HP_BAR(opponentLeft, captureDamage: &results[i].damage);
} FINALLY {
EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage);
}
}