migrated battle_controller_player up to CONTROLLER_STATUSICONUPDATE, fixed in battle item use

This commit is contained in:
cawtds 2024-05-10 01:02:59 +02:00
parent 75b8ba5d6b
commit f9c73a3cd9
17 changed files with 518 additions and 601 deletions

View File

@ -1023,6 +1023,7 @@ gBattleAnims_Special::
.4byte Special_BallThrowWithTrainer @ B_ANIM_BALL_THROW_WITH_TRAINER
.4byte Special_SubstituteToMon @ B_ANIM_SUBSTITUTE_TO_MON
.4byte Special_MonToSubstitute @ B_ANIM_MON_TO_SUBSTITUTE
.4byte Special_CriticalCaptureBallThrow @ B_ANIM_CRITICAL_CAPTURE_THROW
Move_NONE:
Move_MIRROR_MOVE:
@ -12271,6 +12272,15 @@ Special_MonToSubstitute:
createvisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, FALSE
end
Special_CriticalCaptureBallThrow:
createvisualtask AnimTask_LoadBallGfx, 2
delay 0
playsewithpan SE_FALL, 0
createvisualtask AnimTask_ThrowBall, 2
createvisualtask AnimTask_IsBallBlockedByTrainerOrDodged, 2
jumpreteq -1, BallThrowTrainerBlock
goto BallThrowEnd
General_RestoreBg:
restorebg
waitbgfadein

View File

@ -18,59 +18,101 @@
.section script_data, "aw", %progbits
.align 2
gBattlescriptsForBallThrow::
.4byte BattleScript_ThrowBall
.4byte BattleScript_ThrowBall
.4byte BattleScript_ThrowBall
.4byte BattleScript_ThrowBall
.4byte BattleScript_ThrowBall
.4byte BattleScript_ThrowBall
.4byte BattleScript_ThrowBall
.4byte BattleScript_ThrowBall
.4byte BattleScript_ThrowBall
.4byte BattleScript_ThrowBall
.4byte BattleScript_ThrowBall
.4byte BattleScript_ThrowBall
.4byte BattleScript_ThrowBall
@ pokefirered leftovers
BattleScript_OldMan_Pokedude_CaughtMessage::
printstring STRINGID_GOTCHAPKMNCAUGHT2
setbyte gBattleOutcome, B_OUTCOME_CAUGHT
endlinkbattle
finishturn
BattleScript_GhostBallDodge::
waitmessage B_WAIT_TIME_LONG
printstring STRINGID_ITDODGEDBALL
waitmessage B_WAIT_TIME_LONG
finishaction
BattleScript_UsePokeFlute::
checkpokeflute BS_ATTACKER
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 1, BattleScript_PokeFluteWakeUp
printstring STRINGID_POKEFLUTECATCHY
waitmessage B_WAIT_TIME_LONG
goto BattleScript_PokeFluteEnd
BattleScript_PokeFluteWakeUp::
printstring STRINGID_POKEFLUTE
waitmessage B_WAIT_TIME_LONG
fanfare MUS_POKE_FLUTE
waitfanfare BS_ATTACKER
printstring STRINGID_MONHEARINGFLUTEAWOKE
waitmessage B_WAIT_TIME_LONG
updatestatusicon BS_PLAYER2
waitstate
BattleScript_PokeFluteEnd::
finishaction
@ pokemerald
.align 2
gBattlescriptsForUsingItem::
.4byte BattleScript_PlayerUseItem
.4byte BattleScript_ItemRestoreHP @ EFFECT_ITEM_RESTORE_HP (e.g. Potion)
.4byte BattleScript_ItemCureStatus @ EFFECT_ITEM_CURE_STATUS (e.g. Antidote, Pecha Berry)
.4byte BattleScript_ItemHealAndCureStatus @ EFFECT_ITEM_HEAL_AND_CURE_STATUS (e.g. Full Restore)
.4byte BattleScript_ItemIncreaseStat @ EFFECT_ITEM_INCREASE_STAT (e.g. X Attack)
.4byte BattleScript_ItemSetMist @ EFFECT_ITEM_SET_MIST (e.g. Guard Spec)
.4byte BattleScript_ItemSetFocusEnergy @ EFFECT_ITEM_SET_FOCUS_ENERGY (e.g. Dire Hit)
.4byte BattleScript_RunByUsingItem @ EFFECT_ITEM_ESCAPE (e.g. Poké Doll)
.4byte BattleScript_BallThrow @ EFFECT_ITEM_THROW_BALL (e.g. Pokéball)
.4byte BattleScript_ItemRestoreHP @ EFFECT_ITEM_REVIVE (e.g. Revive)
.4byte BattleScript_ItemRestorePP @ EFFECT_ITEM_RESTORE_PP (e.g. Ether)
.4byte BattleScript_ItemIncreaseAllStats @ EFFECT_ITEM_INCREASE_ALL_STATS (e.g. Max Mushrooms)
.4byte BattleScript_ItemRestoreHP @ EFFECT_ITEM_RESTORE_HP
.4byte BattleScript_ItemCureStatus @ EFFECT_ITEM_CURE_STATUS
.4byte BattleScript_ItemHealAndCureStatus @ EFFECT_ITEM_HEAL_AND_CURE_STATUS
.4byte BattleScript_ItemIncreaseStat @ EFFECT_ITEM_INCREASE_STAT
.4byte BattleScript_ItemSetMist @ EFFECT_ITEM_SET_MIST
.4byte BattleScript_ItemSetFocusEnergy @ EFFECT_ITEM_SET_FOCUS_ENERGY
.4byte BattleScript_RunByUsingItem @ EFFECT_ITEM_ESCAPE
.4byte BattleScript_BallThrow @ EFFECT_ITEM_THROW_BALL
.4byte BattleScript_ItemRestoreHP @ EFFECT_ITEM_REVIVE
.4byte BattleScript_ItemRestorePP @ EFFECT_ITEM_RESTORE_PP
.4byte BattleScript_ItemIncreaseAllStats @ EFFECT_ITEM_INCREASE_ALL_STATS
gBattleScriptsForAIUsingItems::
.4byte BattleScript_AIUseFullRestoreOrHpHeal
.4byte BattleScript_AIUseFullRestoreOrHpHeal
.4byte BattleScript_AIUseStatRestore
.4byte BattleScript_AIUseXstat
.4byte BattleScript_AIUseGuardSpec
.align 2
gBattlescriptsForSafariActions::
.4byte BattleScript_WatchesCarefully
.4byte BattleScript_ThrowRock
.4byte BattleScript_ThrowBait
.4byte BattleScript_LeftoverWallyPrepToThrow
gBattlescriptsForRunningByItem::
.4byte BattleScript_UseFluffyTail
.4byte BattleScript_UsePokeFlute
BattleScript_WatchesCarefully::
printfromtable gSafariReactionStringIds
waitmessage B_WAIT_TIME_LONG
playanimation BS_OPPONENT1, B_ANIM_SAFARI_REACTION
end2
BattleScript_ThrowRock::
printstring STRINGID_THREWROCK
waitmessage B_WAIT_TIME_LONG
playanimation BS_ATTACKER, B_ANIM_ROCK_THROW
end2
BattleScript_ThrowBait::
printstring STRINGID_THREWBAIT
waitmessage B_WAIT_TIME_LONG
playanimation BS_ATTACKER, B_ANIM_BAIT_THROW
end2
BattleScript_LeftoverWallyPrepToThrow::
printstring STRINGID_RETURNMON
waitmessage B_WAIT_TIME_LONG
returnatktoball
waitstate
trainerslidein BS_TARGET
waitstate
printstring STRINGID_YOUTHROWABALLNOWRIGHT
waitmessage B_WAIT_TIME_LONG
end2
BattleScript_ItemEnd:
end
end
BattleScript_UseItemMessage:
printstring STRINGID_EMPTYSTRING3
pause B_WAIT_TIME_MED
playse SE_USE_ITEM
getbattlerside BS_ATTACKER
copybyte cMULTISTRING_CHOOSER, gBattleCommunication
printfromtable gTrainerUsedItemStringIds
waitmessage B_WAIT_TIME_LONG
moveendcase 15
return
printstring STRINGID_EMPTYSTRING3
pause B_WAIT_TIME_MED
playse SE_USE_ITEM
getbattlerside BS_ATTACKER
copybyte cMULTISTRING_CHOOSER, gBattleCommunication
printfromtable gTrainerUsedItemStringIds
waitmessage B_WAIT_TIME_LONG
return
BattleScript_ItemRestoreHPRet:
bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT
@ -119,69 +161,47 @@ BattleScript_ItemHealAndCureStatus::
BattleScript_ItemIncreaseStat::
call BattleScript_UseItemMessage
itemincreasestat
itemincreasestat
statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_ItemEnd
setgraphicalstatchangevalues
playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
printfromtable gStatUpStringIds
waitmessage B_WAIT_TIME_LONG
moveendcase 15
end
end
BattleScript_ItemSetMist::
call BattleScript_UseItemMessage
setmist
playmoveanimation BS_ATTACKER, MOVE_MIST
waitanimation
printfromtable gMistUsedStringIds
waitmessage B_WAIT_TIME_LONG
moveendcase 15
end
call BattleScript_UseItemMessage
setmist
playmoveanimation BS_ATTACKER, MOVE_MIST
waitanimation
printfromtable gMistUsedStringIds
waitmessage B_WAIT_TIME_LONG
end
BattleScript_ItemSetFocusEnergy::
call BattleScript_UseItemMessage
jumpifstatus2 BS_ATTACKER, STATUS2_FOCUS_ENERGY, BattleScript_ButItFailed
setfocusenergy
playmoveanimation BS_ATTACKER, MOVE_FOCUS_ENERGY
waitanimation
call BattleScript_UseItemMessage
jumpifstatus2 BS_ATTACKER, STATUS2_FOCUS_ENERGY_ANY, BattleScript_ButItFailed
setfocusenergy
playmoveanimation BS_ATTACKER, MOVE_FOCUS_ENERGY
waitanimation
copybyte sBATTLER, gBattlerAttacker
printstring STRINGID_PKMNUSEDXTOGETPUMPED
waitmessage B_WAIT_TIME_LONG
moveendcase 15
end
BattleScript_RunByUsingItem::
playse SE_FLEE
setbyte gBattleOutcome, B_OUTCOME_RAN
finishturn
BattleScript_BallThrow::
jumpifbattletype BATTLE_TYPE_OLD_MAN_TUTORIAL, BattleScript_OldManThrowBall
jumpifbattletype BATTLE_TYPE_POKEDUDE, BattleScript_PokedudeThrowBall
printstring STRINGID_PLAYERUSEDITEM
handleballthrow
printstring STRINGID_PKMNUSEDXTOGETPUMPED
waitmessage B_WAIT_TIME_LONG
end
BattleScript_ItemRestorePP::
call BattleScript_UseItemMessage
itemrestorepp
printstring STRINGID_ITEMRESTOREDSPECIESPP
waitmessage B_WAIT_TIME_LONG
moveendcase 15
end
call BattleScript_UseItemMessage
itemrestorepp
printstring STRINGID_ITEMRESTOREDSPECIESPP
waitmessage B_WAIT_TIME_LONG
end
BattleScript_ItemIncreaseAllStats::
call BattleScript_UseItemMessage
call BattleScript_AllStatsUp
moveendcase 15
end
end
gBattlescriptsForSafariActions::
.4byte BattleScript_WatchesCarefully
.4byte BattleScript_ThrowRock
.4byte BattleScript_ThrowBait
.4byte BattleScript_LeftoverWallyPrepToThrow
BattleScript_ThrowBall::
BattleScript_BallThrow::
jumpifbattletype BATTLE_TYPE_OLD_MAN_TUTORIAL, BattleScript_OldManThrowBall
jumpifbattletype BATTLE_TYPE_POKEDUDE, BattleScript_PokedudeThrowBall
printstring STRINGID_PLAYERUSEDITEM
@ -230,21 +250,20 @@ BattleScript_SuccessBallThrowEnd::
setbyte gBattleOutcome, B_OUTCOME_CAUGHT
finishturn
BattleScript_OldMan_Pokedude_CaughtMessage::
printstring STRINGID_GOTCHAPKMNCAUGHT2
BattleScript_WallyBallThrow::
printstring STRINGID_GOTCHAPKMNCAUGHTWALLY
setbyte gBattleOutcome, B_OUTCOME_CAUGHT
endlinkbattle
finishturn
BattleScript_ShakeBallThrow::
printfromtable gBallEscapeStringIds
waitmessage B_WAIT_TIME_LONG
jumpifnotbattletype BATTLE_TYPE_SAFARI, BattleScript_CatchFailEnd
jumpifbyte CMP_NOT_EQUAL, gNumSafariBalls, 0, BattleScript_CatchFailEnd
jumpifword CMP_NO_COMMON_BITS, gBattleTypeFlags, BATTLE_TYPE_SAFARI, BattleScript_ShakeBallThrowEnd
jumpifbyte CMP_NOT_EQUAL, gNumSafariBalls, 0, BattleScript_ShakeBallThrowEnd
printstring STRINGID_OUTOFSAFARIBALLS
waitmessage B_WAIT_TIME_LONG
setbyte gBattleOutcome, B_OUTCOME_NO_SAFARI_BALLS
BattleScript_CatchFailEnd::
BattleScript_ShakeBallThrowEnd::
finishaction
BattleScript_TrainerBallBlock::
@ -255,118 +274,35 @@ BattleScript_TrainerBallBlock::
waitmessage B_WAIT_TIME_LONG
finishaction
BattleScript_GhostBallDodge::
waitmessage B_WAIT_TIME_LONG
printstring STRINGID_ITDODGEDBALL
waitmessage B_WAIT_TIME_LONG
finishaction
BattleScript_PlayerUseItem::
moveendcase 15
end
BattleScript_AIUseFullRestoreOrHpHeal::
printstring STRINGID_EMPTYSTRING3
pause B_WAIT_TIME_MED
playse SE_USE_ITEM
printstring STRINGID_TRAINER1USEDITEM
waitmessage B_WAIT_TIME_LONG
useitemonopponent
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
printstring STRINGID_PKMNSITEMRESTOREDHEALTH
waitmessage B_WAIT_TIME_LONG
updatestatusicon BS_ATTACKER
moveendcase 15
finishaction
BattleScript_AIUseStatRestore::
printstring STRINGID_EMPTYSTRING3
pause B_WAIT_TIME_MED
playse SE_USE_ITEM
printstring STRINGID_TRAINER1USEDITEM
waitmessage B_WAIT_TIME_LONG
useitemonopponent
printfromtable gTrainerItemCuredStatusStringIds
waitmessage B_WAIT_TIME_LONG
updatestatusicon BS_ATTACKER
moveendcase 15
finishaction
BattleScript_AIUseXstat::
printstring STRINGID_EMPTYSTRING3
pause B_WAIT_TIME_MED
playse SE_USE_ITEM
printstring STRINGID_TRAINER1USEDITEM
waitmessage B_WAIT_TIME_LONG
useitemonopponent
printfromtable gStatUpStringIds
waitmessage B_WAIT_TIME_LONG
moveendcase 15
finishaction
BattleScript_AIUseGuardSpec::
printstring STRINGID_EMPTYSTRING3
pause B_WAIT_TIME_MED
playse SE_USE_ITEM
printstring STRINGID_TRAINER1USEDITEM
waitmessage B_WAIT_TIME_LONG
useitemonopponent
printfromtable gMistUsedStringIds
waitmessage B_WAIT_TIME_LONG
moveendcase 15
finishaction
BattleScript_UseFluffyTail::
BattleScript_RunByUsingItem::
playse SE_FLEE
setbyte gBattleOutcome, B_OUTCOME_RAN
finishturn
BattleScript_UsePokeFlute::
checkpokeflute BS_ATTACKER
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 1, BattleScript_PokeFluteWakeUp
printstring STRINGID_POKEFLUTECATCHY
waitmessage B_WAIT_TIME_LONG
goto BattleScript_PokeFluteEnd
BattleScript_PokeFluteWakeUp::
printstring STRINGID_POKEFLUTE
waitmessage B_WAIT_TIME_LONG
fanfare MUS_POKE_FLUTE
waitfanfare BS_ATTACKER
printstring STRINGID_MONHEARINGFLUTEAWOKE
waitmessage B_WAIT_TIME_LONG
updatestatusicon BS_PLAYER2
BattleScript_TrainerASlideMsgRet::
handletrainerslidemsg BS_SCRIPTING, 0
trainerslidein B_POSITION_OPPONENT_LEFT
handletrainerslidemsg BS_SCRIPTING, 1
waitstate
BattleScript_PokeFluteEnd::
finishaction
BattleScript_WatchesCarefully::
printfromtable gSafariReactionStringIds
waitmessage B_WAIT_TIME_LONG
playanimation BS_OPPONENT1, B_ANIM_SAFARI_REACTION
end2
BattleScript_ThrowRock::
printstring STRINGID_THREWROCK
waitmessage B_WAIT_TIME_LONG
playanimation BS_ATTACKER, B_ANIM_ROCK_THROW
end2
BattleScript_ThrowBait::
printstring STRINGID_THREWBAIT
waitmessage B_WAIT_TIME_LONG
playanimation BS_ATTACKER, B_ANIM_BAIT_THROW
end2
BattleScript_LeftoverWallyPrepToThrow::
printstring STRINGID_RETURNMON
waitmessage B_WAIT_TIME_LONG
returnatktoball
trainerslideout B_POSITION_OPPONENT_LEFT
waitstate
trainerslidein BS_TARGET
waitstate
printstring STRINGID_YOUTHROWABALLNOWRIGHT
waitmessage B_WAIT_TIME_LONG
handletrainerslidemsg BS_SCRIPTING, 2
return
BattleScript_TrainerASlideMsgEnd2::
call BattleScript_TrainerASlideMsgRet
end2
BattleScript_TrainerBSlideMsgRet::
handletrainerslidemsg BS_SCRIPTING, 0
trainerslidein B_POSITION_OPPONENT_RIGHT
handletrainerslidemsg BS_SCRIPTING, 1
waitstate
trainerslideout B_POSITION_OPPONENT_RIGHT
waitstate
handletrainerslidemsg BS_SCRIPTING, 2
return
BattleScript_TrainerBSlideMsgEnd2::
call BattleScript_TrainerBSlideMsgRet
end2

View File

@ -922,6 +922,7 @@ extern u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT];
extern s32 gBattleMoveDamage;
extern u16 gIntroSlideFlags;
extern u32 gTransformedPersonalities[MAX_BATTLERS_COUNT];
extern bool8 gTransformedShininess[MAX_BATTLERS_COUNT];
extern u8 gBattlerPositions[MAX_BATTLERS_COUNT];
extern u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT];
extern u8 gBattleOutcome;

View File

@ -261,6 +261,7 @@ void BtlController_EmitEndLinkBattle(u32 battler, u32 bufferId, u8 battleOutcome
void BtlController_Empty(u32 battler); // Empty command, does nothing, only completes the execution.
void StartSendOutAnim(u32 battler, bool32 dontClearSubstituteBit);
void Controller_WaitForString(u32 battler);
// handlers
void BtlController_HandleGetMonData(u32 battler);
@ -272,6 +273,13 @@ void BtlController_HandleReturnMonToBall(u32 battler);
void BtlController_HandleDrawTrainerPic(u32 battlerId, u32 trainerPicId, bool32 isFrontPic, s16 xPos, s16 yPos, s32 subpriority);
void BtlController_HandleTrainerSlide(u32 battler, u32 trainerPicId);
void BtlController_HandleTrainerSlideBack(u32 battlerId, s16 data0, bool32 startAnim);
void BtlController_HandleFaintAnimation(u32 battler);
void BtlController_HandleSuccessBallThrowAnim(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture);
void BtlController_HandleBallThrowAnim(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture);
void BtlController_HandleMoveAnimation(u32 battler);
void BtlController_HandlePrintString(u32 battler);
void BtlController_HandleHealthBarUpdate(u32 battler, bool32 updateHpText);
void BtlController_HandleStatusIconUpdate(u32 battler);
// player controller
void BattleControllerDummy(u32 battler);

View File

@ -83,6 +83,7 @@ enum
HEALTHBOX_SAFARI_BALLS_TEXT
};
u32 WhichBattleCoords(u32 battlerId);
void Task_HidePartyStatusSummary(u8 taskId);
u8 CreateBattlerHealthboxSprites(u8 battlerId);
u8 CreateSafariPlayerHealthboxSprites(void);

View File

@ -199,9 +199,6 @@ extern const u8 BattleScript_WallyBallThrow[];
extern const u8 BattleScript_ShakeBallThrow[];
extern const u8 BattleScript_TrainerBallBlock[];
extern const u8 BattleScript_RunByUsingItem[];
extern const u8 BattleScript_ActionWatchesCarefully[];
extern const u8 BattleScript_ActionGetNear[];
extern const u8 BattleScript_ActionThrowPokeblock[];
extern const u8 BattleScript_GhostGetOutGetOut[];
extern const u8 BattleScript_TooScaredToMove[];
extern const u8 BattleScript_IntimidateActivates[];
@ -213,10 +210,7 @@ extern const u8 BattleScript_GhostBallDodge[];
extern const u8 BattleScript_OldMan_Pokedude_CaughtMessage[];
extern const u8 BattleScript_SilphScopeUnveiled[];
extern const u8 *const gBattlescriptsForBallThrow[];
extern const u8 *const gBattlescriptsForRunningByItem[];
extern const u8 *const gBattlescriptsForUsingItem[];
extern const u8 *const gBattleScriptsForAIUsingItems[];
extern const u8 *const gBattlescriptsForSafariActions[];
extern const u8 BattleScript_ItemRestoreHP_Party[];
@ -702,9 +696,6 @@ extern const u8 BattleScript_WallyBallThrow[];
extern const u8 BattleScript_ShakeBallThrow[];
extern const u8 BattleScript_TrainerBallBlock[];
extern const u8 BattleScript_RunByUsingItem[];
extern const u8 BattleScript_ActionWatchesCarefully[];
extern const u8 BattleScript_ActionGetNear[];
extern const u8 BattleScript_ActionThrowPokeblock[];
extern const u8 BattleScript_EmbargoEndTurn[];
extern const u8 BattleScript_TelekinesisEndTurn[];
extern const u8 BattleScript_BufferEndTurn[];

View File

@ -146,7 +146,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
void BattleScriptExecute(const u8 *BS_ptr);
void BattleScriptPushCursorAndCallback(const u8 *BS_ptr);
u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn);
void ClearFuryCutterDestinyBondGrudge(u8 battlerId);
void ClearVariousBattlerFlags(u32 battler);
void HandleAction_RunBattleScript(void);
u8 GetMoveTarget(u16 move, u8 setTarget);
u8 IsMonDisobedient(void);

View File

@ -399,6 +399,7 @@
#define B_ANIM_BALL_THROW_WITH_TRAINER 4
#define B_ANIM_SUBSTITUTE_TO_MON 5
#define B_ANIM_MON_TO_SUBSTITUTE 6
#define B_ANIM_CRITICAL_CAPTURE_THROW 7
// status animation table (gBattleAnims_StatusConditions)
#define B_ANIM_STATUS_PSN 0

View File

@ -1,4 +1,5 @@
#include "global.h"
#include "battle_controllers.h"
#include "gflib.h"
#include "data.h"
#include "item.h"
@ -13,7 +14,6 @@
#include "util.h"
#include "battle.h"
#include "battle_anim.h"
#include "battle_controllers.h"
#include "battle_interface.h"
#include "battle_message.h"
#include "battle_setup.h"
@ -32,13 +32,10 @@ static void PlayerHandleSwitchInAnim(u32 battler);
static void PlayerHandleDrawTrainerPic(u32 battler);
static void PlayerHandleTrainerSlide(u32 battler);
static void PlayerHandleTrainerSlideBack(u32 battler);
static void PlayerHandleFaintAnimation(u32 battler);
static void PlayerHandlePaletteFade(u32 battler);
static void PlayerHandleSuccessBallThrowAnim(u32 battler);
static void PlayerHandleBallThrowAnim(u32 battler);
static void PlayerHandlePause(u32 battler);
static void PlayerHandleMoveAnimation(u32 battler);
static void PlayerHandlePrintString(u32 battler);
static void PlayerHandlePrintSelectionString(u32 battler);
static void PlayerHandleChooseAction(u32 battler);
static void PlayerHandleUnknownYesNoBox(u32 battler);
@ -48,7 +45,6 @@ static void PlayerHandleChoosePokemon(u32 battler);
static void PlayerHandleCmd23(u32 battler);
static void PlayerHandleHealthBarUpdate(u32 battler);
static void PlayerHandleExpUpdate(u32 battler);
static void PlayerHandleStatusIconUpdate(u32 battler);
static void PlayerHandleStatusAnimation(u32 battler);
static void PlayerHandleStatusXor(u32 battler);
static void PlayerHandleDataTransfer(u32 battler);
@ -94,7 +90,6 @@ static void Task_PrepareToGiveExpWithExpBar(u8 taskId);
static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId);
static void Task_UpdateLvlInHealthbox(u8 taskId);
static void PrintLinkStandbyMsg(void);
static void PlayerDoMoveAnimation(u32 battler);
static void Task_StartSendOutAnim(u8 taskId);
static void PreviewDeterminativeMoveTargets(u32 battler);
static void SwitchIn_HandleSoundAndEnd(u32 battler);
@ -116,23 +111,23 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
[CONTROLLER_DRAWTRAINERPIC] = PlayerHandleDrawTrainerPic, // done
[CONTROLLER_TRAINERSLIDE] = PlayerHandleTrainerSlide, // done
[CONTROLLER_TRAINERSLIDEBACK] = PlayerHandleTrainerSlideBack, // done
[CONTROLLER_FAINTANIMATION] = PlayerHandleFaintAnimation,
[CONTROLLER_PALETTEFADE] = PlayerHandlePaletteFade,
[CONTROLLER_SUCCESSBALLTHROWANIM] = PlayerHandleSuccessBallThrowAnim,
[CONTROLLER_BALLTHROWANIM] = PlayerHandleBallThrowAnim,
[CONTROLLER_PAUSE] = PlayerHandlePause,
[CONTROLLER_MOVEANIMATION] = PlayerHandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = PlayerHandlePrintString,
[CONTROLLER_PRINTSTRINGPLAYERONLY] = PlayerHandlePrintSelectionString,
[CONTROLLER_CHOOSEACTION] = PlayerHandleChooseAction,
[CONTROLLER_UNKNOWNYESNOBOX] = PlayerHandleUnknownYesNoBox,
[CONTROLLER_CHOOSEMOVE] = PlayerHandleChooseMove,
[CONTROLLER_OPENBAG] = PlayerHandleChooseItem,
[CONTROLLER_CHOOSEPOKEMON] = PlayerHandleChoosePokemon,
[CONTROLLER_23] = PlayerHandleCmd23,
[CONTROLLER_HEALTHBARUPDATE] = PlayerHandleHealthBarUpdate,
[CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate,
[CONTROLLER_STATUSICONUPDATE] = PlayerHandleStatusIconUpdate,
[CONTROLLER_FAINTANIMATION] = BtlController_HandleFaintAnimation, // done
[CONTROLLER_PALETTEFADE] = PlayerHandlePaletteFade, // done
[CONTROLLER_SUCCESSBALLTHROWANIM] = PlayerHandleSuccessBallThrowAnim, // done
[CONTROLLER_BALLTHROWANIM] = PlayerHandleBallThrowAnim, // done
[CONTROLLER_PAUSE] = PlayerHandlePause, // done
[CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, // done
[CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, // done
[CONTROLLER_PRINTSTRINGPLAYERONLY] = PlayerHandlePrintSelectionString, // done
[CONTROLLER_CHOOSEACTION] = PlayerHandleChooseAction, // done
[CONTROLLER_UNKNOWNYESNOBOX] = BtlController_Empty, // done
[CONTROLLER_CHOOSEMOVE] = PlayerHandleChooseMove, // done
[CONTROLLER_OPENBAG] = PlayerHandleChooseItem, // done
[CONTROLLER_CHOOSEPOKEMON] = PlayerHandleChoosePokemon, // done
[CONTROLLER_23] = PlayerHandleCmd23, // done
[CONTROLLER_HEALTHBARUPDATE] = PlayerHandleHealthBarUpdate, // done
[CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, // done
[CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, // done
[CONTROLLER_STATUSANIMATION] = PlayerHandleStatusAnimation,
[CONTROLLER_STATUSXOR] = PlayerHandleStatusXor,
[CONTROLLER_DATATRANSFER] = PlayerHandleDataTransfer,
@ -758,10 +753,8 @@ void HandleInputChooseMove(u32 battler)
}
else if (JOY_NEW(START_BUTTON))
{
DebugPrintfLevel(MGBA_LOG_ERROR, "start");
if (CanMegaEvolve(battler))
{
DebugPrintfLevel(MGBA_LOG_ERROR, "canmegaevolve");
gBattleStruct->mega.playerSelect ^= 1;
ChangeMegaTriggerSprite(gBattleStruct->mega.triggerSpriteId, gBattleStruct->mega.playerSelect);
PlaySE(SE_SELECT);
@ -1169,22 +1162,6 @@ void Task_PlayerController_RestoreBgmAfterCry(u8 taskId)
}
}
static void CompleteOnHealthbarDone(u32 battler)
{
s16 hpValue = MoveBattleBar(battler, gHealthboxSpriteIds[battler], HEALTH_BAR, 0);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]);
if (hpValue != -1)
{
UpdateHpTextInHealthbox(gHealthboxSpriteIds[battler], HP_CURRENT, hpValue, gBattleMons[battler].maxHP);
}
else
{
HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[battler]], battler);
PlayerBufferExecCompleted(battler);
}
}
void CompleteOnInactiveTextPrinter(u32 battler)
{
if (!IsTextPrinterActive(0))
@ -1205,10 +1182,10 @@ static s32 GetTaskExpValue(u8 taskId)
static void Task_GiveExpToMon(u8 taskId)
{
u32 monId = (u8)(gTasks[taskId].tExpTask_monId);
u32 battler = gTasks[taskId].tExpTask_battler;
u8 battler = gTasks[taskId].tExpTask_battler;
s32 gainedExp = GetTaskExpValue(taskId);
if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battler]) // Give exp without moving the expbar.
if (WhichBattleCoords(battler) == 1 || monId != gBattlerPartyIndexes[battler]) // Give exp without moving the expbar.
{
struct Pokemon *mon = &gPlayerParty[monId];
u16 species = GetMonData(mon, MON_DATA_SPECIES);
@ -1219,11 +1196,23 @@ static void Task_GiveExpToMon(u8 taskId)
if (currExp + gainedExp >= nextLvlExp)
{
SetMonData(mon, MON_DATA_EXP, &nextLvlExp);
gBattleStruct->dynamax.levelUpHP = GetMonData(mon, MON_DATA_HP) \
+ UQ_4_12_TO_INT((gBattleScripting.levelUpHP * UQ_4_12(1.5)) + UQ_4_12_ROUND);
CalculateMonStats(mon);
// Reapply Dynamax HP multiplier after stats are recalculated.
if (IsDynamaxed(battler) && monId == gBattlerPartyIndexes[battler])
{
ApplyDynamaxHPMultiplier(battler, mon);
gBattleMons[battler].hp = gBattleStruct->dynamax.levelUpHP;
SetMonData(mon, MON_DATA_HP, &gBattleMons[battler].hp);
}
gainedExp -= nextLvlExp - currExp;
BtlController_EmitTwoReturnValues(battler, 1, RET_VALUE_LEVELED_UP, gainedExp);
BtlController_EmitTwoReturnValues(battler, BUFFER_B, RET_VALUE_LEVELED_UP, gainedExp);
if (IsDoubleBattle() == TRUE
&& ((u16)(monId) == gBattlerPartyIndexes[battler] || (u16)(monId) == gBattlerPartyIndexes[BATTLE_PARTNER(battler)]))
&& (monId == gBattlerPartyIndexes[battler] || monId == gBattlerPartyIndexes[BATTLE_PARTNER(battler)]))
gTasks[taskId].func = Task_LaunchLvlUpAnim;
else
gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter;
@ -1232,7 +1221,7 @@ static void Task_GiveExpToMon(u8 taskId)
{
currExp += gainedExp;
SetMonData(mon, MON_DATA_EXP, &currExp);
gBattlerControllerFuncs[battler] = CompleteOnInactiveTextPrinter;
gBattlerControllerFuncs[battler] = Controller_WaitForString;
DestroyTask(taskId);
}
}
@ -1288,7 +1277,18 @@ static void Task_GiveExpWithExpBar(u8 taskId)
if (currExp + gainedExp >= expOnNextLvl)
{
SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &expOnNextLvl);
gBattleStruct->dynamax.levelUpHP = GetMonData(&gPlayerParty[monId], MON_DATA_HP) \
+ UQ_4_12_TO_INT((gBattleScripting.levelUpHP * UQ_4_12(1.5)) + UQ_4_12_ROUND);
CalculateMonStats(&gPlayerParty[monId]);
// Reapply Dynamax HP multiplier after stats are recalculated.
if (IsDynamaxed(battler) && monId == gBattlerPartyIndexes[battler])
{
ApplyDynamaxHPMultiplier(battler, &gPlayerParty[monId]);
gBattleMons[battler].hp = gBattleStruct->dynamax.levelUpHP;
SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleMons[battler].hp);
}
gainedExp -= expOnNextLvl - currExp;
BtlController_EmitTwoReturnValues(battler, 1, RET_VALUE_LEVELED_UP, gainedExp);
gTasks[taskId].func = Task_LaunchLvlUpAnim;
@ -1297,7 +1297,7 @@ static void Task_GiveExpWithExpBar(u8 taskId)
{
currExp += gainedExp;
SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &currExp);
gBattlerControllerFuncs[battler] = CompleteOnInactiveTextPrinter;
gBattlerControllerFuncs[battler] = Controller_WaitForString;
DestroyTask(taskId);
}
}
@ -1343,7 +1343,7 @@ static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId)
}
else
{
gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter;
gBattlerControllerFuncs[battlerId] = Controller_WaitForString;
DestroyTask(taskId);
}
}
@ -1423,29 +1423,12 @@ static void Task_CreateLevelUpVerticalStripes(u8 taskId)
gBattle_BG2_X = data[14];
gBattle_BG2_Y = data[13];
}
gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter;
gBattlerControllerFuncs[battlerId] = Controller_WaitForString;
DestroyTask(taskId);
break;
}
}
static void FreeMonSpriteAfterFaintAnim(u32 battler)
{
if (gSprites[gBattlerSpriteIds[battler]].y + gSprites[gBattlerSpriteIds[battler]].y2 > DISPLAY_HEIGHT)
{
FreeOamMatrix(gSprites[gBattlerSpriteIds[battler]].oam.matrixNum);
DestroySprite(&gSprites[gBattlerSpriteIds[battler]]);
SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]);
PlayerBufferExecCompleted(battler);
}
}
static void CompleteOnInactiveTextPrinter2(u32 battler)
{
if (!IsTextPrinterActive(0))
PlayerBufferExecCompleted(battler);
}
static void OpenPartyMenuToChooseMon(u32 battler)
{
if (!gPaletteFade.active)
@ -1740,29 +1723,6 @@ static void PlayerHandleTrainerSlideBack(u32 battler)
BtlController_HandleTrainerSlideBack(battler, 50, TRUE);
}
static void PlayerHandleFaintAnimation(u32 battler)
{
if (gBattleSpritesDataPtr->healthBoxesData[battler].animationState == 0)
{
if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_SUBSTITUTE_TO_MON);
++gBattleSpritesDataPtr->healthBoxesData[battler].animationState;
}
else
{
if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive)
{
gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0;
HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[battler]], battler);
PlaySE12WithPanning(SE_FAINT, SOUND_PAN_ATTACKER);
gSprites[gBattlerSpriteIds[battler]].data[1] = 0;
gSprites[gBattlerSpriteIds[battler]].data[2] = 5;
gSprites[gBattlerSpriteIds[battler]].callback = SpriteCB_FaintSlideAnim;
gBattlerControllerFuncs[battler] = FreeMonSpriteAfterFaintAnim;
}
}
}
static void PlayerHandlePaletteFade(u32 battler)
{
BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK);
@ -1771,20 +1731,12 @@ static void PlayerHandlePaletteFade(u32 battler)
static void PlayerHandleSuccessBallThrowAnim(u32 battler)
{
gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;
gDoingBattleAnim = TRUE;
InitAndLaunchSpecialAnimation(battler, battler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW);
gBattlerControllerFuncs[battler] = CompleteOnSpecialAnimDone;
BtlController_HandleSuccessBallThrowAnim(battler, gBattlerTarget, B_ANIM_BALL_THROW, TRUE);
}
static void PlayerHandleBallThrowAnim(u32 battler)
{
u8 ballThrowCaseId = gBattleResources->bufferA[battler][1];
gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId;
gDoingBattleAnim = TRUE;
InitAndLaunchSpecialAnimation(battler, battler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW);
gBattlerControllerFuncs[battler] = CompleteOnSpecialAnimDone;
BtlController_HandleBallThrowAnim(battler, gBattlerTarget, B_ANIM_BALL_THROW, TRUE);
}
static void PlayerHandlePause(u32 battler)
@ -1796,99 +1748,10 @@ static void PlayerHandlePause(u32 battler)
PlayerBufferExecCompleted(battler);
}
static void PlayerHandleMoveAnimation(u32 battler)
{
if (!IsBattleSEPlaying(battler))
{
u16 move = gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8);
gAnimMoveTurn = gBattleResources->bufferA[battler][3];
gAnimMovePower = gBattleResources->bufferA[battler][4] | (gBattleResources->bufferA[battler][5] << 8);
gAnimMoveDmg = gBattleResources->bufferA[battler][6] | (gBattleResources->bufferA[battler][7] << 8) | (gBattleResources->bufferA[battler][8] << 16) | (gBattleResources->bufferA[battler][9] << 24);
gAnimFriendship = gBattleResources->bufferA[battler][10];
gWeatherMoveAnim = gBattleResources->bufferA[battler][12] | (gBattleResources->bufferA[battler][13] << 8);
gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[battler][16];
gTransformedPersonalities[battler] = gAnimDisableStructPtr->transformedMonPersonality;
if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // Always returns FALSE.
{
PlayerBufferExecCompleted(battler);
}
else
{
gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0;
gBattlerControllerFuncs[battler] = PlayerDoMoveAnimation;
}
}
}
static void PlayerDoMoveAnimation(u32 battler)
{
u16 move = gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8);
u8 multihit = gBattleResources->bufferA[battler][11];
switch (gBattleSpritesDataPtr->healthBoxesData[battler].animationState)
{
case 0:
if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute
&& !gBattleSpritesDataPtr->battlerData[battler].flag_x8)
{
gBattleSpritesDataPtr->battlerData[battler].flag_x8 = 1;
InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_SUBSTITUTE_TO_MON);
}
gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 1;
break;
case 1:
if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive)
{
SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF);
DoMoveAnim(move);
gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 2;
}
break;
case 2:
gAnimScriptCallback();
if (!gAnimScriptActive)
{
SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL);
if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute && multihit < 2)
{
InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE);
gBattleSpritesDataPtr->battlerData[battler].flag_x8 = 0;
}
gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 3;
}
break;
case 3:
if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive)
{
CopyAllBattleSpritesInvisibilities();
TrySetBehindSubstituteSpriteBit(battler, gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8));
gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0;
PlayerBufferExecCompleted(battler);
}
break;
}
}
static void PlayerHandlePrintString(u32 battler)
{
u16 *stringId;
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
stringId = (u16 *)(&gBattleResources->bufferA[battler][2]);
BufferStringBattle(battler, *stringId);
if (BattleStringShouldBeColored(*stringId))
BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT));
else
BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);
gBattlerControllerFuncs[battler] = CompleteOnInactiveTextPrinter2;
}
static void PlayerHandlePrintSelectionString(u32 battler)
{
if (GetBattlerSide(battler) == B_SIDE_PLAYER)
PlayerHandlePrintString(battler);
BtlController_HandlePrintString(battler);
else
PlayerBufferExecCompleted(battler);
}
@ -1908,9 +1771,8 @@ static void PlayerHandleChooseAction(u32 battler)
s32 i;
gBattlerControllerFuncs[battler] = HandleChooseActionAfterDma3;
BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG);
BattlePutTextOnWindow(gText_BattleMenu, B_WIN_ACTION_MENU);
for (i = 0; i < 4; ++i)
for (i = 0; i < 4; i++)
ActionSelectionDestroyCursorAt(i);
ActionSelectionCreateCursorAt(gActionSelectionCursor[battler], 0);
PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, battler, gBattlerPartyIndexes[battler]);
@ -1935,6 +1797,7 @@ static void HandleChooseMoveAfterDma3(u32 battler)
static void PlayerHandleChooseMove(u32 battler)
{
struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[battler][4]);
InitMoveSelectionsVarsAndStrings(battler);
gBattleStruct->mega.playerSelect = FALSE;
gBattleStruct->burst.playerSelect = FALSE;
@ -1947,11 +1810,10 @@ static void PlayerHandleChooseMove(u32 battler)
gBattleStruct->burst.triggerSpriteId = 0xFF;
if (CanUltraBurst(battler))
CreateBurstTriggerSprite(battler, 0);
// TODO: Dynamax
// if (!IsDynamaxTriggerSpriteActive())
// gBattleStruct->dynamax.triggerSpriteId = 0xFF;
// if (CanDynamax(battler))
// CreateDynamaxTriggerSprite(battler, 0);
if (!IsDynamaxTriggerSpriteActive())
gBattleStruct->dynamax.triggerSpriteId = 0xFF;
if (CanDynamax(battler))
CreateDynamaxTriggerSprite(battler, 0);
// TODO: Z-Move
// if (!IsZMoveTriggerSpriteActive())
// gBattleStruct->zmove.triggerSpriteId = 0xFF;
@ -1979,7 +1841,8 @@ static void PlayerHandleChooseItem(u32 battler)
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
gBattlerControllerFuncs[battler] = OpenBagAndChooseItem;
gBattlerInMenuId = battler;
for (i = 0; i < 3; ++i)
for (i = 0; i < ARRAY_COUNT(gBattlePartyCurrentOrder); i++)
gBattlePartyCurrentOrder[i] = gBattleResources->bufferA[battler][1 + i];
}
@ -1987,13 +1850,14 @@ static void PlayerHandleChoosePokemon(u32 battler)
{
s32 i;
for (i = 0; i < ARRAY_COUNT(gBattlePartyCurrentOrder); i++)
gBattlePartyCurrentOrder[i] = gBattleResources->bufferA[battler][4 + i];
gBattleControllerData[battler] = CreateTask(TaskDummy, 0xFF);
gTasks[gBattleControllerData[battler]].data[0] = gBattleResources->bufferA[battler][1] & 0xF;
*(&gBattleStruct->battlerPreventingSwitchout) = gBattleResources->bufferA[battler][1] >> 4;
*(&gBattleStruct->playerPartyIdx) = gBattleResources->bufferA[battler][2];
*(&gBattleStruct->abilityPreventingSwitchout) = (gBattleResources->bufferA[battler][3] & 0xFF) | (gBattleResources->bufferA[battler][7] << 8);
for (i = 0; i < 3; ++i)
gBattlePartyCurrentOrder[i] = gBattleResources->bufferA[battler][4 + i];
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
gBattlerControllerFuncs[battler] = OpenPartyMenuToChooseMon;
gBattlerInMenuId = battler;
@ -2008,31 +1872,13 @@ static void PlayerHandleCmd23(u32 battler)
static void PlayerHandleHealthBarUpdate(u32 battler)
{
s16 hpVal;
LoadBattleBarGfx(0);
hpVal = gBattleResources->bufferA[battler][2] | (gBattleResources->bufferA[battler][3] << 8);
if (hpVal != INSTANT_HP_BAR_DROP)
{
u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_MAX_HP);
u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP);
SetBattleBarStruct(battler, gHealthboxSpriteIds[battler], maxHP, curHP, hpVal);
}
else
{
u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_MAX_HP);
SetBattleBarStruct(battler, gHealthboxSpriteIds[battler], maxHP, 0, hpVal);
UpdateHpTextInHealthbox(gHealthboxSpriteIds[battler], HP_CURRENT, 0, maxHP);
}
gBattlerControllerFuncs[battler] = CompleteOnHealthbarDone;
BtlController_HandleHealthBarUpdate(battler, TRUE);
}
static void PlayerHandleExpUpdate(u32 battler)
{
u8 monId = gBattleResources->bufferA[battler][1];
s32 expPointsToGive, taskId;
s32 taskId, expPointsToGive;
if (GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL) >= MAX_LEVEL)
{
@ -2051,19 +1897,6 @@ static void PlayerHandleExpUpdate(u32 battler)
}
}
static void PlayerHandleStatusIconUpdate(u32 battler)
{
if (!IsBattleSEPlaying(battler))
{
u8 battlerId;
UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gPlayerParty[gBattlerPartyIndexes[battler]], HEALTHBOX_STATUS_ICON);
battlerId = battler;
gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = FALSE;
gBattlerControllerFuncs[battler] = CompleteOnFinishedStatusAnimation;
}
}
static void PlayerHandleStatusAnimation(u32 battler)
{
if (!IsBattleSEPlaying(battler))

View File

@ -10,10 +10,12 @@
#include "link_rfu.h"
#include "party_menu.h"
#include "pokeball.h"
#include "sound.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
#include "util.h"
#include "constants/songs.h"
#include "constants/abilities.h"
static EWRAM_DATA u8 sLinkSendTaskId = 0;
@ -1749,6 +1751,77 @@ static void Controller_ReturnMonToBall(u32 battler)
}
}
static void Controller_FaintPlayerMon(u32 battler)
{
u32 spriteId = gBattlerSpriteIds[battler];
if (gSprites[spriteId].y + gSprites[spriteId].y2 > DISPLAY_HEIGHT)
{
FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
DestroySprite(&gSprites[spriteId]);
SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]);
BattleControllerComplete(battler);
}
}
static void Controller_FaintOpponentMon(u32 battler)
{
if (!gSprites[gBattlerSpriteIds[battler]].inUse)
{
SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]);
BattleControllerComplete(battler);
}
}
static void Controller_DoMoveAnimation(u32 battler)
{
u16 move = gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8);
switch (gBattleSpritesDataPtr->healthBoxesData[battler].animationState)
{
case 0:
if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute
&& !gBattleSpritesDataPtr->battlerData[battler].flag_x8)
{
gBattleSpritesDataPtr->battlerData[battler].flag_x8 = 1;
InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_SUBSTITUTE_TO_MON);
}
gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 1;
break;
case 1:
if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive)
{
SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF);
DoMoveAnim(move);
gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 2;
}
break;
case 2:
gAnimScriptCallback();
if (!gAnimScriptActive)
{
u8 multihit = gBattleResources->bufferA[battler][11];
SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL);
if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute && multihit < 2)
{
InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE);
gBattleSpritesDataPtr->battlerData[battler].flag_x8 = 0;
}
gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 3;
}
break;
case 3:
if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive)
{
CopyAllBattleSpritesInvisibilities();
TrySetBehindSubstituteSpriteBit(battler, gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8));
gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0;
BattleControllerComplete(battler);
}
break;
}
}
static void Controller_HandleTrainerSlideBack(u32 battler)
{
if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy)
@ -1761,12 +1834,47 @@ static void Controller_HandleTrainerSlideBack(u32 battler)
}
}
void Controller_WaitForHealthBar(u32 battler)
{
s16 hpValue = MoveBattleBar(battler, gHealthboxSpriteIds[battler], HEALTH_BAR, 0);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]);
if (hpValue != -1)
{
UpdateHpTextInHealthbox(gHealthboxSpriteIds[battler], HP_CURRENT, hpValue, gBattleMons[battler].maxHP);
}
else
{
if (GetBattlerSide(battler) == B_SIDE_PLAYER)
HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[battler]], battler);
BattleControllerComplete(battler);
}
}
static void Controller_WaitForBallThrow(u32 battler)
{
if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive)
BattleControllerComplete(battler);
}
static void Controller_WaitForStatusAnimation(u32 battler)
{
if (!gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive)
BattleControllerComplete(battler);
}
static void Controller_WaitForTrainerPic(u32 battler)
{
if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy)
BattleControllerComplete(battler);
}
void Controller_WaitForString(u32 battler)
{
if (!IsTextPrinterActive(B_WIN_MSG))
BattleControllerComplete(battler);
}
// Used for all the commands which do nothing.
void BtlController_Empty(u32 battler)
{
@ -1994,5 +2102,141 @@ void BtlController_HandleTrainerSlideBack(u32 battler, s16 data0, bool32 startAn
gBattlerControllerFuncs[battler] = Controller_HandleTrainerSlideBack;
}
#define sSpeedX data[1]
#define sSpeedY data[2]
void BtlController_HandleFaintAnimation(u32 battler)
{
if (gBattleSpritesDataPtr->healthBoxesData[battler].animationState == 0)
{
if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_SUBSTITUTE_TO_MON);
gBattleSpritesDataPtr->healthBoxesData[battler].animationState++;
}
else
{
if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive)
{
gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0;
if (GetBattlerSide(battler) == B_SIDE_PLAYER)
{
HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[battler]], battler);
gSprites[gBattlerSpriteIds[battler]].sSpeedX = 0;
gSprites[gBattlerSpriteIds[battler]].sSpeedY = 5;
PlaySE12WithPanning(SE_FAINT, SOUND_PAN_ATTACKER);
gSprites[gBattlerSpriteIds[battler]].callback = SpriteCB_FaintSlideAnim;
gBattlerControllerFuncs[battler] = Controller_FaintPlayerMon;
}
else
{
PlaySE12WithPanning(SE_FAINT, SOUND_PAN_TARGET);
gSprites[gBattlerSpriteIds[battler]].callback = SpriteCB_FaintOpponentMon;
gBattlerControllerFuncs[battler] = Controller_FaintOpponentMon;
}
// The player's sprite callback just slides the mon, the opponent's removes the sprite.
// The player's sprite is removed in Controller_FaintPlayerMon. Controller_FaintOpponentMon only removes the healthbox once the sprite is removed by SpriteCB_FaintOpponentMon.
}
}
}
#undef sSpeedX
#undef sSpeedY
static void HandleBallThrow(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture)
{
gDoingBattleAnim = TRUE;
if (allowCriticalCapture && IsCriticalCapture())
animId = B_ANIM_CRITICAL_CAPTURE_THROW;
InitAndLaunchSpecialAnimation(battler, battler, target, animId);
gBattlerControllerFuncs[battler] = Controller_WaitForBallThrow;
}
void BtlController_HandleSuccessBallThrowAnim(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture)
{
gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;
HandleBallThrow(battler, target, animId, allowCriticalCapture);
}
void BtlController_HandleBallThrowAnim(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture)
{
gBattleSpritesDataPtr->animationData->ballThrowCaseId = gBattleResources->bufferA[battler][1];
HandleBallThrow(battler, target, animId, allowCriticalCapture);
}
void BtlController_HandleMoveAnimation(u32 battler)
{
if (!IsBattleSEPlaying(battler))
{
u16 move = gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8);
gAnimMoveTurn = gBattleResources->bufferA[battler][3];
gAnimMovePower = gBattleResources->bufferA[battler][4] | (gBattleResources->bufferA[battler][5] << 8);
gAnimMoveDmg = gBattleResources->bufferA[battler][6] | (gBattleResources->bufferA[battler][7] << 8) | (gBattleResources->bufferA[battler][8] << 16) | (gBattleResources->bufferA[battler][9] << 24);
gAnimFriendship = gBattleResources->bufferA[battler][10];
gWeatherMoveAnim = gBattleResources->bufferA[battler][12] | (gBattleResources->bufferA[battler][13] << 8);
gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[battler][16];
gTransformedPersonalities[battler] = gAnimDisableStructPtr->transformedMonPersonality;
gTransformedShininess[battler] = gAnimDisableStructPtr->transformedMonShininess;
gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0;
gBattlerControllerFuncs[battler] = Controller_DoMoveAnimation;
}
}
void BtlController_HandlePrintString(u32 battler)
{
u16 *stringId;
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
stringId = (u16 *)(&gBattleResources->bufferA[battler][2]);
BufferStringBattle(battler, *stringId);
BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);
gBattlerControllerFuncs[battler] = Controller_WaitForString;
}
void BtlController_HandleHealthBarUpdate(u32 battler, bool32 updateHpText)
{
s32 maxHP, curHP;
s16 hpVal;
struct Pokemon *party = GetBattlerParty(battler);
LoadBattleBarGfx(0);
hpVal = gBattleResources->bufferA[battler][2] | (gBattleResources->bufferA[battler][3] << 8);
maxHP = GetMonData(&party[gBattlerPartyIndexes[battler]], MON_DATA_MAX_HP);
curHP = GetMonData(&party[gBattlerPartyIndexes[battler]], MON_DATA_HP);
if (hpVal != INSTANT_HP_BAR_DROP)
{
SetBattleBarStruct(battler, gHealthboxSpriteIds[battler], maxHP, curHP, hpVal);
}
else
{
SetBattleBarStruct(battler, gHealthboxSpriteIds[battler], maxHP, 0, hpVal);
if (updateHpText)
UpdateHpTextInHealthbox(gHealthboxSpriteIds[battler], HP_CURRENT, 0, maxHP);
}
gBattlerControllerFuncs[battler] = Controller_WaitForHealthBar;
}
void DoStatusIconUpdate(u32 battler)
{
struct Pokemon *party = GetBattlerParty(battler);
UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &party[gBattlerPartyIndexes[battler]], HEALTHBOX_STATUS_ICON);
gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = FALSE;
gBattlerControllerFuncs[battler] = Controller_WaitForStatusAnimation;
}
void BtlController_HandleStatusIconUpdate(u32 battler)
{
if (!IsBattleSEPlaying(battler))
{
DoStatusIconUpdate(battler);
}
}

View File

@ -658,6 +658,22 @@ enum
HEALTHBAR_TYPE_OPPONENT,
};
// This function is here to cover a specific case - one player's mon in a 2 vs 1 double battle. In this scenario - display singles layout.
// The same goes for a 2 vs 1 where opponent has only one pokemon.
u32 WhichBattleCoords(u32 battlerId) // 0 - singles, 1 - doubles
{
if (GetBattlerPosition(battlerId) == B_POSITION_PLAYER_LEFT
&& gPlayerPartyCount == 1
&& !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
return 0;
else if (GetBattlerPosition(battlerId) == B_POSITION_OPPONENT_LEFT
&& gEnemyPartyCount == 1
&& !(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS))
return 0;
else
return IsDoubleBattle();
}
u8 CreateBattlerHealthboxSprites(u8 battlerId)
{
s16 healthbarType = HEALTHBAR_TYPE_PLAYER_SINGLE;

View File

@ -213,6 +213,7 @@ EWRAM_DATA u8 gBattlerStatusSummaryTaskId[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u8 gBattlerInMenuId = 0;
EWRAM_DATA bool8 gDoingBattleAnim = FALSE;
EWRAM_DATA u32 gTransformedPersonalities[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA bool8 gTransformedShininess[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u8 gPlayerDpadHoldFrames = 0;
EWRAM_DATA struct BattleSpriteData *gBattleSpritesDataPtr = NULL;
EWRAM_DATA struct MonSpritesGfx *gMonSpritesGfxPtr = NULL;
@ -4788,85 +4789,13 @@ static void HandleAction_Switch(void)
static void HandleAction_UseItem(void)
{
gBattlerAttacker = gBattlerTarget = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
ClearFuryCutterDestinyBondGrudge(gBattlerAttacker);
gLastUsedItem = gBattleResources->bufferB[gBattlerAttacker][1] | (gBattleResources->bufferB[gBattlerAttacker][2] << 8);
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) {
// change to index minus 1
DebugPrintfLevel(MGBA_LOG_ERROR, "BattleUsage: %d", ItemId_GetBattleUsage(gLastUsedItem));
gBattlescriptCurrInstr = gBattlescriptsForUsingItem[ItemId_GetBattleUsage(gLastUsedItem)];
}
// if (gLastUsedItem <= ITEM_PREMIER_BALL) // is ball
// {
// gBattlescriptCurrInstr = gBattlescriptsForBallThrow[gLastUsedItem];
// }
// else if (gLastUsedItem == ITEM_POKE_DOLL || gLastUsedItem == ITEM_FLUFFY_TAIL)
// {
// gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[0];
// }
// else if (gLastUsedItem == ITEM_POKE_FLUTE)
// {
// gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[1];
// }
// else if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
// {
// gBattlescriptCurrInstr = gBattlescriptsForUsingItem[0];
// }
else
{
gBattleScripting.battler = gBattlerAttacker;
switch (*(gBattleStruct->AI_itemType + (gBattlerAttacker >> 1)))
{
case AI_ITEM_FULL_RESTORE:
case AI_ITEM_HEAL_HP:
break;
case AI_ITEM_CURE_CONDITION:
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1)
{
if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 0x3E)
gBattleCommunication[MULTISTRING_CHOOSER] = 5;
}
else
{
while (!(*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1))
{
*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1;
gBattleCommunication[MULTISTRING_CHOOSER]++;
}
}
break;
case AI_ITEM_X_STAT:
gBattleCommunication[MULTISTRING_CHOOSER] = 4;
if (*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) & 0x80)
{
gBattleCommunication[MULTISTRING_CHOOSER] = 5;
}
else
{
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK);
PREPARE_STRING_BUFFER(gBattleTextBuff2, CHAR_X);
while (!((*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1))) & 1))
{
*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1;
++gBattleTextBuff1[2];
}
gBattleScripting.animArg1 = gBattleTextBuff1[2] + 14;
gBattleScripting.animArg2 = 0;
}
break;
case AI_ITEM_GUARD_SPECS:
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
else
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
break;
}
ClearVariousBattlerFlags(gBattlerAttacker);
gBattlescriptCurrInstr = gBattleScriptsForAIUsingItems[*(gBattleStruct->AI_itemType + gBattlerAttacker / 2) - 1];
}
gLastUsedItem = gBattleResources->bufferB[gBattlerAttacker][1] | (gBattleResources->bufferB[gBattlerAttacker][2] << 8);
gBattlescriptCurrInstr = gBattlescriptsForUsingItem[ItemId_GetBattleUsage(gLastUsedItem) - 1];
gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
}
@ -4953,7 +4882,7 @@ static void HandleAction_Run(void)
{
if (!TryRunFromBattle(gBattlerAttacker)) // failed to run away
{
ClearFuryCutterDestinyBondGrudge(gBattlerAttacker);
ClearVariousBattlerFlags(gBattlerAttacker);
gBattleCommunication[MULTISTRING_CHOOSER] = 3;
gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString;
gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;

View File

@ -27,6 +27,7 @@
#include "reshow_battle_screen.h"
#include "battle_controllers.h"
#include "battle_interface.h"
#include "rtc.h"
#include "constants/battle_anim.h"
#include "constants/battle_move_effects.h"
#include "constants/battle_script_commands.h"
@ -15206,10 +15207,9 @@ static void Cmd_handleballthrow(void)
ballMultiplier = 400;
break;
case ITEM_DUSK_BALL:
// TODO: RTC
// i = GetTimeOfDay();
// if (i == TIME_EVENING || i == TIME_NIGHT || gMapHeader.cave || gMapHeader.mapType == MAP_TYPE_UNDERGROUND)
// ballMultiplier = (B_DUSK_BALL_MODIFIER >= GEN_7 ? 300 : 350);
i = GetTimeOfDay();
if (i == TIME_EVENING || i == TIME_NIGHT || gMapHeader.cave || gMapHeader.mapType == MAP_TYPE_UNDERGROUND)
ballMultiplier = (B_DUSK_BALL_MODIFIER >= GEN_7 ? 300 : 350);
break;
case ITEM_QUICK_BALL:
if (gBattleResults.battleTurnCounter == 0)
@ -15358,7 +15358,7 @@ static void Cmd_handleballthrow(void)
gBattleSpritesDataPtr->animationData->isCriticalCapture = FALSE;
gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = FALSE;
if (CriticalCapture(odds))
if (TRUE || CriticalCapture(odds))
{
maxShakes = BALL_1_SHAKE; // critical capture doesn't guarantee capture
gBattleSpritesDataPtr->animationData->isCriticalCapture = TRUE;
@ -16472,7 +16472,7 @@ void BS_RunStatChangeItems(void)
// Change instruction before calling ItemBattleEffects.
gBattlescriptCurrInstr = cmd->nextInstr;
ItemBattleEffects(ITEMEFFECT_STATS_CHANGED, GetBattlerForBattleScript(cmd->battler), FALSE); // TODO: update
ItemBattleEffects(ITEMEFFECT_STATS_CHANGED, GetBattlerForBattleScript(cmd->battler), FALSE);
}
void BS_ItemRestorePP(void)

View File

@ -6680,11 +6680,12 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn)
return effect;
}
void ClearFuryCutterDestinyBondGrudge(u8 battlerId)
void ClearVariousBattlerFlags(u32 battler)
{
gDisableStructs[battlerId].furyCutterCounter = 0;
gBattleMons[battlerId].status2 &= ~STATUS2_DESTINY_BOND;
gStatuses3[battlerId] &= ~STATUS3_GRUDGE;
gDisableStructs[battler].furyCutterCounter = 0;
gBattleMons[battler].status2 &= ~STATUS2_DESTINY_BOND;
gStatuses3[battler] &= ~STATUS3_GRUDGE;
gStatuses4[battler] &= ~ STATUS4_GLAIVE_RUSH;
}
void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands

View File

@ -10499,24 +10499,24 @@
"encounter_rate": 21,
"mons": [
{
"min_level": 3,
"max_level": 3,
"species": "SPECIES_RATTATA"
"min_level": 6,
"max_level": 6,
"species": "SPECIES_PARAS"
},
{
"min_level": 3,
"max_level": 3,
"species": "SPECIES_MANKEY"
"min_level": 6,
"max_level": 6,
"species": "SPECIES_PARAS"
},
{
"min_level": 4,
"max_level": 4,
"species": "SPECIES_RATTATA"
"min_level": 6,
"max_level": 6,
"species": "SPECIES_PARAS"
},
{
"min_level": 4,
"max_level": 4,
"species": "SPECIES_MANKEY"
"min_level": 6,
"max_level": 6,
"species": "SPECIES_PARAS"
},
{
"min_level": 2,

View File

@ -3370,61 +3370,6 @@ void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex)
mon->ppBonuses &= gPPUpClearMask[moveIndex];
}
static void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex)
{
u16 *hpSwitchout;
s32 i;
u8 nickname[POKEMON_NAME_LENGTH * 2]; // Why is the nickname array here longer in FR/LG?
gBattleMons[battlerId].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL);
gBattleMons[battlerId].item = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM, NULL);
for (i = 0; i < MAX_MON_MOVES; i++)
{
gBattleMons[battlerId].moves[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE1 + i, NULL);
gBattleMons[battlerId].pp[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP1 + i, NULL);
}
gBattleMons[battlerId].ppBonuses = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP_BONUSES, NULL);
gBattleMons[battlerId].friendship = GetMonData(&gPlayerParty[partyIndex], MON_DATA_FRIENDSHIP, NULL);
gBattleMons[battlerId].experience = GetMonData(&gPlayerParty[partyIndex], MON_DATA_EXP, NULL);
gBattleMons[battlerId].hpIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP_IV, NULL);
gBattleMons[battlerId].attackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK_IV, NULL);
gBattleMons[battlerId].defenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF_IV, NULL);
gBattleMons[battlerId].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED_IV, NULL);
gBattleMons[battlerId].spAttackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK_IV, NULL);
gBattleMons[battlerId].spDefenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF_IV, NULL);
gBattleMons[battlerId].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY, NULL);
gBattleMons[battlerId].status1 = GetMonData(&gPlayerParty[partyIndex], MON_DATA_STATUS, NULL);
gBattleMons[battlerId].level = GetMonData(&gPlayerParty[partyIndex], MON_DATA_LEVEL, NULL);
gBattleMons[battlerId].hp = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP, NULL);
gBattleMons[battlerId].maxHP = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MAX_HP, NULL);
gBattleMons[battlerId].attack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK, NULL);
gBattleMons[battlerId].defense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF, NULL);
gBattleMons[battlerId].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED, NULL);
gBattleMons[battlerId].spAttack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK, NULL);
gBattleMons[battlerId].spDefense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF, NULL);
// gBattleMons[battlerId].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL);
gBattleMons[battlerId].abilityNum = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ABILITY_NUM, NULL);
gBattleMons[battlerId].otId = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_ID, NULL);
gBattleMons[battlerId].type1 = gSpeciesInfo[gBattleMons[battlerId].species].types[0];
gBattleMons[battlerId].type2 = gSpeciesInfo[gBattleMons[battlerId].species].types[1];
gBattleMons[battlerId].ability = GetAbilityBySpecies(gBattleMons[battlerId].species, gBattleMons[battlerId].abilityNum);
GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname);
StringCopy_Nickname(gBattleMons[battlerId].nickname, nickname);
GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[battlerId].otName);
hpSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(battlerId)];
*hpSwitchout = gBattleMons[battlerId].hp;
for (i = 0; i < NUM_BATTLE_STATS; i++)
gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE;
gBattleMons[battlerId].status2 = 0;
UpdateSentPokesToOpponentValue(battlerId);
ClearTemporarySpeciesSpriteData(battlerId, FALSE);
}
bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex)
{
return PokemonUseItemEffects(mon, item, partyIndex, moveIndex, FALSE);

View File

@ -135,3 +135,4 @@
.include "src/digit_obj_util.o"
.include "src/trainer_tower.o"
.include "src/berry_powder.o"
.include "src/battle_controller_player.o"