2017-10-24 15:25:20 +02:00
# include "global.h"
# include "battle.h"
2018-11-14 01:01:50 +01:00
# include "battle_ai_script_commands.h"
# include "battle_anim.h"
2017-10-24 15:25:20 +02:00
# include "battle_controllers.h"
# include "battle_interface.h"
2018-11-14 01:01:50 +01:00
# include "battle_message.h"
# include "battle_setup.h"
2018-12-24 00:02:29 +01:00
# include "battle_tower.h"
2018-02-27 20:40:09 +01:00
# include "battle_tv.h"
2018-11-14 01:01:50 +01:00
# include "bg.h"
2019-04-04 23:53:06 +02:00
# include "data.h"
2017-10-24 15:25:20 +02:00
# include "link.h"
# include "main.h"
# include "m4a.h"
# include "palette.h"
2018-11-14 01:01:50 +01:00
# include "pokeball.h"
# include "pokemon.h"
2019-03-05 20:07:59 +01:00
# include "recorded_battle.h"
2018-11-14 01:01:50 +01:00
# include "reshow_battle_screen.h"
# include "sound.h"
# include "string_util.h"
2017-10-24 15:25:20 +02:00
# include "task.h"
# include "text.h"
2018-11-14 01:01:50 +01:00
# include "util.h"
# include "window.h"
# include "constants/battle_anim.h"
# include "constants/songs.h"
# include "constants/trainers.h"
2019-03-02 04:32:50 +01:00
# include "recorded_battle.h"
2017-10-24 15:25:20 +02:00
2018-01-10 04:30:54 +01:00
extern struct MusicPlayerInfo gMPlayInfo_BGM ;
2017-10-24 15:25:20 +02:00
// this file's functions
static void LinkOpponentHandleGetMonData ( void ) ;
static void LinkOpponentHandleGetRawMonData ( void ) ;
static void LinkOpponentHandleSetMonData ( void ) ;
static void LinkOpponentHandleSetRawMonData ( void ) ;
static void LinkOpponentHandleLoadMonSprite ( void ) ;
static void LinkOpponentHandleSwitchInAnim ( void ) ;
static void LinkOpponentHandleReturnMonToBall ( void ) ;
static void LinkOpponentHandleDrawTrainerPic ( void ) ;
static void LinkOpponentHandleTrainerSlide ( void ) ;
static void LinkOpponentHandleTrainerSlideBack ( void ) ;
static void LinkOpponentHandleFaintAnimation ( void ) ;
static void LinkOpponentHandlePaletteFade ( void ) ;
static void LinkOpponentHandleSuccessBallThrowAnim ( void ) ;
static void LinkOpponentHandleBallThrowAnim ( void ) ;
static void LinkOpponentHandlePause ( void ) ;
static void LinkOpponentHandleMoveAnimation ( void ) ;
static void LinkOpponentHandlePrintString ( void ) ;
2017-11-25 18:42:31 +01:00
static void LinkOpponentHandlePrintSelectionString ( void ) ;
2017-10-24 15:25:20 +02:00
static void LinkOpponentHandleChooseAction ( void ) ;
static void LinkOpponentHandleUnknownYesNoBox ( void ) ;
static void LinkOpponentHandleChooseMove ( void ) ;
static void LinkOpponentHandleChooseItem ( void ) ;
static void LinkOpponentHandleChoosePokemon ( void ) ;
static void LinkOpponentHandleCmd23 ( void ) ;
static void LinkOpponentHandleHealthBarUpdate ( void ) ;
static void LinkOpponentHandleExpUpdate ( void ) ;
static void LinkOpponentHandleStatusIconUpdate ( void ) ;
static void LinkOpponentHandleStatusAnimation ( void ) ;
static void LinkOpponentHandleStatusXor ( void ) ;
static void LinkOpponentHandleDataTransfer ( void ) ;
static void LinkOpponentHandleDMA3Transfer ( void ) ;
static void LinkOpponentHandlePlayBGM ( void ) ;
static void LinkOpponentHandleCmd32 ( void ) ;
static void LinkOpponentHandleTwoReturnValues ( void ) ;
static void LinkOpponentHandleChosenMonReturnValue ( void ) ;
static void LinkOpponentHandleOneReturnValue ( void ) ;
static void LinkOpponentHandleOneReturnValue_Duplicate ( void ) ;
static void LinkOpponentHandleCmd37 ( void ) ;
static void LinkOpponentHandleCmd38 ( void ) ;
static void LinkOpponentHandleCmd39 ( void ) ;
static void LinkOpponentHandleCmd40 ( void ) ;
static void LinkOpponentHandleHitAnimation ( void ) ;
static void LinkOpponentHandleCmd42 ( void ) ;
2017-11-25 18:42:31 +01:00
static void LinkOpponentHandlePlaySE ( void ) ;
2017-10-24 15:25:20 +02:00
static void LinkOpponentHandlePlayFanfareOrBGM ( void ) ;
static void LinkOpponentHandleFaintingCry ( void ) ;
static void LinkOpponentHandleIntroSlide ( void ) ;
static void LinkOpponentHandleIntroTrainerBallThrow ( void ) ;
static void LinkOpponentHandleDrawPartyStatusSummary ( void ) ;
2018-06-28 21:06:32 +02:00
static void LinkOpponentHandleHidePartyStatusSummary ( void ) ;
2018-06-20 23:07:51 +02:00
static void LinkOpponentHandleEndBounceEffect ( void ) ;
2017-10-24 15:25:20 +02:00
static void LinkOpponentHandleSpriteInvisibility ( void ) ;
static void LinkOpponentHandleBattleAnimation ( void ) ;
static void LinkOpponentHandleLinkStandbyMsg ( void ) ;
static void LinkOpponentHandleResetActionMoveSelection ( void ) ;
static void LinkOpponentHandleCmd55 ( void ) ;
2019-03-05 20:07:59 +01:00
static void LinkOpponentCmdEnd ( void ) ;
2017-10-24 15:25:20 +02:00
static void LinkOpponentBufferRunCommand ( void ) ;
static void LinkOpponentBufferExecCompleted ( void ) ;
static void sub_8064DD0 ( void ) ;
static u32 CopyLinkOpponentMonData ( u8 monId , u8 * dst ) ;
static void SetLinkOpponentMonData ( u8 monId ) ;
2018-03-01 00:59:52 +01:00
static void sub_8066494 ( u8 battlerId , bool8 dontClearSubstituteBit ) ;
2017-10-24 15:25:20 +02:00
static void DoSwitchOutAnimation ( void ) ;
static void LinkOpponentDoMoveAnimation ( void ) ;
static void sub_8067618 ( u8 taskId ) ;
static void sub_80676FC ( struct Sprite * sprite ) ;
static void sub_806782C ( void ) ;
2017-10-31 18:04:08 +01:00
static void ( * const sLinkOpponentBufferCommands [ CONTROLLER_CMDS_COUNT ] ) ( void ) =
2017-10-24 15:25:20 +02:00
{
LinkOpponentHandleGetMonData ,
LinkOpponentHandleGetRawMonData ,
LinkOpponentHandleSetMonData ,
LinkOpponentHandleSetRawMonData ,
LinkOpponentHandleLoadMonSprite ,
LinkOpponentHandleSwitchInAnim ,
LinkOpponentHandleReturnMonToBall ,
LinkOpponentHandleDrawTrainerPic ,
LinkOpponentHandleTrainerSlide ,
LinkOpponentHandleTrainerSlideBack ,
LinkOpponentHandleFaintAnimation ,
LinkOpponentHandlePaletteFade ,
LinkOpponentHandleSuccessBallThrowAnim ,
LinkOpponentHandleBallThrowAnim ,
LinkOpponentHandlePause ,
LinkOpponentHandleMoveAnimation ,
LinkOpponentHandlePrintString ,
2017-11-25 18:42:31 +01:00
LinkOpponentHandlePrintSelectionString ,
2017-10-24 15:25:20 +02:00
LinkOpponentHandleChooseAction ,
LinkOpponentHandleUnknownYesNoBox ,
LinkOpponentHandleChooseMove ,
LinkOpponentHandleChooseItem ,
LinkOpponentHandleChoosePokemon ,
LinkOpponentHandleCmd23 ,
LinkOpponentHandleHealthBarUpdate ,
LinkOpponentHandleExpUpdate ,
LinkOpponentHandleStatusIconUpdate ,
LinkOpponentHandleStatusAnimation ,
LinkOpponentHandleStatusXor ,
LinkOpponentHandleDataTransfer ,
LinkOpponentHandleDMA3Transfer ,
LinkOpponentHandlePlayBGM ,
LinkOpponentHandleCmd32 ,
LinkOpponentHandleTwoReturnValues ,
LinkOpponentHandleChosenMonReturnValue ,
LinkOpponentHandleOneReturnValue ,
LinkOpponentHandleOneReturnValue_Duplicate ,
LinkOpponentHandleCmd37 ,
LinkOpponentHandleCmd38 ,
LinkOpponentHandleCmd39 ,
LinkOpponentHandleCmd40 ,
LinkOpponentHandleHitAnimation ,
LinkOpponentHandleCmd42 ,
2017-11-25 18:42:31 +01:00
LinkOpponentHandlePlaySE ,
2017-10-24 15:25:20 +02:00
LinkOpponentHandlePlayFanfareOrBGM ,
LinkOpponentHandleFaintingCry ,
LinkOpponentHandleIntroSlide ,
LinkOpponentHandleIntroTrainerBallThrow ,
LinkOpponentHandleDrawPartyStatusSummary ,
2018-06-28 21:06:32 +02:00
LinkOpponentHandleHidePartyStatusSummary ,
2018-06-20 23:07:51 +02:00
LinkOpponentHandleEndBounceEffect ,
2017-10-24 15:25:20 +02:00
LinkOpponentHandleSpriteInvisibility ,
LinkOpponentHandleBattleAnimation ,
LinkOpponentHandleLinkStandbyMsg ,
LinkOpponentHandleResetActionMoveSelection ,
LinkOpponentHandleCmd55 ,
2019-03-05 20:07:59 +01:00
LinkOpponentCmdEnd
2017-10-24 15:25:20 +02:00
} ;
static void nullsub_28 ( void )
{
}
2017-10-26 23:12:48 +02:00
void SetControllerToLinkOpponent ( void )
2017-10-24 15:25:20 +02:00
{
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = LinkOpponentBufferRunCommand ;
2017-10-24 15:25:20 +02:00
}
static void LinkOpponentBufferRunCommand ( void )
{
2018-02-06 20:48:02 +01:00
if ( gBattleControllerExecFlags & gBitTable [ gActiveBattler ] )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
if ( gBattleBufferA [ gActiveBattler ] [ 0 ] < ARRAY_COUNT ( sLinkOpponentBufferCommands ) )
sLinkOpponentBufferCommands [ gBattleBufferA [ gActiveBattler ] [ 0 ] ] ( ) ;
2017-10-24 15:25:20 +02:00
else
LinkOpponentBufferExecCompleted ( ) ;
}
}
2018-07-01 15:28:57 +02:00
static void CompleteOnBattlerSpriteCallbackDummy ( void )
2017-10-24 15:25:20 +02:00
{
2018-02-06 20:48:02 +01:00
if ( gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . callback = = SpriteCallbackDummy )
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
static void CompleteOnBankSpriteCallbackDummy2 ( void )
{
2018-02-06 20:48:02 +01:00
if ( gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . callback = = SpriteCallbackDummy )
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
static void sub_8064470 ( void )
{
2018-02-06 20:48:02 +01:00
if ( gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . callback = = SpriteCallbackDummy )
2017-10-24 15:25:20 +02:00
{
2018-02-06 20:48:02 +01:00
FreeTrainerFrontPicPalette ( gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . oam . affineParam ) ;
FreeSpriteOamMatrix ( & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] ) ;
DestroySprite ( & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] ) ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
}
static void sub_80644D8 ( void )
{
2018-02-06 02:46:59 +01:00
if ( - - gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_9 = = 0xFF )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_9 = 0 ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
}
static void sub_8064520 ( void )
{
bool32 r8 = FALSE ;
bool32 r4 = FALSE ;
if ( ! IsDoubleBattle ( ) | | ( IsDoubleBattle ( ) & & ( gBattleTypeFlags & BATTLE_TYPE_MULTI ) ) )
{
2018-02-06 20:48:02 +01:00
if ( gSprites [ gHealthboxSpriteIds [ gActiveBattler ] ] . callback = = SpriteCallbackDummy )
2017-10-24 15:25:20 +02:00
r8 = TRUE ;
}
else
{
2018-02-06 20:48:02 +01:00
if ( gSprites [ gHealthboxSpriteIds [ gActiveBattler ] ] . callback = = SpriteCallbackDummy
2018-02-06 23:09:39 +01:00
& & gSprites [ gHealthboxSpriteIds [ BATTLE_PARTNER ( gActiveBattler ) ] ] . callback = = SpriteCallbackDummy )
2017-10-24 15:25:20 +02:00
{
r8 = TRUE ;
}
r4 = TRUE ;
}
if ( r8 )
{
2018-02-06 23:09:39 +01:00
if ( r4 | | ! IsBattlerSpriteVisible ( BATTLE_PARTNER ( gActiveBattler ) ) )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x1 )
2017-10-24 15:25:20 +02:00
return ;
2018-02-06 23:09:39 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ BATTLE_PARTNER ( gActiveBattler ) ] . field_1_x1 )
2017-10-24 15:25:20 +02:00
return ;
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . flag_x80 = 0 ;
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x1 = 0 ;
2017-10-24 15:25:20 +02:00
2018-02-06 23:09:39 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ BATTLE_PARTNER ( gActiveBattler ) ] . flag_x80 = 0 ;
gBattleSpritesDataPtr - > healthBoxesData [ BATTLE_PARTNER ( gActiveBattler ) ] . field_1_x1 = 0 ;
2017-10-24 15:25:20 +02:00
FreeSpriteTilesByTag ( 0x27F9 ) ;
FreeSpritePaletteByTag ( 0x27F9 ) ;
}
else
{
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x1 )
2017-10-24 15:25:20 +02:00
return ;
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . flag_x80 = 0 ;
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x1 = 0 ;
2017-10-24 15:25:20 +02:00
2018-02-06 02:46:59 +01:00
if ( GetBattlerPosition ( gActiveBattler ) = = B_POSITION_OPPONENT_RIGHT )
2017-10-24 15:25:20 +02:00
{
FreeSpriteTilesByTag ( 0x27F9 ) ;
FreeSpritePaletteByTag ( 0x27F9 ) ;
}
}
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_9 = 3 ;
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = sub_80644D8 ;
2017-10-24 15:25:20 +02:00
}
}
static void sub_8064734 ( void )
{
bool32 r10 = FALSE ;
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . ballAnimActive
& & ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . flag_x80
& & ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x1 )
2017-10-24 15:25:20 +02:00
{
2018-02-06 20:48:02 +01:00
sub_8172EF0 ( gActiveBattler , & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] ) ;
2017-10-24 15:25:20 +02:00
}
if ( ! ( gBattleTypeFlags & BATTLE_TYPE_MULTI )
2018-02-06 23:09:39 +01:00
& & ! gBattleSpritesDataPtr - > healthBoxesData [ BATTLE_PARTNER ( gActiveBattler ) ] . ballAnimActive
& & ! gBattleSpritesDataPtr - > healthBoxesData [ BATTLE_PARTNER ( gActiveBattler ) ] . flag_x80
& & ! gBattleSpritesDataPtr - > healthBoxesData [ BATTLE_PARTNER ( gActiveBattler ) ] . field_1_x1 )
2017-10-24 15:25:20 +02:00
{
2018-02-06 23:09:39 +01:00
sub_8172EF0 ( BATTLE_PARTNER ( gActiveBattler ) , & gEnemyParty [ gBattlerPartyIndexes [ BATTLE_PARTNER ( gActiveBattler ) ] ] ) ;
2017-10-24 15:25:20 +02:00
}
2018-02-06 23:09:39 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . ballAnimActive & & ! gBattleSpritesDataPtr - > healthBoxesData [ BATTLE_PARTNER ( gActiveBattler ) ] . ballAnimActive )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x80 )
2017-10-24 15:25:20 +02:00
{
if ( IsDoubleBattle ( ) & & ! ( gBattleTypeFlags & BATTLE_TYPE_MULTI ) )
{
2018-02-06 23:09:39 +01:00
UpdateHealthboxAttribute ( gHealthboxSpriteIds [ BATTLE_PARTNER ( gActiveBattler ) ] , & gEnemyParty [ gBattlerPartyIndexes [ BATTLE_PARTNER ( gActiveBattler ) ] ] , HEALTHBOX_ALL ) ;
sub_8076918 ( BATTLE_PARTNER ( gActiveBattler ) ) ;
SetHealthboxSpriteVisible ( gHealthboxSpriteIds [ BATTLE_PARTNER ( gActiveBattler ) ] ) ;
2017-10-24 15:25:20 +02:00
}
2018-02-06 20:48:02 +01:00
UpdateHealthboxAttribute ( gHealthboxSpriteIds [ gActiveBattler ] , & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] , HEALTHBOX_ALL ) ;
2018-02-06 02:46:59 +01:00
sub_8076918 ( gActiveBattler ) ;
2018-02-06 20:48:02 +01:00
SetHealthboxSpriteVisible ( gHealthboxSpriteIds [ gActiveBattler ] ) ;
2017-10-24 15:25:20 +02:00
}
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x80 = 1 ;
2017-10-24 15:25:20 +02:00
}
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x40
& & gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x80
2018-02-06 23:09:39 +01:00
& & ! gBattleSpritesDataPtr - > healthBoxesData [ BATTLE_PARTNER ( gActiveBattler ) ] . field_1_x40
2017-10-24 15:25:20 +02:00
& & ! IsCryPlayingOrClearCrySongs ( ) )
{
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x20 )
2017-10-24 15:25:20 +02:00
{
if ( gBattleTypeFlags & BATTLE_TYPE_MULTI & & gBattleTypeFlags & BATTLE_TYPE_LINK )
{
2018-02-06 02:46:59 +01:00
if ( GetBattlerPosition ( gActiveBattler ) = = B_POSITION_OPPONENT_LEFT )
2018-01-10 04:30:54 +01:00
m4aMPlayContinue ( & gMPlayInfo_BGM ) ;
2017-10-24 15:25:20 +02:00
}
else
{
2018-01-10 04:30:54 +01:00
m4aMPlayVolumeControl ( & gMPlayInfo_BGM , 0xFFFF , 0x100 ) ;
2017-10-24 15:25:20 +02:00
}
}
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x20 = 1 ;
2017-10-24 15:25:20 +02:00
r10 = TRUE ;
}
if ( r10 )
{
2018-02-06 02:46:59 +01:00
if ( gSprites [ gUnknown_03005D7C [ gActiveBattler ] ] . callback = = SpriteCallbackDummy
2018-02-06 20:48:02 +01:00
& & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . callback = = SpriteCallbackDummy )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
if ( gBattleTypeFlags & BATTLE_TYPE_MULTI & & GetBattlerPosition ( gActiveBattler ) = = B_POSITION_OPPONENT_RIGHT )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
if ( + + gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_9 = = 1 )
2017-10-24 15:25:20 +02:00
return ;
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_9 = 0 ;
2017-10-24 15:25:20 +02:00
}
if ( IsDoubleBattle ( ) & & ! ( gBattleTypeFlags & BATTLE_TYPE_MULTI ) )
{
2018-02-06 23:09:39 +01:00
DestroySprite ( & gSprites [ gUnknown_03005D7C [ BATTLE_PARTNER ( gActiveBattler ) ] ] ) ;
SetBattlerShadowSpriteCallback ( BATTLE_PARTNER ( gActiveBattler ) , GetMonData ( & gEnemyParty [ gBattlerPartyIndexes [ BATTLE_PARTNER ( gActiveBattler ) ] ] , MON_DATA_SPECIES ) ) ;
2017-10-24 15:25:20 +02:00
}
2018-02-06 02:46:59 +01:00
DestroySprite ( & gSprites [ gUnknown_03005D7C [ gActiveBattler ] ] ) ;
2018-02-06 20:48:02 +01:00
SetBattlerShadowSpriteCallback ( gActiveBattler , GetMonData ( & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] , MON_DATA_SPECIES ) ) ;
2017-10-24 15:25:20 +02:00
gBattleSpritesDataPtr - > animationData - > field_9_x1 = 0 ;
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x20 = 0 ;
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x80 = 0 ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = sub_8064520 ;
2017-10-24 15:25:20 +02:00
}
}
}
static void sub_8064B04 ( void )
{
2018-02-06 20:48:02 +01:00
if ( gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . callback = = SpriteCallbackDummy
& & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . pos2 . x = = 0 )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . flag_x80 )
2017-10-24 15:25:20 +02:00
{
2018-02-06 20:48:02 +01:00
sub_8172EF0 ( gActiveBattler , & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] ) ;
2017-10-24 15:25:20 +02:00
}
else
{
2018-02-06 02:46:59 +01:00
if ( gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x1 )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . flag_x80 = 0 ;
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x1 = 0 ;
2017-10-24 15:25:20 +02:00
FreeSpriteTilesByTag ( 0x27F9 ) ;
FreeSpritePaletteByTag ( 0x27F9 ) ;
LinkOpponentBufferExecCompleted ( ) ;
}
}
}
}
static void CompleteOnHealthbarDone ( void )
{
2018-06-19 00:43:15 +02:00
s16 hpValue = MoveBattleBar ( gActiveBattler , gHealthboxSpriteIds [ gActiveBattler ] , HEALTH_BAR , 0 ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
SetHealthboxSpriteVisible ( gHealthboxSpriteIds [ gActiveBattler ] ) ;
2017-10-24 15:25:20 +02:00
if ( hpValue ! = - 1 )
{
2018-02-06 20:48:02 +01:00
UpdateHpTextInHealthbox ( gHealthboxSpriteIds [ gActiveBattler ] , hpValue , HP_CURRENT ) ;
2017-10-24 15:25:20 +02:00
}
else
{
LinkOpponentBufferExecCompleted ( ) ;
}
}
static void sub_8064C14 ( void )
{
2018-02-06 20:48:02 +01:00
if ( ! gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . inUse )
2017-10-24 15:25:20 +02:00
{
2018-02-06 20:48:02 +01:00
SetHealthboxSpriteInvisible ( gHealthboxSpriteIds [ gActiveBattler ] ) ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
}
static void sub_8064C58 ( void )
{
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . specialAnimActive )
2017-10-24 15:25:20 +02:00
{
2018-02-06 20:48:02 +01:00
FreeSpriteOamMatrix ( & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] ) ;
DestroySprite ( & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] ) ;
HideBattlerShadowSprite ( gActiveBattler ) ;
SetHealthboxSpriteInvisible ( gHealthboxSpriteIds [ gActiveBattler ] ) ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
}
static void CompleteOnInactiveTextPrinter ( void )
{
if ( ! IsTextPrinterActive ( 0 ) )
LinkOpponentBufferExecCompleted ( ) ;
}
static void DoHitAnimBlinkSpriteEffect ( void )
{
2018-02-06 20:48:02 +01:00
u8 spriteId = gBattlerSpriteIds [ gActiveBattler ] ;
2017-10-24 15:25:20 +02:00
2017-12-02 21:44:50 +01:00
if ( gSprites [ spriteId ] . data [ 1 ] = = 32 )
2017-10-24 15:25:20 +02:00
{
2017-12-02 21:44:50 +01:00
gSprites [ spriteId ] . data [ 1 ] = 0 ;
2018-09-10 17:25:58 +02:00
gSprites [ spriteId ] . invisible = FALSE ;
2017-10-24 15:25:20 +02:00
gDoingBattleAnim = FALSE ;
LinkOpponentBufferExecCompleted ( ) ;
}
else
{
2017-12-02 21:44:50 +01:00
if ( ( gSprites [ spriteId ] . data [ 1 ] % 4 ) = = 0 )
2017-10-24 15:25:20 +02:00
gSprites [ spriteId ] . invisible ^ = 1 ;
2017-12-02 21:44:50 +01:00
gSprites [ spriteId ] . data [ 1 ] + + ;
2017-10-24 15:25:20 +02:00
}
}
static void sub_8064D60 ( void )
{
2018-02-06 20:48:02 +01:00
if ( gSprites [ gHealthboxSpriteIds [ gActiveBattler ] ] . callback = = SpriteCallbackDummy )
2017-10-24 15:25:20 +02:00
{
2018-02-06 23:09:39 +01:00
if ( gBattleSpritesDataPtr - > battlerData [ gActiveBattler ] . behindSubstitute )
2018-02-06 02:46:59 +01:00
InitAndLaunchSpecialAnimation ( gActiveBattler , gActiveBattler , gActiveBattler , B_ANIM_MON_TO_SUBSTITUTE ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = sub_8064DD0 ;
2017-10-24 15:25:20 +02:00
}
}
static void sub_8064DD0 ( void )
{
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . specialAnimActive & & ! IsCryPlayingOrClearCrySongs ( ) )
2017-10-24 15:25:20 +02:00
{
2018-02-06 20:48:02 +01:00
if ( gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . callback = = SpriteCallbackDummy
| | gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . callback = = SpriteCallbackDummy_2 )
2017-10-24 15:25:20 +02:00
{
2018-01-10 04:30:54 +01:00
m4aMPlayVolumeControl ( & gMPlayInfo_BGM , 0xFFFF , 0x100 ) ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
}
}
static void sub_8064E50 ( void )
{
2018-02-06 02:46:59 +01:00
if ( gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x1
2018-02-06 20:48:02 +01:00
& & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . callback = = SpriteCallbackDummy )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . flag_x80 = 0 ;
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x1 = 0 ;
2017-10-24 15:25:20 +02:00
FreeSpriteTilesByTag ( 0x27F9 ) ;
FreeSpritePaletteByTag ( 0x27F9 ) ;
2018-02-06 20:48:02 +01:00
StartSpriteAnim ( & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] , 0 ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
UpdateHealthboxAttribute ( gHealthboxSpriteIds [ gActiveBattler ] , & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] , HEALTHBOX_ALL ) ;
2018-02-06 02:46:59 +01:00
sub_8076918 ( gActiveBattler ) ;
2018-02-06 20:48:02 +01:00
SetHealthboxSpriteVisible ( gHealthboxSpriteIds [ gActiveBattler ] ) ;
2018-02-06 02:46:59 +01:00
CopyBattleSpriteInvisibility ( gActiveBattler ) ;
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = sub_8064D60 ;
2017-10-24 15:25:20 +02:00
}
}
static void sub_8064F40 ( void )
{
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . ballAnimActive
& & ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . flag_x80 )
2017-10-24 15:25:20 +02:00
{
2018-02-06 20:48:02 +01:00
sub_8172EF0 ( gActiveBattler , & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] ) ;
2017-10-24 15:25:20 +02:00
}
2018-02-06 02:46:59 +01:00
if ( gSprites [ gUnknown_03005D7C [ gActiveBattler ] ] . callback = = SpriteCallbackDummy
& & ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . ballAnimActive )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
DestroySprite ( & gSprites [ gUnknown_03005D7C [ gActiveBattler ] ] ) ;
2018-02-06 20:48:02 +01:00
SetBattlerShadowSpriteCallback ( gActiveBattler , GetMonData ( & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] , MON_DATA_SPECIES ) ) ;
gBattlerControllerFuncs [ gActiveBattler ] = sub_8064E50 ;
2017-10-24 15:25:20 +02:00
}
}
static void CompleteOnFinishedStatusAnimation ( void )
{
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . statusAnimActive )
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
static void CompleteOnFinishedBattleAnimation ( void )
{
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . animFromTableActive )
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentBufferExecCompleted ( void )
{
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = LinkOpponentBufferRunCommand ;
2017-10-24 15:25:20 +02:00
if ( gBattleTypeFlags & BATTLE_TYPE_LINK )
{
u8 playerId = GetMultiplayerId ( ) ;
PrepareBufferDataTransferLink ( 2 , 4 , & playerId ) ;
2018-02-06 02:46:59 +01:00
gBattleBufferA [ gActiveBattler ] [ 0 ] = CONTROLLER_TERMINATOR_NOP ;
2017-10-24 15:25:20 +02:00
}
else
{
2018-02-06 20:48:02 +01:00
gBattleControllerExecFlags & = ~ gBitTable [ gActiveBattler ] ;
2017-10-24 15:25:20 +02:00
}
}
static void LinkOpponentHandleGetMonData ( void )
{
u8 monData [ sizeof ( struct Pokemon ) * 2 + 56 ] ; // this allows to get full data of two pokemon, trying to get more will result in overwriting data
u32 size = 0 ;
2017-10-31 18:04:08 +01:00
u8 monToCheck ;
2017-10-24 15:25:20 +02:00
s32 i ;
2018-02-06 02:46:59 +01:00
if ( gBattleBufferA [ gActiveBattler ] [ 2 ] = = 0 )
2017-10-24 15:25:20 +02:00
{
2018-02-06 20:48:02 +01:00
size + = CopyLinkOpponentMonData ( gBattlerPartyIndexes [ gActiveBattler ] , monData ) ;
2017-10-24 15:25:20 +02:00
}
else
{
2018-02-06 02:46:59 +01:00
monToCheck = gBattleBufferA [ gActiveBattler ] [ 2 ] ;
2018-11-18 20:00:36 +01:00
for ( i = 0 ; i < PARTY_SIZE ; i + + )
2017-10-24 15:25:20 +02:00
{
2017-10-31 18:04:08 +01:00
if ( monToCheck & 1 )
2017-10-24 15:25:20 +02:00
size + = CopyLinkOpponentMonData ( i , monData + size ) ;
2017-10-31 18:04:08 +01:00
monToCheck > > = 1 ;
2017-10-24 15:25:20 +02:00
}
}
2018-02-06 20:48:02 +01:00
BtlController_EmitDataTransfer ( 1 , size , monData ) ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
static u32 CopyLinkOpponentMonData ( u8 monId , u8 * dst )
{
struct BattlePokemon battleMon ;
struct MovePpInfo moveData ;
u8 nickname [ 20 ] ;
u8 * src ;
s16 data16 ;
u32 data32 ;
s32 size = 0 ;
2018-02-06 02:46:59 +01:00
switch ( gBattleBufferA [ gActiveBattler ] [ 1 ] )
2017-10-24 15:25:20 +02:00
{
case REQUEST_ALL_BATTLE :
battleMon . species = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPECIES ) ;
battleMon . item = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_HELD_ITEM ) ;
2018-12-25 18:50:15 +01:00
for ( size = 0 ; size < MAX_MON_MOVES ; size + + )
2017-10-24 15:25:20 +02:00
{
battleMon . moves [ size ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_MOVE1 + size ) ;
battleMon . pp [ size ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP1 + size ) ;
}
battleMon . ppBonuses = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP_BONUSES ) ;
battleMon . friendship = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_FRIENDSHIP ) ;
battleMon . experience = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_EXP ) ;
battleMon . hpIV = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_HP_IV ) ;
battleMon . attackIV = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_ATK_IV ) ;
battleMon . defenseIV = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_DEF_IV ) ;
2017-10-24 15:35:36 +02:00
battleMon . speedIV = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPEED_IV ) ;
2017-10-24 15:25:20 +02:00
battleMon . spAttackIV = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPATK_IV ) ;
battleMon . spDefenseIV = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPDEF_IV ) ;
battleMon . personality = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_PERSONALITY ) ;
battleMon . status1 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_STATUS ) ;
battleMon . level = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_LEVEL ) ;
battleMon . hp = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_HP ) ;
battleMon . maxHP = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_MAX_HP ) ;
battleMon . attack = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_ATK ) ;
battleMon . defense = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_DEF ) ;
2017-10-24 15:35:36 +02:00
battleMon . speed = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPEED ) ;
2017-10-24 15:25:20 +02:00
battleMon . spAttack = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPATK ) ;
battleMon . spDefense = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPDEF ) ;
battleMon . isEgg = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_IS_EGG ) ;
2019-05-14 15:22:16 +02:00
battleMon . abilityNum = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_ABILITY_NUM ) ;
2017-10-24 15:25:20 +02:00
battleMon . otId = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_OT_ID ) ;
GetMonData ( & gEnemyParty [ monId ] , MON_DATA_NICKNAME , nickname ) ;
StringCopy10 ( battleMon . nickname , nickname ) ;
GetMonData ( & gEnemyParty [ monId ] , MON_DATA_OT_NAME , battleMon . otName ) ;
src = ( u8 * ) & battleMon ;
for ( size = 0 ; size < sizeof ( battleMon ) ; size + + )
dst [ size ] = src [ size ] ;
break ;
case REQUEST_SPECIES_BATTLE :
data16 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPECIES ) ;
dst [ 0 ] = data16 ;
dst [ 1 ] = data16 > > 8 ;
size = 2 ;
break ;
case REQUEST_HELDITEM_BATTLE :
data16 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_HELD_ITEM ) ;
dst [ 0 ] = data16 ;
dst [ 1 ] = data16 > > 8 ;
size = 2 ;
break ;
case REQUEST_MOVES_PP_BATTLE :
2018-12-25 18:50:15 +01:00
for ( size = 0 ; size < MAX_MON_MOVES ; size + + )
2017-10-24 15:25:20 +02:00
{
moveData . moves [ size ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_MOVE1 + size ) ;
moveData . pp [ size ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP1 + size ) ;
}
moveData . ppBonuses = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP_BONUSES ) ;
src = ( u8 * ) ( & moveData ) ;
for ( size = 0 ; size < sizeof ( moveData ) ; size + + )
dst [ size ] = src [ size ] ;
break ;
case REQUEST_MOVE1_BATTLE :
case REQUEST_MOVE2_BATTLE :
case REQUEST_MOVE3_BATTLE :
case REQUEST_MOVE4_BATTLE :
2018-02-06 02:46:59 +01:00
data16 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_MOVE1 + gBattleBufferA [ gActiveBattler ] [ 1 ] - REQUEST_MOVE1_BATTLE ) ;
2017-10-24 15:25:20 +02:00
dst [ 0 ] = data16 ;
dst [ 1 ] = data16 > > 8 ;
size = 2 ;
break ;
case REQUEST_PP_DATA_BATTLE :
2018-12-25 18:50:15 +01:00
for ( size = 0 ; size < MAX_MON_MOVES ; size + + )
2017-10-24 15:25:20 +02:00
dst [ size ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP1 + size ) ;
dst [ size ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP_BONUSES ) ;
size + + ;
break ;
case REQUEST_PPMOVE1_BATTLE :
case REQUEST_PPMOVE2_BATTLE :
case REQUEST_PPMOVE3_BATTLE :
case REQUEST_PPMOVE4_BATTLE :
2018-02-06 02:46:59 +01:00
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP1 + gBattleBufferA [ gActiveBattler ] [ 1 ] - REQUEST_PPMOVE1_BATTLE ) ;
2017-10-24 15:25:20 +02:00
size = 1 ;
break ;
case REQUEST_OTID_BATTLE :
data32 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_OT_ID ) ;
dst [ 0 ] = ( data32 & 0x000000FF ) ;
dst [ 1 ] = ( data32 & 0x0000FF00 ) > > 8 ;
dst [ 2 ] = ( data32 & 0x00FF0000 ) > > 16 ;
size = 3 ;
break ;
case REQUEST_EXP_BATTLE :
data32 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_EXP ) ;
dst [ 0 ] = ( data32 & 0x000000FF ) ;
dst [ 1 ] = ( data32 & 0x0000FF00 ) > > 8 ;
dst [ 2 ] = ( data32 & 0x00FF0000 ) > > 16 ;
size = 3 ;
break ;
case REQUEST_HP_EV_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_HP_EV ) ;
size = 1 ;
break ;
case REQUEST_ATK_EV_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_ATK_EV ) ;
size = 1 ;
break ;
case REQUEST_DEF_EV_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_DEF_EV ) ;
size = 1 ;
break ;
case REQUEST_SPEED_EV_BATTLE :
2017-10-24 15:35:36 +02:00
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPEED_EV ) ;
2017-10-24 15:25:20 +02:00
size = 1 ;
break ;
case REQUEST_SPATK_EV_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPATK_EV ) ;
size = 1 ;
break ;
case REQUEST_SPDEF_EV_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPDEF_EV ) ;
size = 1 ;
break ;
case REQUEST_FRIENDSHIP_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_FRIENDSHIP ) ;
size = 1 ;
break ;
case REQUEST_POKERUS_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_POKERUS ) ;
size = 1 ;
break ;
case REQUEST_MET_LOCATION_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_MET_LOCATION ) ;
size = 1 ;
break ;
case REQUEST_MET_LEVEL_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_MET_LEVEL ) ;
size = 1 ;
break ;
case REQUEST_MET_GAME_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_MET_GAME ) ;
size = 1 ;
break ;
case REQUEST_POKEBALL_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_POKEBALL ) ;
size = 1 ;
break ;
case REQUEST_ALL_IVS_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_HP_IV ) ;
dst [ 1 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_ATK_IV ) ;
dst [ 2 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_DEF_IV ) ;
2017-10-24 15:35:36 +02:00
dst [ 3 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPEED_IV ) ;
2017-10-24 15:25:20 +02:00
dst [ 4 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPATK_IV ) ;
dst [ 5 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPDEF_IV ) ;
size = 6 ;
break ;
case REQUEST_HP_IV_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_HP_IV ) ;
size = 1 ;
break ;
case REQUEST_ATK_IV_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_ATK_IV ) ;
size = 1 ;
break ;
case REQUEST_DEF_IV_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_DEF_IV ) ;
size = 1 ;
break ;
case REQUEST_SPEED_IV_BATTLE :
2017-10-24 15:35:36 +02:00
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPEED_IV ) ;
2017-10-24 15:25:20 +02:00
size = 1 ;
break ;
case REQUEST_SPATK_IV_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPATK_IV ) ;
size = 1 ;
break ;
case REQUEST_SPDEF_IV_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPDEF_IV ) ;
size = 1 ;
break ;
case REQUEST_PERSONALITY_BATTLE :
data32 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_PERSONALITY ) ;
dst [ 0 ] = ( data32 & 0x000000FF ) ;
dst [ 1 ] = ( data32 & 0x0000FF00 ) > > 8 ;
dst [ 2 ] = ( data32 & 0x00FF0000 ) > > 16 ;
dst [ 3 ] = ( data32 & 0xFF000000 ) > > 24 ;
size = 4 ;
break ;
case REQUEST_CHECKSUM_BATTLE :
data16 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_CHECKSUM ) ;
dst [ 0 ] = data16 ;
dst [ 1 ] = data16 > > 8 ;
size = 2 ;
break ;
case REQUEST_STATUS_BATTLE :
data32 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_STATUS ) ;
dst [ 0 ] = ( data32 & 0x000000FF ) ;
dst [ 1 ] = ( data32 & 0x0000FF00 ) > > 8 ;
dst [ 2 ] = ( data32 & 0x00FF0000 ) > > 16 ;
dst [ 3 ] = ( data32 & 0xFF000000 ) > > 24 ;
size = 4 ;
break ;
case REQUEST_LEVEL_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_LEVEL ) ;
size = 1 ;
break ;
case REQUEST_HP_BATTLE :
data16 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_HP ) ;
dst [ 0 ] = data16 ;
dst [ 1 ] = data16 > > 8 ;
size = 2 ;
break ;
case REQUEST_MAX_HP_BATTLE :
data16 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_MAX_HP ) ;
dst [ 0 ] = data16 ;
dst [ 1 ] = data16 > > 8 ;
size = 2 ;
break ;
case REQUEST_ATK_BATTLE :
data16 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_ATK ) ;
dst [ 0 ] = data16 ;
dst [ 1 ] = data16 > > 8 ;
size = 2 ;
break ;
case REQUEST_DEF_BATTLE :
data16 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_DEF ) ;
dst [ 0 ] = data16 ;
dst [ 1 ] = data16 > > 8 ;
size = 2 ;
break ;
case REQUEST_SPEED_BATTLE :
2017-10-24 15:35:36 +02:00
data16 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPEED ) ;
2017-10-24 15:25:20 +02:00
dst [ 0 ] = data16 ;
dst [ 1 ] = data16 > > 8 ;
size = 2 ;
break ;
case REQUEST_SPATK_BATTLE :
data16 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPATK ) ;
dst [ 0 ] = data16 ;
dst [ 1 ] = data16 > > 8 ;
size = 2 ;
break ;
case REQUEST_SPDEF_BATTLE :
data16 = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPDEF ) ;
dst [ 0 ] = data16 ;
dst [ 1 ] = data16 > > 8 ;
size = 2 ;
break ;
case REQUEST_COOL_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_COOL ) ;
size = 1 ;
break ;
case REQUEST_BEAUTY_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_BEAUTY ) ;
size = 1 ;
break ;
case REQUEST_CUTE_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_CUTE ) ;
size = 1 ;
break ;
case REQUEST_SMART_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SMART ) ;
size = 1 ;
break ;
case REQUEST_TOUGH_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_TOUGH ) ;
size = 1 ;
break ;
case REQUEST_SHEEN_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SHEEN ) ;
size = 1 ;
break ;
case REQUEST_COOL_RIBBON_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_COOL_RIBBON ) ;
size = 1 ;
break ;
case REQUEST_BEAUTY_RIBBON_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_BEAUTY_RIBBON ) ;
size = 1 ;
break ;
case REQUEST_CUTE_RIBBON_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_CUTE_RIBBON ) ;
size = 1 ;
break ;
case REQUEST_SMART_RIBBON_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SMART_RIBBON ) ;
size = 1 ;
break ;
case REQUEST_TOUGH_RIBBON_BATTLE :
dst [ 0 ] = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_TOUGH_RIBBON ) ;
size = 1 ;
break ;
}
return size ;
}
static void LinkOpponentHandleGetRawMonData ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleSetMonData ( void )
{
2017-10-31 18:04:08 +01:00
u8 monToCheck ;
2017-10-24 15:25:20 +02:00
u8 i ;
2018-02-06 02:46:59 +01:00
if ( gBattleBufferA [ gActiveBattler ] [ 2 ] = = 0 )
2017-10-24 15:25:20 +02:00
{
2018-02-06 20:48:02 +01:00
SetLinkOpponentMonData ( gBattlerPartyIndexes [ gActiveBattler ] ) ;
2017-10-24 15:25:20 +02:00
}
else
{
2018-02-06 02:46:59 +01:00
monToCheck = gBattleBufferA [ gActiveBattler ] [ 2 ] ;
2018-11-18 20:00:36 +01:00
for ( i = 0 ; i < PARTY_SIZE ; i + + )
2017-10-24 15:25:20 +02:00
{
2017-10-31 18:04:08 +01:00
if ( monToCheck & 1 )
2017-10-24 15:25:20 +02:00
SetLinkOpponentMonData ( i ) ;
2017-10-31 18:04:08 +01:00
monToCheck > > = 1 ;
2017-10-24 15:25:20 +02:00
}
}
LinkOpponentBufferExecCompleted ( ) ;
}
static void SetLinkOpponentMonData ( u8 monId )
{
2018-02-06 02:46:59 +01:00
struct BattlePokemon * battlePokemon = ( struct BattlePokemon * ) & gBattleBufferA [ gActiveBattler ] [ 3 ] ;
struct MovePpInfo * moveData = ( struct MovePpInfo * ) & gBattleBufferA [ gActiveBattler ] [ 3 ] ;
2017-10-24 15:25:20 +02:00
s32 i ;
2018-02-06 02:46:59 +01:00
switch ( gBattleBufferA [ gActiveBattler ] [ 1 ] )
2017-10-24 15:25:20 +02:00
{
case REQUEST_ALL_BATTLE :
{
u8 iv ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPECIES , & battlePokemon - > species ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_HELD_ITEM , & battlePokemon - > item ) ;
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2017-10-24 15:25:20 +02:00
{
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_MOVE1 + i , & battlePokemon - > moves [ i ] ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP1 + i , & battlePokemon - > pp [ i ] ) ;
}
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP_BONUSES , & battlePokemon - > ppBonuses ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_FRIENDSHIP , & battlePokemon - > friendship ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_EXP , & battlePokemon - > experience ) ;
iv = battlePokemon - > hpIV ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_HP_IV , & iv ) ;
iv = battlePokemon - > attackIV ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_ATK_IV , & iv ) ;
iv = battlePokemon - > defenseIV ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_DEF_IV , & iv ) ;
iv = battlePokemon - > speedIV ;
2017-10-24 15:35:36 +02:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPEED_IV , & iv ) ;
2017-10-24 15:25:20 +02:00
iv = battlePokemon - > spAttackIV ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPATK_IV , & iv ) ;
iv = battlePokemon - > spDefenseIV ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPDEF_IV , & iv ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_PERSONALITY , & battlePokemon - > personality ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_STATUS , & battlePokemon - > status1 ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_LEVEL , & battlePokemon - > level ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_HP , & battlePokemon - > hp ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_MAX_HP , & battlePokemon - > maxHP ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_ATK , & battlePokemon - > attack ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_DEF , & battlePokemon - > defense ) ;
2017-10-24 15:35:36 +02:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPEED , & battlePokemon - > speed ) ;
2017-10-24 15:25:20 +02:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPATK , & battlePokemon - > spAttack ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPDEF , & battlePokemon - > spDefense ) ;
}
break ;
case REQUEST_SPECIES_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPECIES , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_HELDITEM_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_HELD_ITEM , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_MOVES_PP_BATTLE :
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2017-10-24 15:25:20 +02:00
{
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_MOVE1 + i , & moveData - > moves [ i ] ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP1 + i , & moveData - > pp [ i ] ) ;
}
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP_BONUSES , & moveData - > ppBonuses ) ;
break ;
case REQUEST_MOVE1_BATTLE :
case REQUEST_MOVE2_BATTLE :
case REQUEST_MOVE3_BATTLE :
case REQUEST_MOVE4_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_MOVE1 + gBattleBufferA [ gActiveBattler ] [ 1 ] - REQUEST_MOVE1_BATTLE , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_PP_DATA_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP1 , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP2 , & gBattleBufferA [ gActiveBattler ] [ 4 ] ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP3 , & gBattleBufferA [ gActiveBattler ] [ 5 ] ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP4 , & gBattleBufferA [ gActiveBattler ] [ 6 ] ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP_BONUSES , & gBattleBufferA [ gActiveBattler ] [ 7 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_PPMOVE1_BATTLE :
case REQUEST_PPMOVE2_BATTLE :
case REQUEST_PPMOVE3_BATTLE :
case REQUEST_PPMOVE4_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_PP1 + gBattleBufferA [ gActiveBattler ] [ 1 ] - REQUEST_PPMOVE1_BATTLE , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_OTID_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_OT_ID , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_EXP_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_EXP , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_HP_EV_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_HP_EV , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_ATK_EV_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_ATK_EV , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_DEF_EV_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_DEF_EV , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_SPEED_EV_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPEED_EV , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_SPATK_EV_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPATK_EV , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_SPDEF_EV_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPDEF_EV , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_FRIENDSHIP_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_FRIENDSHIP , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_POKERUS_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_POKERUS , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_MET_LOCATION_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_MET_LOCATION , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_MET_LEVEL_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_MET_LEVEL , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_MET_GAME_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_MET_GAME , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_POKEBALL_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_POKEBALL , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_ALL_IVS_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_HP_IV , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_ATK_IV , & gBattleBufferA [ gActiveBattler ] [ 4 ] ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_DEF_IV , & gBattleBufferA [ gActiveBattler ] [ 5 ] ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPEED_IV , & gBattleBufferA [ gActiveBattler ] [ 6 ] ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPATK_IV , & gBattleBufferA [ gActiveBattler ] [ 7 ] ) ;
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPDEF_IV , & gBattleBufferA [ gActiveBattler ] [ 8 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_HP_IV_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_HP_IV , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_ATK_IV_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_ATK_IV , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_DEF_IV_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_DEF_IV , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_SPEED_IV_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPEED_IV , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_SPATK_IV_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPATK_IV , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_SPDEF_IV_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPDEF_IV , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_PERSONALITY_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_PERSONALITY , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_CHECKSUM_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_CHECKSUM , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_STATUS_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_STATUS , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_LEVEL_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_LEVEL , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_HP_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_HP , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_MAX_HP_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_MAX_HP , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_ATK_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_ATK , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_DEF_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_DEF , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_SPEED_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPEED , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_SPATK_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPATK , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_SPDEF_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPDEF , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_COOL_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_COOL , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_BEAUTY_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_BEAUTY , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_CUTE_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_CUTE , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_SMART_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SMART , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_TOUGH_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_TOUGH , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_SHEEN_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SHEEN , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_COOL_RIBBON_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_COOL_RIBBON , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_BEAUTY_RIBBON_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_BEAUTY_RIBBON , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_CUTE_RIBBON_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_CUTE_RIBBON , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_SMART_RIBBON_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_SMART_RIBBON , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
case REQUEST_TOUGH_RIBBON_BATTLE :
2018-02-06 02:46:59 +01:00
SetMonData ( & gEnemyParty [ monId ] , MON_DATA_TOUGH_RIBBON , & gBattleBufferA [ gActiveBattler ] [ 3 ] ) ;
2017-10-24 15:25:20 +02:00
break ;
}
}
static void LinkOpponentHandleSetRawMonData ( void )
{
2018-02-06 20:48:02 +01:00
u8 * dst = ( u8 * ) & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] + gBattleBufferA [ gActiveBattler ] [ 1 ] ;
2017-10-24 15:25:20 +02:00
u8 i ;
2018-02-06 02:46:59 +01:00
for ( i = 0 ; i < gBattleBufferA [ gActiveBattler ] [ 2 ] ; i + + )
dst [ i ] = gBattleBufferA [ gActiveBattler ] [ 3 + i ] ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleLoadMonSprite ( void )
{
2018-02-06 20:48:02 +01:00
u16 species = GetMonData ( & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] , MON_DATA_SPECIES ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
BattleLoadOpponentMonSpriteGfx ( & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] , gActiveBattler ) ;
2018-07-01 15:28:57 +02:00
SetMultiuseSpriteTemplateToPokemon ( species , GetBattlerPosition ( gActiveBattler ) ) ;
2017-10-24 15:25:20 +02:00
2018-07-01 15:28:57 +02:00
gBattlerSpriteIds [ gActiveBattler ] = CreateSprite ( & gMultiuseSpriteTemplate ,
2018-02-06 20:48:02 +01:00
GetBattlerSpriteCoord ( gActiveBattler , 2 ) ,
GetBattlerSpriteDefault_Y ( gActiveBattler ) ,
2018-12-18 05:08:08 +01:00
GetBattlerSpriteSubpriority ( gActiveBattler ) ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . pos2 . x = - 240 ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . data [ 0 ] = gActiveBattler ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . oam . paletteNum = gActiveBattler ;
StartSpriteAnim ( & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] , gBattleMonForms [ gActiveBattler ] ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
SetBattlerShadowSpriteCallback ( gActiveBattler , GetMonData ( & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] , MON_DATA_SPECIES ) ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = sub_8064B04 ;
2017-10-24 15:25:20 +02:00
}
static void LinkOpponentHandleSwitchInAnim ( void )
{
2018-02-06 20:48:02 +01:00
gBattlerPartyIndexes [ gActiveBattler ] = gBattleBufferA [ gActiveBattler ] [ 1 ] ;
2018-02-06 02:46:59 +01:00
sub_8066494 ( gActiveBattler , gBattleBufferA [ gActiveBattler ] [ 2 ] ) ;
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = sub_8064F40 ;
2017-10-24 15:25:20 +02:00
}
2018-03-01 00:59:52 +01:00
static void sub_8066494 ( u8 battlerId , bool8 dontClearSubstituteBit )
2017-10-24 15:25:20 +02:00
{
u16 species ;
2018-03-01 00:59:52 +01:00
ClearTemporarySpeciesSpriteData ( battlerId , dontClearSubstituteBit ) ;
gBattlerPartyIndexes [ battlerId ] = gBattleBufferA [ battlerId ] [ 1 ] ;
species = GetMonData ( & gEnemyParty [ gBattlerPartyIndexes [ battlerId ] ] , MON_DATA_SPECIES ) ;
gUnknown_03005D7C [ battlerId ] = CreateInvisibleSpriteWithCallback ( sub_805D714 ) ;
BattleLoadOpponentMonSpriteGfx ( & gEnemyParty [ gBattlerPartyIndexes [ battlerId ] ] , battlerId ) ;
2018-07-01 15:28:57 +02:00
SetMultiuseSpriteTemplateToPokemon ( species , GetBattlerPosition ( battlerId ) ) ;
2017-10-24 15:25:20 +02:00
2018-03-01 00:59:52 +01:00
gBattlerSpriteIds [ battlerId ] = CreateSprite (
2018-07-01 15:28:57 +02:00
& gMultiuseSpriteTemplate ,
2018-03-01 00:59:52 +01:00
GetBattlerSpriteCoord ( battlerId , 2 ) ,
GetBattlerSpriteDefault_Y ( battlerId ) ,
2018-12-18 05:08:08 +01:00
GetBattlerSpriteSubpriority ( battlerId ) ) ;
2017-10-24 15:25:20 +02:00
2018-03-01 00:59:52 +01:00
gSprites [ gUnknown_03005D7C [ battlerId ] ] . data [ 1 ] = gBattlerSpriteIds [ battlerId ] ;
gSprites [ gUnknown_03005D7C [ battlerId ] ] . data [ 2 ] = battlerId ;
2017-10-24 15:25:20 +02:00
2018-03-01 00:59:52 +01:00
gSprites [ gBattlerSpriteIds [ battlerId ] ] . data [ 0 ] = battlerId ;
gSprites [ gBattlerSpriteIds [ battlerId ] ] . data [ 2 ] = species ;
gSprites [ gBattlerSpriteIds [ battlerId ] ] . oam . paletteNum = battlerId ;
2017-10-24 15:25:20 +02:00
2018-03-01 00:59:52 +01:00
StartSpriteAnim ( & gSprites [ gBattlerSpriteIds [ battlerId ] ] , gBattleMonForms [ battlerId ] ) ;
2017-10-24 15:25:20 +02:00
2018-03-01 00:59:52 +01:00
gSprites [ gBattlerSpriteIds [ battlerId ] ] . invisible = TRUE ;
gSprites [ gBattlerSpriteIds [ battlerId ] ] . callback = SpriteCallbackDummy ;
2017-10-24 15:25:20 +02:00
2018-03-01 00:59:52 +01:00
gSprites [ gUnknown_03005D7C [ battlerId ] ] . data [ 0 ] = DoPokeballSendOutAnimation ( 0 , POKEBALL_OPPONENT_SENDOUT ) ;
2017-10-24 15:25:20 +02:00
}
static void LinkOpponentHandleReturnMonToBall ( void )
{
2018-02-06 02:46:59 +01:00
if ( gBattleBufferA [ gActiveBattler ] [ 1 ] = = 0 )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . animationState = 0 ;
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = DoSwitchOutAnimation ;
2017-10-24 15:25:20 +02:00
}
else
{
2018-02-06 20:48:02 +01:00
FreeSpriteOamMatrix ( & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] ) ;
DestroySprite ( & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] ) ;
HideBattlerShadowSprite ( gActiveBattler ) ;
SetHealthboxSpriteInvisible ( gHealthboxSpriteIds [ gActiveBattler ] ) ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
}
static void DoSwitchOutAnimation ( void )
{
2018-02-06 02:46:59 +01:00
switch ( gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . animationState )
2017-10-24 15:25:20 +02:00
{
case 0 :
2018-02-06 23:09:39 +01:00
if ( gBattleSpritesDataPtr - > battlerData [ gActiveBattler ] . behindSubstitute )
2018-02-06 02:46:59 +01:00
InitAndLaunchSpecialAnimation ( gActiveBattler , gActiveBattler , gActiveBattler , B_ANIM_SUBSTITUTE_TO_MON ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . animationState = 1 ;
2017-10-24 15:25:20 +02:00
break ;
case 1 :
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . specialAnimActive )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . animationState = 0 ;
InitAndLaunchSpecialAnimation ( gActiveBattler , gActiveBattler , gActiveBattler , B_ANIM_SWITCH_OUT_OPPONENT_MON ) ;
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = sub_8064C58 ;
2017-10-24 15:25:20 +02:00
}
break ;
}
}
static void LinkOpponentHandleDrawTrainerPic ( void )
{
s16 xPos ;
u32 trainerPicId ;
if ( gBattleTypeFlags & BATTLE_TYPE_MULTI )
{
2018-02-06 02:46:59 +01:00
if ( ( GetBattlerPosition ( gActiveBattler ) & BIT_FLANK ) ! = 0 ) // second mon
2017-10-24 15:25:20 +02:00
xPos = 152 ;
else // first mon
xPos = 200 ;
if ( gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER )
{
2018-02-12 00:11:10 +01:00
if ( gActiveBattler = = B_POSITION_OPPONENT_LEFT )
2017-10-24 15:25:20 +02:00
trainerPicId = GetFrontierTrainerFrontSpriteId ( gTrainerBattleOpponent_A ) ;
else
trainerPicId = GetFrontierTrainerFrontSpriteId ( gTrainerBattleOpponent_B ) ;
}
else
{
2018-02-06 20:48:02 +01:00
if ( ( gLinkPlayers [ GetBattlerMultiplayerId ( gActiveBattler ) ] . version & 0xFF ) = = VERSION_FIRE_RED
| | ( gLinkPlayers [ GetBattlerMultiplayerId ( gActiveBattler ) ] . version & 0xFF ) = = VERSION_LEAF_GREEN )
2017-10-24 15:25:20 +02:00
{
2018-02-12 00:11:10 +01:00
if ( gLinkPlayers [ GetBattlerMultiplayerId ( gActiveBattler ) ] . gender ! = MALE )
2018-12-03 04:35:11 +01:00
trainerPicId = gFacilityClassToPicIndex [ FACILITY_CLASS_LEAF ] ;
2017-10-24 15:25:20 +02:00
else
2018-12-03 04:35:11 +01:00
trainerPicId = gFacilityClassToPicIndex [ FACILITY_CLASS_RED ] ;
2017-10-24 15:25:20 +02:00
}
2018-02-06 20:48:02 +01:00
else if ( ( gLinkPlayers [ GetBattlerMultiplayerId ( gActiveBattler ) ] . version & 0xFF ) = = VERSION_RUBY
| | ( gLinkPlayers [ GetBattlerMultiplayerId ( gActiveBattler ) ] . version & 0xFF ) = = VERSION_SAPPHIRE )
2017-10-24 15:25:20 +02:00
{
2018-02-12 00:11:10 +01:00
if ( gLinkPlayers [ GetBattlerMultiplayerId ( gActiveBattler ) ] . gender ! = MALE )
2018-12-03 04:35:11 +01:00
trainerPicId = gFacilityClassToPicIndex [ FACILITY_CLASS_RS_MAY ] ;
2017-10-24 15:25:20 +02:00
else
2018-12-03 04:35:11 +01:00
trainerPicId = gFacilityClassToPicIndex [ FACILITY_CLASS_RS_BRENDAN ] ;
2017-10-24 15:25:20 +02:00
}
else
{
2018-02-06 20:48:02 +01:00
trainerPicId = PlayerGenderToFrontTrainerPicId ( gLinkPlayers [ GetBattlerMultiplayerId ( gActiveBattler ) ] . gender ) ;
2017-10-24 15:25:20 +02:00
}
}
}
else
{
xPos = 176 ;
if ( gTrainerBattleOpponent_A = = TRAINER_OPPONENT_C00 )
{
trainerPicId = sub_8068B48 ( ) ;
}
else if ( ( gLinkPlayers [ GetMultiplayerId ( ) ^ BIT_SIDE ] . version & 0xFF ) = = VERSION_FIRE_RED
| | ( gLinkPlayers [ GetMultiplayerId ( ) ^ BIT_SIDE ] . version & 0xFF ) = = VERSION_LEAF_GREEN )
{
2019-02-02 22:53:47 +01:00
if ( gLinkPlayers [ GetMultiplayerId ( ) ^ BIT_SIDE ] . gender ! = MALE )
2018-12-03 04:35:11 +01:00
trainerPicId = gFacilityClassToPicIndex [ FACILITY_CLASS_LEAF ] ;
2017-10-24 15:25:20 +02:00
else
2018-12-03 04:35:11 +01:00
trainerPicId = gFacilityClassToPicIndex [ FACILITY_CLASS_RED ] ;
2017-10-24 15:25:20 +02:00
}
else if ( ( gLinkPlayers [ GetMultiplayerId ( ) ^ BIT_SIDE ] . version & 0xFF ) = = VERSION_RUBY
| | ( gLinkPlayers [ GetMultiplayerId ( ) ^ BIT_SIDE ] . version & 0xFF ) = = VERSION_SAPPHIRE )
{
2019-02-02 22:53:47 +01:00
if ( gLinkPlayers [ GetMultiplayerId ( ) ^ BIT_SIDE ] . gender ! = MALE )
2018-12-03 04:35:11 +01:00
trainerPicId = gFacilityClassToPicIndex [ FACILITY_CLASS_RS_MAY ] ;
2017-10-24 15:25:20 +02:00
else
2018-12-03 04:35:11 +01:00
trainerPicId = gFacilityClassToPicIndex [ FACILITY_CLASS_RS_BRENDAN ] ;
2017-10-24 15:25:20 +02:00
}
else
{
trainerPicId = PlayerGenderToFrontTrainerPicId ( gLinkPlayers [ GetMultiplayerId ( ) ^ BIT_SIDE ] . gender ) ;
}
}
2018-02-06 02:46:59 +01:00
DecompressTrainerFrontPic ( trainerPicId , gActiveBattler ) ;
2018-07-01 15:28:57 +02:00
SetMultiuseSpriteTemplateToTrainerBack ( trainerPicId , GetBattlerPosition ( gActiveBattler ) ) ;
gBattlerSpriteIds [ gActiveBattler ] = CreateSprite ( & gMultiuseSpriteTemplate ,
2017-10-24 15:25:20 +02:00
xPos ,
2019-01-04 18:17:55 +01:00
( 8 - gTrainerFrontPicCoords [ trainerPicId ] . size ) * 4 + 40 ,
2018-12-18 05:08:08 +01:00
GetBattlerSpriteSubpriority ( gActiveBattler ) ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . pos2 . x = - 240 ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . data [ 0 ] = 2 ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . oam . paletteNum = IndexOfSpritePaletteTag ( gTrainerFrontPicPaletteTable [ trainerPicId ] . tag ) ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . oam . affineParam = trainerPicId ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . callback = sub_805D7AC ;
2017-10-24 15:25:20 +02:00
2018-07-01 15:28:57 +02:00
gBattlerControllerFuncs [ gActiveBattler ] = CompleteOnBattlerSpriteCallbackDummy ;
2017-10-24 15:25:20 +02:00
}
static void LinkOpponentHandleTrainerSlide ( void )
{
u32 trainerPicId ;
2018-02-06 02:46:59 +01:00
if ( gActiveBattler = = 1 )
2017-10-24 15:25:20 +02:00
trainerPicId = GetFrontierTrainerFrontSpriteId ( gTrainerBattleOpponent_A ) ;
else
trainerPicId = GetFrontierTrainerFrontSpriteId ( gTrainerBattleOpponent_B ) ;
2018-02-06 02:46:59 +01:00
DecompressTrainerFrontPic ( trainerPicId , gActiveBattler ) ;
2018-07-01 15:28:57 +02:00
SetMultiuseSpriteTemplateToTrainerBack ( trainerPicId , GetBattlerPosition ( gActiveBattler ) ) ;
2019-01-04 18:17:55 +01:00
gBattlerSpriteIds [ gActiveBattler ] = CreateSprite ( & gMultiuseSpriteTemplate , 176 , ( 8 - gTrainerFrontPicCoords [ trainerPicId ] . size ) * 4 + 40 , 0x1E ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . pos2 . x = 96 ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . pos1 . x + = 32 ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . data [ 0 ] = - 2 ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . oam . paletteNum = IndexOfSpritePaletteTag ( gTrainerFrontPicPaletteTable [ trainerPicId ] . tag ) ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . oam . affineParam = trainerPicId ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . callback = sub_805D7AC ;
2017-10-24 15:25:20 +02:00
2018-03-01 00:59:52 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = CompleteOnBankSpriteCallbackDummy2 ; // this line is redundant, because LinkOpponentBufferExecCompleted changes the battle battlerId function
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleTrainerSlideBack ( void )
{
2019-02-06 20:17:09 +01:00
SetSpritePrimaryCoordsFromSecondaryCoords ( & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] ) ;
2018-02-06 20:48:02 +01:00
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . data [ 0 ] = 35 ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . data [ 2 ] = 280 ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . data [ 4 ] = gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . pos1 . y ;
2018-11-26 00:00:18 +01:00
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . callback = StartAnimLinearTranslation ;
2018-02-06 20:48:02 +01:00
StoreSpriteCallbackInData6 ( & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] , SpriteCallbackDummy ) ;
gBattlerControllerFuncs [ gActiveBattler ] = sub_8064470 ;
2017-10-24 15:25:20 +02:00
}
static void LinkOpponentHandleFaintAnimation ( void )
{
2018-02-06 02:46:59 +01:00
if ( gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . animationState = = 0 )
2017-10-24 15:25:20 +02:00
{
2018-02-06 23:09:39 +01:00
if ( gBattleSpritesDataPtr - > battlerData [ gActiveBattler ] . behindSubstitute )
2018-02-06 02:46:59 +01:00
InitAndLaunchSpecialAnimation ( gActiveBattler , gActiveBattler , gActiveBattler , B_ANIM_SUBSTITUTE_TO_MON ) ;
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . animationState + + ;
2017-10-24 15:25:20 +02:00
}
else
{
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . specialAnimActive )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . animationState = 0 ;
2018-10-19 21:57:19 +02:00
PlaySE12WithPanning ( SE_POKE_DEAD , SOUND_PAN_TARGET ) ;
2018-06-20 23:07:51 +02:00
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . callback = SpriteCB_FaintOpponentMon ;
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = sub_8064C14 ;
2017-10-24 15:25:20 +02:00
}
}
}
static void LinkOpponentHandlePaletteFade ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleSuccessBallThrowAnim ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleBallThrowAnim ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandlePause ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleMoveAnimation ( void )
{
2018-02-06 02:46:59 +01:00
if ( ! mplay_80342A4 ( gActiveBattler ) )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
u16 move = gBattleBufferA [ gActiveBattler ] [ 1 ] | ( gBattleBufferA [ gActiveBattler ] [ 2 ] < < 8 ) ;
gAnimMoveTurn = gBattleBufferA [ gActiveBattler ] [ 3 ] ;
gAnimMovePower = gBattleBufferA [ gActiveBattler ] [ 4 ] | ( gBattleBufferA [ gActiveBattler ] [ 5 ] < < 8 ) ;
gAnimMoveDmg = gBattleBufferA [ gActiveBattler ] [ 6 ] | ( gBattleBufferA [ gActiveBattler ] [ 7 ] < < 8 ) | ( gBattleBufferA [ gActiveBattler ] [ 8 ] < < 16 ) | ( gBattleBufferA [ gActiveBattler ] [ 9 ] < < 24 ) ;
gAnimFriendship = gBattleBufferA [ gActiveBattler ] [ 10 ] ;
gWeatherMoveAnim = gBattleBufferA [ gActiveBattler ] [ 12 ] | ( gBattleBufferA [ gActiveBattler ] [ 13 ] < < 8 ) ;
gAnimDisableStructPtr = ( struct DisableStruct * ) & gBattleBufferA [ gActiveBattler ] [ 16 ] ;
gTransformedPersonalities [ gActiveBattler ] = gAnimDisableStructPtr - > transformedMonPersonality ;
2017-10-24 15:25:20 +02:00
if ( IsMoveWithoutAnimation ( move , gAnimMoveTurn ) ) // always returns FALSE
{
LinkOpponentBufferExecCompleted ( ) ;
}
else
{
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . animationState = 0 ;
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = LinkOpponentDoMoveAnimation ;
2018-02-27 20:40:09 +01:00
BattleTv_SetDataBasedOnMove ( move , gWeatherMoveAnim , gAnimDisableStructPtr ) ;
2017-10-24 15:25:20 +02:00
}
}
}
static void LinkOpponentDoMoveAnimation ( void )
{
2018-02-06 02:46:59 +01:00
u16 move = gBattleBufferA [ gActiveBattler ] [ 1 ] | ( gBattleBufferA [ gActiveBattler ] [ 2 ] < < 8 ) ;
u8 multihit = gBattleBufferA [ gActiveBattler ] [ 11 ] ;
2017-10-24 15:25:20 +02:00
2018-02-06 02:46:59 +01:00
switch ( gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . animationState )
2017-10-24 15:25:20 +02:00
{
case 0 :
2018-02-06 23:09:39 +01:00
if ( gBattleSpritesDataPtr - > battlerData [ gActiveBattler ] . behindSubstitute
& & ! gBattleSpritesDataPtr - > battlerData [ gActiveBattler ] . flag_x8 )
2017-10-24 15:25:20 +02:00
{
2018-02-06 23:09:39 +01:00
gBattleSpritesDataPtr - > battlerData [ gActiveBattler ] . flag_x8 = 1 ;
2018-02-06 02:46:59 +01:00
InitAndLaunchSpecialAnimation ( gActiveBattler , gActiveBattler , gActiveBattler , B_ANIM_SUBSTITUTE_TO_MON ) ;
2017-10-24 15:25:20 +02:00
}
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . animationState = 1 ;
2017-10-24 15:25:20 +02:00
break ;
case 1 :
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . specialAnimActive )
2017-10-24 15:25:20 +02:00
{
2019-12-05 03:00:45 +01:00
sub_805EB9C ( ST_OAM_AFFINE_OFF ) ;
2017-10-24 15:25:20 +02:00
DoMoveAnim ( move ) ;
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . animationState = 2 ;
2017-10-24 15:25:20 +02:00
}
break ;
case 2 :
gAnimScriptCallback ( ) ;
if ( ! gAnimScriptActive )
{
2019-12-05 03:00:45 +01:00
sub_805EB9C ( ST_OAM_AFFINE_NORMAL ) ;
2018-02-06 23:09:39 +01:00
if ( gBattleSpritesDataPtr - > battlerData [ gActiveBattler ] . behindSubstitute & & multihit < 2 )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
InitAndLaunchSpecialAnimation ( gActiveBattler , gActiveBattler , gActiveBattler , B_ANIM_MON_TO_SUBSTITUTE ) ;
2018-02-06 23:09:39 +01:00
gBattleSpritesDataPtr - > battlerData [ gActiveBattler ] . flag_x8 = 0 ;
2017-10-24 15:25:20 +02:00
}
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . animationState = 3 ;
2017-10-24 15:25:20 +02:00
}
break ;
case 3 :
2018-02-06 02:46:59 +01:00
if ( ! gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . specialAnimActive )
2017-10-24 15:25:20 +02:00
{
2017-11-04 16:11:13 +01:00
CopyAllBattleSpritesInvisibilities ( ) ;
2018-02-06 02:46:59 +01:00
TrySetBehindSubstituteSpriteBit ( gActiveBattler , gBattleBufferA [ gActiveBattler ] [ 1 ] | ( gBattleBufferA [ gActiveBattler ] [ 2 ] < < 8 ) ) ;
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . animationState = 0 ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
break ;
}
}
static void LinkOpponentHandlePrintString ( void )
{
u16 * stringId ;
gBattle_BG0_X = 0 ;
gBattle_BG0_Y = 0 ;
2018-02-06 02:46:59 +01:00
stringId = ( u16 * ) ( & gBattleBufferA [ gActiveBattler ] [ 2 ] ) ;
2017-10-24 15:25:20 +02:00
BufferStringBattle ( * stringId ) ;
2018-06-17 16:48:58 +02:00
BattlePutTextOnWindow ( gDisplayedStringBattle , 0 ) ;
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = CompleteOnInactiveTextPrinter ;
2018-02-27 20:40:09 +01:00
BattleTv_SetDataBasedOnString ( * stringId ) ;
2017-10-24 15:25:20 +02:00
}
2017-11-25 18:42:31 +01:00
static void LinkOpponentHandlePrintSelectionString ( void )
2017-10-24 15:25:20 +02:00
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleChooseAction ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleUnknownYesNoBox ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleChooseMove ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleChooseItem ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleChoosePokemon ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleCmd23 ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleHealthBarUpdate ( void )
{
s16 hpVal ;
LoadBattleBarGfx ( 0 ) ;
2018-02-06 02:46:59 +01:00
hpVal = gBattleBufferA [ gActiveBattler ] [ 2 ] | ( gBattleBufferA [ gActiveBattler ] [ 3 ] < < 8 ) ;
2017-10-24 15:25:20 +02:00
if ( hpVal ! = INSTANT_HP_BAR_DROP )
{
2018-02-06 20:48:02 +01:00
u32 maxHP = GetMonData ( & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] , MON_DATA_MAX_HP ) ;
u32 curHP = GetMonData ( & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] , MON_DATA_HP ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
SetBattleBarStruct ( gActiveBattler , gHealthboxSpriteIds [ gActiveBattler ] , maxHP , curHP , hpVal ) ;
2017-10-24 15:25:20 +02:00
}
else
{
2018-02-06 20:48:02 +01:00
u32 maxHP = GetMonData ( & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] , MON_DATA_MAX_HP ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
SetBattleBarStruct ( gActiveBattler , gHealthboxSpriteIds [ gActiveBattler ] , maxHP , 0 , hpVal ) ;
2017-10-24 15:25:20 +02:00
}
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = CompleteOnHealthbarDone ;
2017-10-24 15:25:20 +02:00
}
static void LinkOpponentHandleExpUpdate ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleStatusIconUpdate ( void )
{
2018-02-06 02:46:59 +01:00
if ( ! mplay_80342A4 ( gActiveBattler ) )
2017-10-24 15:25:20 +02:00
{
2018-03-01 00:59:52 +01:00
u8 battlerId ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
UpdateHealthboxAttribute ( gHealthboxSpriteIds [ gActiveBattler ] , & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] , HEALTHBOX_STATUS_ICON ) ;
2018-03-01 00:59:52 +01:00
battlerId = gActiveBattler ;
gBattleSpritesDataPtr - > healthBoxesData [ battlerId ] . statusAnimActive = 0 ;
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = CompleteOnFinishedStatusAnimation ;
2017-10-24 15:25:20 +02:00
}
}
static void LinkOpponentHandleStatusAnimation ( void )
{
2018-02-06 02:46:59 +01:00
if ( ! mplay_80342A4 ( gActiveBattler ) )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
InitAndLaunchChosenStatusAnimation ( gBattleBufferA [ gActiveBattler ] [ 1 ] ,
gBattleBufferA [ gActiveBattler ] [ 2 ] | ( gBattleBufferA [ gActiveBattler ] [ 3 ] < < 8 ) | ( gBattleBufferA [ gActiveBattler ] [ 4 ] < < 16 ) | ( gBattleBufferA [ gActiveBattler ] [ 5 ] < < 24 ) ) ;
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = CompleteOnFinishedStatusAnimation ;
2017-10-24 15:25:20 +02:00
}
}
static void LinkOpponentHandleStatusXor ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleDataTransfer ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleDMA3Transfer ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandlePlayBGM ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleCmd32 ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleTwoReturnValues ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleChosenMonReturnValue ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleOneReturnValue ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleOneReturnValue_Duplicate ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleCmd37 ( void )
{
gUnknown_02022D0C . field_0 = 0 ;
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleCmd38 ( void )
{
2018-02-06 02:46:59 +01:00
gUnknown_02022D0C . field_0 = gBattleBufferA [ gActiveBattler ] [ 1 ] ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleCmd39 ( void )
{
gUnknown_02022D0C . flag_x80 = 0 ;
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleCmd40 ( void )
{
gUnknown_02022D0C . flag_x80 ^ = 1 ;
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleHitAnimation ( void )
{
2018-02-06 20:48:02 +01:00
if ( gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . invisible = = TRUE )
2017-10-24 15:25:20 +02:00
{
LinkOpponentBufferExecCompleted ( ) ;
}
else
{
gDoingBattleAnim = TRUE ;
2018-02-06 20:48:02 +01:00
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . data [ 1 ] = 0 ;
2018-02-06 02:46:59 +01:00
DoHitAnimHealthboxEffect ( gActiveBattler ) ;
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = DoHitAnimBlinkSpriteEffect ;
2017-10-24 15:25:20 +02:00
}
}
static void LinkOpponentHandleCmd42 ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
2017-11-25 18:42:31 +01:00
static void LinkOpponentHandlePlaySE ( void )
2017-10-24 15:25:20 +02:00
{
s8 pan ;
2018-02-06 02:46:59 +01:00
if ( GetBattlerSide ( gActiveBattler ) = = B_SIDE_PLAYER )
2018-10-19 21:57:19 +02:00
pan = SOUND_PAN_ATTACKER ;
2017-10-24 15:25:20 +02:00
else
2018-10-19 21:57:19 +02:00
pan = SOUND_PAN_TARGET ;
2017-10-24 15:25:20 +02:00
2018-02-06 02:46:59 +01:00
PlaySE12WithPanning ( gBattleBufferA [ gActiveBattler ] [ 1 ] | ( gBattleBufferA [ gActiveBattler ] [ 2 ] < < 8 ) , pan ) ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandlePlayFanfareOrBGM ( void )
{
2018-02-06 02:46:59 +01:00
if ( gBattleBufferA [ gActiveBattler ] [ 3 ] )
2017-10-24 15:25:20 +02:00
{
2017-11-04 16:11:13 +01:00
BattleStopLowHpSound ( ) ;
2018-02-06 02:46:59 +01:00
PlayBGM ( gBattleBufferA [ gActiveBattler ] [ 1 ] | ( gBattleBufferA [ gActiveBattler ] [ 2 ] < < 8 ) ) ;
2017-10-24 15:25:20 +02:00
}
else
{
2018-02-06 02:46:59 +01:00
PlayFanfare ( gBattleBufferA [ gActiveBattler ] [ 1 ] | ( gBattleBufferA [ gActiveBattler ] [ 2 ] < < 8 ) ) ;
2017-10-24 15:25:20 +02:00
}
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleFaintingCry ( void )
{
2018-02-06 20:48:02 +01:00
u16 species = GetMonData ( & gEnemyParty [ gBattlerPartyIndexes [ gActiveBattler ] ] , MON_DATA_SPECIES ) ;
2017-10-24 15:25:20 +02:00
PlayCry3 ( species , 25 , 5 ) ;
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleIntroSlide ( void )
{
2018-02-06 02:46:59 +01:00
HandleIntroSlide ( gBattleBufferA [ gActiveBattler ] [ 1 ] ) ;
2018-02-08 11:17:41 +01:00
gIntroSlideFlags | = 1 ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleIntroTrainerBallThrow ( void )
{
u8 paletteNum ;
u8 taskId ;
2019-02-06 20:17:09 +01:00
SetSpritePrimaryCoordsFromSecondaryCoords ( & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . data [ 0 ] = 35 ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . data [ 2 ] = 280 ;
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . data [ 4 ] = gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . pos1 . y ;
2018-11-26 00:00:18 +01:00
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . callback = StartAnimLinearTranslation ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
StoreSpriteCallbackInData6 ( & gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] , sub_80676FC ) ;
2017-10-24 15:25:20 +02:00
taskId = CreateTask ( sub_8067618 , 5 ) ;
2018-02-06 02:46:59 +01:00
gTasks [ taskId ] . data [ 0 ] = gActiveBattler ;
2017-10-24 15:25:20 +02:00
2018-06-28 21:06:32 +02:00
if ( gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . partyStatusSummaryShown )
gTasks [ gBattlerStatusSummaryTaskId [ gActiveBattler ] ] . func = Task_HidePartyStatusSummary ;
2017-10-24 15:25:20 +02:00
gBattleSpritesDataPtr - > animationData - > field_9_x1 = 1 ;
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = nullsub_28 ;
2017-10-24 15:25:20 +02:00
}
static void sub_8067618 ( u8 taskId )
{
2018-02-06 02:46:59 +01:00
u8 savedActiveBank = gActiveBattler ;
2017-10-24 15:25:20 +02:00
2018-02-06 02:46:59 +01:00
gActiveBattler = gTasks [ taskId ] . data [ 0 ] ;
2017-10-24 15:25:20 +02:00
if ( ! IsDoubleBattle ( ) | | ( gBattleTypeFlags & BATTLE_TYPE_MULTI ) )
{
2018-02-06 20:48:02 +01:00
gBattleBufferA [ gActiveBattler ] [ 1 ] = gBattlerPartyIndexes [ gActiveBattler ] ;
2018-02-06 02:46:59 +01:00
sub_8066494 ( gActiveBattler , FALSE ) ;
2017-10-24 15:25:20 +02:00
}
else
{
2018-02-06 20:48:02 +01:00
gBattleBufferA [ gActiveBattler ] [ 1 ] = gBattlerPartyIndexes [ gActiveBattler ] ;
2018-02-06 02:46:59 +01:00
sub_8066494 ( gActiveBattler , FALSE ) ;
2018-02-06 23:09:39 +01:00
gActiveBattler = BATTLE_PARTNER ( gActiveBattler ) ;
2018-02-06 20:48:02 +01:00
gBattleBufferA [ gActiveBattler ] [ 1 ] = gBattlerPartyIndexes [ gActiveBattler ] ;
2018-02-06 02:46:59 +01:00
sub_8066494 ( gActiveBattler , FALSE ) ;
2018-02-06 23:09:39 +01:00
gActiveBattler = BATTLE_PARTNER ( gActiveBattler ) ;
2017-10-24 15:25:20 +02:00
}
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = sub_8064734 ;
2018-02-06 02:46:59 +01:00
gActiveBattler = savedActiveBank ;
2017-10-24 15:25:20 +02:00
DestroyTask ( taskId ) ;
}
static void sub_80676FC ( struct Sprite * sprite )
{
FreeTrainerFrontPicPalette ( sprite - > oam . affineParam ) ;
FreeSpriteOamMatrix ( sprite ) ;
DestroySprite ( sprite ) ;
}
static void LinkOpponentHandleDrawPartyStatusSummary ( void )
{
2018-02-06 02:46:59 +01:00
if ( gBattleBufferA [ gActiveBattler ] [ 1 ] ! = 0 & & GetBattlerSide ( gActiveBattler ) = = B_SIDE_PLAYER )
2017-10-24 15:25:20 +02:00
{
LinkOpponentBufferExecCompleted ( ) ;
}
else
{
2018-06-28 21:06:32 +02:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . partyStatusSummaryShown = 1 ;
2017-10-24 15:25:20 +02:00
2018-02-06 02:46:59 +01:00
if ( gBattleBufferA [ gActiveBattler ] [ 2 ] ! = 0 )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
if ( gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x1E < 2 )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x1E + + ;
2017-10-24 15:25:20 +02:00
return ;
}
else
{
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_1_x1E = 0 ;
2017-10-24 15:25:20 +02:00
}
}
2018-02-08 11:17:41 +01:00
gBattlerStatusSummaryTaskId [ gActiveBattler ] = CreatePartyStatusSummarySprites ( gActiveBattler , ( struct HpAndStatus * ) & gBattleBufferA [ gActiveBattler ] [ 4 ] , gBattleBufferA [ gActiveBattler ] [ 1 ] , gBattleBufferA [ gActiveBattler ] [ 2 ] ) ;
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_5 = 0 ;
2017-10-24 15:25:20 +02:00
2018-02-06 02:46:59 +01:00
if ( gBattleBufferA [ gActiveBattler ] [ 2 ] ! = 0 )
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_5 = 0x5D ;
2017-10-24 15:25:20 +02:00
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = sub_806782C ;
2017-10-24 15:25:20 +02:00
}
}
static void sub_806782C ( void )
{
2018-02-06 02:46:59 +01:00
if ( gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_5 + + > 0x5C )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . field_5 = 0 ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
}
2018-06-28 21:06:32 +02:00
static void LinkOpponentHandleHidePartyStatusSummary ( void )
2017-10-24 15:25:20 +02:00
{
2018-06-28 21:06:32 +02:00
if ( gBattleSpritesDataPtr - > healthBoxesData [ gActiveBattler ] . partyStatusSummaryShown )
gTasks [ gBattlerStatusSummaryTaskId [ gActiveBattler ] ] . func = Task_HidePartyStatusSummary ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
2018-06-20 23:07:51 +02:00
static void LinkOpponentHandleEndBounceEffect ( void )
2017-10-24 15:25:20 +02:00
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleSpriteInvisibility ( void )
{
2018-02-06 20:48:02 +01:00
if ( IsBattlerSpritePresent ( gActiveBattler ) )
2017-10-24 15:25:20 +02:00
{
2018-02-06 20:48:02 +01:00
gSprites [ gBattlerSpriteIds [ gActiveBattler ] ] . invisible = gBattleBufferA [ gActiveBattler ] [ 1 ] ;
2018-02-06 02:46:59 +01:00
CopyBattleSpriteInvisibility ( gActiveBattler ) ;
2017-10-24 15:25:20 +02:00
}
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleBattleAnimation ( void )
{
2018-02-06 02:46:59 +01:00
if ( ! mplay_80342A4 ( gActiveBattler ) )
2017-10-24 15:25:20 +02:00
{
2018-02-06 02:46:59 +01:00
u8 animationId = gBattleBufferA [ gActiveBattler ] [ 1 ] ;
u16 argument = gBattleBufferA [ gActiveBattler ] [ 2 ] | ( gBattleBufferA [ gActiveBattler ] [ 3 ] < < 8 ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 02:46:59 +01:00
if ( TryHandleLaunchBattleTableAnimation ( gActiveBattler , gActiveBattler , gActiveBattler , animationId , argument ) )
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
else
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = CompleteOnFinishedBattleAnimation ;
2017-10-24 15:25:20 +02:00
2018-02-27 20:40:09 +01:00
BattleTv_SetDataBasedOnAnimation ( animationId ) ;
2017-10-24 15:25:20 +02:00
}
}
static void LinkOpponentHandleLinkStandbyMsg ( void )
{
2018-02-06 02:46:59 +01:00
sub_81851A8 ( & gBattleBufferA [ gActiveBattler ] [ 2 ] ) ;
2017-10-24 15:25:20 +02:00
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleResetActionMoveSelection ( void )
{
LinkOpponentBufferExecCompleted ( ) ;
}
static void LinkOpponentHandleCmd55 ( void )
{
2018-02-06 02:46:59 +01:00
sub_81851A8 ( & gBattleBufferA [ gActiveBattler ] [ 4 ] ) ;
2017-10-24 15:25:20 +02:00
2018-02-06 02:46:59 +01:00
if ( gBattleBufferA [ gActiveBattler ] [ 1 ] = = B_OUTCOME_DREW )
gBattleOutcome = gBattleBufferA [ gActiveBattler ] [ 1 ] ;
2017-10-24 15:25:20 +02:00
else
2018-02-06 02:46:59 +01:00
gBattleOutcome = gBattleBufferA [ gActiveBattler ] [ 1 ] ^ B_OUTCOME_DREW ;
2017-10-24 15:25:20 +02:00
2019-12-14 09:58:20 +01:00
gSaveBlock2Ptr - > frontier . disableRecordBattle = gBattleBufferA [ gActiveBattler ] [ 2 ] ;
2017-10-24 15:25:20 +02:00
FadeOutMapMusic ( 5 ) ;
BeginFastPaletteFade ( 3 ) ;
LinkOpponentBufferExecCompleted ( ) ;
2018-02-06 20:48:02 +01:00
gBattlerControllerFuncs [ gActiveBattler ] = sub_80587B0 ;
2017-10-24 15:25:20 +02:00
}
2019-03-05 20:07:59 +01:00
static void LinkOpponentCmdEnd ( void )
2017-10-24 15:25:20 +02:00
{
}