Implemented Alcremie Evolution Method (#6530)

Co-authored-by: khbsd <khb.dev@gmail.com>
This commit is contained in:
Eduardo Quezada 2025-04-08 13:50:21 -04:00 committed by GitHub
parent 54928726cb
commit 2b417bfeed
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 294 additions and 23 deletions

View File

@ -300,6 +300,17 @@ enum EvolutionMethods {
EVO_ITEM_COUNT_999, // Pokémon levels up after trainer has collected 999 of a specific item
EVO_DEFEAT_THREE_WITH_ITEM, // Pokémon levels up after having defeat 3 Pokémon of the same species holding the specified item
EVO_OVERWORLD_STEPS, // Pokémon levels up after having taken a specific amount of steps in the overworld
// Alcremie evolutions methods. Different combinations of day, spin rotation and duration.
EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_CLOCKWISE,
EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_COUNTER_CLOCKWISE,
EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_CLOCKWISE,
EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_COUNTER_CLOCKWISE,
EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_CLOCKWISE,
EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_COUNTER_CLOCKWISE,
EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_CLOCKWISE,
EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_COUNTER_CLOCKWISE,
EVO_ITEM_HOLD_SPIN_DUSK_MORE_THAN_10_SECS,
};
enum EvolutionMode {

View File

@ -68,5 +68,8 @@ bool8 ObjectMovingOnRockStairs(struct ObjectEvent *objectEvent, u8 direction);
//sideways stairs
u8 GetRightSideStairsDirection(u8 direction);
u8 GetLeftSideStairsDirection(u8 direction);
void UpdateSpinData(void);
void ResetSpinTimer(void);
bool32 CanTriggerSpinEvolution();
#endif // GUARD_FIELD_PLAYER_AVATAR_H

View File

@ -608,6 +608,9 @@ extern u8 gEnemyPartyCount;
extern struct Pokemon gEnemyParty[PARTY_SIZE];
extern struct SpriteTemplate gMultiuseSpriteTemplate;
extern u16 gFollowerSteps;
extern bool32 consumeItem;
extern u32 removeBagItem;
extern u32 removeBagItemCount;
extern const u8 gFacilityClassToPicIndex[];
extern const u8 gFacilityClassToTrainerClass[];
@ -790,6 +793,7 @@ u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32
bool32 DoesSpeciesHaveFormChangeMethod(u16 species, u16 method);
u16 MonTryLearningNewMoveEvolution(struct Pokemon *mon, bool8 firstMove);
void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv);
void TrySpecialOverworldEvo(void);
bool32 SpeciesHasGenderDifferences(u16 species);
bool32 TryFormChange(u32 monId, u32 side, u16 method);
void TryToSetBattleFormChangeMoves(struct Pokemon *mon, u16 method);
@ -809,5 +813,6 @@ u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler);
uq4_12_t GetDynamaxLevelHPMultiplier(u32 dynamaxLevel, bool32 inverseMultiplier);
u32 GetRegionalFormByRegion(u32 species, u32 region);
bool32 IsSpeciesForeignRegionalForm(u32 species, u32 currentRegion);
void DoRemoveItems(struct Pokemon *mon);
#endif // GUARD_POKEMON_H

View File

@ -4813,15 +4813,70 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
.levelUpLearnset = sMilceryLevelUpLearnset,
.teachableLearnset = sMilceryTeachableLearnset,
.eggMoveLearnset = sMilceryEggMoveLearnset,
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_ALCREMIE_STRAWBERRY_VANILLA_CREAM},
{EVO_LEVEL, 0, SPECIES_ALCREMIE_STRAWBERRY_RUBY_CREAM},
{EVO_LEVEL, 0, SPECIES_ALCREMIE_STRAWBERRY_MATCHA_CREAM},
{EVO_LEVEL, 0, SPECIES_ALCREMIE_STRAWBERRY_MINT_CREAM},
{EVO_LEVEL, 0, SPECIES_ALCREMIE_STRAWBERRY_LEMON_CREAM},
{EVO_LEVEL, 0, SPECIES_ALCREMIE_STRAWBERRY_SALTED_CREAM},
{EVO_LEVEL, 0, SPECIES_ALCREMIE_STRAWBERRY_RUBY_SWIRL},
{EVO_LEVEL, 0, SPECIES_ALCREMIE_STRAWBERRY_CARAMEL_SWIRL},
{EVO_LEVEL, 0, SPECIES_ALCREMIE_STRAWBERRY_RAINBOW_SWIRL}),
.evolutions = EVOLUTION({EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_CLOCKWISE, ITEM_STRAWBERRY_SWEET, SPECIES_ALCREMIE_STRAWBERRY_VANILLA_CREAM},
{EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_STRAWBERRY_SWEET, SPECIES_ALCREMIE_STRAWBERRY_RUBY_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_CLOCKWISE, ITEM_STRAWBERRY_SWEET, SPECIES_ALCREMIE_STRAWBERRY_MATCHA_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_STRAWBERRY_SWEET, SPECIES_ALCREMIE_STRAWBERRY_MINT_CREAM},
{EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_CLOCKWISE, ITEM_STRAWBERRY_SWEET, SPECIES_ALCREMIE_STRAWBERRY_CARAMEL_SWIRL},
{EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_STRAWBERRY_SWEET, SPECIES_ALCREMIE_STRAWBERRY_RUBY_SWIRL},
{EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_CLOCKWISE, ITEM_STRAWBERRY_SWEET, SPECIES_ALCREMIE_STRAWBERRY_LEMON_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_STRAWBERRY_SWEET, SPECIES_ALCREMIE_STRAWBERRY_SALTED_CREAM},
{EVO_ITEM_HOLD_SPIN_DUSK_MORE_THAN_10_SECS, ITEM_STRAWBERRY_SWEET, SPECIES_ALCREMIE_STRAWBERRY_RAINBOW_SWIRL},
{EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_CLOCKWISE, ITEM_BERRY_SWEET, SPECIES_ALCREMIE_BERRY_VANILLA_CREAM},
{EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_BERRY_SWEET, SPECIES_ALCREMIE_BERRY_RUBY_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_CLOCKWISE, ITEM_BERRY_SWEET, SPECIES_ALCREMIE_BERRY_MATCHA_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_BERRY_SWEET, SPECIES_ALCREMIE_BERRY_MINT_CREAM},
{EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_CLOCKWISE, ITEM_BERRY_SWEET, SPECIES_ALCREMIE_BERRY_CARAMEL_SWIRL},
{EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_BERRY_SWEET, SPECIES_ALCREMIE_BERRY_RUBY_SWIRL},
{EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_CLOCKWISE, ITEM_BERRY_SWEET, SPECIES_ALCREMIE_BERRY_LEMON_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_BERRY_SWEET, SPECIES_ALCREMIE_BERRY_SALTED_CREAM},
{EVO_ITEM_HOLD_SPIN_DUSK_MORE_THAN_10_SECS, ITEM_BERRY_SWEET, SPECIES_ALCREMIE_BERRY_RAINBOW_SWIRL},
{EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_CLOCKWISE, ITEM_LOVE_SWEET, SPECIES_ALCREMIE_LOVE_VANILLA_CREAM},
{EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_LOVE_SWEET, SPECIES_ALCREMIE_LOVE_RUBY_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_CLOCKWISE, ITEM_LOVE_SWEET, SPECIES_ALCREMIE_LOVE_MATCHA_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_LOVE_SWEET, SPECIES_ALCREMIE_LOVE_MINT_CREAM},
{EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_CLOCKWISE, ITEM_LOVE_SWEET, SPECIES_ALCREMIE_LOVE_CARAMEL_SWIRL},
{EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_LOVE_SWEET, SPECIES_ALCREMIE_LOVE_RUBY_SWIRL},
{EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_CLOCKWISE, ITEM_LOVE_SWEET, SPECIES_ALCREMIE_LOVE_LEMON_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_LOVE_SWEET, SPECIES_ALCREMIE_LOVE_SALTED_CREAM},
{EVO_ITEM_HOLD_SPIN_DUSK_MORE_THAN_10_SECS, ITEM_LOVE_SWEET, SPECIES_ALCREMIE_LOVE_RAINBOW_SWIRL},
{EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_CLOCKWISE, ITEM_STAR_SWEET, SPECIES_ALCREMIE_STAR_VANILLA_CREAM},
{EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_STAR_SWEET, SPECIES_ALCREMIE_STAR_RUBY_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_CLOCKWISE, ITEM_STAR_SWEET, SPECIES_ALCREMIE_STAR_MATCHA_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_STAR_SWEET, SPECIES_ALCREMIE_STAR_MINT_CREAM},
{EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_CLOCKWISE, ITEM_STAR_SWEET, SPECIES_ALCREMIE_STAR_CARAMEL_SWIRL},
{EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_STAR_SWEET, SPECIES_ALCREMIE_STAR_RUBY_SWIRL},
{EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_CLOCKWISE, ITEM_STAR_SWEET, SPECIES_ALCREMIE_STAR_LEMON_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_STAR_SWEET, SPECIES_ALCREMIE_STAR_SALTED_CREAM},
{EVO_ITEM_HOLD_SPIN_DUSK_MORE_THAN_10_SECS, ITEM_STAR_SWEET, SPECIES_ALCREMIE_STAR_RAINBOW_SWIRL},
{EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_CLOCKWISE, ITEM_CLOVER_SWEET, SPECIES_ALCREMIE_CLOVER_VANILLA_CREAM},
{EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_CLOVER_SWEET, SPECIES_ALCREMIE_CLOVER_RUBY_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_CLOCKWISE, ITEM_CLOVER_SWEET, SPECIES_ALCREMIE_CLOVER_MATCHA_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_CLOVER_SWEET, SPECIES_ALCREMIE_CLOVER_MINT_CREAM},
{EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_CLOCKWISE, ITEM_CLOVER_SWEET, SPECIES_ALCREMIE_CLOVER_CARAMEL_SWIRL},
{EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_CLOVER_SWEET, SPECIES_ALCREMIE_CLOVER_RUBY_SWIRL},
{EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_CLOCKWISE, ITEM_CLOVER_SWEET, SPECIES_ALCREMIE_CLOVER_LEMON_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_CLOVER_SWEET, SPECIES_ALCREMIE_CLOVER_SALTED_CREAM},
{EVO_ITEM_HOLD_SPIN_DUSK_MORE_THAN_10_SECS, ITEM_CLOVER_SWEET, SPECIES_ALCREMIE_CLOVER_RAINBOW_SWIRL},
{EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_CLOCKWISE, ITEM_FLOWER_SWEET, SPECIES_ALCREMIE_FLOWER_VANILLA_CREAM},
{EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_FLOWER_SWEET, SPECIES_ALCREMIE_FLOWER_RUBY_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_CLOCKWISE, ITEM_FLOWER_SWEET, SPECIES_ALCREMIE_FLOWER_MATCHA_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_FLOWER_SWEET, SPECIES_ALCREMIE_FLOWER_MINT_CREAM},
{EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_CLOCKWISE, ITEM_FLOWER_SWEET, SPECIES_ALCREMIE_FLOWER_CARAMEL_SWIRL},
{EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_FLOWER_SWEET, SPECIES_ALCREMIE_FLOWER_RUBY_SWIRL},
{EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_CLOCKWISE, ITEM_FLOWER_SWEET, SPECIES_ALCREMIE_FLOWER_LEMON_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_FLOWER_SWEET, SPECIES_ALCREMIE_FLOWER_SALTED_CREAM},
{EVO_ITEM_HOLD_SPIN_DUSK_MORE_THAN_10_SECS, ITEM_FLOWER_SWEET, SPECIES_ALCREMIE_FLOWER_RAINBOW_SWIRL},
{EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_CLOCKWISE, ITEM_RIBBON_SWEET, SPECIES_ALCREMIE_RIBBON_VANILLA_CREAM},
{EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_RIBBON_SWEET, SPECIES_ALCREMIE_RIBBON_RUBY_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_CLOCKWISE, ITEM_RIBBON_SWEET, SPECIES_ALCREMIE_RIBBON_MATCHA_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_RIBBON_SWEET, SPECIES_ALCREMIE_RIBBON_MINT_CREAM},
{EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_CLOCKWISE, ITEM_RIBBON_SWEET, SPECIES_ALCREMIE_RIBBON_CARAMEL_SWIRL},
{EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_RIBBON_SWEET, SPECIES_ALCREMIE_RIBBON_RUBY_SWIRL},
{EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_CLOCKWISE, ITEM_RIBBON_SWEET, SPECIES_ALCREMIE_RIBBON_LEMON_CREAM},
{EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_COUNTER_CLOCKWISE, ITEM_RIBBON_SWEET, SPECIES_ALCREMIE_RIBBON_SALTED_CREAM},
{EVO_ITEM_HOLD_SPIN_DUSK_MORE_THAN_10_SECS, ITEM_RIBBON_SWEET, SPECIES_ALCREMIE_RIBBON_RAINBOW_SWIRL}
),
},
#define ALCREMIE_MISC_INFO(color) \

View File

@ -820,7 +820,10 @@ static void Task_EvolutionScene(u8 taskId)
Overworld_PlaySpecialMapMusic();
}
if (!gTasks[taskId].tEvoWasStopped)
{
DoRemoveItems(mon);
CreateShedinja(gTasks[taskId].tPreEvoSpecies, mon);
}
DestroyTask(taskId);
FreeMonSpritesGfx();

View File

@ -243,6 +243,13 @@ int ProcessPlayerFieldInput(struct FieldInput *input)
return TRUE;
}
if (CanTriggerSpinEvolution())
{
ResetSpinTimer();
TrySpecialOverworldEvo(); // Special vars set in CanTriggerSpinEvolution.
return TRUE;
}
return FALSE;
}

View File

@ -15,6 +15,7 @@
#include "party_menu.h"
#include "random.h"
#include "rotating_gate.h"
#include "rtc.h"
#include "script.h"
#include "sound.h"
#include "sprite.h"
@ -34,9 +35,29 @@
#define NUM_FORCED_MOVEMENTS 18
#define NUM_ACRO_BIKE_COLLISIONS 5
enum SpinDirection
{
SPIN_DIRECTION_NONE,
SPIN_DIRECTION_CLOCKWISE,
SPIN_DIRECTION_COUNTER_CLOCKWISE,
};
struct SpinData
{
u32 triggerEvo:1;
u32 spinDirection:2;
u32 spinTimeout:6;
u32 spinHistory0:3;
u32 spinHistory1:3;
u32 spinHistory2:3;
u32 spinHistory3:3;
u32 VBlanksSpinning:11; //34,1 seconds
};
static EWRAM_DATA u8 sSpinStartFacingDir = 0;
EWRAM_DATA struct ObjectEvent gObjectEvents[OBJECT_EVENTS_COUNT] = {};
EWRAM_DATA struct PlayerAvatar gPlayerAvatar = {};
EWRAM_DATA struct SpinData gPlayerSpinData = {};
// static declarations
@ -633,8 +654,146 @@ static void PlayerNotOnBikeNotMoving(u8 direction, u16 heldKeys)
PlayerFaceDirection(GetPlayerFacingDirection());
}
void UpdateSpinData(void)
{
if (gPlayerSpinData.spinTimeout != 0)
{
gPlayerSpinData.spinTimeout--;
if (gPlayerSpinData.VBlanksSpinning < 2048)
gPlayerSpinData.VBlanksSpinning++;
if (gPlayerSpinData.spinTimeout == 0 && gPlayerSpinData.spinDirection != SPIN_DIRECTION_NONE)
gPlayerSpinData.triggerEvo = TRUE;
}
}
void ResetSpinTimer(void)
{
gPlayerSpinData.spinTimeout = 0;
gPlayerSpinData.VBlanksSpinning = 0;
gPlayerSpinData.spinDirection = SPIN_DIRECTION_NONE;
gPlayerSpinData.spinHistory0 = DIR_NONE;
gPlayerSpinData.spinHistory1 = DIR_NONE;
gPlayerSpinData.spinHistory2 = DIR_NONE;
gPlayerSpinData.spinHistory3 = DIR_NONE;
}
static const u8 sClockwiseDirections[4][4] =
{
{ DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST, },
{ DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH, },
{ DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_EAST, },
{ DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH, },
};
static const u8 sCounterClockwiseDirections[4][4] =
{
{ DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST, },
{ DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_NORTH, },
{ DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST, },
{ DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH, },
};
static void WindUpSpinTimer(u32 direction)
{
gPlayerSpinData.spinTimeout = 60;
gPlayerSpinData.spinHistory0 = gPlayerSpinData.spinHistory1;
gPlayerSpinData.spinHistory1 = gPlayerSpinData.spinHistory2;
gPlayerSpinData.spinHistory2 = gPlayerSpinData.spinHistory3;
gPlayerSpinData.spinHistory3 = direction;
for (int i = 0; i < ARRAY_COUNT(sClockwiseDirections); i++)
{
if (gPlayerSpinData.spinHistory0 == sClockwiseDirections[i][0]
&& gPlayerSpinData.spinHistory1 == sClockwiseDirections[i][1]
&& gPlayerSpinData.spinHistory2 == sClockwiseDirections[i][2]
&& gPlayerSpinData.spinHistory3 == sClockwiseDirections[i][3])
{
gPlayerSpinData.spinDirection = SPIN_DIRECTION_CLOCKWISE;
return;
}
}
for (int i = 0; i < ARRAY_COUNT(sCounterClockwiseDirections); i++)
{
if (gPlayerSpinData.spinHistory0 == sCounterClockwiseDirections[i][0]
&& gPlayerSpinData.spinHistory1 == sCounterClockwiseDirections[i][1]
&& gPlayerSpinData.spinHistory2 == sCounterClockwiseDirections[i][2]
&& gPlayerSpinData.spinHistory3 == sCounterClockwiseDirections[i][3])
{
gPlayerSpinData.spinDirection = SPIN_DIRECTION_COUNTER_CLOCKWISE;
return;
}
}
gPlayerSpinData.spinDirection = SPIN_DIRECTION_NONE;
}
bool32 CanTriggerSpinEvolution()
{
gSpecialVar_0x8000 = EVO_NONE;
if (gPlayerSpinData.triggerEvo)
{
u32 timeOfDay = GetTimeOfDay();
u32 seconds = gPlayerSpinData.VBlanksSpinning / 60;
u32 direction = gPlayerSpinData.spinDirection;
if (timeOfDay == TIME_EVENING && seconds >= 10)
{
gSpecialVar_0x8000 = EVO_ITEM_HOLD_SPIN_DUSK_MORE_THAN_10_SECS;
}
else if (timeOfDay == TIME_NIGHT)
{
if (seconds >= 5)
{
if (direction == SPIN_DIRECTION_CLOCKWISE)
gSpecialVar_0x8000 = EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_CLOCKWISE;
else if (direction == SPIN_DIRECTION_COUNTER_CLOCKWISE)
gSpecialVar_0x8000 = EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_COUNTER_CLOCKWISE;
}
else
{
if (direction == SPIN_DIRECTION_CLOCKWISE)
gSpecialVar_0x8000 = EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_CLOCKWISE;
else if (direction == SPIN_DIRECTION_COUNTER_CLOCKWISE)
gSpecialVar_0x8000 = EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_COUNTER_CLOCKWISE;
}
}
else if (timeOfDay != TIME_NIGHT)
{
if (seconds >= 5)
{
if (direction == SPIN_DIRECTION_CLOCKWISE)
gSpecialVar_0x8000 = EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_CLOCKWISE;
else if (direction == SPIN_DIRECTION_COUNTER_CLOCKWISE)
gSpecialVar_0x8000 = EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_COUNTER_CLOCKWISE;
}
else
{
if (direction == SPIN_DIRECTION_CLOCKWISE)
gSpecialVar_0x8000 = EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_CLOCKWISE;
else if (direction == SPIN_DIRECTION_COUNTER_CLOCKWISE)
gSpecialVar_0x8000 = EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_COUNTER_CLOCKWISE;
}
}
gSpecialVar_0x8001 = FALSE; //canStopEvo
gSpecialVar_0x8002 = TRUE; //tryMultiple
gPlayerSpinData.triggerEvo = FALSE;
}
if (gSpecialVar_0x8000 != EVO_NONE)
{
for (u32 i = 0; i < PARTY_SIZE; i++)
{
u16 species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_OVERWORLD_SPECIAL, gSpecialVar_0x8000, NULL);
if (species != SPECIES_NONE)
{
return TRUE;
}
}
}
return FALSE;
}
static void PlayerNotOnBikeTurningInPlace(u8 direction, u16 heldKeys)
{
WindUpSpinTimer(direction);
PlayerTurnInPlace(direction);
}
@ -666,7 +825,8 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys)
return;
}
}
ResetSpinTimer(); // Everything below will move the player a space, reset the timer.
gPlayerAvatar.creeping = FALSE;
if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
{
@ -2605,4 +2765,3 @@ bool8 ObjectMovingOnRockStairs(struct ObjectEvent *objectEvent, u8 direction)
return FALSE;
#endif
}

View File

@ -1,6 +1,7 @@
#include "global.h"
#include "play_time.h"
#include "fake_rtc.h"
#include "field_player_avatar.h"
enum
{
@ -40,6 +41,7 @@ void PlayTimeCounter_Update(void)
return;
gSaveBlock2Ptr->playTimeVBlanks++;
UpdateSpinData();
if (gSaveBlock2Ptr->playTimeVBlanks < 60)
return;

View File

@ -90,6 +90,9 @@ EWRAM_DATA struct SpriteTemplate gMultiuseSpriteTemplate = {0};
EWRAM_DATA static struct MonSpritesGfxManager *sMonSpritesGfxManagers[MON_SPR_GFX_MANAGERS_COUNT] = {NULL};
EWRAM_DATA static u8 sTriedEvolving = 0;
EWRAM_DATA u16 gFollowerSteps = 0;
EWRAM_DATA bool32 removeHeldItem = 0;
EWRAM_DATA u32 removeBagItem = 0;
EWRAM_DATA u32 removeBagItemCount = 0;
#include "data/abilities.h"
@ -4436,6 +4439,18 @@ u8 GetNatureFromPersonality(u32 personality)
return personality % NUM_NATURES;
}
void DoRemoveItems(struct Pokemon *mon)
{
if (removeHeldItem)
{
u32 heldItem = ITEM_NONE;
SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem);
}
if (removeBagItem != ITEM_NONE && removeBagItemCount != 0)
RemoveBagItem(removeBagItem, removeBagItemCount);
}
u32 GetGMaxTargetSpecies(u32 species)
{
const struct FormChange *formChanges = GetSpeciesFormChanges(species);
@ -4460,7 +4475,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16
u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0);
u16 upperPersonality = personality >> 16;
u32 holdEffect, currentMap, partnerSpecies, partnerHeldItem, partnerHoldEffect;
bool32 consumeItem = FALSE;
removeHeldItem = FALSE;
u16 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0);
const struct Evolution *evolutions = GetSpeciesEvolutions(species);
@ -4541,14 +4556,14 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16
if (GetTimeOfDay() == TIME_NIGHT && heldItem == evolutions[i].param)
{
targetSpecies = evolutions[i].targetSpecies;
consumeItem = TRUE;
removeHeldItem = TRUE;
}
break;
case EVO_ITEM_HOLD_DAY:
if (GetTimeOfDay() != TIME_NIGHT && heldItem == evolutions[i].param)
{
targetSpecies = evolutions[i].targetSpecies;
consumeItem = TRUE;
removeHeldItem = TRUE;
}
break;
case EVO_LEVEL_DUSK:
@ -4728,7 +4743,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16
if (heldItem == evolutions[i].param)
{
targetSpecies = evolutions[i].targetSpecies;
consumeItem = TRUE;
removeHeldItem = TRUE;
}
break;
case EVO_USE_MOVE_TWENTY_TIMES:
@ -4769,7 +4784,8 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16
if (CheckBagHasItem(evolutions[i].param, 999))
{
targetSpecies = evolutions[i].targetSpecies;
RemoveBagItem(evolutions[i].param, 999);
removeBagItem = evolutions[i].param;
removeBagItemCount = 999;
}
break;
}
@ -4790,7 +4806,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16
if (evolutions[i].param == heldItem)
{
targetSpecies = evolutions[i].targetSpecies;
consumeItem = TRUE;
removeHeldItem = TRUE;
}
break;
case EVO_TRADE_SPECIFIC_MON:
@ -4874,6 +4890,22 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16
if (evolutionItem == EVO_WATER_SCROLL)
targetSpecies = evolutions[i].targetSpecies;
break;
case EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_CLOCKWISE:
case EVO_ITEM_HOLD_SPIN_DAY_LESS_THAN_5_SECS_COUNTER_CLOCKWISE:
case EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_CLOCKWISE:
case EVO_ITEM_HOLD_SPIN_NIGHT_LESS_THAN_5_SECS_COUNTER_CLOCKWISE:
case EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_CLOCKWISE:
case EVO_ITEM_HOLD_SPIN_DAY_MORE_THAN_5_SECS_COUNTER_CLOCKWISE:
case EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_CLOCKWISE:
case EVO_ITEM_HOLD_SPIN_NIGHT_MORE_THAN_5_SECS_COUNTER_CLOCKWISE:
case EVO_ITEM_HOLD_SPIN_DUSK_MORE_THAN_10_SECS:
if (evolutions[i].param == heldItem && evolutionItem == evolutions[i].method)
{
targetSpecies = evolutions[i].targetSpecies;
removeHeldItem = TRUE;
}
break;
}
}
break;
@ -4889,12 +4921,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16
return SPECIES_NONE;
}
if (consumeItem)
{
heldItem = ITEM_NONE;
SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem);
}
return targetSpecies;
}