mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2025-03-06 07:27:47 +01:00
almost full support for link battles mega evolution
This commit is contained in:
parent
facd838112
commit
602c1322e4
@ -4610,7 +4610,7 @@ BattleScript_FocusPunchSetUp::
|
|||||||
printstring STRINGID_PKMNTIGHTENINGFOCUS
|
printstring STRINGID_PKMNTIGHTENINGFOCUS
|
||||||
waitmessage 0x40
|
waitmessage 0x40
|
||||||
end2
|
end2
|
||||||
|
|
||||||
BattleScript_MegaEvolution::
|
BattleScript_MegaEvolution::
|
||||||
printstring STRINGID_MEGAEVOREACTING
|
printstring STRINGID_MEGAEVOREACTING
|
||||||
waitmessage 0x40
|
waitmessage 0x40
|
||||||
|
@ -601,7 +601,7 @@ struct BattleStruct
|
|||||||
u8 toMegaEvolve; // As flags using gBitTable.
|
u8 toMegaEvolve; // As flags using gBitTable.
|
||||||
u8 megaEvolvedPartyIds[2]; // As flags using gBitTable;
|
u8 megaEvolvedPartyIds[2]; // As flags using gBitTable;
|
||||||
bool8 alreadyMegaEvolved[4]; // Array id is used for mon position.
|
bool8 alreadyMegaEvolved[4]; // Array id is used for mon position.
|
||||||
u16 speciesToMegaEvolve[MAX_BATTLERS_COUNT];
|
u16 speciesThatMegaEvolved[MAX_BATTLERS_COUNT];
|
||||||
u16 playerSpeciesThatMegaEvolved;
|
u16 playerSpeciesThatMegaEvolved;
|
||||||
u8 megaEvoBattlerId;
|
u8 megaEvoBattlerId;
|
||||||
bool8 playerMegaEvoSelect;
|
bool8 playerMegaEvoSelect;
|
||||||
|
@ -78,6 +78,8 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent);
|
|||||||
void SwapHpBarsWithHpText(void);
|
void SwapHpBarsWithHpText(void);
|
||||||
void SetMegaTriggerSpritePal(u8 spriteId, u8 palId);
|
void SetMegaTriggerSpritePal(u8 spriteId, u8 palId);
|
||||||
void CreateMegaTriggerSprite(u8 battlerId, u8 palId);
|
void CreateMegaTriggerSprite(u8 battlerId, u8 palId);
|
||||||
|
bool32 IsMegaTriggerSpriteActive(void);
|
||||||
|
void HideMegaTriggerSprite(void);
|
||||||
void DestroyMegaTriggerSprite(void);
|
void DestroyMegaTriggerSprite(void);
|
||||||
u8 CreatePartyStatusSummarySprites(u8 battler, struct HpAndStatus *partyInfo, u8 arg2, bool8 isBattleStart);
|
u8 CreatePartyStatusSummarySprites(u8 battler, struct HpAndStatus *partyInfo, u8 arg2, bool8 isBattleStart);
|
||||||
void Task_HidePartyStatusSummary(u8 taskId);
|
void Task_HidePartyStatusSummary(u8 taskId);
|
||||||
|
@ -88,6 +88,7 @@ u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 bat
|
|||||||
u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u8 abilityDef);
|
u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u8 abilityDef);
|
||||||
u16 GetTypeModifier(u8 atkType, u8 defType);
|
u16 GetTypeModifier(u8 atkType, u8 defType);
|
||||||
s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId);
|
s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId);
|
||||||
|
u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId);
|
||||||
bool32 CanMegaEvolve(u8 battlerId);
|
bool32 CanMegaEvolve(u8 battlerId);
|
||||||
void UndoMegaEvolution(u8 monId);
|
void UndoMegaEvolution(u8 monId);
|
||||||
|
|
||||||
|
@ -391,7 +391,7 @@ static void HandleInputChooseTarget(void)
|
|||||||
else
|
else
|
||||||
BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8));
|
BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8));
|
||||||
EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX);
|
EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX);
|
||||||
DestroyMegaTriggerSprite();
|
HideMegaTriggerSprite();
|
||||||
PlayerBufferExecCompleted();
|
PlayerBufferExecCompleted();
|
||||||
}
|
}
|
||||||
else if (gMain.newKeys & B_BUTTON || gPlayerDpadHoldFrames > 59)
|
else if (gMain.newKeys & B_BUTTON || gPlayerDpadHoldFrames > 59)
|
||||||
@ -548,7 +548,7 @@ static void HandleInputChooseMove(void)
|
|||||||
BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8));
|
BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8));
|
||||||
else
|
else
|
||||||
BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8));
|
BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8));
|
||||||
DestroyMegaTriggerSprite();
|
HideMegaTriggerSprite();
|
||||||
PlayerBufferExecCompleted();
|
PlayerBufferExecCompleted();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -570,7 +570,7 @@ static void HandleInputChooseMove(void)
|
|||||||
PlaySE(SE_SELECT);
|
PlaySE(SE_SELECT);
|
||||||
gBattleStruct->playerMegaEvoSelect = FALSE;
|
gBattleStruct->playerMegaEvoSelect = FALSE;
|
||||||
BtlController_EmitTwoReturnValues(1, 10, 0xFFFF);
|
BtlController_EmitTwoReturnValues(1, 10, 0xFFFF);
|
||||||
DestroyMegaTriggerSprite();
|
HideMegaTriggerSprite();
|
||||||
PlayerBufferExecCompleted();
|
PlayerBufferExecCompleted();
|
||||||
}
|
}
|
||||||
else if (gMain.newKeys & DPAD_LEFT)
|
else if (gMain.newKeys & DPAD_LEFT)
|
||||||
@ -641,7 +641,7 @@ static void HandleInputChooseMove(void)
|
|||||||
}
|
}
|
||||||
else if (gMain.newKeys & START_BUTTON)
|
else if (gMain.newKeys & START_BUTTON)
|
||||||
{
|
{
|
||||||
if (gBattleStruct->megaEvoTriggerSpriteId != 0xFF)
|
if (CanMegaEvolve(gActiveBattler))
|
||||||
{
|
{
|
||||||
gBattleStruct->playerMegaEvoSelect ^= 1;
|
gBattleStruct->playerMegaEvoSelect ^= 1;
|
||||||
SetMegaTriggerSpritePal(gBattleStruct->megaEvoTriggerSpriteId, gBattleStruct->playerMegaEvoSelect);
|
SetMegaTriggerSpritePal(gBattleStruct->megaEvoTriggerSpriteId, gBattleStruct->playerMegaEvoSelect);
|
||||||
@ -2646,10 +2646,12 @@ static void PlayerHandleChooseMove(void)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
InitMoveSelectionsVarsAndStrings();
|
InitMoveSelectionsVarsAndStrings();
|
||||||
gBattlerControllerFuncs[gActiveBattler] = HandleChooseMoveAfterDma3;
|
|
||||||
gBattleStruct->playerMegaEvoSelect = FALSE;
|
gBattleStruct->playerMegaEvoSelect = FALSE;
|
||||||
|
if (!IsMegaTriggerSpriteActive())
|
||||||
|
gBattleStruct->megaEvoTriggerSpriteId = 0xFF;
|
||||||
if (CanMegaEvolve(gActiveBattler))
|
if (CanMegaEvolve(gActiveBattler))
|
||||||
CreateMegaTriggerSprite(gActiveBattler, 0);
|
CreateMegaTriggerSprite(gActiveBattler, 0);
|
||||||
|
gBattlerControllerFuncs[gActiveBattler] = HandleChooseMoveAfterDma3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -589,7 +589,7 @@ static const struct OamData sOamData_MegaTrigger =
|
|||||||
.matrixNum = 0,
|
.matrixNum = 0,
|
||||||
.size = 2,
|
.size = 2,
|
||||||
.tileNum = 0,
|
.tileNum = 0,
|
||||||
.priority = 1,
|
.priority = 3,
|
||||||
.paletteNum = 0,
|
.paletteNum = 0,
|
||||||
.affineParam = 0,
|
.affineParam = 0,
|
||||||
};
|
};
|
||||||
@ -1554,6 +1554,9 @@ void SetMegaTriggerSpritePal(u8 spriteId, u8 palId)
|
|||||||
#define MEGA_TRIGGER_POS_X_DIFF 19
|
#define MEGA_TRIGGER_POS_X_DIFF 19
|
||||||
#define MEGA_TRIGGER_POS_Y_DIFF 1
|
#define MEGA_TRIGGER_POS_Y_DIFF 1
|
||||||
|
|
||||||
|
#define tBattler data[0]
|
||||||
|
#define tHide data[1]
|
||||||
|
|
||||||
void CreateMegaTriggerSprite(u8 battlerId, u8 palId)
|
void CreateMegaTriggerSprite(u8 battlerId, u8 palId)
|
||||||
{
|
{
|
||||||
if (GetSpriteTileStartByTag(TAG_MEGA_TRIGGER_TILE) == 0xFFFF)
|
if (GetSpriteTileStartByTag(TAG_MEGA_TRIGGER_TILE) == 0xFFFF)
|
||||||
@ -1561,21 +1564,55 @@ void CreateMegaTriggerSprite(u8 battlerId, u8 palId)
|
|||||||
if (gBattleStruct->megaEvoTriggerSpriteId == 0xFF)
|
if (gBattleStruct->megaEvoTriggerSpriteId == 0xFF)
|
||||||
{
|
{
|
||||||
gBattleStruct->megaEvoTriggerSpriteId = CreateSprite(&sSpriteTemplate_MegaTrigger,
|
gBattleStruct->megaEvoTriggerSpriteId = CreateSprite(&sSpriteTemplate_MegaTrigger,
|
||||||
gSprites[gHealthboxSpriteIds[battlerId]].pos1.x - MEGA_TRIGGER_POS_X_DIFF,
|
gSprites[gHealthboxSpriteIds[battlerId]].pos1.x,
|
||||||
gSprites[gHealthboxSpriteIds[battlerId]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF, 0);
|
gSprites[gHealthboxSpriteIds[battlerId]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF, 0);
|
||||||
gSprites[gBattleStruct->megaEvoTriggerSpriteId].data[0] = battlerId;
|
gSprites[gBattleStruct->megaEvoTriggerSpriteId].tBattler = battlerId;
|
||||||
}
|
}
|
||||||
|
gSprites[gBattleStruct->megaEvoTriggerSpriteId].tHide = FALSE;
|
||||||
|
|
||||||
SetMegaTriggerSpritePal(gBattleStruct->megaEvoTriggerSpriteId, palId);
|
SetMegaTriggerSpritePal(gBattleStruct->megaEvoTriggerSpriteId, palId);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SpriteCb_MegaTrigger(struct Sprite *sprite)
|
static void SpriteCb_MegaTrigger(struct Sprite *sprite)
|
||||||
{
|
{
|
||||||
sprite->pos1.x = gSprites[gHealthboxSpriteIds[sprite->data[0]]].pos1.x - MEGA_TRIGGER_POS_X_DIFF;
|
if (sprite->tHide)
|
||||||
sprite->pos1.y = gSprites[gHealthboxSpriteIds[sprite->data[0]]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF;
|
{
|
||||||
|
if (sprite->pos1.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x + MEGA_TRIGGER_POS_X_DIFF)
|
||||||
|
sprite->pos1.x++;
|
||||||
|
if (sprite->pos2.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.x + MEGA_TRIGGER_POS_X_DIFF)
|
||||||
|
sprite->pos2.x++;
|
||||||
|
|
||||||
sprite->pos2.x = gSprites[gHealthboxSpriteIds[sprite->data[0]]].pos2.x - MEGA_TRIGGER_POS_X_DIFF;
|
sprite->pos1.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF;
|
||||||
sprite->pos2.y = gSprites[gHealthboxSpriteIds[sprite->data[0]]].pos2.y - MEGA_TRIGGER_POS_Y_DIFF;
|
sprite->pos2.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.y - MEGA_TRIGGER_POS_Y_DIFF;
|
||||||
|
if (sprite->pos1.x == gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x + MEGA_TRIGGER_POS_X_DIFF
|
||||||
|
&& sprite->pos2.x == gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.x + MEGA_TRIGGER_POS_X_DIFF)
|
||||||
|
DestroyMegaTriggerSprite();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (sprite->pos1.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x - MEGA_TRIGGER_POS_X_DIFF)
|
||||||
|
sprite->pos1.x--;
|
||||||
|
if (sprite->pos2.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.x - MEGA_TRIGGER_POS_X_DIFF)
|
||||||
|
sprite->pos2.x--;
|
||||||
|
|
||||||
|
sprite->pos1.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF;
|
||||||
|
sprite->pos2.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.y - MEGA_TRIGGER_POS_Y_DIFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool32 IsMegaTriggerSpriteActive(void)
|
||||||
|
{
|
||||||
|
if (GetSpriteTileStartByTag(TAG_MEGA_TRIGGER_TILE) == 0xFFFF)
|
||||||
|
return FALSE;
|
||||||
|
else if (IndexOfSpritePaletteTag(TAG_MEGA_TRIGGER_OFF_PAL) != 0xFF || IndexOfSpritePaletteTag(TAG_MEGA_TRIGGER_ON_PAL) != 0xFF)
|
||||||
|
return TRUE;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HideMegaTriggerSprite(void)
|
||||||
|
{
|
||||||
|
gSprites[gBattleStruct->megaEvoTriggerSpriteId].tHide = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DestroyMegaTriggerSprite(void)
|
void DestroyMegaTriggerSprite(void)
|
||||||
@ -1588,6 +1625,9 @@ void DestroyMegaTriggerSprite(void)
|
|||||||
gBattleStruct->megaEvoTriggerSpriteId = 0xFF;
|
gBattleStruct->megaEvoTriggerSpriteId = 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef tBattler
|
||||||
|
#undef tHide
|
||||||
|
|
||||||
#define tBattler data[0]
|
#define tBattler data[0]
|
||||||
#define tSummaryBarSpriteId data[1]
|
#define tSummaryBarSpriteId data[1]
|
||||||
#define tBallIconSpriteId(n) data[3 + n]
|
#define tBallIconSpriteId(n) data[3 + n]
|
||||||
|
@ -2579,7 +2579,7 @@ static const u8* TryGetStatusString(u8 *src)
|
|||||||
StringGetEnd10(text); \
|
StringGetEnd10(text); \
|
||||||
toCpy = text;
|
toCpy = text;
|
||||||
|
|
||||||
static const u8 *BattleStringGetTrainerName(u16 trainerId, u8 *text, u8 multiplierId)
|
static const u8 *BattleStringGetTrainerName(u16 trainerId, u8 *text, u8 multiplayerId, u8 battlerId)
|
||||||
{
|
{
|
||||||
const u8 *toCpy;
|
const u8 *toCpy;
|
||||||
|
|
||||||
@ -2594,7 +2594,11 @@ static const u8 *BattleStringGetTrainerName(u16 trainerId, u8 *text, u8 multipli
|
|||||||
}
|
}
|
||||||
else if (trainerId == TRAINER_OPPONENT_C00)
|
else if (trainerId == TRAINER_OPPONENT_C00)
|
||||||
{
|
{
|
||||||
toCpy = gLinkPlayers[multiplierId ^ BIT_SIDE].name;
|
toCpy = gLinkPlayers[multiplayerId ^ BIT_SIDE].name;
|
||||||
|
}
|
||||||
|
else if (trainerId == TRAINER_LINK_OPPONENT && gBattleTypeFlags & BATTLE_TYPE_LINK && battlerId != 0xFF)
|
||||||
|
{
|
||||||
|
toCpy = gLinkPlayers[GetBattlerMultiplayerId(battlerId)].name;
|
||||||
}
|
}
|
||||||
else if (trainerId == TRAINER_FRONTIER_BRAIN)
|
else if (trainerId == TRAINER_FRONTIER_BRAIN)
|
||||||
{
|
{
|
||||||
@ -2651,13 +2655,13 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
|
|||||||
u32 dstID = 0; // if they used dstID, why not use srcID as well?
|
u32 dstID = 0; // if they used dstID, why not use srcID as well?
|
||||||
const u8 *toCpy = NULL;
|
const u8 *toCpy = NULL;
|
||||||
u8 text[30];
|
u8 text[30];
|
||||||
u8 multiplayerID;
|
u8 multiplayerId;
|
||||||
s32 i;
|
s32 i;
|
||||||
|
|
||||||
if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
|
if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
|
||||||
multiplayerID = gUnknown_0203C7B4;
|
multiplayerId = gUnknown_0203C7B4;
|
||||||
else
|
else
|
||||||
multiplayerID = GetMultiplayerId();
|
multiplayerId = GetMultiplayerId();
|
||||||
|
|
||||||
while (*src != EOS)
|
while (*src != EOS)
|
||||||
{
|
{
|
||||||
@ -2732,25 +2736,25 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
|
|||||||
toCpy = text;
|
toCpy = text;
|
||||||
break;
|
break;
|
||||||
case B_TXT_LINK_PLAYER_MON1_NAME: // link first player poke name
|
case B_TXT_LINK_PLAYER_MON1_NAME: // link first player poke name
|
||||||
GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id]],
|
GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id]],
|
||||||
MON_DATA_NICKNAME, text);
|
MON_DATA_NICKNAME, text);
|
||||||
StringGetEnd10(text);
|
StringGetEnd10(text);
|
||||||
toCpy = text;
|
toCpy = text;
|
||||||
break;
|
break;
|
||||||
case B_TXT_LINK_OPPONENT_MON1_NAME: // link first opponent poke name
|
case B_TXT_LINK_OPPONENT_MON1_NAME: // link first opponent poke name
|
||||||
GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id ^ 1]],
|
GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 1]],
|
||||||
MON_DATA_NICKNAME, text);
|
MON_DATA_NICKNAME, text);
|
||||||
StringGetEnd10(text);
|
StringGetEnd10(text);
|
||||||
toCpy = text;
|
toCpy = text;
|
||||||
break;
|
break;
|
||||||
case B_TXT_LINK_PLAYER_MON2_NAME: // link second player poke name
|
case B_TXT_LINK_PLAYER_MON2_NAME: // link second player poke name
|
||||||
GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id ^ 2]],
|
GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 2]],
|
||||||
MON_DATA_NICKNAME, text);
|
MON_DATA_NICKNAME, text);
|
||||||
StringGetEnd10(text);
|
StringGetEnd10(text);
|
||||||
toCpy = text;
|
toCpy = text;
|
||||||
break;
|
break;
|
||||||
case B_TXT_LINK_OPPONENT_MON2_NAME: // link second opponent poke name
|
case B_TXT_LINK_OPPONENT_MON2_NAME: // link second opponent poke name
|
||||||
GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id ^ 3]],
|
GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 3]],
|
||||||
MON_DATA_NICKNAME, text);
|
MON_DATA_NICKNAME, text);
|
||||||
StringGetEnd10(text);
|
StringGetEnd10(text);
|
||||||
toCpy = text;
|
toCpy = text;
|
||||||
@ -2857,19 +2861,19 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
|
|||||||
toCpy = BattleStringGetTrainerClass(gTrainerBattleOpponent_A);
|
toCpy = BattleStringGetTrainerClass(gTrainerBattleOpponent_A);
|
||||||
break;
|
break;
|
||||||
case B_TXT_TRAINER1_NAME: // trainer1 name
|
case B_TXT_TRAINER1_NAME: // trainer1 name
|
||||||
toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerID);
|
toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerId, 0xFF);
|
||||||
break;
|
break;
|
||||||
case B_TXT_1E: // link player name?
|
case B_TXT_1E: // link player name?
|
||||||
toCpy = gLinkPlayers[multiplayerID].name;
|
toCpy = gLinkPlayers[multiplayerId].name;
|
||||||
break;
|
break;
|
||||||
case B_TXT_1F: // link partner name?
|
case B_TXT_1F: // link partner name?
|
||||||
toCpy = gLinkPlayers[GetBattlerMultiplayerId(2 ^ gLinkPlayers[multiplayerID].id)].name;
|
toCpy = gLinkPlayers[GetBattlerMultiplayerId(2 ^ gLinkPlayers[multiplayerId].id)].name;
|
||||||
break;
|
break;
|
||||||
case B_TXT_20: // link opponent 1 name?
|
case B_TXT_20: // link opponent 1 name?
|
||||||
toCpy = gLinkPlayers[GetBattlerMultiplayerId(1 ^ gLinkPlayers[multiplayerID].id)].name;
|
toCpy = gLinkPlayers[GetBattlerMultiplayerId(1 ^ gLinkPlayers[multiplayerId].id)].name;
|
||||||
break;
|
break;
|
||||||
case B_TXT_21: // link opponent 2 name?
|
case B_TXT_21: // link opponent 2 name?
|
||||||
toCpy = gLinkPlayers[GetBattlerMultiplayerId(3 ^ gLinkPlayers[multiplayerID].id)].name;
|
toCpy = gLinkPlayers[GetBattlerMultiplayerId(3 ^ gLinkPlayers[multiplayerId].id)].name;
|
||||||
break;
|
break;
|
||||||
case B_TXT_22: // link scripting active name
|
case B_TXT_22: // link scripting active name
|
||||||
toCpy = gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].name;
|
toCpy = gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].name;
|
||||||
@ -2957,7 +2961,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
|
|||||||
toCpy = BattleStringGetTrainerClass(gTrainerBattleOpponent_B);
|
toCpy = BattleStringGetTrainerClass(gTrainerBattleOpponent_B);
|
||||||
break;
|
break;
|
||||||
case B_TXT_TRAINER2_NAME:
|
case B_TXT_TRAINER2_NAME:
|
||||||
toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_B, text, multiplayerID);
|
toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_B, text, multiplayerId, 0xFF);
|
||||||
break;
|
break;
|
||||||
case B_TXT_TRAINER2_LOSE_TEXT:
|
case B_TXT_TRAINER2_LOSE_TEXT:
|
||||||
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
|
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
|
||||||
@ -3012,13 +3016,13 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case B_POSITION_OPPONENT_LEFT:
|
case B_POSITION_OPPONENT_LEFT:
|
||||||
toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerID);
|
toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerId, gBattlerAttacker);
|
||||||
break;
|
break;
|
||||||
case B_POSITION_OPPONENT_RIGHT:
|
case B_POSITION_OPPONENT_RIGHT:
|
||||||
if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
|
if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
|
||||||
toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_B, text, multiplayerID);
|
toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_B, text, multiplayerId, gBattlerAttacker);
|
||||||
else
|
else
|
||||||
toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerID);
|
toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerId, gBattlerAttacker);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -6594,7 +6594,15 @@ static void atk76_various(void)
|
|||||||
mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]];
|
mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]];
|
||||||
else
|
else
|
||||||
mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]];
|
mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]];
|
||||||
gBattleMons[gActiveBattler].species = gBattleStruct->speciesToMegaEvolve[gActiveBattler];
|
|
||||||
|
gBattleStruct->speciesThatMegaEvolved[gActiveBattler] = gBattleMons[gActiveBattler].species;
|
||||||
|
if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT
|
||||||
|
|| (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT && !(gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER))))
|
||||||
|
{
|
||||||
|
gBattleStruct->playerSpeciesThatMegaEvolved = gBattleStruct->speciesThatMegaEvolved[gActiveBattler];
|
||||||
|
}
|
||||||
|
|
||||||
|
gBattleMons[gActiveBattler].species = GetMegaEvolutionSpecies(gBattleStruct->speciesThatMegaEvolved[gActiveBattler], gBattleMons[gActiveBattler].item);
|
||||||
SetMonData(mon, MON_DATA_SPECIES, &gBattleMons[gActiveBattler].species);
|
SetMonData(mon, MON_DATA_SPECIES, &gBattleMons[gActiveBattler].species);
|
||||||
PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gActiveBattler].species);
|
PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gActiveBattler].species);
|
||||||
|
|
||||||
@ -6610,10 +6618,13 @@ static void atk76_various(void)
|
|||||||
gBattleMons[gActiveBattler].ability = GetMonAbility(mon);
|
gBattleMons[gActiveBattler].ability = GetMonAbility(mon);
|
||||||
gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1;
|
gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1;
|
||||||
gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2;
|
gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2;
|
||||||
UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_ALL);
|
|
||||||
|
|
||||||
|
UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_ALL);
|
||||||
gBattleStruct->alreadyMegaEvolved[GetBattlerPosition(gActiveBattler)] = TRUE;
|
gBattleStruct->alreadyMegaEvolved[GetBattlerPosition(gActiveBattler)] = TRUE;
|
||||||
gBattleStruct->megaEvolvedPartyIds[GetBattlerSide(gActiveBattler)] |= gBitTable[gBattlerPartyIndexes[gActiveBattler]];
|
gBattleStruct->megaEvolvedPartyIds[GetBattlerSide(gActiveBattler)] |= gBitTable[gBattlerPartyIndexes[gActiveBattler]];
|
||||||
|
|
||||||
|
BtlController_EmitSetMonData(0, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]], sizeof(struct BattlePokemon), &gBattleMons[gActiveBattler]);
|
||||||
|
MarkBattlerForControllerExec(gActiveBattler);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5586,10 +5586,23 @@ static bool32 IsPartnerMonFromSameTrainer(u8 battlerId)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool32 CanMegaEvolve(u8 battlerId)
|
u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId)
|
||||||
{
|
{
|
||||||
u32 i;
|
u32 i;
|
||||||
u16 species, itemId;
|
|
||||||
|
for (i = 0; i < EVOS_PER_MON; i++)
|
||||||
|
{
|
||||||
|
if (gEvolutionTable[preEvoSpecies][i].method == EVO_MEGA_EVOLUTION
|
||||||
|
&& gEvolutionTable[preEvoSpecies][i].param == heldItemId)
|
||||||
|
return gEvolutionTable[preEvoSpecies][i].targetSpecies;
|
||||||
|
}
|
||||||
|
return SPECIES_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool32 CanMegaEvolve(u8 battlerId)
|
||||||
|
{
|
||||||
|
u32 itemId, holdEffect;
|
||||||
|
struct Pokemon *mon;
|
||||||
u8 battlerPosition = GetBattlerPosition(battlerId);
|
u8 battlerPosition = GetBattlerPosition(battlerId);
|
||||||
u8 partnerPosition = GetBattlerPosition(BATTLE_PARTNER(battlerId));
|
u8 partnerPosition = GetBattlerPosition(BATTLE_PARTNER(battlerId));
|
||||||
|
|
||||||
@ -5602,27 +5615,23 @@ bool32 CanMegaEvolve(u8 battlerId)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the pokemon holds an appropriate item,
|
// Check if the pokemon holds an appropriate item.
|
||||||
if (GetBattlerHoldEffect(battlerId, FALSE) != HOLD_EFFECT_MEGA_STONE)
|
if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT)
|
||||||
|
mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]];
|
||||||
|
else
|
||||||
|
mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]];
|
||||||
|
|
||||||
|
itemId = GetMonData(mon, MON_DATA_HELD_ITEM);
|
||||||
|
if (itemId != ITEM_ENIGMA_BERRY)
|
||||||
|
holdEffect = ItemId_GetHoldEffect(itemId);
|
||||||
|
else
|
||||||
|
holdEffect = gEnigmaBerries[battlerId].holdEffect;
|
||||||
|
|
||||||
|
if (holdEffect != HOLD_EFFECT_MEGA_STONE)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
// Check if there is an entry in the evolution table.
|
// Check if there is an entry in the evolution table.
|
||||||
species = gBattleMons[battlerId].species;
|
if (GetMegaEvolutionSpecies(GetMonData(mon, MON_DATA_SPECIES), itemId) == SPECIES_NONE)
|
||||||
itemId = gBattleMons[battlerId].item;
|
|
||||||
for (i = 0; i < EVOS_PER_MON; i++)
|
|
||||||
{
|
|
||||||
if (gEvolutionTable[species][i].method == EVO_MEGA_EVOLUTION
|
|
||||||
&& gEvolutionTable[species][i].param == itemId)
|
|
||||||
{
|
|
||||||
gBattleStruct->speciesToMegaEvolve[battlerId] = gEvolutionTable[species][i].targetSpecies;
|
|
||||||
if (battlerPosition == B_POSITION_PLAYER_LEFT
|
|
||||||
|| (battlerPosition == B_POSITION_PLAYER_RIGHT && !(gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER))))
|
|
||||||
gBattleStruct->playerSpeciesThatMegaEvolved = species;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == EVOS_PER_MON)
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
// All checks passed, the mon CAN mega evolve.
|
// All checks passed, the mon CAN mega evolve.
|
||||||
|
@ -188,6 +188,8 @@ const struct Evolution gEvolutionTable[NUM_SPECIES][EVOS_PER_MON] =
|
|||||||
[SPECIES_SHELGON] = {{EVO_LEVEL, 50, SPECIES_SALAMENCE}},
|
[SPECIES_SHELGON] = {{EVO_LEVEL, 50, SPECIES_SALAMENCE}},
|
||||||
[SPECIES_BELDUM] = {{EVO_LEVEL, 20, SPECIES_METANG}},
|
[SPECIES_BELDUM] = {{EVO_LEVEL, 20, SPECIES_METANG}},
|
||||||
[SPECIES_METANG] = {{EVO_LEVEL, 45, SPECIES_METAGROSS}},
|
[SPECIES_METANG] = {{EVO_LEVEL, 45, SPECIES_METAGROSS}},
|
||||||
|
[SPECIES_SKARMORY] = {{EVO_LEVEL, 40, SPECIES_EXPLOUD},
|
||||||
|
{EVO_MEGA_EVOLUTION, ITEM_MEGA_STONE_TESTING, SPECIES_HO_OH}},
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //POKEEMERALD_EVOLUTION_H
|
#endif //POKEEMERALD_EVOLUTION_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user