2018-01-01 17:41:34 +01:00
|
|
|
#include "global.h"
|
2018-11-19 16:28:55 +01:00
|
|
|
#include "battle.h"
|
2018-01-01 17:41:34 +01:00
|
|
|
#include "battle_transition.h"
|
2020-07-02 21:45:37 +02:00
|
|
|
#include "battle_transition_frontier.h"
|
2018-11-13 15:19:04 +01:00
|
|
|
#include "bg.h"
|
|
|
|
#include "decompress.h"
|
2018-12-24 00:02:29 +01:00
|
|
|
#include "event_object_movement.h"
|
2018-11-13 15:19:04 +01:00
|
|
|
#include "field_camera.h"
|
|
|
|
#include "field_effect.h"
|
2018-12-24 00:02:29 +01:00
|
|
|
#include "field_weather.h"
|
2018-11-13 15:19:04 +01:00
|
|
|
#include "gpu_regs.h"
|
2018-01-01 17:41:34 +01:00
|
|
|
#include "main.h"
|
2019-09-09 03:07:54 +02:00
|
|
|
#include "malloc.h"
|
2018-01-01 17:41:34 +01:00
|
|
|
#include "overworld.h"
|
|
|
|
#include "palette.h"
|
|
|
|
#include "random.h"
|
2018-11-13 15:19:04 +01:00
|
|
|
#include "scanline_effect.h"
|
2018-01-01 17:41:34 +01:00
|
|
|
#include "sound.h"
|
2018-11-13 15:19:04 +01:00
|
|
|
#include "sprite.h"
|
|
|
|
#include "task.h"
|
|
|
|
#include "trig.h"
|
|
|
|
#include "util.h"
|
|
|
|
#include "constants/field_effects.h"
|
2018-01-01 17:41:34 +01:00
|
|
|
#include "constants/songs.h"
|
|
|
|
#include "constants/trainers.h"
|
2019-04-04 23:05:46 +02:00
|
|
|
#include "constants/rgb.h"
|
2018-01-01 17:41:34 +01:00
|
|
|
|
|
|
|
struct TransitionData
|
|
|
|
{
|
2018-01-16 21:37:46 +01:00
|
|
|
vu8 VBlank_DMA;
|
2018-01-01 17:41:34 +01:00
|
|
|
u16 WININ;
|
|
|
|
u16 WINOUT;
|
2018-01-16 21:37:46 +01:00
|
|
|
u16 WIN0H;
|
2018-01-01 17:41:34 +01:00
|
|
|
u16 WIN0V;
|
2018-01-16 21:37:46 +01:00
|
|
|
u16 field_A; // unused
|
|
|
|
u16 field_C; // unused
|
2018-01-01 17:41:34 +01:00
|
|
|
u16 BLDCNT;
|
|
|
|
u16 BLDALPHA;
|
|
|
|
u16 BLDY;
|
|
|
|
s16 field_14;
|
|
|
|
s16 field_16;
|
2018-01-16 21:37:46 +01:00
|
|
|
s16 BG0HOFS_1;
|
|
|
|
s16 BG0HOFS_2;
|
|
|
|
s16 BG0VOFS; // used but not set
|
2018-01-01 17:41:34 +01:00
|
|
|
s16 field_1E; // unused
|
|
|
|
s16 field_20;
|
|
|
|
s16 field_22; // unused
|
|
|
|
s16 data[11];
|
|
|
|
};
|
|
|
|
|
2018-01-13 21:03:07 +01:00
|
|
|
struct StructRectangularSpiral
|
|
|
|
{
|
|
|
|
u8 field_0;
|
|
|
|
s16 field_2;
|
|
|
|
u8 field_4;
|
|
|
|
s16 field_6;
|
|
|
|
u8 field_8;
|
|
|
|
};
|
|
|
|
|
2018-01-02 20:38:33 +01:00
|
|
|
typedef bool8 (*TransitionStateFunc)(struct Task *task);
|
2018-01-01 17:41:34 +01:00
|
|
|
typedef bool8 (*TransitionSpriteCallback)(struct Sprite *sprite);
|
|
|
|
|
|
|
|
// this file's functions
|
2018-01-14 22:09:35 +01:00
|
|
|
static void LaunchBattleTransitionTask(u8 transitionId);
|
|
|
|
static void Task_BattleTransitionMain(u8 taskId);
|
|
|
|
static void Phase1Task_TransitionAll(u8 taskId);
|
|
|
|
static void Phase2Task_Blur(u8 taskId);
|
|
|
|
static void Phase2Task_Swirl(u8 taskId);
|
|
|
|
static void Phase2Task_Shuffle(u8 taskId);
|
|
|
|
static void Phase2Task_BigPokeball(u8 taskId);
|
|
|
|
static void Phase2Task_PokeballsTrail(u8 taskId);
|
|
|
|
static void Phase2Task_Clockwise_BlackFade(u8 taskId);
|
|
|
|
static void Phase2Task_Ripple(u8 taskId);
|
|
|
|
static void Phase2Task_Wave(u8 taskId);
|
|
|
|
static void Phase2Task_Slice(u8 taskId);
|
|
|
|
static void Phase2Task_WhiteFade(u8 taskId);
|
|
|
|
static void Phase2Task_GridSquares(u8 taskId);
|
|
|
|
static void Phase2Task_Shards(u8 taskId);
|
2019-04-16 16:40:32 +02:00
|
|
|
static void Phase2Task_Sidney(u8 taskId);
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Phoebe(u8 taskId);
|
|
|
|
static void Phase2Task_Glacia(u8 taskId);
|
|
|
|
static void Phase2Task_Drake(u8 taskId);
|
|
|
|
static void Phase2Task_Champion(u8 taskId);
|
|
|
|
static void Phase2Task_Aqua(u8 taskId);
|
|
|
|
static void Phase2Task_Magma(u8 taskId);
|
|
|
|
static void Phase2Task_Regice(u8 taskId);
|
|
|
|
static void Phase2Task_Registeel(u8 taskId);
|
|
|
|
static void Phase2Task_Regirock(u8 taskId);
|
|
|
|
static void Phase2Task_Kyogre(u8 taskId);
|
|
|
|
static void Phase2Task_Groudon(u8 taskId);
|
|
|
|
static void Phase2Task_Rayquaza(u8 taskId);
|
|
|
|
static void Phase2Task_ShredSplit(u8 taskId);
|
|
|
|
static void Phase2Task_Blackhole1(u8 taskId);
|
|
|
|
static void Phase2Task_Blackhole2(u8 taskId);
|
|
|
|
static void Phase2Task_RectangularSpiral(u8 taskId);
|
2020-07-02 21:45:37 +02:00
|
|
|
static void Phase2Task_FrontierLogoWiggle(u8 taskId);
|
|
|
|
static void Phase2Task_FrontierLogoWave(u8 taskId);
|
|
|
|
static void Phase2Task_FrontierSquares(u8 taskId);
|
|
|
|
static void Phase2Task_FrontierSquaresScroll(u8 taskId);
|
|
|
|
static void Phase2Task_FrontierSquaresSpiral(u8 taskId);
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB_BattleTransition(void);
|
|
|
|
static void VBlankCB_Phase2_Swirl(void);
|
|
|
|
static void HBlankCB_Phase2_Swirl(void);
|
|
|
|
static void VBlankCB_Phase2_Shuffle(void);
|
|
|
|
static void HBlankCB_Phase2_Shuffle(void);
|
|
|
|
static void VBlankCB0_Phase2_BigPokeball(void);
|
|
|
|
static void VBlankCB1_Phase2_BigPokeball(void);
|
|
|
|
static void VBlankCB_Phase2_Clockwise_BlackFade(void);
|
|
|
|
static void VBlankCB_Phase2_Ripple(void);
|
|
|
|
static void HBlankCB_Phase2_Ripple(void);
|
|
|
|
static void VBlankCB_Phase2_30(void);
|
|
|
|
static void HBlankCB_Phase2_30(void);
|
|
|
|
static void VBlankCB_Phase2_Wave(void);
|
|
|
|
static void VBlankCB_Phase2_Slice(void);
|
|
|
|
static void HBlankCB_Phase2_Slice(void);
|
|
|
|
static void VBlankCB0_Phase2_WhiteFade(void);
|
|
|
|
static void VBlankCB1_Phase2_WhiteFade(void);
|
|
|
|
static void HBlankCB_Phase2_WhiteFade(void);
|
|
|
|
static void VBlankCB_Phase2_Shards(void);
|
|
|
|
static void VBlankCB_Phase2_Rayquaza(void);
|
|
|
|
static bool8 Phase2_Blur_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_Blur_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_Blur_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_Swirl_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_Swirl_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_Shuffle_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_Shuffle_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_Aqua_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_Aqua_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_Magma_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_Magma_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_FramesCountdown(struct Task *task);
|
|
|
|
static bool8 Phase2_Regi_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_Regice_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_Registeel_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_Regirock_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_WeatherTrio_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_WaitPaletteFade(struct Task *task);
|
|
|
|
static bool8 Phase2_Kyogre_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_Kyogre_Func4(struct Task *task);
|
|
|
|
static bool8 Phase2_Kyogre_Func5(struct Task *task);
|
|
|
|
static bool8 Phase2_Groudon_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_Groudon_Func4(struct Task *task);
|
|
|
|
static bool8 Phase2_Groudon_Func5(struct Task *task);
|
|
|
|
static bool8 Phase2_WeatherDuo_Func6(struct Task *task);
|
|
|
|
static bool8 Phase2_WeatherDuo_Func7(struct Task *task);
|
|
|
|
static bool8 Phase2_BigPokeball_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_BigPokeball_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_BigPokeball_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_BigPokeball_Func4(struct Task *task);
|
|
|
|
static bool8 Phase2_BigPokeball_Func5(struct Task *task);
|
|
|
|
static bool8 Phase2_BigPokeball_Func6(struct Task *task);
|
|
|
|
static bool8 Phase2_PokeballsTrail_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_PokeballsTrail_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_PokeballsTrail_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_Clockwise_BlackFade_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_Clockwise_BlackFade_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_Clockwise_BlackFade_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_Clockwise_BlackFade_Func4(struct Task *task);
|
|
|
|
static bool8 Phase2_Clockwise_BlackFade_Func5(struct Task *task);
|
|
|
|
static bool8 Phase2_Clockwise_BlackFade_Func6(struct Task *task);
|
|
|
|
static bool8 Phase2_Clockwise_BlackFade_Func7(struct Task *task);
|
|
|
|
static bool8 Phase2_Ripple_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_Ripple_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_Wave_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_Wave_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_Wave_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_Slice_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_Slice_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_Slice_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_WhiteFade_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_WhiteFade_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_WhiteFade_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_WhiteFade_Func4(struct Task *task);
|
|
|
|
static bool8 Phase2_WhiteFade_Func5(struct Task *task);
|
|
|
|
static bool8 Phase2_GridSquares_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_GridSquares_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_GridSquares_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_Shards_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_Shards_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_Shards_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_Shards_Func4(struct Task *task);
|
|
|
|
static bool8 Phase2_Shards_Func5(struct Task *task);
|
|
|
|
static bool8 Phase2_ShredSplit_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_ShredSplit_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_ShredSplit_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_ShredSplit_Func4(struct Task *task);
|
|
|
|
static bool8 Phase2_Blackhole_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_Blackhole1_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_Blackhole1_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_Blackhole2_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_RectangularSpiral_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_RectangularSpiral_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_RectangularSpiral_Func3(struct Task *task);
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierLogoWiggle_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierLogoWiggle_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierLogoWave_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierLogoWave_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierLogoWave_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierLogoWave_Func4(struct Task *task);
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Rayquaza_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_Rayquaza_Func4(struct Task *task);
|
|
|
|
static bool8 Phase2_Rayquaza_Func5(struct Task *task);
|
|
|
|
static bool8 Phase2_Rayquaza_Func6(struct Task *task);
|
|
|
|
static bool8 Phase2_Rayquaza_Func7(struct Task *task);
|
|
|
|
static bool8 Phase2_Rayquaza_Func8(struct Task *task);
|
|
|
|
static bool8 Phase2_Rayquaza_Func9(struct Task *task);
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierSquares_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierSquares_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierSquares_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierSquares_End(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierSquaresSpiral_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierSquaresSpiral_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierSquaresSpiral_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierSquaresSpiral_Func4(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierSquaresScroll_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierSquaresScroll_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierSquaresScroll_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierSquaresScroll_Func4(struct Task *task);
|
|
|
|
static bool8 Phase2_FrontierSquaresScroll_Func5(struct Task *task);
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Mugshot_Func1(struct Task *task);
|
|
|
|
static bool8 Phase2_Mugshot_Func2(struct Task *task);
|
|
|
|
static bool8 Phase2_Mugshot_Func3(struct Task *task);
|
|
|
|
static bool8 Phase2_Mugshot_Func4(struct Task *task);
|
|
|
|
static bool8 Phase2_Mugshot_Func5(struct Task *task);
|
|
|
|
static bool8 Phase2_Mugshot_Func6(struct Task *task);
|
|
|
|
static bool8 Phase2_Mugshot_Func7(struct Task *task);
|
|
|
|
static bool8 Phase2_Mugshot_Func8(struct Task *task);
|
|
|
|
static bool8 Phase2_Mugshot_Func9(struct Task *task);
|
|
|
|
static bool8 Phase2_Mugshot_Func10(struct Task *task);
|
|
|
|
static void Phase2Task_MugShotTransition(u8 taskId);
|
|
|
|
static void Mugshots_CreateOpponentPlayerSprites(struct Task *task);
|
|
|
|
static void VBlankCB0_Phase2_Mugshots(void);
|
|
|
|
static void VBlankCB1_Phase2_Mugshots(void);
|
|
|
|
static void HBlankCB_Phase2_Mugshots(void);
|
|
|
|
static bool8 Transition_Phase1(struct Task *task);
|
|
|
|
static bool8 Transition_WaitForPhase1(struct Task *task);
|
|
|
|
static bool8 Transition_Phase2(struct Task *task);
|
|
|
|
static bool8 Transition_WaitForPhase2(struct Task *task);
|
2020-06-01 16:17:25 +02:00
|
|
|
static void InitTransitionStructVars(void);
|
|
|
|
static void FadeScreenBlack(void);
|
2018-01-14 22:09:35 +01:00
|
|
|
static void CreatePhase1Task(s16 a0, s16 a1, s16 a2, s16 a3, s16 a4);
|
|
|
|
static void sub_814A014(u16 *a0, s16 a1, s16 a2, s16 a3);
|
|
|
|
static void sub_8149F98(s16 *array, s16 sinAdd, s16 index, s16 indexIncrementer, s16 amplitude, s16 arrSize);
|
2020-06-01 16:17:25 +02:00
|
|
|
static void GetBg0TilemapDst(u16 **tileset);
|
2018-01-14 22:09:35 +01:00
|
|
|
static void sub_814A1AC(s16 *a0, s16 a1, s16 a2, s16 a3, s16 a4, s16 a5, s16 a6);
|
|
|
|
static bool8 sub_814A228(s16 *a0, bool8 a1, bool8 a2);
|
2020-06-01 16:17:25 +02:00
|
|
|
static void SetTrainerPicSlideTable(s16 spriteId, s16 arrId);
|
|
|
|
static void IncrementTrainerPicState(s16 spriteId);
|
|
|
|
static s16 IsTrainerPicSlideDone(s16 spriteId);
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase1_TransitionAll_Func1(struct Task *task);
|
|
|
|
static bool8 Phase1_TransitionAll_Func2(struct Task *task);
|
|
|
|
static bool8 IsPhase1Done(void);
|
|
|
|
static bool16 sub_8149048(const s16 * const *arg0, struct StructRectangularSpiral *arg1);
|
|
|
|
static void sub_814713C(struct Sprite *sprite);
|
2020-06-01 16:17:25 +02:00
|
|
|
static void SpriteCb_TrainerPic(struct Sprite *sprite);
|
2018-01-14 22:09:35 +01:00
|
|
|
static void sub_8149864(struct Sprite *sprite);
|
2020-06-01 16:17:25 +02:00
|
|
|
static bool8 TrainerPicCb_Nothing(struct Sprite *sprite);
|
|
|
|
static bool8 TrainerPicCb_SetSlideOffsets(struct Sprite *sprite);
|
|
|
|
static bool8 TrainerPicCb_Slide1(struct Sprite *sprite);
|
|
|
|
static bool8 TrainerPicCb_Slide2(struct Sprite *sprite);
|
|
|
|
static bool8 TrainerPicCb_Slide3(struct Sprite *sprite);
|
2018-01-01 17:41:34 +01:00
|
|
|
|
|
|
|
// iwram bss vars
|
2019-06-26 22:23:00 +02:00
|
|
|
static s16 sUnusedRectangularSpiralVar;
|
|
|
|
static u8 sTestingTransitionId;
|
|
|
|
static u8 sTestingTransitionState;
|
|
|
|
static struct StructRectangularSpiral sRectangularSpiralTransition[4];
|
2018-01-01 17:41:34 +01:00
|
|
|
|
|
|
|
// ewram vars
|
2018-01-14 20:45:44 +01:00
|
|
|
EWRAM_DATA static struct TransitionData *sTransitionStructPtr = NULL;
|
2018-01-01 17:41:34 +01:00
|
|
|
|
|
|
|
// const rom data
|
2018-01-14 22:09:35 +01:00
|
|
|
static const u32 sBigPokeball_Tileset[] = INCBIN_U32("graphics/battle_transitions/big_pokeball.4bpp");
|
|
|
|
static const u32 sPokeballTrail_Tileset[] = INCBIN_U32("graphics/battle_transitions/pokeball_trail.4bpp");
|
2020-06-01 16:17:25 +02:00
|
|
|
static const u8 sPokeball_Gfx[] = INCBIN_U8("graphics/battle_transitions/pokeball.4bpp");
|
|
|
|
static const u32 sEliteFour_Tileset[] = INCBIN_U32("graphics/battle_transitions/elite_four_bg.4bpp");
|
|
|
|
static const u8 sUnusedBrendan_Gfx[] = INCBIN_U8("graphics/battle_transitions/unused_brendan.4bpp");
|
|
|
|
static const u8 sUnusedLass_Gfx[] = INCBIN_U8("graphics/battle_transitions/unused_lass.4bpp");
|
2018-01-14 22:09:35 +01:00
|
|
|
static const u32 sShrinkingBoxTileset[] = INCBIN_U32("graphics/battle_transitions/shrinking_box.4bpp");
|
2020-06-02 13:30:05 +02:00
|
|
|
static const u16 sEvilTeam_Palette[] = INCBIN_U16("graphics/battle_transitions/evil_team.gbapal");
|
2018-01-14 22:09:35 +01:00
|
|
|
static const u32 sTeamAqua_Tileset[] = INCBIN_U32("graphics/battle_transitions/team_aqua.4bpp.lz");
|
|
|
|
static const u32 sTeamAqua_Tilemap[] = INCBIN_U32("graphics/battle_transitions/team_aqua.bin.lz");
|
|
|
|
static const u32 sTeamMagma_Tileset[] = INCBIN_U32("graphics/battle_transitions/team_magma.4bpp.lz");
|
|
|
|
static const u32 sTeamMagma_Tilemap[] = INCBIN_U32("graphics/battle_transitions/team_magma.bin.lz");
|
2020-06-01 16:17:25 +02:00
|
|
|
static const u32 sRegis_Tileset[] = INCBIN_U32("graphics/battle_transitions/regis.4bpp");
|
2020-06-02 13:30:05 +02:00
|
|
|
static const u16 sRegice_Palette[] = INCBIN_U16("graphics/battle_transitions/regice.gbapal");
|
|
|
|
static const u16 sRegisteel_Palette[] = INCBIN_U16("graphics/battle_transitions/registeel.gbapal");
|
|
|
|
static const u16 sRegirock_Palette[] = INCBIN_U16("graphics/battle_transitions/regirock.gbapal");
|
2020-06-01 16:17:25 +02:00
|
|
|
static const u32 sRegice_Tilemap[] = INCBIN_U32("graphics/battle_transitions/regice.bin");
|
|
|
|
static const u32 sRegisteel_Tilemap[] = INCBIN_U32("graphics/battle_transitions/registeel.bin");
|
|
|
|
static const u32 sRegirock_Tilemap[] = INCBIN_U32("graphics/battle_transitions/regirock.bin");
|
2018-01-14 22:09:35 +01:00
|
|
|
static const u16 gUnknown_085BDB14[] = INCBIN_U16("graphics/battle_transitions/85BDB14.gbapal");
|
2020-06-01 16:17:25 +02:00
|
|
|
static const u32 sKyogre_Tileset[] = INCBIN_U32("graphics/battle_transitions/kyogre.4bpp.lz");
|
|
|
|
static const u32 sKyogre_Tilemap[] = INCBIN_U32("graphics/battle_transitions/kyogre.bin.lz");
|
|
|
|
static const u32 sGroudon_Tileset[] = INCBIN_U32("graphics/battle_transitions/groudon.4bpp.lz");
|
|
|
|
static const u32 sGroudon_Tilemap[] = INCBIN_U32("graphics/battle_transitions/groudon.bin.lz");
|
|
|
|
static const u16 sKyogre1_Palette[] = INCBIN_U16("graphics/battle_transitions/kyogre_pt1.gbapal");
|
|
|
|
static const u16 sKyogre2_Palette[] = INCBIN_U16("graphics/battle_transitions/kyogre_pt2.gbapal");
|
|
|
|
static const u16 sGroudon1_Palette[] = INCBIN_U16("graphics/battle_transitions/groudon_pt1.gbapal");
|
|
|
|
static const u16 sGroudon2_Palette[] = INCBIN_U16("graphics/battle_transitions/groudon_pt2.gbapal");
|
|
|
|
static const u16 sRayquaza_Palette[] = INCBIN_U16("graphics/battle_transitions/rayquaza.gbapal");
|
|
|
|
static const u32 sRayquaza_Tileset[] = INCBIN_U32("graphics/battle_transitions/rayquaza.4bpp");
|
|
|
|
static const u32 sRayquaza_Tilemap[] = INCBIN_U32("graphics/battle_transitions/rayquaza.bin");
|
2020-07-02 21:45:37 +02:00
|
|
|
static const u16 sFrontierLogo_Palette[] = INCBIN_U16("graphics/battle_transitions/frontier_logo.gbapal");
|
|
|
|
static const u32 sFrontierLogo_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_logo.4bpp.lz");
|
|
|
|
static const u32 sFrontierLogo_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_logo.bin.lz");
|
|
|
|
static const u16 sFrontierSquares_Palette[] = INCBIN_U16("graphics/battle_transitions/frontier_squares_blanktiles.gbapal");
|
|
|
|
static const u32 sFrontierSquares_FilledBg_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_1.4bpp.lz");
|
|
|
|
static const u32 sFrontierSquares_EmptyBg_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_2.4bpp.lz");
|
|
|
|
static const u32 sFrontierSquares_Shrink1_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_3.4bpp.lz");
|
|
|
|
static const u32 sFrontierSquares_Shrink2_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_4.4bpp.lz");
|
|
|
|
static const u32 sFrontierSquares_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_squares.bin");
|
2018-01-14 22:09:35 +01:00
|
|
|
|
|
|
|
static const TaskFunc sPhase1_Tasks[B_TRANSITION_COUNT] =
|
2018-01-01 17:41:34 +01:00
|
|
|
{
|
|
|
|
[0 ... B_TRANSITION_COUNT - 1] = &Phase1Task_TransitionAll
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TaskFunc sPhase2_Tasks[B_TRANSITION_COUNT] =
|
2018-01-01 17:41:34 +01:00
|
|
|
{
|
2020-05-31 12:41:27 +02:00
|
|
|
[B_TRANSITION_BLUR] = Phase2Task_Blur,
|
|
|
|
[B_TRANSITION_SWIRL] = Phase2Task_Swirl,
|
|
|
|
[B_TRANSITION_SHUFFLE] = Phase2Task_Shuffle,
|
|
|
|
[B_TRANSITION_BIG_POKEBALL] = Phase2Task_BigPokeball,
|
|
|
|
[B_TRANSITION_POKEBALLS_TRAIL] = Phase2Task_PokeballsTrail,
|
|
|
|
[B_TRANSITION_CLOCKWISE_BLACKFADE] = Phase2Task_Clockwise_BlackFade,
|
|
|
|
[B_TRANSITION_RIPPLE] = Phase2Task_Ripple,
|
|
|
|
[B_TRANSITION_WAVE] = Phase2Task_Wave,
|
|
|
|
[B_TRANSITION_SLICE] = Phase2Task_Slice,
|
|
|
|
[B_TRANSITION_WHITEFADE] = Phase2Task_WhiteFade,
|
|
|
|
[B_TRANSITION_GRID_SQUARES] = Phase2Task_GridSquares,
|
|
|
|
[B_TRANSITION_SHARDS] = Phase2Task_Shards,
|
|
|
|
[B_TRANSITION_SIDNEY] = Phase2Task_Sidney,
|
|
|
|
[B_TRANSITION_PHOEBE] = Phase2Task_Phoebe,
|
|
|
|
[B_TRANSITION_GLACIA] = Phase2Task_Glacia,
|
|
|
|
[B_TRANSITION_DRAKE] = Phase2Task_Drake,
|
|
|
|
[B_TRANSITION_CHAMPION] = Phase2Task_Champion,
|
|
|
|
[B_TRANSITION_AQUA] = Phase2Task_Aqua,
|
|
|
|
[B_TRANSITION_MAGMA] = Phase2Task_Magma,
|
|
|
|
[B_TRANSITION_REGICE] = Phase2Task_Regice,
|
|
|
|
[B_TRANSITION_REGISTEEL] = Phase2Task_Registeel,
|
|
|
|
[B_TRANSITION_REGIROCK] = Phase2Task_Regirock,
|
|
|
|
[B_TRANSITION_KYOGRE] = Phase2Task_Kyogre,
|
|
|
|
[B_TRANSITION_GROUDON] = Phase2Task_Groudon,
|
|
|
|
[B_TRANSITION_RAYQUAZA] = Phase2Task_Rayquaza,
|
|
|
|
[B_TRANSITION_SHRED_SPLIT] = Phase2Task_ShredSplit,
|
|
|
|
[B_TRANSITION_BLACKHOLE1] = Phase2Task_Blackhole1,
|
|
|
|
[B_TRANSITION_BLACKHOLE2] = Phase2Task_Blackhole2,
|
|
|
|
[B_TRANSITION_RECTANGULAR_SPIRAL] = Phase2Task_RectangularSpiral,
|
2020-07-02 21:45:37 +02:00
|
|
|
[B_TRANSITION_FRONTIER_LOGO_WIGGLE] = Phase2Task_FrontierLogoWiggle,
|
|
|
|
[B_TRANSITION_FRONTIER_LOGO_WAVE] = Phase2Task_FrontierLogoWave,
|
|
|
|
[B_TRANSITION_FRONTIER_SQUARES] = Phase2Task_FrontierSquares,
|
|
|
|
[B_TRANSITION_FRONTIER_SQUARES_SCROLL] = Phase2Task_FrontierSquaresScroll,
|
|
|
|
[B_TRANSITION_FRONTIER_SQUARES_SPIRAL] = Phase2Task_FrontierSquaresSpiral,
|
|
|
|
[B_TRANSITION_FRONTIER_CIRCLES_MEET] = Phase2Task_FrontierCirclesMeet,
|
|
|
|
[B_TRANSITION_FRONTIER_CIRCLES_CROSS] = Phase2Task_FrontierCirclesCross,
|
|
|
|
[B_TRANSITION_FRONTIER_CIRCLES_ASYMMETRIC_SPIRAL] = Phase2Task_FrontierCirclesAsymmetricSpiral,
|
|
|
|
[B_TRANSITION_FRONTIER_CIRCLES_SYMMETRIC_SPIRAL] = Phase2Task_FrontierCirclesSymmetricSpiral,
|
|
|
|
[B_TRANSITION_FRONTIER_CIRCLES_MEET_IN_SEQ] = Phase2Task_FrontierCirclesMeetInSeq,
|
|
|
|
[B_TRANSITION_FRONTIER_CIRCLES_CROSS_IN_SEQ] = Phase2Task_FrontierCirclesCrossInSeq,
|
|
|
|
[B_TRANSITION_FRONTIER_CIRCLES_ASYMMETRIC_SPIRAL_IN_SEQ] = Phase2Task_FrontierCirclesAsymmetricSpiralInSeq,
|
|
|
|
[B_TRANSITION_FRONTIER_CIRCLES_SYMMETRIC_SPIRAL_IN_SEQ] = Phase2Task_FrontierCirclesSymmetricSpiralInSeq,
|
2018-01-01 17:41:34 +01:00
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sMainTransitionPhases[] =
|
2018-01-01 17:41:34 +01:00
|
|
|
{
|
|
|
|
&Transition_Phase1,
|
|
|
|
&Transition_WaitForPhase1,
|
|
|
|
&Transition_Phase2,
|
|
|
|
&Transition_WaitForPhase2
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Blur_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_Blur_Func1,
|
|
|
|
Phase2_Blur_Func2,
|
|
|
|
Phase2_Blur_Func3
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Swirl_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_Swirl_Func1,
|
|
|
|
Phase2_Swirl_Func2,
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Shuffle_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_Shuffle_Func1,
|
|
|
|
Phase2_Shuffle_Func2,
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Aqua_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_Aqua_Func1,
|
|
|
|
Phase2_Aqua_Func2,
|
|
|
|
Phase2_BigPokeball_Func3,
|
|
|
|
Phase2_BigPokeball_Func4,
|
|
|
|
Phase2_BigPokeball_Func5,
|
|
|
|
Phase2_FramesCountdown,
|
|
|
|
Phase2_BigPokeball_Func6
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Magma_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_Magma_Func1,
|
|
|
|
Phase2_Magma_Func2,
|
|
|
|
Phase2_BigPokeball_Func3,
|
|
|
|
Phase2_BigPokeball_Func4,
|
|
|
|
Phase2_BigPokeball_Func5,
|
|
|
|
Phase2_FramesCountdown,
|
|
|
|
Phase2_BigPokeball_Func6
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_BigPokeball_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_BigPokeball_Func1,
|
|
|
|
Phase2_BigPokeball_Func2,
|
|
|
|
Phase2_BigPokeball_Func3,
|
|
|
|
Phase2_BigPokeball_Func4,
|
|
|
|
Phase2_BigPokeball_Func5,
|
|
|
|
Phase2_BigPokeball_Func6
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Regice_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_Regi_Func1,
|
|
|
|
Phase2_Regice_Func2,
|
|
|
|
Phase2_BigPokeball_Func3,
|
|
|
|
Phase2_BigPokeball_Func4,
|
|
|
|
Phase2_BigPokeball_Func5,
|
|
|
|
Phase2_BigPokeball_Func6
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Registeel_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_Regi_Func1,
|
|
|
|
Phase2_Registeel_Func2,
|
|
|
|
Phase2_BigPokeball_Func3,
|
|
|
|
Phase2_BigPokeball_Func4,
|
|
|
|
Phase2_BigPokeball_Func5,
|
|
|
|
Phase2_BigPokeball_Func6
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Regirock_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_Regi_Func1,
|
|
|
|
Phase2_Regirock_Func2,
|
|
|
|
Phase2_BigPokeball_Func3,
|
|
|
|
Phase2_BigPokeball_Func4,
|
|
|
|
Phase2_BigPokeball_Func5,
|
|
|
|
Phase2_BigPokeball_Func6
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Kyogre_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_WeatherTrio_Func1,
|
|
|
|
Phase2_WaitPaletteFade,
|
|
|
|
Phase2_Kyogre_Func3,
|
|
|
|
Phase2_Kyogre_Func4,
|
|
|
|
Phase2_Kyogre_Func5,
|
|
|
|
Phase2_FramesCountdown,
|
|
|
|
Phase2_WeatherDuo_Func6,
|
|
|
|
Phase2_WeatherDuo_Func7
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_PokeballsTrail_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_PokeballsTrail_Func1,
|
|
|
|
Phase2_PokeballsTrail_Func2,
|
|
|
|
Phase2_PokeballsTrail_Func3
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const s16 sUnknown_085C8B88[2] = {-16, 256};
|
|
|
|
static const s16 sUnknown_085C8B8C[5] = {0, 32, 64, 18, 48};
|
|
|
|
static const s16 sUnknown_085C8B96[2] = {8, -8};
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Clockwise_BlackFade_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_Clockwise_BlackFade_Func1,
|
|
|
|
Phase2_Clockwise_BlackFade_Func2,
|
|
|
|
Phase2_Clockwise_BlackFade_Func3,
|
|
|
|
Phase2_Clockwise_BlackFade_Func4,
|
|
|
|
Phase2_Clockwise_BlackFade_Func5,
|
|
|
|
Phase2_Clockwise_BlackFade_Func6,
|
|
|
|
Phase2_Clockwise_BlackFade_Func7
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Ripple_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_Ripple_Func1,
|
|
|
|
Phase2_Ripple_Func2
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Wave_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_Wave_Func1,
|
|
|
|
Phase2_Wave_Func2,
|
|
|
|
Phase2_Wave_Func3
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Mugshot_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_Mugshot_Func1,
|
|
|
|
Phase2_Mugshot_Func2,
|
|
|
|
Phase2_Mugshot_Func3,
|
|
|
|
Phase2_Mugshot_Func4,
|
|
|
|
Phase2_Mugshot_Func5,
|
|
|
|
Phase2_Mugshot_Func6,
|
|
|
|
Phase2_Mugshot_Func7,
|
|
|
|
Phase2_Mugshot_Func8,
|
|
|
|
Phase2_Mugshot_Func9,
|
|
|
|
Phase2_Mugshot_Func10
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const u8 sMugshotsTrainerPicIDsTable[MUGSHOTS_COUNT] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-05-31 12:41:27 +02:00
|
|
|
[MUGSHOT_SIDNEY] = TRAINER_PIC_ELITE_FOUR_SIDNEY,
|
|
|
|
[MUGSHOT_PHOEBE] = TRAINER_PIC_ELITE_FOUR_PHOEBE,
|
|
|
|
[MUGSHOT_GLACIA] = TRAINER_PIC_ELITE_FOUR_GLACIA,
|
|
|
|
[MUGSHOT_DRAKE] = TRAINER_PIC_ELITE_FOUR_DRAKE,
|
|
|
|
[MUGSHOT_CHAMPION] = TRAINER_PIC_CHAMPION_WALLACE,
|
2018-01-02 20:38:33 +01:00
|
|
|
};
|
2018-01-14 22:09:35 +01:00
|
|
|
static const s16 sMugshotsOpponentRotationScales[MUGSHOTS_COUNT][2] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-05-31 12:41:27 +02:00
|
|
|
[MUGSHOT_SIDNEY] = {0x200, 0x200},
|
|
|
|
[MUGSHOT_PHOEBE] = {0x200, 0x200},
|
|
|
|
[MUGSHOT_GLACIA] = {0x1B0, 0x1B0},
|
|
|
|
[MUGSHOT_DRAKE] = {0x1A0, 0x1A0},
|
|
|
|
[MUGSHOT_CHAMPION] = {0x188, 0x188},
|
2018-01-02 20:38:33 +01:00
|
|
|
};
|
2018-01-14 22:09:35 +01:00
|
|
|
static const s16 sMugshotsOpponentCoords[MUGSHOTS_COUNT][2] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-05-31 12:41:27 +02:00
|
|
|
[MUGSHOT_SIDNEY] = {0, 0},
|
|
|
|
[MUGSHOT_PHOEBE] = {0, 0},
|
|
|
|
[MUGSHOT_GLACIA] = {-4, 4},
|
|
|
|
[MUGSHOT_DRAKE] = {0, 5},
|
|
|
|
[MUGSHOT_CHAMPION] = {-8, 7},
|
2018-01-02 20:38:33 +01:00
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const TransitionSpriteCallback sTrainerPicSpriteCbs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
TrainerPicCb_Nothing,
|
|
|
|
TrainerPicCb_SetSlideOffsets,
|
|
|
|
TrainerPicCb_Slide1,
|
|
|
|
TrainerPicCb_Slide2,
|
|
|
|
TrainerPicCb_Nothing,
|
|
|
|
TrainerPicCb_Slide3,
|
|
|
|
TrainerPicCb_Nothing
|
2018-01-02 20:38:33 +01:00
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const s16 sTrainerPicSlideOffsets1[2] = {12, -12};
|
|
|
|
static const s16 sTrainerPicSlideOffsets2[2] = {-1, 1};
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Slice_Funcs[] =
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Phase2_Slice_Func1,
|
|
|
|
Phase2_Slice_Func2,
|
|
|
|
Phase2_Slice_Func3
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_ShredSplit_Funcs[] =
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
Phase2_ShredSplit_Func1,
|
|
|
|
Phase2_ShredSplit_Func2,
|
|
|
|
Phase2_ShredSplit_Func3,
|
|
|
|
Phase2_ShredSplit_Func4
|
2018-01-13 21:03:07 +01:00
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const u8 gUnknown_085C8C64[] = {39, 119};
|
|
|
|
static const s16 gUnknown_085C8C66[] = {1, -1};
|
2018-01-13 21:03:07 +01:00
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Blackhole1_Funcs[] =
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
Phase2_Blackhole_Func1,
|
|
|
|
Phase2_Blackhole1_Func2,
|
|
|
|
Phase2_Blackhole1_Func3
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Blackhole2_Funcs[] =
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
Phase2_Blackhole_Func1,
|
|
|
|
Phase2_Blackhole2_Func2
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const s16 gUnknown_085C8C80[] = {-6, 4};
|
2018-01-13 21:03:07 +01:00
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_RectangularSpiral_Funcs[] =
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
Phase2_RectangularSpiral_Func1,
|
|
|
|
Phase2_RectangularSpiral_Func2,
|
|
|
|
Phase2_RectangularSpiral_Func3
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const s16 gUnknown_085C8C90[] = {1, 27, 275, -1};
|
|
|
|
static const s16 gUnknown_085C8C98[] = {2, 486, -1};
|
|
|
|
static const s16 gUnknown_085C8C9E[] = {3, 262, -1};
|
|
|
|
static const s16 gUnknown_085C8CA4[] = {4, 507, -2};
|
|
|
|
static const s16 gUnknown_085C8CAA[] = {1, 213, -1};
|
|
|
|
static const s16 gUnknown_085C8CB0[] = {2, 548, -2};
|
|
|
|
static const s16 gUnknown_085C8CB6[] = {3, 196, -1};
|
|
|
|
static const s16 gUnknown_085C8CBC[] = {4, 573, 309, -1};
|
|
|
|
static const s16 gUnknown_085C8CC4[] = {1, 474, -1};
|
|
|
|
static const s16 gUnknown_085C8CCA[] = {2, 295, 32, -1};
|
|
|
|
static const s16 gUnknown_085C8CD2[] = {3, 58, -1};
|
|
|
|
static const s16 gUnknown_085C8CD8[] = {4, 455, -1};
|
|
|
|
static const s16 gUnknown_085C8CDE[] = {1, 540, -1};
|
|
|
|
static const s16 gUnknown_085C8CE4[] = {2, 229, -1};
|
|
|
|
static const s16 gUnknown_085C8CEA[] = {3, 244, 28, -1};
|
|
|
|
static const s16 gUnknown_085C8CF2[] = {4, 517, -1};
|
|
|
|
|
|
|
|
static const s16 *const gUnknown_085C8CF8[] =
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2018-12-05 15:31:01 +01:00
|
|
|
gUnknown_085C8C90,
|
|
|
|
gUnknown_085C8CA4,
|
|
|
|
gUnknown_085C8C98,
|
|
|
|
gUnknown_085C8C9E,
|
|
|
|
gUnknown_085C8CEA,
|
|
|
|
gUnknown_085C8CE4,
|
|
|
|
gUnknown_085C8CF2,
|
|
|
|
gUnknown_085C8CDE
|
2018-01-13 21:03:07 +01:00
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const s16 *const gUnknown_085C8D18[] =
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2018-12-05 15:31:01 +01:00
|
|
|
gUnknown_085C8CBC,
|
|
|
|
gUnknown_085C8CB0,
|
|
|
|
gUnknown_085C8CB6,
|
|
|
|
gUnknown_085C8CAA,
|
|
|
|
gUnknown_085C8CCA,
|
|
|
|
gUnknown_085C8CD8,
|
|
|
|
gUnknown_085C8CC4,
|
|
|
|
gUnknown_085C8CD2
|
2018-01-13 21:03:07 +01:00
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const s16 *const *const gUnknown_085C8D38[] =
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2018-12-05 15:31:01 +01:00
|
|
|
gUnknown_085C8CF8,
|
|
|
|
gUnknown_085C8D18
|
2018-01-13 21:03:07 +01:00
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Groudon_Funcs[] =
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
Phase2_WeatherTrio_Func1,
|
|
|
|
Phase2_WaitPaletteFade,
|
|
|
|
Phase2_Groudon_Func3,
|
|
|
|
Phase2_Groudon_Func4,
|
|
|
|
Phase2_Groudon_Func5,
|
|
|
|
Phase2_FramesCountdown,
|
|
|
|
Phase2_WeatherDuo_Func6,
|
|
|
|
Phase2_WeatherDuo_Func7
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Rayquaza_Funcs[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
Phase2_WeatherTrio_Func1,
|
|
|
|
Phase2_WaitPaletteFade,
|
|
|
|
Phase2_Rayquaza_Func3,
|
|
|
|
Phase2_Rayquaza_Func4,
|
|
|
|
Phase2_Rayquaza_Func5,
|
|
|
|
Phase2_Rayquaza_Func6,
|
|
|
|
Phase2_Rayquaza_Func7,
|
|
|
|
Phase2_Rayquaza_Func8,
|
|
|
|
Phase2_Rayquaza_Func9,
|
|
|
|
Phase2_Blackhole1_Func2,
|
|
|
|
Phase2_Blackhole1_Func3
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_WhiteFade_Funcs[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
Phase2_WhiteFade_Func1,
|
|
|
|
Phase2_WhiteFade_Func2,
|
|
|
|
Phase2_WhiteFade_Func3,
|
|
|
|
Phase2_WhiteFade_Func4,
|
|
|
|
Phase2_WhiteFade_Func5
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const s16 sUnknown_085C8DA0[] = {0, 20, 15, 40, 10, 25, 35, 5};
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_GridSquares_Funcs[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
Phase2_GridSquares_Func1,
|
|
|
|
Phase2_GridSquares_Func2,
|
|
|
|
Phase2_GridSquares_Func3
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase2_Shards_Funcs[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
Phase2_Shards_Func1,
|
|
|
|
Phase2_Shards_Func2,
|
|
|
|
Phase2_Shards_Func3,
|
|
|
|
Phase2_Shards_Func4,
|
|
|
|
Phase2_Shards_Func5
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const s16 sUnknown_085C8DD0[][5] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
{56, 0, 0, 160, 0},
|
|
|
|
{104, 160, 240, 88, 1},
|
|
|
|
{240, 72, 56, 0, 1},
|
|
|
|
{0, 32, 144, 160, 0},
|
|
|
|
{144, 160, 184, 0, 1},
|
|
|
|
{56, 0, 168, 160, 0},
|
|
|
|
{168, 160, 48, 0, 1},
|
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const s16 sUnknown_085C8E16[] = {8, 4, 2, 1, 1, 1, 0};
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const TransitionStateFunc sPhase1_TransitionAll_Funcs[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
Phase1_TransitionAll_Func1,
|
|
|
|
Phase1_TransitionAll_Func2
|
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const struct SpriteFrameImage sSpriteImage_Pokeball[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
sPokeball_Gfx, sizeof(sPokeball_Gfx)
|
2018-01-14 20:45:44 +01:00
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const union AnimCmd sSpriteAnim_Pokeball[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
ANIMCMD_FRAME(0, 1),
|
|
|
|
ANIMCMD_END
|
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const union AnimCmd *const sSpriteAnimTable_Pokeball[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
sSpriteAnim_Pokeball
|
2018-01-14 20:45:44 +01:00
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const union AffineAnimCmd sSpriteAffineAnim_Pokeball1[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
AFFINEANIMCMD_FRAME(0, 0, -4, 1),
|
|
|
|
AFFINEANIMCMD_JUMP(0)
|
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const union AffineAnimCmd sSpriteAffineAnim_Pokeball2[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
AFFINEANIMCMD_FRAME(0, 0, 4, 1),
|
|
|
|
AFFINEANIMCMD_JUMP(0)
|
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const union AffineAnimCmd *const sSpriteAffineAnimTable_Pokeball[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
sSpriteAffineAnim_Pokeball1,
|
|
|
|
sSpriteAffineAnim_Pokeball2
|
2018-01-14 20:45:44 +01:00
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const struct SpriteTemplate sSpriteTemplate_Pokeball =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
.tileTag = 0xFFFF,
|
2020-07-02 10:59:52 +02:00
|
|
|
.paletteTag = FLDEFF_PAL_TAG_POKEBALL,
|
2019-11-21 04:55:44 +01:00
|
|
|
.oam = &gObjectEventBaseOam_32x32,
|
2020-06-01 16:17:25 +02:00
|
|
|
.anims = sSpriteAnimTable_Pokeball,
|
|
|
|
.images = sSpriteImage_Pokeball,
|
|
|
|
.affineAnims = sSpriteAffineAnimTable_Pokeball,
|
2018-01-14 20:45:44 +01:00
|
|
|
.callback = sub_814713C
|
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const struct OamData sOam_UnusedBrendanLass =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
.y = 0,
|
2019-12-04 21:25:13 +01:00
|
|
|
.affineMode = ST_OAM_AFFINE_OFF,
|
|
|
|
.objMode = ST_OAM_OBJ_NORMAL,
|
2018-01-14 20:45:44 +01:00
|
|
|
.mosaic = 0,
|
2019-12-04 21:25:13 +01:00
|
|
|
.bpp = ST_OAM_4BPP,
|
2019-03-11 08:12:15 +01:00
|
|
|
.shape = SPRITE_SHAPE(64x64),
|
2018-01-14 20:45:44 +01:00
|
|
|
.x = 0,
|
|
|
|
.matrixNum = 0,
|
2019-03-11 08:12:15 +01:00
|
|
|
.size = SPRITE_SIZE(64x64),
|
2018-01-14 20:45:44 +01:00
|
|
|
.tileNum = 0,
|
|
|
|
.priority = 0,
|
|
|
|
.paletteNum = 0,
|
|
|
|
.affineParam = 0,
|
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const struct SpriteFrameImage sImageTable_UnusedBrendan[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
sUnusedBrendan_Gfx, sizeof(sUnusedBrendan_Gfx)
|
2018-01-14 20:45:44 +01:00
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const struct SpriteFrameImage sImageTable_UnusedLass[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
sUnusedLass_Gfx, sizeof(sUnusedLass_Gfx)
|
2018-01-14 20:45:44 +01:00
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const union AnimCmd sSpriteAnim_UnusedBrendanLass[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
ANIMCMD_FRAME(0, 1),
|
|
|
|
ANIMCMD_END
|
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const union AnimCmd *const sSpriteAnimTable_UnusedBrendanLass[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
sSpriteAnim_UnusedBrendanLass
|
2018-01-14 20:45:44 +01:00
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const struct SpriteTemplate sSpriteTemplate_UnusedBrendan =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
.tileTag = 0xFFFF,
|
2020-07-02 10:59:52 +02:00
|
|
|
.paletteTag = 0x100A,
|
2020-06-01 16:17:25 +02:00
|
|
|
.oam = &sOam_UnusedBrendanLass,
|
|
|
|
.anims = sSpriteAnimTable_UnusedBrendanLass,
|
|
|
|
.images = sImageTable_UnusedBrendan,
|
2018-01-14 20:45:44 +01:00
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
2020-06-01 16:17:25 +02:00
|
|
|
.callback = SpriteCb_TrainerPic
|
2018-01-14 20:45:44 +01:00
|
|
|
};
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static const struct SpriteTemplate sSpriteTemplate_UnusedLass =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
.tileTag = 0xFFFF,
|
2020-07-02 10:59:52 +02:00
|
|
|
.paletteTag = 0x100A,
|
2020-06-01 16:17:25 +02:00
|
|
|
.oam = &sOam_UnusedBrendanLass,
|
|
|
|
.anims = sSpriteAnimTable_UnusedBrendanLass,
|
|
|
|
.images = sImageTable_UnusedLass,
|
2018-01-14 20:45:44 +01:00
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
2020-06-01 16:17:25 +02:00
|
|
|
.callback = SpriteCb_TrainerPic
|
2018-01-14 20:45:44 +01:00
|
|
|
};
|
|
|
|
|
2020-07-02 10:59:52 +02:00
|
|
|
static const u16 sFieldEffectPal_Pokeball[] = INCBIN_U16("graphics/field_effects/palettes/pokeball.gbapal");
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2020-07-02 10:59:52 +02:00
|
|
|
const struct SpritePalette gSpritePalette_Pokeball = {sFieldEffectPal_Pokeball, FLDEFF_PAL_TAG_POKEBALL};
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2019-04-16 16:40:32 +02:00
|
|
|
static const u16 sMugshotPal_Sidney[] = INCBIN_U16("graphics/battle_transitions/sidney_bg.gbapal");
|
2018-01-14 22:09:35 +01:00
|
|
|
static const u16 sMugshotPal_Phoebe[] = INCBIN_U16("graphics/battle_transitions/phoebe_bg.gbapal");
|
|
|
|
static const u16 sMugshotPal_Glacia[] = INCBIN_U16("graphics/battle_transitions/glacia_bg.gbapal");
|
|
|
|
static const u16 sMugshotPal_Drake[] = INCBIN_U16("graphics/battle_transitions/drake_bg.gbapal");
|
|
|
|
static const u16 sMugshotPal_Champion[] = INCBIN_U16("graphics/battle_transitions/wallace_bg.gbapal");
|
|
|
|
static const u16 sMugshotPal_Brendan[] = INCBIN_U16("graphics/battle_transitions/brendan_bg.gbapal");
|
|
|
|
static const u16 sMugshotPal_May[] = INCBIN_U16("graphics/battle_transitions/may_bg.gbapal");
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const u16 *const sOpponentMugshotsPals[MUGSHOTS_COUNT] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-05-31 12:41:27 +02:00
|
|
|
[MUGSHOT_SIDNEY] = sMugshotPal_Sidney,
|
|
|
|
[MUGSHOT_PHOEBE] = sMugshotPal_Phoebe,
|
|
|
|
[MUGSHOT_GLACIA] = sMugshotPal_Glacia,
|
|
|
|
[MUGSHOT_DRAKE] = sMugshotPal_Drake,
|
|
|
|
[MUGSHOT_CHAMPION] = sMugshotPal_Champion
|
2018-01-14 20:45:44 +01:00
|
|
|
};
|
|
|
|
|
2020-05-31 12:41:27 +02:00
|
|
|
static const u16 *const sPlayerMugshotsPals[GENDER_COUNT] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-05-31 12:41:27 +02:00
|
|
|
[MALE] = sMugshotPal_Brendan,
|
|
|
|
[FEMALE] = sMugshotPal_May
|
2018-01-14 20:45:44 +01:00
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const u16 sUnusedTrainerPalette[] = INCBIN_U16("graphics/battle_transitions/unused_trainer.gbapal");
|
2020-07-02 10:59:52 +02:00
|
|
|
static const struct SpritePalette sSpritePalette_UnusedTrainer = {sUnusedTrainerPalette, 0x100A};
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const u16 sBigPokeball_Tilemap[] = INCBIN_U16("graphics/battle_transitions/big_pokeball_map.bin");
|
|
|
|
static const u16 sMugshotsTilemap[] = INCBIN_U16("graphics/battle_transitions/elite_four_bg_map.bin");
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static const TransitionStateFunc sPhase2_FrontierLogoWiggle_Funcs[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-07-02 21:45:37 +02:00
|
|
|
Phase2_FrontierLogoWiggle_Func1,
|
|
|
|
Phase2_FrontierLogoWiggle_Func2,
|
2018-01-14 20:45:44 +01:00
|
|
|
Phase2_BigPokeball_Func3,
|
|
|
|
Phase2_BigPokeball_Func4,
|
|
|
|
Phase2_BigPokeball_Func5,
|
|
|
|
Phase2_BigPokeball_Func6
|
|
|
|
};
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static const TransitionStateFunc sPhase2_FrontierLogoWave_Funcs[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-07-02 21:45:37 +02:00
|
|
|
Phase2_FrontierLogoWave_Func1,
|
|
|
|
Phase2_FrontierLogoWave_Func2,
|
|
|
|
Phase2_FrontierLogoWave_Func3,
|
|
|
|
Phase2_FrontierLogoWave_Func4
|
2018-01-14 20:45:44 +01:00
|
|
|
};
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static const TransitionStateFunc sPhase2_FrontierSquares_Funcs[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-07-02 21:45:37 +02:00
|
|
|
Phase2_FrontierSquares_Func1,
|
|
|
|
Phase2_FrontierSquares_Func2,
|
|
|
|
Phase2_FrontierSquares_Func3,
|
|
|
|
Phase2_FrontierSquares_End
|
2018-01-14 20:45:44 +01:00
|
|
|
};
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static const TransitionStateFunc sPhase2_FrontierSquaresSpiral_Funcs[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-07-02 21:45:37 +02:00
|
|
|
Phase2_FrontierSquaresSpiral_Func1,
|
|
|
|
Phase2_FrontierSquaresSpiral_Func2,
|
|
|
|
Phase2_FrontierSquaresSpiral_Func3,
|
|
|
|
Phase2_FrontierSquaresSpiral_Func4,
|
|
|
|
Phase2_FrontierSquares_End
|
2018-01-14 20:45:44 +01:00
|
|
|
};
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static const TransitionStateFunc sPhase2_FrontierSquaresScroll_Funcs[] =
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-07-02 21:45:37 +02:00
|
|
|
Phase2_FrontierSquaresScroll_Func1,
|
|
|
|
Phase2_FrontierSquaresScroll_Func2,
|
|
|
|
Phase2_FrontierSquaresScroll_Func3,
|
|
|
|
Phase2_FrontierSquaresScroll_Func4,
|
|
|
|
Phase2_FrontierSquaresScroll_Func5
|
2018-01-14 20:45:44 +01:00
|
|
|
};
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static const u8 gUnknown_085C9A30[] = {0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x1b, 0x14, 0x0d, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x07, 0x0e, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x13, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x10, 0x11, 0x12};
|
|
|
|
static const u8 gUnknown_085C9A53[] = {0x00, 0x10, 0x29, 0x16, 0x2c, 0x02, 0x2b, 0x15, 0x2e, 0x1b, 0x09, 0x30, 0x26, 0x05, 0x39, 0x3b, 0x0c, 0x3f, 0x23, 0x1c, 0x0a, 0x35, 0x07, 0x31, 0x27, 0x17, 0x37, 0x01, 0x3e, 0x11, 0x3d, 0x1e, 0x06, 0x22, 0x0f, 0x33, 0x20, 0x3a, 0x0d, 0x2d, 0x25, 0x34, 0x0b, 0x18, 0x3c, 0x13, 0x38, 0x21, 0x1d, 0x32, 0x28, 0x36, 0x0e, 0x03, 0x2f, 0x14, 0x12, 0x19, 0x04, 0x24, 0x1a, 0x2a, 0x1f, 0x08, 0x00};
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-01 17:41:34 +01:00
|
|
|
// code
|
|
|
|
static void CB2_TestBattleTransition(void)
|
|
|
|
{
|
|
|
|
switch (sTestingTransitionState)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
LaunchBattleTransitionTask(sTestingTransitionId);
|
|
|
|
sTestingTransitionState++;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
if (IsBattleTransitionDone())
|
|
|
|
{
|
|
|
|
sTestingTransitionState = 0;
|
2018-02-14 00:58:22 +01:00
|
|
|
SetMainCallback2(CB2_ReturnToField);
|
2018-01-01 17:41:34 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
RunTasks();
|
|
|
|
AnimateSprites();
|
|
|
|
BuildOamBuffer();
|
|
|
|
UpdatePaletteFade();
|
|
|
|
}
|
|
|
|
|
|
|
|
void TestBattleTransition(u8 transitionId)
|
|
|
|
{
|
|
|
|
sTestingTransitionId = transitionId;
|
|
|
|
SetMainCallback2(CB2_TestBattleTransition);
|
|
|
|
}
|
|
|
|
|
|
|
|
void BattleTransition_StartOnField(u8 transitionId)
|
|
|
|
{
|
|
|
|
gMain.callback2 = CB2_OverworldBasic;
|
|
|
|
LaunchBattleTransitionTask(transitionId);
|
|
|
|
}
|
|
|
|
|
|
|
|
void BattleTransition_Start(u8 transitionId)
|
|
|
|
{
|
|
|
|
LaunchBattleTransitionTask(transitionId);
|
|
|
|
}
|
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
// in all tasks data[0] is reserved for the state
|
2018-01-01 17:41:34 +01:00
|
|
|
#define tState data[0]
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
// main task that launches sub-tasks for phase1 and phase2
|
|
|
|
#define tTransitionId data[1]
|
2018-01-01 17:41:34 +01:00
|
|
|
#define tTransitionDone data[15]
|
|
|
|
|
|
|
|
bool8 IsBattleTransitionDone(void)
|
|
|
|
{
|
|
|
|
u8 taskId = FindTaskIdByFunc(Task_BattleTransitionMain);
|
|
|
|
if (gTasks[taskId].tTransitionDone)
|
|
|
|
{
|
|
|
|
DestroyTask(taskId);
|
|
|
|
FREE_AND_SET_NULL(sTransitionStructPtr);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void LaunchBattleTransitionTask(u8 transitionId)
|
2018-01-01 17:41:34 +01:00
|
|
|
{
|
|
|
|
u8 taskId = CreateTask(Task_BattleTransitionMain, 2);
|
2018-01-14 20:45:44 +01:00
|
|
|
gTasks[taskId].tTransitionId = transitionId;
|
2018-01-01 17:41:34 +01:00
|
|
|
sTransitionStructPtr = AllocZeroed(sizeof(*sTransitionStructPtr));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Task_BattleTransitionMain(u8 taskId)
|
2018-01-01 17:41:34 +01:00
|
|
|
{
|
|
|
|
while (sMainTransitionPhases[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Transition_Phase1(struct Task *task)
|
2018-01-01 17:41:34 +01:00
|
|
|
{
|
2018-12-08 19:05:03 +01:00
|
|
|
SetWeatherScreenFadeOut();
|
2018-01-01 17:41:34 +01:00
|
|
|
CpuCopy32(gPlttBufferFaded, gPlttBufferUnfaded, 0x400);
|
2018-01-14 20:45:44 +01:00
|
|
|
if (sPhase1_Tasks[task->tTransitionId] != NULL)
|
2018-01-01 17:41:34 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
CreateTask(sPhase1_Tasks[task->tTransitionId], 4);
|
2018-01-01 17:41:34 +01:00
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
task->tState = 2;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
}
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Transition_WaitForPhase1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2021-02-20 05:22:26 +01:00
|
|
|
if (FindTaskIdByFunc(sPhase1_Tasks[task->tTransitionId]) == TASK_NONE)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
task->tState++;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Transition_Phase2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
CreateTask(sPhase2_Tasks[task->tTransitionId], 0);
|
2018-01-02 20:38:33 +01:00
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Transition_WaitForPhase2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
task->tTransitionDone = FALSE;
|
2021-02-20 05:22:26 +01:00
|
|
|
if (FindTaskIdByFunc(sPhase2_Tasks[task->tTransitionId]) == TASK_NONE)
|
2018-01-02 20:38:33 +01:00
|
|
|
task->tTransitionDone = TRUE;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
#undef tTransitionId
|
2018-01-02 20:38:33 +01:00
|
|
|
#undef tTransitionDone
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase1Task_TransitionAll(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
if (gTasks[taskId].tState == 0)
|
|
|
|
{
|
|
|
|
gTasks[taskId].tState++;
|
|
|
|
CreatePhase1Task(0, 0, 3, 2, 2); // creates a sub-task for this sub-task
|
|
|
|
}
|
|
|
|
else if (IsPhase1Done())
|
|
|
|
{
|
|
|
|
DestroyTask(taskId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// sub-task for phase2
|
2018-01-14 20:45:44 +01:00
|
|
|
#define tData1 data[1]
|
|
|
|
#define tData2 data[2]
|
|
|
|
#define tData3 data[3]
|
|
|
|
#define tData4 data[4]
|
|
|
|
#define tData5 data[5]
|
|
|
|
#define tData6 data[6]
|
|
|
|
#define tFuncState data[7]
|
2018-01-02 20:38:33 +01:00
|
|
|
#define tFrames data[8]
|
|
|
|
#define tOpponentSpriteId data[13]
|
|
|
|
#define tPlayerSpriteId data[14]
|
|
|
|
#define tMugshotId data[15]
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Blur(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Blur_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Blur_Func1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
SetGpuReg(REG_OFFSET_MOSAIC, 0);
|
|
|
|
SetGpuRegBits(REG_OFFSET_BG1CNT, BGCNT_MOSAIC);
|
|
|
|
SetGpuRegBits(REG_OFFSET_BG2CNT, BGCNT_MOSAIC);
|
|
|
|
SetGpuRegBits(REG_OFFSET_BG3CNT, BGCNT_MOSAIC);
|
|
|
|
task->tState++;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Blur_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData1 != 0)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1--;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 = 4;
|
|
|
|
if (++task->tData2 == 10)
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 0x10, RGB_BLACK);
|
2018-01-14 20:45:44 +01:00
|
|
|
SetGpuReg(REG_OFFSET_MOSAIC, (task->tData2 & 15) * 17);
|
|
|
|
if (task->tData2 > 14)
|
2018-01-02 20:38:33 +01:00
|
|
|
task->tState++;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Blur_Func3(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
if (!gPaletteFade.active)
|
|
|
|
{
|
|
|
|
u8 taskId = FindTaskIdByFunc(Phase2Task_Blur);
|
|
|
|
DestroyTask(taskId);
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Swirl(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Swirl_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Swirl_Func1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
InitTransitionStructVars();
|
2018-01-29 17:47:12 +01:00
|
|
|
ScanlineEffect_Clear();
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_ALL, 4, 0, 0x10, RGB_BLACK);
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_8149F98(gScanlineEffectRegBuffers[1], sTransitionStructPtr->field_14, 0, 2, 0, 160);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
SetVBlankCallback(VBlankCB_Phase2_Swirl);
|
|
|
|
SetHBlankCallback(HBlankCB_Phase2_Swirl);
|
|
|
|
|
|
|
|
EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK);
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Swirl_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 += 4;
|
|
|
|
task->tData2 += 8;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_8149F98(gScanlineEffectRegBuffers[0], sTransitionStructPtr->field_14, task->tData1, 2, task->tData2, 160);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
if (!gPaletteFade.active)
|
|
|
|
{
|
|
|
|
u8 taskId = FindTaskIdByFunc(Phase2Task_Swirl);
|
|
|
|
DestroyTask(taskId);
|
|
|
|
}
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB_Phase2_Swirl(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
VBlankCB_BattleTransition();
|
|
|
|
if (sTransitionStructPtr->VBlank_DMA)
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void HBlankCB_Phase2_Swirl(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
|
2018-01-02 20:38:33 +01:00
|
|
|
REG_BG1HOFS = var;
|
|
|
|
REG_BG2HOFS = var;
|
|
|
|
REG_BG3HOFS = var;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Shuffle(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Shuffle_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Shuffle_Func1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
InitTransitionStructVars();
|
2018-01-29 17:47:12 +01:00
|
|
|
ScanlineEffect_Clear();
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_ALL, 4, 0, 0x10, RGB_BLACK);
|
2018-01-29 17:47:12 +01:00
|
|
|
memset(gScanlineEffectRegBuffers[1], sTransitionStructPtr->field_16, 0x140);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
SetVBlankCallback(VBlankCB_Phase2_Shuffle);
|
|
|
|
SetHBlankCallback(HBlankCB_Phase2_Shuffle);
|
|
|
|
|
|
|
|
EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK);
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Shuffle_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
u16 r3, r4;
|
|
|
|
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-14 20:45:44 +01:00
|
|
|
r4 = task->tData1;
|
|
|
|
r3 = task->tData2 >> 8;
|
|
|
|
task->tData1 += 4224;
|
|
|
|
task->tData2 += 384;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 160; i++, r4 += 4224)
|
|
|
|
{
|
|
|
|
u16 var = r4 / 256;
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_16 + Sin(var, r3);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!gPaletteFade.active)
|
|
|
|
DestroyTask(FindTaskIdByFunc(Phase2Task_Shuffle));
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB_Phase2_Shuffle(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
VBlankCB_BattleTransition();
|
|
|
|
if (sTransitionStructPtr->VBlank_DMA)
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void HBlankCB_Phase2_Shuffle(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
|
2018-01-02 20:38:33 +01:00
|
|
|
REG_BG1VOFS = var;
|
|
|
|
REG_BG2VOFS = var;
|
|
|
|
REG_BG3VOFS = var;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_BigPokeball(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_BigPokeball_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Aqua(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Aqua_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Magma(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Magma_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Regice(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Regice_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Registeel(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Registeel_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Regirock(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Regirock_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Kyogre(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Kyogre_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void sub_814669C(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
InitTransitionStructVars();
|
2018-01-29 17:47:12 +01:00
|
|
|
ScanlineEffect_Clear();
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 = 16;
|
|
|
|
task->tData2 = 0;
|
|
|
|
task->tData4 = 0;
|
|
|
|
task->tData5 = 0x4000;
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->WININ = WININ_WIN0_ALL;
|
2018-01-02 20:38:33 +01:00
|
|
|
sTransitionStructPtr->WINOUT = 0;
|
2021-04-15 08:04:01 +02:00
|
|
|
sTransitionStructPtr->WIN0H = DISPLAY_WIDTH;
|
|
|
|
sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT;
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->BLDCNT = BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL;
|
|
|
|
sTransitionStructPtr->BLDALPHA = BLDALPHA_BLEND(task->tData2, task->tData1);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 160; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[1][i] = 240;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
SetVBlankCallback(VBlankCB0_Phase2_BigPokeball);
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Aqua_Func1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
task->tFrames = 60;
|
|
|
|
sub_814669C(task);
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
CpuFill16(0, tilemap, 0x800);
|
|
|
|
LZ77UnCompVram(sTeamAqua_Tileset, tileset);
|
2018-01-02 20:38:33 +01:00
|
|
|
LoadPalette(sEvilTeam_Palette, 0xF0, 0x20);
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Magma_Func1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
task->tFrames = 60;
|
|
|
|
sub_814669C(task);
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
CpuFill16(0, tilemap, 0x800);
|
|
|
|
LZ77UnCompVram(sTeamMagma_Tileset, tileset);
|
2018-01-02 20:38:33 +01:00
|
|
|
LoadPalette(sEvilTeam_Palette, 0xF0, 0x20);
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Regi_Func1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
task->tFrames = 60;
|
|
|
|
sub_814669C(task);
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
CpuFill16(0, tilemap, 0x800);
|
|
|
|
CpuCopy16(sRegis_Tileset, tileset, 0x2000);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_BigPokeball_Func1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
sub_814669C(task);
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
CpuFill16(0, tilemap, 0x800);
|
|
|
|
CpuCopy16(sBigPokeball_Tileset, tileset, 0x580);
|
2020-07-02 10:59:52 +02:00
|
|
|
LoadPalette(sFieldEffectPal_Pokeball, 0xF0, 0x20);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_BigPokeball_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
s16 i, j;
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-02 20:38:33 +01:00
|
|
|
const u16 *BigPokeballMap;
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
2018-01-02 20:38:33 +01:00
|
|
|
BigPokeballMap = sBigPokeball_Tilemap;
|
|
|
|
for (i = 0; i < 20; i++)
|
|
|
|
{
|
|
|
|
for (j = 0; j < 30; j++, BigPokeballMap++)
|
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
tilemap[i * 32 + j] = *BigPokeballMap | 0xF000;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
}
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Aqua_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
LZ77UnCompVram(sTeamAqua_Tilemap, tilemap);
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Magma_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
LZ77UnCompVram(sTeamMagma_Tilemap, tilemap);
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Regice_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
LoadPalette(sRegice_Palette, 0xF0, 0x20);
|
|
|
|
CpuCopy16(sRegice_Tilemap, tilemap, 0x500);
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Registeel_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
LoadPalette(sRegisteel_Palette, 0xF0, 0x20);
|
|
|
|
CpuCopy16(sRegisteel_Tilemap, tilemap, 0x500);
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Regirock_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
LoadPalette(sRegirock_Palette, 0xF0, 0x20);
|
|
|
|
CpuCopy16(sRegirock_Tilemap, tilemap, 0x500);
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Kyogre_Func3(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
CpuFill16(0, tilemap, 0x800);
|
|
|
|
LZ77UnCompVram(sKyogre_Tileset, tileset);
|
|
|
|
LZ77UnCompVram(sKyogre_Tilemap, tilemap);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Kyogre_Func4(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData1 % 3 == 0)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
u16 var = task->tData1 % 30;
|
2018-01-02 20:38:33 +01:00
|
|
|
var /= 3;
|
2020-06-01 16:17:25 +02:00
|
|
|
LoadPalette(sKyogre1_Palette + (var * 16), 0xF0, 0x20);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
2018-01-14 20:45:44 +01:00
|
|
|
if (++task->tData1 > 58)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
task->tState++;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 = 0;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Kyogre_Func5(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData1 % 5 == 0)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
s16 var = task->tData1 / 5;
|
2020-06-01 16:17:25 +02:00
|
|
|
LoadPalette(sKyogre2_Palette + (var * 16), 0xF0, 0x20);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
2018-01-14 20:45:44 +01:00
|
|
|
if (++task->tData1 > 68)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
task->tState++;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 = 0;
|
2018-01-02 20:38:33 +01:00
|
|
|
task->tFrames = 30;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_WeatherDuo_Func6(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_OBJECTS | 0x8000, 1, 0, 0x10, RGB_BLACK);
|
2018-01-02 20:38:33 +01:00
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_WeatherDuo_Func7(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
if (!gPaletteFade.active)
|
|
|
|
{
|
|
|
|
DmaStop(0);
|
2020-06-01 16:17:25 +02:00
|
|
|
FadeScreenBlack();
|
2018-01-02 20:38:33 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(task->func));
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_BigPokeball_Func3(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData3 == 0 || --task->tData3 == 0)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData2++;
|
|
|
|
task->tData3 = 2;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->BLDALPHA = BLDALPHA_BLEND(task->tData2, task->tData1);
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData2 > 15)
|
2018-01-02 20:38:33 +01:00
|
|
|
task->tState++;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData4 += 8;
|
|
|
|
task->tData5 -= 256;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_BigPokeball_Func4(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData3 == 0 || --task->tData3 == 0)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1--;
|
|
|
|
task->tData3 = 2;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->BLDALPHA = BLDALPHA_BLEND(task->tData2, task->tData1);
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData1 == 0)
|
2018-01-02 20:38:33 +01:00
|
|
|
task->tState++;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData4 += 8;
|
|
|
|
task->tData5 -= 256;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_BigPokeball_Func5(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData4 += 8;
|
|
|
|
task->tData5 -= 256;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData5 <= 0)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
task->tState++;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 = 160;
|
|
|
|
task->tData2 = 256;
|
|
|
|
task->tData3 = 0;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_FramesCountdown(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
if (--task->tFrames == 0)
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_WeatherTrio_Func1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_BG, 1, 0, 0x10, RGB_BLACK);
|
2018-01-02 20:38:33 +01:00
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_WaitPaletteFade(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
if (!gPaletteFade.active)
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_BigPokeball_Func6(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData2 < 1024)
|
|
|
|
task->tData2 += 128;
|
|
|
|
if (task->tData1 != 0)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 -= (task->tData2 >> 8);
|
|
|
|
if (task->tData1 < 0)
|
|
|
|
task->tData1 = 0;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_814A014(gScanlineEffectRegBuffers[0], 120, 80, task->tData1);
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData1 == 0)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
SetVBlankCallback(NULL);
|
|
|
|
DmaStop(0);
|
2020-06-01 16:17:25 +02:00
|
|
|
FadeScreenBlack();
|
2018-01-02 20:38:33 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(task->func));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData3 == 0)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData3++;
|
2018-01-02 20:38:33 +01:00
|
|
|
SetVBlankCallback(VBlankCB1_Phase2_BigPokeball);
|
|
|
|
}
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Transition_BigPokeball_Vblank(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
|
|
|
VBlankCB_BattleTransition();
|
|
|
|
if (sTransitionStructPtr->VBlank_DMA)
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
|
2018-01-02 20:38:33 +01:00
|
|
|
REG_WININ = sTransitionStructPtr->WININ;
|
|
|
|
REG_WINOUT = sTransitionStructPtr->WINOUT;
|
|
|
|
REG_WIN0V = sTransitionStructPtr->WIN0V;
|
|
|
|
REG_BLDCNT = sTransitionStructPtr->BLDCNT;
|
|
|
|
REG_BLDALPHA = sTransitionStructPtr->BLDALPHA;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB0_Phase2_BigPokeball(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Transition_BigPokeball_Vblank();
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaSet(0, gScanlineEffectRegBuffers[1], ®_BG0HOFS, 0xA2400001);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB1_Phase2_BigPokeball(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
Transition_BigPokeball_Vblank();
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_PokeballsTrail(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_PokeballsTrail_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_PokeballsTrail_Func1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
CpuSet(sPokeballTrail_Tileset, tileset, 0x20);
|
|
|
|
CpuFill32(0, tilemap, 0x800);
|
2020-07-02 10:59:52 +02:00
|
|
|
LoadPalette(sFieldEffectPal_Pokeball, 0xF0, 0x20);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_PokeballsTrail_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
s16 i;
|
|
|
|
s16 rand;
|
|
|
|
s16 arr0[ARRAY_COUNT(sUnknown_085C8B88)];
|
|
|
|
s16 arr1[ARRAY_COUNT(sUnknown_085C8B8C)];
|
|
|
|
|
|
|
|
memcpy(arr0, sUnknown_085C8B88, sizeof(sUnknown_085C8B88));
|
|
|
|
memcpy(arr1, sUnknown_085C8B8C, sizeof(sUnknown_085C8B8C));
|
|
|
|
rand = Random() & 1;
|
|
|
|
for (i = 0; i <= 4; i++, rand ^= 1)
|
|
|
|
{
|
|
|
|
gFieldEffectArguments[0] = arr0[rand]; // x
|
|
|
|
gFieldEffectArguments[1] = (i * 32) + 16; // y
|
|
|
|
gFieldEffectArguments[2] = rand;
|
|
|
|
gFieldEffectArguments[3] = arr1[i];
|
|
|
|
FieldEffectStart(FLDEFF_POKEBALL);
|
|
|
|
}
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_PokeballsTrail_Func3(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
if (!FieldEffectActiveListContains(FLDEFF_POKEBALL))
|
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
FadeScreenBlack();
|
2018-01-02 20:38:33 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(Phase2Task_PokeballsTrail));
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 FldEff_Pokeball(void)
|
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Pokeball, gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
|
2018-01-02 20:38:33 +01:00
|
|
|
gSprites[spriteId].oam.priority = 0;
|
2019-12-05 03:00:45 +01:00
|
|
|
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
|
2018-01-02 20:38:33 +01:00
|
|
|
gSprites[spriteId].data[0] = gFieldEffectArguments[2];
|
|
|
|
gSprites[spriteId].data[1] = gFieldEffectArguments[3];
|
|
|
|
gSprites[spriteId].data[2] = -1;
|
|
|
|
InitSpriteAffineAnim(&gSprites[spriteId]);
|
|
|
|
StartSpriteAffineAnim(&gSprites[spriteId], gFieldEffectArguments[2]);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SOME_VRAM_STORE(ptr, posY, posX, toStore) \
|
|
|
|
{ \
|
|
|
|
u32 index = (posY) * 32 + posX; \
|
|
|
|
ptr[index] = toStore; \
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void sub_814713C(struct Sprite *sprite)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
s16 arr0[ARRAY_COUNT(sUnknown_085C8B96)];
|
|
|
|
|
|
|
|
memcpy(arr0, sUnknown_085C8B96, sizeof(sUnknown_085C8B96));
|
|
|
|
if (sprite->data[1] != 0)
|
|
|
|
{
|
|
|
|
sprite->data[1]--;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-04-15 08:04:01 +02:00
|
|
|
if (sprite->pos1.x >= 0 && sprite->pos1.x <= DISPLAY_WIDTH)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
s16 posX = sprite->pos1.x >> 3;
|
|
|
|
s16 posY = sprite->pos1.y >> 3;
|
|
|
|
|
|
|
|
if (posX != sprite->data[2])
|
|
|
|
{
|
|
|
|
u32 var;
|
|
|
|
u16 *ptr;
|
|
|
|
|
|
|
|
sprite->data[2] = posX;
|
2020-06-01 16:17:25 +02:00
|
|
|
var = (((REG_BG0CNT >> 8) & 0x1F) << 11);
|
2018-01-02 20:38:33 +01:00
|
|
|
ptr = (u16 *)(VRAM + var);
|
|
|
|
|
|
|
|
SOME_VRAM_STORE(ptr, posY - 2, posX, 0xF001);
|
|
|
|
SOME_VRAM_STORE(ptr, posY - 1, posX, 0xF001);
|
|
|
|
SOME_VRAM_STORE(ptr, posY - 0, posX, 0xF001);
|
|
|
|
SOME_VRAM_STORE(ptr, posY + 1, posX, 0xF001);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sprite->pos1.x += arr0[sprite->data[0]];
|
|
|
|
if (sprite->pos1.x < -15 || sprite->pos1.x > 255)
|
|
|
|
FieldEffectStop(sprite, FLDEFF_POKEBALL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Clockwise_BlackFade(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Clockwise_BlackFade_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Clockwise_BlackFade_Func1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
u16 i;
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
InitTransitionStructVars();
|
2018-01-29 17:47:12 +01:00
|
|
|
ScanlineEffect_Clear();
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
sTransitionStructPtr->WININ = 0;
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->WINOUT = WINOUT_WIN01_ALL;
|
2018-01-16 21:37:46 +01:00
|
|
|
sTransitionStructPtr->WIN0H = -3855;
|
2021-04-15 08:04:01 +02:00
|
|
|
sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 160; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[1][i] = 0xF3F4;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
SetVBlankCallback(VBlankCB_Phase2_Clockwise_BlackFade);
|
|
|
|
sTransitionStructPtr->data[4] = 120;
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Clockwise_BlackFade_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
sub_814A1AC(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->data[4], -1, 1, 1);
|
|
|
|
do
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (sTransitionStructPtr->data[2] + 1) | 0x7800;
|
2018-01-02 20:38:33 +01:00
|
|
|
} while (!sub_814A228(sTransitionStructPtr->data, 1, 1));
|
|
|
|
|
|
|
|
sTransitionStructPtr->data[4] += 16;
|
|
|
|
if (sTransitionStructPtr->data[4] >= 240)
|
|
|
|
{
|
|
|
|
sTransitionStructPtr->data[5] = 0;
|
|
|
|
task->tState++;
|
|
|
|
}
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Clockwise_BlackFade_Func3(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
s16 r1, r3;
|
|
|
|
vu8 var = 0;
|
|
|
|
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
sub_814A1AC(sTransitionStructPtr->data, 120, 80, 240, sTransitionStructPtr->data[5], 1, 1);
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
r1 = 120, r3 = sTransitionStructPtr->data[2] + 1;
|
|
|
|
if (sTransitionStructPtr->data[5] >= 80)
|
|
|
|
r1 = sTransitionStructPtr->data[2], r3 = 240;
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (r3) | (r1 << 8);
|
2018-01-02 20:38:33 +01:00
|
|
|
if (var != 0)
|
|
|
|
break;
|
|
|
|
var = sub_814A228(sTransitionStructPtr->data, 1, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
sTransitionStructPtr->data[5] += 8;
|
|
|
|
if (sTransitionStructPtr->data[5] >= 160)
|
|
|
|
{
|
|
|
|
sTransitionStructPtr->data[4] = 240;
|
|
|
|
task->tState++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
while (sTransitionStructPtr->data[3] < sTransitionStructPtr->data[5])
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[0][++sTransitionStructPtr->data[3]] = (r3) | (r1 << 8);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Clockwise_BlackFade_Func4(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
sub_814A1AC(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->data[4], 160, 1, 1);
|
|
|
|
do
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (sTransitionStructPtr->data[2] << 8) | 0xF0;
|
2018-01-02 20:38:33 +01:00
|
|
|
} while (!sub_814A228(sTransitionStructPtr->data, 1, 1));
|
|
|
|
|
|
|
|
sTransitionStructPtr->data[4] -= 16;
|
|
|
|
if (sTransitionStructPtr->data[4] <= 0)
|
|
|
|
{
|
|
|
|
sTransitionStructPtr->data[5] = 160;
|
|
|
|
task->tState++;
|
|
|
|
}
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Clockwise_BlackFade_Func5(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
s16 r1, r2, var4;
|
|
|
|
vu8 var = 0;
|
|
|
|
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
sub_814A1AC(sTransitionStructPtr->data, 120, 80, 0, sTransitionStructPtr->data[5], 1, 1);
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
r1 = (gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]]) & 0xFF;
|
2018-01-02 20:38:33 +01:00
|
|
|
r2 = sTransitionStructPtr->data[2];
|
|
|
|
if (sTransitionStructPtr->data[5] <= 80)
|
|
|
|
r2 = 120, r1 = sTransitionStructPtr->data[2];
|
|
|
|
var4 = (r1) | (r2 << 8);
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = var4;
|
2018-01-02 20:38:33 +01:00
|
|
|
if (var != 0)
|
|
|
|
break;
|
|
|
|
var = sub_814A228(sTransitionStructPtr->data, 1, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
sTransitionStructPtr->data[5] -= 8;
|
|
|
|
if (sTransitionStructPtr->data[5] <= 0)
|
|
|
|
{
|
|
|
|
sTransitionStructPtr->data[4] = 0;
|
|
|
|
task->tState++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
while (sTransitionStructPtr->data[3] > sTransitionStructPtr->data[5])
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[0][--sTransitionStructPtr->data[3]] = (r1) | (r2 << 8);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Clockwise_BlackFade_Func6(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
sub_814A1AC(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->data[4], 0, 1, 1);
|
|
|
|
do
|
|
|
|
{
|
|
|
|
s16 r2, r3;
|
|
|
|
|
|
|
|
r2 = 120, r3 = sTransitionStructPtr->data[2];
|
|
|
|
if (sTransitionStructPtr->data[2] >= 120)
|
|
|
|
r2 = 0, r3 = 240;
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (r3) | (r2 << 8);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
} while (!sub_814A228(sTransitionStructPtr->data, 1, 1));
|
|
|
|
|
|
|
|
sTransitionStructPtr->data[4] += 16;
|
|
|
|
if (sTransitionStructPtr->data[2] > 120)
|
|
|
|
task->tState++;
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Clockwise_BlackFade_Func7(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
2020-06-01 16:17:25 +02:00
|
|
|
FadeScreenBlack();
|
2018-01-02 20:38:33 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(Phase2Task_Clockwise_BlackFade));
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB_Phase2_Clockwise_BlackFade(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
|
|
|
VBlankCB_BattleTransition();
|
|
|
|
if (sTransitionStructPtr->VBlank_DMA != 0)
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
|
2018-01-02 20:38:33 +01:00
|
|
|
REG_WININ = sTransitionStructPtr->WININ;
|
|
|
|
REG_WINOUT = sTransitionStructPtr->WINOUT;
|
|
|
|
REG_WIN0V = sTransitionStructPtr->WIN0V;
|
2018-01-29 17:47:12 +01:00
|
|
|
REG_WIN0H = gScanlineEffectRegBuffers[1][0];
|
|
|
|
DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Ripple(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Ripple_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Ripple_Func1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
InitTransitionStructVars();
|
2018-01-29 17:47:12 +01:00
|
|
|
ScanlineEffect_Clear();
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 160; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_16;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
SetVBlankCallback(VBlankCB_Phase2_Ripple);
|
|
|
|
SetHBlankCallback(HBlankCB_Phase2_Ripple);
|
|
|
|
|
|
|
|
EnableInterrupts(INTR_FLAG_HBLANK);
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Ripple_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
s16 r3;
|
|
|
|
u16 r4, r8;
|
|
|
|
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
r3 = task->tData2 >> 8;
|
|
|
|
r4 = task->tData1;
|
2018-01-02 20:38:33 +01:00
|
|
|
r8 = 384;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 += 0x400;
|
|
|
|
if (task->tData2 <= 0x1FFF)
|
|
|
|
task->tData2 += 0x180;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 160; i++, r4 += r8)
|
|
|
|
{
|
|
|
|
s16 var = r4 >> 8;
|
2020-09-19 19:37:24 +02:00
|
|
|
gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_16 + Sin(var & 0xffff, r3);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
if (++task->tData3 == 81)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData4++;
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 0x10, RGB_BLACK);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData4 != 0 && !gPaletteFade.active)
|
2018-01-02 20:38:33 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(Phase2Task_Ripple));
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB_Phase2_Ripple(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
VBlankCB_BattleTransition();
|
|
|
|
if (sTransitionStructPtr->VBlank_DMA)
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void HBlankCB_Phase2_Ripple(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
|
2018-01-02 20:38:33 +01:00
|
|
|
REG_BG1VOFS = var;
|
|
|
|
REG_BG2VOFS = var;
|
|
|
|
REG_BG3VOFS = var;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Wave(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Wave_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Wave_Func1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
InitTransitionStructVars();
|
2018-01-29 17:47:12 +01:00
|
|
|
ScanlineEffect_Clear();
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->WININ = WININ_WIN0_ALL;
|
2018-01-02 20:38:33 +01:00
|
|
|
sTransitionStructPtr->WINOUT = 0;
|
2021-04-15 08:04:01 +02:00
|
|
|
sTransitionStructPtr->WIN0H = DISPLAY_WIDTH;
|
|
|
|
sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 160; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[1][i] = 242;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
SetVBlankCallback(VBlankCB_Phase2_Wave);
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Wave_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
u8 i, r5;
|
|
|
|
u16* toStore;
|
|
|
|
bool8 nextFunc;
|
|
|
|
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-29 17:47:12 +01:00
|
|
|
toStore = gScanlineEffectRegBuffers[0];
|
2018-01-14 20:45:44 +01:00
|
|
|
r5 = task->tData2;
|
|
|
|
task->tData2 += 16;
|
|
|
|
task->tData1 += 8;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
for (i = 0, nextFunc = TRUE; i < 160; i++, r5 += 4, toStore++)
|
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
s16 value = task->tData1 + Sin(r5, 40);
|
2018-01-02 20:38:33 +01:00
|
|
|
if (value < 0)
|
|
|
|
value = 0;
|
|
|
|
if (value > 240)
|
|
|
|
value = 240;
|
|
|
|
*toStore = (value << 8) | (0xF1);
|
|
|
|
if (value < 240)
|
|
|
|
nextFunc = FALSE;
|
|
|
|
}
|
|
|
|
if (nextFunc)
|
|
|
|
task->tState++;
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Wave_Func3(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
2020-06-01 16:17:25 +02:00
|
|
|
FadeScreenBlack();
|
2018-01-02 20:38:33 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(Phase2Task_Wave));
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB_Phase2_Wave(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
|
|
|
VBlankCB_BattleTransition();
|
|
|
|
if (sTransitionStructPtr->VBlank_DMA != 0)
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
|
2018-01-02 20:38:33 +01:00
|
|
|
REG_WININ = sTransitionStructPtr->WININ;
|
|
|
|
REG_WINOUT = sTransitionStructPtr->WINOUT;
|
|
|
|
REG_WIN0V = sTransitionStructPtr->WIN0V;
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2019-04-16 16:40:32 +02:00
|
|
|
static void Phase2Task_Sidney(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2019-04-16 16:40:32 +02:00
|
|
|
gTasks[taskId].tMugshotId = MUGSHOT_SIDNEY;
|
2018-01-02 20:38:33 +01:00
|
|
|
Phase2Task_MugShotTransition(taskId);
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Phoebe(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
gTasks[taskId].tMugshotId = MUGSHOT_PHOEBE;
|
|
|
|
Phase2Task_MugShotTransition(taskId);
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Glacia(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
gTasks[taskId].tMugshotId = MUGSHOT_GLACIA;
|
|
|
|
Phase2Task_MugShotTransition(taskId);
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Drake(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
gTasks[taskId].tMugshotId = MUGSHOT_DRAKE;
|
|
|
|
Phase2Task_MugShotTransition(taskId);
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Champion(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
gTasks[taskId].tMugshotId = MUGSHOT_CHAMPION;
|
|
|
|
Phase2Task_MugShotTransition(taskId);
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_MugShotTransition(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Mugshot_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Mugshot_Func1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
InitTransitionStructVars();
|
2018-01-29 17:47:12 +01:00
|
|
|
ScanlineEffect_Clear();
|
2018-01-02 20:38:33 +01:00
|
|
|
Mugshots_CreateOpponentPlayerSprites(task);
|
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 = 0;
|
|
|
|
task->tData2 = 1;
|
|
|
|
task->tData3 = 239;
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->WININ = WININ_WIN0_ALL;
|
|
|
|
sTransitionStructPtr->WINOUT = WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR;
|
2021-04-15 08:04:01 +02:00
|
|
|
sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 160; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[1][i] = 0xF0F1;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
SetVBlankCallback(VBlankCB0_Phase2_Mugshots);
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Mugshot_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
s16 i, j;
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
|
|
|
const u16 *mugshotsMap;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
mugshotsMap = sMugshotsTilemap;
|
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
CpuSet(sEliteFour_Tileset, tileset, 0xF0);
|
2018-01-02 20:38:33 +01:00
|
|
|
LoadPalette(sOpponentMugshotsPals[task->tMugshotId], 0xF0, 0x20);
|
|
|
|
LoadPalette(sPlayerMugshotsPals[gSaveBlock2Ptr->playerGender], 0xFA, 0xC);
|
|
|
|
|
|
|
|
for (i = 0; i < 20; i++)
|
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
for (j = 0; j < 32; j++, mugshotsMap++)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
tilemap[i * 32 + j] = *mugshotsMap | 0xF000;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
EnableInterrupts(INTR_FLAG_HBLANK);
|
|
|
|
|
|
|
|
SetHBlankCallback(HBlankCB_Phase2_Mugshots);
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Mugshot_Func3(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
u8 i, r5;
|
|
|
|
u16* toStore;
|
|
|
|
s16 value;
|
|
|
|
s32 mergedValue;
|
|
|
|
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-29 17:47:12 +01:00
|
|
|
toStore = gScanlineEffectRegBuffers[0];
|
2018-01-14 20:45:44 +01:00
|
|
|
r5 = task->tData1;
|
|
|
|
task->tData1 += 0x10;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 80; i++, toStore++, r5 += 0x10)
|
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
value = task->tData2 + Sin(r5, 0x10);
|
2018-01-02 20:38:33 +01:00
|
|
|
if (value < 0)
|
|
|
|
value = 1;
|
|
|
|
if (value > 0xF0)
|
|
|
|
value = 0xF0;
|
|
|
|
*toStore = value;
|
|
|
|
}
|
|
|
|
for (; i < 160; i++, toStore++, r5 += 0x10)
|
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
value = task->tData3 - Sin(r5, 0x10);
|
2018-01-02 20:38:33 +01:00
|
|
|
if (value < 0)
|
|
|
|
value = 0;
|
|
|
|
if (value > 0xEF)
|
|
|
|
value = 0xEF;
|
|
|
|
*toStore = (value << 8) | (0xF0);
|
|
|
|
}
|
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData2 += 8;
|
|
|
|
task->tData3 -= 8;
|
|
|
|
if (task->tData2 > 0xF0)
|
|
|
|
task->tData2 = 0xF0;
|
|
|
|
if (task->tData3 < 0)
|
|
|
|
task->tData3 = 0;
|
|
|
|
mergedValue = *(s32*)(&task->tData2);
|
2018-01-02 20:38:33 +01:00
|
|
|
if (mergedValue == 0xF0)
|
|
|
|
task->tState++;
|
|
|
|
|
2018-01-16 21:37:46 +01:00
|
|
|
sTransitionStructPtr->BG0HOFS_1 -= 8;
|
|
|
|
sTransitionStructPtr->BG0HOFS_2 += 8;
|
2018-01-02 20:38:33 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Mugshot_Func4(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
u16* toStore;
|
|
|
|
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-29 17:47:12 +01:00
|
|
|
for (i = 0, toStore = gScanlineEffectRegBuffers[0]; i < 160; i++, toStore++)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
*toStore = 0xF0;
|
|
|
|
}
|
|
|
|
|
|
|
|
task->tState++;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 = 0;
|
|
|
|
task->tData2 = 0;
|
|
|
|
task->tData3 = 0;
|
2018-01-16 21:37:46 +01:00
|
|
|
sTransitionStructPtr->BG0HOFS_1 -= 8;
|
|
|
|
sTransitionStructPtr->BG0HOFS_2 += 8;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
SetTrainerPicSlideTable(task->tOpponentSpriteId, 0);
|
|
|
|
SetTrainerPicSlideTable(task->tPlayerSpriteId, 1);
|
|
|
|
IncrementTrainerPicState(task->tOpponentSpriteId);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2020-08-21 00:02:00 +02:00
|
|
|
PlaySE(SE_MUGSHOT);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Mugshot_Func5(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-16 21:37:46 +01:00
|
|
|
sTransitionStructPtr->BG0HOFS_1 -= 8;
|
|
|
|
sTransitionStructPtr->BG0HOFS_2 += 8;
|
2020-06-01 16:17:25 +02:00
|
|
|
if (IsTrainerPicSlideDone(task->tOpponentSpriteId))
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
task->tState++;
|
2020-06-01 16:17:25 +02:00
|
|
|
IncrementTrainerPicState(task->tPlayerSpriteId);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Mugshot_Func6(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-16 21:37:46 +01:00
|
|
|
sTransitionStructPtr->BG0HOFS_1 -= 8;
|
|
|
|
sTransitionStructPtr->BG0HOFS_2 += 8;
|
2020-06-01 16:17:25 +02:00
|
|
|
if (IsTrainerPicSlideDone(task->tPlayerSpriteId))
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-02 20:38:33 +01:00
|
|
|
SetVBlankCallback(NULL);
|
|
|
|
DmaStop(0);
|
2018-01-29 17:47:12 +01:00
|
|
|
memset(gScanlineEffectRegBuffers[0], 0, 0x140);
|
|
|
|
memset(gScanlineEffectRegBuffers[1], 0, 0x140);
|
2021-04-15 08:04:01 +02:00
|
|
|
SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH);
|
2018-01-02 20:38:33 +01:00
|
|
|
SetGpuReg(REG_OFFSET_BLDY, 0);
|
|
|
|
task->tState++;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData3 = 0;
|
|
|
|
task->tData4 = 0;
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->BLDCNT = BLDCNT_TGT1_ALL | BLDCNT_EFFECT_LIGHTEN;
|
2018-01-02 20:38:33 +01:00
|
|
|
SetVBlankCallback(VBlankCB1_Phase2_Mugshots);
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Mugshot_Func7(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
bool32 r6;
|
|
|
|
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-02 20:38:33 +01:00
|
|
|
r6 = TRUE;
|
2018-01-16 21:37:46 +01:00
|
|
|
sTransitionStructPtr->BG0HOFS_1 -= 8;
|
|
|
|
sTransitionStructPtr->BG0HOFS_2 += 8;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData4 < 0x50)
|
|
|
|
task->tData4 += 2;
|
|
|
|
if (task->tData4 > 0x50)
|
|
|
|
task->tData4 = 0x50;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
if (++task->tData3 & 1)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
s16 i;
|
2018-01-14 20:45:44 +01:00
|
|
|
for (i = 0, r6 = FALSE; i <= task->tData4; i++)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
s16 index1 = 0x50 - i;
|
|
|
|
s16 index2 = 0x50 + i;
|
2018-01-29 17:47:12 +01:00
|
|
|
if (gScanlineEffectRegBuffers[0][index1] <= 15)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
r6 = TRUE;
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[0][index1]++;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
2018-01-29 17:47:12 +01:00
|
|
|
if (gScanlineEffectRegBuffers[0][index2] <= 15)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
r6 = TRUE;
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[0][index2]++;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData4 == 0x50 && !r6)
|
2018-01-02 20:38:33 +01:00
|
|
|
task->tState++;
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Mugshot_Func8(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2021-02-24 17:01:02 +01:00
|
|
|
BlendPalettes(PALETTES_ALL, 0x10, RGB_WHITE);
|
2018-01-02 20:38:33 +01:00
|
|
|
sTransitionStructPtr->BLDCNT = 0xFF;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData3 = 0;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Mugshot_Func9(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData3++;
|
2018-01-29 17:47:12 +01:00
|
|
|
memset(gScanlineEffectRegBuffers[0], task->tData3, 0x140);
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData3 > 15)
|
2018-01-02 20:38:33 +01:00
|
|
|
task->tState++;
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Mugshot_Func10(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
2020-06-01 16:17:25 +02:00
|
|
|
FadeScreenBlack();
|
2018-01-02 20:38:33 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(task->func));
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB0_Phase2_Mugshots(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
|
|
|
VBlankCB_BattleTransition();
|
|
|
|
if (sTransitionStructPtr->VBlank_DMA != 0)
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
|
2018-01-16 21:37:46 +01:00
|
|
|
REG_BG0VOFS = sTransitionStructPtr->BG0VOFS;
|
2018-01-02 20:38:33 +01:00
|
|
|
REG_WININ = sTransitionStructPtr->WININ;
|
|
|
|
REG_WINOUT = sTransitionStructPtr->WINOUT;
|
|
|
|
REG_WIN0V = sTransitionStructPtr->WIN0V;
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB1_Phase2_Mugshots(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
|
|
|
VBlankCB_BattleTransition();
|
|
|
|
if (sTransitionStructPtr->VBlank_DMA != 0)
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
|
2018-01-02 20:38:33 +01:00
|
|
|
REG_BLDCNT = sTransitionStructPtr->BLDCNT;
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaSet(0, gScanlineEffectRegBuffers[1], ®_BLDY, 0xA2400001);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void HBlankCB_Phase2_Mugshots(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
if (REG_VCOUNT < 80)
|
2018-01-16 21:37:46 +01:00
|
|
|
REG_BG0HOFS = sTransitionStructPtr->BG0HOFS_1;
|
2018-01-02 20:38:33 +01:00
|
|
|
else
|
2018-01-16 21:37:46 +01:00
|
|
|
REG_BG0HOFS = sTransitionStructPtr->BG0HOFS_2;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
// data fields for player/opponent sprites in mugshots
|
|
|
|
#define sState data[0]
|
|
|
|
#define sOffsetX data[1]
|
|
|
|
#define sOffsetX2 data[2]
|
|
|
|
#define sDone data[6]
|
|
|
|
#define sSlideTableId data[7]
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Mugshots_CreateOpponentPlayerSprites(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
struct Sprite *opponentSprite, *playerSprite;
|
|
|
|
|
|
|
|
s16 mugshotId = task->tMugshotId;
|
|
|
|
task->tOpponentSpriteId = CreateTrainerSprite(sMugshotsTrainerPicIDsTable[mugshotId],
|
|
|
|
sMugshotsOpponentCoords[mugshotId][0] - 32,
|
|
|
|
sMugshotsOpponentCoords[mugshotId][1] + 42,
|
|
|
|
0, gDecompressionBuffer);
|
2021-04-15 08:04:01 +02:00
|
|
|
task->tPlayerSpriteId = CreateTrainerSprite(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender), DISPLAY_WIDTH + 32, 106, 0, gDecompressionBuffer);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
opponentSprite = &gSprites[task->tOpponentSpriteId];
|
|
|
|
playerSprite = &gSprites[task->tPlayerSpriteId];
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
opponentSprite->callback = SpriteCb_TrainerPic;
|
|
|
|
playerSprite->callback = SpriteCb_TrainerPic;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2019-12-05 03:00:45 +01:00
|
|
|
opponentSprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
|
|
|
|
playerSprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
opponentSprite->oam.matrixNum = AllocOamMatrix();
|
|
|
|
playerSprite->oam.matrixNum = AllocOamMatrix();
|
|
|
|
|
2019-12-05 03:00:45 +01:00
|
|
|
opponentSprite->oam.shape = SPRITE_SHAPE(64x32);
|
|
|
|
playerSprite->oam.shape = SPRITE_SHAPE(64x32);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2019-12-05 03:00:45 +01:00
|
|
|
opponentSprite->oam.size = SPRITE_SIZE(64x32);
|
|
|
|
playerSprite->oam.size = SPRITE_SIZE(64x32);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2019-12-05 03:00:45 +01:00
|
|
|
CalcCenterToCornerVec(opponentSprite, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), ST_OAM_AFFINE_DOUBLE);
|
|
|
|
CalcCenterToCornerVec(playerSprite, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), ST_OAM_AFFINE_DOUBLE);
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
SetOamMatrixRotationScaling(opponentSprite->oam.matrixNum, sMugshotsOpponentRotationScales[mugshotId][0], sMugshotsOpponentRotationScales[mugshotId][1], 0);
|
|
|
|
SetOamMatrixRotationScaling(playerSprite->oam.matrixNum, -512, 512, 0);
|
|
|
|
}
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static void SpriteCb_TrainerPic(struct Sprite *sprite)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
while (sTrainerPicSpriteCbs[sprite->sState](sprite));
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static bool8 TrainerPicCb_Nothing(struct Sprite *sprite)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static bool8 TrainerPicCb_SetSlideOffsets(struct Sprite *sprite)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
s16 offfsets1[ARRAY_COUNT(sTrainerPicSlideOffsets1)];
|
|
|
|
s16 offfsets2[ARRAY_COUNT(sTrainerPicSlideOffsets2)];
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
memcpy(offfsets1, sTrainerPicSlideOffsets1, sizeof(sTrainerPicSlideOffsets1));
|
|
|
|
memcpy(offfsets2, sTrainerPicSlideOffsets2, sizeof(sTrainerPicSlideOffsets2));
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
sprite->sState++;
|
|
|
|
sprite->sOffsetX = offfsets1[sprite->sSlideTableId];
|
|
|
|
sprite->sOffsetX2 = offfsets2[sprite->sSlideTableId];
|
2018-01-02 20:38:33 +01:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
// fast slide to around middle screen
|
|
|
|
static bool8 TrainerPicCb_Slide1(struct Sprite *sprite)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
sprite->pos1.x += sprite->sOffsetX;
|
|
|
|
if (sprite->sSlideTableId && sprite->pos1.x < 133)
|
|
|
|
sprite->sState++;
|
|
|
|
else if (!sprite->sSlideTableId && sprite->pos1.x > 103)
|
|
|
|
sprite->sState++;
|
2018-01-02 20:38:33 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
// slower but accelerating slide
|
|
|
|
static bool8 TrainerPicCb_Slide2(struct Sprite *sprite)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
sprite->sOffsetX += sprite->sOffsetX2;
|
|
|
|
sprite->pos1.x += sprite->sOffsetX;
|
|
|
|
if (sprite->sOffsetX == 0)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
sprite->sState++;
|
|
|
|
sprite->sOffsetX2 = -sprite->sOffsetX2;
|
|
|
|
sprite->sDone = TRUE;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
// Has no practical effect
|
|
|
|
static bool8 TrainerPicCb_Slide3(struct Sprite *sprite)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
sprite->sOffsetX += sprite->sOffsetX2;
|
|
|
|
sprite->pos1.x += sprite->sOffsetX;
|
2018-01-02 20:38:33 +01:00
|
|
|
if (sprite->pos1.x < -31 || sprite->pos1.x > 271)
|
2020-06-01 16:17:25 +02:00
|
|
|
sprite->sState++;
|
2018-01-02 20:38:33 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static void SetTrainerPicSlideTable(s16 spriteId, s16 arrId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
gSprites[spriteId].sSlideTableId = arrId;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static void IncrementTrainerPicState(s16 spriteId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
gSprites[spriteId].sState++;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static s16 IsTrainerPicSlideDone(s16 spriteId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
return gSprites[spriteId].sDone;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
#undef sState
|
|
|
|
#undef sOffsetX
|
|
|
|
#undef sOffsetX2
|
|
|
|
#undef sDone
|
|
|
|
#undef sSlideTableId
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Slice(u8 taskId)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Slice_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Slice_Func1(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
u16 i;
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
InitTransitionStructVars();
|
2018-01-29 17:47:12 +01:00
|
|
|
ScanlineEffect_Clear();
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData2 = 256;
|
|
|
|
task->tData3 = 1;
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->WININ = WININ_WIN0_ALL;
|
2018-01-02 20:38:33 +01:00
|
|
|
sTransitionStructPtr->WINOUT = 0;
|
2021-04-15 08:04:01 +02:00
|
|
|
sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT;
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 160; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_14;
|
|
|
|
gScanlineEffectRegBuffers[1][160 + i] = 0xF0;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EnableInterrupts(INTR_FLAG_HBLANK);
|
|
|
|
SetGpuRegBits(REG_OFFSET_DISPSTAT, DISPSTAT_HBLANK_INTR);
|
|
|
|
|
|
|
|
SetVBlankCallback(VBlankCB_Phase2_Slice);
|
|
|
|
SetHBlankCallback(HBlankCB_Phase2_Slice);
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Slice_Func2(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
u16 i;
|
|
|
|
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-02 20:38:33 +01:00
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 += (task->tData2 >> 8);
|
|
|
|
if (task->tData1 > 0xF0)
|
|
|
|
task->tData1 = 0xF0;
|
|
|
|
if (task->tData2 <= 0xFFF)
|
|
|
|
task->tData2 += task->tData3;
|
|
|
|
if (task->tData3 < 128)
|
|
|
|
task->tData3 <<= 1; // multiplying by two
|
2018-01-02 20:38:33 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 160; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
u16 *storeLoc1 = &gScanlineEffectRegBuffers[0][i];
|
|
|
|
u16 *storeLoc2 = &gScanlineEffectRegBuffers[0][i + 160];
|
2018-01-16 21:37:46 +01:00
|
|
|
if (i & 1)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
*storeLoc1 = sTransitionStructPtr->field_14 + task->tData1;
|
|
|
|
*storeLoc2 = 0xF0 - task->tData1;
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
*storeLoc1 = sTransitionStructPtr->field_14 - task->tData1;
|
|
|
|
*storeLoc2 = (task->tData1 << 8) | (0xF1);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData1 > 0xEF)
|
2018-01-02 20:38:33 +01:00
|
|
|
task->tState++;
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Slice_Func3(struct Task *task)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
2020-06-01 16:17:25 +02:00
|
|
|
FadeScreenBlack();
|
2018-01-02 20:38:33 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(Phase2Task_Slice));
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB_Phase2_Slice(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
|
|
|
VBlankCB_BattleTransition();
|
|
|
|
REG_WININ = sTransitionStructPtr->WININ;
|
|
|
|
REG_WINOUT = sTransitionStructPtr->WINOUT;
|
|
|
|
REG_WIN0V = sTransitionStructPtr->WIN0V;
|
|
|
|
if (sTransitionStructPtr->VBlank_DMA)
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 640);
|
|
|
|
DmaSet(0, &gScanlineEffectRegBuffers[1][160], ®_WIN0H, 0xA2400001);
|
2018-01-02 20:38:33 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void HBlankCB_Phase2_Slice(void)
|
2018-01-02 20:38:33 +01:00
|
|
|
{
|
|
|
|
if (REG_VCOUNT < 160)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
|
2018-01-02 20:38:33 +01:00
|
|
|
REG_BG1HOFS = var;
|
|
|
|
REG_BG2HOFS = var;
|
|
|
|
REG_BG3HOFS = var;
|
|
|
|
}
|
|
|
|
}
|
2018-01-13 21:03:07 +01:00
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_ShredSplit(u8 taskId)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
while (sPhase2_ShredSplit_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
2018-01-13 21:03:07 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_ShredSplit_Func1(struct Task *task)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
u16 i;
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
InitTransitionStructVars();
|
2018-01-29 17:47:12 +01:00
|
|
|
ScanlineEffect_Clear();
|
2018-01-13 21:03:07 +01:00
|
|
|
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->WININ = WININ_WIN0_ALL;
|
2018-01-13 21:03:07 +01:00
|
|
|
sTransitionStructPtr->WINOUT = 0;
|
2021-04-15 08:04:01 +02:00
|
|
|
sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT;
|
2018-01-13 21:03:07 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 0xA0; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_14;
|
|
|
|
gScanlineEffectRegBuffers[1][0xA0 + i] = 0xF0;
|
|
|
|
gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_14;
|
|
|
|
gScanlineEffectRegBuffers[0][0xA0 + i] = 0xF0;
|
|
|
|
gScanlineEffectRegBuffers[0][0x140 + i] = 0;
|
|
|
|
gScanlineEffectRegBuffers[0][0x1E0 + i] = 0x100;
|
|
|
|
gScanlineEffectRegBuffers[0][0x280 + i] = 1;
|
2018-01-13 21:03:07 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData4 = 0;
|
|
|
|
task->tData5 = 0;
|
|
|
|
task->tData6 = 7;
|
2018-01-13 21:03:07 +01:00
|
|
|
|
|
|
|
EnableInterrupts(INTR_FLAG_HBLANK);
|
|
|
|
|
|
|
|
SetVBlankCallback(VBlankCB_Phase2_Slice);
|
|
|
|
SetHBlankCallback(HBlankCB_Phase2_Slice);
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_ShredSplit_Func2(struct Task *task)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
u16 i, j, k;
|
|
|
|
u8 arr1[ARRAY_COUNT(gUnknown_085C8C64)];
|
|
|
|
s16 arr2[ARRAY_COUNT(gUnknown_085C8C66)];
|
|
|
|
u8 var;
|
|
|
|
u16 *ptr4, *ptr3, *ptr1, *ptr2;
|
|
|
|
s16 unkVar;
|
|
|
|
|
|
|
|
memcpy(arr1, gUnknown_085C8C64, sizeof(arr1));
|
|
|
|
memcpy(arr2, gUnknown_085C8C66, sizeof(arr2));
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
|
|
|
var = 0;
|
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
for (i = 0; i <= task->tData5; i++)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
for (j = 0; j < 2; j++)
|
|
|
|
{
|
|
|
|
for (k = 0; k < 2; k++)
|
|
|
|
{
|
|
|
|
unkVar = (arr1[j]) + (arr2[k] * -(i) * 2);
|
|
|
|
if (unkVar >= 0 && (unkVar != 79 || j != 1))
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
ptr4 = &gScanlineEffectRegBuffers[0][unkVar + 320];
|
|
|
|
ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 480];
|
|
|
|
ptr1 = &gScanlineEffectRegBuffers[0][unkVar + 640];
|
2018-01-13 21:03:07 +01:00
|
|
|
if (*ptr4 > 0xEF)
|
|
|
|
{
|
|
|
|
*ptr4 = 0xF0;
|
|
|
|
var++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
*ptr4 += (*ptr3 >> 8);
|
|
|
|
if (*ptr1 <= 0x7F)
|
|
|
|
*ptr1 *= 2;
|
|
|
|
if (*ptr3 <= 0xFFF)
|
|
|
|
*ptr3 += *ptr1;
|
|
|
|
}
|
2018-01-29 17:47:12 +01:00
|
|
|
ptr2 = &gScanlineEffectRegBuffers[0][unkVar];
|
|
|
|
ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 160];
|
2018-01-13 21:03:07 +01:00
|
|
|
*ptr2 = sTransitionStructPtr->field_14 + *ptr4;
|
|
|
|
*ptr3 = 0xF0 - *ptr4;
|
|
|
|
|
|
|
|
if (i == 0)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (j = 0; j < 2; j++)
|
|
|
|
{
|
|
|
|
for (k = 0; k < 2; k++)
|
|
|
|
{
|
|
|
|
unkVar = (arr1[j] + 1) + (arr2[k] * -(i) * 2);
|
|
|
|
if (unkVar <= 160 && (unkVar != 80 || j != 1))
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
ptr4 = &gScanlineEffectRegBuffers[0][unkVar + 320];
|
|
|
|
ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 480];
|
|
|
|
ptr1 = &gScanlineEffectRegBuffers[0][unkVar + 640];
|
2018-01-13 21:03:07 +01:00
|
|
|
if (*ptr4 > 0xEF)
|
|
|
|
{
|
|
|
|
*ptr4 = 0xF0;
|
|
|
|
var++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
*ptr4 += (*ptr3 >> 8);
|
|
|
|
if (*ptr1 <= 0x7F)
|
|
|
|
*ptr1 *= 2;
|
|
|
|
if (*ptr3 <= 0xFFF)
|
|
|
|
*ptr3 += *ptr1;
|
|
|
|
}
|
2018-01-29 17:47:12 +01:00
|
|
|
ptr2 = &gScanlineEffectRegBuffers[0][unkVar];
|
|
|
|
ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 160];
|
2018-01-13 21:03:07 +01:00
|
|
|
*ptr2 = sTransitionStructPtr->field_14 - *ptr4;
|
|
|
|
*ptr3 = (*ptr4 << 8) | (0xF1);
|
|
|
|
|
|
|
|
if (i == 0)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
if (--task->tData4 < 0)
|
|
|
|
task->tData4 = 0;
|
|
|
|
if (task->tData4 <= 0 && task->tData5 + 1 <= 20)
|
|
|
|
task->tData4 = task->tData6, task->tData5++;
|
2018-01-13 21:03:07 +01:00
|
|
|
if (var > 0x9F)
|
|
|
|
task->tState++;
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-21 14:23:04 +01:00
|
|
|
// This function never increments the state counter, because the loop condition
|
|
|
|
// is always false, resulting in the game being stuck in an infinite loop.
|
2018-01-29 17:47:12 +01:00
|
|
|
// It's possible this transition is only partially
|
2018-01-21 14:23:04 +01:00
|
|
|
// done and the second part was left out.
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_ShredSplit_Func3(struct Task *task)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
u16 i;
|
|
|
|
bool32 done = TRUE;
|
|
|
|
u16 checkVar2 = 0xFF10;
|
|
|
|
|
|
|
|
for (i = 0; i < 0xA0; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
if (gScanlineEffectRegBuffers[1][i] != 0xF0 && gScanlineEffectRegBuffers[1][i] != checkVar2)
|
2018-01-13 21:03:07 +01:00
|
|
|
done = FALSE; // a break statement should be put here
|
|
|
|
}
|
|
|
|
|
|
|
|
if (done == TRUE)
|
|
|
|
task->tState++;
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_ShredSplit_Func4(struct Task *task)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
2020-06-01 16:17:25 +02:00
|
|
|
FadeScreenBlack();
|
2018-01-14 20:45:44 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(Phase2Task_ShredSplit));
|
2018-01-13 21:03:07 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Blackhole1(u8 taskId)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Blackhole1_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Blackhole2(u8 taskId)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Blackhole2_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Blackhole_Func1(struct Task *task)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
InitTransitionStructVars();
|
2018-01-29 17:47:12 +01:00
|
|
|
ScanlineEffect_Clear();
|
2018-01-13 21:03:07 +01:00
|
|
|
|
|
|
|
sTransitionStructPtr->WININ = 0;
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->WINOUT = WINOUT_WIN01_ALL;
|
2021-04-15 08:04:01 +02:00
|
|
|
sTransitionStructPtr->WIN0H = DISPLAY_WIDTH;
|
|
|
|
sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT;
|
2018-01-13 21:03:07 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 0xA0; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[1][i] = 0;
|
2018-01-13 21:03:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
SetVBlankCallback(VBlankCB1_Phase2_BigPokeball);
|
|
|
|
|
|
|
|
task->tState++;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 = 1;
|
|
|
|
task->tData2 = 0x100;
|
|
|
|
task->tFuncState = 0;
|
2018-01-13 21:03:07 +01:00
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Blackhole1_Func3(struct Task *task)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tFuncState == 1)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
|
|
|
SetVBlankCallback(NULL);
|
|
|
|
DestroyTask(FindTaskIdByFunc(task->func));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData2 < 0x400)
|
|
|
|
task->tData2 += 0x80;
|
|
|
|
if (task->tData1 < 0xA0)
|
|
|
|
task->tData1 += (task->tData2 >> 8);
|
|
|
|
if (task->tData1 > 0xA0)
|
|
|
|
task->tData1 = 0xA0;
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_814A014(gScanlineEffectRegBuffers[0], 0x78, 0x50, task->tData1);
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData1 == 0xA0)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tFuncState = 1;
|
2020-06-01 16:17:25 +02:00
|
|
|
FadeScreenBlack();
|
2018-01-13 21:03:07 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Blackhole1_Func2(struct Task *task)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tFuncState == 0)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tFuncState++;
|
|
|
|
task->tData1 = 0x30;
|
|
|
|
task->tData6 = 0;
|
2018-01-13 21:03:07 +01:00
|
|
|
}
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 += gUnknown_085C8C80[task->tData6];
|
|
|
|
task->tData6 = (task->tData6 + 1) % 2;
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_814A014(gScanlineEffectRegBuffers[0], 0x78, 0x50, task->tData1);
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData1 < 9)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
task->tState++;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tFuncState = 0;
|
2018-01-13 21:03:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Blackhole2_Func2(struct Task *task)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
u16 index; // should be s16 I think
|
|
|
|
s16 amplitude;
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tFuncState == 0)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tFuncState++;
|
|
|
|
task->tData5 = 2;
|
|
|
|
task->tData6 = 2;
|
2018-01-13 21:03:07 +01:00
|
|
|
}
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData1 > 0xA0)
|
|
|
|
task->tData1 = 0xA0;
|
2018-01-13 21:03:07 +01:00
|
|
|
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_814A014(gScanlineEffectRegBuffers[0], 0x78, 0x50, task->tData1);
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData1 == 0xA0)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
2020-06-01 16:17:25 +02:00
|
|
|
FadeScreenBlack();
|
2018-01-13 21:03:07 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(task->func));
|
|
|
|
}
|
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
index = task->tData5;
|
|
|
|
if ((task->tData5 & 0xFF) <= 128)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
amplitude = task->tData6;
|
|
|
|
task->tData5 += 8;
|
2018-01-13 21:03:07 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
amplitude = task->tData6 - 1;
|
|
|
|
task->tData5 += 16;
|
2018-01-13 21:03:07 +01:00
|
|
|
}
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 += Sin(index & 0xFF, amplitude);
|
2018-01-13 21:03:07 +01:00
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData1 <= 0)
|
|
|
|
task->tData1 = 1;
|
|
|
|
if (task->tData5 > 0xFE)
|
|
|
|
task->tData5 >>= 8, task->tData6++;
|
2018-01-13 21:03:07 +01:00
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_RectangularSpiral(u8 taskId)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_RectangularSpiral_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_RectangularSpiral_Func1(struct Task *task)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-13 21:03:07 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
CpuCopy16(sShrinkingBoxTileset, tileset, 0x20);
|
|
|
|
CpuCopy16(sShrinkingBoxTileset + 0x70, tileset + 0x20, 0x20);
|
|
|
|
CpuFill16(0xF000, tilemap, 0x800);
|
2020-07-02 10:59:52 +02:00
|
|
|
LoadPalette(sFieldEffectPal_Pokeball, 0xF0, 0x20);
|
2018-01-13 21:03:07 +01:00
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData3 = 1;
|
2018-01-13 21:03:07 +01:00
|
|
|
task->tState++;
|
|
|
|
|
|
|
|
sRectangularSpiralTransition[0].field_0 = 0;
|
|
|
|
sRectangularSpiralTransition[0].field_2 = -1;
|
|
|
|
sRectangularSpiralTransition[0].field_4 = 1;
|
|
|
|
sRectangularSpiralTransition[0].field_6 = 308;
|
|
|
|
sRectangularSpiralTransition[0].field_8 = 0;
|
|
|
|
|
|
|
|
sRectangularSpiralTransition[1].field_0 = 0;
|
|
|
|
sRectangularSpiralTransition[1].field_2 = -1;
|
|
|
|
sRectangularSpiralTransition[1].field_4 = 1;
|
|
|
|
sRectangularSpiralTransition[1].field_6 = 308;
|
|
|
|
sRectangularSpiralTransition[1].field_8 = 0;
|
|
|
|
|
|
|
|
sRectangularSpiralTransition[2].field_0 = 0;
|
|
|
|
sRectangularSpiralTransition[2].field_2 = -3;
|
|
|
|
sRectangularSpiralTransition[2].field_4 = 1;
|
|
|
|
sRectangularSpiralTransition[2].field_6 = 307;
|
|
|
|
sRectangularSpiralTransition[2].field_8 = 0;
|
|
|
|
|
|
|
|
sRectangularSpiralTransition[3].field_0 = 0;
|
|
|
|
sRectangularSpiralTransition[3].field_2 = -3;
|
|
|
|
sRectangularSpiralTransition[3].field_4 = 1;
|
|
|
|
sRectangularSpiralTransition[3].field_6 = 307;
|
|
|
|
sRectangularSpiralTransition[3].field_8 = 0;
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_RectangularSpiral_Func2(struct Task *task)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-13 21:03:07 +01:00
|
|
|
u8 i;
|
|
|
|
u16 j;
|
|
|
|
bool32 done = TRUE;
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
2018-01-13 21:03:07 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
|
|
|
for (j = 0; j < ARRAY_COUNT(sRectangularSpiralTransition); j++)
|
|
|
|
{
|
|
|
|
s16 var = 0, var2 = 0;
|
|
|
|
s32 var3 = 0;
|
|
|
|
|
|
|
|
if (sub_8149048(gUnknown_085C8D38[j / 2], &sRectangularSpiralTransition[j]))
|
|
|
|
{
|
|
|
|
u32 one;
|
|
|
|
done = FALSE;
|
|
|
|
var = sRectangularSpiralTransition[j].field_2;
|
|
|
|
one = 1;
|
|
|
|
if ((j & 1) == one)
|
|
|
|
var = 0x27D - var;
|
|
|
|
|
|
|
|
var2 = var % 32;
|
|
|
|
var3 = var / 32 * 32;
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
tilemap[var3 + var2] = 0xF002;
|
2018-01-13 21:03:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (done == TRUE)
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_RectangularSpiral_Func3(struct Task *task)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
2020-06-01 16:17:25 +02:00
|
|
|
FadeScreenBlack();
|
2018-01-13 21:03:07 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(task->func));
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool16 sub_8149048(const s16 * const *arg0, struct StructRectangularSpiral *arg1)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
const s16 *array = arg0[arg1->field_0];
|
|
|
|
if (array[arg1->field_4] == -1)
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
// ??
|
|
|
|
sUnusedRectangularSpiralVar = array[0];
|
|
|
|
sUnusedRectangularSpiralVar = array[1];
|
|
|
|
sUnusedRectangularSpiralVar = array[2];
|
|
|
|
sUnusedRectangularSpiralVar = array[3];
|
|
|
|
|
|
|
|
switch (array[0])
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
arg1->field_2 += 0x1;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
arg1->field_2 -= 0x1;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
arg1->field_2 -= 0x20;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
arg1->field_2 += 0x20;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (arg1->field_2 > 0x27F || array[arg1->field_4] == -1)
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
if (arg1->field_8 == 0 && array[arg1->field_4] == -2)
|
|
|
|
{
|
|
|
|
arg1->field_8 = 1;
|
|
|
|
arg1->field_4 = 1;
|
|
|
|
arg1->field_2 = arg1->field_6;
|
|
|
|
arg1->field_0 = 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (arg1->field_2 == array[arg1->field_4])
|
|
|
|
{
|
|
|
|
(arg1->field_0)++;
|
|
|
|
if (arg1->field_8 == 1)
|
|
|
|
{
|
|
|
|
if (arg1->field_0 > 7)
|
|
|
|
{
|
|
|
|
(arg1->field_4)++;
|
|
|
|
(arg1->field_0) = 4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (arg1->field_0 > 3)
|
|
|
|
{
|
|
|
|
(arg1->field_4)++;
|
|
|
|
(arg1->field_0) = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Groudon(u8 taskId)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Groudon_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Groudon_Func3(struct Task *task)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-13 21:03:07 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
CpuFill16(0, tilemap, 0x800);
|
|
|
|
LZ77UnCompVram(sGroudon_Tileset, tileset);
|
|
|
|
LZ77UnCompVram(sGroudon_Tilemap, tilemap);
|
2018-01-13 21:03:07 +01:00
|
|
|
|
|
|
|
task->tState++;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 = 0;
|
2018-01-13 21:03:07 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Groudon_Func4(struct Task *task)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData1 % 3 == 0)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
u16 var = (task->tData1 % 30) / 3;
|
2020-06-01 16:17:25 +02:00
|
|
|
LoadPalette(sGroudon1_Palette + (var * 16), 0xF0, 0x20);
|
2018-01-13 21:03:07 +01:00
|
|
|
}
|
2018-01-14 20:45:44 +01:00
|
|
|
if (++task->tData1 > 58)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
task->tState++;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 = 0;
|
2018-01-13 21:03:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Groudon_Func5(struct Task *task)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData1 % 5 == 0)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
2018-01-14 20:45:44 +01:00
|
|
|
s16 var = task->tData1 / 5;
|
2020-06-01 16:17:25 +02:00
|
|
|
LoadPalette(sGroudon2_Palette + (var * 16), 0xF0, 0x20);
|
2018-01-13 21:03:07 +01:00
|
|
|
}
|
2018-01-14 20:45:44 +01:00
|
|
|
if (++task->tData1 > 68)
|
2018-01-13 21:03:07 +01:00
|
|
|
{
|
|
|
|
task->tState++;
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 = 0;
|
2018-01-13 21:03:07 +01:00
|
|
|
task->tFrames = 30;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Rayquaza(u8 taskId)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Rayquaza_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Rayquaza_Func3(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-14 20:45:44 +01:00
|
|
|
u16 i;
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
InitTransitionStructVars();
|
2018-01-29 17:47:12 +01:00
|
|
|
ScanlineEffect_Clear();
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2021-04-15 09:00:01 +02:00
|
|
|
SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(26) | BGCNT_TXT256x512);
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
CpuFill16(0, tilemap, 0x800);
|
|
|
|
CpuCopy16(sRayquaza_Tileset, tileset, 0x2000);
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
sTransitionStructPtr->field_20 = 0;
|
|
|
|
task->tState++;
|
2020-06-01 16:17:25 +02:00
|
|
|
LoadPalette(sRayquaza_Palette + 0x50, 0xF0, 0x20);
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 160; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[0][i] = 0;
|
|
|
|
gScanlineEffectRegBuffers[1][i] = 0x100;
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
SetVBlankCallback(VBlankCB_Phase2_Rayquaza);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Rayquaza_Func4(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
CpuCopy16(sRayquaza_Tilemap, tilemap, 0x1000);
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Rayquaza_Func5(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
if ((task->tData1 % 4) == 0)
|
|
|
|
{
|
|
|
|
u16 value = task->tData1 / 4;
|
2020-06-01 16:17:25 +02:00
|
|
|
const u16 *palPtr = &sRayquaza_Palette[(value + 5) * 16];
|
2018-01-14 20:45:44 +01:00
|
|
|
LoadPalette(palPtr, 0xF0, 0x20);
|
|
|
|
}
|
|
|
|
if (++task->tData1 > 40)
|
|
|
|
{
|
|
|
|
task->tState++;
|
|
|
|
task->tData1 = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Rayquaza_Func6(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
if (++task->tData1 > 20)
|
|
|
|
{
|
|
|
|
task->tState++;
|
|
|
|
task->tData1 = 0;
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_OBJECTS | 0x8000, 2, 0, 0x10, RGB_BLACK);
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Rayquaza_Func7(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
if (!gPaletteFade.active)
|
|
|
|
{
|
|
|
|
sTransitionStructPtr->field_20 = 1;
|
|
|
|
task->tState++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Rayquaza_Func8(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2021-02-24 17:01:02 +01:00
|
|
|
BlendPalettes(PALETTES_BG & ~(0x8000), 8, 0);
|
|
|
|
BlendPalettes(PALETTES_OBJECTS | 0x8000, 0, 0);
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Rayquaza_Func9(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
if ((task->tData1 % 3) == 0)
|
|
|
|
{
|
|
|
|
u16 value = task->tData1 / 3;
|
2020-06-01 16:17:25 +02:00
|
|
|
const u16 *palPtr = &sRayquaza_Palette[(value + 0) * 16];
|
2018-01-14 20:45:44 +01:00
|
|
|
LoadPalette(palPtr, 0xF0, 0x20);
|
|
|
|
}
|
|
|
|
if (++task->tData1 >= 40)
|
|
|
|
{
|
|
|
|
u16 i;
|
|
|
|
|
|
|
|
sTransitionStructPtr->WININ = 0;
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->WINOUT = WINOUT_WIN01_ALL;
|
2021-04-15 08:04:01 +02:00
|
|
|
sTransitionStructPtr->WIN0H = DISPLAY_WIDTH;
|
|
|
|
sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT;
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 160; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[1][i] = 0;
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
SetVBlankCallback(VBlankCB1_Phase2_BigPokeball);
|
|
|
|
task->tState++;
|
|
|
|
task->tData2 = 0x100;
|
|
|
|
task->tFuncState = 0;
|
|
|
|
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON);
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB_Phase2_Rayquaza(void)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
void *dmaSrc;
|
|
|
|
|
|
|
|
DmaStop(0);
|
|
|
|
VBlankCB_BattleTransition();
|
|
|
|
|
|
|
|
if (sTransitionStructPtr->field_20 == 0)
|
2018-01-29 17:47:12 +01:00
|
|
|
dmaSrc = gScanlineEffectRegBuffers[0];
|
2018-01-14 20:45:44 +01:00
|
|
|
else if (sTransitionStructPtr->field_20 == 1)
|
2018-01-29 17:47:12 +01:00
|
|
|
dmaSrc = gScanlineEffectRegBuffers[1];
|
2018-01-14 20:45:44 +01:00
|
|
|
else
|
2018-01-29 17:47:12 +01:00
|
|
|
dmaSrc = gScanlineEffectRegBuffers[0];
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
DmaSet(0, dmaSrc, ®_BG0VOFS, 0xA2400001);
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_WhiteFade(u8 taskId)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_WhiteFade_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_WhiteFade_Func1(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
u16 i;
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
InitTransitionStructVars();
|
2018-01-29 17:47:12 +01:00
|
|
|
ScanlineEffect_Clear();
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->BLDCNT = BLDCNT_TGT1_ALL | BLDCNT_EFFECT_LIGHTEN;
|
2018-01-14 20:45:44 +01:00
|
|
|
sTransitionStructPtr->BLDY = 0;
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->WININ = WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ;
|
|
|
|
sTransitionStructPtr->WINOUT = WINOUT_WIN01_ALL;
|
2021-04-15 08:04:01 +02:00
|
|
|
sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT;
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 160; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[1][i] = 0;
|
|
|
|
gScanlineEffectRegBuffers[1][i + 160] = 0xF0;
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EnableInterrupts(INTR_FLAG_HBLANK);
|
|
|
|
SetHBlankCallback(HBlankCB_Phase2_WhiteFade);
|
|
|
|
SetVBlankCallback(VBlankCB0_Phase2_WhiteFade);
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_WhiteFade_Func2(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
s16 i, posY;
|
|
|
|
s16 arr1[ARRAY_COUNT(sUnknown_085C8DA0)];
|
|
|
|
struct Sprite *sprite;
|
|
|
|
|
|
|
|
memcpy(arr1, sUnknown_085C8DA0, sizeof(sUnknown_085C8DA0));
|
|
|
|
for (i = 0, posY = 0; i < 8; i++, posY += 0x14)
|
|
|
|
{
|
|
|
|
sprite = &gSprites[CreateInvisibleSprite(sub_8149864)];
|
|
|
|
sprite->pos1.x = 0xF0;
|
|
|
|
sprite->pos1.y = posY;
|
|
|
|
sprite->data[5] = arr1[i];
|
|
|
|
}
|
|
|
|
sprite->data[6]++;
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_WhiteFade_Func3(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
sTransitionStructPtr->VBlank_DMA = 0;
|
|
|
|
if (sTransitionStructPtr->field_20 > 7)
|
|
|
|
{
|
2021-02-24 17:01:02 +01:00
|
|
|
BlendPalettes(PALETTES_ALL, 0x10, 0x7FFF);
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tState++;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_WhiteFade_Func4(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
sTransitionStructPtr->VBlank_DMA = 0;
|
|
|
|
|
|
|
|
DmaStop(0);
|
|
|
|
SetVBlankCallback(0);
|
|
|
|
SetHBlankCallback(0);
|
|
|
|
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->WIN0H = DISPLAY_WIDTH;
|
2018-01-14 20:45:44 +01:00
|
|
|
sTransitionStructPtr->BLDY = 0;
|
|
|
|
sTransitionStructPtr->BLDCNT = 0xFF;
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->WININ = WININ_WIN0_ALL;
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
SetVBlankCallback(VBlankCB1_Phase2_WhiteFade);
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_WhiteFade_Func5(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
if (++sTransitionStructPtr->BLDY > 16)
|
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
FadeScreenBlack();
|
2018-01-14 20:45:44 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(Phase2Task_WhiteFade));
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB0_Phase2_WhiteFade(void)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
|
|
|
VBlankCB_BattleTransition();
|
|
|
|
REG_BLDCNT = sTransitionStructPtr->BLDCNT;
|
|
|
|
REG_WININ = sTransitionStructPtr->WININ;
|
|
|
|
REG_WINOUT = sTransitionStructPtr->WINOUT;
|
|
|
|
REG_WIN0V = sTransitionStructPtr->WIN0V;
|
|
|
|
if (sTransitionStructPtr->VBlank_DMA)
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 640);
|
|
|
|
DmaSet(0, &gScanlineEffectRegBuffers[1][160], ®_WIN0H, 0xA2400001);
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB1_Phase2_WhiteFade(void)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
VBlankCB_BattleTransition();
|
|
|
|
REG_BLDY = sTransitionStructPtr->BLDY;
|
|
|
|
REG_BLDCNT = sTransitionStructPtr->BLDCNT;
|
|
|
|
REG_WININ = sTransitionStructPtr->WININ;
|
|
|
|
REG_WINOUT = sTransitionStructPtr->WINOUT;
|
2018-01-16 21:37:46 +01:00
|
|
|
REG_WIN0H = sTransitionStructPtr->WIN0H;
|
2018-01-14 20:45:44 +01:00
|
|
|
REG_WIN0V = sTransitionStructPtr->WIN0V;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void HBlankCB_Phase2_WhiteFade(void)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
REG_BLDY = gScanlineEffectRegBuffers[1][REG_VCOUNT];
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void sub_8149864(struct Sprite *sprite)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
if (sprite->data[5])
|
|
|
|
{
|
|
|
|
sprite->data[5]--;
|
|
|
|
if (sprite->data[6])
|
|
|
|
sTransitionStructPtr->VBlank_DMA = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
u16 i;
|
2018-01-29 17:47:12 +01:00
|
|
|
u16* ptr1 = &gScanlineEffectRegBuffers[0][sprite->pos1.y];
|
|
|
|
u16* ptr2 = &gScanlineEffectRegBuffers[0][sprite->pos1.y + 160];
|
2018-01-14 20:45:44 +01:00
|
|
|
for (i = 0; i < 20; i++)
|
|
|
|
{
|
|
|
|
ptr1[i] = sprite->data[0] >> 8;
|
|
|
|
ptr2[i] = (u8)(sprite->pos1.x);
|
|
|
|
}
|
|
|
|
if (sprite->pos1.x == 0 && sprite->data[0] == 0x1000)
|
|
|
|
sprite->data[1] = 1;
|
|
|
|
|
|
|
|
sprite->pos1.x -= 16;
|
|
|
|
sprite->data[0] += 0x80;
|
|
|
|
|
|
|
|
if (sprite->pos1.x < 0)
|
|
|
|
sprite->pos1.x = 0;
|
|
|
|
if (sprite->data[0] > 0x1000)
|
|
|
|
sprite->data[0] = 0x1000;
|
|
|
|
|
|
|
|
if (sprite->data[6])
|
|
|
|
sTransitionStructPtr->VBlank_DMA = 1;
|
|
|
|
|
|
|
|
if (sprite->data[1])
|
|
|
|
{
|
|
|
|
if (sprite->data[6] == 0 || (sTransitionStructPtr->field_20 > 6 && sprite->data[2]++ > 7))
|
|
|
|
{
|
|
|
|
sTransitionStructPtr->field_20++;
|
|
|
|
DestroySprite(sprite);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_GridSquares(u8 taskId)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_GridSquares_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_GridSquares_Func1(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
CpuSet(sShrinkingBoxTileset, tileset, 0x10);
|
|
|
|
CpuFill16(0xF000, tilemap, 0x800);
|
2020-07-02 10:59:52 +02:00
|
|
|
LoadPalette(sFieldEffectPal_Pokeball, 0xF0, 0x20);
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_GridSquares_Func2(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16* tileset;
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
if (task->tData1 == 0)
|
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilemapDst(&tileset);
|
2018-01-14 20:45:44 +01:00
|
|
|
task->tData1 = 3;
|
|
|
|
task->tData2++;
|
2020-06-01 16:17:25 +02:00
|
|
|
CpuSet(sShrinkingBoxTileset + (task->tData2 * 8), tileset, 0x10);
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData2 > 0xD)
|
|
|
|
{
|
|
|
|
task->tState++;
|
|
|
|
task->tData1 = 16;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
task->tData1--;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_GridSquares_Func3(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
if (--task->tData1 == 0)
|
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
FadeScreenBlack();
|
2018-01-14 20:45:44 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(Phase2Task_GridSquares));
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void Phase2Task_Shards(u8 taskId)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
while (sPhase2_Shards_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Shards_Func1(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
u16 i;
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
InitTransitionStructVars();
|
2018-01-29 17:47:12 +01:00
|
|
|
ScanlineEffect_Clear();
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->WININ = WININ_WIN0_ALL;
|
2018-01-14 20:45:44 +01:00
|
|
|
sTransitionStructPtr->WINOUT = 0;
|
2021-04-15 08:04:01 +02:00
|
|
|
sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT;
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 160; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[0][i] = 0xF0;
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
2018-01-29 17:47:12 +01:00
|
|
|
CpuSet(gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 0xA0);
|
2018-01-14 20:45:44 +01:00
|
|
|
SetVBlankCallback(VBlankCB_Phase2_Shards);
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Shards_Func2(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
sub_814A1AC(sTransitionStructPtr->data,
|
|
|
|
sUnknown_085C8DD0[task->tData1][0],
|
|
|
|
sUnknown_085C8DD0[task->tData1][1],
|
|
|
|
sUnknown_085C8DD0[task->tData1][2],
|
|
|
|
sUnknown_085C8DD0[task->tData1][3],
|
|
|
|
1, 1);
|
|
|
|
task->tData2 = sUnknown_085C8DD0[task->tData1][4];
|
|
|
|
task->tState++;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Shards_Func3(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
s16 i;
|
|
|
|
bool8 nextFunc;
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA = 0;
|
|
|
|
|
|
|
|
for (i = 0, nextFunc = FALSE; i < 16; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
s16 r3 = gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] >> 8;
|
|
|
|
s16 r4 = gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] & 0xFF;
|
2018-01-14 20:45:44 +01:00
|
|
|
if (task->tData2 == 0)
|
|
|
|
{
|
|
|
|
if (r3 < sTransitionStructPtr->data[2])
|
|
|
|
r3 = sTransitionStructPtr->data[2];
|
|
|
|
if (r3 > r4)
|
|
|
|
r3 = r4;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (r4 > sTransitionStructPtr->data[2])
|
|
|
|
r4 = sTransitionStructPtr->data[2];
|
|
|
|
if (r4 <= r3)
|
|
|
|
r4 = r3;
|
|
|
|
}
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (r4) | (r3 << 8);
|
2018-01-14 20:45:44 +01:00
|
|
|
if (nextFunc)
|
|
|
|
{
|
|
|
|
task->tState++;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
nextFunc = sub_814A228(sTransitionStructPtr->data, 1, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Shards_Func4(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
if (++task->tData1 < 7)
|
|
|
|
{
|
|
|
|
task->tState++;
|
|
|
|
task->tData3 = sUnknown_085C8E16[task->tData1 - 1];
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
DmaStop(0);
|
2020-06-01 16:17:25 +02:00
|
|
|
FadeScreenBlack();
|
2018-01-14 20:45:44 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(Phase2Task_Shards));
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase2_Shards_Func5(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
if (--task->tData3 == 0)
|
|
|
|
{
|
|
|
|
task->tState = 1;
|
|
|
|
return TRUE;
|
|
|
|
}
|
2020-06-01 16:17:25 +02:00
|
|
|
|
|
|
|
return FALSE;
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB_Phase2_Shards(void)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
DmaStop(0);
|
|
|
|
VBlankCB_BattleTransition();
|
|
|
|
if (sTransitionStructPtr->VBlank_DMA)
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
|
2018-01-14 20:45:44 +01:00
|
|
|
REG_WININ = sTransitionStructPtr->WININ;
|
|
|
|
REG_WINOUT = sTransitionStructPtr->WINOUT;
|
|
|
|
REG_WIN0V = sTransitionStructPtr->WIN0V;
|
2018-01-29 17:47:12 +01:00
|
|
|
REG_WIN0H = gScanlineEffectRegBuffers[1][0];
|
|
|
|
DmaSet(0, gScanlineEffectRegBuffers[1], ®_WIN0H, 0xA2400001);
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// sub-task for phase2
|
|
|
|
#undef tData1
|
|
|
|
#undef tData2
|
|
|
|
#undef tData3
|
|
|
|
#undef tData4
|
|
|
|
#undef tData5
|
|
|
|
#undef tData6
|
|
|
|
#undef tFuncState
|
|
|
|
#undef tFrames
|
|
|
|
#undef tOpponentSpriteId
|
|
|
|
#undef tPlayerSpriteId
|
|
|
|
#undef tMugshotId
|
|
|
|
|
|
|
|
// sub-task for sub-task phase
|
|
|
|
#define tData1 data[1]
|
|
|
|
#define tData2 data[2]
|
|
|
|
#define tData3 data[3]
|
|
|
|
#define tData4 data[4]
|
|
|
|
#define tData5 data[5]
|
|
|
|
#define tData6 data[6]
|
|
|
|
#define tData7 data[7]
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void CreatePhase1Task(s16 a0, s16 a1, s16 a2, s16 a3, s16 a4)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2018-01-14 22:09:35 +01:00
|
|
|
u8 taskId = CreateTask(TransitionPhase1_Task_RunFuncs, 3);
|
2018-01-14 20:45:44 +01:00
|
|
|
gTasks[taskId].tData1 = a0;
|
|
|
|
gTasks[taskId].tData2 = a1;
|
|
|
|
gTasks[taskId].tData3 = a2;
|
|
|
|
gTasks[taskId].tData4 = a3;
|
|
|
|
gTasks[taskId].tData5 = a4;
|
|
|
|
gTasks[taskId].tData6 = a0;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 IsPhase1Done(void)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2021-02-20 05:22:26 +01:00
|
|
|
if (FindTaskIdByFunc(TransitionPhase1_Task_RunFuncs) == TASK_NONE)
|
2018-01-14 20:45:44 +01:00
|
|
|
return TRUE;
|
|
|
|
else
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
void TransitionPhase1_Task_RunFuncs(u8 taskId)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
while (sPhase1_TransitionAll_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase1_TransitionAll_Func1(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
if (task->tData6 == 0 || --task->tData6 == 0)
|
|
|
|
{
|
|
|
|
task->tData6 = task->tData1;
|
|
|
|
task->tData7 += task->tData4;
|
|
|
|
if (task->tData7 > 16)
|
|
|
|
task->tData7 = 16;
|
2021-02-24 17:01:02 +01:00
|
|
|
BlendPalettes(PALETTES_ALL, task->tData7, 0x2D6B);
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
if (task->tData7 > 15)
|
|
|
|
{
|
|
|
|
task->tState++;
|
|
|
|
task->tData6 = task->tData2;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 Phase1_TransitionAll_Func2(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
if (task->tData6 == 0 || --task->tData6 == 0)
|
|
|
|
{
|
|
|
|
task->tData6 = task->tData2;
|
|
|
|
task->tData7 -= task->tData5;
|
|
|
|
if (task->tData7 < 0)
|
|
|
|
task->tData7 = 0;
|
2021-02-24 17:01:02 +01:00
|
|
|
BlendPalettes(PALETTES_ALL, task->tData7, 0x2D6B);
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
if (task->tData7 == 0)
|
|
|
|
{
|
|
|
|
if (--task->tData3 == 0)
|
2018-01-14 22:09:35 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(TransitionPhase1_Task_RunFuncs));
|
2018-01-14 20:45:44 +01:00
|
|
|
else
|
|
|
|
{
|
|
|
|
task->tData6 = task->tData1;
|
|
|
|
task->tState = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef tData1
|
|
|
|
#undef tData2
|
|
|
|
#undef tData3
|
|
|
|
#undef tData4
|
|
|
|
#undef tData5
|
|
|
|
#undef tData6
|
|
|
|
#undef tData7
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static void InitTransitionStructVars(void)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
memset(sTransitionStructPtr, 0, sizeof(*sTransitionStructPtr));
|
2021-04-06 23:17:41 +02:00
|
|
|
GetCameraOffsetWithPan(&sTransitionStructPtr->field_14, &sTransitionStructPtr->field_16);
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB_BattleTransition(void)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
LoadOam();
|
|
|
|
ProcessSpriteCopyRequests();
|
|
|
|
TransferPlttBuffer();
|
|
|
|
}
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static void GetBg0TilemapDst(u16 **tileset)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 charBase = REG_BG0CNT >> 2;
|
|
|
|
charBase <<= 0xE;
|
|
|
|
*tileset = (u16*)(VRAM + charBase);
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
void GetBg0TilesDst(u16 **tilemap, u16 **tileset)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 screenBase = REG_BG0CNT >> 8;
|
|
|
|
u16 charBase = REG_BG0CNT >> 2;
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
screenBase <<= 0xB;
|
|
|
|
charBase <<= 0xE;
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
*tilemap = (u16*)(VRAM + screenBase);
|
|
|
|
*tileset = (u16*)(VRAM + charBase);
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
static void FadeScreenBlack(void)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2021-02-24 17:01:02 +01:00
|
|
|
BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void sub_8149F98(s16 *array, s16 sinAdd, s16 index, s16 indexIncrementer, s16 amplitude, s16 arrSize)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
for (i = 0; arrSize > 0; arrSize--, i++, index += indexIncrementer)
|
|
|
|
{
|
|
|
|
array[i] = sinAdd + Sin(0xFF & index, amplitude);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void sub_814A014(u16 *array, s16 a1, s16 a2, s16 a3)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
s16 i;
|
|
|
|
|
|
|
|
memset(array, 0xA, 160 * sizeof(s16));
|
|
|
|
for (i = 0; i < 64; i++)
|
|
|
|
{
|
|
|
|
s16 sinResult, cosResult;
|
|
|
|
s16 toStoreOrr, r2, r3, toStore, r7, r8;
|
|
|
|
|
|
|
|
sinResult = Sin(i, a3);
|
|
|
|
cosResult = Cos(i, a3);
|
|
|
|
|
|
|
|
toStoreOrr = a1 - sinResult;
|
|
|
|
toStore = a1 + sinResult;
|
|
|
|
r7 = a2 - cosResult;
|
|
|
|
r8 = a2 + cosResult;
|
|
|
|
|
|
|
|
if (toStoreOrr < 0)
|
|
|
|
toStoreOrr = 0;
|
|
|
|
if (toStore > 0xF0)
|
|
|
|
toStore = 0xF0;
|
|
|
|
if (r7 < 0)
|
|
|
|
r7 = 0;
|
|
|
|
if (r8 > 0x9F)
|
|
|
|
r8 = 0x9F;
|
|
|
|
|
|
|
|
toStore |= (toStoreOrr << 8);
|
|
|
|
array[r7] = toStore;
|
|
|
|
array[r8] = toStore;
|
|
|
|
|
|
|
|
cosResult = Cos(i + 1, a3);
|
|
|
|
r3 = a2 - cosResult;
|
|
|
|
r2 = a2 + cosResult;
|
|
|
|
|
|
|
|
if (r3 < 0)
|
|
|
|
r3 = 0;
|
|
|
|
if (r2 > 0x9F)
|
|
|
|
r2 = 0x9F;
|
|
|
|
|
|
|
|
while (r7 > r3)
|
|
|
|
array[--r7] = toStore;
|
|
|
|
while (r7 < r3)
|
|
|
|
array[++r7] = toStore;
|
|
|
|
|
|
|
|
while (r8 > r2)
|
|
|
|
array[--r8] = toStore;
|
|
|
|
while (r8 < r2)
|
|
|
|
array[++r8] = toStore;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void sub_814A1AC(s16 *data, s16 a1, s16 a2, s16 a3, s16 a4, s16 a5, s16 a6)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
data[0] = a1;
|
|
|
|
data[1] = a2;
|
|
|
|
data[2] = a1;
|
|
|
|
data[3] = a2;
|
|
|
|
data[4] = a3;
|
|
|
|
data[5] = a4;
|
|
|
|
data[6] = a5;
|
|
|
|
data[7] = a6;
|
|
|
|
data[8] = a3 - a1;
|
|
|
|
if (data[8] < 0)
|
|
|
|
{
|
|
|
|
data[8] = -data[8];
|
|
|
|
data[6] = -a5;
|
|
|
|
}
|
|
|
|
data[9] = a4 - a2;
|
|
|
|
if (data[9] < 0)
|
|
|
|
{
|
|
|
|
data[9] = -data[9];
|
|
|
|
data[7] = -a6;
|
|
|
|
}
|
|
|
|
data[10] = 0;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static bool8 sub_814A228(s16 *data, bool8 a1, bool8 a2)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
u8 var;
|
|
|
|
if (data[8] > data[9])
|
|
|
|
{
|
|
|
|
data[2] += data[6];
|
|
|
|
data[10] += data[9];
|
|
|
|
if (data[10] > data[8])
|
|
|
|
{
|
|
|
|
data[3] += data[7];
|
|
|
|
data[10] -= data[8];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
data[3] += data[7];
|
|
|
|
data[10] += data[8];
|
|
|
|
if (data[10] > data[9])
|
|
|
|
{
|
|
|
|
data[2] += data[6];
|
|
|
|
data[10] -= data[9];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var = 0;
|
|
|
|
if ((data[6] > 0 && data[2] >= data[4]) || (data[6] < 0 && data[2] <= data[4]))
|
|
|
|
{
|
|
|
|
var++;
|
|
|
|
if (a1)
|
|
|
|
data[2] = data[4];
|
|
|
|
}
|
|
|
|
if ((data[7] > 0 && data[3] >= data[5]) || (data[7] < 0 && data[3] <= data[5]))
|
|
|
|
{
|
|
|
|
var++;
|
|
|
|
if (a2)
|
|
|
|
data[3] = data[5];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (var == 2)
|
|
|
|
return TRUE;
|
|
|
|
else
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// sub-task for phase2 of a couple of new transitions
|
|
|
|
#define tData1 data[1]
|
|
|
|
#define tData2 data[2]
|
|
|
|
#define tData3 data[3]
|
|
|
|
#define tData4 data[4]
|
|
|
|
#define tData5 data[5]
|
|
|
|
#define tData6 data[6]
|
|
|
|
#define tData7 data[7]
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierLogoWiggle_Func1(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
sub_814669C(task);
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
CpuFill16(0, tilemap, 0x800);
|
2020-07-02 21:45:37 +02:00
|
|
|
LZ77UnCompVram(sFrontierLogo_Tileset, tileset);
|
|
|
|
LoadPalette(sFrontierLogo_Palette, 0xF0, 0x20);
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierLogoWiggle_Func2(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
2020-07-02 21:45:37 +02:00
|
|
|
LZ77UnCompVram(sFrontierLogo_Tilemap, tilemap);
|
2018-01-29 17:47:12 +01:00
|
|
|
sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 0x84, task->tData5, 160);
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static void Phase2Task_FrontierLogoWiggle(u8 taskId)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-07-02 21:45:37 +02:00
|
|
|
while (sPhase2_FrontierLogoWiggle_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static void Phase2Task_FrontierLogoWave(u8 taskId)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-07-02 21:45:37 +02:00
|
|
|
while (sPhase2_FrontierLogoWave_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierLogoWave_Func1(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
InitTransitionStructVars();
|
2018-01-29 17:47:12 +01:00
|
|
|
ScanlineEffect_Clear();
|
2018-01-14 20:45:44 +01:00
|
|
|
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);
|
2018-01-14 22:09:35 +01:00
|
|
|
task->tData2 = 0x2000;
|
|
|
|
task->tData1 = 0x7FFF;
|
|
|
|
task->tData5 = 0;
|
|
|
|
task->tData6 = 16;
|
|
|
|
task->tData7 = 2560;
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->BLDCNT = BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL;
|
|
|
|
sTransitionStructPtr->BLDALPHA = BLDALPHA_BLEND(task->tData5, task->tData6);
|
2018-01-14 20:45:44 +01:00
|
|
|
REG_BLDCNT = sTransitionStructPtr->BLDCNT;
|
|
|
|
REG_BLDALPHA = sTransitionStructPtr->BLDALPHA;
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
|
|
|
CpuFill16(0, tilemap, 0x800);
|
2020-07-02 21:45:37 +02:00
|
|
|
LZ77UnCompVram(sFrontierLogo_Tileset, tileset);
|
|
|
|
LoadPalette(sFrontierLogo_Palette, 0xF0, 0x20);
|
2018-01-14 20:45:44 +01:00
|
|
|
sTransitionStructPtr->field_16 = 0;
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierLogoWave_Func2(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-14 20:45:44 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
2020-07-02 21:45:37 +02:00
|
|
|
LZ77UnCompVram(sFrontierLogo_Tilemap, tilemap);
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierLogoWave_Func3(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
|
|
|
|
for (i = 0; i < 160; i++)
|
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_16;
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
SetVBlankCallback(VBlankCB_Phase2_30);
|
|
|
|
SetHBlankCallback(HBlankCB_Phase2_30);
|
|
|
|
EnableInterrupts(INTR_FLAG_HBLANK);
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierLogoWave_Func4(struct Task *task)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
u16 var6, amplitude, var8;
|
|
|
|
|
|
|
|
sTransitionStructPtr->VBlank_DMA = FALSE;
|
|
|
|
|
|
|
|
amplitude = task->tData2 >> 8;
|
|
|
|
var6 = task->tData1;
|
|
|
|
var8 = 384;
|
|
|
|
|
|
|
|
task->tData1 = var6 - task->tData7;
|
|
|
|
|
|
|
|
if (task->tData3 >= 70)
|
|
|
|
{
|
|
|
|
if (task->tData2 - 384 >= 0)
|
|
|
|
task->tData2 -= 384;
|
|
|
|
else
|
|
|
|
task->tData2 = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (task->tData3 >= 0 && task->tData3 % 3 == 0)
|
|
|
|
{
|
|
|
|
if (task->tData5 < 16)
|
|
|
|
task->tData5++;
|
|
|
|
else if (task->tData6 > 0)
|
|
|
|
task->tData6--;
|
|
|
|
|
2021-04-15 09:00:01 +02:00
|
|
|
sTransitionStructPtr->BLDALPHA = BLDALPHA_BLEND(task->tData5, task->tData6);
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < 160; i++, var6 += var8)
|
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
s16 index = var6 / 256;
|
2020-09-09 02:51:50 +02:00
|
|
|
gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_16 + Sin(index & 0xff, amplitude);
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (++task->tData3 == 101)
|
|
|
|
{
|
|
|
|
task->tData4++;
|
2021-02-24 17:01:02 +01:00
|
|
|
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (task->tData4 != 0 && !gPaletteFade.active)
|
2020-07-02 21:45:37 +02:00
|
|
|
DestroyTask(FindTaskIdByFunc(Phase2Task_FrontierLogoWave));
|
2018-01-14 20:45:44 +01:00
|
|
|
|
|
|
|
task->tData7 -= 17;
|
|
|
|
sTransitionStructPtr->VBlank_DMA++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void VBlankCB_Phase2_30(void)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
|
|
|
VBlankCB_BattleTransition();
|
|
|
|
REG_BLDCNT = sTransitionStructPtr->BLDCNT;
|
|
|
|
REG_BLDALPHA = sTransitionStructPtr->BLDALPHA;
|
|
|
|
|
|
|
|
if (sTransitionStructPtr->VBlank_DMA)
|
2018-01-29 17:47:12 +01:00
|
|
|
DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
2018-01-14 22:09:35 +01:00
|
|
|
static void HBlankCB_Phase2_30(void)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2018-01-29 17:47:12 +01:00
|
|
|
u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
|
2018-01-14 20:45:44 +01:00
|
|
|
REG_BG0VOFS = var;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static void Phase2Task_FrontierSquares(u8 taskId)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-07-02 21:45:37 +02:00
|
|
|
while (sPhase2_FrontierSquares_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static void Phase2Task_FrontierSquaresSpiral(u8 taskId)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-07-02 21:45:37 +02:00
|
|
|
while (sPhase2_FrontierSquaresSpiral_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static void Phase2Task_FrontierSquaresScroll(u8 taskId)
|
2018-01-14 20:45:44 +01:00
|
|
|
{
|
2020-07-02 21:45:37 +02:00
|
|
|
while (sPhase2_FrontierSquaresScroll_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
|
2018-01-14 20:45:44 +01:00
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierSquares_Func1(struct Task *task)
|
2018-01-14 22:09:35 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-14 22:09:35 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
2020-07-02 21:45:37 +02:00
|
|
|
LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset);
|
2018-01-14 22:09:35 +01:00
|
|
|
|
|
|
|
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
|
|
|
|
FillBgTilemapBufferRect(0, 1, 0, 0, 1, 0x20, 0xF);
|
|
|
|
FillBgTilemapBufferRect(0, 1, 0x1D, 0, 1, 0x20, 0xF);
|
|
|
|
CopyBgTilemapBufferToVram(0);
|
2020-07-02 21:45:37 +02:00
|
|
|
LoadPalette(sFrontierSquares_Palette, 0xF0, 0x20);
|
2018-01-14 22:09:35 +01:00
|
|
|
|
|
|
|
task->tData2 = 1;
|
|
|
|
task->tData3 = 0;
|
|
|
|
task->tData4 = 0;
|
|
|
|
task->tData7 = 10;
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierSquares_Func2(struct Task *task)
|
2018-01-14 22:09:35 +01:00
|
|
|
{
|
2020-07-02 21:45:37 +02:00
|
|
|
CopyRectToBgTilemapBufferRect(0, sFrontierSquares_Tilemap, 0, 0, 4, 4, task->tData2, task->tData3, 4, 4, 0xF, 0, 0);
|
2018-01-14 22:09:35 +01:00
|
|
|
CopyBgTilemapBufferToVram(0);
|
|
|
|
|
|
|
|
task->tData2 += 4;
|
|
|
|
if (++task->tData4 == 7)
|
|
|
|
{
|
|
|
|
task->tData2 = 1;
|
|
|
|
task->tData3 += 4;
|
|
|
|
task->tData4 = 0;
|
|
|
|
if (task->tData3 > 19)
|
|
|
|
task->tState++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierSquares_Func3(struct Task *task)
|
2018-01-14 22:09:35 +01:00
|
|
|
{
|
|
|
|
u8 i;
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-14 22:09:35 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
2018-01-14 22:09:35 +01:00
|
|
|
if (task->tData6++ >= task->tData7)
|
|
|
|
{
|
|
|
|
switch (task->tData5)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
for (i = 250; i < 255; i++)
|
|
|
|
{
|
|
|
|
gPlttBufferUnfaded[i] = 0;
|
|
|
|
gPlttBufferFaded[i] = 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
2021-02-24 17:01:02 +01:00
|
|
|
BlendPalettes(PALETTES_ALL & ~(0x8000), 0x10, 0);
|
2020-07-02 21:45:37 +02:00
|
|
|
LZ77UnCompVram(sFrontierSquares_EmptyBg_Tileset, tileset);
|
2018-01-14 22:09:35 +01:00
|
|
|
break;
|
|
|
|
case 2:
|
2020-07-02 21:45:37 +02:00
|
|
|
LZ77UnCompVram(sFrontierSquares_Shrink1_Tileset, tileset);
|
2018-01-14 22:09:35 +01:00
|
|
|
break;
|
|
|
|
case 3:
|
2020-07-02 21:45:37 +02:00
|
|
|
LZ77UnCompVram(sFrontierSquares_Shrink2_Tileset, tileset);
|
2018-01-14 22:09:35 +01:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 0x20, 0x20);
|
|
|
|
CopyBgTilemapBufferToVram(0);
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
task->tData6 = 0;
|
|
|
|
task->tData5++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierSquaresSpiral_Func1(struct Task *task)
|
2018-01-14 22:09:35 +01:00
|
|
|
{
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-14 22:09:35 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
2020-07-02 21:45:37 +02:00
|
|
|
LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset);
|
2018-01-14 22:09:35 +01:00
|
|
|
|
|
|
|
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
|
|
|
|
FillBgTilemapBufferRect(0, 1, 0, 0, 1, 0x20, 0xF);
|
|
|
|
FillBgTilemapBufferRect(0, 1, 0x1D, 0, 1, 0x20, 0xF);
|
|
|
|
CopyBgTilemapBufferToVram(0);
|
2020-07-02 21:45:37 +02:00
|
|
|
LoadPalette(sFrontierSquares_Palette, 0xE0, 0x20);
|
|
|
|
LoadPalette(sFrontierSquares_Palette, 0xF0, 0x20);
|
2018-01-14 22:09:35 +01:00
|
|
|
BlendPalette(0xE0, 0x10, 8, 0);
|
|
|
|
|
|
|
|
task->tData2 = 34;
|
|
|
|
task->tData3 = 0;
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierSquaresSpiral_Func2(struct Task *task)
|
2018-01-14 22:09:35 +01:00
|
|
|
{
|
|
|
|
u8 var = gUnknown_085C9A30[task->tData2];
|
|
|
|
u8 varMod = var % 7;
|
|
|
|
u8 varDiv = var / 7;
|
2020-07-02 21:45:37 +02:00
|
|
|
CopyRectToBgTilemapBufferRect(0, &sFrontierSquares_Tilemap, 0, 0, 4, 4, 4 * varMod + 1, 4 * varDiv, 4, 4, 0xF, 0, 0);
|
2018-01-14 22:09:35 +01:00
|
|
|
CopyBgTilemapBufferToVram(0);
|
|
|
|
|
|
|
|
if (--task->tData2 < 0)
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierSquaresSpiral_Func3(struct Task *task)
|
2018-01-14 22:09:35 +01:00
|
|
|
{
|
|
|
|
BlendPalette(0xE0, 0x10, 3, 0);
|
2021-02-24 17:01:02 +01:00
|
|
|
BlendPalettes(PALETTES_ALL & ~(0x8000 | 0x4000), 0x10, 0);
|
2018-01-14 22:09:35 +01:00
|
|
|
|
|
|
|
task->tData2 = 0;
|
|
|
|
task->tData3 = 0;
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierSquaresSpiral_Func4(struct Task *task)
|
2018-01-14 22:09:35 +01:00
|
|
|
{
|
|
|
|
if ((task->tData3 ^= 1))
|
|
|
|
{
|
|
|
|
CopyRectToBgTilemapBufferRect(
|
|
|
|
0,
|
2020-07-02 21:45:37 +02:00
|
|
|
sFrontierSquares_Tilemap,
|
2018-01-14 22:09:35 +01:00
|
|
|
0,
|
|
|
|
0,
|
|
|
|
4,
|
|
|
|
4,
|
|
|
|
4 * (gUnknown_085C9A30[task->tData2] % 7) + 1,
|
|
|
|
4 * (gUnknown_085C9A30[task->tData2] / 7),
|
|
|
|
4,
|
|
|
|
4,
|
|
|
|
0xE,
|
|
|
|
0,
|
|
|
|
0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (task->tData2 > 0)
|
|
|
|
{
|
|
|
|
FillBgTilemapBufferRect(
|
|
|
|
0,
|
|
|
|
1,
|
|
|
|
4 * (gUnknown_085C9A30[task->tData2 - 1] % 7) + 1,
|
|
|
|
4 * (gUnknown_085C9A30[task->tData2 - 1] / 7),
|
|
|
|
4,
|
|
|
|
4,
|
|
|
|
0xF);
|
|
|
|
}
|
|
|
|
|
|
|
|
task->tData2++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (task->tData2 > 34)
|
|
|
|
task->tState++;
|
|
|
|
|
|
|
|
CopyBgTilemapBufferToVram(0);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierSquares_End(struct Task *task)
|
2018-01-14 22:09:35 +01:00
|
|
|
{
|
|
|
|
FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 0x20, 0x20);
|
|
|
|
CopyBgTilemapBufferToVram(0);
|
2021-02-24 17:01:02 +01:00
|
|
|
BlendPalettes(PALETTES_ALL, 0x10, 0);
|
2018-01-14 22:09:35 +01:00
|
|
|
DestroyTask(FindTaskIdByFunc(task->func));
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// sub task for phase2 32
|
|
|
|
#define tSub32_X_delta data[0]
|
|
|
|
#define tSub32_Y_delta data[1]
|
|
|
|
#define tSub32_Bool data[2]
|
|
|
|
|
|
|
|
static void sub_814ABE4(u8 taskId)
|
|
|
|
{
|
|
|
|
if (!(gTasks[taskId].tSub32_Bool ^= 1))
|
|
|
|
{
|
|
|
|
SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_X);
|
|
|
|
SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_Y);
|
|
|
|
gBattle_BG0_X += gTasks[taskId].tSub32_X_delta;
|
|
|
|
gBattle_BG0_Y += gTasks[taskId].tSub32_Y_delta;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierSquaresScroll_Func1(struct Task *task)
|
2018-01-14 22:09:35 +01:00
|
|
|
{
|
|
|
|
u8 taskId = 0;
|
2020-06-01 16:17:25 +02:00
|
|
|
u16 *tilemap, *tileset;
|
2018-01-14 22:09:35 +01:00
|
|
|
|
2020-06-01 16:17:25 +02:00
|
|
|
GetBg0TilesDst(&tilemap, &tileset);
|
2020-07-02 21:45:37 +02:00
|
|
|
LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset);
|
2018-01-14 22:09:35 +01:00
|
|
|
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
|
|
|
|
CopyBgTilemapBufferToVram(0);
|
2020-07-02 21:45:37 +02:00
|
|
|
LoadPalette(sFrontierSquares_Palette, 0xF0, 0x20);
|
2018-01-14 22:09:35 +01:00
|
|
|
|
|
|
|
gBattle_BG0_X = 0;
|
|
|
|
gBattle_BG0_Y = 0;
|
|
|
|
SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_X);
|
|
|
|
SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_Y);
|
|
|
|
|
|
|
|
task->tData2 = 0;
|
|
|
|
taskId = CreateTask(sub_814ABE4, 1);
|
|
|
|
switch (Random() % 4)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
gTasks[taskId].tSub32_X_delta = 1;
|
|
|
|
gTasks[taskId].tSub32_Y_delta = 1;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
gTasks[taskId].tSub32_X_delta = -1;
|
|
|
|
gTasks[taskId].tSub32_Y_delta = -1;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
gTasks[taskId].tSub32_X_delta = 1;
|
|
|
|
gTasks[taskId].tSub32_Y_delta = -1;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
gTasks[taskId].tSub32_X_delta = -1;
|
|
|
|
gTasks[taskId].tSub32_Y_delta = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierSquaresScroll_Func2(struct Task *task)
|
2018-01-14 22:09:35 +01:00
|
|
|
{
|
|
|
|
u8 var = gUnknown_085C9A53[task->tData2];
|
|
|
|
u8 varDiv = var / 8;
|
|
|
|
u8 varAnd = var & 7;
|
|
|
|
|
|
|
|
CopyRectToBgTilemapBufferRect(
|
|
|
|
0,
|
2020-07-02 21:45:37 +02:00
|
|
|
&sFrontierSquares_Tilemap,
|
2018-01-14 22:09:35 +01:00
|
|
|
0,
|
|
|
|
0,
|
|
|
|
4,
|
|
|
|
4,
|
|
|
|
4 * varDiv + 1,
|
|
|
|
4 * varAnd,
|
|
|
|
4,
|
|
|
|
4,
|
|
|
|
0xF,
|
|
|
|
0,
|
|
|
|
0);
|
|
|
|
CopyBgTilemapBufferToVram(0);
|
|
|
|
|
|
|
|
if (++task->tData2 > 63)
|
|
|
|
task->tState++;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierSquaresScroll_Func3(struct Task *task)
|
2018-01-14 22:09:35 +01:00
|
|
|
{
|
2021-02-24 17:01:02 +01:00
|
|
|
BlendPalettes(PALETTES_ALL & ~(0x8000), 0x10, 0);
|
2018-01-14 22:09:35 +01:00
|
|
|
|
|
|
|
task->tData2 = 0;
|
|
|
|
|
|
|
|
task->tState++;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierSquaresScroll_Func4(struct Task *task)
|
2018-01-14 22:09:35 +01:00
|
|
|
{
|
|
|
|
u8 var = gUnknown_085C9A53[task->tData2];
|
|
|
|
u8 varDiv = var / 8;
|
|
|
|
u8 varAnd = var & 7;
|
|
|
|
|
|
|
|
FillBgTilemapBufferRect(0, 1, 4 * varDiv + 1, 4 * varAnd, 4, 4, 0xF);
|
|
|
|
CopyBgTilemapBufferToVram(0);
|
|
|
|
|
|
|
|
if (++task->tData2 > 63)
|
|
|
|
{
|
|
|
|
DestroyTask(FindTaskIdByFunc(sub_814ABE4));
|
|
|
|
task->tState++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef tSub32_X_delta
|
|
|
|
#undef tSub32_Y_delta
|
|
|
|
#undef tSub32_Bool
|
|
|
|
|
2020-07-02 21:45:37 +02:00
|
|
|
static bool8 Phase2_FrontierSquaresScroll_Func5(struct Task *task)
|
2018-01-14 22:09:35 +01:00
|
|
|
{
|
|
|
|
gBattle_BG0_X = 0;
|
|
|
|
gBattle_BG0_Y = 0;
|
|
|
|
SetGpuReg(REG_OFFSET_BG0VOFS, 0);
|
|
|
|
SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_Y);
|
|
|
|
|
|
|
|
FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 0x20, 0x20);
|
|
|
|
CopyBgTilemapBufferToVram(0);
|
2021-02-24 17:01:02 +01:00
|
|
|
BlendPalettes(PALETTES_ALL, 0x10, 0);
|
2018-01-14 22:09:35 +01:00
|
|
|
|
|
|
|
DestroyTask(FindTaskIdByFunc(task->func));
|
2021-05-14 19:41:22 +02:00
|
|
|
|
|
|
|
#ifndef UBFIX
|
2018-01-14 22:09:35 +01:00
|
|
|
task->tState++; // UB: changing value of a destroyed task
|
2021-05-14 19:41:22 +02:00
|
|
|
#endif
|
2018-01-14 22:09:35 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-01-14 20:45:44 +01:00
|
|
|
#undef tData1
|
|
|
|
#undef tData2
|
|
|
|
#undef tData3
|
|
|
|
#undef tData4
|
|
|
|
#undef tData5
|
|
|
|
#undef tData6
|
|
|
|
#undef tData7
|