Merge pull request #540 from GriffinRichards/sync-b-anim

Sync battle anim
This commit is contained in:
GriffinR
2022-08-25 10:09:32 -04:00
committed by GitHub
61 changed files with 8993 additions and 8552 deletions
+1 -1
View File
@@ -245,7 +245,7 @@ $(C_BUILDDIR)/isagbprn.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE)
$(C_BUILDDIR)/isagbprn.o: CFLAGS := -mthumb-interwork $(C_BUILDDIR)/isagbprn.o: CFLAGS := -mthumb-interwork
$(C_BUILDDIR)/trainer_tower.o: CFLAGS += -ffreestanding $(C_BUILDDIR)/trainer_tower.o: CFLAGS += -ffreestanding
$(C_BUILDDIR)/flying.o: CFLAGS += -ffreestanding $(C_BUILDDIR)/battle_anim_flying.o: CFLAGS += -ffreestanding
$(C_BUILDDIR)/librfu_intr.o: CC1 := tools/agbcc/bin/agbcc_arm$(EXE) $(C_BUILDDIR)/librfu_intr.o: CC1 := tools/agbcc/bin/agbcc_arm$(EXE)
$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -O2 -mthumb-interwork -quiet $(C_BUILDDIR)/librfu_intr.o: CFLAGS := -O2 -mthumb-interwork -quiet
+46 -46
View File
@@ -14,7 +14,7 @@
.byte 0x02 .byte 0x02
.4byte \template .4byte \template
.if \anim_battler == ANIM_TARGET .if \anim_battler == ANIM_TARGET
.byte 0x80 | (\subpriority_offset & 0x7F) .byte ANIMSPRITE_IS_TARGET | (\subpriority_offset & 0x7F)
.else .else
.byte (\subpriority_offset & 0x7F) .byte (\subpriority_offset & 0x7F)
.endif .endif
@@ -34,20 +34,20 @@
.Lcreatetask_\@_2: .Lcreatetask_\@_2:
.endm .endm
.macro delay param0:req .macro delay frames:req
.byte 0x4 .byte 0x4
.byte \param0 .byte \frames
.endm .endm
.macro waitforvisualfinish .macro waitforvisualfinish
.byte 0x5 .byte 0x5
.endm .endm
.macro hang1 .macro nop
.byte 0x6 .byte 0x6
.endm .endm
.macro hang2 .macro nop2
.byte 0x7 .byte 0x7
.endm .endm
@@ -79,30 +79,30 @@
.byte 0xd .byte 0xd
.endm .endm
.macro call param0:req .macro call ptr:req
.byte 0xe .byte 0xe
.4byte \param0 .4byte \ptr
.endm .endm
.macro return .macro return
.byte 0xf .byte 0xf
.endm .endm
.macro setarg param0:req, param1:req .macro setarg argId:req, value:req
.byte 0x10 .byte 0x10
.byte \param0 .byte \argId
.2byte \param1 .2byte \value
.endm .endm
.macro choosetwoturnanim param0:req, param1:req .macro choosetwoturnanim ptr1:req, ptr2:req
.byte 0x11 .byte 0x11
.4byte \param0 .4byte \ptr1
.4byte \param1 .4byte \ptr2
.endm .endm
.macro jumpifmoveturn param0:req, ptr:req .macro jumpifmoveturn value:req, ptr:req
.byte 0x12 .byte 0x12
.byte \param0 .byte \value
.4byte \ptr .4byte \ptr
.endm .endm
@@ -144,13 +144,13 @@
.byte \pan .byte \pan
.endm .endm
.macro panse_1B se:req, param1:req, param2:req, param3:req, param4:req .macro panse se:req, currentPan:req, targetPan:req, incrementPan:req, delay:req
.byte 0x1b .byte 0x1b
.2byte \se .2byte \se
.byte \param1 .byte \currentPan
.byte \param2 .byte \targetPan
.byte \param3 .byte \incrementPan
.byte \param4 .byte \delay
.endm .endm
.macro loopsewithpan se:req, pan:req, wait:req, times:req .macro loopsewithpan se:req, pan:req, wait:req, times:req
@@ -168,9 +168,9 @@
.byte \wait .byte \wait
.endm .endm
.macro setbldcnt param0:req .macro setbldcnt bldcnt:req
.byte 0x1e .byte 0x1e
.2byte \param0 .2byte \bldcnt
.endm .endm
.macro createsoundtask addr:req, argv:vararg .macro createsoundtask addr:req, argv:vararg
@@ -186,19 +186,19 @@
.byte 0x20 .byte 0x20
.endm .endm
.macro jumpargeq param0:req, param1:req, ptr:req .macro jumpargeq argId:req, value:req, ptr:req
.byte 0x21 .byte 0x21
.byte \param0 .byte \argId
.2byte \param1 .2byte \value
.4byte \ptr .4byte \ptr
.endm .endm
.macro monbg_22 battler:req .macro monbg_static battler:req
.byte 0x22 .byte 0x22
.byte \battler .byte \battler
.endm .endm
.macro clearmonbg_23 battler:req .macro clearmonbg_static battler:req
.byte 0x23 .byte 0x23
.byte \battler .byte \battler
.endm .endm
@@ -208,41 +208,41 @@
.4byte \ptr .4byte \ptr
.endm .endm
.macro fadetobgfromset param0:req, param1:req, param2:req .macro fadetobgfromset bgOpponent:req, bgPlayer:req, bgContest:req
.byte 0x25 .byte 0x25
.byte \param0 .byte \bgOpponent
.byte \param1 .byte \bgPlayer
.byte \param2 .byte \bgContest
.endm .endm
.macro panse_26 se:req, param1:req, param2:req, param3:req, param4:req .macro panse_adjustnone se:req, currentPan:req, targetPan:req, incrementPan:req, delay:req
.byte 0x26 .byte 0x26
.2byte \se .2byte \se
.byte \param1 .byte \currentPan
.byte \param2 .byte \targetPan
.byte \param3 .byte \incrementPan
.byte \param4 .byte \delay
.endm .endm
.macro panse_27 se:req, param1:req, param2:req, param3:req, param4:req .macro panse_adjustall se:req, currentPan:req, targetPan:req, incrementPan:req, delay:req
.byte 0x27 .byte 0x27
.2byte \se .2byte \se
.byte \param1 .byte \currentPan
.byte \param2 .byte \targetPan
.byte \param3 .byte \incrementPan
.byte \param4 .byte \delay
.endm .endm
.macro monbgprio_28 battler:req .macro splitbgprio battler:req
.byte 0x28 .byte 0x28
.byte \battler .byte \battler
.endm .endm
.macro monbgprio_29 .macro splitbgprio_all
.byte 0x29 .byte 0x29
.endm .endm
.macro monbgprio_2A battler:req .macro splitbgprio_foes battler:req
.byte 0x2a .byte 0x2a
.byte \battler .byte \battler
.endm .endm
@@ -257,12 +257,12 @@
.byte \battler .byte \battler
.endm .endm
.macro doublebattle_2D battler:req .macro teamattack_moveback battler:req
.byte 0x2d .byte 0x2d
.byte \battler .byte \battler
.endm .endm
.macro doublebattle_2E battler:req .macro teamattack_movefwd battler:req
.byte 0x2e .byte 0x2e
.byte \battler .byte \battler
.endm .endm
+23
View File
@@ -488,3 +488,26 @@
.set OAM_SIZE_8x32, OAM_SIZE_1 | OAM_V_RECTANGLE .set OAM_SIZE_8x32, OAM_SIZE_1 | OAM_V_RECTANGLE
.set OAM_SIZE_16x32, OAM_SIZE_2 | OAM_V_RECTANGLE .set OAM_SIZE_16x32, OAM_SIZE_2 | OAM_V_RECTANGLE
.set OAM_SIZE_32x64, OAM_SIZE_3 | OAM_V_RECTANGLE .set OAM_SIZE_32x64, OAM_SIZE_3 | OAM_V_RECTANGLE
@ BLDCNT
.set BLDCNT_TGT1_BG0, 1 << 0
.set BLDCNT_TGT1_BG1, 1 << 1
.set BLDCNT_TGT1_BG2, 1 << 2
.set BLDCNT_TGT1_BG3, 1 << 3
.set BLDCNT_TGT1_OBJ, 1 << 4
.set BLDCNT_TGT1_BD, 1 << 5
.set BLDCNT_TGT1_ALL, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD
.set BLDCNT_EFFECT_NONE, 0 << 6
.set BLDCNT_EFFECT_BLEND, 1 << 6
.set BLDCNT_EFFECT_LIGHTEN, 2 << 6
.set BLDCNT_EFFECT_DARKEN, 3 << 6
.set BLDCNT_TGT2_BG0, 1 << 8
.set BLDCNT_TGT2_BG1, 1 << 9
.set BLDCNT_TGT2_BG2, 1 << 10
.set BLDCNT_TGT2_BG3, 1 << 11
.set BLDCNT_TGT2_OBJ, 1 << 12
.set BLDCNT_TGT2_BD, 1 << 13
.set BLDCNT_TGT2_ALL, BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD
+3394 -3397
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -11,7 +11,7 @@
#include "constants/songs.h" #include "constants/songs.h"
#include "constants/trainers.h" #include "constants/trainers.h"
#include "constants/game_stat.h" #include "constants/game_stat.h"
#include "battle_string_ids.h" #include "constants/battle_string_ids.h"
.include "asm/macros/battle_script.inc" .include "asm/macros/battle_script.inc"
@ Define these here since misc_constants.inc conflicts with the C headers @ Define these here since misc_constants.inc conflicts with the C headers
.set NULL, 0 .set NULL, 0
+2 -2
View File
@@ -9,7 +9,7 @@
#include "constants/pokemon.h" #include "constants/pokemon.h"
#include "constants/songs.h" #include "constants/songs.h"
#include "constants/game_stat.h" #include "constants/game_stat.h"
#include "battle_string_ids.h" #include "constants/battle_string_ids.h"
.include "asm/macros/battle_script.inc" .include "asm/macros/battle_script.inc"
@ Define these here since misc_constants.inc conflicts with the C headers @ Define these here since misc_constants.inc conflicts with the C headers
.set NULL, 0 .set NULL, 0
@@ -209,7 +209,7 @@ BattleScript_PokeFluteEnd::
finishaction finishaction
BattleScript_WatchesCarefully:: BattleScript_WatchesCarefully::
printfromtable gSafariPokeblockResultStringIds printfromtable gSafariReactionStringIds
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
playanimation BS_OPPONENT1, B_ANIM_SAFARI_REACTION playanimation BS_OPPONENT1, B_ANIM_SAFARI_REACTION
end2 end2
-55
View File
@@ -1,55 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
.align 2
gSmokescreenImpactSpriteSheet::
obj_tiles gSmokescreenImpactTiles, 0x0180, 55019
gSmokescreenImpactSpritePalette::
obj_pal gSmokescreenImpactPalette, 55019
gOamData_835099C::
.4byte 0x40000000, 0x00000400
gAnimCmd_82509A4::
obj_image_anim_frame 0, 4
obj_image_anim_frame 4, 4
obj_image_anim_frame 8, 4
obj_image_anim_end
gAnimCmd_82509B4::
obj_image_anim_frame 0, 4, OBJ_IMAGE_ANIM_H_FLIP
obj_image_anim_frame 4, 4, OBJ_IMAGE_ANIM_H_FLIP
obj_image_anim_frame 8, 4, OBJ_IMAGE_ANIM_H_FLIP
obj_image_anim_end
gAnimCmd_82509C4::
obj_image_anim_frame 0, 4, OBJ_IMAGE_ANIM_V_FLIP
obj_image_anim_frame 4, 4, OBJ_IMAGE_ANIM_V_FLIP
obj_image_anim_frame 8, 4, OBJ_IMAGE_ANIM_V_FLIP
obj_image_anim_end
gAnimCmd_82509D4::
obj_image_anim_frame 0, 4, OBJ_IMAGE_ANIM_H_FLIP | OBJ_IMAGE_ANIM_V_FLIP
obj_image_anim_frame 4, 4, OBJ_IMAGE_ANIM_H_FLIP | OBJ_IMAGE_ANIM_V_FLIP
obj_image_anim_frame 8, 4, OBJ_IMAGE_ANIM_H_FLIP | OBJ_IMAGE_ANIM_V_FLIP
obj_image_anim_end
gSpriteAnimTable_82509E4::
.4byte gAnimCmd_82509A4
.4byte gAnimCmd_82509B4
.4byte gAnimCmd_82509C4
.4byte gAnimCmd_82509D4
gSmokescreenImpactSpriteTemplate::
spr_template 55019, 55019, gOamData_835099C, gSpriteAnimTable_82509E4, NULL, gDummySpriteAffineAnimTable, SpriteCB_DestroySprite
gSpriteSheet_EnemyShadow::
obj_tiles gFile_graphics_battle_interface_enemy_mon_shadow_sheet, 0x0080, 55129
gOamData_8250A14::
.4byte 0x40004000, 0x00000c00
gSpriteTemplate_EnemyShadow::
spr_template 55129, 55039, gOamData_8250A14, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCB_SetInvisible
+2 -2
View File
@@ -402,8 +402,8 @@ struct BattleStruct
u8 runTries; u8 runTries;
u8 caughtMonNick[POKEMON_NAME_LENGTH + 1]; u8 caughtMonNick[POKEMON_NAME_LENGTH + 1];
u8 field_78; // unused u8 field_78; // unused
u8 safariGoNearCounter; u8 safariRockThrowCounter;
u8 safariPkblThrowCounter; u8 safariBaitThrowCounter;
u8 safariEscapeFactor; u8 safariEscapeFactor;
u8 safariCatchFactor; u8 safariCatchFactor;
u8 linkBattleVsSpriteId_V; u8 linkBattleVsSpriteId_V;
+74 -364
View File
@@ -17,6 +17,36 @@ enum
BG_ANIM_SCREEN_BASE_BLOCK BG_ANIM_SCREEN_BASE_BLOCK
}; };
enum
{
BATTLER_COORD_X,
BATTLER_COORD_Y,
BATTLER_COORD_X_2,
BATTLER_COORD_Y_PIC_OFFSET,
BATTLER_COORD_Y_PIC_OFFSET_DEFAULT,
};
enum
{
BATTLER_COORD_ATTR_HEIGHT,
BATTLER_COORD_ATTR_WIDTH,
BATTLER_COORD_ATTR_TOP,
BATTLER_COORD_ATTR_BOTTOM,
BATTLER_COORD_ATTR_LEFT,
BATTLER_COORD_ATTR_RIGHT,
BATTLER_COORD_ATTR_RAW_BOTTOM,
};
// battle_anim_status_effects.s
#define STAT_ANIM_PLUS1 15
#define STAT_ANIM_PLUS2 39
#define STAT_ANIM_MINUS1 22
#define STAT_ANIM_MINUS2 46
#define STAT_ANIM_MULTIPLE_PLUS1 55
#define STAT_ANIM_MULTIPLE_PLUS2 56
#define STAT_ANIM_MULTIPLE_MINUS1 57
#define STAT_ANIM_MULTIPLE_MINUS2 58
struct BattleAnimBgData struct BattleAnimBgData
{ {
u8 *bgTiles; u8 *bgTiles;
@@ -60,9 +90,8 @@ extern u8 gBattleAnimTarget;
extern u8 gBattlerSpriteIds[MAX_BATTLERS_COUNT]; extern u8 gBattlerSpriteIds[MAX_BATTLERS_COUNT];
extern s32 gAnimMoveDmg; extern s32 gAnimMoveDmg;
extern u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT]; extern u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT];
extern u8 gUnknown_2037F24; extern u8 gAnimCustomPanning;
// battle_anim.c
extern const struct OamData gOamData_AffineOff_ObjNormal_8x8; extern const struct OamData gOamData_AffineOff_ObjNormal_8x8;
extern const struct OamData gOamData_AffineOff_ObjNormal_16x16; extern const struct OamData gOamData_AffineOff_ObjNormal_16x16;
extern const struct OamData gOamData_AffineOff_ObjNormal_32x32; extern const struct OamData gOamData_AffineOff_ObjNormal_32x32;
@@ -135,8 +164,27 @@ extern const struct OamData gOamData_AffineDouble_ObjBlend_8x16;
extern const struct OamData gOamData_AffineDouble_ObjBlend_8x32; extern const struct OamData gOamData_AffineDouble_ObjBlend_8x32;
extern const struct OamData gOamData_AffineDouble_ObjBlend_16x32; extern const struct OamData gOamData_AffineDouble_ObjBlend_16x32;
extern const struct OamData gOamData_AffineDouble_ObjBlend_32x64; extern const struct OamData gOamData_AffineDouble_ObjBlend_32x64;
extern const struct MonCoords gCastformFrontSpriteCoords[];
extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; extern const struct CompressedSpriteSheet gBattleAnimPicTable[];
extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; extern const struct CompressedSpritePalette gBattleAnimPaletteTable[];
extern const struct SpriteTemplate gFlashingHitSplatSpriteTemplate;
extern const struct SpriteTemplate gBasicHitSplatSpriteTemplate;
extern const struct SpriteTemplate gWaterHitSplatSpriteTemplate;
extern const struct SpriteTemplate gWishStarSpriteTemplate;
extern const struct SpriteTemplate gMiniTwinklingStarSpriteTemplate;
extern const struct SpriteTemplate gThoughtBubbleSpriteTemplate;
extern const union AffineAnimCmd *const gAffineAnims_Bite[];
extern const union AffineAnimCmd *const gAffineAnims_Droplet[];
extern const union AffineAnimCmd *const gGrowingRingAffineAnimTable[];
extern const union AnimCmd *const gAnims_SmallBubblePair[];
extern const union AnimCmd *const gAnims_BasicFire[];
extern const union AnimCmd *const gAnims_WaterMudOrb[];
extern const union AnimCmd *const gAnims_WaterBubble[];
extern const union AnimCmd *const gMusicNotesAnimTable[];
extern const u8 *const gBattleAnims_StatusConditions[];
extern const u8 *const gBattleAnims_Moves[];
extern const u16 gMovesWithQuietBGM[];
void MoveBattlerSpriteToBG(u8 battlerId, u8); void MoveBattlerSpriteToBG(u8 battlerId, u8);
void ResetBattleAnimBg(u8); void ResetBattleAnimBg(u8);
void ClearBattleAnimationVars(void); void ClearBattleAnimationVars(void);
@@ -152,209 +200,19 @@ s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan);
bool8 IsBattlerSpriteVisible(u8 battlerId); bool8 IsBattlerSpriteVisible(u8 battlerId);
s16 KeepPanInRange(s16 a, s32 oldPan); s16 KeepPanInRange(s16 a, s32 oldPan);
void RelocateBattleBgPal(u16 paletteNum, u16 *dest, s32 offset, u8 largeScreen); void RelocateBattleBgPal(u16 paletteNum, u16 *dest, s32 offset, u8 largeScreen);
// battle_intro.c
void SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value); void SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value);
s32 GetAnimBgAttribute(u8 bgId, u8 attributeId); s32 GetAnimBgAttribute(u8 bgId, u8 attributeId);
void HandleIntroSlide(u8 terrain); void HandleIntroSlide(u8 terrain);
void BattleIntroSlideEnd(u8 taskId); void BattleIntroSlideEnd(u8 taskId);
void CopyBattlerSpriteToBg(s32 bgId, u8 x, u8 y, u8 battlerPosition, u8 palno, u8 *tilesDest, u16 *tilemapDest, u16 tilesOffset); void CopyBattlerSpriteToBg(s32 bgId, u8 x, u8 y, u8 battlerPosition, u8 palno, u8 *tilesDest, u16 *tilemapDest, u16 tilesOffset);
// battle_anim_effects_1.c
extern const union AnimCmd *const gMusicNotesAnimTable[];
extern const struct SpriteTemplate gThoughtBubbleSpriteTemplate;
void AnimMovePowderParticle(struct Sprite *);
void AnimPowerAbsorptionOrb(struct Sprite *);
void AnimSolarBeamBigOrb(struct Sprite *);
void AnimSolarBeamSmallOrb(struct Sprite *);
void AnimAbsorptionOrb(struct Sprite *);
void AnimHyperBeamOrb(struct Sprite *);
void AnimSporeParticle(struct Sprite *);
void AnimPetalDanceBigFlower(struct Sprite *);
void AnimPetalDanceSmallFlower(struct Sprite *);
void AnimRazorLeafParticle(struct Sprite *);
void AnimLeechSeed(struct Sprite *);
void AnimTranslateLinearSingleSineWave(struct Sprite *);
void AnimMoveTwisterParticle(struct Sprite *);
void AnimConstrictBinding(struct Sprite *);
void AnimMimicOrb(struct Sprite *);
void AnimIngrainRoot(struct Sprite *);
void AnimFrenzyPlantRoot(struct Sprite *);
void AnimIngrainOrb(struct Sprite *);
void AnimPresent(struct Sprite *);
void AnimKnockOffItem(struct Sprite *);
void AnimPresentHealParticle(struct Sprite *);
void AnimItemSteal(struct Sprite *);
void AnimTrickBag(struct Sprite *);
void AnimFlyingParticle(struct Sprite *);
void AnimNeedleArmSpike(struct Sprite *);
void AnimSlidingHit(struct Sprite *);
void AnimWhipHit(struct Sprite *);
void AnimFlickeringPunch(struct Sprite *);
void AnimCuttingSlice(struct Sprite *);
void AnimAirCutterSlice(struct Sprite *);
void AnimCirclingMusicNote(struct Sprite *);
void AnimProtect(struct Sprite *);
void AnimMilkBottle(struct Sprite *);
void AnimGrantingStars(struct Sprite *);
void AnimSparkingStars(struct Sprite *);
void AnimBubbleBurst(struct Sprite *);
void AnimSleepLetterZ(struct Sprite *);
void AnimLockOnTarget(struct Sprite *);
void AnimLockOnMoveTarget(struct Sprite *);
void AnimBowMon(struct Sprite *);
void AnimTipMon(struct Sprite *);
void AnimSlashSlice(struct Sprite *);
void AnimFalseSwipeSlice(struct Sprite *);
void AnimFalseSwipePositionedSlice(struct Sprite *);
void AnimEndureEnergy(struct Sprite *);
void AnimSharpenSphere(struct Sprite *);
void AnimConversion(struct Sprite *);
void AnimConversion2(struct Sprite *);
void AnimMoon(struct Sprite *);
void AnimMoonlightSparkle(struct Sprite *);
void AnimHornHit(struct Sprite *);
void AnimSuperFang(struct Sprite *);
void AnimWavyMusicNotes(struct Sprite *);
void AnimFlyingMusicNotes(struct Sprite *);
void AnimBellyDrumHand(struct Sprite *);
void AnimSlowFlyingMusicNotes(struct Sprite *);
void AnimThoughtBubble(struct Sprite *);
void AnimMetronomeFinger(struct Sprite *);
void AnimFollowMeFinger(struct Sprite *);
void AnimTauntFinger(struct Sprite *);
void SetSpriteNextToMonHead(u8 battler, struct Sprite* sprite); void SetSpriteNextToMonHead(u8 battler, struct Sprite* sprite);
void AnimTask_ShrinkTargetCopy(u8 taskId);
// battle_anim_effects_2.c
extern const union AffineAnimCmd *const gGrowingRingAffineAnimTable[];
void AnimCirclingFinger(struct Sprite *);
void AnimBouncingMusicNote(struct Sprite *);
void AnimVibrateBattlerBack(struct Sprite *);
void AnimMovingClamp(struct Sprite *);
void Anim_KinesisZapEnergy(struct Sprite *);
void Anim_SwordsDanceBlade(struct Sprite *);
void AnimSonicBoomProjectile(struct Sprite *);
void AnimAirWaveProjectile(struct Sprite *);
void AnimVoidLines(struct Sprite *);
void AnimCoinThrow(struct Sprite *);
void AnimFallingCoin(struct Sprite *);
void AnimBulletSeed(struct Sprite *);
void AnimRazorWindTornado(struct Sprite *);
void AnimViceGripPincer(struct Sprite *);
void AnimGuillotinePincer(struct Sprite *);
void AnimBreathPuff(struct Sprite *);
void AnimAngerMark(struct Sprite *);
void AnimPencil(struct Sprite *);
void AnimBlendThinRing(struct Sprite *);
void AnimHyperVoiceRing(struct Sprite *);
void AnimUproarRing(struct Sprite *);
void AnimSoftBoiledEgg(struct Sprite *);
void AnimSpeedDust(struct Sprite *);
void AnimHealBellMusicNote(struct Sprite *);
void AnimMagentaHeart(struct Sprite *);
void AnimRedHeartProjectile(struct Sprite *);
void AnimParticuleBurst(struct Sprite *);
void AnimRedHeartRising(struct Sprite *);
void AnimOrbitFast(struct Sprite *);
void AnimOrbitScatter(struct Sprite *);
void AnimSpitUpOrb(struct Sprite *);
void AnimEyeSparkle(struct Sprite *);
void AnimAngel(struct Sprite *);
void AnimPinkHeart(struct Sprite *);
void AnimDevil(struct Sprite *);
void AnimFurySwipes(struct Sprite *);
void AnimMovementWaves(struct Sprite *);
void AnimJaggedMusicNote(struct Sprite *);
void AnimPerishSongMusicNote2(struct Sprite *);
void AnimPerishSongMusicNote(struct Sprite *);
void AnimGuardRing(struct Sprite *);
// battle_anim_effects_3.c
extern const struct SpriteTemplate gWishStarSpriteTemplate;
extern const struct SpriteTemplate gMiniTwinklingStarSpriteTemplate;
void AnimBlackSmoke(struct Sprite *);
void AnimWhiteHalo(struct Sprite *);
void AnimTealAlert(struct Sprite *);
void AnimMeanLookEye(struct Sprite *);
void AnimSpikes(struct Sprite *);
void AnimLeer(struct Sprite *);
void AnimLetterZ(struct Sprite *);
void AnimFang(struct Sprite *);
void AnimSpotlight(struct Sprite *);
void AnimClappingHand(struct Sprite *);
void AnimClappingHand2(struct Sprite *);
void AnimRapidSpin(struct Sprite *);
void AnimTriAttackTriangle(struct Sprite *);
void AnimBatonPassPokeball(struct Sprite *);
void AnimWishStar(struct Sprite *);
void AnimMiniTwinklingStar(struct Sprite *);
void AnimSwallowBlueOrb(struct Sprite *);
void AnimGreenStar(struct Sprite *);
void AnimWeakFrustrationAngerMark(struct Sprite *);
void AnimSweetScentPetal(struct Sprite *);
void AnimPainSplitProjectile(struct Sprite *);
void AnimFlatterConfetti(struct Sprite *);
void AnimFlatterSpotlight(struct Sprite *);
void AnimReversalOrb(struct Sprite *);
void AnimYawnCloud(struct Sprite *);
void AnimSmokeBallEscapeCloud(struct Sprite *);
void AnimFacadeSweatDrop(struct Sprite *);
void AnimRoarNoiseLine(struct Sprite *);
void AnimGlareEyeDot(struct Sprite *);
void AnimAssistPawprint(struct Sprite *);
void AnimSmellingSaltsHand(struct Sprite *);
void AnimSmellingSaltExclamation(struct Sprite *);
void AnimHelpingHandClap(struct Sprite *);
void AnimForesightMagnifyingGlass(struct Sprite *);
void AnimMeteorMashStar(struct Sprite *);
void AnimBlockX(struct Sprite *);
void AnimUnusedItemBagSteal(struct Sprite *);
void AnimParticuleBurst(struct Sprite *);
void AnimKnockOffStrike(struct Sprite *);
void AnimRecycle(struct Sprite *);
// battle_anim_special.c
void TryShinyAnimation(u8 battler, struct Pokemon *mon); void TryShinyAnimation(u8 battler, struct Pokemon *mon);
u8 ItemIdToBallId(u16 itemId); u8 ItemIdToBallId(u16 itemId);
u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId); u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId);
u8 LaunchBallFadeMonTask(bool8 unFadeLater, u8 battlerId, u32 arg2, u8 ballId); u8 LaunchBallFadeMonTask(bool8 unFadeLater, u8 battlerId, u32 arg2, u8 ballId);
void DoLoadHealthboxPalsForLevelUp(u8 *, u8 *, u8 battlerId); void DoLoadHealthboxPalsForLevelUp(u8 *, u8 *, u8 battlerId);
void DoFreeHealthboxPalsForLevelUp(u8 batterId); void DoFreeHealthboxPalsForLevelUp(u8 batterId);
enum
{
BATTLER_COORD_X,
BATTLER_COORD_Y,
BATTLER_COORD_X_2,
BATTLER_COORD_Y_PIC_OFFSET,
BATTLER_COORD_Y_PIC_OFFSET_DEFAULT,
};
enum
{
BATTLER_COORD_ATTR_HEIGHT,
BATTLER_COORD_ATTR_WIDTH,
BATTLER_COORD_ATTR_TOP,
BATTLER_COORD_ATTR_BOTTOM,
BATTLER_COORD_ATTR_LEFT,
BATTLER_COORD_ATTR_RIGHT,
BATTLER_COORD_ATTR_RAW_BOTTOM,
};
// battle_anim_status_effects.s
#define STAT_ANIM_PLUS1 15
#define STAT_ANIM_PLUS2 39
#define STAT_ANIM_MINUS1 22
#define STAT_ANIM_MINUS2 46
#define STAT_ANIM_MULTIPLE_PLUS1 55
#define STAT_ANIM_MULTIPLE_PLUS2 56
#define STAT_ANIM_MULTIPLE_MINUS1 57
#define STAT_ANIM_MULTIPLE_MINUS2 58
void LaunchStatusAnimation(u8 battlerId, u8 statusAnimId); void LaunchStatusAnimation(u8 battlerId, u8 statusAnimId);
// battle_anim_mons.c
extern const struct MonCoords gCastformFrontSpriteCoords[];
u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType); u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType);
u8 GetBattlerSpriteCoord2(u8 battlerId, u8 coordType); u8 GetBattlerSpriteCoord2(u8 battlerId, u8 coordType);
u8 GetBattlerSpriteDefault_Y(u8 battlerId); u8 GetBattlerSpriteDefault_Y(u8 battlerId);
@@ -363,15 +221,15 @@ u8 GetGhostSpriteDefault_Y(u8 battlerId);
u8 GetBattlerYCoordWithElevation(u8 battlerId); u8 GetBattlerYCoordWithElevation(u8 battlerId);
u8 GetAnimBattlerSpriteId(u8 animBattler); u8 GetAnimBattlerSpriteId(u8 animBattler);
void StoreSpriteCallbackInData6(struct Sprite *sprite, SpriteCallback callback); void StoreSpriteCallbackInData6(struct Sprite *sprite, SpriteCallback callback);
void TranslateSpriteInCircleOverDuration(struct Sprite *sprite); void TranslateSpriteInCircle(struct Sprite *sprite);
void TranslateSpriteInGrowingCircleOverDuration(struct Sprite *sprite); void TranslateSpriteInGrowingCircle(struct Sprite *sprite);
void TranslateSpriteInEllipseOverDuration(struct Sprite *sprite); void TranslateSpriteInEllipse(struct Sprite *sprite);
void WaitAnimForDuration(struct Sprite *sprite); void WaitAnimForDuration(struct Sprite *sprite);
void SetupLinearTranslationWithFixedDuration(struct Sprite *sprite); void ConvertPosDataToTranslateLinearData(struct Sprite *sprite);
void TranslateSpriteLinear(struct Sprite *sprite); void TranslateSpriteLinear(struct Sprite *sprite);
void TranslateSpriteLinearFixedPoint(struct Sprite *sprite); void TranslateSpriteLinearFixedPoint(struct Sprite *sprite);
void TranslateMonSpriteLinear(struct Sprite *sprite); void TranslateSpriteLinearById(struct Sprite *sprite);
void TranslateMonSpriteLinearFixedPoint(struct Sprite *sprite); void TranslateSpriteLinearByIdFixedPoint(struct Sprite *sprite);
void TranslateSpriteLinearAndFlicker(struct Sprite *sprite); void TranslateSpriteLinearAndFlicker(struct Sprite *sprite);
void DestroySpriteAndMatrix(struct Sprite *sprite); void DestroySpriteAndMatrix(struct Sprite *sprite);
void RunStoredCallbackWhenAffineAnimEnds(struct Sprite *sprite); void RunStoredCallbackWhenAffineAnimEnds(struct Sprite *sprite);
@@ -400,19 +258,19 @@ void InitAnimBgTilemapBuffer(u32 bgId, const void *src);
void AnimLoadCompressedBgTilemap(u32 bgId, const u32 *src); void AnimLoadCompressedBgTilemap(u32 bgId, const u32 *src);
u8 GetBattleBgPaletteNum(void); u8 GetBattleBgPaletteNum(void);
void ToggleBg3Mode(bool8 arg0); void ToggleBg3Mode(bool8 arg0);
void StartSpriteLinearTranslationFromCurrentPos(struct Sprite *sprite); void TradeMenuBouncePartySprites(struct Sprite *sprite);
void InitSpriteDataForLinearTranslation(struct Sprite *sprite); void InitSpriteDataForLinearTranslation(struct Sprite *sprite);
void InitAnimLinearTranslation(struct Sprite *sprite); void InitAnimLinearTranslation(struct Sprite *sprite);
void StartAnimLinearTranslation(struct Sprite *sprite); void StartAnimLinearTranslation(struct Sprite *sprite);
void PlayerThrowBall_StartAnimLinearTranslation(struct Sprite *sprite); void PlayerThrowBall_StartAnimLinearTranslation(struct Sprite *sprite);
bool8 AnimTranslateLinear(struct Sprite *sprite); bool8 AnimTranslateLinear(struct Sprite *sprite);
void RunLinearTranslation_ThenceSetCBtoStoredInData6(struct Sprite *sprite); void AnimTranslateLinear_WithFollowup(struct Sprite *sprite);
void BattleAnim_InitLinearTranslationWithDuration(struct Sprite *sprite); void InitAnimLinearTranslationWithSpeed(struct Sprite *sprite);
void BattleAnim_InitAndRunLinearTranslationWithDuration(struct Sprite *sprite); void InitAnimLinearTranslationWithSpeedAndPos(struct Sprite *sprite);
void InitAndRunAnimFastLinearTranslation(struct Sprite *sprite); void InitAndRunAnimFastLinearTranslation(struct Sprite *sprite);
bool8 AnimFastTranslateLinear(struct Sprite *sprite); bool8 AnimFastTranslateLinear(struct Sprite *sprite);
void InitAnimFastLinearTranslationWithSpeed(struct Sprite *sprite); void InitAnimFastLinearTranslationWithSpeed(struct Sprite *sprite);
void InitAndStartAnimFastLinearTranslationWithSpeed(struct Sprite *sprite); void InitAnimFastLinearTranslationWithSpeedAndPos(struct Sprite *sprite);
void SetSpriteRotScale(u8 spriteId, s16 xScale, s16 yScale, u16 rotation); void SetSpriteRotScale(u8 spriteId, s16 xScale, s16 yScale, u16 rotation);
void PrepareBattlerSpriteForRotScale(u8 spriteId, u8 objMode); void PrepareBattlerSpriteForRotScale(u8 spriteId, u8 objMode);
void ResetSpriteRotScale(u8 spriteId); void ResetSpriteRotScale(u8 spriteId);
@@ -421,18 +279,15 @@ void TrySetSpriteRotScale(struct Sprite *sprite, bool8 recalcCenterVector, s16 x
void TryResetSpriteAffineState(struct Sprite *sprite); void TryResetSpriteAffineState(struct Sprite *sprite);
u16 ArcTan2Neg(s16 a, s16 b); u16 ArcTan2Neg(s16 a, s16 b);
void SetGreyscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor); void SetGreyscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor);
u32 SelectBattleAnimSpriteAndBgPalettes(bool8 battleBackground, bool8 attacker, bool8 target, bool8 attackerPartner, bool8 targetPartner, bool8 a6, bool8 a7); u32 GetBattlePalettesMask(bool8 battleBackground, bool8 attacker, bool8 target, bool8 attackerPartner, bool8 targetPartner, bool8 a6, bool8 a7);
u32 SelectBattlerSpritePalettes(bool8 playerLeft, bool8 playerRight, bool8 foeLeft, bool8 foeRight); u32 GetBattleMonSpritePalettesMask(bool8 playerLeft, bool8 playerRight, bool8 foeLeft, bool8 foeRight);
u8 GetSpritePalIdxByBattler(u8 a1); u8 GetSpritePalIdxByBattler(u8 a1);
void AnimSpriteOnMonPos(struct Sprite *sprite); void AnimSpriteOnMonPos(struct Sprite *sprite);
void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite); void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite);
void AnimThrowProjectile(struct Sprite *sprite); void AnimThrowProjectile(struct Sprite *sprite);
void AnimSnoreZ(struct Sprite *sprite); void AnimTravelDiagonally(struct Sprite *sprite);
s16 CloneBattlerSpriteWithBlend(u8 animBattler); s16 CloneBattlerSpriteWithBlend(u8 animBattler);
void obj_delete_but_dont_free_vram(struct Sprite *sprite); void DestroySpriteWithActiveSheet(struct Sprite *sprite);
void AnimTask_AlphaFadeIn(u8 taskId);
void AnimTask_BlendMonInAndOut(u8 task);
void AnimTask_BlendPalInAndOutByTag(u8 taskId);
void PrepareAffineAnimInTaskData(struct Task *task, u8 spriteId, const union AffineAnimCmd *affineAnimCmds); void PrepareAffineAnimInTaskData(struct Task *task, u8 spriteId, const union AffineAnimCmd *affineAnimCmds);
bool8 RunAffineAnimFromTaskData(struct Task *task); bool8 RunAffineAnimFromTaskData(struct Task *task);
void SetBattlerSpriteYOffsetFromYScale(u8 spriteId); void SetBattlerSpriteYOffsetFromYScale(u8 spriteId);
@@ -441,173 +296,28 @@ void StorePointerInVars(s16 *lo, s16 *hi, const void *ptr);
void *LoadPointerFromVars(s16 lo, s16 hi); void *LoadPointerFromVars(s16 lo, s16 hi);
void BattleAnimHelper_SetSpriteSquashParams(struct Task *task, u8 spriteId, s16 xScale0, s16 yScale0, s16 xScale1, s16 yScale1, u16 duration); void BattleAnimHelper_SetSpriteSquashParams(struct Task *task, u8 spriteId, s16 xScale0, s16 yScale0, s16 xScale1, s16 yScale1, u16 duration);
u8 BattleAnimHelper_RunSpriteSquash(struct Task *task); u8 BattleAnimHelper_RunSpriteSquash(struct Task *task);
void AnimTask_GetFrustrationPowerLevel(u8 taskId); void InitPrioritiesForVisibleBattlers(void);
void ResetSpritePriorityOfAllVisibleBattlers(void);
u8 GetBattlerSpriteSubpriority(u8 battlerId); u8 GetBattlerSpriteSubpriority(u8 battlerId);
u8 GetBattlerSpriteBGPriority(u8 battlerId); u8 GetBattlerSpriteBGPriority(u8 battlerId);
// Returns 2 if player left or opp right
// Returns 1 if player right or opp left
u8 GetBattlerSpriteBGPriorityRank(u8 battlerId); u8 GetBattlerSpriteBGPriorityRank(u8 battlerId);
u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 templateId, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battlerId, u32 ignoreDeoxys); u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 templateId, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battlerId, u32 ignoreDeoxys);
void DestroySpriteAndFreeResources_(struct Sprite *sprite); void DestroySpriteAndFreeResources_(struct Sprite *sprite);
s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr); s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr);
void SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x, s16 *y); void SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x, s16 *y);
u8 CreateCloneOfSpriteInWindowMode(s32 battlerId, u8 spriteId, s32 species); u8 CreateInvisibleSpriteCopy(s32 battlerId, u8 spriteId, s32 species);
void SpriteCB_AnimTranslateSpriteLinearAndFlicker(struct Sprite *sprite); void AnimTranslateLinearAndFlicker_Flipped(struct Sprite *sprite);
void SpriteCB_AnimTranslateSpriteLinearAndFlicker2(struct Sprite *sprite); void AnimTranslateLinearAndFlicker(struct Sprite *sprite);
void SpriteCB_TrackOffsetFromAttackerAndWaitAnim(struct Sprite *sprite); void AnimSpinningSparkle(struct Sprite *sprite);
void AnimTask_AttackerPunchWithTrace(u8 taskId); void AnimWeatherBallUp(struct Sprite *sprite);
void SpriteCB_WeatherBallUp(struct Sprite *sprite);
void AnimWeatherBallDown(struct Sprite *sprite); void AnimWeatherBallDown(struct Sprite *sprite);
void AnimParticleBurst(struct Sprite *);
// battle_anim_mon_movement.c void AnimMoveTwisterParticle(struct Sprite *);
void AnimTask_ShakeMon(u8 taskId); u32 UnpackSelectedBattlePalettes(s16 selector);
void AnimTask_ShakeMon2(u8 taskId);
void AnimTask_ShakeMonInPlace(u8 taskId);
void AnimTask_ShakeAndSinkMon(u8 taskId);
void AnimTask_TranslateMonElliptical(u8 taskId);
void AnimTask_TranslateMonEllipticalRespectSide(u8 taskId);
void AnimTask_WindUpLunge(u8 taskId);
void AnimTask_SlideOffScreen(u8 taskId);
void AnimTask_SwayMon(u8 taskId);
void AnimTask_ScaleMonAndRestore(u8 taskId);
void AnimTask_RotateMonSpriteToSide(u8 taskId);
void AnimTask_RotateMonToSideAndRestore(u8 taskId);
void AnimTask_ShakeTargetBasedOnMovePowerOrDmg(u8 taskId);
// normal.c
extern const struct SpriteTemplate gFlashingHitSplatSpriteTemplate;
extern const struct SpriteTemplate gBasicHitSplatSpriteTemplate;
extern const struct SpriteTemplate gWaterHitSplatSpriteTemplate;
u32 UnpackSelectedBattleAnimPalettes(s16 selector);
void AnimTask_CurseBlendEffect(u8 taskId);
void AnimTask_BlendColorCycleExclude(u8 taskId);
void AnimTask_BlendColorCycleByTag(u8 taskId);
void AnimTask_FlashAnimTagWithColor(u8 taskId);
void AnimTask_InvertScreenColor(u8 taskId);
void AnimTask_ShakeBattleTerrain(u8 taskId);
// ground.c
void AnimTask_DigDownMovement(u8 taskId);
void AnimTask_DigUpMovement(u8 taskId);
void AnimTask_HorizontalShake(u8 taskId); void AnimTask_HorizontalShake(u8 taskId);
void AnimTask_IsPowerOver99(u8 taskId);
void AnimTask_PositionFissureBgOnBattler(u8 taskId);
// dragon.c
void AnimTask_DragonDanceWaver(u8 taskId);
// ghost.c
void AnimTask_NightShadeClone(u8 taskId);
void AnimTask_NightmareClone(u8 taskId);
void AnimTask_SpiteTargetShadow(u8 taskId);
void AnimTask_DestinyBondWhiteShadow(u8 taskId);
void AnimTask_CurseStretchingBlackBg(u8 taskId);
void AnimTask_GrudgeFlames(u8 taskId);
void sub_80B6BBC(u8 taskId);
// rock.c
void AnimTask_LoadSandstormBackground(u8 taskId);
void AnimTask_Rollout(u8 taskId);
void AnimTask_GetSeismicTossDamageLevel(u8 taskId);
void AnimTask_MoveSeismicTossBg(u8 taskId);
void AnimTask_SeismicTossBgAccelerateDownAtEnd(u8 taskId);
// psychic.c
void AnimTask_MeditateStretchAttacker(u8 taskId);
void AnimTask_Teleport(u8 taskId);
void AnimTask_ImprisonOrbs(u8 taskId);
void AnimTask_SkillSwap(u8 taskId);
void AnimTask_ExtrasensoryDistortion(u8 taskId);
void AnimTask_TransparentCloneGrowAndShrink(u8 taskId);
// dark.c
extern const union AffineAnimCmd *const gAffineAnims_Bite[];
void AnimTask_AttackerFadeToInvisible(u8 taskId);
void AnimTask_AttackerFadeFromInvisible(u8 taskId);
void AnimTask_InitAttackerFadeFromInvisible(u8 taskId);
void AnimTask_MoveAttackerMementoShadow(u8 taskId);
void AnimTask_MoveTargetMementoShadow(u8 taskId);
void AnimTask_InitMementoShadow(u8 taskId);
void sub_80B8664(u8 taskId);
void AnimTask_MetallicShine(u8 taskId);
void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId);
void GetIsDoomDesireHitTurn(u8 taskId);
// flying.c
void AnimTask_AnimateGustTornadoPalette(u8 taskId);
void DestroyAnimSpriteAfterTimer(struct Sprite *sprite); void DestroyAnimSpriteAfterTimer(struct Sprite *sprite);
void AnimTask_DrillPeckHitSplats(u8 taskId);
// poison.c
extern const union AffineAnimCmd *const gAffineAnims_Droplet[];
// fighting.c
void AnimTask_MoveSkyUppercutBg(u8 taskId);
// ice.c
extern const union AnimCmd *const gAnims_SmallBubblePair[];
void AnimTask_Haze1(u8 taskId);
void AnimTask_LoadMistTiles(u8 taskId);
void AnimTask_Hail1(u8 taskId);
void AnimTask_GetRolloutCounter(u8 taskId);
// electric.c
void AnimTask_ElectricBolt(u8 taskId);
void AnimTask_ElectricChargingParticles(u8 taskId);
void AnimTask_VoltTackleAttackerReappear(u8 taskId);
void AnimTask_VoltTackleBolt(u8 taskId);
void AnimTask_ShockWaveProgressingBolt(u8 taskId);
void AnimTask_ShockWaveLightning(u8 taskId);
// fire.c
extern const union AnimCmd *const gAnims_BasicFire[];
void AnimTask_EruptionLaunchRocks(u8 taskId);
void AnimTask_ShakeTargetInPattern(u8 taskId);
void AnimTask_BlendBackground(u8 taskId);
void AnimTask_MoveHeatWaveTargets(u8 taskId);
// water.c
extern const union AnimCmd *const gAnims_WaterMudOrb[];
extern const union AnimCmd *const gAnims_WaterBubble[];
void AnimWaterPulseRing(struct Sprite *sprite); void AnimWaterPulseRing(struct Sprite *sprite);
// smokescreen.c
u8 SmokescreenImpact(s16 x, s16 y, u8 a3); u8 SmokescreenImpact(s16 x, s16 y, u8 a3);
// battle_anim_utility_funcs.c
void AnimTask_BlendSelected(u8 taskId);
void AnimTask_BlendExcept(u8 taskId);
void AnimTask_SetCamouflageBlend(u8 taskId);
void AnimTask_BlendParticle(u8 taskId);
void AnimTask_HardwarePaletteFade(u8 taskId);
void AnimTask_CloneBattlerSpriteWithBlend(u8 taskId);
void AnimTask_SetUpCurseBackground(u8 taskId);
void InitStatsChangeAnimation(u8 taskId); void InitStatsChangeAnimation(u8 taskId);
void AnimTask_BlendNonAttackerPalettes(u8 taskId);
void AnimTask_StartSlidingBg(u8 taskId);
void AnimTask_GetAttackerSide(u8 taskId);
void AnimTask_GetTargetSide(u8 taskId);
void AnimTask_GetTargetIsAttackerPartner(u8 taskId);
void AnimTask_SetAllNonAttackersInvisiblity(u8 taskId);
void StartMonScrollingBgMask(u8 taskId, s32 unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, u8 arg6, u8 arg7, const u32 *gfx, const u32 *tilemap, const u32 *palette); void StartMonScrollingBgMask(u8 taskId, s32 unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, u8 arg6, u8 arg7, const u32 *gfx, const u32 *tilemap, const u32 *palette);
void AnimTask_GetBattleTerrain(u8 taskId);
void AnimTask_AllocBackupPalBuffer(u8 taskId);
void AnimTask_FreeBackupPalBuffer(u8 taskId);
void AnimTask_CopyPalUnfadedToBackup(u8 taskId);
void AnimTask_CopyPalUnfadedFromBackup(u8 taskId);
void AnimTask_CopyPalFadedToUnfaded(u8 taskId);
void AnimTask_IsContest(u8 taskId);
void AnimTask_SetAnimAttackerAndTargetForEffectTgt(u8 taskId);
void AnimTask_IsTargetSameSide(u8 taskId);
void AnimTask_SetAnimTargetToBattlerTarget(u8 taskId);
void AnimTask_SetAnimAttackerAndTargetForEffectAtk(u8 taskId);
void AnimTask_SetAttackerInvisibleWaitForSignal(u8 taskId);
// battle_anim_scripts.s
extern const u8 *const gBattleAnims_StatusConditions[];
extern const u16 gMovesWithQuietBGM[];
extern const u8 *const gBattleAnims_Moves[];
#endif // GUARD_BATTLE_ANIM_H #endif // GUARD_BATTLE_ANIM_H
+1
View File
@@ -2,6 +2,7 @@
#define GUARD_BATTLE_MESSAGE_H #define GUARD_BATTLE_MESSAGE_H
#include "global.h" #include "global.h"
#include "constants/battle_string_ids.h"
// for 0xFD // for 0xFD
+71 -52
View File
@@ -237,7 +237,7 @@
#define ANIM_TAG_SPOTLIGHT (ANIM_SPRITES_START + 227) #define ANIM_TAG_SPOTLIGHT (ANIM_SPRITES_START + 227)
#define ANIM_TAG_LETTER_Z (ANIM_SPRITES_START + 228) #define ANIM_TAG_LETTER_Z (ANIM_SPRITES_START + 228)
#define ANIM_TAG_RAPID_SPIN (ANIM_SPRITES_START + 229) #define ANIM_TAG_RAPID_SPIN (ANIM_SPRITES_START + 229)
#define ANIM_TAG_TRI_FORCE_TRIANGLE (ANIM_SPRITES_START + 230) #define ANIM_TAG_TRI_ATTACK_TRIANGLE (ANIM_SPRITES_START + 230)
#define ANIM_TAG_WISP_ORB (ANIM_SPRITES_START + 231) #define ANIM_TAG_WISP_ORB (ANIM_SPRITES_START + 231)
#define ANIM_TAG_WISP_FIRE (ANIM_SPRITES_START + 232) #define ANIM_TAG_WISP_FIRE (ANIM_SPRITES_START + 232)
#define ANIM_TAG_GOLD_STARS (ANIM_SPRITES_START + 233) #define ANIM_TAG_GOLD_STARS (ANIM_SPRITES_START + 233)
@@ -276,7 +276,7 @@
#define ANIM_TAG_GREEN_SPIKE (ANIM_SPRITES_START + 266) #define ANIM_TAG_GREEN_SPIKE (ANIM_SPRITES_START + 266)
#define ANIM_TAG_WHITE_CIRCLE_OF_LIGHT (ANIM_SPRITES_START + 267) #define ANIM_TAG_WHITE_CIRCLE_OF_LIGHT (ANIM_SPRITES_START + 267)
#define ANIM_TAG_GLOWY_BLUE_ORB (ANIM_SPRITES_START + 268) #define ANIM_TAG_GLOWY_BLUE_ORB (ANIM_SPRITES_START + 268)
#define ANIM_TAG_SAFARI_BAIT (ANIM_SPRITES_START + 269) #define ANIM_TAG_SAFARI_BAIT (ANIM_SPRITES_START + 269)
#define ANIM_TAG_WHITE_FEATHER (ANIM_SPRITES_START + 270) #define ANIM_TAG_WHITE_FEATHER (ANIM_SPRITES_START + 270)
#define ANIM_TAG_SPARKLE_6 (ANIM_SPRITES_START + 271) #define ANIM_TAG_SPARKLE_6 (ANIM_SPRITES_START + 271)
#define ANIM_TAG_SPLASH (ANIM_SPRITES_START + 272) #define ANIM_TAG_SPLASH (ANIM_SPRITES_START + 272)
@@ -318,7 +318,7 @@
#define SOUND_PAN_TARGET 63 #define SOUND_PAN_TARGET 63
// move background ids // move background ids
#define BG_DARK_ 0 // the same as BG_DARK but is unused #define BG_NONE 0 // the same as BG_DARK
#define BG_DARK 1 #define BG_DARK 1
#define BG_GHOST 2 #define BG_GHOST 2
#define BG_PSYCHIC 3 #define BG_PSYCHIC 3
@@ -346,59 +346,62 @@
#define BG_SOLAR_BEAM_PLAYER 25 #define BG_SOLAR_BEAM_PLAYER 25
#define BG_SOLAR_BEAM_CONTESTS 26 #define BG_SOLAR_BEAM_CONTESTS 26
// table ids for general animations // table ids for general animations (gBattleAnims_General)
#define B_ANIM_CASTFORM_CHANGE 0x0 #define B_ANIM_CASTFORM_CHANGE 0
#define B_ANIM_STATS_CHANGE 0x1 #define B_ANIM_STATS_CHANGE 1
#define B_ANIM_SUBSTITUTE_FADE 0x2 #define B_ANIM_SUBSTITUTE_FADE 2
#define B_ANIM_SUBSTITUTE_APPEAR 0x3 #define B_ANIM_SUBSTITUTE_APPEAR 3
#define B_ANIM_BAIT_THROW 0x4 #define B_ANIM_BAIT_THROW 4
#define B_ANIM_ITEM_KNOCKOFF 0x5 #define B_ANIM_ITEM_KNOCKOFF 5
#define B_ANIM_TURN_TRAP 0x6 #define B_ANIM_TURN_TRAP 6
#define B_ANIM_HELD_ITEM_EFFECT 0x7 #define B_ANIM_HELD_ITEM_EFFECT 7
#define B_ANIM_SMOKEBALL_ESCAPE 0x8 #define B_ANIM_SMOKEBALL_ESCAPE 8
#define B_ANIM_FOCUS_BAND 0x9 #define B_ANIM_FOCUS_BAND 9
#define B_ANIM_RAIN_CONTINUES 0xA #define B_ANIM_RAIN_CONTINUES 10
#define B_ANIM_SUN_CONTINUES 0xB #define B_ANIM_SUN_CONTINUES 11
#define B_ANIM_SANDSTORM_CONTINUES 0xC #define B_ANIM_SANDSTORM_CONTINUES 12
#define B_ANIM_HAIL_CONTINUES 0xD #define B_ANIM_HAIL_CONTINUES 13
#define B_ANIM_LEECH_SEED_DRAIN 0xE #define B_ANIM_LEECH_SEED_DRAIN 14
#define B_ANIM_MON_HIT 0xF #define B_ANIM_MON_HIT 15
#define B_ANIM_ITEM_STEAL 0x10 #define B_ANIM_ITEM_STEAL 16
#define B_ANIM_SNATCH_MOVE 0x11 #define B_ANIM_SNATCH_MOVE 17
#define B_ANIM_FUTURE_SIGHT_HIT 0x12 #define B_ANIM_FUTURE_SIGHT_HIT 18
#define B_ANIM_DOOM_DESIRE_HIT 0x13 #define B_ANIM_DOOM_DESIRE_HIT 19
#define B_ANIM_FOCUS_PUNCH_SETUP 0x14 #define B_ANIM_FOCUS_PUNCH_SETUP 20
#define B_ANIM_INGRAIN_HEAL 0x15 #define B_ANIM_INGRAIN_HEAL 21
#define B_ANIM_WISH_HEAL 0x16 #define B_ANIM_WISH_HEAL 22
#define B_ANIM_MON_SCARED 0x17 #define B_ANIM_MON_SCARED 23
#define B_ANIM_GHOST_GET_OUT 0x18 #define B_ANIM_GHOST_GET_OUT 24
#define B_ANIM_SILPH_SCOPED 0x19 #define B_ANIM_SILPH_SCOPED 25
#define B_ANIM_ROCK_THROW 0x1A #define B_ANIM_ROCK_THROW 26
#define B_ANIM_SAFARI_REACTION 0x1B #define B_ANIM_SAFARI_REACTION 27
// special animations table // special animations table (gBattleAnims_Special)
#define B_ANIM_LVL_UP 0x0 #define B_ANIM_LVL_UP 0
#define B_ANIM_SWITCH_OUT_PLAYER_MON 0x1 #define B_ANIM_SWITCH_OUT_PLAYER_MON 1
#define B_ANIM_SWITCH_OUT_OPPONENT_MON 0x2 #define B_ANIM_SWITCH_OUT_OPPONENT_MON 2
#define B_ANIM_BALL_THROW 0x3 #define B_ANIM_BALL_THROW 3
#define B_ANIM_SAFARI_BALL_THROW 0x4 #define B_ANIM_BALL_THROW_WITH_TRAINER 4
#define B_ANIM_SUBSTITUTE_TO_MON 0x5 #define B_ANIM_SUBSTITUTE_TO_MON 5
#define B_ANIM_MON_TO_SUBSTITUTE 0x6 #define B_ANIM_MON_TO_SUBSTITUTE 6
// status animation table // status animation table (gBattleAnims_StatusConditions)
#define B_ANIM_STATUS_PSN 0x0 #define B_ANIM_STATUS_PSN 0
#define B_ANIM_STATUS_CONFUSION 0x1 #define B_ANIM_STATUS_CONFUSION 1
#define B_ANIM_STATUS_BRN 0x2 #define B_ANIM_STATUS_BRN 2
#define B_ANIM_STATUS_INFATUATION 0x3 #define B_ANIM_STATUS_INFATUATION 3
#define B_ANIM_STATUS_SLP 0x4 #define B_ANIM_STATUS_SLP 4
#define B_ANIM_STATUS_PRZ 0x5 #define B_ANIM_STATUS_PRZ 5
#define B_ANIM_STATUS_FRZ 0x6 #define B_ANIM_STATUS_FRZ 6
#define B_ANIM_STATUS_CURSED 0x7 #define B_ANIM_STATUS_CURSED 7
#define B_ANIM_STATUS_NIGHTMARE 0x8 #define B_ANIM_STATUS_NIGHTMARE 8
#define B_ANIM_STATUS_WRAPPED 0x9 // does not actually exist #define B_ANIM_STATUS_WRAPPED 9 // does not actually exist
// Most tasks return a value to gBattleAnimArgs[7]. // Most tasks return a value to gBattleAnimArgs[7].
#define ARG_RET_ID 0x7 #define ARG_RET_ID 7
// For createsprite macro to use internally
#define ANIMSPRITE_IS_TARGET (1 << 7)
// Trapping Wrap-like moves end turn animation. // Trapping Wrap-like moves end turn animation.
#define TRAP_ANIM_BIND 0 #define TRAP_ANIM_BIND 0
@@ -415,6 +418,22 @@
#define ANIM_WEATHER_SANDSTORM 3 #define ANIM_WEATHER_SANDSTORM 3
#define ANIM_WEATHER_HAIL 4 #define ANIM_WEATHER_HAIL 4
// Flags given to various functions to indicate which palettes to consider.
// Handled by UnpackSelectedBattlePalettes
#define F_PAL_BG (1 << 0)
#define F_PAL_ATTACKER (1 << 1)
#define F_PAL_TARGET (1 << 2)
#define F_PAL_ATK_PARTNER (1 << 3)
#define F_PAL_DEF_PARTNER (1 << 4)
#define F_PAL_ANIM_1 (1 << 5) // Palette set for GetBattleAnimBg1Data/GetBattleAnimBgDataByPriorityRank. Only used (ineffectually?) by Aromatherapy.
#define F_PAL_ANIM_2 (1 << 6) // Palette set for GetBattleAnimBgData/GetBattleAnimBgDataByPriorityRank. Unused.
#define F_PAL_ATK_SIDE (F_PAL_ATTACKER | F_PAL_ATK_PARTNER)
#define F_PAL_DEF_SIDE (F_PAL_TARGET | F_PAL_DEF_PARTNER)
#define F_PAL_BATTLERS (F_PAL_ATK_SIDE | F_PAL_DEF_SIDE)
// The below are only used by AnimTask_BlendBattleAnimPal to get battler sprite palettes by position rather than by role.
// It's redundant with F_PAL_BATTLERS, because they're only ever used together to refer to all the battlers at once.
#define F_PAL_BATTLERS_2 (1 << 7 | 1 << 8 | 1 << 9 | 1 << 10)
// Battle mon back animations. // Battle mon back animations.
#define BACK_ANIM_NONE 0x00 #define BACK_ANIM_NONE 0x00
#define BACK_ANIM_H_SLIDE_QUICK 0x01 #define BACK_ANIM_H_SLIDE_QUICK 0x01
@@ -551,10 +551,11 @@
#define B_MSG_CREPT_CLOSER 0 #define B_MSG_CREPT_CLOSER 0
#define B_MSG_CANT_GET_CLOSER 1 #define B_MSG_CANT_GET_CLOSER 1
// gSafariPokeblockResultStringIds // gSafariReactionStringIds
#define B_MSG_MON_WATCHING 0 #define B_MSG_MON_WATCHING 0
#define B_MSG_MON_ANGRY 1 #define B_MSG_MON_ANGRY 1
#define B_MSG_MON_EATING 2 #define B_MSG_MON_EATING 2
#define NUM_SAFARI_REACTIONS 3
// gFlashFireStringIds // gFlashFireStringIds
#define B_MSG_FLASH_FIRE_BOOST 0 #define B_MSG_FLASH_FIRE_BOOST 0
+25
View File
@@ -0,0 +1,25 @@
#ifndef GUARD_RGB_H
#define GUARD_RGB_H
#define GET_R(color) ((color) & 0x1F)
#define GET_G(color) (((color) >> 5) & 0x1F)
#define GET_B(color) (((color) >> 10) & 0x1F)
#define RGB(r, g, b) ((r) | ((g) << 5) | ((b) << 10))
#define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r))
#define _RGB(r, g, b) ((((b) & 0x1F) << 10) + (((g) & 0x1F) << 5) + ((r) & 0x1F))
#define RGB_ALPHA (1 << 15)
#define IS_ALPHA(color) ((color) & RGB_ALPHA)
#define RGB_BLACK RGB(0, 0, 0)
#define RGB_WHITE RGB(31, 31, 31)
#define RGB_RED RGB(31, 0, 0)
#define RGB_GREEN RGB(0, 31, 0)
#define RGB_BLUE RGB(0, 0, 31)
#define RGB_YELLOW RGB(31, 31, 0)
#define RGB_MAGENTA RGB(31, 0, 31)
#define RGB_CYAN RGB(0, 31, 31)
#define RGB_WHITEALPHA (RGB_WHITE | RGB_ALPHA)
#endif // GUARD_RGB_H
+4
View File
@@ -14,6 +14,10 @@ struct MonCoords
u8 y_offset; u8 y_offset;
}; };
#define MON_COORDS_SIZE(width, height)(DIV_ROUND_UP(width, 8) << 4 | DIV_ROUND_UP(height, 8))
#define GET_MON_COORDS_WIDTH(size)((size >> 4) * 8)
#define GET_MON_COORDS_HEIGHT(size)((size & 0xF) * 8)
extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1]; extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
extern const u8 gMoveNames[][13]; extern const u8 gMoveNames[][13];
-14
View File
@@ -79,20 +79,6 @@
#define TOTAL_OBJ_TILE_COUNT 1024 #define TOTAL_OBJ_TILE_COUNT 1024
#define RGB(r, g, b) ((r) | ((g) << 5) | ((b) << 10))
#define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r))
#define _RGB(r, g, b) ((((b) & 0x1F) << 10) + (((g) & 0x1F) << 5) + ((r) & 0x1F))
#define RGB_BLACK RGB(0, 0, 0)
#define RGB_WHITE RGB(31, 31, 31)
#define RGB_RED RGB(31, 0, 0)
#define RGB_GREEN RGB(0, 31, 0)
#define RGB_BLUE RGB(0, 0, 31)
#define RGB_YELLOW RGB(31, 31, 0)
#define RGB_MAGENTA RGB(31, 0, 31)
#define RGB_CYAN RGB(0, 31, 31)
#define RGB_WHITEALPHA (RGB_WHITE | 0x8000)
// Some functions are strictly inline asm // Some functions are strictly inline asm
#define NAKED __attribute__((naked)) #define NAKED __attribute__((naked))
#define UNUSED __attribute__((unused)) #define UNUSED __attribute__((unused))
+1
View File
@@ -9,6 +9,7 @@
#include "constants/vars.h" #include "constants/vars.h"
#include "constants/species.h" #include "constants/species.h"
#include "constants/easy_chat.h" #include "constants/easy_chat.h"
#include "constants/rgb.h"
// Prevent cross-jump optimization. // Prevent cross-jump optimization.
#define BLOCK_CROSS_JUMP asm(""); #define BLOCK_CROSS_JUMP asm("");
+8 -4
View File
@@ -3687,6 +3687,10 @@ extern const u32 gBattleStatMask8_Pal[];
extern const u32 gBattleStatMask1_Tilemap[]; extern const u32 gBattleStatMask1_Tilemap[];
extern const u32 gBattleStatMask2_Tilemap[]; extern const u32 gBattleStatMask2_Tilemap[];
extern const u32 gSmokescreenImpactTiles[];
extern const u32 gSmokescreenImpactPalette[];
extern const u32 gEnemyMonShadow_Gfx[];
// battle anim particle gfx // battle anim particle gfx
extern const u32 gBattleAnimSpriteGfx_Bone[]; extern const u32 gBattleAnimSpriteGfx_Bone[];
extern const u32 gBattleAnimSpriteGfx_Spark[]; extern const u32 gBattleAnimSpriteGfx_Spark[];
@@ -3908,7 +3912,7 @@ extern const u32 gBattleAnimSpriteGfx_Pokeball[];
extern const u32 gBattleAnimSpriteGfx_Spotlight[]; extern const u32 gBattleAnimSpriteGfx_Spotlight[];
extern const u32 gBattleAnimSpriteGfx_LetterZ[]; extern const u32 gBattleAnimSpriteGfx_LetterZ[];
extern const u32 gBattleAnimSpriteGfx_RapidSpin[]; extern const u32 gBattleAnimSpriteGfx_RapidSpin[];
extern const u32 gBattleAnimSpriteGfx_TriForceTriangle[]; extern const u32 gBattleAnimSpriteGfx_TriAttackTriangle[];
extern const u32 gBattleAnimSpriteGfx_WispOrb[]; extern const u32 gBattleAnimSpriteGfx_WispOrb[];
extern const u32 gBattleAnimSpriteGfx_WispFire[]; extern const u32 gBattleAnimSpriteGfx_WispFire[];
extern const u32 gBattleAnimSpriteGfx_GoldStars[]; extern const u32 gBattleAnimSpriteGfx_GoldStars[];
@@ -4161,7 +4165,7 @@ extern const u32 gBattleAnimSpritePal_JaggedMusicNote[];
extern const u32 gBattleAnimSpritePal_Pokeball[]; extern const u32 gBattleAnimSpritePal_Pokeball[];
extern const u32 gBattleAnimSpritePal_LetterZ[]; extern const u32 gBattleAnimSpritePal_LetterZ[];
extern const u32 gBattleAnimSpritePal_RapidSpin[]; extern const u32 gBattleAnimSpritePal_RapidSpin[];
extern const u32 gBattleAnimSpritePal_TriForceTriangle[]; extern const u32 gBattleAnimSpritePal_TriAttackTriangle[];
extern const u32 gBattleAnimSpritePal_WispOrb[]; extern const u32 gBattleAnimSpritePal_WispOrb[];
extern const u32 gBattleAnimSpritePal_GoldStars[]; extern const u32 gBattleAnimSpritePal_GoldStars[];
extern const u32 gBattleAnimSpritePal_EclipsingOrb[]; extern const u32 gBattleAnimSpritePal_EclipsingOrb[];
@@ -4215,8 +4219,8 @@ extern const u32 gBattleAnimSpritePal_WhipHit[];
extern const u32 gBattleAnimSpritePal_BlueRing2[]; extern const u32 gBattleAnimSpritePal_BlueRing2[];
// battle anim task // battle anim task
extern const u32 gUnknown_D2EC24_Gfx[]; extern const u32 gUnusedLevelupAnimationGfx[];
extern const u32 gUnknown_D2EC24_Tilemap[]; extern const u32 gUnusedLevelupAnimationTilemap[];
extern const u32 gCureBubblesGfx[]; extern const u32 gCureBubblesGfx[];
extern const u32 gCureBubblesPal[]; extern const u32 gCureBubblesPal[];
extern const u32 gCureBubblesTilemap[]; extern const u32 gCureBubblesTilemap[];
+1 -1
View File
@@ -78,7 +78,7 @@ void sub_80716F8(const u16 *src, u16 *dst, u16 count, u8 a4);
void sub_80717A8(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7); void sub_80717A8(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7);
bool32 sub_807185C(u8 var); bool32 sub_807185C(u8 var);
void sub_8071898(void); void sub_8071898(void);
void ResetPaletteStructByUid(u16 a1); void PaletteStruct_ResetById(u16 a1);
void ResetPaletteStruct(u8 paletteNum); void ResetPaletteStruct(u8 paletteNum);
#endif // GUARD_PALETTE_H #endif // GUARD_PALETTE_H
+1
View File
@@ -4,6 +4,7 @@
#include "global.h" #include "global.h"
#define MAX_SPRITES 64 #define MAX_SPRITES 64
#define SPRITE_NONE 0xFF
#define TAG_NONE 0xFFFF #define TAG_NONE 0xFFFF
struct SpriteSheet struct SpriteSheet
+32 -32
View File
@@ -81,7 +81,7 @@ SECTIONS {
src/blend_palette.o(.text); src/blend_palette.o(.text);
src/daycare.o(.text); src/daycare.o(.text);
src/battle_interface.o(.text); src/battle_interface.o(.text);
src/smokescreen.o(.text); src/battle_anim_smokescreen.o(.text);
src/pokeball.o(.text); src/pokeball.o(.text);
src/load_save.o(.text); src/load_save.o(.text);
src/trade.o(.text); src/trade.o(.text);
@@ -162,21 +162,21 @@ SECTIONS {
src/item_use.o(.text); src/item_use.o(.text);
src/battle_anim_effects_1.o(.text); src/battle_anim_effects_1.o(.text);
src/battle_anim_effects_2.o(.text); src/battle_anim_effects_2.o(.text);
src/water.o(.text); src/battle_anim_water.o(.text);
src/fire.o(.text); src/battle_anim_fire.o(.text);
src/electric.o(.text); src/battle_anim_electric.o(.text);
src/ice.o(.text); src/battle_anim_ice.o(.text);
src/fighting.o(.text); src/battle_anim_fight.o(.text);
src/poison.o(.text); src/battle_anim_poison.o(.text);
src/flying.o(.text); src/battle_anim_flying.o(.text);
src/psychic.o(.text); src/battle_anim_psychic.o(.text);
src/bug.o(.text); src/battle_anim_bug.o(.text);
src/rock.o(.text); src/battle_anim_rock.o(.text);
src/ghost.o(.text); src/battle_anim_ghost.o(.text);
src/dragon.o(.text); src/battle_anim_dragon.o(.text);
src/dark.o(.text); src/battle_anim_dark.o(.text);
src/ground.o(.text); src/battle_anim_ground.o(.text);
src/normal.o(.text); src/battle_anim_normal.o(.text);
src/battle_anim_utility_funcs.o(.text); src/battle_anim_utility_funcs.o(.text);
src/battle_intro.o(.text); src/battle_intro.o(.text);
src/bike.o(.text); src/bike.o(.text);
@@ -409,7 +409,7 @@ SECTIONS {
src/battle_util.o(.rodata); src/battle_util.o(.rodata);
src/battle_script_commands.o(.rodata); src/battle_script_commands.o(.rodata);
src/battle_controller_player.o(.rodata); src/battle_controller_player.o(.rodata);
data/smokescreen.o(.rodata); src/battle_anim_smokescreen.o(.rodata);
src/battle_controller_opponent.o(.rodata); src/battle_controller_opponent.o(.rodata);
src/battle_controller_link_opponent.o(.rodata); src/battle_controller_link_opponent.o(.rodata);
src/pokemon.o(.rodata); src/pokemon.o(.rodata);
@@ -474,21 +474,21 @@ SECTIONS {
src/item_use.o(.rodata); src/item_use.o(.rodata);
src/battle_anim_effects_1.o(.rodata); src/battle_anim_effects_1.o(.rodata);
src/battle_anim_effects_2.o(.rodata); src/battle_anim_effects_2.o(.rodata);
src/water.o(.rodata); src/battle_anim_water.o(.rodata);
src/fire.o(.rodata); src/battle_anim_fire.o(.rodata);
src/electric.o(.rodata); src/battle_anim_electric.o(.rodata);
src/ice.o(.rodata); src/battle_anim_ice.o(.rodata);
src/fighting.o(.rodata); src/battle_anim_fight.o(.rodata);
src/poison.o(.rodata); src/battle_anim_poison.o(.rodata);
src/flying.o(.rodata); src/battle_anim_flying.o(.rodata);
src/psychic.o(.rodata); src/battle_anim_psychic.o(.rodata);
src/bug.o(.rodata); src/battle_anim_bug.o(.rodata);
src/rock.o(.rodata); src/battle_anim_rock.o(.rodata);
src/ghost.o(.rodata); src/battle_anim_ghost.o(.rodata);
src/dragon.o(.rodata); src/battle_anim_dragon.o(.rodata);
src/dark.o(.rodata); src/battle_anim_dark.o(.rodata);
src/ground.o(.rodata); src/battle_anim_ground.o(.rodata);
src/normal.o(.rodata); src/battle_anim_normal.o(.rodata);
src/battle_anim_utility_funcs.o(.rodata); src/battle_anim_utility_funcs.o(.rodata);
src/battle_intro.o(.rodata); src/battle_intro.o(.rodata);
src/bike.o(.rodata); src/bike.o(.rodata);
+2 -2
View File
@@ -1714,13 +1714,13 @@ static void Cmd_if_random_safari_flee(void)
{ {
u8 safariFleeRate; u8 safariFleeRate;
if (gBattleStruct->safariGoNearCounter) if (gBattleStruct->safariRockThrowCounter)
{ {
safariFleeRate = gBattleStruct->safariEscapeFactor * 2; safariFleeRate = gBattleStruct->safariEscapeFactor * 2;
if (safariFleeRate > 20) if (safariFleeRate > 20)
safariFleeRate = 20; safariFleeRate = 20;
} }
else if (gBattleStruct->safariPkblThrowCounter != 0) else if (gBattleStruct->safariBaitThrowCounter != 0)
{ {
safariFleeRate = gBattleStruct->safariEscapeFactor / 4; safariFleeRate = gBattleStruct->safariEscapeFactor / 4;
if (safariFleeRate == 0) if (safariFleeRate == 0)
+200 -1811
View File
File diff suppressed because it is too large Load Diff
+35 -35
View File
@@ -6,16 +6,16 @@
static void AnimMegahornHorn(struct Sprite *sprite); static void AnimMegahornHorn(struct Sprite *sprite);
static void AnimLeechLifeNeedle(struct Sprite *sprite); static void AnimLeechLifeNeedle(struct Sprite *sprite);
static void AnimTranslateWebThread(struct Sprite *sprite); static void AnimTranslateWebThread(struct Sprite *sprite);
static void AnimTranslateWebThread_Step(struct Sprite *sprite);
static void AnimStringWrap(struct Sprite *sprite); static void AnimStringWrap(struct Sprite *sprite);
static void AnimStringWrap_Step(struct Sprite *sprite);
static void AnimSpiderWeb(struct Sprite *sprite); static void AnimSpiderWeb(struct Sprite *sprite);
static void AnimSpiderWeb_Step(struct Sprite *sprite);
static void AnimSpiderWeb_End(struct Sprite *sprite);
static void AnimTranslateStinger(struct Sprite *sprite); static void AnimTranslateStinger(struct Sprite *sprite);
static void AnimMissileArc(struct Sprite *sprite); static void AnimMissileArc(struct Sprite *sprite);
static void AnimMissileArc_Step(struct Sprite *sprite);
static void AnimTailGlowOrb(struct Sprite *sprite); static void AnimTailGlowOrb(struct Sprite *sprite);
static void sub_80B41C0(struct Sprite *sprite);
static void sub_80B4274(struct Sprite *sprite);
static void sub_80B42E8(struct Sprite *sprite);
static void sub_80B4344(struct Sprite *sprite);
static void AnimMissileArcStep(struct Sprite *sprite);
static const union AffineAnimCmd sAffineAnim_MegahornHorn_0[] = static const union AffineAnimCmd sAffineAnim_MegahornHorn_0[] =
{ {
@@ -210,11 +210,11 @@ static void AnimMegahornHorn(struct Sprite *sprite)
gBattleAnimArgs[3] = -gBattleAnimArgs[3]; gBattleAnimArgs[3] = -gBattleAnimArgs[3];
gBattleAnimArgs[0] = -gBattleAnimArgs[0]; gBattleAnimArgs[0] = -gBattleAnimArgs[0];
} }
sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, 2) + gBattleAnimArgs[0]; sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0];
sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, 3) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];
sprite->data[0] = gBattleAnimArgs[4]; sprite->data[0] = gBattleAnimArgs[4];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
sprite->callback = StartAnimLinearTranslation; sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
} }
@@ -231,11 +231,11 @@ static void AnimLeechLifeNeedle(struct Sprite *sprite)
gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[1] = -gBattleAnimArgs[1];
gBattleAnimArgs[0] = -gBattleAnimArgs[0]; gBattleAnimArgs[0] = -gBattleAnimArgs[0];
} }
sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, 2) + gBattleAnimArgs[0]; sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0];
sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, 3) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];
sprite->data[0] = gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[2];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->callback = StartAnimLinearTranslation; sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
} }
@@ -257,19 +257,19 @@ static void AnimTranslateWebThread(struct Sprite *sprite)
sprite->data[3] = sprite->y; sprite->data[3] = sprite->y;
if (!gBattleAnimArgs[4]) if (!gBattleAnimArgs[4])
{ {
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
} }
else else
{ {
SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]); SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]);
} }
BattleAnim_InitLinearTranslationWithDuration(sprite); InitAnimLinearTranslationWithSpeed(sprite);
sprite->data[5] = gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[3];
sprite->callback = sub_80B41C0; sprite->callback = AnimTranslateWebThread_Step;
} }
static void sub_80B41C0(struct Sprite *sprite) static void AnimTranslateWebThread_Step(struct Sprite *sprite)
{ {
if (AnimTranslateLinear(sprite)) if (AnimTranslateLinear(sprite))
{ {
@@ -290,10 +290,10 @@ static void AnimStringWrap(struct Sprite *sprite)
sprite->y += gBattleAnimArgs[1]; sprite->y += gBattleAnimArgs[1];
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
sprite->y += 8; sprite->y += 8;
sprite->callback = sub_80B4274; sprite->callback = AnimStringWrap_Step;
} }
static void sub_80B4274(struct Sprite *sprite) static void AnimStringWrap_Step(struct Sprite *sprite)
{ {
if (++sprite->data[0] == 3) if (++sprite->data[0] == 3)
{ {
@@ -311,10 +311,10 @@ static void AnimSpiderWeb(struct Sprite *sprite)
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
sprite->data[0] = 16; sprite->data[0] = 16;
sprite->callback = sub_80B42E8; sprite->callback = AnimSpiderWeb_Step;
} }
static void sub_80B42E8(struct Sprite *sprite) static void AnimSpiderWeb_Step(struct Sprite *sprite)
{ {
if (sprite->data[2] < 20) if (sprite->data[2] < 20)
{ {
@@ -328,12 +328,12 @@ static void sub_80B42E8(struct Sprite *sprite)
if (sprite->data[0] == 0) if (sprite->data[0] == 0)
{ {
sprite->invisible = TRUE; sprite->invisible = TRUE;
sprite->callback = sub_80B4344; sprite->callback = AnimSpiderWeb_End;
} }
} }
} }
static void sub_80B4344(struct Sprite *sprite) static void AnimSpiderWeb_End(struct Sprite *sprite)
{ {
SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0);
@@ -377,8 +377,8 @@ static void AnimTranslateStinger(struct Sprite *sprite)
} }
} }
InitSpritePosToAnimAttacker(sprite, 1); InitSpritePosToAnimAttacker(sprite, 1);
lVarX = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2]; lVarX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
lVarY = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3]; lVarY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
rot = ArcTan2Neg(lVarX - sprite->x, lVarY - sprite->y); rot = ArcTan2Neg(lVarX - sprite->x, lVarY - sprite->y);
rot += 0xC000; rot += 0xC000;
TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rot); TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rot);
@@ -402,15 +402,15 @@ static void AnimMissileArc(struct Sprite *sprite)
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[2] = -gBattleAnimArgs[2]; gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[4]; sprite->data[0] = gBattleAnimArgs[4];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
sprite->data[5] = gBattleAnimArgs[5]; sprite->data[5] = gBattleAnimArgs[5];
InitAnimArcTranslation(sprite); InitAnimArcTranslation(sprite);
sprite->callback = AnimMissileArcStep; sprite->callback = AnimMissileArc_Step;
sprite->invisible = TRUE; sprite->invisible = TRUE;
} }
static void AnimMissileArcStep(struct Sprite *sprite) static void AnimMissileArc_Step(struct Sprite *sprite)
{ {
sprite->invisible = FALSE; sprite->invisible = FALSE;
@@ -447,15 +447,15 @@ static void AnimMissileArcStep(struct Sprite *sprite)
static void AnimTailGlowOrb(struct Sprite *sprite) static void AnimTailGlowOrb(struct Sprite *sprite)
{ {
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == ANIM_ATTACKER)
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + 18; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + 18;
} }
else else
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + 18; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + 18;
} }
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
sprite->callback = RunStoredCallbackWhenAffineAnimEnds; sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
+59 -56
View File
@@ -6,23 +6,24 @@
#include "trig.h" #include "trig.h"
#include "util.h" #include "util.h"
static void sub_80B7ACC(struct Sprite *sprite); static void AnimUnusedBagSteal(struct Sprite *sprite);
static void AnimUnusedBagSteal_Step(struct Sprite *sprite);
static void AnimBite(struct Sprite *sprite); static void AnimBite(struct Sprite *sprite);
static void AnimTearDrop(struct Sprite *sprite); static void AnimTearDrop(struct Sprite *sprite);
static void AnimClawSlash(struct Sprite *sprite); static void AnimClawSlash(struct Sprite *sprite);
static void AnimTask_AttackerFadeToInvisible_Step(u8 taskId); static void AnimTask_AttackerFadeToInvisible_Step(u8 taskId);
static void AnimTask_AttackerFadeFromInvisible_Step(u8 taskId); static void AnimTask_AttackerFadeFromInvisible_Step(u8 taskId);
static void sub_80B7B48(struct Sprite *sprite); static void AnimBite_Step1(struct Sprite *sprite);
static void sub_80B7C10(struct Sprite *sprite); static void AnimBite_Step2(struct Sprite *sprite);
static void sub_80B7C50(struct Sprite *sprite); static void AnimTearDrop_Step(struct Sprite *sprite);
static void sub_80B7D88(struct Sprite *sprite); static void SetAllBattlersSpritePriority(u8 priority);
static void sub_80B856C(u8 priority); static void AnimTask_MoveAttackerMementoShadow_Step(u8 taskId);
static void sub_80B7F58(u8 taskId); static void DoMementoShadowEffect(struct Task *task);
static void sub_80B843C(struct Task *task); static void AnimTask_MoveTargetMementoShadow_Step(u8 taskId);
static void sub_80B82C0(u8 taskId); static void AnimTask_MetallicShine_Step(u8 taskId);
static void sub_80B8920(u8 taskId);
const struct SpriteTemplate gUnknown_83E7878 = // Unused
const struct SpriteTemplate sUnusedBagStealSpriteTemplate =
{ {
.tileTag = ANIM_TAG_TIED_BAG, .tileTag = ANIM_TAG_TIED_BAG,
.paletteTag = ANIM_TAG_TIED_BAG, .paletteTag = ANIM_TAG_TIED_BAG,
@@ -30,7 +31,7 @@ const struct SpriteTemplate gUnknown_83E7878 =
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80B7ACC, .callback = AnimUnusedBagSteal,
}; };
static const union AffineAnimCmd sAffineAnim_Bite_0[] = static const union AffineAnimCmd sAffineAnim_Bite_0[] =
@@ -265,7 +266,7 @@ void AnimTask_InitAttackerFadeFromInvisible(u8 taskId)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
static void sub_80B7ACC(struct Sprite *sprite) static void AnimUnusedBagSteal(struct Sprite *sprite)
{ {
sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
@@ -276,11 +277,11 @@ static void sub_80B7ACC(struct Sprite *sprite)
sprite->data[3] = -sprite->data[1]; sprite->data[3] = -sprite->data[1];
sprite->data[4] = -sprite->data[2]; sprite->data[4] = -sprite->data[2];
sprite->data[6] = 0xFFD8; sprite->data[6] = 0xFFD8;
sprite->callback = sub_80B7B48; sprite->callback = AnimUnusedBagSteal_Step;
sprite->callback(sprite); sprite->callback(sprite);
} }
static void sub_80B7B48(struct Sprite *sprite) static void AnimUnusedBagSteal_Step(struct Sprite *sprite)
{ {
sprite->data[3] += sprite->data[1]; sprite->data[3] += sprite->data[1];
sprite->data[4] += sprite->data[2]; sprite->data[4] += sprite->data[2];
@@ -306,6 +307,7 @@ static void sub_80B7B48(struct Sprite *sprite)
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
} }
// Move sprite inward for Bite/Crunch and Clamp
static void AnimBite(struct Sprite *sprite) static void AnimBite(struct Sprite *sprite)
{ {
sprite->x += gBattleAnimArgs[0]; sprite->x += gBattleAnimArgs[0];
@@ -314,20 +316,20 @@ static void AnimBite(struct Sprite *sprite)
sprite->data[0] = gBattleAnimArgs[3]; sprite->data[0] = gBattleAnimArgs[3];
sprite->data[1] = gBattleAnimArgs[4]; sprite->data[1] = gBattleAnimArgs[4];
sprite->data[2] = gBattleAnimArgs[5]; sprite->data[2] = gBattleAnimArgs[5];
sprite->callback = sub_80B7C10; sprite->callback = AnimBite_Step1;
} }
static void sub_80B7C10(struct Sprite *sprite) static void AnimBite_Step1(struct Sprite *sprite)
{ {
sprite->data[4] += sprite->data[0]; sprite->data[4] += sprite->data[0];
sprite->data[5] += sprite->data[1]; sprite->data[5] += sprite->data[1];
sprite->x2 = sprite->data[4] >> 8; sprite->x2 = sprite->data[4] >> 8;
sprite->y2 = sprite->data[5] >> 8; sprite->y2 = sprite->data[5] >> 8;
if (++sprite->data[3] == sprite->data[2]) if (++sprite->data[3] == sprite->data[2])
sprite->callback = sub_80B7C50; sprite->callback = AnimBite_Step2;
} }
static void sub_80B7C50(struct Sprite *sprite) static void AnimBite_Step2(struct Sprite *sprite)
{ {
sprite->data[4] -= sprite->data[0]; sprite->data[4] -= sprite->data[0];
sprite->data[5] -= sprite->data[1]; sprite->data[5] -= sprite->data[1];
@@ -337,12 +339,13 @@ static void sub_80B7C50(struct Sprite *sprite)
DestroySpriteAndMatrix(sprite); DestroySpriteAndMatrix(sprite);
} }
// Launches a tear drop away from the battler. Used by Fake Tears
static void AnimTearDrop(struct Sprite *sprite) static void AnimTearDrop(struct Sprite *sprite)
{ {
u8 battler; u8 battler;
s8 xOffset; s8 xOffset;
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == ANIM_ATTACKER)
battler = gBattleAnimAttacker; battler = gBattleAnimAttacker;
else else
battler = gBattleAnimTarget; battler = gBattleAnimTarget;
@@ -376,10 +379,10 @@ static void AnimTearDrop(struct Sprite *sprite)
sprite->data[4] = sprite->y + 12; sprite->data[4] = sprite->y + 12;
sprite->data[5] = -12; sprite->data[5] = -12;
InitAnimArcTranslation(sprite); InitAnimArcTranslation(sprite);
sprite->callback = sub_80B7D88; sprite->callback = AnimTearDrop_Step;
} }
static void sub_80B7D88(struct Sprite *sprite) static void AnimTearDrop_Step(struct Sprite *sprite)
{ {
if (TranslateAnimHorizontalArc(sprite)) if (TranslateAnimHorizontalArc(sprite))
DestroySpriteAndMatrix(sprite); DestroySpriteAndMatrix(sprite);
@@ -416,7 +419,7 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId)
scanlineParams.dmaDest = &REG_BG1VOFS; scanlineParams.dmaDest = &REG_BG1VOFS;
var0 = WINOUT_WIN01_BG1; var0 = WINOUT_WIN01_BG1;
if (!IsContest()) if (!IsContest())
gBattle_BG2_X += 240; gBattle_BG2_X += DISPLAY_WIDTH;
} }
else else
{ {
@@ -426,7 +429,7 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId)
scanlineParams.dmaDest = &REG_BG2VOFS; scanlineParams.dmaDest = &REG_BG2VOFS;
var0 = WINOUT_WIN01_BG2; var0 = WINOUT_WIN01_BG2;
if (!IsContest()) if (!IsContest())
gBattle_BG1_X += 240; gBattle_BG1_X += DISPLAY_WIDTH;
} }
scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
scanlineParams.initState = 1; scanlineParams.initState = 1;
@@ -436,7 +439,7 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId)
task->data[0] = 0; task->data[0] = 0;
task->data[1] = 0; task->data[1] = 0;
task->data[2] = 0; task->data[2] = 0;
sub_80B856C(3); SetAllBattlersSpritePriority(3);
for (i = 0; i < 112; ++i) for (i = 0; i < 112; ++i)
{ {
gScanlineEffectRegBuffers[0][i] = task->data[10]; gScanlineEffectRegBuffers[0][i] = task->data[10];
@@ -446,12 +449,12 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId)
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | (var0 ^ (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR))); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | (var0 ^ (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR)));
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
gBattle_WIN0V = 160; gBattle_WIN0V = DISPLAY_HEIGHT;
task->func = sub_80B7F58; task->func = AnimTask_MoveAttackerMementoShadow_Step;
} }
static void sub_80B7F58(u8 taskId) static void AnimTask_MoveAttackerMementoShadow_Step(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -477,13 +480,13 @@ static void sub_80B7F58(u8 taskId)
break; break;
case 1: case 1:
task->data[4] -= 8; task->data[4] -= 8;
sub_80B843C(task); DoMementoShadowEffect(task);
if (task->data[4] < task->data[8]) if (task->data[4] < task->data[8])
++task->data[0]; ++task->data[0];
break; break;
case 2: case 2:
task->data[4] -= 8; task->data[4] -= 8;
sub_80B843C(task); DoMementoShadowEffect(task);
task->data[14] += 4; task->data[14] += 4;
task->data[15] -= 4; task->data[15] -= 4;
if (task->data[14] >= task->data[15]) if (task->data[14] >= task->data[15])
@@ -527,12 +530,12 @@ void AnimTask_MoveTargetMementoShadow(u8 taskId)
if (task->data[3] == 1) if (task->data[3] == 1)
{ {
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
gBattle_BG2_X += 240; gBattle_BG2_X += DISPLAY_WIDTH;
} }
else else
{ {
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);
gBattle_BG1_X += 240; gBattle_BG1_X += DISPLAY_WIDTH;
} }
++task->data[0]; ++task->data[0];
} }
@@ -549,7 +552,7 @@ void AnimTask_MoveTargetMementoShadow(u8 taskId)
task->data[10] = gBattle_BG2_Y; task->data[10] = gBattle_BG2_Y;
FillPalette(RGB_BLACK, 9 * 16, 32); FillPalette(RGB_BLACK, 9 * 16, 32);
} }
sub_80B856C(3); SetAllBattlersSpritePriority(3);
++task->data[0]; ++task->data[0];
break; break;
case 2: case 2:
@@ -592,17 +595,17 @@ void AnimTask_MoveTargetMementoShadow(u8 taskId)
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
gBattle_WIN0V = 160; gBattle_WIN0V = DISPLAY_HEIGHT;
task->data[0] = 0; task->data[0] = 0;
task->data[1] = 0; task->data[1] = 0;
task->data[2] = 0; task->data[2] = 0;
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 8)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 8));
task->func = sub_80B82C0; task->func = AnimTask_MoveTargetMementoShadow_Step;
break; break;
} }
} }
static void sub_80B82C0(u8 taskId) static void AnimTask_MoveTargetMementoShadow_Step(u8 taskId)
{ {
u8 pos; u8 pos;
u16 i; u16 i;
@@ -614,7 +617,7 @@ static void sub_80B82C0(u8 taskId)
task->data[5] += 8; task->data[5] += 8;
if (task->data[5] >= task->data[7]) if (task->data[5] >= task->data[7])
task->data[5] = task->data[7]; task->data[5] = task->data[7];
sub_80B843C(task); DoMementoShadowEffect(task);
if (task->data[5] == task->data[7]) if (task->data[5] == task->data[7])
++task->data[0]; ++task->data[0];
break; break;
@@ -632,7 +635,7 @@ static void sub_80B82C0(u8 taskId)
task->data[4] += 8; task->data[4] += 8;
if (task->data[4] >= task->data[6]) if (task->data[4] >= task->data[6])
task->data[4] = task->data[6]; task->data[4] = task->data[6];
sub_80B843C(task); DoMementoShadowEffect(task);
if (task->data[4] == task->data[6] && task->data[1]) if (task->data[4] == task->data[6] && task->data[1])
{ {
task->data[1] = 0; task->data[1] = 0;
@@ -672,7 +675,7 @@ static void sub_80B82C0(u8 taskId)
} }
} }
static void sub_80B843C(struct Task *task) static void DoMementoShadowEffect(struct Task *task)
{ {
s32 var0, var1, var4; s32 var0, var1, var4;
s16 var2, i; s16 var2, i;
@@ -711,15 +714,14 @@ static void sub_80B843C(struct Task *task)
} }
} }
static void sub_80B856C(u8 priority) static void SetAllBattlersSpritePriority(u8 priority)
{ {
u16 i; u16 i;
for (i = 0; i < MAX_BATTLERS_COUNT; ++i) for (i = 0; i < MAX_BATTLERS_COUNT; ++i)
{ {
u8 spriteId = GetAnimBattlerSpriteId(i); u8 spriteId = GetAnimBattlerSpriteId(i);
if (spriteId != SPRITE_NONE)
if (spriteId != 0xFF)
gSprites[spriteId].oam.priority = priority; gSprites[spriteId].oam.priority = priority;
} }
} }
@@ -738,7 +740,7 @@ void AnimTask_InitMementoShadow(u8 taskId)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
void sub_80B8664(u8 taskId) void AnimTask_MementoHandleBg(u8 taskId)
{ {
bool8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? TRUE : FALSE; bool8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? TRUE : FALSE;
@@ -748,6 +750,7 @@ void sub_80B8664(u8 taskId)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
// Animates a deep slash from a claw. Used by Metal Claw, Dragon Claw, and Crush Claw
static void AnimClawSlash(struct Sprite *sprite) static void AnimClawSlash(struct Sprite *sprite)
{ {
sprite->x += gBattleAnimArgs[0]; sprite->x += gBattleAnimArgs[0];
@@ -799,7 +802,7 @@ void AnimTask_MetallicShine(u8 taskId)
else else
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
newSpriteId = CreateCloneOfSpriteInWindowMode(gBattleAnimAttacker, spriteId, species); newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species);
GetBattleAnimBg1Data(&animBg); GetBattleAnimBg1Data(&animBg);
AnimLoadCompressedBgTilemap(animBg.bgId, gMetalShineTilemap); AnimLoadCompressedBgTilemap(animBg.bgId, gMetalShineTilemap);
AnimLoadCompressedBgGfx(animBg.bgId, gMetalShineGfx, animBg.tilesOffset); AnimLoadCompressedBgGfx(animBg.bgId, gMetalShineGfx, animBg.tilesOffset);
@@ -816,10 +819,10 @@ void AnimTask_MetallicShine(u8 taskId)
gTasks[taskId].data[2] = gBattleAnimArgs[1]; gTasks[taskId].data[2] = gBattleAnimArgs[1];
gTasks[taskId].data[3] = gBattleAnimArgs[2]; gTasks[taskId].data[3] = gBattleAnimArgs[2];
gTasks[taskId].data[6] = priorityChanged; gTasks[taskId].data[6] = priorityChanged;
gTasks[taskId].func = sub_80B8920; gTasks[taskId].func = AnimTask_MetallicShine_Step;
} }
static void sub_80B8920(u8 taskId) static void AnimTask_MetallicShine_Step(u8 taskId)
{ {
struct BattleAnimBgData animBg; struct BattleAnimBgData animBg;
u16 paletteNum; u16 paletteNum;
@@ -863,7 +866,7 @@ static void sub_80B8920(u8 taskId)
// Changes battler's palette to either greyscale or original. // Changes battler's palette to either greyscale or original.
// arg0: which battler // arg0: which battler
// arg1: 0 grayscale, 1 original // arg1: 0 grayscale, 1 original
void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId) void AnimTask_SetGrayscaleOrOriginalPal(u8 taskId)
{ {
u8 spriteId, battler; u8 spriteId, battler;
bool8 calcSpriteId = FALSE; bool8 calcSpriteId = FALSE;
@@ -871,10 +874,10 @@ void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId)
switch (gBattleAnimArgs[0]) switch (gBattleAnimArgs[0])
{ {
case 0: case ANIM_ATTACKER:
case 1: case ANIM_TARGET:
case 2: case ANIM_ATK_PARTNER:
case 3: case ANIM_DEF_PARTNER:
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
break; break;
case 4: case 4:
@@ -894,7 +897,7 @@ void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId)
calcSpriteId = TRUE; calcSpriteId = TRUE;
break; break;
default: default:
spriteId = 0xFF; spriteId = SPRITE_NONE;
break; break;
} }
if (calcSpriteId) if (calcSpriteId)
@@ -903,9 +906,9 @@ void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId)
if (IsBattlerSpriteVisible(battler)) if (IsBattlerSpriteVisible(battler))
spriteId = gBattlerSpriteIds[battler]; spriteId = gBattlerSpriteIds[battler];
else else
spriteId = 0xFF; spriteId = SPRITE_NONE;
} }
if (spriteId != 0xFF) if (spriteId != SPRITE_NONE)
SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]); SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]);
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
@@ -913,8 +916,8 @@ void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId)
void GetIsDoomDesireHitTurn(u8 taskId) void GetIsDoomDesireHitTurn(u8 taskId)
{ {
if (gAnimMoveTurn < 2) if (gAnimMoveTurn < 2)
gBattleAnimArgs[7] = 0; gBattleAnimArgs[ARG_RET_ID] = FALSE;
if (gAnimMoveTurn == 2) if (gAnimMoveTurn == 2)
gBattleAnimArgs[7] = 1; gBattleAnimArgs[ARG_RET_ID] = TRUE;
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
+50 -47
View File
@@ -4,19 +4,19 @@
#include "task.h" #include "task.h"
#include "trig.h" #include "trig.h"
static void sub_80B725C(struct Sprite *sprite); static void AnimOutrageFlame(struct Sprite *sprite);
static void AnimDragonFireToTarget(struct Sprite *sprite); static void AnimDragonFireToTarget(struct Sprite *sprite);
static void AnimDragonRageFirePlume(struct Sprite *sprite); static void AnimDragonRageFirePlume(struct Sprite *sprite);
static void AnimDragonDanceOrb(struct Sprite *sprite); static void AnimDragonDanceOrb(struct Sprite *sprite);
static void AnimOverheatFlame(struct Sprite *sprite); static void AnimOverheatFlame(struct Sprite *sprite);
static void sub_80B74D8(struct Sprite *sprite); static void AnimDragonDanceOrb_Step(struct Sprite *sprite);
static void sub_80B76B0(u8 taskId); static void AnimTask_DragonDanceWaver_Step(u8 taskId);
static void sub_80B776C(struct Task *task); static void UpdateDragonDanceScanlineEffect(struct Task *task);
static void sub_80B7894(struct Sprite *sprite); static void AnimOverheatFlame_Step(struct Sprite *sprite);
static EWRAM_DATA u16 gUnknown_20399A4[7] = {0}; static EWRAM_DATA u16 sUnusedOverheatData[7] = {0};
static const union AnimCmd gUnknown_83E7710[] = static const union AnimCmd sAnim_OutrageOverheatFire_0[] =
{ {
ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(0, 4),
ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(16, 4),
@@ -26,9 +26,9 @@ static const union AnimCmd gUnknown_83E7710[] =
ANIMCMD_JUMP(0), ANIMCMD_JUMP(0),
}; };
static const union AnimCmd *const gUnknown_83E7728[] = static const union AnimCmd *const sAnims_OutrageOverheatFire[] =
{ {
gUnknown_83E7710, sAnim_OutrageOverheatFire_0,
}; };
const struct SpriteTemplate gOutrageFlameSpriteTemplate = const struct SpriteTemplate gOutrageFlameSpriteTemplate =
@@ -36,10 +36,10 @@ const struct SpriteTemplate gOutrageFlameSpriteTemplate =
.tileTag = ANIM_TAG_SMALL_EMBER, .tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E7728, .anims = sAnims_OutrageOverheatFire,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80B725C, .callback = AnimOutrageFlame,
}; };
static const union AnimCmd sAnim_DragonBreathFire_0[] = static const union AnimCmd sAnim_DragonBreathFire_0[] =
@@ -180,16 +180,16 @@ const struct SpriteTemplate gOverheatFlameSpriteTemplate =
.tileTag = ANIM_TAG_SMALL_EMBER, .tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E7728, .anims = sAnims_OutrageOverheatFire,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimOverheatFlame, .callback = AnimOverheatFlame,
}; };
static void sub_80B725C(struct Sprite *sprite) static void AnimOutrageFlame(struct Sprite *sprite)
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{ {
sprite->x -= gBattleAnimArgs[0]; sprite->x -= gBattleAnimArgs[0];
@@ -210,11 +210,11 @@ static void sub_80B725C(struct Sprite *sprite)
sprite->callback = TranslateSpriteLinearAndFlicker; sprite->callback = TranslateSpriteLinearAndFlicker;
} }
static void sub_80B72F8(struct Sprite *sprite) static void StartDragonFireTranslation(struct Sprite *sprite)
{ {
SetSpriteCoordsToAnimAttackerCoords(sprite); SetSpriteCoordsToAnimAttackerCoords(sprite);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{ {
sprite->x -= gBattleAnimArgs[1]; sprite->x -= gBattleAnimArgs[1];
@@ -239,13 +239,13 @@ static void AnimDragonRageFirePlume(struct Sprite *sprite)
{ {
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == 0)
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
} }
else else
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 0); sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 1); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
} }
SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[1]); SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[1]);
sprite->y += gBattleAnimArgs[2]; sprite->y += gBattleAnimArgs[2];
@@ -253,11 +253,12 @@ static void AnimDragonRageFirePlume(struct Sprite *sprite)
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
} }
// For Dragon Breath and Dragon Rage
static void AnimDragonFireToTarget(struct Sprite *sprite) static void AnimDragonFireToTarget(struct Sprite *sprite)
{ {
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
StartSpriteAffineAnim(sprite, 1); StartSpriteAffineAnim(sprite, 1);
sub_80B72F8(sprite); StartDragonFireTranslation(sprite);
} }
static void AnimDragonDanceOrb(struct Sprite *sprite) static void AnimDragonDanceOrb(struct Sprite *sprite)
@@ -265,8 +266,8 @@ static void AnimDragonDanceOrb(struct Sprite *sprite)
u16 r5; u16 r5;
u16 r0; u16 r0;
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[4] = 0; sprite->data[4] = 0;
sprite->data[5] = 1; sprite->data[5] = 1;
sprite->data[6] = gBattleAnimArgs[0]; sprite->data[6] = gBattleAnimArgs[0];
@@ -278,10 +279,10 @@ static void AnimDragonDanceOrb(struct Sprite *sprite)
sprite->data[7] = r0 / 2; sprite->data[7] = r0 / 2;
sprite->x2 = Cos(sprite->data[6], sprite->data[7]); sprite->x2 = Cos(sprite->data[6], sprite->data[7]);
sprite->y2 = Sin(sprite->data[6], sprite->data[7]); sprite->y2 = Sin(sprite->data[6], sprite->data[7]);
sprite->callback = sub_80B74D8; sprite->callback = AnimDragonDanceOrb_Step;
} }
static void sub_80B74D8(struct Sprite *sprite) static void AnimDragonDanceOrb_Step(struct Sprite *sprite)
{ {
switch (sprite->data[0]) switch (sprite->data[0])
{ {
@@ -319,26 +320,28 @@ static void sub_80B74D8(struct Sprite *sprite)
} }
} }
// Wavers the attacker back and forth. Progressing vertical wave of scanline shifts
// Used by Dragon Dance
void AnimTask_DragonDanceWaver(u8 taskId) void AnimTask_DragonDanceWaver(u8 taskId)
{ {
struct ScanlineEffectParams sp; struct ScanlineEffectParams scanlineParams;
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
u16 i; u16 i;
u8 r1; u8 r1;
if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
{ {
sp.dmaDest = &REG_BG1HOFS; scanlineParams.dmaDest = &REG_BG1HOFS;
task->data[2] = gBattle_BG1_X; task->data[2] = gBattle_BG1_X;
} }
else else
{ {
sp.dmaDest = &REG_BG2HOFS; scanlineParams.dmaDest = &REG_BG2HOFS;
task->data[2] = gBattle_BG2_X; task->data[2] = gBattle_BG2_X;
} }
sp.dmaControl = 0xA2600001; scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
sp.initState = 1; scanlineParams.initState = 1;
sp.unused9 = 0; scanlineParams.unused9 = 0;
r1 = GetBattlerYCoordWithElevation(gBattleAnimAttacker); r1 = GetBattlerYCoordWithElevation(gBattleAnimAttacker);
task->data[3] = r1 - 32; task->data[3] = r1 - 32;
task->data[4] = r1 + 32; task->data[4] = r1 + 32;
@@ -349,11 +352,11 @@ void AnimTask_DragonDanceWaver(u8 taskId)
gScanlineEffectRegBuffers[0][i] = task->data[2]; gScanlineEffectRegBuffers[0][i] = task->data[2];
gScanlineEffectRegBuffers[1][i] = task->data[2]; gScanlineEffectRegBuffers[1][i] = task->data[2];
} }
ScanlineEffect_SetParams(sp); ScanlineEffect_SetParams(scanlineParams);
task->func = sub_80B76B0; task->func = AnimTask_DragonDanceWaver_Step;
} }
static void sub_80B76B0(u8 taskId) static void AnimTask_DragonDanceWaver_Step(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -366,12 +369,12 @@ static void sub_80B76B0(u8 taskId)
if (++task->data[6] == 3) if (++task->data[6] == 3)
++task->data[0]; ++task->data[0];
} }
sub_80B776C(task); UpdateDragonDanceScanlineEffect(task);
break; break;
case 1: case 1:
if (++task->data[1] > 0x3C) if (++task->data[1] > 0x3C)
++task->data[0]; ++task->data[0];
sub_80B776C(task); UpdateDragonDanceScanlineEffect(task);
break; break;
case 2: case 2:
if (++task->data[7] > 1) if (++task->data[7] > 1)
@@ -380,7 +383,7 @@ static void sub_80B76B0(u8 taskId)
if (--task->data[6] == 0) if (--task->data[6] == 0)
++task->data[0]; ++task->data[0];
} }
sub_80B776C(task); UpdateDragonDanceScanlineEffect(task);
break; break;
case 3: case 3:
gScanlineEffect.state = 3; gScanlineEffect.state = 3;
@@ -392,7 +395,7 @@ static void sub_80B76B0(u8 taskId)
} }
} }
static void sub_80B776C(struct Task *task) static void UpdateDragonDanceScanlineEffect(struct Task *task)
{ {
u16 i, r3 = task->data[5]; u16 i, r3 = task->data[5];
@@ -406,21 +409,21 @@ static void sub_80B776C(struct Task *task)
static void AnimOverheatFlame(struct Sprite *sprite) static void AnimOverheatFlame(struct Sprite *sprite)
{ {
s32 i, r6 = (gBattleAnimArgs[2] * 3) / 5; s32 i, yAmplitude = (gBattleAnimArgs[2] * 3) / 5;
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[4]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[4];
sprite->data[1] = Cos(gBattleAnimArgs[1], gBattleAnimArgs[2]); sprite->data[1] = Cos(gBattleAnimArgs[1], gBattleAnimArgs[2]);
sprite->data[2] = Sin(gBattleAnimArgs[1], r6); sprite->data[2] = Sin(gBattleAnimArgs[1], yAmplitude);
sprite->x += sprite->data[1] * gBattleAnimArgs[0]; sprite->x += sprite->data[1] * gBattleAnimArgs[0];
sprite->y += sprite->data[2] * gBattleAnimArgs[0]; sprite->y += sprite->data[2] * gBattleAnimArgs[0];
sprite->data[3] = gBattleAnimArgs[3]; sprite->data[3] = gBattleAnimArgs[3];
sprite->callback = sub_80B7894; sprite->callback = AnimOverheatFlame_Step;
for (i = 0; i < 7; ++i) for (i = 0; i < 7; ++i)
gUnknown_20399A4[i] = sprite->data[i]; sUnusedOverheatData[i] = sprite->data[i];
} }
static void sub_80B7894(struct Sprite *sprite) static void AnimOverheatFlame_Step(struct Sprite *sprite)
{ {
sprite->data[4] += sprite->data[1]; sprite->data[4] += sprite->data[1];
sprite->data[5] += sprite->data[2]; sprite->data[5] += sprite->data[2];
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+83 -75
View File
@@ -5,9 +5,9 @@
#include "constants/songs.h" #include "constants/songs.h"
static void AnimLightning(struct Sprite *sprite); static void AnimLightning(struct Sprite *sprite);
static void sub_80ADC58(struct Sprite *sprite); static void AnimUnusedSpinningFist(struct Sprite *sprite);
static void sub_80ADCB8(struct Sprite *sprite); static void AnimUnusedCirclingShock(struct Sprite *sprite);
static void sub_80ADD4C(struct Sprite *sprite); static void AnimSparkElectricity(struct Sprite *sprite);
static void AnimZapCannonSpark(struct Sprite *sprite); static void AnimZapCannonSpark(struct Sprite *sprite);
static void AnimThunderboltOrb(struct Sprite *sprite); static void AnimThunderboltOrb(struct Sprite *sprite);
static void AnimSparkElectricityFlashing(struct Sprite *sprite); static void AnimSparkElectricityFlashing(struct Sprite *sprite);
@@ -20,19 +20,19 @@ static void AnimVoltTackleOrbSlide(struct Sprite *sprite);
static void AnimVoltTackleBolt(struct Sprite *sprite); static void AnimVoltTackleBolt(struct Sprite *sprite);
static void AnimGrowingShockWaveOrb(struct Sprite *sprite); static void AnimGrowingShockWaveOrb(struct Sprite *sprite);
static void AnimShockWaveProgressingBolt(struct Sprite *sprite); static void AnimShockWaveProgressingBolt(struct Sprite *sprite);
static void sub_80ADC3C(struct Sprite *sprite); static void AnimLightning_Step(struct Sprite *sprite);
static void sub_80ADC9C(struct Sprite *sprite); static void AnimUnusedSpinningFist_Step(struct Sprite *sprite);
static void sub_80ADF38(struct Sprite *sprite); static void AnimZapCannonSpark_Step(struct Sprite *sprite);
static void sub_80AE130(struct Sprite *sprite); static void AnimSparkElectricityFlashing_Step(struct Sprite *sprite);
static void sub_80AE278(u8 taskId); static void AnimTask_ElectricBolt_Step(u8 taskId);
static void sub_80AE4F4(struct Sprite *sprite); static void AnimThunderWave_Step(struct Sprite *sprite);
static void sub_80AE5BC(u8 taskId); static void AnimTask_ElectricChargingParticles_Step(u8 taskId);
static void sub_80AE704(struct Sprite *sprite); static void AnimElectricChargingParticles(struct Sprite *sprite);
static void sub_80AE83C(struct Sprite *sprite); static void AnimVoltTackleOrbSlide_Step(struct Sprite *sprite);
static bool8 sub_80AEB98(struct Task *task, u8 taskId); static bool8 CreateVoltTackleBolt(struct Task *task, u8 taskId);
static bool8 sub_80AEE74(struct Task *task, u8 taskId); static bool8 CreateShockWaveBoltSprite(struct Task *task, u8 taskId);
static bool8 sub_80AF058(struct Task *task, u8 taskId); static bool8 CreateShockWaveLightningSprite(struct Task *task, u8 taskId);
static void sub_80AF0C8(struct Sprite *sprite); static void AnimShockWaveLightning(struct Sprite *sprite);
static const union AnimCmd sAnim_Lightning[] = static const union AnimCmd sAnim_Lightning[] =
{ {
@@ -60,7 +60,7 @@ const struct SpriteTemplate gLightningSpriteTemplate =
.callback = AnimLightning, .callback = AnimLightning,
}; };
static const union AffineAnimCmd gUnknown_83E5F50[] = static const union AffineAnimCmd sAffineAnim_UnusedSpinningFist[] =
{ {
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 20), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 20),
@@ -68,23 +68,23 @@ static const union AffineAnimCmd gUnknown_83E5F50[] =
AFFINEANIMCMD_END, AFFINEANIMCMD_END,
}; };
static const union AffineAnimCmd *const gUnknown_83E5F70[] = static const union AffineAnimCmd *const sAffineAnims_UnusedSpinningFist[] =
{ {
gUnknown_83E5F50, sAffineAnim_UnusedSpinningFist,
}; };
const struct SpriteTemplate gUnknown_83E5F74 = static const struct SpriteTemplate sUnusedSpinningFistSpriteTemplate =
{ {
.tileTag = ANIM_TAG_HANDS_AND_FEET, .tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineNormal_ObjNormal_32x32, .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gUnknown_83E5F70, .affineAnims = sAffineAnims_UnusedSpinningFist,
.callback = sub_80ADC58, .callback = AnimUnusedSpinningFist,
}; };
static const union AnimCmd gUnknown_83E5F8C[] = static const union AnimCmd sAnim_UnusedCirclingShock[] =
{ {
ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(0, 5),
ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(16, 5),
@@ -95,20 +95,20 @@ static const union AnimCmd gUnknown_83E5F8C[] =
ANIMCMD_JUMP(0), ANIMCMD_JUMP(0),
}; };
static const union AnimCmd *const gUnknown_83E5FA8[] = static const union AnimCmd *const sAnims_UnusedCirclingShock[] =
{ {
gUnknown_83E5F8C, sAnim_UnusedCirclingShock,
}; };
const struct SpriteTemplate gUnknown_83E5FAC = static const struct SpriteTemplate sUnusedCirclingShockSpriteTemplate =
{ {
.tileTag = ANIM_TAG_SHOCK, .tileTag = ANIM_TAG_SHOCK,
.paletteTag = ANIM_TAG_SHOCK, .paletteTag = ANIM_TAG_SHOCK,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5FA8, .anims = sAnims_UnusedCirclingShock,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80ADCB8, .callback = AnimUnusedCirclingShock,
}; };
const struct SpriteTemplate gSparkElectricitySpriteTemplate = const struct SpriteTemplate gSparkElectricitySpriteTemplate =
@@ -119,7 +119,7 @@ const struct SpriteTemplate gSparkElectricitySpriteTemplate =
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80ADD4C, .callback = AnimSparkElectricity,
}; };
const struct SpriteTemplate gZapCannonBallSpriteTemplate = const struct SpriteTemplate gZapCannonBallSpriteTemplate =
@@ -458,31 +458,31 @@ static void AnimLightning(struct Sprite *sprite)
else else
sprite->x += gBattleAnimArgs[0]; sprite->x += gBattleAnimArgs[0];
sprite->y += gBattleAnimArgs[1]; sprite->y += gBattleAnimArgs[1];
sprite->callback = sub_80ADC3C; sprite->callback = AnimLightning_Step;
} }
static void sub_80ADC3C(struct Sprite *sprite) static void AnimLightning_Step(struct Sprite *sprite)
{ {
if (sprite->animEnded) if (sprite->animEnded)
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
} }
static void sub_80ADC58(struct Sprite *sprite) static void AnimUnusedSpinningFist(struct Sprite *sprite)
{ {
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
sprite->x -= gBattleAnimArgs[0]; sprite->x -= gBattleAnimArgs[0];
else else
sprite->x += gBattleAnimArgs[0]; sprite->x += gBattleAnimArgs[0];
sprite->callback = sub_80ADC9C; sprite->callback = AnimUnusedSpinningFist_Step;
} }
static void sub_80ADC9C(struct Sprite *sprite) static void AnimUnusedSpinningFist_Step(struct Sprite *sprite)
{ {
if (sprite->affineAnimEnded) if (sprite->affineAnimEnded)
DestroySpriteAndMatrix(sprite); DestroySpriteAndMatrix(sprite);
} }
static void sub_80ADCB8(struct Sprite *sprite) static void AnimUnusedCirclingShock(struct Sprite *sprite)
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
@@ -501,10 +501,10 @@ static void sub_80ADCB8(struct Sprite *sprite)
sprite->data[2] = gBattleAnimArgs[3]; sprite->data[2] = gBattleAnimArgs[3];
sprite->data[3] = gBattleAnimArgs[4]; sprite->data[3] = gBattleAnimArgs[4];
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
sprite->callback = TranslateSpriteInCircleOverDuration; sprite->callback = TranslateSpriteInCircle;
} }
static void sub_80ADD4C(struct Sprite *sprite) static void AnimSparkElectricity(struct Sprite *sprite)
{ {
u8 battler; u8 battler;
u32 matrixNum; u32 matrixNum;
@@ -512,20 +512,20 @@ static void sub_80ADD4C(struct Sprite *sprite)
switch (gBattleAnimArgs[4]) switch (gBattleAnimArgs[4])
{ {
case 0: case ANIM_ATTACKER:
battler = gBattleAnimAttacker; battler = gBattleAnimAttacker;
break; break;
case 1: case ANIM_TARGET:
default: default:
battler = gBattleAnimTarget; battler = gBattleAnimTarget;
break; break;
case 2: case ANIM_ATK_PARTNER:
if (!IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) if (!IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))
battler = gBattleAnimAttacker; battler = gBattleAnimAttacker;
else else
battler = BATTLE_PARTNER(gBattleAnimAttacker); battler = BATTLE_PARTNER(gBattleAnimAttacker);
break; break;
case 3: case ANIM_DEF_PARTNER:
if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))
battler = BATTLE_PARTNER(gBattleAnimTarget); battler = BATTLE_PARTNER(gBattleAnimTarget);
else else
@@ -568,11 +568,11 @@ static void AnimZapCannonSpark(struct Sprite *sprite)
sprite->data[6] = gBattleAnimArgs[5]; sprite->data[6] = gBattleAnimArgs[5];
sprite->data[7] = gBattleAnimArgs[4]; sprite->data[7] = gBattleAnimArgs[4];
sprite->oam.tileNum += gBattleAnimArgs[6] * 4; sprite->oam.tileNum += gBattleAnimArgs[6] * 4;
sprite->callback = sub_80ADF38; sprite->callback = AnimZapCannonSpark_Step;
sprite->callback(sprite); sprite->callback(sprite);
} }
static void sub_80ADF38(struct Sprite *sprite) static void AnimZapCannonSpark_Step(struct Sprite *sprite)
{ {
if (!AnimTranslateLinear(sprite)) if (!AnimTranslateLinear(sprite))
{ {
@@ -588,7 +588,7 @@ static void sub_80ADF38(struct Sprite *sprite)
} }
} }
static void sub_80ADFB0(struct Sprite *sprite) static void AnimThunderboltOrb_Step(struct Sprite *sprite)
{ {
if (--sprite->data[5] == -1) if (--sprite->data[5] == -1)
{ {
@@ -608,7 +608,7 @@ static void AnimThunderboltOrb(struct Sprite *sprite)
sprite->data[3] = gBattleAnimArgs[0]; sprite->data[3] = gBattleAnimArgs[0];
sprite->data[4] = gBattleAnimArgs[3]; sprite->data[4] = gBattleAnimArgs[3];
sprite->data[5] = gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[3];
sprite->callback = sub_80ADFB0; sprite->callback = AnimThunderboltOrb_Step;
} }
static void AnimSparkElectricityFlashing(struct Sprite *sprite) static void AnimSparkElectricityFlashing(struct Sprite *sprite)
@@ -629,11 +629,11 @@ static void AnimSparkElectricityFlashing(struct Sprite *sprite)
sprite->data[6] = gBattleAnimArgs[5]; sprite->data[6] = gBattleAnimArgs[5];
sprite->data[7] = gBattleAnimArgs[4]; sprite->data[7] = gBattleAnimArgs[4];
sprite->oam.tileNum += gBattleAnimArgs[6] * 4; sprite->oam.tileNum += gBattleAnimArgs[6] * 4;
sprite->callback = sub_80AE130; sprite->callback = AnimSparkElectricityFlashing_Step;
sprite->callback(sprite); sprite->callback(sprite);
} }
static void sub_80AE130(struct Sprite *sprite) static void AnimSparkElectricityFlashing_Step(struct Sprite *sprite)
{ {
sprite->x2 = Sin(sprite->data[7], sprite->data[5]); sprite->x2 = Sin(sprite->data[7], sprite->data[5]);
sprite->y2 = Cos(sprite->data[7], sprite->data[5]); sprite->y2 = Cos(sprite->data[7], sprite->data[5]);
@@ -644,6 +644,7 @@ static void sub_80AE130(struct Sprite *sprite)
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
} }
// Electricity arcs around the target. Used for Paralysis and various electric move hits
static void AnimElectricity(struct Sprite *sprite) static void AnimElectricity(struct Sprite *sprite)
{ {
InitSpritePosToAnimTarget(sprite, FALSE); InitSpritePosToAnimTarget(sprite, FALSE);
@@ -657,15 +658,16 @@ static void AnimElectricity(struct Sprite *sprite)
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
} }
// The vertical falling thunder bolt used in Thunder Wave/Shock/Bolt
void AnimTask_ElectricBolt(u8 taskId) void AnimTask_ElectricBolt(u8 taskId)
{ {
gTasks[taskId].data[0] = GetBattlerSpriteCoord(gBattleAnimTarget, 0) + gBattleAnimArgs[0]; gTasks[taskId].data[0] = GetBattlerSpriteCoord(gBattleAnimTarget, 0) + gBattleAnimArgs[0];
gTasks[taskId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + gBattleAnimArgs[1]; gTasks[taskId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + gBattleAnimArgs[1];
gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].data[2] = gBattleAnimArgs[2];
gTasks[taskId].func = sub_80AE278; gTasks[taskId].func = AnimTask_ElectricBolt_Step;
} }
static void sub_80AE278(u8 taskId) static void AnimTask_ElectricBolt_Step(u8 taskId)
{ {
u16 r8; u16 r8;
u16 r2; u16 r2;
@@ -735,18 +737,19 @@ static void AnimElectricBoltSegment(struct Sprite *sprite)
{ {
if (!sprite->data[0]) if (!sprite->data[0])
{ {
sprite->oam.shape = ST_OAM_V_RECTANGLE; sprite->oam.shape = SPRITE_SHAPE(8x16);
sprite->oam.size = ST_OAM_SIZE_0; sprite->oam.size = SPRITE_SIZE(8x16);
} }
else else
{ {
sprite->oam.shape = ST_OAM_SQUARE; sprite->oam.shape = SPRITE_SHAPE(16x16);
sprite->oam.size = ST_OAM_SIZE_1; sprite->oam.size = SPRITE_SIZE(16x16);
} }
if (++sprite->data[1] == 15) if (++sprite->data[1] == 15)
DestroySprite(sprite); DestroySprite(sprite);
} }
// The horizontal bands of electricity used in Thunder Wave
static void AnimThunderWave(struct Sprite *sprite) static void AnimThunderWave(struct Sprite *sprite)
{ {
u8 spriteId; u8 spriteId;
@@ -756,11 +759,11 @@ static void AnimThunderWave(struct Sprite *sprite)
spriteId = CreateSprite(&gThunderWaveSpriteTemplate, sprite->x + 32, sprite->y, sprite->subpriority); spriteId = CreateSprite(&gThunderWaveSpriteTemplate, sprite->x + 32, sprite->y, sprite->subpriority);
gSprites[spriteId].oam.tileNum += 8; gSprites[spriteId].oam.tileNum += 8;
++gAnimVisualTaskCount; ++gAnimVisualTaskCount;
gSprites[spriteId].callback = sub_80AE4F4; gSprites[spriteId].callback = AnimThunderWave_Step;
sprite->callback = sub_80AE4F4; sprite->callback = AnimThunderWave_Step;
} }
static void sub_80AE4F4(struct Sprite *sprite) static void AnimThunderWave_Step(struct Sprite *sprite)
{ {
if (++sprite->data[0] == 3) if (++sprite->data[0] == 3)
{ {
@@ -771,6 +774,7 @@ static void sub_80AE4F4(struct Sprite *sprite)
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
} }
// Animates small electric orbs moving from around the battler inward. For Charge/Shock Wave
void AnimTask_ElectricChargingParticles(u8 taskId) void AnimTask_ElectricChargingParticles(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -793,10 +797,10 @@ void AnimTask_ElectricChargingParticles(u8 taskId)
task->data[11] = gBattleAnimArgs[3]; task->data[11] = gBattleAnimArgs[3];
task->data[12] = 0; task->data[12] = 0;
task->data[13] = gBattleAnimArgs[2]; task->data[13] = gBattleAnimArgs[2];
task->func = sub_80AE5BC; task->func = AnimTask_ElectricChargingParticles_Step;
} }
static void sub_80AE5BC(u8 taskId) static void AnimTask_ElectricChargingParticles_Step(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -821,7 +825,7 @@ static void sub_80AE5BC(u8 taskId)
sprite->data[4] = task->data[15]; sprite->data[4] = task->data[15];
sprite->data[5] = taskId; sprite->data[5] = taskId;
InitAnimLinearTranslation(sprite); InitAnimLinearTranslation(sprite);
StoreSpriteCallbackInData6(sprite, sub_80AE704); StoreSpriteCallbackInData6(sprite, AnimElectricChargingParticles);
sprite->callback = RunStoredCallbackWhenAnimEnds; sprite->callback = RunStoredCallbackWhenAnimEnds;
if (++task->data[9] > 15) if (++task->data[9] > 15)
task->data[9] = 0; task->data[9] = 0;
@@ -842,7 +846,7 @@ static void sub_80AE5BC(u8 taskId)
} }
} }
static void sub_80AE6D0(struct Sprite *sprite) static void AnimElectricChargingParticles_Step(struct Sprite *sprite)
{ {
if (AnimTranslateLinear(sprite)) if (AnimTranslateLinear(sprite))
{ {
@@ -851,15 +855,15 @@ static void sub_80AE6D0(struct Sprite *sprite)
} }
} }
static void sub_80AE704(struct Sprite *sprite) static void AnimElectricChargingParticles(struct Sprite *sprite)
{ {
StartSpriteAnim(sprite, 1); StartSpriteAnim(sprite, 1);
sprite->callback = sub_80AE6D0; sprite->callback = AnimElectricChargingParticles_Step;
} }
static void AnimGrowingChargeOrb(struct Sprite *sprite) static void AnimGrowingChargeOrb(struct Sprite *sprite)
{ {
if (!gBattleAnimArgs[0]) if (gBattleAnimArgs[0] == ANIM_ATTACKER)
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
@@ -873,9 +877,10 @@ static void AnimGrowingChargeOrb(struct Sprite *sprite)
sprite->callback = RunStoredCallbackWhenAffineAnimEnds; sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
} }
// The quick electric burst at the end of Charge / during the Volt Tackle hit
static void AnimElectricPuff(struct Sprite *sprite) static void AnimElectricPuff(struct Sprite *sprite)
{ {
if (!gBattleAnimArgs[0]) if (gBattleAnimArgs[0] == ANIM_ATTACKER)
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
@@ -891,6 +896,7 @@ static void AnimElectricPuff(struct Sprite *sprite)
sprite->callback = RunStoredCallbackWhenAnimEnds; sprite->callback = RunStoredCallbackWhenAnimEnds;
} }
// Creates an orb of electricity that grows then slides off-screen. The attacker slides with it
static void AnimVoltTackleOrbSlide(struct Sprite *sprite) static void AnimVoltTackleOrbSlide(struct Sprite *sprite)
{ {
StartSpriteAffineAnim(sprite, 1); StartSpriteAffineAnim(sprite, 1);
@@ -900,10 +906,10 @@ static void AnimVoltTackleOrbSlide(struct Sprite *sprite)
sprite->data[7] = 16; sprite->data[7] = 16;
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
sprite->data[7] *= -1; sprite->data[7] *= -1;
sprite->callback = sub_80AE83C; sprite->callback = AnimVoltTackleOrbSlide_Step;
} }
static void sub_80AE83C(struct Sprite *sprite) static void AnimVoltTackleOrbSlide_Step(struct Sprite *sprite)
{ {
switch (sprite->data[0]) switch (sprite->data[0])
{ {
@@ -975,6 +981,7 @@ void AnimTask_VoltTackleAttackerReappear(u8 taskId)
} }
} }
// The horizontal bolts of electricity for Volt Tackle
void AnimTask_VoltTackleBolt(u8 taskId) void AnimTask_VoltTackleBolt(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -1036,7 +1043,7 @@ void AnimTask_VoltTackleBolt(u8 taskId)
if (++task->data[2] > 0) if (++task->data[2] > 0)
{ {
task->data[2] = 0; task->data[2] = 0;
if (sub_80AEB98(task, taskId) || sub_80AEB98(task, taskId)) if (CreateVoltTackleBolt(task, taskId) || CreateVoltTackleBolt(task, taskId))
++task->data[0]; ++task->data[0];
} }
break; break;
@@ -1047,7 +1054,7 @@ void AnimTask_VoltTackleBolt(u8 taskId)
} }
} }
static bool8 sub_80AEB98(struct Task *task, u8 taskId) static bool8 CreateVoltTackleBolt(struct Task *task, u8 taskId)
{ {
u8 spriteId = CreateSprite(&gVoltTackleBoltSpriteTemplate, task->data[3], task->data[5], 35); u8 spriteId = CreateSprite(&gVoltTackleBoltSpriteTemplate, task->data[3], task->data[5], 35);
@@ -1112,7 +1119,7 @@ void AnimTask_ShockWaveProgressingBolt(u8 taskId)
task->data[4] = 7; task->data[4] = 7;
task->data[5] = -1; task->data[5] = -1;
task->data[11] = 12; task->data[11] = 12;
task->data[12] = BattleAnimAdjustPanning(task->data[11] - 76); task->data[12] = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
task->data[13] = BattleAnimAdjustPanning(SOUND_PAN_TARGET); task->data[13] = BattleAnimAdjustPanning(SOUND_PAN_TARGET);
task->data[14] = task->data[12]; task->data[14] = task->data[12];
task->data[15] = (task->data[13] - task->data[12]) / 3; task->data[15] = (task->data[13] - task->data[12]) / 3;
@@ -1122,7 +1129,7 @@ void AnimTask_ShockWaveProgressingBolt(u8 taskId)
if (++task->data[1] > 0) if (++task->data[1] > 0)
{ {
task->data[1] = 0; task->data[1] = 0;
if (sub_80AEE74(task, taskId)) if (CreateShockWaveBoltSprite(task, taskId))
{ {
if (task->data[2] == 5) if (task->data[2] == 5)
task->data[0] = 3; task->data[0] = 3;
@@ -1172,7 +1179,7 @@ void AnimTask_ShockWaveProgressingBolt(u8 taskId)
} }
} }
static bool8 sub_80AEE74(struct Task *task, u8 taskId) static bool8 CreateShockWaveBoltSprite(struct Task *task, u8 taskId)
{ {
u8 spriteId = CreateSprite(&sShockWaveProgressingBoltSpriteTemplate, task->data[6], task->data[7], 35); u8 spriteId = CreateSprite(&sShockWaveProgressingBoltSpriteTemplate, task->data[6], task->data[7], 35);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -1206,6 +1213,7 @@ static bool8 sub_80AEE74(struct Task *task, u8 taskId)
} }
} }
// Just runs timer for sprite. See AnimTask_ShockWaveProgressingBolt
static void AnimShockWaveProgressingBolt(struct Sprite *sprite) static void AnimShockWaveProgressingBolt(struct Sprite *sprite)
{ {
if (++sprite->data[0] > 12) if (++sprite->data[0] > 12)
@@ -1234,7 +1242,7 @@ void AnimTask_ShockWaveLightning(u8 taskId)
if (++task->data[1] > 1) if (++task->data[1] > 1)
{ {
task->data[1] = 0; task->data[1] = 0;
if (sub_80AF058(task, taskId)) if (CreateShockWaveLightningSprite(task, taskId))
++task->data[0]; ++task->data[0];
} }
break; break;
@@ -1245,13 +1253,13 @@ void AnimTask_ShockWaveLightning(u8 taskId)
} }
} }
static bool8 sub_80AF058(struct Task *task, u8 taskId) static bool8 CreateShockWaveLightningSprite(struct Task *task, u8 taskId)
{ {
u8 spriteId = CreateSprite(&gLightningSpriteTemplate, task->data[13], task->data[14], task->data[12]); u8 spriteId = CreateSprite(&gLightningSpriteTemplate, task->data[13], task->data[14], task->data[12]);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
{ {
gSprites[spriteId].callback = sub_80AF0C8; gSprites[spriteId].callback = AnimShockWaveLightning;
gSprites[spriteId].data[6] = taskId; gSprites[spriteId].data[6] = taskId;
gSprites[spriteId].data[7] = 10; gSprites[spriteId].data[7] = 10;
++task->data[10]; ++task->data[10];
@@ -1262,7 +1270,7 @@ static bool8 sub_80AF058(struct Task *task, u8 taskId)
return FALSE; return FALSE;
} }
static void sub_80AF0C8(struct Sprite *sprite) static void AnimShockWaveLightning(struct Sprite *sprite)
{ {
if (sprite->animEnded) if (sprite->animEnded)
{ {
+92 -94
View File
@@ -5,7 +5,7 @@
#include "task.h" #include "task.h"
#include "trig.h" #include "trig.h"
static void unc_080B08A0(struct Sprite *sprite); static void AnimUnusedHumanoidFoot(struct Sprite *sprite);
static void AnimSlideHandOrFootToTarget(struct Sprite *sprite); static void AnimSlideHandOrFootToTarget(struct Sprite *sprite);
static void AnimJumpKick(struct Sprite *sprite); static void AnimJumpKick(struct Sprite *sprite);
static void AnimBasicFistOrFoot(struct Sprite *sprite); static void AnimBasicFistOrFoot(struct Sprite *sprite);
@@ -23,19 +23,19 @@ static void AnimSuperpowerFireball(struct Sprite *sprite);
static void AnimArmThrustHit(struct Sprite *sprite); static void AnimArmThrustHit(struct Sprite *sprite);
static void AnimRevengeScratch(struct Sprite *sprite); static void AnimRevengeScratch(struct Sprite *sprite);
static void AnimFocusPunchFist(struct Sprite *sprite); static void AnimFocusPunchFist(struct Sprite *sprite);
static void sub_80B0B2C(struct Sprite *sprite); static void AnimFistOrFootRandomPos_Step(struct Sprite *sprite);
static void sub_80B0BD8(struct Sprite *sprite); static void AnimCrossChopHand_Step(struct Sprite *sprite);
static void sub_80B0CB4(struct Sprite *sprite); static void AnimSlidingKick_Step(struct Sprite *sprite);
static void AnimSpinningKickOrPunchFinish(struct Sprite *sprite); static void AnimSpinningKickOrPunchFinish(struct Sprite *sprite);
static void AnimStompFootStep(struct Sprite *sprite); static void AnimStompFootStep(struct Sprite *sprite);
static void AnimStompFootEnd(struct Sprite *sprite); static void AnimStompFootEnd(struct Sprite *sprite);
static void sub_80B0EF0(struct Sprite *sprite); static void AnimBrickBreakWall_Step(struct Sprite *sprite);
static void sub_80B1050(struct Sprite *sprite); static void AnimBrickBreakWallShard_Step(struct Sprite *sprite);
static void sub_80B111C(struct Sprite *sprite); static void AnimSuperpowerOrb_Step(struct Sprite *sprite);
static void sub_80B11E4(struct Sprite *sprite); static void AnimSuperpowerRock_Step1(struct Sprite *sprite);
static void sub_80B12A4(struct Sprite *sprite); static void AnimSuperpowerRock_Step2(struct Sprite *sprite);
const struct SpriteTemplate gUnknown_83E668C = static const struct SpriteTemplate sUnusedHumanoidFootSpriteTemplate =
{ {
.tileTag = ANIM_TAG_HUMANOID_FOOT, .tileTag = ANIM_TAG_HUMANOID_FOOT,
.paletteTag = ANIM_TAG_HUMANOID_FOOT, .paletteTag = ANIM_TAG_HUMANOID_FOOT,
@@ -43,54 +43,46 @@ const struct SpriteTemplate gUnknown_83E668C =
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = unc_080B08A0, .callback = AnimUnusedHumanoidFoot,
}; };
static const union AnimCmd sAnim_HandOrFoot[] = static const union AnimCmd sAnim_Fist[] =
{ {
ANIMCMD_FRAME(0, 1), ANIMCMD_FRAME(0, 1),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sAnim_SlidingKick_0[] = static const union AnimCmd sAnim_FootWide[] =
{ {
ANIMCMD_FRAME(16, 1), ANIMCMD_FRAME(16, 1),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sAnim_SlidingKick_1[] = static const union AnimCmd sAnim_FootTall[] =
{ {
ANIMCMD_FRAME(32, 1), ANIMCMD_FRAME(32, 1),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sAnim_CrossChopHand_0[] = static const union AnimCmd sAnim_HandLeft[] =
{ {
ANIMCMD_FRAME(48, 1), ANIMCMD_FRAME(48, 1),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sAnim_CrossChopHand_1[] = static const union AnimCmd sAnim_HandRight[] =
{ {
ANIMCMD_FRAME(48, 1, .hFlip = TRUE), ANIMCMD_FRAME(48, 1, .hFlip = TRUE),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd *const sAnims_HandOrFoot[] = static const union AnimCmd *const sAnims_HandsAndFeet[] =
{ {
sAnim_HandOrFoot, sAnim_Fist,
}; sAnim_FootWide,
sAnim_FootTall,
static const union AnimCmd *const sAnims_SlidingKick[] = sAnim_HandLeft,
{ sAnim_HandRight,
sAnim_SlidingKick_0,
sAnim_SlidingKick_1,
};
static const union AnimCmd *const sAnims_CrossChopHand[] =
{
sAnim_CrossChopHand_0,
sAnim_CrossChopHand_1,
}; };
const struct SpriteTemplate gKarateChopSpriteTemplate = const struct SpriteTemplate gKarateChopSpriteTemplate =
@@ -98,7 +90,7 @@ const struct SpriteTemplate gKarateChopSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET, .tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_HandOrFoot, .anims = sAnims_HandsAndFeet,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimSlideHandOrFootToTarget, .callback = AnimSlideHandOrFootToTarget,
@@ -109,7 +101,7 @@ const struct SpriteTemplate gJumpKickSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET, .tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_HandOrFoot, .anims = sAnims_HandsAndFeet,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimJumpKick, .callback = AnimJumpKick,
@@ -120,7 +112,7 @@ const struct SpriteTemplate gFistFootSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET, .tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_HandOrFoot, .anims = sAnims_HandsAndFeet,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimBasicFistOrFoot, .callback = AnimBasicFistOrFoot,
@@ -131,7 +123,7 @@ const struct SpriteTemplate gFistFootRandomPosSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET, .tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_HandOrFoot, .anims = sAnims_HandsAndFeet,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimFistOrFootRandomPos, .callback = AnimFistOrFootRandomPos,
@@ -142,7 +134,7 @@ const struct SpriteTemplate gCrossChopHandSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET, .tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_CrossChopHand, .anims = &sAnims_HandsAndFeet[3],
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimCrossChopHand, .callback = AnimCrossChopHand,
@@ -153,7 +145,7 @@ const struct SpriteTemplate gSlidingKickSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET, .tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_SlidingKick, .anims = &sAnims_HandsAndFeet[1],
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimSlidingKick, .callback = AnimSlidingKick,
@@ -171,12 +163,13 @@ static const union AffineAnimCmd *const sAffineAnims_SpinningHandOrFoot[] =
sAffineAnim_SpinningHandOrFoot, sAffineAnim_SpinningHandOrFoot,
}; };
// Blaze Kick / Meteor Mash
const struct SpriteTemplate gSpinningHandOrFootSpriteTemplate = const struct SpriteTemplate gSpinningHandOrFootSpriteTemplate =
{ {
.tileTag = ANIM_TAG_HANDS_AND_FEET, .tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineDouble_ObjNormal_32x32, .oam = &gOamData_AffineDouble_ObjNormal_32x32,
.anims = sAnims_HandOrFoot, .anims = sAnims_HandsAndFeet,
.images = NULL, .images = NULL,
.affineAnims = sAffineAnims_SpinningHandOrFoot, .affineAnims = sAffineAnims_SpinningHandOrFoot,
.callback = AnimSpinningKickOrPunch, .callback = AnimSpinningKickOrPunch,
@@ -199,7 +192,7 @@ const struct SpriteTemplate gMegaPunchKickSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET, .tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineDouble_ObjNormal_32x32, .oam = &gOamData_AffineDouble_ObjNormal_32x32,
.anims = sAnims_HandOrFoot, .anims = sAnims_HandsAndFeet,
.images = NULL, .images = NULL,
.affineAnims = sAffineAnims_MegaPunchKick, .affineAnims = sAffineAnims_MegaPunchKick,
.callback = AnimSpinningKickOrPunch, .callback = AnimSpinningKickOrPunch,
@@ -210,7 +203,7 @@ const struct SpriteTemplate gStompFootSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET, .tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_SlidingKick, .anims = &sAnims_HandsAndFeet[1],
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimStompFoot, .callback = AnimStompFoot,
@@ -301,7 +294,7 @@ const struct SpriteTemplate gArmThrustHandSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET, .tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_HandOrFoot, .anims = sAnims_HandsAndFeet,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimArmThrustHit, .callback = AnimArmThrustHit,
@@ -405,13 +398,13 @@ const struct SpriteTemplate gFocusPunchFistSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET, .tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineDouble_ObjNormal_32x32, .oam = &gOamData_AffineDouble_ObjNormal_32x32,
.anims = sAnims_HandOrFoot, .anims = sAnims_HandsAndFeet,
.images = NULL, .images = NULL,
.affineAnims = sAffineAnims_FocusPunchFist, .affineAnims = sAffineAnims_FocusPunchFist,
.callback = AnimFocusPunchFist, .callback = AnimFocusPunchFist,
}; };
static void unc_080B08A0(struct Sprite *sprite) static void AnimUnusedHumanoidFoot(struct Sprite *sprite)
{ {
SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
sprite->y += gBattleAnimArgs[1]; sprite->y += gBattleAnimArgs[1];
@@ -429,7 +422,7 @@ static void AnimSlideHandOrFootToTarget(struct Sprite *sprite)
} }
StartSpriteAnim(sprite, gBattleAnimArgs[6]); StartSpriteAnim(sprite, gBattleAnimArgs[6]);
gBattleAnimArgs[6] = 0; gBattleAnimArgs[6] = 0;
AnimSnoreZ(sprite); AnimTravelDiagonally(sprite);
} }
static void AnimJumpKick(struct Sprite *sprite) static void AnimJumpKick(struct Sprite *sprite)
@@ -475,8 +468,8 @@ static void AnimFistOrFootRandomPos(struct Sprite *sprite)
if (gBattleAnimArgs[2] < 0) if (gBattleAnimArgs[2] < 0)
gBattleAnimArgs[2] = Random() % 5; gBattleAnimArgs[2] = Random() % 5;
StartSpriteAnim(sprite, gBattleAnimArgs[2]); StartSpriteAnim(sprite, gBattleAnimArgs[2]);
sprite->x = GetBattlerSpriteCoord(battler, 2); sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(battler, 3); sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET);
xMod = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_WIDTH) / 2; xMod = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_WIDTH) / 2;
yMod = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4; yMod = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4;
x = Random() % xMod; x = Random() % xMod;
@@ -491,19 +484,19 @@ static void AnimFistOrFootRandomPos(struct Sprite *sprite)
sprite->y += y; sprite->y += y;
sprite->data[0] = gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[1];
sprite->data[7] = CreateSprite(&gBasicHitSplatSpriteTemplate, sprite->x, sprite->y, sprite->subpriority + 1); sprite->data[7] = CreateSprite(&gBasicHitSplatSpriteTemplate, sprite->x, sprite->y, sprite->subpriority + 1);
if (sprite->data[7] != 64) if (sprite->data[7] != MAX_SPRITES)
{ {
StartSpriteAffineAnim(&gSprites[sprite->data[7]], 0); StartSpriteAffineAnim(&gSprites[sprite->data[7]], 0);
gSprites[sprite->data[7]].callback = SpriteCallbackDummy; gSprites[sprite->data[7]].callback = SpriteCallbackDummy;
} }
sprite->callback = sub_80B0B2C; sprite->callback = AnimFistOrFootRandomPos_Step;
} }
static void sub_80B0B2C(struct Sprite *sprite) static void AnimFistOrFootRandomPos_Step(struct Sprite *sprite)
{ {
if (sprite->data[0] == 0) if (sprite->data[0] == 0)
{ {
if (sprite->data[7] != 64) if (sprite->data[7] != MAX_SPRITES)
{ {
FreeOamMatrix(gSprites[sprite->data[7]].oam.matrixNum); FreeOamMatrix(gSprites[sprite->data[7]].oam.matrixNum);
DestroySprite(&gSprites[sprite->data[7]]); DestroySprite(&gSprites[sprite->data[7]]);
@@ -531,10 +524,10 @@ static void AnimCrossChopHand(struct Sprite *sprite)
} }
sprite->data[4] = sprite->y - 20; sprite->data[4] = sprite->y - 20;
sprite->callback = StartAnimLinearTranslation; sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, sub_80B0BD8); StoreSpriteCallbackInData6(sprite, AnimCrossChopHand_Step);
} }
static void sub_80B0BD8(struct Sprite *sprite) static void AnimCrossChopHand_Step(struct Sprite *sprite)
{ {
if (++sprite->data[5] == 11) if (++sprite->data[5] == 11)
{ {
@@ -550,6 +543,7 @@ static void sub_80B0BD8(struct Sprite *sprite)
} }
} }
// Rolling Kick / Low Kick
static void AnimSlidingKick(struct Sprite *sprite) static void AnimSlidingKick(struct Sprite *sprite)
{ {
if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget && GetBattlerPosition(gBattleAnimTarget) < B_POSITION_PLAYER_RIGHT) if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget && GetBattlerPosition(gBattleAnimTarget) < B_POSITION_PLAYER_RIGHT)
@@ -566,10 +560,10 @@ static void AnimSlidingKick(struct Sprite *sprite)
sprite->data[5] = gBattleAnimArgs[5]; sprite->data[5] = gBattleAnimArgs[5];
sprite->data[6] = gBattleAnimArgs[4]; sprite->data[6] = gBattleAnimArgs[4];
sprite->data[7] = 0; sprite->data[7] = 0;
sprite->callback = sub_80B0CB4; sprite->callback = AnimSlidingKick_Step;
} }
static void sub_80B0CB4(struct Sprite *sprite) static void AnimSlidingKick_Step(struct Sprite *sprite)
{ {
if (!AnimTranslateLinear(sprite)) if (!AnimTranslateLinear(sprite))
{ {
@@ -622,8 +616,8 @@ static void AnimStompFootStep(struct Sprite *sprite)
if (--sprite->data[0] == -1) if (--sprite->data[0] == -1)
{ {
sprite->data[0] = 6; sprite->data[0] = 6;
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->callback = StartAnimLinearTranslation; sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, AnimStompFootEnd); StoreSpriteCallbackInData6(sprite, AnimStompFootEnd);
} }
@@ -658,17 +652,18 @@ static void AnimDizzyPunchDuck(struct Sprite *sprite)
} }
} }
// The wall that appears when Brick Break is going to shatter the target's defensive wall
static void AnimBrickBreakWall(struct Sprite *sprite) static void AnimBrickBreakWall(struct Sprite *sprite)
{ {
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == 0)
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
} }
else else
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 0); sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 1); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
} }
sprite->x += gBattleAnimArgs[1]; sprite->x += gBattleAnimArgs[1];
sprite->y += gBattleAnimArgs[2]; sprite->y += gBattleAnimArgs[2];
@@ -676,10 +671,10 @@ static void AnimBrickBreakWall(struct Sprite *sprite)
sprite->data[1] = gBattleAnimArgs[3]; sprite->data[1] = gBattleAnimArgs[3];
sprite->data[2] = gBattleAnimArgs[4]; sprite->data[2] = gBattleAnimArgs[4];
sprite->data[3] = 0; sprite->data[3] = 0;
sprite->callback = sub_80B0EF0; sprite->callback = AnimBrickBreakWall_Step;
} }
static void sub_80B0EF0(struct Sprite *sprite) static void AnimBrickBreakWall_Step(struct Sprite *sprite)
{ {
switch (sprite->data[0]) switch (sprite->data[0])
{ {
@@ -709,17 +704,18 @@ static void sub_80B0EF0(struct Sprite *sprite)
} }
} }
// Piece of shattered defensive wall flies off. Used by Brick Break when the target has a defensive wall
static void AnimBrickBreakWallShard(struct Sprite *sprite) static void AnimBrickBreakWallShard(struct Sprite *sprite)
{ {
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == ANIM_ATTACKER)
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0) + gBattleAnimArgs[2]; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[2];
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + gBattleAnimArgs[3]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[3];
} }
else else
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 0) + gBattleAnimArgs[2]; sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[2];
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + gBattleAnimArgs[3]; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[3];
} }
sprite->oam.tileNum += gBattleAnimArgs[1] * 16; sprite->oam.tileNum += gBattleAnimArgs[1] * 16;
sprite->data[0] = 0; sprite->data[0] = 0;
@@ -745,10 +741,10 @@ static void AnimBrickBreakWallShard(struct Sprite *sprite)
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
return; return;
} }
sprite->callback = sub_80B1050; sprite->callback = AnimBrickBreakWallShard_Step;
} }
static void sub_80B1050(struct Sprite *sprite) static void AnimBrickBreakWallShard_Step(struct Sprite *sprite)
{ {
sprite->x += sprite->data[6]; sprite->x += sprite->data[6];
sprite->y += sprite->data[7]; sprite->y += sprite->data[7];
@@ -760,8 +756,8 @@ static void AnimSuperpowerOrb(struct Sprite *sprite)
{ {
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == 0)
{ {
sprite->x = GetBattlerSpriteCoord(gBattlerAttacker, 2); sprite->x = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattlerAttacker, 3); sprite->y = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_Y_PIC_OFFSET);
sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);
sprite->data[7] = gBattleAnimTarget; sprite->data[7] = gBattleAnimTarget;
} }
@@ -773,25 +769,26 @@ static void AnimSuperpowerOrb(struct Sprite *sprite)
sprite->data[0] = 0; sprite->data[0] = 0;
sprite->data[1] = 12; sprite->data[1] = 12;
sprite->data[2] = 8; sprite->data[2] = 8;
sprite->callback = sub_80B111C; sprite->callback = AnimSuperpowerOrb_Step;
} }
static void sub_80B111C(struct Sprite *sprite) static void AnimSuperpowerOrb_Step(struct Sprite *sprite)
{ {
if (++sprite->data[0] == 180) if (++sprite->data[0] == 180)
{ {
SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0);
sprite->data[0] = 16; sprite->data[0] = 16;
sprite->data[1] = sprite->x; sprite->data[1] = sprite->x;
sprite->data[2] = GetBattlerSpriteCoord(sprite->data[7], 2); sprite->data[2] = GetBattlerSpriteCoord(sprite->data[7], BATTLER_COORD_X_2);
sprite->data[3] = sprite->y; sprite->data[3] = sprite->y;
sprite->data[4] = GetBattlerSpriteCoord(sprite->data[7], 3); sprite->data[4] = GetBattlerSpriteCoord(sprite->data[7], BATTLER_COORD_Y_PIC_OFFSET);
InitAnimLinearTranslation(sprite); InitAnimLinearTranslation(sprite);
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
sprite->callback = RunLinearTranslation_ThenceSetCBtoStoredInData6; sprite->callback = AnimTranslateLinear_WithFollowup;
} }
} }
// Floating rock that flies off to hit the target. Used by Superpower
static void AnimSuperpowerRock(struct Sprite *sprite) static void AnimSuperpowerRock(struct Sprite *sprite)
{ {
sprite->x = gBattleAnimArgs[0]; sprite->x = gBattleAnimArgs[0];
@@ -800,10 +797,10 @@ static void AnimSuperpowerRock(struct Sprite *sprite)
StorePointerInVars(&sprite->data[4], &sprite->data[5], (void *)(sprite->y << 8)); StorePointerInVars(&sprite->data[4], &sprite->data[5], (void *)(sprite->y << 8));
sprite->data[6] = gBattleAnimArgs[1]; sprite->data[6] = gBattleAnimArgs[1];
sprite->oam.tileNum += gBattleAnimArgs[2] * 4; sprite->oam.tileNum += gBattleAnimArgs[2] * 4;
sprite->callback = sub_80B11E4; sprite->callback = AnimSuperpowerRock_Step1;
} }
static void sub_80B11E4(struct Sprite *sprite) static void AnimSuperpowerRock_Step1(struct Sprite *sprite)
{ {
void *var0; void *var0;
@@ -821,20 +818,20 @@ static void sub_80B11E4(struct Sprite *sprite)
} }
else else
{ {
s16 pos0 = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); s16 pos0 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
s16 pos1 = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); s16 pos1 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
s16 pos2 = GetBattlerSpriteCoord(gBattleAnimTarget, 2); s16 pos2 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
s16 pos3 = GetBattlerSpriteCoord(gBattleAnimTarget, 3); s16 pos3 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[0] = pos2 - pos0; sprite->data[0] = pos2 - pos0;
sprite->data[1] = pos3 - pos1; sprite->data[1] = pos3 - pos1;
sprite->data[2] = sprite->x << 4; sprite->data[2] = sprite->x << 4;
sprite->data[3] = sprite->y << 4; sprite->data[3] = sprite->y << 4;
sprite->callback = sub_80B12A4; sprite->callback = AnimSuperpowerRock_Step2;
} }
} }
static void sub_80B12A4(struct Sprite *sprite) static void AnimSuperpowerRock_Step2(struct Sprite *sprite)
{ {
u16 edgeX; u16 edgeX;
@@ -851,10 +848,10 @@ static void AnimSuperpowerFireball(struct Sprite *sprite)
{ {
u8 battler; u8 battler;
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == ANIM_ATTACKER)
{ {
sprite->x = GetBattlerSpriteCoord(gBattlerAttacker, 2); sprite->x = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattlerAttacker, 3); sprite->y = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_Y_PIC_OFFSET);
battler = gBattleAnimTarget; battler = gBattleAnimTarget;
sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);
} }
@@ -869,15 +866,15 @@ static void AnimSuperpowerFireball(struct Sprite *sprite)
sprite->oam.matrixNum |= (ST_OAM_HFLIP | ST_OAM_VFLIP); sprite->oam.matrixNum |= (ST_OAM_HFLIP | ST_OAM_VFLIP);
sprite->data[0] = 16; sprite->data[0] = 16;
sprite->data[1] = sprite->x; sprite->data[1] = sprite->x;
sprite->data[2] = GetBattlerSpriteCoord(battler, 2); sprite->data[2] = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2);
sprite->data[3] = sprite->y; sprite->data[3] = sprite->y;
sprite->data[4] = GetBattlerSpriteCoord(battler, 3); sprite->data[4] = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET);
InitAnimLinearTranslation(sprite); InitAnimLinearTranslation(sprite);
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
sprite->callback = RunLinearTranslation_ThenceSetCBtoStoredInData6; sprite->callback = AnimTranslateLinear_WithFollowup;
} }
static void sub_80B13D4(struct Sprite *sprite) static void AnimArmThrustHit_Step(struct Sprite *sprite)
{ {
if (sprite->data[0] == sprite->data[4]) if (sprite->data[0] == sprite->data[4])
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
@@ -888,8 +885,8 @@ static void AnimArmThrustHit(struct Sprite *sprite)
{ {
u8 turn; u8 turn;
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[1] = gBattleAnimArgs[3]; sprite->data[1] = gBattleAnimArgs[3];
sprite->data[2] = gBattleAnimArgs[0]; sprite->data[2] = gBattleAnimArgs[0];
sprite->data[3] = gBattleAnimArgs[1]; sprite->data[3] = gBattleAnimArgs[1];
@@ -905,12 +902,12 @@ static void AnimArmThrustHit(struct Sprite *sprite)
StartSpriteAnim(sprite, sprite->data[1]); StartSpriteAnim(sprite, sprite->data[1]);
sprite->x2 = sprite->data[2]; sprite->x2 = sprite->data[2];
sprite->y2 = sprite->data[3]; sprite->y2 = sprite->data[3];
sprite->callback = sub_80B13D4; sprite->callback = AnimArmThrustHit_Step;
} }
static void AnimRevengeScratch(struct Sprite *sprite) static void AnimRevengeScratch(struct Sprite *sprite)
{ {
if (gBattleAnimArgs[2] == 0) if (gBattleAnimArgs[2] == ANIM_ATTACKER)
InitSpritePosToAnimAttacker(sprite, 0); InitSpritePosToAnimAttacker(sprite, 0);
else else
InitSpritePosToAnimTarget(sprite, FALSE); InitSpritePosToAnimTarget(sprite, FALSE);
@@ -922,6 +919,7 @@ static void AnimRevengeScratch(struct Sprite *sprite)
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
} }
// Fist shrinks toward target and shakes
static void AnimFocusPunchFist(struct Sprite *sprite) static void AnimFocusPunchFist(struct Sprite *sprite)
{ {
if (sprite->affineAnimEnded) if (sprite->affineAnimEnded)
+273 -184
View File
@@ -10,8 +10,8 @@ static void AnimFireSpiralInward(struct Sprite *sprite);
static void AnimFireSpread(struct Sprite *sprite); static void AnimFireSpread(struct Sprite *sprite);
static void AnimLargeFlame(struct Sprite *sprite); static void AnimLargeFlame(struct Sprite *sprite);
static void AnimFirePlume(struct Sprite *sprite); static void AnimFirePlume(struct Sprite *sprite);
static void sub_80ACAA8(struct Sprite *sprite); static void AnimUnusedSmallEmber(struct Sprite *sprite);
static void sub_80ACBB0(struct Sprite *sprite); static void AnimSunlight(struct Sprite *sprite);
static void AnimEmberFlare(struct Sprite *sprite); static void AnimEmberFlare(struct Sprite *sprite);
static void AnimBurnFlame(struct Sprite *sprite); static void AnimBurnFlame(struct Sprite *sprite);
static void AnimFireRing(struct Sprite *sprite); static void AnimFireRing(struct Sprite *sprite);
@@ -21,22 +21,22 @@ static void AnimEruptionLaunchRock(struct Sprite *sprite);
static void AnimEruptionFallingRock(struct Sprite *sprite); static void AnimEruptionFallingRock(struct Sprite *sprite);
static void AnimWillOWispOrb(struct Sprite *sprite); static void AnimWillOWispOrb(struct Sprite *sprite);
static void AnimWillOWispFire(struct Sprite *sprite); static void AnimWillOWispFire(struct Sprite *sprite);
static void sub_80ACA6C(struct Sprite *sprite); static void AnimLargeFlame_Step(struct Sprite *sprite);
static void sub_80ACB1C(struct Sprite *sprite); static void AnimUnusedSmallEmber_Step(struct Sprite *sprite);
static void AnimFireRing_Step1(struct Sprite *sprite); static void AnimFireRing_Step1(struct Sprite *sprite);
static void AnimFireRing_Step2(struct Sprite *sprite); static void AnimFireRing_Step2(struct Sprite *sprite);
static void AnimFireRing_Step3(struct Sprite *sprite); static void AnimFireRing_Step3(struct Sprite *sprite);
static void UpdateFireRingCircleOffset(struct Sprite *sprite); static void UpdateFireRingCircleOffset(struct Sprite *sprite);
static void sub_80ACE28(struct Sprite *sprite); static void AnimFireSpiralOutward_Step1(struct Sprite *sprite);
static void sub_80ACE50(struct Sprite *sprite); static void AnimFireSpiralOutward_Step2(struct Sprite *sprite);
static void AnimTask_EruptionLaunchRocks_Step(u8 taskId); static void AnimTask_EruptionLaunchRocks_Step(u8 taskId);
static void sub_80AD1F8(u8 spriteId, u8 taskId, u8 a3); static void CreateEruptionLaunchRocks(u8 spriteId, u8 taskId, u8 a3);
static u16 sub_80AD374(u8 spriteId); static u16 GetEruptionLaunchRockInitialYPos(u8 spriteId);
static void sub_80AD3C8(struct Sprite *sprite, s16 x, s16 y); static void InitEruptionLaunchRockCoordData(struct Sprite *sprite, s16 x, s16 y);
static void sub_80AD3E4(struct Sprite *sprite); static void UpdateEruptionLaunchRockPos(struct Sprite *sprite);
static void sub_80AD4A8(struct Sprite *sprite); static void AnimEruptionFallingRock_Step(struct Sprite *sprite);
static void sub_80AD690(struct Sprite *sprite); static void AnimWillOWispOrb_Step(struct Sprite *sprite);
static void sub_80AD870(u8 taskId); static void AnimTask_MoveHeatWaveTargets_Step(u8 taskId);
static const union AnimCmd sAnim_FireSpiralSpread_0[] = static const union AnimCmd sAnim_FireSpiralSpread_0[] =
{ {
@@ -160,7 +160,7 @@ const struct SpriteTemplate gFirePlumeSpriteTemplate =
.callback = AnimFirePlume, .callback = AnimFirePlume,
}; };
const struct SpriteTemplate gUnknown_83E5CB8 = static const struct SpriteTemplate sUnusedEmberFirePlumeSpriteTemplate =
{ {
.tileTag = ANIM_TAG_SMALL_EMBER, .tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER,
@@ -171,7 +171,7 @@ const struct SpriteTemplate gUnknown_83E5CB8 =
.callback = AnimFirePlume, .callback = AnimFirePlume,
}; };
static const union AnimCmd gUnknown_83E5CD0[] = static const union AnimCmd sAnim_UnusedSmallEmber[] =
{ {
ANIMCMD_FRAME(16, 6), ANIMCMD_FRAME(16, 6),
ANIMCMD_FRAME(32, 6), ANIMCMD_FRAME(32, 6),
@@ -179,20 +179,20 @@ static const union AnimCmd gUnknown_83E5CD0[] =
ANIMCMD_JUMP(0), ANIMCMD_JUMP(0),
}; };
static const union AnimCmd *const gUnknown_83E5CE0[] = static const union AnimCmd *const sAnims_UnusedSmallEmber[] =
{ {
gUnknown_83E5CD0, sAnim_UnusedSmallEmber,
}; };
const struct SpriteTemplate gUnknown_83E5CE4 = static const struct SpriteTemplate sUnusedSmallEmberSpriteTemplate =
{ {
.tileTag = ANIM_TAG_SMALL_EMBER, .tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5CE0, .anims = sAnims_UnusedSmallEmber,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80ACAA8, .callback = AnimUnusedSmallEmber,
}; };
static const union AffineAnimCmd sAffineAnim_SunlightRay[] = static const union AffineAnimCmd sAffineAnim_SunlightRay[] =
@@ -215,7 +215,7 @@ const struct SpriteTemplate gSunlightRaySpriteTemplate =
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = sAffineAnims_SunlightRay, .affineAnims = sAffineAnims_SunlightRay,
.callback = sub_80ACBB0, .callback = AnimSunlight,
}; };
static const union AnimCmd sAnim_BasicFire[] = static const union AnimCmd sAnim_BasicFire[] =
@@ -289,22 +289,22 @@ static const union AnimCmd *const sAnims_FireBlastCross[] =
sAnim_FireBlastCross, sAnim_FireBlastCross,
}; };
static const union AffineAnimCmd gUnknown_83E5DBC[] = static const union AffineAnimCmd sAffineAnim_Unused_0[] =
{ {
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1),
AFFINEANIMCMD_END, AFFINEANIMCMD_END,
}; };
static const union AffineAnimCmd gUnknown_83E5DCC[] = static const union AffineAnimCmd sAffineAnim_Unused_1[] =
{ {
AFFINEANIMCMD_FRAME(0xA0, 0xA0, 0, 0), AFFINEANIMCMD_FRAME(0xA0, 0xA0, 0, 0),
AFFINEANIMCMD_END, AFFINEANIMCMD_END,
}; };
static const union AffineAnimCmd *const gUnknown_83E5DDC[] = static const union AffineAnimCmd *const sAffineAnims_Unused[] =
{ {
gUnknown_83E5DBC, sAffineAnim_Unused_0,
gUnknown_83E5DCC, sAffineAnim_Unused_1,
}; };
const struct SpriteTemplate gFireBlastCrossSpriteTemplate = const struct SpriteTemplate gFireBlastCrossSpriteTemplate =
@@ -351,7 +351,7 @@ static const struct SpriteTemplate gEruptionLaunchRockSpriteTemplate =
.callback = AnimEruptionLaunchRock, .callback = AnimEruptionLaunchRock,
}; };
static const s16 sEruptionLaunchRockCoords[][2] = static const s16 sEruptionLaunchRockSpeeds[][2] =
{ {
{-2, -5}, {-2, -5},
{-1, -1}, {-1, -1},
@@ -457,6 +457,7 @@ static const s8 sShakeDirsPattern1[16] =
-1, 0, 1, 0, -1, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, 1, -1, 0, 1, 0, -1, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, 1,
}; };
// For the first stage of Fire Punch
static void AnimFireSpiralInward(struct Sprite *sprite) static void AnimFireSpiralInward(struct Sprite *sprite)
{ {
sprite->data[0] = gBattleAnimArgs[0]; sprite->data[0] = gBattleAnimArgs[0];
@@ -465,10 +466,11 @@ static void AnimFireSpiralInward(struct Sprite *sprite)
sprite->data[3] = 0x1E; sprite->data[3] = 0x1E;
sprite->data[4] = 0xFE00; sprite->data[4] = 0xFE00;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
sprite->callback = TranslateSpriteInGrowingCircleOverDuration; sprite->callback = TranslateSpriteInGrowingCircle;
sprite->callback(sprite); sprite->callback(sprite);
} }
// For the impact spread of fire sprites for moves like Blaze Kick or Fire Punch
static void AnimFireSpread(struct Sprite *sprite) static void AnimFireSpread(struct Sprite *sprite)
{ {
SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
@@ -498,7 +500,7 @@ static void AnimFirePlume(struct Sprite *sprite)
sprite->data[1] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[2];
sprite->data[4] = gBattleAnimArgs[3]; sprite->data[4] = gBattleAnimArgs[3];
sprite->data[3] = gBattleAnimArgs[5]; sprite->data[3] = gBattleAnimArgs[5];
sprite->callback = sub_80ACA6C; sprite->callback = AnimLargeFlame_Step;
} }
static void AnimLargeFlame(struct Sprite *sprite) static void AnimLargeFlame(struct Sprite *sprite)
@@ -518,10 +520,10 @@ static void AnimLargeFlame(struct Sprite *sprite)
sprite->data[1] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[2];
sprite->data[4] = gBattleAnimArgs[3]; sprite->data[4] = gBattleAnimArgs[3];
sprite->data[3] = gBattleAnimArgs[5]; sprite->data[3] = gBattleAnimArgs[5];
sprite->callback = sub_80ACA6C; sprite->callback = AnimLargeFlame_Step;
} }
static void sub_80ACA6C(struct Sprite *sprite) static void AnimLargeFlame_Step(struct Sprite *sprite)
{ {
if (++sprite->data[0] < sprite->data[4]) if (++sprite->data[0] < sprite->data[4])
{ {
@@ -532,7 +534,7 @@ static void sub_80ACA6C(struct Sprite *sprite)
DestroySpriteAndMatrix(sprite); DestroySpriteAndMatrix(sprite);
} }
static void sub_80ACAA8(struct Sprite *sprite) static void AnimUnusedSmallEmber(struct Sprite *sprite)
{ {
SetSpriteCoordsToAnimAttackerCoords(sprite); SetSpriteCoordsToAnimAttackerCoords(sprite);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
@@ -551,10 +553,10 @@ static void sub_80ACAA8(struct Sprite *sprite)
sprite->data[3] = gBattleAnimArgs[5]; sprite->data[3] = gBattleAnimArgs[5];
sprite->data[4] = gBattleAnimArgs[6]; sprite->data[4] = gBattleAnimArgs[6];
sprite->data[5] = 0; sprite->data[5] = 0;
sprite->callback = sub_80ACB1C; sprite->callback = AnimUnusedSmallEmber_Step;
} }
static void sub_80ACB1C(struct Sprite *sprite) static void AnimUnusedSmallEmber_Step(struct Sprite *sprite)
{ {
if (sprite->data[3]) if (sprite->data[3])
{ {
@@ -576,8 +578,8 @@ static void sub_80ACB1C(struct Sprite *sprite)
} }
} }
//sunlight // Sunlight from Sunny Day / sunny weather
static void sub_80ACBB0(struct Sprite *sprite) static void AnimSunlight(struct Sprite *sprite)
{ {
sprite->x = 0; sprite->x = 0;
sprite->y = 0; sprite->y = 0;
@@ -588,8 +590,6 @@ static void sub_80ACBB0(struct Sprite *sprite)
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
} }
//fire 2
// Animates the secondary effect of MOVE_EMBER, where the flames grow and slide // Animates the secondary effect of MOVE_EMBER, where the flames grow and slide
// horizontally a bit. // horizontally a bit.
// arg 0: initial x pixel offset // arg 0: initial x pixel offset
@@ -605,7 +605,7 @@ static void AnimEmberFlare(struct Sprite *sprite)
&& (gBattleAnimAttacker == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT) && (gBattleAnimAttacker == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)
|| gBattleAnimAttacker == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) || gBattleAnimAttacker == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)))
gBattleAnimArgs[2] = -gBattleAnimArgs[2]; gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->callback = AnimSnoreZ; sprite->callback = AnimTravelDiagonally;
sprite->callback(sprite); sprite->callback(sprite);
} }
@@ -613,7 +613,7 @@ static void AnimBurnFlame(struct Sprite *sprite)
{ {
gBattleAnimArgs[0] = -gBattleAnimArgs[0]; gBattleAnimArgs[0] = -gBattleAnimArgs[0];
gBattleAnimArgs[2] = -gBattleAnimArgs[2]; gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->callback = AnimSnoreZ; sprite->callback = AnimTravelDiagonally;
} }
// Animates the a fire sprite in the first-half of the MOVE_FIRE_BLAST // Animates the a fire sprite in the first-half of the MOVE_FIRE_BLAST
@@ -626,7 +626,7 @@ static void AnimBurnFlame(struct Sprite *sprite)
//void AnimFireRing(struct Sprite *sprite) //void AnimFireRing(struct Sprite *sprite)
static void AnimFireRing(struct Sprite *sprite) static void AnimFireRing(struct Sprite *sprite)
{ {
InitSpritePosToAnimAttacker(sprite, 1); InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[7] = gBattleAnimArgs[2]; sprite->data[7] = gBattleAnimArgs[2];
sprite->data[0] = 0; sprite->data[0] = 0;
sprite->callback = AnimFireRing_Step1; sprite->callback = AnimFireRing_Step1;
@@ -706,19 +706,19 @@ static void AnimFireSpiralOutward(struct Sprite *sprite)
sprite->data[0] = gBattleAnimArgs[3]; sprite->data[0] = gBattleAnimArgs[3];
sprite->invisible = TRUE; sprite->invisible = TRUE;
sprite->callback = WaitAnimForDuration; sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData6(sprite, sub_80ACE28); StoreSpriteCallbackInData6(sprite, AnimFireSpiralOutward_Step1);
} }
static void sub_80ACE28(struct Sprite *sprite) static void AnimFireSpiralOutward_Step1(struct Sprite *sprite)
{ {
sprite->invisible = FALSE; sprite->invisible = FALSE;
sprite->data[0] = sprite->data[1]; sprite->data[0] = sprite->data[1];
sprite->data[1] = 0; sprite->data[1] = 0;
sprite->callback = sub_80ACE50; sprite->callback = AnimFireSpiralOutward_Step2;
sprite->callback(sprite); sprite->callback(sprite);
} }
static void sub_80ACE50(struct Sprite *sprite) static void AnimFireSpiralOutward_Step2(struct Sprite *sprite)
{ {
sprite->x2 = Sin(sprite->data[1], sprite->data[2] >> 8); sprite->x2 = Sin(sprite->data[1], sprite->data[2] >> 8);
sprite->y2 = Cos(sprite->data[1], sprite->data[2] >> 8); sprite->y2 = Cos(sprite->data[1], sprite->data[2] >> 8);
@@ -728,258 +728,337 @@ static void sub_80ACE50(struct Sprite *sprite)
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
} }
void AnimTask_EruptionLaunchRocks(u8 taskId) // initialize animation task for Move_ERUPTION? #define IDX_ACTIVE_SPRITES 6 // Used by the sprite callback to modify the number of active sprites
#define tState data[0]
#define tTimer1 data[1]
#define tTimer2 data[2]
#define tTimer3 data[3]
#define tAttackerY data[4]
#define tAttackerSide data[5]
#define tActiveSprites data[IDX_ACTIVE_SPRITES]
// data[8]-data[15] used by BattleAnimHelper_SetSpriteSquashParams / BattleAnimHelper_RunSpriteSquash
#define tAttackerSpriteId data[15]
#define sSpeedDelay data[0]
#define sLaunchStage data[1]
#define sX data[2]
#define sY data[3]
#define sSpeedX data[4]
#define sSpeedY data[5]
#define sTaskId data[6]
#define sActiveSpritesIdx data[7]
// Animates first stage of Eruption where the attacker squishes and launches rocks away from themself
void AnimTask_EruptionLaunchRocks(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->tAttackerSpriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
task->data[0] = 0; task->tState = 0;
task->data[1] = 0; task->tTimer1 = 0;
task->data[2] = 0; task->tTimer2 = 0;
task->data[3] = 0; task->tTimer3 = 0;
task->data[4] = gSprites[task->data[15]].y; task->tAttackerY = gSprites[task->tAttackerSpriteId].y;
task->data[5] = GetBattlerSide(gBattleAnimAttacker); task->tAttackerSide = GetBattlerSide(gBattleAnimAttacker);
task->data[6] = 0; task->tActiveSprites = 0;
PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL); PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL);
task->func = AnimTask_EruptionLaunchRocks_Step; task->func = AnimTask_EruptionLaunchRocks_Step;
} }
static void AnimTask_EruptionLaunchRocks_Step(u8 taskId) // animate Move_ERUPTION? static void AnimTask_EruptionLaunchRocks_Step(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
switch (task->data[0]) switch (task->tState)
{ {
case 0: case 0:
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x100, 0x100, 0xE0, 0x200, 0x20); BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x100, 0x100, 0xE0, 0x200, 32);
++task->data[0]; task->tState++;
// fall through
case 1: case 1:
if (++task->data[1] > 1) if (++task->tTimer1 > 1)
{ {
task->data[1] = 0; task->tTimer1 = 0;
if (++task->data[2] & 0x1)
gSprites[task->data[15]].x2 = 3; if (++task->tTimer2 & 1)
gSprites[task->tAttackerSpriteId].x2 = 3;
else else
gSprites[task->data[15]].x2 = -3; gSprites[task->tAttackerSpriteId].x2 = -3;
} }
if (task->data[5])
if (task->tAttackerSide != B_SIDE_PLAYER)
{ {
if (++task->data[3] > 4) if (++task->tTimer3 > 4)
{ {
task->data[3] = 0; task->tTimer3 = 0;
++gSprites[task->data[15]].y; gSprites[task->tAttackerSpriteId].y++;
} }
} }
if(!BattleAnimHelper_RunSpriteSquash(task)) if(!BattleAnimHelper_RunSpriteSquash(task))
{ {
SetBattlerSpriteYOffsetFromYScale(task->data[15]); SetBattlerSpriteYOffsetFromYScale(task->tAttackerSpriteId);
gSprites[task->data[15]].x2 = 0; gSprites[task->tAttackerSpriteId].x2 = 0;
task->data[1] = 0;
task->data[2] = 0; task->tTimer1 = 0;
task->data[3] = 0; task->tTimer2 = 0;
++task->data[0]; task->tTimer3 = 0;
task->tState++;
} }
break; break;
case 2: case 2:
if (++task->data[1] > 4) if (++task->tTimer1 > 4)
{ {
if (task->data[5]) if (task->tAttackerSide != B_SIDE_PLAYER)
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0xE0, 0x200, 0x180, 0xF0, 0x6); BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0xE0, 0x200, 0x180, 0xF0, 6);
else else
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0xE0, 0x200, 0x180, 0xC0, 0x6); BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0xE0, 0x200, 0x180, 0xC0, 6);
task->data[1] = 0;
++task->data[0]; task->tTimer1 = 0;
task->tState++;
} }
break; break;
case 3: case 3:
if (!BattleAnimHelper_RunSpriteSquash(task)) if (!BattleAnimHelper_RunSpriteSquash(task))
{ {
sub_80AD1F8(task->data[15], taskId, 6); CreateEruptionLaunchRocks(task->tAttackerSpriteId, taskId, IDX_ACTIVE_SPRITES);
++task->data[0]; task->tState++;
} }
break; break;
case 4: case 4:
if (++task->data[1] > 1) if (++task->tTimer1 > 1)
{ {
task->data[1] = 0; task->tTimer1 = 0;
if (++task->data[2] & 1)
gSprites[task->data[15]].y2 += 3; if (++task->tTimer2 & 1)
gSprites[task->tAttackerSpriteId].y2 += 3;
else else
gSprites[task->data[15]].y2 -= 3; gSprites[task->tAttackerSpriteId].y2 -= 3;
} }
if (++task->data[3] > 0x18)
if (++task->tTimer3 > 24)
{ {
if (task->data[5]) if (task->tAttackerSide != B_SIDE_PLAYER)
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x180, 0xF0, 0x100, 0x100, 0x8); BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x180, 0xF0, 0x100, 0x100, 8);
else else
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x180, 0xC0, 0x100, 0x100, 0x8); BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x180, 0xC0, 0x100, 0x100, 8);
if (task->data[2] & 1)
gSprites[task->data[15]].y2 -= 3; if (task->tTimer2 & 1)
task->data[1] = 0; gSprites[task->tAttackerSpriteId].y2 -= 3;
task->data[2] = 0;
task->data[3] = 0; task->tTimer1 = 0;
++task->data[0]; task->tTimer2 = 0;
task->tTimer3 = 0;
task->tState++;
} }
break; break;
case 5: case 5:
if (task->data[5]) if (task->tAttackerSide != B_SIDE_PLAYER)
--gSprites[task->data[15]].y; gSprites[task->tAttackerSpriteId].y--;
if (!BattleAnimHelper_RunSpriteSquash(task)) if (!BattleAnimHelper_RunSpriteSquash(task))
{ {
gSprites[task->data[15]].y = task->data[4]; gSprites[task->tAttackerSpriteId].y = task->tAttackerY;
ResetSpriteRotScale(task->data[15]); ResetSpriteRotScale(task->tAttackerSpriteId);
task->tTimer2 = 0;
task->data[2] = 0; task->tState++;
++task->data[0];
} }
break; break;
case 6: case 6:
if (!task->data[6]) if (task->tActiveSprites == 0)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
break; break;
default:
break;
} }
} }
static void sub_80AD1F8(u8 spriteId, u8 taskId, u8 a3) static void CreateEruptionLaunchRocks(u8 spriteId, u8 taskId, u8 activeSpritesIdx)
{ {
u16 i, j; u16 i, j;
s8 sign; s8 sign;
u16 y = sub_80AD374(spriteId);
u16 y = GetEruptionLaunchRockInitialYPos(spriteId);
u16 x = gSprites[spriteId].x; u16 x = gSprites[spriteId].x;
if(GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) if(!GetBattlerSide(gBattleAnimAttacker))
{ {
x -= 0xC; x -= 12;
sign = 1; sign = 1;
} }
else else
{ {
x += 0x10; x += 16;
sign = -1; sign = -1;
} }
for (i = 0, j = 0; i <= 6; ++i)
for (i = 0, j = 0; i <= 6; i++)
{ {
u8 spriteId = CreateSprite(&gEruptionLaunchRockSpriteTemplate, x, y, 2); u8 spriteId = CreateSprite(&gEruptionLaunchRockSpriteTemplate, x, y, 2);
if (spriteId != 0x40) if (spriteId != MAX_SPRITES)
{ {
gSprites[spriteId].oam.tileNum += j * 4 + 0x40; gSprites[spriteId].oam.tileNum += j * 4 + 0x40;
if (++j >= 5) if (++j >= 5)
j = 0; j = 0;
sub_80AD3C8(&gSprites[spriteId], sEruptionLaunchRockCoords[i][0] * sign, sEruptionLaunchRockCoords[i][1]);
gSprites[spriteId].data[6] = taskId; InitEruptionLaunchRockCoordData(&gSprites[spriteId], sEruptionLaunchRockSpeeds[i][0] * sign, sEruptionLaunchRockSpeeds[i][1]);
gSprites[spriteId].data[7] = a3; gSprites[spriteId].sTaskId = taskId;
++gTasks[taskId].data[a3]; gSprites[spriteId].sActiveSpritesIdx = activeSpritesIdx;
gTasks[taskId].data[activeSpritesIdx]++;
} }
} }
} }
static void AnimEruptionLaunchRock(struct Sprite *sprite) static void AnimEruptionLaunchRock(struct Sprite *sprite)
{ {
sub_80AD3E4(sprite); UpdateEruptionLaunchRockPos(sprite);
if (sprite->invisible) if (sprite->invisible)
{ {
--gTasks[sprite->data[6]].data[sprite->data[7]]; gTasks[sprite->sTaskId].data[sprite->sActiveSpritesIdx]--;
DestroySprite(sprite); DestroySprite(sprite);
} }
} }
static u16 sub_80AD374(u8 spriteId) static u16 GetEruptionLaunchRockInitialYPos(u8 spriteId)
{ {
u16 var1 = gSprites[spriteId].y + gSprites[spriteId].y2 + gSprites[spriteId].centerToCornerVecY; s16 y = gSprites[spriteId].y + gSprites[spriteId].y2 + gSprites[spriteId].centerToCornerVecY;
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
var1 = ((var1 << 16) + 0x4A0000) >> 16; y += 74;
else else
var1 = ((var1 << 16) + 0x2C0000) >> 16; y += 44;
return var1;
return y;
} }
static void sub_80AD3C8(struct Sprite *sprite, s16 x, s16 y) static void InitEruptionLaunchRockCoordData(struct Sprite *sprite, s16 speedX, s16 speedY)
{ {
sprite->data[0] = 0; sprite->sSpeedDelay = 0;
sprite->data[1] = 0; sprite->sLaunchStage = 0;
sprite->data[2] = (u16)sprite->x * 8; sprite->sX = (u16)sprite->x * 8;
sprite->data[3] = (u16)sprite->y * 8; sprite->sY = (u16)sprite->y * 8;
sprite->data[4] = x * 8; sprite->sSpeedX = speedX * 8;
sprite->data[5] = y * 8; sprite->sSpeedY = speedY * 8;
} }
static void sub_80AD3E4(struct Sprite *sprite) static void UpdateEruptionLaunchRockPos(struct Sprite *sprite)
{ {
s32 var1; int extraLaunchSpeed;
if (++sprite->sSpeedDelay > 2)
if (++sprite->data[0] > 2)
{ {
sprite->data[0] = 0; sprite->sSpeedDelay = 0;
++sprite->data[1]; ++sprite->sLaunchStage;
var1 = (u16)sprite->data[1] * (u16)sprite->data[1]; extraLaunchSpeed = (u16)sprite->sLaunchStage * (u16)sprite->sLaunchStage;
sprite->data[3] += var1; sprite->sY += extraLaunchSpeed;
} }
sprite->data[2] += sprite->data[4];
sprite->x = sprite->data[2] >> 3; sprite->sX += sprite->sSpeedX;
sprite->data[3] += sprite->data[5]; sprite->x = sprite->sX >> 3;
sprite->y = sprite->data[3] >> 3; sprite->sY += sprite->sSpeedY;
if (sprite->x < -8 || sprite->x > 0xf8 || sprite->y < -8 || sprite->y > 120) sprite->y = sprite->sY >> 3;
if (sprite->x < -8 || sprite->x > DISPLAY_WIDTH + 8 || sprite->y < -8 || sprite->y > 120)
sprite->invisible = TRUE; sprite->invisible = TRUE;
} }
#undef IDX_ACTIVE_SPRITES
#undef tState
#undef tTimer1
#undef tTimer2
#undef tTimer3
#undef tAttackerY
#undef tAttackerSide
#undef tActiveSprites
#undef tAttackerSpriteId
#undef sSpeedDelay
#undef sLaunchStage
#undef sX
#undef sY
#undef sSpeedX
#undef sSpeedY
#undef sTaskId
#undef sActiveSpritesIdx
#define sState data[0]
#define sBounceTimer data[1]
#define sBounceDir data[2]
#define sEndTimer data[3]
#define sFallDelay data[6]
#define sTargetY data[7]
static void AnimEruptionFallingRock(struct Sprite *sprite) static void AnimEruptionFallingRock(struct Sprite *sprite)
{ {
sprite->x = gBattleAnimArgs[0]; sprite->x = gBattleAnimArgs[0];
sprite->y = gBattleAnimArgs[1]; sprite->y = gBattleAnimArgs[1];
sprite->data[0] = 0;
sprite->data[1] = 0; sprite->sState = 0;
sprite->data[2] = 0; sprite->sBounceTimer = 0;
sprite->data[6] = gBattleAnimArgs[2]; sprite->sBounceDir = 0;
sprite->data[7] = gBattleAnimArgs[3]; sprite->sFallDelay = gBattleAnimArgs[2];
sprite->sTargetY = gBattleAnimArgs[3];
sprite->oam.tileNum += gBattleAnimArgs[4] * 16; sprite->oam.tileNum += gBattleAnimArgs[4] * 16;
sprite->callback = sub_80AD4A8; sprite->callback = AnimEruptionFallingRock_Step;
} }
static void sub_80AD4A8(struct Sprite *sprite) static void AnimEruptionFallingRock_Step(struct Sprite *sprite)
{ {
switch (sprite->data[0]) switch (sprite->sState)
{ {
case 0: case 0:
if (sprite->data[6] != 0) // Wait to begin falling
if (sprite->sFallDelay != 0)
{ {
--sprite->data[6]; sprite->sFallDelay--;
return; return;
} }
++sprite->data[0];
sprite->sState++;
// fall through // fall through
case 1: case 1:
// Rock is falling
sprite->y += 8; sprite->y += 8;
if (sprite->y >= sprite->data[7]) if (sprite->y >= sprite->sTargetY)
{ {
sprite->y = sprite->data[7]; sprite->y = sprite->sTargetY;
++sprite->data[0]; sprite->sState++;
} }
break; break;
case 2: case 2:
if (++sprite->data[1] > 1) // Bounce up and down on landing spot
if (++sprite->sBounceTimer > 1)
{ {
sprite->data[1] = 0; sprite->sBounceTimer = 0;
if ((++sprite->data[2] & 1) != 0) if ((++sprite->sBounceDir & 1) != 0)
sprite->y2 = -3; sprite->y2 = -3;
else else
sprite->y2 = 3; sprite->y2 = 3;
} }
if (++sprite->data[3] > 16)
if (++sprite->sEndTimer > 16)
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
break; break;
} }
} }
#undef sState
#undef sBounceTimer
#undef sBounceDir
#undef sEndTimer
#undef sFallDelay
#undef sTargetY
//wisp orb //wisp orb
static void AnimWillOWispOrb(struct Sprite *sprite) static void AnimWillOWispOrb(struct Sprite *sprite)
{ {
switch (sprite->data[0]) switch (sprite->data[0])
{ {
case 0: case 0:
InitSpritePosToAnimAttacker(sprite, 0); InitSpritePosToAnimAttacker(sprite, FALSE);
StartSpriteAnim(sprite, gBattleAnimArgs[2]); StartSpriteAnim(sprite, gBattleAnimArgs[2]);
sprite->data[7] = gBattleAnimArgs[2]; sprite->data[7] = gBattleAnimArgs[2];
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
@@ -1016,14 +1095,14 @@ static void AnimWillOWispOrb(struct Sprite *sprite)
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->data[3] = sprite->y; sprite->data[3] = sprite->y;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
BattleAnim_InitLinearTranslationWithDuration(sprite); InitAnimLinearTranslationWithSpeed(sprite);
sprite->callback = sub_80AD690; sprite->callback = AnimWillOWispOrb_Step;
} }
break; break;
} }
} }
static void sub_80AD690(struct Sprite *sprite) static void AnimWillOWispOrb_Step(struct Sprite *sprite)
{ {
s16 initialData5, newData5; s16 initialData5, newData5;
@@ -1034,7 +1113,7 @@ static void sub_80AD690(struct Sprite *sprite)
sprite->data[5] = (sprite->data[5] + 4) & 0xFF; sprite->data[5] = (sprite->data[5] + 4) & 0xFF;
newData5 = sprite->data[5]; newData5 = sprite->data[5];
if ((initialData5 == 0 || initialData5 > 196) && newData5 > 0 && sprite->data[7] == 0) if ((initialData5 == 0 || initialData5 > 196) && newData5 > 0 && sprite->data[7] == 0)
PlaySE12WithPanning(SE_M_FLAME_WHEEL, gUnknown_2037F24); PlaySE12WithPanning(SE_M_FLAME_WHEEL, gAnimCustomPanning);
} }
else else
{ {
@@ -1042,7 +1121,6 @@ static void sub_80AD690(struct Sprite *sprite)
} }
} }
//wisp fire
static void AnimWillOWispFire(struct Sprite *sprite) static void AnimWillOWispFire(struct Sprite *sprite)
{ {
if (!sprite->data[0]) if (!sprite->data[0])
@@ -1083,10 +1161,10 @@ void AnimTask_MoveHeatWaveTargets(u8 taskId)
task->data[13] = IsBattlerSpriteVisible(gBattleAnimTarget ^ BIT_FLANK) + 1; task->data[13] = IsBattlerSpriteVisible(gBattleAnimTarget ^ BIT_FLANK) + 1;
task->data[14] = GetAnimBattlerSpriteId(ANIM_TARGET); task->data[14] = GetAnimBattlerSpriteId(ANIM_TARGET);
task->data[15] = GetAnimBattlerSpriteId(ANIM_DEF_PARTNER); task->data[15] = GetAnimBattlerSpriteId(ANIM_DEF_PARTNER);
task->func = sub_80AD870; task->func = AnimTask_MoveHeatWaveTargets_Step;
} }
static void sub_80AD870(u8 taskId) static void AnimTask_MoveHeatWaveTargets_Step(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -1153,7 +1231,7 @@ static void sub_80AD870(u8 taskId)
} }
} }
// Used to add a color mask to the battle interface / HUD in Heat Wave. // Used to add a color mask to the battle background.
// arg 0: opacity // arg 0: opacity
// arg 1: color code // arg 1: color code
void AnimTask_BlendBackground(u8 taskId) void AnimTask_BlendBackground(u8 taskId)
@@ -1165,29 +1243,40 @@ void AnimTask_BlendBackground(u8 taskId)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
#define tShakeNum data[0]
#define tMaxShakes data[1]
#define tShakeOffset data[2] // Never read, gBattleAnimArgs[1] is used directly instead
#define tVertical data[3]
#define tPatternId data[4]
// Shakes target horizontally or vertically tMaxShakes times, following a set pattern of alternations
void AnimTask_ShakeTargetInPattern(u8 taskId) void AnimTask_ShakeTargetInPattern(u8 taskId)
{ {
s8 unk; s8 dir;
u8 spriteId; u8 spriteId;
if (gTasks[taskId].data[0] == 0) if (gTasks[taskId].tShakeNum == 0)
{ {
gTasks[taskId].data[1] = gBattleAnimArgs[0]; gTasks[taskId].tMaxShakes = gBattleAnimArgs[0];
gTasks[taskId].data[2] = gBattleAnimArgs[1]; gTasks[taskId].tShakeOffset = gBattleAnimArgs[1];
gTasks[taskId].data[3] = gBattleAnimArgs[2]; gTasks[taskId].tVertical = gBattleAnimArgs[2];
gTasks[taskId].data[4] = gBattleAnimArgs[3]; gTasks[taskId].tPatternId = gBattleAnimArgs[3];
} }
++gTasks[taskId].data[0]; gTasks[taskId].tShakeNum++;
spriteId = gBattlerSpriteIds[gBattleAnimTarget]; spriteId = gBattlerSpriteIds[gBattleAnimTarget];
if (!gTasks[taskId].data[4])
unk = sShakeDirsPattern0[gTasks[taskId].data[0] % 10]; if (gTasks[taskId].tPatternId == 0)
dir = sShakeDirsPattern0[gTasks[taskId].tShakeNum % 10];
else else
unk = sShakeDirsPattern1[gTasks[taskId].data[0] % 10]; dir = sShakeDirsPattern1[gTasks[taskId].tShakeNum % 10];
if (gTasks[taskId].data[3] == 1)
gSprites[spriteId].y2 = gBattleAnimArgs[1] * unk < 0 ? -(gBattleAnimArgs[1] * unk) : gBattleAnimArgs[1] * unk; if (gTasks[taskId].tVertical == TRUE)
gSprites[spriteId].y2 = gBattleAnimArgs[1] * dir < 0 ? -(gBattleAnimArgs[1] * dir) : gBattleAnimArgs[1] * dir;
else else
gSprites[spriteId].x2 = gBattleAnimArgs[1] * unk; gSprites[spriteId].x2 = gBattleAnimArgs[1] * dir;
if (gTasks[taskId].data[0] == gTasks[taskId].data[1])
if (gTasks[taskId].tShakeNum == gTasks[taskId].tMaxShakes)
{ {
gSprites[spriteId].x2 = 0; gSprites[spriteId].x2 = 0;
gSprites[spriteId].y2 = 0; gSprites[spriteId].y2 = 0;
+74 -75
View File
@@ -11,29 +11,29 @@ static void AnimAirWaveCrescent(struct Sprite *sprite);
static void AnimFlyBallUp(struct Sprite *sprite); static void AnimFlyBallUp(struct Sprite *sprite);
static void AnimFlyBallAttack(struct Sprite *sprite); static void AnimFlyBallAttack(struct Sprite *sprite);
static void AnimFallingFeather(struct Sprite *sprite); static void AnimFallingFeather(struct Sprite *sprite);
static void sub_80B24C0(struct Sprite *sprite); static void AnimUnusedBubbleThrow(struct Sprite *sprite);
static void sub_80B2514(struct Sprite *sprite); static void AnimUnusedFeather(struct Sprite *sprite);
static void AnimWhirlwindLine(struct Sprite *sprite); static void AnimWhirlwindLine(struct Sprite *sprite);
static void AnimBounceBallShrink(struct Sprite *sprite); static void AnimBounceBallShrink(struct Sprite *sprite);
static void AnimBounceBallLand(struct Sprite *sprite); static void AnimBounceBallLand(struct Sprite *sprite);
static void AnimDiveBall(struct Sprite *sprite); static void AnimDiveBall(struct Sprite *sprite);
static void AnimDiveWaterSplash(struct Sprite *sprite); static void AnimDiveWaterSplash(struct Sprite *sprite);
static void AnimSprayWaterDroplet(struct Sprite *sprite); static void AnimSprayWaterDroplet(struct Sprite *sprite);
static void sub_80B2CE4(struct Sprite *sprite); static void AnimUnusedFlashingLight(struct Sprite *sprite);
static void AnimSkyAttackBird(struct Sprite *sprite); static void AnimSkyAttackBird(struct Sprite *sprite);
static void sub_80B190C(struct Sprite *sprite); static void AnimEllipticalGust_Step(struct Sprite *sprite);
static void sub_80B198C(u8 taskId); static void AnimTask_AnimateGustTornadoPalette_Step(u8 taskId);
static void sub_80B1A9C(struct Sprite *sprite); static void AnimGustToTarget_Step(struct Sprite *sprite);
static void sub_80B1BF8(struct Sprite *sprite); static void AnimFlyBallUp_Step(struct Sprite *sprite);
static void sub_80B1CC0(struct Sprite *sprite); static void AnimFlyBallAttack_Step(struct Sprite *sprite);
static void AnimFallingFeather_Step(struct Sprite *sprite); static void AnimFallingFeather_Step(struct Sprite *sprite);
static void sub_80B268C(struct Sprite *sprite); static void AnimUnusedFeather_Step(struct Sprite *sprite);
static void sub_80B2820(struct Sprite *sprite); static void AnimWhirlwindLine_Step(struct Sprite *sprite);
static void sub_80B2A50(struct Sprite *sprite); static void AnimDiveBall_Step1(struct Sprite *sprite);
static void sub_80B2AB0(struct Sprite *sprite); static void AnimDiveBall_Step2(struct Sprite *sprite);
static void sub_80B2C88(struct Sprite *sprite); static void AnimSprayWaterDroplet_Step(struct Sprite *sprite);
static void sub_80B2CF8(struct Sprite *sprite); static void AnimUnusedFlashingLight_Step(struct Sprite *sprite);
static void sub_80B2E20(struct Sprite *sprite); static void AnimSkyAttackBird_Step(struct Sprite *sprite);
const struct SpriteTemplate gEllipticalGustSpriteTemplate = const struct SpriteTemplate gEllipticalGustSpriteTemplate =
{ {
@@ -177,10 +177,9 @@ const struct SpriteTemplate gFallingFeatherSpriteTemplate =
.callback = AnimFallingFeather, .callback = AnimFallingFeather,
}; };
// not used static const u16 sUnusedPal[] = INCBIN_U16("graphics/battle_anims/unk_83E6C18.gbapal");
static const u16 gUnknown_83E6C18[] = INCBIN_U16("graphics/battle_anims/unk_83E6C18.gbapal");
const struct SpriteTemplate gUnknown_83E6C38 = static const struct SpriteTemplate sUnusedBubbleThrowSpriteTemplate =
{ {
.tileTag = ANIM_TAG_SMALL_BUBBLES, .tileTag = ANIM_TAG_SMALL_BUBBLES,
.paletteTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES,
@@ -188,10 +187,10 @@ const struct SpriteTemplate gUnknown_83E6C38 =
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80B24C0, .callback = AnimUnusedBubbleThrow,
}; };
const struct SpriteTemplate gUnknown_83E6C50 = static const struct SpriteTemplate sUnusedFeatherSpriteTemplate =
{ {
.tileTag = ANIM_TAG_WHITE_FEATHER, .tileTag = ANIM_TAG_WHITE_FEATHER,
.paletteTag = ANIM_TAG_WHITE_FEATHER, .paletteTag = ANIM_TAG_WHITE_FEATHER,
@@ -199,7 +198,7 @@ const struct SpriteTemplate gUnknown_83E6C50 =
.anims = sAnims_FallingFeather, .anims = sAnims_FallingFeather,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80B2514, .callback = AnimUnusedFeather,
}; };
static const union AnimCmd sAnim_WhirlwindLines[] = static const union AnimCmd sAnim_WhirlwindLines[] =
@@ -301,8 +300,7 @@ const struct SpriteTemplate gDiveBallSpriteTemplate =
.callback = AnimDiveBall, .callback = AnimDiveBall,
}; };
// not used static const union AffineAnimCmd sAnim_Unused[] =
static const union AffineAnimCmd gUnknown_83E6D58[] =
{ {
AFFINEANIMCMD_FRAME(0x100, 0x0, 0, 0), AFFINEANIMCMD_FRAME(0x100, 0x0, 0, 0),
AFFINEANIMCMD_FRAME(0x0, 0x20, 0, 12), AFFINEANIMCMD_FRAME(0x0, 0x20, 0, 12),
@@ -310,10 +308,9 @@ static const union AffineAnimCmd gUnknown_83E6D58[] =
AFFINEANIMCMD_END, AFFINEANIMCMD_END,
}; };
// not used static const union AffineAnimCmd *const sAnims_Unused[] =
static const union AffineAnimCmd *const gUnknown_83E6D80[] =
{ {
gUnknown_83E6D58, sAnim_Unused,
}; };
const struct SpriteTemplate gDiveWaterSplashSpriteTemplate = const struct SpriteTemplate gDiveWaterSplashSpriteTemplate =
@@ -338,7 +335,7 @@ const struct SpriteTemplate gSprayWaterDropletSpriteTemplate =
.callback = AnimSprayWaterDroplet, .callback = AnimSprayWaterDroplet,
}; };
const struct SpriteTemplate gUnknown_83E6DAC = static const struct SpriteTemplate sUnusedFlashingLightSpriteTemplate =
{ {
.tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,
.paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,
@@ -346,7 +343,7 @@ const struct SpriteTemplate gUnknown_83E6DAC =
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80B2CE4, .callback = AnimUnusedFlashingLight,
}; };
const struct SpriteTemplate gSkyAttackBirdSpriteTemplate = const struct SpriteTemplate gSkyAttackBirdSpriteTemplate =
@@ -365,11 +362,11 @@ static void AnimEllipticalGust(struct Sprite *sprite)
InitSpritePosToAnimTarget(sprite, FALSE); InitSpritePosToAnimTarget(sprite, FALSE);
sprite->y += 20; sprite->y += 20;
sprite->data[1] = 191; sprite->data[1] = 191;
sprite->callback = sub_80B190C; sprite->callback = AnimEllipticalGust_Step;
sprite->callback(sprite); sprite->callback(sprite);
} }
static void sub_80B190C(struct Sprite *sprite) static void AnimEllipticalGust_Step(struct Sprite *sprite)
{ {
sprite->x2 = Sin(sprite->data[1], 32); sprite->x2 = Sin(sprite->data[1], 32);
sprite->y2 = Cos(sprite->data[1], 8); sprite->y2 = Cos(sprite->data[1], 8);
@@ -379,15 +376,16 @@ static void sub_80B190C(struct Sprite *sprite)
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
} }
// Animates the palette on the gust tornado to make it look like its spinning
void AnimTask_AnimateGustTornadoPalette(u8 taskId) void AnimTask_AnimateGustTornadoPalette(u8 taskId)
{ {
gTasks[taskId].data[0] = gBattleAnimArgs[1]; gTasks[taskId].data[0] = gBattleAnimArgs[1];
gTasks[taskId].data[1] = gBattleAnimArgs[0]; gTasks[taskId].data[1] = gBattleAnimArgs[0];
gTasks[taskId].data[2] = IndexOfSpritePaletteTag(ANIM_TAG_GUST); gTasks[taskId].data[2] = IndexOfSpritePaletteTag(ANIM_TAG_GUST);
gTasks[taskId].func = sub_80B198C; gTasks[taskId].func = AnimTask_AnimateGustTornadoPalette_Step;
} }
static void sub_80B198C(u8 taskId) static void AnimTask_AnimateGustTornadoPalette_Step(u8 taskId)
{ {
u8 data2; u8 data2;
u16 temp; u16 temp;
@@ -423,10 +421,10 @@ static void AnimGustToTarget(struct Sprite *sprite)
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
InitAnimLinearTranslation(sprite); InitAnimLinearTranslation(sprite);
sprite->callback = RunStoredCallbackWhenAffineAnimEnds; sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
StoreSpriteCallbackInData6(sprite, sub_80B1A9C); StoreSpriteCallbackInData6(sprite, AnimGustToTarget_Step);
} }
static void sub_80B1A9C(struct Sprite *sprite) static void AnimGustToTarget_Step(struct Sprite *sprite)
{ {
if (AnimTranslateLinear(sprite)) if (AnimTranslateLinear(sprite))
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
@@ -472,11 +470,11 @@ static void AnimFlyBallUp(struct Sprite *sprite)
InitSpritePosToAnimAttacker(sprite, TRUE); InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[0] = gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[2];
sprite->data[1] = gBattleAnimArgs[3]; sprite->data[1] = gBattleAnimArgs[3];
sprite->callback = sub_80B1BF8; sprite->callback = AnimFlyBallUp_Step;
gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = TRUE; gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = TRUE;
} }
static void sub_80B1BF8(struct Sprite *sprite) static void AnimFlyBallUp_Step(struct Sprite *sprite)
{ {
if (sprite->data[0] > 0) if (sprite->data[0] > 0)
{ {
@@ -495,7 +493,7 @@ static void AnimFlyBallAttack(struct Sprite *sprite)
{ {
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{ {
sprite->x = 272; sprite->x = DISPLAY_WIDTH + 32;
sprite->y = -32; sprite->y = -32;
StartSpriteAffineAnim(sprite, 1); StartSpriteAffineAnim(sprite, 1);
} }
@@ -510,10 +508,10 @@ static void AnimFlyBallAttack(struct Sprite *sprite)
sprite->data[3] = sprite->y; sprite->data[3] = sprite->y;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
InitAnimLinearTranslation(sprite); InitAnimLinearTranslation(sprite);
sprite->callback = sub_80B1CC0; sprite->callback = AnimFlyBallAttack_Step;
} }
static void sub_80B1CC0(struct Sprite *sprite) static void AnimFlyBallAttack_Step(struct Sprite *sprite)
{ {
sprite->data[0] = 1; sprite->data[0] = 1;
AnimTranslateLinear(sprite); AnimTranslateLinear(sprite);
@@ -524,8 +522,8 @@ static void sub_80B1CC0(struct Sprite *sprite)
sprite->data[3] &= 0xFF; sprite->data[3] &= 0xFF;
} }
if (sprite->x + sprite->x2 < -32 if (sprite->x + sprite->x2 < -32
|| sprite->x + sprite->x2 > 272 || sprite->x + sprite->x2 > DISPLAY_WIDTH + 32
|| sprite->y + sprite->y2 > 160) || sprite->y + sprite->y2 > DISPLAY_HEIGHT)
{ {
gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = FALSE; gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = FALSE;
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
@@ -883,7 +881,7 @@ static void AnimFallingFeather_Step(struct Sprite *sprite)
} }
} }
static void sub_80B24C0(struct Sprite *sprite) static void AnimUnusedBubbleThrow(struct Sprite *sprite)
{ {
sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget); sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget);
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
@@ -891,7 +889,7 @@ static void sub_80B24C0(struct Sprite *sprite)
sprite->callback = TranslateAnimSpriteToTargetMonLocation; sprite->callback = TranslateAnimSpriteToTargetMonLocation;
} }
static void sub_80B2514(struct Sprite *sprite) static void AnimUnusedFeather(struct Sprite *sprite)
{ {
u8 matrixNum; u8 matrixNum;
s16 rn, sinVal; s16 rn, sinVal;
@@ -935,10 +933,10 @@ static void sub_80B2514(struct Sprite *sprite)
sprite->animNum = 1; sprite->animNum = 1;
sprite->hFlip = TRUE; sprite->hFlip = TRUE;
} }
sprite->callback = sub_80B268C; sprite->callback = AnimUnusedFeather_Step;
} }
static void sub_80B268C(struct Sprite *sprite) static void AnimUnusedFeather_Step(struct Sprite *sprite)
{ {
struct FeatherDanceData fData; struct FeatherDanceData fData;
struct FeatherDanceData *tData = (struct FeatherDanceData *)sprite->data; struct FeatherDanceData *tData = (struct FeatherDanceData *)sprite->data;
@@ -992,12 +990,12 @@ static void AnimWhirlwindLine(struct Sprite *sprite)
u16 arg; u16 arg;
u8 mult; u8 mult;
if (!gBattleAnimArgs[2]) if (gBattleAnimArgs[2] == ANIM_ATTACKER)
InitSpritePosToAnimAttacker(sprite, 0); InitSpritePosToAnimAttacker(sprite, 0);
else else
InitSpritePosToAnimTarget(sprite, FALSE); InitSpritePosToAnimTarget(sprite, FALSE);
if ((!gBattleAnimArgs[2] && GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) if ((gBattleAnimArgs[2] == ANIM_ATTACKER && GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
|| (gBattleAnimArgs[2] == 1 && GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)) || (gBattleAnimArgs[2] == ANIM_TARGET && GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER))
sprite->x += 8; sprite->x += 8;
SeekSpriteAnim(sprite, gBattleAnimArgs[4]); SeekSpriteAnim(sprite, gBattleAnimArgs[4]);
sprite->x -= 32; sprite->x -= 32;
@@ -1007,10 +1005,10 @@ static void AnimWhirlwindLine(struct Sprite *sprite)
sprite->x2 += mult * arg; sprite->x2 += mult * arg;
sprite->data[0] = arg; sprite->data[0] = arg;
sprite->data[7] = gBattleAnimArgs[3]; sprite->data[7] = gBattleAnimArgs[3];
sprite->callback = sub_80B2820; sprite->callback = AnimWhirlwindLine_Step;
} }
static void sub_80B2820(struct Sprite *sprite) static void AnimWhirlwindLine_Step(struct Sprite *sprite)
{ {
sprite->x2 += sprite->data[1] >> 8; sprite->x2 += sprite->data[1] >> 8;
if (++sprite->data[0] == 6) if (++sprite->data[0] == 6)
@@ -1064,7 +1062,7 @@ static void AnimBounceBallLand(struct Sprite *sprite)
switch (sprite->data[0]) switch (sprite->data[0])
{ {
case 0: case 0:
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 1); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
sprite->y2 = -sprite->y - 32; sprite->y2 = -sprite->y - 32;
++sprite->data[0]; ++sprite->data[0];
break; break;
@@ -1089,11 +1087,11 @@ static void AnimDiveBall(struct Sprite *sprite)
InitSpritePosToAnimAttacker(sprite, 1); InitSpritePosToAnimAttacker(sprite, 1);
sprite->data[0] = gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[2];
sprite->data[1] = gBattleAnimArgs[3]; sprite->data[1] = gBattleAnimArgs[3];
sprite->callback = sub_80B2A50; sprite->callback = AnimDiveBall_Step1;
gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = TRUE; gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = TRUE;
} }
static void sub_80B2A50(struct Sprite *sprite) static void AnimDiveBall_Step1(struct Sprite *sprite)
{ {
if (sprite->data[0] > 0) if (sprite->data[0] > 0)
{ {
@@ -1108,11 +1106,11 @@ static void sub_80B2A50(struct Sprite *sprite)
{ {
sprite->invisible = TRUE; sprite->invisible = TRUE;
if (sprite->data[3]++ > 20) if (sprite->data[3]++ > 20)
sprite->callback = sub_80B2AB0; sprite->callback = AnimDiveBall_Step2;
} }
} }
static void sub_80B2AB0(struct Sprite *sprite) static void AnimDiveBall_Step2(struct Sprite *sprite)
{ {
sprite->y2 += sprite->data[2] >> 8; sprite->y2 += sprite->data[2] >> 8;
if (sprite->y + sprite->y2 > -32) if (sprite->y + sprite->y2 > -32)
@@ -1131,13 +1129,13 @@ static void AnimDiveWaterSplash(struct Sprite *sprite)
case 0: case 0:
if (!gBattleAnimArgs[0]) if (!gBattleAnimArgs[0])
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
} }
else else
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 0); sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 1); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
} }
sprite->data[1] = 512; sprite->data[1] = 512;
TrySetSpriteRotScale(sprite, 0, 256, sprite->data[1], 0); TrySetSpriteRotScale(sprite, 0, 256, sprite->data[1], 0);
@@ -1166,6 +1164,7 @@ static void AnimDiveWaterSplash(struct Sprite *sprite)
} }
} }
// Launches a water droplet away from the specified battler. Used by Astonish and Dive
static void AnimSprayWaterDroplet(struct Sprite *sprite) static void AnimSprayWaterDroplet(struct Sprite *sprite)
{ {
s32 v1 = 0x1FF & Random(); s32 v1 = 0x1FF & Random();
@@ -1185,18 +1184,18 @@ static void AnimSprayWaterDroplet(struct Sprite *sprite)
sprite->oam.matrixNum = ST_OAM_HFLIP; sprite->oam.matrixNum = ST_OAM_HFLIP;
if (gBattleAnimArgs[1] == 0) if (gBattleAnimArgs[1] == 0)
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 32; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 32;
} }
else else
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 0); sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + 32; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 32;
} }
sprite->callback = sub_80B2C88; sprite->callback = AnimSprayWaterDroplet_Step;
} }
static void sub_80B2C88(struct Sprite *sprite) static void AnimSprayWaterDroplet_Step(struct Sprite *sprite)
{ {
if (sprite->data[2] == 0) if (sprite->data[2] == 0)
{ {
@@ -1216,14 +1215,14 @@ static void sub_80B2C88(struct Sprite *sprite)
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
} }
static void sub_80B2CE4(struct Sprite *sprite) static void AnimUnusedFlashingLight(struct Sprite *sprite)
{ {
sprite->data[6] = 0; sprite->data[6] = 0;
sprite->data[7] = 64; sprite->data[7] = 64;
sprite->callback = sub_80B2CF8; sprite->callback = AnimUnusedFlashingLight_Step;
} }
static void sub_80B2CF8(struct Sprite *sprite) static void AnimUnusedFlashingLight_Step(struct Sprite *sprite)
{ {
switch (sprite->data[0]) switch (sprite->data[0])
{ {
@@ -1248,8 +1247,8 @@ static void AnimSkyAttackBird(struct Sprite *sprite)
s16 posx = sprite->x; s16 posx = sprite->x;
s16 posy = sprite->y; s16 posy = sprite->y;
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[4] = sprite->x << 4; sprite->data[4] = sprite->x << 4;
sprite->data[5] = sprite->y << 4; sprite->data[5] = sprite->y << 4;
sprite->data[6] = ((posx - sprite->x) << 4) / 12; sprite->data[6] = ((posx - sprite->x) << 4) / 12;
@@ -1257,22 +1256,22 @@ static void AnimSkyAttackBird(struct Sprite *sprite)
rotation = ArcTan2Neg(posx - sprite->x, posy - sprite->y); rotation = ArcTan2Neg(posx - sprite->x, posy - sprite->y);
rotation += 49152; rotation += 49152;
TrySetSpriteRotScale(sprite, 1, 0x100, 0x100, rotation); TrySetSpriteRotScale(sprite, 1, 0x100, 0x100, rotation);
sprite->callback = sub_80B2E20; sprite->callback = AnimSkyAttackBird_Step;
} }
static void sub_80B2E20(struct Sprite *sprite) static void AnimSkyAttackBird_Step(struct Sprite *sprite)
{ {
sprite->data[4] += sprite->data[6]; sprite->data[4] += sprite->data[6];
sprite->data[5] += sprite->data[7]; sprite->data[5] += sprite->data[7];
sprite->x = sprite->data[4] >> 4; sprite->x = sprite->data[4] >> 4;
sprite->y = sprite->data[5] >> 4; sprite->y = sprite->data[5] >> 4;
if (sprite->x > 285 || sprite->x < -45 if (sprite->x > DISPLAY_WIDTH + 45 || sprite->x < -45
|| sprite->y > 157 || sprite->y < -45) || sprite->y > 157 || sprite->y < -45)
DestroySpriteAndMatrix(sprite); DestroySpriteAndMatrix(sprite);
} }
// not used // Unused
static void sub_80B2E64(u8 taskId) static void AnimTask_SetAttackerVisibility(u8 taskId)
{ {
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == 0)
{ {
+121 -117
View File
@@ -9,39 +9,39 @@
#include "constants/songs.h" #include "constants/songs.h"
static void AnimConfuseRayBallBounce(struct Sprite *sprite); static void AnimConfuseRayBallBounce(struct Sprite *sprite);
static void sub_80B52D0(struct Sprite *sprite); static void AnimConfuseRayBallBounce_Step1(struct Sprite *sprite);
static void sub_80B5344(struct Sprite *sprite); static void AnimConfuseRayBallBounce_Step2(struct Sprite *sprite);
static void sub_80B53C0(struct Sprite *sprite); static void UpdateConfuseRayBallBlend(struct Sprite *sprite);
static void AnimConfuseRayBallSpiral(struct Sprite *sprite); static void AnimConfuseRayBallSpiral(struct Sprite *sprite);
static void sub_80B5470(struct Sprite *sprite); static void AnimConfuseRayBallSpiral_Step(struct Sprite *sprite);
static void sub_80B5570(u8 taskId); static void AnimTask_NightShadeClone_Step1(u8 taskId);
static void sub_80B55C8(u8 taskId); static void AnimTask_NightShadeClone_Step2(u8 taskId);
static void AnimShadowBall(struct Sprite *sprite); static void AnimShadowBall(struct Sprite *sprite);
static void AnimShadowBallStep(struct Sprite *sprite); static void AnimShadowBall_Step(struct Sprite *sprite);
static void AnimLick(struct Sprite *sprite); static void AnimLick(struct Sprite *sprite);
static void sub_80B5810(struct Sprite *sprite); static void AnimLick_Step(struct Sprite *sprite);
static void sub_80B59D4(u8 taskId); static void AnimTask_NightmareClone_Step(u8 taskId);
static void sub_80B5AD4(u8 taskId); static void AnimTask_SpiteTargetShadow_Step1(u8 taskId);
static void sub_80B5D38(u8 taskId); static void AnimTask_SpiteTargetShadow_Step2(u8 taskId);
static void sub_80B5DCC(u8 taskId); static void AnimTask_SpiteTargetShadow_Step3(u8 taskId);
static void AnimDestinyBondWhiteShadow(struct Sprite *sprite); static void AnimDestinyBondWhiteShadow(struct Sprite *sprite);
static void sub_80B5FE0(struct Sprite *sprite); static void AnimDestinyBondWhiteShadow_Step(struct Sprite *sprite);
static void sub_80B623C(u8 taskId); static void AnimTask_DestinyBondWhiteShadow_Step(u8 taskId);
static void sub_80B6468(u8 taskId); static void AnimTask_CurseStretchingBlackBg_Step1(u8 taskId);
static void sub_80B65F0(u8 taskId); static void AnimTask_CurseStretchingBlackBg_Step2(u8 taskId);
static void AnimCurseNail(struct Sprite *sprite); static void AnimCurseNail(struct Sprite *sprite);
static void sub_80B66A8(struct Sprite *sprite); static void AnimCurseNail_Step1(struct Sprite *sprite);
static void sub_80B6728(struct Sprite *sprite); static void AnimCurseNail_Step2(struct Sprite *sprite);
static void sub_80B67A0(struct Sprite *sprite); static void AnimCurseNail_End(struct Sprite *sprite);
static void AnimGhostStatusSprite(struct Sprite *sprite); static void AnimGhostStatusSprite(struct Sprite *sprite);
static void sub_80B68A8(struct Sprite *sprite); static void AnimGhostStatusSprite_End(struct Sprite *sprite);
static void sub_80B696C(u8 taskId); static void AnimTask_GrudgeFlames_Step(u8 taskId);
static void AnimGrudgeFlame(struct Sprite *sprite); static void AnimGrudgeFlame(struct Sprite *sprite);
static void sub_80B7158(struct Sprite *sprite); static void AnimMonMoveCircular(struct Sprite *sprite);
static void sub_80B6BE4(u8 taskId); static void AnimTask_GhostGetOut_Step1(u8 taskId);
static void sub_80B6F30(u8 taskId); static void AnimTask_GhostGetOut_Step2(u8 taskId);
static void sub_80B6FC4(u8 taskId); static void AnimTask_GhostGetOut_Step3(u8 taskId);
static void sub_80B71B0(struct Sprite *sprite); static void AnimMonMoveCircular_Step(struct Sprite *sprite);
static const union AffineAnimCmd sAffineAnim_ConfuseRayBallBounce[] = static const union AffineAnimCmd sAffineAnim_ConfuseRayBallBounce[] =
{ {
@@ -125,17 +125,15 @@ const struct SpriteTemplate gLickSpriteTemplate =
.callback = AnimLick, .callback = AnimLick,
}; };
// not used static const union AffineAnimCmd sAffineAnim_Unused[] =
static const union AffineAnimCmd gUnknown_83E7654[] =
{ {
AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),
AFFINEANIMCMD_END, AFFINEANIMCMD_END,
}; };
// not used static const union AffineAnimCmd *const sAffineAnims_Unused[] =
static const union AffineAnimCmd *const gUnknown_83E7664[] =
{ {
gUnknown_83E7654, sAffineAnim_Unused,
}; };
const struct SpriteTemplate gDestinyBondWhiteShadowSpriteTemplate = const struct SpriteTemplate gDestinyBondWhiteShadowSpriteTemplate =
@@ -207,7 +205,8 @@ const struct SpriteTemplate gGrudgeFlameSpriteTemplate =
.callback = AnimGrudgeFlame, .callback = AnimGrudgeFlame,
}; };
const struct SpriteTemplate gUnknown_83E76F8 = // Unused
static const struct SpriteTemplate sMonMoveCircularSpriteTemplate =
{ {
.tileTag = 0, .tileTag = 0,
.paletteTag = 0, .paletteTag = 0,
@@ -215,7 +214,7 @@ const struct SpriteTemplate gUnknown_83E76F8 =
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80B7158, .callback = AnimMonMoveCircular,
}; };
static void AnimConfuseRayBallBounce(struct Sprite *sprite) static void AnimConfuseRayBallBounce(struct Sprite *sprite)
@@ -223,24 +222,24 @@ static void AnimConfuseRayBallBounce(struct Sprite *sprite)
InitSpritePosToAnimAttacker(sprite, 1); InitSpritePosToAnimAttacker(sprite, 1);
sprite->data[0] = gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[2];
sprite->data[1] = sprite->x; sprite->data[1] = sprite->x;
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[3] = sprite->y; sprite->data[3] = sprite->y;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
BattleAnim_InitLinearTranslationWithDuration(sprite); InitAnimLinearTranslationWithSpeed(sprite);
sprite->callback = sub_80B52D0; sprite->callback = AnimConfuseRayBallBounce_Step1;
sprite->data[6] = 16; sprite->data[6] = 16;
SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL)); SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL));
SetGpuReg(REG_OFFSET_BLDALPHA, sprite->data[6]); SetGpuReg(REG_OFFSET_BLDALPHA, sprite->data[6]);
} }
static void sub_80B52D0(struct Sprite *sprite) static void AnimConfuseRayBallBounce_Step1(struct Sprite *sprite)
{ {
s16 r0, r2; s16 r0, r2;
sub_80B53C0(sprite); UpdateConfuseRayBallBlend(sprite);
if (AnimTranslateLinear(sprite)) if (AnimTranslateLinear(sprite))
{ {
sprite->callback = sub_80B5344; sprite->callback = AnimConfuseRayBallBounce_Step2;
return; return;
} }
sprite->x2 += Sin(sprite->data[5], 10); sprite->x2 += Sin(sprite->data[5], 10);
@@ -252,10 +251,10 @@ static void sub_80B52D0(struct Sprite *sprite)
return; return;
if (r0 <= 0) if (r0 <= 0)
return; return;
PlaySE12WithPanning(SE_M_CONFUSE_RAY, gUnknown_2037F24); PlaySE12WithPanning(SE_M_CONFUSE_RAY, gAnimCustomPanning);
} }
static void sub_80B5344(struct Sprite *sprite) static void AnimConfuseRayBallBounce_Step2(struct Sprite *sprite)
{ {
s16 r2, r0; s16 r2, r0;
@@ -275,11 +274,11 @@ static void sub_80B5344(struct Sprite *sprite)
} }
else else
{ {
sub_80B53C0(sprite); UpdateConfuseRayBallBlend(sprite);
} }
} }
static void sub_80B53C0(struct Sprite *sprite) static void UpdateConfuseRayBallBlend(struct Sprite *sprite)
{ {
s16 r0; s16 r0;
@@ -309,11 +308,11 @@ static void sub_80B53C0(struct Sprite *sprite)
static void AnimConfuseRayBallSpiral(struct Sprite *sprite) static void AnimConfuseRayBallSpiral(struct Sprite *sprite)
{ {
InitSpritePosToAnimTarget(sprite, TRUE); InitSpritePosToAnimTarget(sprite, TRUE);
sprite->callback = sub_80B5470; sprite->callback = AnimConfuseRayBallSpiral_Step;
sprite->callback(sprite); sprite->callback(sprite);
} }
static void sub_80B5470(struct Sprite *sprite) static void AnimConfuseRayBallSpiral_Step(struct Sprite *sprite)
{ {
u16 temp1; u16 temp1;
@@ -332,6 +331,7 @@ static void sub_80B5470(struct Sprite *sprite)
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
} }
// Creates a large transparent clone of the attacker centered on their position which shrinks to original size
void AnimTask_NightShadeClone(u8 taskId) void AnimTask_NightShadeClone(u8 taskId)
{ {
u8 spriteId; u8 spriteId;
@@ -346,10 +346,10 @@ void AnimTask_NightShadeClone(u8 taskId)
gTasks[taskId].data[1] = *gBattleAnimArgs; gTasks[taskId].data[1] = *gBattleAnimArgs;
gTasks[taskId].data[2] = 0; gTasks[taskId].data[2] = 0;
gTasks[taskId].data[3] = 16; gTasks[taskId].data[3] = 16;
gTasks[taskId].func = sub_80B5570; gTasks[taskId].func = AnimTask_NightShadeClone_Step1;
} }
static void sub_80B5570(u8 taskId) static void AnimTask_NightShadeClone_Step1(u8 taskId)
{ {
gTasks[taskId].data[10] += 1; gTasks[taskId].data[10] += 1;
if (gTasks[taskId].data[10] == 3) if (gTasks[taskId].data[10] == 3)
@@ -360,11 +360,11 @@ static void sub_80B5570(u8 taskId)
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[2], gTasks[taskId].data[3])); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[2], gTasks[taskId].data[3]));
if (gTasks[taskId].data[2] != 9) if (gTasks[taskId].data[2] != 9)
return; return;
gTasks[taskId].func = sub_80B55C8; gTasks[taskId].func = AnimTask_NightShadeClone_Step2;
} }
} }
static void sub_80B55C8(u8 taskId) static void AnimTask_NightShadeClone_Step2(u8 taskId)
{ {
u8 spriteId; u8 spriteId;
@@ -398,8 +398,8 @@ static void AnimShadowBall(struct Sprite *sprite)
s16 oldPosX = sprite->x; s16 oldPosX = sprite->x;
s16 oldPosY = sprite->y; s16 oldPosY = sprite->y;
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[0] = 0; sprite->data[0] = 0;
sprite->data[1] = gBattleAnimArgs[0]; sprite->data[1] = gBattleAnimArgs[0];
sprite->data[2] = gBattleAnimArgs[1]; sprite->data[2] = gBattleAnimArgs[1];
@@ -408,10 +408,10 @@ static void AnimShadowBall(struct Sprite *sprite)
sprite->data[5] = sprite->y << 4; sprite->data[5] = sprite->y << 4;
sprite->data[6] = ((oldPosX - sprite->x) << 4) / (gBattleAnimArgs[0] << 1); sprite->data[6] = ((oldPosX - sprite->x) << 4) / (gBattleAnimArgs[0] << 1);
sprite->data[7] = ((oldPosY - sprite->y) << 4) / (gBattleAnimArgs[0] << 1); sprite->data[7] = ((oldPosY - sprite->y) << 4) / (gBattleAnimArgs[0] << 1);
sprite->callback = AnimShadowBallStep; sprite->callback = AnimShadowBall_Step;
} }
static void AnimShadowBallStep(struct Sprite *sprite) static void AnimShadowBall_Step(struct Sprite *sprite)
{ {
switch (sprite->data[0]) switch (sprite->data[0])
{ {
@@ -429,8 +429,8 @@ static void AnimShadowBallStep(struct Sprite *sprite)
sprite->data[2] -= 1; sprite->data[2] -= 1;
if (sprite->data[2] > 0) if (sprite->data[2] > 0)
break; break;
sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[4] = sprite->x << 4; sprite->data[4] = sprite->x << 4;
sprite->data[5] = sprite->y << 4; sprite->data[5] = sprite->y << 4;
sprite->data[6] = ((sprite->data[1] - sprite->x) << 4) / sprite->data[3]; sprite->data[6] = ((sprite->data[1] - sprite->x) << 4) / sprite->data[3];
@@ -445,8 +445,8 @@ static void AnimShadowBallStep(struct Sprite *sprite)
sprite->data[3] -= 1; sprite->data[3] -= 1;
if (sprite->data[3] > 0) if (sprite->data[3] > 0)
break; break;
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[0] += 1; sprite->data[0] += 1;
break; break;
case 3: case 3:
@@ -458,10 +458,10 @@ static void AnimShadowBallStep(struct Sprite *sprite)
static void AnimLick(struct Sprite *sprite) static void AnimLick(struct Sprite *sprite)
{ {
InitSpritePosToAnimTarget(sprite, TRUE); InitSpritePosToAnimTarget(sprite, TRUE);
sprite->callback = sub_80B5810; sprite->callback = AnimLick_Step;
} }
static void sub_80B5810(struct Sprite *sprite) static void AnimLick_Step(struct Sprite *sprite)
{ {
bool8 r5 = FALSE; bool8 r5 = FALSE;
bool8 r6 = FALSE; bool8 r6 = FALSE;
@@ -507,12 +507,13 @@ static void sub_80B5810(struct Sprite *sprite)
} }
} }
// Creates a transparent clone of the target which drifts up and away to the side
void AnimTask_NightmareClone(u8 taskId) void AnimTask_NightmareClone(u8 taskId)
{ {
struct Task *task; struct Task *task;
task = &gTasks[taskId]; task = &gTasks[taskId];
task->data[0] = CloneBattlerSpriteWithBlend(1); task->data[0] = CloneBattlerSpriteWithBlend(ANIM_TARGET);
if (task->data[0] < 0) if (task->data[0] < 0)
{ {
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
@@ -539,10 +540,10 @@ void AnimTask_NightmareClone(u8 taskId)
gSprites[task->data[0]].data[4] = 0; gSprites[task->data[0]].data[4] = 0;
StoreSpriteCallbackInData6(&gSprites[task->data[0]], SpriteCallbackDummy); StoreSpriteCallbackInData6(&gSprites[task->data[0]], SpriteCallbackDummy);
gSprites[task->data[0]].callback = TranslateSpriteLinearFixedPoint; gSprites[task->data[0]].callback = TranslateSpriteLinearFixedPoint;
task->func = sub_80B59D4; task->func = AnimTask_NightmareClone_Step;
} }
static void sub_80B59D4(u8 taskId) static void AnimTask_NightmareClone_Step(u8 taskId)
{ {
struct Task *task; struct Task *task;
@@ -563,7 +564,7 @@ static void sub_80B59D4(u8 taskId)
break; break;
if (task->data[1] <= 80) if (task->data[1] <= 80)
break; break;
obj_delete_but_dont_free_vram(&gSprites[task->data[0]]); DestroySpriteWithActiveSheet(&gSprites[task->data[0]]);
task->data[4] = 1; task->data[4] = 1;
break; break;
case 1: case 1:
@@ -579,17 +580,18 @@ static void sub_80B59D4(u8 taskId)
} }
} }
// Creates a blended copy of the target that wavers in front of them
void AnimTask_SpiteTargetShadow(u8 taskId) void AnimTask_SpiteTargetShadow(u8 taskId)
{ {
struct Task *task; struct Task *task;
task = &gTasks[taskId]; task = &gTasks[taskId];
task->data[15] = 0; task->data[15] = 0;
task->func = sub_80B5AD4; task->func = AnimTask_SpiteTargetShadow_Step1;
task->func(taskId); task->func(taskId);
} }
static void sub_80B5AD4(u8 taskId) static void AnimTask_SpiteTargetShadow_Step1(u8 taskId)
{ {
s16 startLine; s16 startLine;
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -670,7 +672,7 @@ static void sub_80B5AD4(u8 taskId)
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);
else else
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
task->func = sub_80B5D38; task->func = AnimTask_SpiteTargetShadow_Step2;
++task->data[15]; ++task->data[15];
break; break;
default: default:
@@ -679,7 +681,7 @@ static void sub_80B5AD4(u8 taskId)
} }
} }
static void sub_80B5D38(u8 taskId) static void AnimTask_SpiteTargetShadow_Step2(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -693,12 +695,12 @@ static void sub_80B5D38(u8 taskId)
if (task->data[1] == 128) if (task->data[1] == 128)
{ {
task->data[15] = 0; task->data[15] = 0;
task->func = sub_80B5DCC; task->func = AnimTask_SpiteTargetShadow_Step3;
task->func(taskId); task->func(taskId);
} }
} }
static void sub_80B5DCC(u8 taskId) static void AnimTask_SpiteTargetShadow_Step3(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
u8 rank = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget); u8 rank = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget);
@@ -718,7 +720,7 @@ static void sub_80B5DCC(u8 taskId)
break; break;
case 2: case 2:
gSprites[task->data[14]].invisible = TRUE; gSprites[task->data[14]].invisible = TRUE;
obj_delete_but_dont_free_vram(&gSprites[task->data[0]]); DestroySpriteWithActiveSheet(&gSprites[task->data[0]]);
FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON); FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON);
SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0);
@@ -740,17 +742,17 @@ static void AnimDestinyBondWhiteShadow(struct Sprite *sprite)
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == 0)
{ {
battler1X = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); battler1X = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
battler1Y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 28; battler1Y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 28;
battler2X = GetBattlerSpriteCoord(gBattleAnimTarget, 0); battler2X = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
battler2Y = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + 28; battler2Y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 28;
} }
else else
{ {
battler1X = GetBattlerSpriteCoord(gBattleAnimTarget, 0); battler1X = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
battler1Y = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + 28; battler1Y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 28;
battler2X = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); battler2X = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
battler2Y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 28; battler2Y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 28;
} }
yDiff = battler2Y - battler1Y; yDiff = battler2Y - battler1Y;
sprite->data[0] = battler1X * 16; sprite->data[0] = battler1X * 16;
@@ -764,11 +766,11 @@ static void AnimDestinyBondWhiteShadow(struct Sprite *sprite)
sprite->oam.priority = 2; sprite->oam.priority = 2;
sprite->x = battler1X; sprite->x = battler1X;
sprite->y = battler1Y; sprite->y = battler1Y;
sprite->callback = sub_80B5FE0; sprite->callback = AnimDestinyBondWhiteShadow_Step;
sprite->invisible = TRUE; sprite->invisible = TRUE;
} }
static void sub_80B5FE0(struct Sprite *sprite) static void AnimDestinyBondWhiteShadow_Step(struct Sprite *sprite)
{ {
if (sprite->data[4]) if (sprite->data[4])
{ {
@@ -798,11 +800,11 @@ void AnimTask_DestinyBondWhiteShadow(u8 taskId)
task->data[8] = 0; task->data[8] = 0;
task->data[9] = 16; task->data[9] = 16;
task->data[10] = gBattleAnimArgs[0]; task->data[10] = gBattleAnimArgs[0];
baseX = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); baseX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
baseY = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM); baseY = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM);
if (!IsContest()) if (!IsContest())
{ {
for (battler = 0; battler < 4; ++battler) for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler)
{ {
if (battler != gBattleAnimAttacker if (battler != gBattleAnimAttacker
&& battler != (gBattleAnimAttacker ^ 2) && battler != (gBattleAnimAttacker ^ 2)
@@ -811,7 +813,7 @@ void AnimTask_DestinyBondWhiteShadow(u8 taskId)
spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55); spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
{ {
x = GetBattlerSpriteCoord(battler, 2); x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2);
y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_BOTTOM); y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_BOTTOM);
gSprites[spriteId].data[0] = baseX << 4; gSprites[spriteId].data[0] = baseX << 4;
gSprites[spriteId].data[1] = baseY << 4; gSprites[spriteId].data[1] = baseY << 4;
@@ -820,7 +822,7 @@ void AnimTask_DestinyBondWhiteShadow(u8 taskId)
gSprites[spriteId].data[4] = gBattleAnimArgs[1]; gSprites[spriteId].data[4] = gBattleAnimArgs[1];
gSprites[spriteId].data[5] = x; gSprites[spriteId].data[5] = x;
gSprites[spriteId].data[6] = y; gSprites[spriteId].data[6] = y;
gSprites[spriteId].callback = sub_80B5FE0; gSprites[spriteId].callback = AnimDestinyBondWhiteShadow_Step;
task->data[task->data[12] + 13] = spriteId; task->data[task->data[12] + 13] = spriteId;
++task->data[12]; ++task->data[12];
} }
@@ -841,15 +843,15 @@ void AnimTask_DestinyBondWhiteShadow(u8 taskId)
gSprites[spriteId].data[4] = gBattleAnimArgs[1]; gSprites[spriteId].data[4] = gBattleAnimArgs[1];
gSprites[spriteId].data[5] = x; gSprites[spriteId].data[5] = x;
gSprites[spriteId].data[6] = y; gSprites[spriteId].data[6] = y;
gSprites[spriteId].callback = sub_80B5FE0; gSprites[spriteId].callback = AnimDestinyBondWhiteShadow_Step;
task->data[13] = spriteId; task->data[13] = spriteId;
task->data[12] = 1; task->data[12] = 1;
} }
} }
task->func = sub_80B623C; task->func = AnimTask_DestinyBondWhiteShadow_Step;
} }
static void sub_80B623C(u8 taskId) static void AnimTask_DestinyBondWhiteShadow_Step(u8 taskId)
{ {
u16 i; u16 i;
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -933,7 +935,7 @@ void AnimTask_CurseStretchingBlackBg(u8 taskId)
SetGpuReg(REG_OFFSET_WINOUT, ((WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ) | SetGpuReg(REG_OFFSET_WINOUT, ((WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ) |
(WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR))); (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR)));
SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_DARKEN)); SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_DARKEN));
SetGpuReg(REG_OFFSET_BLDY, 0x10); SetGpuReg(REG_OFFSET_BLDY, 16);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER || IsContest()) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER || IsContest())
startX = 40; startX = 40;
else else
@@ -951,10 +953,10 @@ void AnimTask_CurseStretchingBlackBg(u8 taskId)
gTasks[taskId].data[4] = bottomDistance; gTasks[taskId].data[4] = bottomDistance;
gTasks[taskId].data[5] = startX; gTasks[taskId].data[5] = startX;
gTasks[taskId].data[6] = startY; gTasks[taskId].data[6] = startY;
gTasks[taskId].func = sub_80B6468; gTasks[taskId].func = AnimTask_CurseStretchingBlackBg_Step1;
} }
static void sub_80B6468(u8 taskId) static void AnimTask_CurseStretchingBlackBg_Step1(u8 taskId)
{ {
s16 step, leftDistance, rightDistance, topDistance, bottomDistance, startX, startY; s16 step, leftDistance, rightDistance, topDistance, bottomDistance, startX, startY;
u16 left, right, top, bottom, selectedPalettes; u16 left, right, top, bottom, selectedPalettes;
@@ -980,15 +982,15 @@ static void sub_80B6468(u8 taskId)
right = 240; right = 240;
top = 0; top = 0;
bottom = 112; bottom = 112;
selectedPalettes = SelectBattleAnimSpriteAndBgPalettes(1, 0, 0, 0, 0, 0, 0); selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);
BeginNormalPaletteFade(selectedPalettes, 0, 16, 16, RGB(0, 0, 0)); BeginNormalPaletteFade(selectedPalettes, 0, 16, 16, RGB(0, 0, 0));
gTasks[taskId].func = sub_80B65F0; gTasks[taskId].func = AnimTask_CurseStretchingBlackBg_Step2;
} }
gBattle_WIN0H = WIN_RANGE(left, right); gBattle_WIN0H = WIN_RANGE(left, right);
gBattle_WIN0V = WIN_RANGE(top, bottom); gBattle_WIN0V = WIN_RANGE(top, bottom);
} }
static void sub_80B65F0(u8 taskId) static void AnimTask_CurseStretchingBlackBg_Step2(u8 taskId)
{ {
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
@@ -1023,10 +1025,10 @@ static void AnimCurseNail(struct Sprite *sprite)
sprite->x += xDelta; sprite->x += xDelta;
sprite->data[1] = xDelta2; sprite->data[1] = xDelta2;
sprite->data[0] = 60; sprite->data[0] = 60;
sprite->callback = sub_80B66A8; sprite->callback = AnimCurseNail_Step1;
} }
static void sub_80B66A8(struct Sprite *sprite) static void AnimCurseNail_Step1(struct Sprite *sprite)
{ {
u16 var0; u16 var0;
@@ -1047,7 +1049,7 @@ static void sub_80B66A8(struct Sprite *sprite)
{ {
sprite->data[0] = 30; sprite->data[0] = 30;
sprite->callback = WaitAnimForDuration; sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData6(sprite, sub_80B6728); StoreSpriteCallbackInData6(sprite, AnimCurseNail_Step2);
} }
else else
{ {
@@ -1057,7 +1059,7 @@ static void sub_80B66A8(struct Sprite *sprite)
} }
} }
static void sub_80B6728(struct Sprite *sprite) static void AnimCurseNail_Step2(struct Sprite *sprite)
{ {
if (sprite->data[0] == 0) if (sprite->data[0] == 0)
{ {
@@ -1079,12 +1081,12 @@ static void sub_80B6728(struct Sprite *sprite)
if (sprite->data[2] == 16) if (sprite->data[2] == 16)
{ {
sprite->invisible = TRUE; sprite->invisible = TRUE;
sprite->callback = sub_80B67A0; sprite->callback = AnimCurseNail_End;
} }
} }
} }
static void sub_80B67A0(struct Sprite *sprite) static void AnimCurseNail_End(struct Sprite *sprite)
{ {
SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0);
@@ -1125,12 +1127,12 @@ static void AnimGhostStatusSprite(struct Sprite *sprite)
if (coeffB == 16 && coeffA == 0) if (coeffB == 16 && coeffA == 0)
{ {
sprite->invisible = TRUE; sprite->invisible = TRUE;
sprite->callback = sub_80B68A8; sprite->callback = AnimGhostStatusSprite_End;
} }
} }
} }
static void sub_80B68A8(struct Sprite *sprite) static void AnimGhostStatusSprite_End(struct Sprite *sprite)
{ {
SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0);
@@ -1143,7 +1145,7 @@ void AnimTask_GrudgeFlames(u8 taskId)
task->data[0] = 0; task->data[0] = 0;
task->data[1] = 16; task->data[1] = 16;
task->data[9] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); task->data[9] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
task->data[10] = GetBattlerYCoordWithElevation(gBattleAnimAttacker); task->data[10] = GetBattlerYCoordWithElevation(gBattleAnimAttacker);
task->data[11] = (GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 2) + 8; task->data[11] = (GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 2) + 8;
task->data[7] = 0; task->data[7] = 0;
@@ -1154,10 +1156,10 @@ void AnimTask_GrudgeFlames(u8 taskId)
SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL)); SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL));
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10));
task->data[8] = 0; task->data[8] = 0;
task->func = sub_80B696C; task->func = AnimTask_GrudgeFlames_Step;
} }
static void sub_80B696C(u8 taskId) static void AnimTask_GrudgeFlames_Step(u8 taskId)
{ {
u16 i; u16 i;
u8 spriteId; u8 spriteId;
@@ -1260,16 +1262,18 @@ static void AnimGrudgeFlame(struct Sprite *sprite)
} }
} }
void sub_80B6BBC(u8 taskId) // Used by the ghost Marowak when it hasn't been revealed by the Silph Scope.
// Animates a shimmering copy of the attacker (the ghost) accompanied by the 'Scary Face' graphics
void AnimTask_GhostGetOut(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
task->data[15] = 0; task->data[15] = 0;
task->func = sub_80B6BE4; task->func = AnimTask_GhostGetOut_Step1;
sub_80B6BE4(taskId); task->func(taskId);
} }
static void sub_80B6BE4(u8 taskId) static void AnimTask_GhostGetOut_Step1(u8 taskId)
{ {
s16 y; s16 y;
struct BattleAnimBgData animBgData; struct BattleAnimBgData animBgData;
@@ -1365,14 +1369,14 @@ static void sub_80B6BE4(u8 taskId)
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);
else else
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
task->func = sub_80B6F30; task->func = AnimTask_GhostGetOut_Step2;
task->data[15] = 0; task->data[15] = 0;
break; break;
} }
++task->data[15]; ++task->data[15];
} }
static void sub_80B6F30(u8 taskId) static void AnimTask_GhostGetOut_Step2(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -1386,12 +1390,12 @@ static void sub_80B6F30(u8 taskId)
if (task->data[1] == 128) if (task->data[1] == 128)
{ {
task->data[15] = 0; task->data[15] = 0;
task->func = sub_80B6FC4; task->func = AnimTask_GhostGetOut_Step3;
sub_80B6FC4(taskId); task->func(taskId);
} }
} }
static void sub_80B6FC4(u8 taskId) static void AnimTask_GhostGetOut_Step3(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -1447,7 +1451,7 @@ static void sub_80B6FC4(u8 taskId)
++task->data[15]; ++task->data[15];
} }
static void sub_80B7158(struct Sprite *sprite) static void AnimMonMoveCircular(struct Sprite *sprite)
{ {
sprite->invisible = TRUE; sprite->invisible = TRUE;
sprite->data[5] = gBattlerSpriteIds[gBattleAnimAttacker]; sprite->data[5] = gBattlerSpriteIds[gBattleAnimAttacker];
@@ -1455,11 +1459,11 @@ static void sub_80B7158(struct Sprite *sprite)
sprite->data[1] = 10; sprite->data[1] = 10;
sprite->data[2] = gBattleAnimArgs[0]; sprite->data[2] = gBattleAnimArgs[0];
sprite->data[3] = gBattleAnimArgs[1]; sprite->data[3] = gBattleAnimArgs[1];
sprite->callback = sub_80B71B0; sprite->callback = AnimMonMoveCircular_Step;
gSprites[sprite->data[5]].y += 8; gSprites[sprite->data[5]].y += 8;
} }
static void sub_80B71B0(struct Sprite *sprite) static void AnimMonMoveCircular_Step(struct Sprite *sprite)
{ {
if (sprite->data[3]) if (sprite->data[3])
{ {
+146 -117
View File
@@ -9,22 +9,22 @@ static void AnimBonemerangProjectile(struct Sprite *sprite);
static void AnimBoneHitProjectile(struct Sprite *sprite); static void AnimBoneHitProjectile(struct Sprite *sprite);
static void AnimDirtScatter(struct Sprite *sprite); static void AnimDirtScatter(struct Sprite *sprite);
static void AnimMudSportDirt(struct Sprite *sprite); static void AnimMudSportDirt(struct Sprite *sprite);
static void AnimFissureDirtPlumeParticle(struct Sprite *sprite); static void AnimDirtPlumeParticle(struct Sprite *sprite);
static void AnimDigDirtMound(struct Sprite *sprite); static void AnimDigDirtMound(struct Sprite *sprite);
static void AnimBonemerangProjectileStep(struct Sprite *sprite); static void AnimBonemerangProjectile_Step(struct Sprite *sprite);
static void AnimBonemerangProjectileEnd(struct Sprite *sprite); static void AnimBonemerangProjectile_End(struct Sprite *sprite);
static void AnimMudSportDirtRising(struct Sprite *sprite); static void AnimMudSportDirtRising(struct Sprite *sprite);
static void AnimMudSportDirtFalling(struct Sprite *sprite); static void AnimMudSportDirtFalling(struct Sprite *sprite);
static void sub_80B8ED4(u8 taskId); static void AnimTask_DigBounceMovement(u8 taskId);
static void sub_80B908C(u8 taskId); static void AnimTask_DigDisappear(u8 taskId);
static void sub_80B92B8(u8 useBg1, s16 y, s16 endY); static void SetDigScanlineEffect(u8 useBg1, s16 y, s16 endY);
static void sub_80B912C(u8 taskId); static void AnimTask_DigSetVisibleUnderground(u8 taskId);
static void sub_80B91B0(u8 taskId); static void AnimTask_DigRiseUpFromHole(u8 taskId);
static void AnimFissureDirtPlumeParticleStep(struct Sprite *sprite); static void AnimDirtPlumeParticle_Step(struct Sprite *sprite);
static void sub_80B9584(u8 taskId); static void AnimTask_ShakeTerrain(u8 taskId);
static void sub_80B967C(u8 taskId); static void AnimTask_ShakeBattlers(u8 taskId);
static void sub_80B9760(struct Task *task); static void SetBattlersXOffsetForShake(struct Task *task);
static void sub_80B98A8(u8 taskId); static void WaitForFissureCompletion(u8 taskId);
static const union AffineAnimCmd sAffineAnim_Bonemerang[] = static const union AffineAnimCmd sAffineAnim_Bonemerang[] =
{ {
@@ -122,7 +122,7 @@ const struct SpriteTemplate gDirtPlumeSpriteTemplate =
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimFissureDirtPlumeParticle, .callback = AnimDirtPlumeParticle,
}; };
const struct SpriteTemplate gDirtMoundSpriteTemplate = const struct SpriteTemplate gDirtMoundSpriteTemplate =
@@ -140,17 +140,17 @@ const struct SpriteTemplate gDirtMoundSpriteTemplate =
// a boomerang. After hitting the target mon, it comes back to the user. // a boomerang. After hitting the target mon, it comes back to the user.
static void AnimBonemerangProjectile(struct Sprite *sprite) static void AnimBonemerangProjectile(struct Sprite *sprite)
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[0] = 20; sprite->data[0] = 20;
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[5] = -40; sprite->data[5] = -40;
InitAnimArcTranslation(sprite); InitAnimArcTranslation(sprite);
sprite->callback = AnimBonemerangProjectileStep; sprite->callback = AnimBonemerangProjectile_Step;
} }
static void AnimBonemerangProjectileStep(struct Sprite *sprite) static void AnimBonemerangProjectile_Step(struct Sprite *sprite)
{ {
if (TranslateAnimHorizontalArc(sprite)) if (TranslateAnimHorizontalArc(sprite))
{ {
@@ -159,15 +159,15 @@ static void AnimBonemerangProjectileStep(struct Sprite *sprite)
sprite->y2 = 0; sprite->y2 = 0;
sprite->x2 = 0; sprite->x2 = 0;
sprite->data[0] = 20; sprite->data[0] = 20;
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[5] = 40; sprite->data[5] = 40;
InitAnimArcTranslation(sprite); InitAnimArcTranslation(sprite);
sprite->callback = AnimBonemerangProjectileEnd; sprite->callback = AnimBonemerangProjectile_End;
} }
} }
static void AnimBonemerangProjectileEnd(struct Sprite *sprite) static void AnimBonemerangProjectile_End(struct Sprite *sprite)
{ {
if (TranslateAnimHorizontalArc(sprite)) if (TranslateAnimHorizontalArc(sprite))
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
@@ -186,8 +186,8 @@ static void AnimBoneHitProjectile(struct Sprite *sprite)
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[2] = -gBattleAnimArgs[2]; gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[4]; sprite->data[0] = gBattleAnimArgs[4];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
sprite->callback = StartAnimLinearTranslation; sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
} }
@@ -204,8 +204,8 @@ static void AnimDirtScatter(struct Sprite *sprite)
s16 xOffset, yOffset; s16 xOffset, yOffset;
InitSpritePosToAnimAttacker(sprite, 1); InitSpritePosToAnimAttacker(sprite, 1);
targetXPos = GetBattlerSpriteCoord2(gBattleAnimTarget, 2); targetXPos = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2);
targetYPos = GetBattlerSpriteCoord2(gBattleAnimTarget, 3); targetYPos = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
xOffset = Random() & 0x1F; xOffset = Random() & 0x1F;
yOffset = Random() & 0x1F; yOffset = Random() & 0x1F;
if (xOffset > 16) if (xOffset > 16)
@@ -229,8 +229,8 @@ static void AnimMudSportDirt(struct Sprite *sprite)
++sprite->oam.tileNum; ++sprite->oam.tileNum;
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == 0)
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + gBattleAnimArgs[1]; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1];
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[2]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[1] > 0 ? 1 : -1; sprite->data[0] = gBattleAnimArgs[1] > 0 ? 1 : -1;
sprite->callback = AnimMudSportDirtRising; sprite->callback = AnimMudSportDirtRising;
} }
@@ -283,14 +283,14 @@ void AnimTask_DigDownMovement(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == FALSE)
task->func = sub_80B8ED4; task->func = AnimTask_DigBounceMovement;
else else
task->func = sub_80B908C; task->func = AnimTask_DigDisappear;
task->func(taskId); task->func(taskId);
} }
static void sub_80B8ED4(u8 taskId) static void AnimTask_DigBounceMovement(u8 taskId)
{ {
u8 var0; u8 var0;
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -319,7 +319,7 @@ static void sub_80B8ED4(u8 taskId)
++task->data[0]; ++task->data[0];
break; break;
case 1: case 1:
sub_80B92B8(task->data[11], task->data[14], task->data[15]); SetDigScanlineEffect(task->data[11], task->data[14], task->data[15]);
++task->data[0]; ++task->data[0];
break; break;
case 2: case 2:
@@ -358,7 +358,7 @@ static void sub_80B8ED4(u8 taskId)
} }
} }
static void sub_80B908C(u8 taskId) static void AnimTask_DigDisappear(u8 taskId)
{ {
u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
@@ -376,15 +376,15 @@ void AnimTask_DigUpMovement(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == FALSE)
task->func = sub_80B912C; task->func = AnimTask_DigSetVisibleUnderground;
else else
task->func = sub_80B91B0; task->func = AnimTask_DigRiseUpFromHole;
task->func(taskId); task->func(taskId);
} }
static void sub_80B912C(u8 taskId) static void AnimTask_DigSetVisibleUnderground(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -394,7 +394,7 @@ static void sub_80B912C(u8 taskId)
task->data[10] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[10] = GetAnimBattlerSpriteId(ANIM_ATTACKER);
gSprites[task->data[10]].invisible = FALSE; gSprites[task->data[10]].invisible = FALSE;
gSprites[task->data[10]].x2 = 0; gSprites[task->data[10]].x2 = 0;
gSprites[task->data[10]].y2 = 160 - gSprites[task->data[10]].y; gSprites[task->data[10]].y2 = DISPLAY_HEIGHT - gSprites[task->data[10]].y;
++task->data[0]; ++task->data[0];
break; break;
case 1: case 1:
@@ -402,7 +402,7 @@ static void sub_80B912C(u8 taskId)
} }
} }
static void sub_80B91B0(u8 taskId) static void AnimTask_DigRiseUpFromHole(u8 taskId)
{ {
u8 var0; u8 var0;
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -422,7 +422,7 @@ static void sub_80B91B0(u8 taskId)
++task->data[0]; ++task->data[0];
break; break;
case 1: case 1:
sub_80B92B8(task->data[11], 0, task->data[15]); SetDigScanlineEffect(task->data[11], 0, task->data[15]);
++task->data[0]; ++task->data[0];
break; break;
case 2: case 2:
@@ -443,7 +443,7 @@ static void sub_80B91B0(u8 taskId)
} }
} }
static void sub_80B92B8(u8 useBG1, s16 y, s16 endY) static void SetDigScanlineEffect(u8 useBG1, s16 y, s16 endY)
{ {
s16 bgX; s16 bgX;
struct ScanlineEffectParams scanlineParams; struct ScanlineEffectParams scanlineParams;
@@ -485,7 +485,7 @@ static void sub_80B92B8(u8 useBG1, s16 y, s16 endY)
// arg 3: target y offset // arg 3: target y offset
// arg 4: wave amplitude // arg 4: wave amplitude
// arg 5: duration // arg 5: duration
static void AnimFissureDirtPlumeParticle(struct Sprite *sprite) static void AnimDirtPlumeParticle(struct Sprite *sprite)
{ {
s8 battler; s8 battler;
s16 xOffset; s16 xOffset;
@@ -500,17 +500,17 @@ static void AnimFissureDirtPlumeParticle(struct Sprite *sprite)
xOffset *= -1; xOffset *= -1;
gBattleAnimArgs[2] *= -1; gBattleAnimArgs[2] *= -1;
} }
sprite->x = GetBattlerSpriteCoord(battler, 2) + xOffset; sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2) + xOffset;
sprite->y = GetBattlerYCoordWithElevation(battler) + 30; sprite->y = GetBattlerYCoordWithElevation(battler) + 30;
sprite->data[0] = gBattleAnimArgs[5]; sprite->data[0] = gBattleAnimArgs[5];
sprite->data[2] = sprite->x + gBattleAnimArgs[2]; sprite->data[2] = sprite->x + gBattleAnimArgs[2];
sprite->data[4] = sprite->y + gBattleAnimArgs[3]; sprite->data[4] = sprite->y + gBattleAnimArgs[3];
sprite->data[5] = gBattleAnimArgs[4]; sprite->data[5] = gBattleAnimArgs[4];
InitAnimArcTranslation(sprite); InitAnimArcTranslation(sprite);
sprite->callback = AnimFissureDirtPlumeParticleStep; sprite->callback = AnimDirtPlumeParticle_Step;
} }
static void AnimFissureDirtPlumeParticleStep(struct Sprite *sprite) static void AnimDirtPlumeParticle_Step(struct Sprite *sprite)
{ {
if (TranslateAnimHorizontalArc(sprite)) if (TranslateAnimHorizontalArc(sprite))
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
@@ -530,7 +530,7 @@ static void AnimDigDirtMound(struct Sprite *sprite)
battler = gBattleAnimAttacker; battler = gBattleAnimAttacker;
else else
battler = gBattleAnimTarget; battler = gBattleAnimTarget;
sprite->x = GetBattlerSpriteCoord(battler, 0) - 16 + (gBattleAnimArgs[1] * 32); sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X) - 16 + (gBattleAnimArgs[1] * 32);
sprite->y = GetBattlerYCoordWithElevation(battler) + 32; sprite->y = GetBattlerYCoordWithElevation(battler) + 32;
sprite->oam.tileNum += gBattleAnimArgs[1] * 8; sprite->oam.tileNum += gBattleAnimArgs[1] * 8;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
@@ -538,151 +538,178 @@ static void AnimDigDirtMound(struct Sprite *sprite)
sprite->callback = WaitAnimForDuration; sprite->callback = WaitAnimForDuration;
} }
#define tState data[0]
#define tDelay data[1]
#define tTimer data[2]
#define tMaxTime data[3]
#define tbattlerSpriteIds(i) data[9 + (i)]
#define tNumBattlers data[13] // AnimTask_ShakeBattlers
#define tInitialX data[13] // AnimTask_ShakeTerrain
#define tHorizOffset data[14]
#define tInitHorizOffset data[15]
// Shakes battler(s) or the battle terrain back and forth horizontally. Used by e.g. Earthquake, Eruption
// arg0: What to shake. 0-3 for any specific battler, MAX_BATTLERS_COUNT for all battlers, MAX_BATTLERS_COUNT + 1 for the terrain
// arg1: Shake intensity, used to calculate horizontal pixel offset (if 0, use move power instead)
// arg2: Length of time to shake for
void AnimTask_HorizontalShake(u8 taskId) void AnimTask_HorizontalShake(u8 taskId)
{ {
u16 i; u16 i;
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
if (gBattleAnimArgs[1]) if (gBattleAnimArgs[1] != 0)
task->data[14] = task->data[15] = gBattleAnimArgs[1] + 3; task->tHorizOffset = task->tInitHorizOffset = gBattleAnimArgs[1] + 3;
else else
task->data[14] = task->data[15] = (gAnimMovePower / 10) + 3; task->tHorizOffset = task->tInitHorizOffset = (gAnimMovePower / 10) + 3;
task->data[3] = gBattleAnimArgs[2]; task->tMaxTime = gBattleAnimArgs[2];
switch (gBattleAnimArgs[0]) switch (gBattleAnimArgs[0])
{ {
case 5: case MAX_BATTLERS_COUNT + 1: // Shake terrain
task->data[13] = gBattle_BG3_X; task->tInitialX = gBattle_BG3_X;
task->func = sub_80B9584; task->func = AnimTask_ShakeTerrain;
break; break;
case 4: case MAX_BATTLERS_COUNT: // Shake all battlers
task->data[13] = 0; task->tNumBattlers = 0;
for (i = 0; i < MAX_BATTLERS_COUNT; ++i) for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{ {
if (IsBattlerSpriteVisible(i)) if (IsBattlerSpriteVisible(i))
{ {
task->data[task->data[13] + 9] = gBattlerSpriteIds[i]; task->tbattlerSpriteIds(task->tNumBattlers) = gBattlerSpriteIds[i];
++task->data[13]; task->tNumBattlers++;
} }
} }
task->func = sub_80B967C; task->func = AnimTask_ShakeBattlers;
break; break;
default: default: // Shake specific battler
task->data[9] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); task->tbattlerSpriteIds(0) = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
if (task->data[9] == 0xFF) if (task->tbattlerSpriteIds(0) == SPRITE_NONE)
{ {
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
else else
{ {
task->data[13] = 1; task->tNumBattlers = 1;
task->func = sub_80B967C; task->func = AnimTask_ShakeBattlers;
} }
break; break;
} }
} }
static void sub_80B9584(u8 taskId) static void AnimTask_ShakeTerrain(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
switch (task->data[0]) switch (task->tState)
{ {
case 0: case 0:
if (++task->data[1] > 1) if (++task->tDelay > 1)
{ {
task->data[1] = 0; task->tDelay = 0;
if ((task->data[2] & 1) == 0) if ((task->tTimer & 1) == 0)
gBattle_BG3_X = task->data[13] + task->data[15]; gBattle_BG3_X = task->tInitialX + task->tInitHorizOffset;
else else
gBattle_BG3_X = task->data[13] - task->data[15]; gBattle_BG3_X = task->tInitialX - task->tInitHorizOffset;
if (++task->data[2] == task->data[3]) if (++task->tTimer == task->tMaxTime)
{ {
task->data[2] = 0; task->tTimer = 0;
--task->data[14]; task->tHorizOffset--;
++task->data[0]; task->tState++;
} }
} }
break; break;
case 1: case 1:
if (++task->data[1] > 1) if (++task->tDelay > 1)
{ {
task->data[1] = 0; task->tDelay = 0;
if ((task->data[2] & 1) == 0) if ((task->tTimer & 1) == 0)
gBattle_BG3_X = task->data[13] + task->data[14]; gBattle_BG3_X = task->tInitialX + task->tHorizOffset;
else else
gBattle_BG3_X = task->data[13] - task->data[14]; gBattle_BG3_X = task->tInitialX - task->tHorizOffset;
if (++task->data[2] == 4) if (++task->tTimer == 4)
{ {
task->data[2] = 0; task->tTimer = 0;
if (--task->data[14] == 0) if (--task->tHorizOffset == 0)
++task->data[0]; task->tState++;
} }
} }
break; break;
case 2: case 2:
gBattle_BG3_X = task->data[13]; gBattle_BG3_X = task->tInitialX;
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
break; break;
} }
} }
static void sub_80B967C(u8 taskId) static void AnimTask_ShakeBattlers(u8 taskId)
{ {
u16 i; u16 i;
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
switch (task->data[0]) switch (task->tState)
{ {
case 0: case 0:
if (++task->data[1] > 1) if (++task->tDelay > 1)
{ {
task->data[1] = 0; task->tDelay = 0;
sub_80B9760(task); SetBattlersXOffsetForShake(task);
if (++task->data[2] == task->data[3]) if (++task->tTimer == task->tMaxTime)
{ {
task->data[2] = 0; task->tTimer = 0;
--task->data[14]; task->tHorizOffset--;
++task->data[0]; task->tState++;
} }
} }
break; break;
case 1: case 1:
if (++task->data[1] > 1) if (++task->tDelay > 1)
{ {
task->data[1] = 0; task->tDelay = 0;
sub_80B9760(task); SetBattlersXOffsetForShake(task);
if (++task->data[2] == 4) if (++task->tTimer == 4)
{ {
task->data[2] = 0; task->tTimer = 0;
if (--task->data[14] == 0) if (--task->tHorizOffset == 0)
++task->data[0]; task->tState++;
} }
} }
break; break;
case 2: case 2:
for (i = 0; i < task->data[13]; ++i) for (i = 0; i < task->tNumBattlers; i++)
gSprites[task->data[9 + i]].x2 = 0; gSprites[task->tbattlerSpriteIds(i)].x2 = 0;
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
break; break;
} }
} }
static void sub_80B9760(struct Task *task) static void SetBattlersXOffsetForShake(struct Task *task)
{ {
u16 i, xOffset; u16 i, xOffset;
if ((task->data[2] & 1) == 0) if ((task->tTimer & 1) == 0)
xOffset = (task->data[14] / 2) + (task->data[14] & 1); xOffset = (task->tHorizOffset / 2) + (task->tHorizOffset & 1);
else else
xOffset = -(task->data[14] / 2); xOffset = -(task->tHorizOffset / 2);
for (i = 0; i < task->data[13]; ++i)
gSprites[task->data[9 + i]].x2 = xOffset; for (i = 0; i < task->tNumBattlers; i++)
{
gSprites[task->tbattlerSpriteIds(i)].x2 = xOffset;
}
} }
#undef tState
#undef tDelay
#undef tTimer
#undef tMaxTime
#undef tbattlerSpriteIds
#undef tNumBattlers
#undef tInitialX
#undef tHorizOffset
#undef tInitHorizOffset
void AnimTask_IsPowerOver99(u8 taskId) void AnimTask_IsPowerOver99(u8 taskId)
{ {
gBattleAnimArgs[15] = gAnimMovePower > 99; gBattleAnimArgs[15] = gAnimMovePower > 99;
@@ -696,19 +723,21 @@ void AnimTask_PositionFissureBgOnBattler(u8 taskId)
if (gBattleAnimArgs[0] > 1) if (gBattleAnimArgs[0] > 1)
battler ^= BIT_FLANK; battler ^= BIT_FLANK;
newTask = &gTasks[CreateTask(sub_80B98A8, gBattleAnimArgs[1])]; newTask = &gTasks[CreateTask(WaitForFissureCompletion, gBattleAnimArgs[1])];
newTask->data[1] = (32 - GetBattlerSpriteCoord(battler, 2)) & 0x1FF; newTask->data[1] = (32 - GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2)) & 0x1FF;
newTask->data[2] = (64 - GetBattlerSpriteCoord(battler, 3)) & 0xFF; newTask->data[2] = (64 - GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET)) & 0xFF;
gBattle_BG3_X = newTask->data[1]; gBattle_BG3_X = newTask->data[1];
gBattle_BG3_Y = newTask->data[2]; gBattle_BG3_Y = newTask->data[2];
newTask->data[3] = gBattleAnimArgs[2]; newTask->data[3] = gBattleAnimArgs[2];
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
static void sub_80B98A8(u8 taskId) static void WaitForFissureCompletion(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
// Holds the BG3 offsets until gBattleAnimArgs[7]
// is set to a special terminator value.
if (gBattleAnimArgs[7] == task->data[3]) if (gBattleAnimArgs[7] == task->data[3])
{ {
gBattle_BG3_X = 0; gBattle_BG3_X = 0;
+70 -69
View File
@@ -9,21 +9,21 @@
struct HailStruct struct HailStruct
{ {
s32 unk0:10; s32 x:10;
s32 unk1:10; s32 y:10;
s32 unk2:8; s32 bPosition:8;
s32 unk3:4; s32 unk3:4;
}; };
static void sub_80AF108(struct Sprite *sprite); static void AnimUnusedIceCrystalThrow(struct Sprite *sprite);
static void sub_80AF28C(struct Sprite *sprite); static void AnimUnusedIceCrystalThrow_Step(struct Sprite *sprite);
static void AnimIcePunchSwirlingParticle(struct Sprite *sprite); static void AnimIcePunchSwirlingParticle(struct Sprite *sprite);
static void AnimIceBeamParticle(struct Sprite *sprite); static void AnimIceBeamParticle(struct Sprite *sprite);
static void AnimIceEffectParticle(struct Sprite *sprite); static void AnimIceEffectParticle(struct Sprite *sprite);
static void AnimFlickerIceEffectParticle(struct Sprite *sprite); static void AnimFlickerIceEffectParticle(struct Sprite *sprite);
static void AnimSwirlingSnowball(struct Sprite *sprite);
static void AnimSwirlingSnowball_Step1(struct Sprite *sprite); static void AnimSwirlingSnowball_Step1(struct Sprite *sprite);
static void AnimSwirlingSnowball_Step2(struct Sprite *sprite); static void AnimSwirlingSnowball_Step2(struct Sprite *sprite);
static void AnimSwirlingSnowball_Step3(struct Sprite *sprite);
static void AnimSwirlingSnowball_End(struct Sprite *sprite); static void AnimSwirlingSnowball_End(struct Sprite *sprite);
static void AnimMoveParticleBeyondTarget(struct Sprite *sprite); static void AnimMoveParticleBeyondTarget(struct Sprite *sprite);
static void AnimWiggleParticleTowardsTarget(struct Sprite *sprite); static void AnimWiggleParticleTowardsTarget(struct Sprite *sprite);
@@ -39,25 +39,24 @@ static void InitIceBallAnim(struct Sprite *sprite);
static void AnimThrowIceBall(struct Sprite *sprite); static void AnimThrowIceBall(struct Sprite *sprite);
static void InitIceBallParticle(struct Sprite *sprite); static void InitIceBallParticle(struct Sprite *sprite);
static void AnimIceBallParticle(struct Sprite *sprite); static void AnimIceBallParticle(struct Sprite *sprite);
static void AnimTask_Haze2(u8 taskId); static void AnimTask_HazeScrollingFog_Step(u8 taskId);
static void AnimTask_OverlayFogTiles(u8 taskId); static void AnimTask_MistBallFog_Step(u8 taskId);
static void AnimTask_Hail2(u8 taskId); static void AnimTask_Hail2(u8 taskId);
static bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId, u8 c); static bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId, u8 c);
static const union AnimCmd gUnknown_83E62C0[] = static const union AnimCmd sAnim_Unused[] =
{ {
ANIMCMD_FRAME(0, 5, .hFlip = TRUE), ANIMCMD_FRAME(0, 5, .hFlip = TRUE),
ANIMCMD_FRAME(1, 5, .hFlip = TRUE), ANIMCMD_FRAME(1, 5, .hFlip = TRUE),
ANIMCMD_JUMP(0), ANIMCMD_JUMP(0),
}; };
static const union AnimCmd *const gUnknown_83E62CC[] = static const union AnimCmd *const sAnims_Unused[] =
{ {
gUnknown_83E62C0, sAnim_Unused,
}; };
// not used static const struct SpriteTemplate sUnusedIceCrystalThrowSpriteTemplate =
static const struct SpriteTemplate gUnknown_83E62D0 =
{ {
.tileTag = ANIM_TAG_ICE_CRYSTALS, .tileTag = ANIM_TAG_ICE_CRYSTALS,
.paletteTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS,
@@ -65,10 +64,10 @@ static const struct SpriteTemplate gUnknown_83E62D0 =
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80AF108, .callback = AnimUnusedIceCrystalThrow,
}; };
static const union AnimCmd gUnknown_83E62E8[] = static const union AnimCmd sAnim_IceCrystalLargeChunk[] =
{ {
ANIMCMD_FRAME(0, 1), ANIMCMD_FRAME(0, 1),
ANIMCMD_END, ANIMCMD_END,
@@ -105,10 +104,10 @@ static const union AnimCmd sAnim_SmallBubblePair[] =
ANIMCMD_JUMP(0), ANIMCMD_JUMP(0),
}; };
// unused // Unused, contains just the top left corner of the large ice crystal
static const union AnimCmd *const gUnknown_83E631C[] = static const union AnimCmd *const sAnims_IceCrystalLargeChunk[] =
{ {
gUnknown_83E62E8, sAnim_IceCrystalLargeChunk,
}; };
static const union AnimCmd *const sAnims_IceCrystalLarge[] = static const union AnimCmd *const sAnims_IceCrystalLarge[] =
@@ -245,7 +244,7 @@ const struct SpriteTemplate gSwirlingSnowballSpriteTemplate =
.anims = sAnims_Snowball, .anims = sAnims_Snowball,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimSwirlingSnowball_Step1, .callback = AnimSwirlingSnowball,
}; };
const struct SpriteTemplate gBlizzardIceCrystalSpriteTemplate = const struct SpriteTemplate gBlizzardIceCrystalSpriteTemplate =
@@ -332,7 +331,7 @@ const struct SpriteTemplate gSmogCloudSpriteTemplate =
.callback = InitSwirlingFogAnim, .callback = InitSwirlingFogAnim,
}; };
static const u8 gUnknown_83E64D4[] = static const u8 sHazeBlendAmounts[] =
{ {
0, 1, 2, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6, 6, 6, 7, 8, 8, 8, 9, 0, 1, 2, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6, 6, 6, 7, 8, 8, 8, 9,
}; };
@@ -348,7 +347,7 @@ const struct SpriteTemplate gMistBallSpriteTemplate =
.callback = AnimThrowMistBall, .callback = AnimThrowMistBall,
}; };
static const u8 gUnknown_83E6500[] = static const u8 sMistBlendAmounts[] =
{ {
0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5,
}; };
@@ -366,16 +365,16 @@ const struct SpriteTemplate gPoisonGasCloudSpriteTemplate =
static const struct HailStruct sHailCoordData[] = static const struct HailStruct sHailCoordData[] =
{ {
{100, 120, 0, 2}, {.x = 100, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 2},
{85, 120, 0, 0}, {.x = 85, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 0},
{242, 120, 1, 1}, {.x = 242, .y = 120, .bPosition = B_POSITION_OPPONENT_LEFT, .unk3 = 1},
{66, 120, 2, 1}, {.x = 66, .y = 120, .bPosition = B_POSITION_PLAYER_RIGHT, .unk3 = 1},
{182, 120, 3, 0}, {.x = 182, .y = 120, .bPosition = B_POSITION_OPPONENT_RIGHT, .unk3 = 0},
{60, 120, 0, 2}, {.x = 60, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 2},
{214, 120, 1, 0}, {.x = 214, .y = 120, .bPosition = B_POSITION_OPPONENT_LEFT, .unk3 = 0},
{113, 120, 0, 1}, {.x = 113, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 1},
{210, 120, 3, 1}, {.x = 210, .y = 120, .bPosition = B_POSITION_OPPONENT_RIGHT, .unk3 = 1},
{38, 120, 2, 0}, {.x = 38, .y = 120, .bPosition = B_POSITION_PLAYER_RIGHT, .unk3 = 0},
}; };
static const union AffineAnimCmd sAffineAnim_HailParticle_0[] = static const union AffineAnimCmd sAffineAnim_HailParticle_0[] =
@@ -518,8 +517,7 @@ const struct SpriteTemplate gIceBallImpactShardSpriteTemplate =
.callback = InitIceBallParticle, .callback = InitIceBallParticle,
}; };
// not used static void AnimUnusedIceCrystalThrow(struct Sprite *sprite)
static void sub_80AF108(struct Sprite *sprite)
{ {
s16 targetX, targetY, attackerX, attackerY; s16 targetX, targetY, attackerX, attackerY;
@@ -533,13 +531,15 @@ static void sub_80AF108(struct Sprite *sprite)
sprite->data[2] = gBattleAnimArgs[2] + targetX; sprite->data[2] = gBattleAnimArgs[2] + targetX;
sprite->data[3] = gBattleAnimArgs[1] + attackerY; sprite->data[3] = gBattleAnimArgs[1] + attackerY;
sprite->data[4] = gBattleAnimArgs[3] + targetY; sprite->data[4] = gBattleAnimArgs[3] + targetY;
SetupLinearTranslationWithFixedDuration(sprite); ConvertPosDataToTranslateLinearData(sprite);
// won't match with while loop // won't match with while loop
for (; (targetX >= -32 && targetX <= 272) && (targetY >= -32 && targetY <= 192); targetX += sprite->data[1], targetY += sprite->data[2]) for (; (targetX >= -32 && targetX <= DISPLAY_WIDTH + 32) && (targetY >= -32 && targetY <= DISPLAY_HEIGHT + 32);
targetX += sprite->data[1], targetY += sprite->data[2])
; ;
sprite->data[1] = -sprite->data[1]; sprite->data[1] = -sprite->data[1];
sprite->data[2] = -sprite->data[2]; sprite->data[2] = -sprite->data[2];
for (; (attackerX >= -32 && attackerX <= 272) && (attackerY >= -32 && attackerY <= 192); attackerX += sprite->data[1], attackerY += sprite->data[2]) for (; (attackerX >= -32 && attackerX <= DISPLAY_WIDTH + 32) && (attackerY >= -32 && attackerY <= DISPLAY_HEIGHT + 32);
attackerX += sprite->data[1], attackerY += sprite->data[2])
; ;
sprite->x = attackerX; sprite->x = attackerX;
sprite->y = attackerY; sprite->y = attackerY;
@@ -548,14 +548,13 @@ static void sub_80AF108(struct Sprite *sprite)
sprite->data[2] = targetX; sprite->data[2] = targetX;
sprite->data[3] = attackerY; sprite->data[3] = attackerY;
sprite->data[4] = targetY; sprite->data[4] = targetY;
SetupLinearTranslationWithFixedDuration(sprite); ConvertPosDataToTranslateLinearData(sprite);
sprite->data[3] = gBattleAnimArgs[5]; sprite->data[3] = gBattleAnimArgs[5];
sprite->data[4] = gBattleAnimArgs[6]; sprite->data[4] = gBattleAnimArgs[6];
sprite->callback = sub_80AF28C; sprite->callback = AnimUnusedIceCrystalThrow_Step;
} }
// not used static void AnimUnusedIceCrystalThrow_Step(struct Sprite *sprite)
static void sub_80AF28C(struct Sprite *sprite)
{ {
if (sprite->data[0] != 0) if (sprite->data[0] != 0)
{ {
@@ -584,7 +583,7 @@ static void AnimIcePunchSwirlingParticle(struct Sprite *sprite)
sprite->data[3] = 30; sprite->data[3] = 30;
sprite->data[4] = -512; sprite->data[4] = -512;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
sprite->callback = TranslateSpriteInGrowingCircleOverDuration; sprite->callback = TranslateSpriteInGrowingCircle;
sprite->callback(sprite); sprite->callback(sprite);
} }
@@ -645,7 +644,7 @@ static void AnimFlickerIceEffectParticle(struct Sprite *sprite)
// arg 3: target y offset // arg 3: target y offset
// arg 4: particle speed // arg 4: particle speed
// arg 5: multiple targets? (boolean) // arg 5: multiple targets? (boolean)
static void AnimSwirlingSnowball_Step1(struct Sprite *sprite) static void AnimSwirlingSnowball(struct Sprite *sprite)
{ {
s32 i; s32 i;
s16 tempDataHolder[8]; s16 tempDataHolder[8];
@@ -676,8 +675,9 @@ static void AnimSwirlingSnowball_Step1(struct Sprite *sprite)
{ {
sprite->data[0] = 1; sprite->data[0] = 1;
AnimFastTranslateLinear(sprite); AnimFastTranslateLinear(sprite);
if ((u32)(sprite->x + sprite->x2 + 16) > 272 if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16
|| sprite->y + sprite->y2 > 160 || sprite->x + sprite->x2 < -16
|| sprite->y + sprite->y2 > DISPLAY_HEIGHT
|| sprite->y + sprite->y2 < -16) || sprite->y + sprite->y2 < -16)
break; break;
} }
@@ -686,11 +686,11 @@ static void AnimSwirlingSnowball_Step1(struct Sprite *sprite)
sprite->x2 = sprite->y2 = 0; sprite->x2 = sprite->y2 = 0;
for (i = 0; i < 8; ++i) for (i = 0; i < 8; ++i)
sprite->data[i] = tempDataHolder[i]; sprite->data[i] = tempDataHolder[i];
sprite->callback = InitAndStartAnimFastLinearTranslationWithSpeed; sprite->callback = InitAnimFastLinearTranslationWithSpeedAndPos;
StoreSpriteCallbackInData6(sprite, AnimSwirlingSnowball_Step2); StoreSpriteCallbackInData6(sprite, AnimSwirlingSnowball_Step1);
} }
static void AnimSwirlingSnowball_Step2(struct Sprite *sprite) static void AnimSwirlingSnowball_Step1(struct Sprite *sprite)
{ {
s16 tempVar; s16 tempVar;
@@ -703,11 +703,11 @@ static void AnimSwirlingSnowball_Step2(struct Sprite *sprite)
sprite->data[3] = Sin(sprite->data[0], tempVar); sprite->data[3] = Sin(sprite->data[0], tempVar);
sprite->data[4] = Cos(sprite->data[0], 0xF); sprite->data[4] = Cos(sprite->data[0], 0xF);
sprite->data[5] = 0; sprite->data[5] = 0;
sprite->callback = AnimSwirlingSnowball_Step3; sprite->callback = AnimSwirlingSnowball_Step2;
sprite->callback(sprite); sprite->callback(sprite);
} }
static void AnimSwirlingSnowball_Step3(struct Sprite *sprite) static void AnimSwirlingSnowball_Step2(struct Sprite *sprite)
{ {
s16 tempVar = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 20 : -20; s16 tempVar = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 20 : -20;
@@ -780,8 +780,9 @@ static void AnimMoveParticleBeyondTarget(struct Sprite *sprite)
{ {
sprite->data[0] = 1; sprite->data[0] = 1;
AnimFastTranslateLinear(sprite); AnimFastTranslateLinear(sprite);
if ((u32)(sprite->x + sprite->x2 + 16) > 272 if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16
|| sprite->y + sprite->y2 > 160 || sprite->x + sprite->x2 < -16
|| sprite->y + sprite->y2 > DISPLAY_HEIGHT
|| sprite->y + sprite->y2 < -16) || sprite->y + sprite->y2 < -16)
break; break;
} }
@@ -806,8 +807,9 @@ static void AnimWiggleParticleTowardsTarget(struct Sprite *sprite)
sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF; sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF;
if (sprite->data[0] == 1) if (sprite->data[0] == 1)
{ {
if ((u32)(sprite->x + sprite->x2 + 16) > 272 if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16
|| sprite->y + sprite->y2 > 160 || sprite->x + sprite->x2 < -16
|| sprite->y + sprite->y2 > DISPLAY_HEIGHT
|| sprite->y + sprite->y2 < -16) || sprite->y + sprite->y2 < -16)
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
} }
@@ -927,7 +929,7 @@ static void AnimSwirlingFogAnim(struct Sprite *sprite)
} }
// Fades mons to black and places foggy overlay in Haze. // Fades mons to black and places foggy overlay in Haze.
void AnimTask_Haze1(u8 taskId) void AnimTask_HazeScrollingFog(u8 taskId)
{ {
struct BattleAnimBgData animBg; struct BattleAnimBgData animBg;
@@ -947,10 +949,10 @@ void AnimTask_Haze1(u8 taskId)
LoadPalette(&gDefaultWeatherSpritePalette, animBg.paletteId * 16, 32); LoadPalette(&gDefaultWeatherSpritePalette, animBg.paletteId * 16, 32);
if (IsContest()) if (IsContest())
RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0); RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0);
gTasks[taskId].func = AnimTask_Haze2; gTasks[taskId].func = AnimTask_HazeScrollingFog_Step;
} }
static void AnimTask_Haze2(u8 taskId) static void AnimTask_HazeScrollingFog_Step(u8 taskId)
{ {
struct BattleAnimBgData animBg; struct BattleAnimBgData animBg;
@@ -962,7 +964,7 @@ static void AnimTask_Haze2(u8 taskId)
{ {
gTasks[taskId].data[10] = 0; gTasks[taskId].data[10] = 0;
++gTasks[taskId].data[9]; ++gTasks[taskId].data[9];
gTasks[taskId].data[11] = gUnknown_83E64D4[gTasks[taskId].data[9]]; gTasks[taskId].data[11] = sHazeBlendAmounts[gTasks[taskId].data[9]];
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
if (gTasks[taskId].data[11] == 9) if (gTasks[taskId].data[11] == 9)
{ {
@@ -1024,8 +1026,7 @@ static void AnimThrowMistBall(struct Sprite *sprite)
sprite->callback = TranslateAnimSpriteToTargetMonLocation; sprite->callback = TranslateAnimSpriteToTargetMonLocation;
} }
// Displays misty background in Mist Ball. void AnimTask_MistBallFog(u8 taskId)
void AnimTask_LoadMistTiles(u8 taskId)
{ {
struct BattleAnimBgData animBg; struct BattleAnimBgData animBg;
@@ -1046,10 +1047,10 @@ void AnimTask_LoadMistTiles(u8 taskId)
if (IsContest()) if (IsContest())
RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0); RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0);
gTasks[taskId].data[15] = -1; gTasks[taskId].data[15] = -1;
gTasks[taskId].func = AnimTask_OverlayFogTiles; gTasks[taskId].func = AnimTask_MistBallFog_Step;
} }
static void AnimTask_OverlayFogTiles(u8 taskId) static void AnimTask_MistBallFog_Step(u8 taskId)
{ {
struct BattleAnimBgData animBg; struct BattleAnimBgData animBg;
@@ -1058,7 +1059,7 @@ static void AnimTask_OverlayFogTiles(u8 taskId)
{ {
case 0: case 0:
gTasks[taskId].data[9] += 1; gTasks[taskId].data[9] += 1;
gTasks[taskId].data[11] = gUnknown_83E6500[gTasks[taskId].data[9]]; gTasks[taskId].data[11] = sMistBlendAmounts[gTasks[taskId].data[9]];
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 17 - gTasks[taskId].data[11])); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 17 - gTasks[taskId].data[11]));
if (gTasks[taskId].data[11] == 5) if (gTasks[taskId].data[11] == 5)
{ {
@@ -1230,7 +1231,7 @@ static void MovePoisonGasCloud(struct Sprite *sprite)
sprite->data[2] = -0x10; sprite->data[2] = -0x10;
++sprite->data[7]; ++sprite->data[7];
sprite->x2 = sprite->y2 = 0; sprite->x2 = sprite->y2 = 0;
BattleAnim_InitLinearTranslationWithDuration(sprite); InitAnimLinearTranslationWithSpeed(sprite);
} }
break; break;
case 2: case 2:
@@ -1249,7 +1250,7 @@ static void MovePoisonGasCloud(struct Sprite *sprite)
} }
// Creates Hail. // Creates Hail.
void AnimTask_Hail1(u8 taskId) void AnimTask_Hail(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -1310,7 +1311,7 @@ static bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId,
if (unk != 2) if (unk != 2)
{ {
id = GetBattlerAtPosition(sHailCoordData[hailStructId].unk2); id = GetBattlerAtPosition(sHailCoordData[hailStructId].bPosition);
if (IsBattlerSpriteVisible(id)) if (IsBattlerSpriteVisible(id))
{ {
possibleBool = TRUE; possibleBool = TRUE;
@@ -1330,14 +1331,14 @@ static bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId,
} }
else else
{ {
battlerX = (sHailCoordData[hailStructId].unk0); battlerX = sHailCoordData[hailStructId].x;
battlerY = (sHailCoordData[hailStructId].unk1); battlerY = sHailCoordData[hailStructId].y;
} }
} }
else else
{ {
battlerX = (sHailCoordData[hailStructId].unk0); battlerX = sHailCoordData[hailStructId].x;
battlerY = (sHailCoordData[hailStructId].unk1); battlerY = sHailCoordData[hailStructId].y;
} }
spriteX = battlerX - ((battlerY + 8) / 2); spriteX = battlerX - ((battlerY + 8) / 2);
id = CreateSprite(&sHailParticleSpriteTemplate, spriteX, -8, 18); id = CreateSprite(&sHailParticleSpriteTemplate, spriteX, -8, 18);
+117 -114
View File
@@ -7,27 +7,27 @@
#undef abs #undef abs
#define abs(x) ((x) < 0 ? -(x) : (x)) #define abs(x) ((x) < 0 ? -(x) : (x))
static void AnimTask_ShakeMonStep(u8 taskId); static void AnimTask_ShakeMon_Step(u8 taskId);
static void AnimTask_ShakeMon2Step(u8 taskId); static void AnimTask_ShakeMon2Step(u8 taskId);
static void AnimTask_ShakeMonInPlaceStep(u8 taskId); static void AnimTask_ShakeMonInPlace_Step(u8 taskId);
static void AnimTask_ShakeAndSinkMonStep(u8 taskId); static void AnimTask_ShakeAndSinkMon_Step(u8 taskId);
static void AnimTask_TranslateMonEllipticalStep(u8 taskId); static void AnimTask_TranslateMonElliptical_Step(u8 taskId);
static void DoHorizontalLunge(struct Sprite *sprite); static void DoHorizontalLunge(struct Sprite *sprite);
static void ReverseHorizontalLungeDirection(struct Sprite *sprite); static void ReverseHorizontalLungeDirection(struct Sprite *sprite);
static void DoVerticalDip(struct Sprite *sprite); static void DoVerticalDip(struct Sprite *sprite);
static void ReverseVerticalDipDirection(struct Sprite *sprite); static void ReverseVerticalDipDirection(struct Sprite *sprite);
static void SlideMonToOriginalPos(struct Sprite *sprite); static void SlideMonToOriginalPos(struct Sprite *sprite);
static void SlideMonToOriginalPosStep(struct Sprite *sprite); static void SlideMonToOriginalPos_Step(struct Sprite *sprite);
static void SlideMonToOffset(struct Sprite *sprite); static void SlideMonToOffset(struct Sprite *sprite);
static void sub_8099394(struct Sprite *sprite); static void SlideMonToOffsetAndBack(struct Sprite *sprite);
static void sub_809946C(struct Sprite *sprite); static void SlideMonToOffsetAndBack_End(struct Sprite *sprite);
static void AnimTask_WindUpLungePart1(u8 taskId); static void AnimTask_WindUpLunge_Step1(u8 taskId);
static void AnimTask_WindUpLungePart2(u8 taskId); static void AnimTask_WindUpLunge_Step2(u8 taskId);
static void sub_80996B8(u8 taskId); static void AnimTask_SlideOffScreen_Step(u8 taskId);
static void AnimTask_SwayMonStep(u8 taskId); static void AnimTask_SwayMon_Step(u8 taskId);
static void AnimTask_ScaleMonAndRestoreStep(u8 taskId); static void AnimTask_ScaleMonAndRestore_Step(u8 taskId);
static void sub_8099B54(u8 taskId); static void AnimTask_RotateMonSpriteToSide_Step(u8 taskId);
static void sub_8099CB8(u8 taskId); static void AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step(u8 taskId);
const struct SpriteTemplate gHorizontalLungeSpriteTemplate = const struct SpriteTemplate gHorizontalLungeSpriteTemplate =
{ {
@@ -81,7 +81,7 @@ const struct SpriteTemplate gSlideMonToOffsetAndBackSpriteTemplate =
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_8099394, .callback = SlideMonToOffsetAndBack,
}; };
// Task to facilitate simple shaking of a pokemon's picture in battle. // Task to facilitate simple shaking of a pokemon's picture in battle.
@@ -95,24 +95,24 @@ void AnimTask_ShakeMon(u8 taskId)
{ {
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
if (spriteId == 0xFF) if (spriteId == SPRITE_NONE)
DestroyAnimVisualTask(taskId);
else
{ {
gSprites[spriteId].x2 = gBattleAnimArgs[1]; DestroyAnimVisualTask(taskId);
gSprites[spriteId].y2 = gBattleAnimArgs[2]; return;
gTasks[taskId].data[0] = spriteId;
gTasks[taskId].data[1] = gBattleAnimArgs[3];
gTasks[taskId].data[2] = gBattleAnimArgs[4];
gTasks[taskId].data[3] = gBattleAnimArgs[4];
gTasks[taskId].data[4] = gBattleAnimArgs[1];
gTasks[taskId].data[5] = gBattleAnimArgs[2];
gTasks[taskId].func = AnimTask_ShakeMonStep;
gTasks[taskId].func(taskId);
} }
gSprites[spriteId].x2 = gBattleAnimArgs[1];
gSprites[spriteId].y2 = gBattleAnimArgs[2];
gTasks[taskId].data[0] = spriteId;
gTasks[taskId].data[1] = gBattleAnimArgs[3];
gTasks[taskId].data[2] = gBattleAnimArgs[4];
gTasks[taskId].data[3] = gBattleAnimArgs[4];
gTasks[taskId].data[4] = gBattleAnimArgs[1];
gTasks[taskId].data[5] = gBattleAnimArgs[2];
gTasks[taskId].func = AnimTask_ShakeMon_Step;
gTasks[taskId].func(taskId);
} }
static void AnimTask_ShakeMonStep(u8 taskId) static void AnimTask_ShakeMon_Step(u8 taskId)
{ {
if (gTasks[taskId].data[3] == 0) if (gTasks[taskId].data[3] == 0)
{ {
@@ -152,7 +152,7 @@ void AnimTask_ShakeMon2(u8 taskId)
if (gBattleAnimArgs[0] < MAX_BATTLERS_COUNT) if (gBattleAnimArgs[0] < MAX_BATTLERS_COUNT)
{ {
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
if (spriteId == 0xFF) if (spriteId == SPRITE_NONE)
abort = TRUE; abort = TRUE;
} }
else if (gBattleAnimArgs[0] != 8) else if (gBattleAnimArgs[0] != 8)
@@ -178,21 +178,23 @@ void AnimTask_ShakeMon2(u8 taskId)
} }
else else
spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
if (abort) if (abort)
DestroyAnimVisualTask(taskId);
else
{ {
gSprites[spriteId].x2 = gBattleAnimArgs[1]; DestroyAnimVisualTask(taskId);
gSprites[spriteId].y2 = gBattleAnimArgs[2]; return;
gTasks[taskId].data[0] = spriteId;
gTasks[taskId].data[1] = gBattleAnimArgs[3];
gTasks[taskId].data[2] = gBattleAnimArgs[4];
gTasks[taskId].data[3] = gBattleAnimArgs[4];
gTasks[taskId].data[4] = gBattleAnimArgs[1];
gTasks[taskId].data[5] = gBattleAnimArgs[2];
gTasks[taskId].func = AnimTask_ShakeMon2Step;
gTasks[taskId].func(taskId);
} }
gSprites[spriteId].x2 = gBattleAnimArgs[1];
gSprites[spriteId].y2 = gBattleAnimArgs[2];
gTasks[taskId].data[0] = spriteId;
gTasks[taskId].data[1] = gBattleAnimArgs[3];
gTasks[taskId].data[2] = gBattleAnimArgs[4];
gTasks[taskId].data[3] = gBattleAnimArgs[4];
gTasks[taskId].data[4] = gBattleAnimArgs[1];
gTasks[taskId].data[5] = gBattleAnimArgs[2];
gTasks[taskId].func = AnimTask_ShakeMon2Step;
gTasks[taskId].func(taskId);
} }
static void AnimTask_ShakeMon2Step(u8 taskId) static void AnimTask_ShakeMon2Step(u8 taskId)
@@ -231,25 +233,25 @@ void AnimTask_ShakeMonInPlace(u8 taskId)
{ {
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
if (spriteId == 0xFF) if (spriteId == SPRITE_NONE)
DestroyAnimVisualTask(taskId);
else
{ {
gSprites[spriteId].x2 += gBattleAnimArgs[1]; DestroyAnimVisualTask(taskId);
gSprites[spriteId].y2 += gBattleAnimArgs[2]; return;
gTasks[taskId].data[0] = spriteId;
gTasks[taskId].data[1] = 0;
gTasks[taskId].data[2] = gBattleAnimArgs[3];
gTasks[taskId].data[3] = 0;
gTasks[taskId].data[4] = gBattleAnimArgs[4];
gTasks[taskId].data[5] = gBattleAnimArgs[1] * 2;
gTasks[taskId].data[6] = gBattleAnimArgs[2] * 2;
gTasks[taskId].func = AnimTask_ShakeMonInPlaceStep;
gTasks[taskId].func(taskId);
} }
gSprites[spriteId].x2 += gBattleAnimArgs[1];
gSprites[spriteId].y2 += gBattleAnimArgs[2];
gTasks[taskId].data[0] = spriteId;
gTasks[taskId].data[1] = 0;
gTasks[taskId].data[2] = gBattleAnimArgs[3];
gTasks[taskId].data[3] = 0;
gTasks[taskId].data[4] = gBattleAnimArgs[4];
gTasks[taskId].data[5] = gBattleAnimArgs[1] * 2;
gTasks[taskId].data[6] = gBattleAnimArgs[2] * 2;
gTasks[taskId].func = AnimTask_ShakeMonInPlace_Step;
gTasks[taskId].func(taskId);
} }
static void AnimTask_ShakeMonInPlaceStep(u8 taskId) static void AnimTask_ShakeMonInPlace_Step(u8 taskId)
{ {
if (gTasks[taskId].data[3] == 0) if (gTasks[taskId].data[3] == 0)
{ {
@@ -299,22 +301,22 @@ void AnimTask_ShakeAndSinkMon(u8 taskId)
gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].data[2] = gBattleAnimArgs[2];
gTasks[taskId].data[3] = gBattleAnimArgs[3]; gTasks[taskId].data[3] = gBattleAnimArgs[3];
gTasks[taskId].data[4] = gBattleAnimArgs[4]; gTasks[taskId].data[4] = gBattleAnimArgs[4];
gTasks[taskId].func = AnimTask_ShakeAndSinkMonStep; gTasks[taskId].func = AnimTask_ShakeAndSinkMon_Step;
gTasks[taskId].func(taskId); gTasks[taskId].func(taskId);
} }
static void AnimTask_ShakeAndSinkMonStep(u8 taskId) static void AnimTask_ShakeAndSinkMon_Step(u8 taskId)
{ {
u8 spriteId = gTasks[taskId].data[0]; u8 spriteId = gTasks[taskId].data[0];
s16 data1 = gTasks[taskId].data[1]; s16 x = gTasks[taskId].data[1];
if (gTasks[taskId].data[2] == gTasks[taskId].data[8]++) if (gTasks[taskId].data[2] == gTasks[taskId].data[8]++)
{ {
gTasks[taskId].data[8] = 0; gTasks[taskId].data[8] = 0;
if (gSprites[spriteId].x2 == data1) if (gSprites[spriteId].x2 == x)
data1 = -data1; x = -x;
gSprites[spriteId].x2 += data1; gSprites[spriteId].x2 += x;
} }
gTasks[taskId].data[1] = data1; gTasks[taskId].data[1] = x;
gTasks[taskId].data[9] += gTasks[taskId].data[3]; gTasks[taskId].data[9] += gTasks[taskId].data[3];
gSprites[spriteId].y2 = gTasks[taskId].data[9] >> 8; gSprites[spriteId].y2 = gTasks[taskId].data[9] >> 8;
if (--gTasks[taskId].data[4] == 0) if (--gTasks[taskId].data[4] == 0)
@@ -342,11 +344,11 @@ void AnimTask_TranslateMonElliptical(u8 taskId)
gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].data[2] = gBattleAnimArgs[2];
gTasks[taskId].data[3] = gBattleAnimArgs[3]; gTasks[taskId].data[3] = gBattleAnimArgs[3];
gTasks[taskId].data[4] = wavePeriod; gTasks[taskId].data[4] = wavePeriod;
gTasks[taskId].func = AnimTask_TranslateMonEllipticalStep; gTasks[taskId].func = AnimTask_TranslateMonElliptical_Step;
gTasks[taskId].func(taskId); gTasks[taskId].func(taskId);
} }
static void AnimTask_TranslateMonEllipticalStep(u8 taskId) static void AnimTask_TranslateMonElliptical_Step(u8 taskId)
{ {
u8 spriteId = gTasks[taskId].data[0]; u8 spriteId = gTasks[taskId].data[0];
gSprites[spriteId].x2 = Sin(gTasks[taskId].data[5], gTasks[taskId].data[1]); gSprites[spriteId].x2 = Sin(gTasks[taskId].data[5], gTasks[taskId].data[1]);
@@ -395,14 +397,14 @@ static void DoHorizontalLunge(struct Sprite *sprite)
sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker]; sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];
sprite->data[4] = gBattleAnimArgs[0]; sprite->data[4] = gBattleAnimArgs[0];
StoreSpriteCallbackInData6(sprite, ReverseHorizontalLungeDirection); StoreSpriteCallbackInData6(sprite, ReverseHorizontalLungeDirection);
sprite->callback = TranslateMonSpriteLinear; sprite->callback = TranslateSpriteLinearById;
} }
static void ReverseHorizontalLungeDirection(struct Sprite *sprite) static void ReverseHorizontalLungeDirection(struct Sprite *sprite)
{ {
sprite->data[0] = sprite->data[4]; sprite->data[0] = sprite->data[4];
sprite->data[1] = -sprite->data[1]; sprite->data[1] = -sprite->data[1];
sprite->callback = TranslateMonSpriteLinear; sprite->callback = TranslateSpriteLinearById;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
} }
@@ -422,14 +424,14 @@ static void DoVerticalDip(struct Sprite *sprite)
sprite->data[3] = spriteId; sprite->data[3] = spriteId;
sprite->data[4] = gBattleAnimArgs[0]; sprite->data[4] = gBattleAnimArgs[0];
StoreSpriteCallbackInData6(sprite, ReverseVerticalDipDirection); StoreSpriteCallbackInData6(sprite, ReverseVerticalDipDirection);
sprite->callback = TranslateMonSpriteLinear; sprite->callback = TranslateSpriteLinearById;
} }
static void ReverseVerticalDipDirection(struct Sprite *sprite) static void ReverseVerticalDipDirection(struct Sprite *sprite)
{ {
sprite->data[0] = sprite->data[4]; sprite->data[0] = sprite->data[4];
sprite->data[2] = -sprite->data[2]; sprite->data[2] = -sprite->data[2];
sprite->callback = TranslateMonSpriteLinear; sprite->callback = TranslateSpriteLinearById;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
} }
@@ -462,19 +464,19 @@ static void SlideMonToOriginalPos(struct Sprite *sprite)
sprite->data[1] = 0; sprite->data[1] = 0;
sprite->data[7] = gBattleAnimArgs[1]; sprite->data[7] = gBattleAnimArgs[1];
sprite->data[7] |= spriteId << 8; sprite->data[7] |= spriteId << 8;
sprite->callback = SlideMonToOriginalPosStep; sprite->callback = SlideMonToOriginalPos_Step;
} }
static void SlideMonToOriginalPosStep(struct Sprite *sprite) static void SlideMonToOriginalPos_Step(struct Sprite *sprite)
{ {
u8 data7 = sprite->data[7]; u8 data7 = sprite->data[7];
struct Sprite *otherSprite = &gSprites[sprite->data[7] >> 8]; struct Sprite *monSprite = &gSprites[sprite->data[7] >> 8];
if (sprite->data[0] == 0) if (sprite->data[0] == 0)
{ {
if (data7 == 1 || data7 == 0) if (data7 == 1 || data7 == 0)
otherSprite->x2 = 0; monSprite->x2 = 0;
if (data7 == 2 || data7 == 0) if (data7 == 2 || data7 == 0)
otherSprite->y2 = 0; monSprite->y2 = 0;
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
} }
else else
@@ -482,8 +484,8 @@ static void SlideMonToOriginalPosStep(struct Sprite *sprite)
sprite->data[0]--; sprite->data[0]--;
sprite->data[3] += sprite->data[1]; sprite->data[3] += sprite->data[1];
sprite->data[4] += sprite->data[2]; sprite->data[4] += sprite->data[2];
otherSprite->x2 = (sprite->data[3] >> 8) + sprite->data[5]; monSprite->x2 = (sprite->data[3] >> 8) + sprite->data[5];
otherSprite->y2 = (sprite->data[4] >> 8) + sprite->data[6]; monSprite->y2 = (sprite->data[4] >> 8) + sprite->data[6];
} }
} }
@@ -498,12 +500,12 @@ static void SlideMonToOriginalPosStep(struct Sprite *sprite)
static void SlideMonToOffset(struct Sprite *sprite) static void SlideMonToOffset(struct Sprite *sprite)
{ {
u8 battlerId; u8 battlerId;
u8 spriteId; u8 monSpriteId;
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == 0)
battlerId = gBattleAnimAttacker; battlerId = gBattleAnimAttacker;
else else
battlerId = gBattleAnimTarget; battlerId = gBattleAnimTarget;
spriteId = gBattlerSpriteIds[battlerId]; monSpriteId = gBattlerSpriteIds[battlerId];
if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
{ {
gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[1] = -gBattleAnimArgs[1];
@@ -511,25 +513,25 @@ static void SlideMonToOffset(struct Sprite *sprite)
gBattleAnimArgs[2] = -gBattleAnimArgs[2]; gBattleAnimArgs[2] = -gBattleAnimArgs[2];
} }
sprite->data[0] = gBattleAnimArgs[4]; sprite->data[0] = gBattleAnimArgs[4];
sprite->data[1] = gSprites[spriteId].x; sprite->data[1] = gSprites[monSpriteId].x;
sprite->data[2] = gSprites[spriteId].x + gBattleAnimArgs[1]; sprite->data[2] = gSprites[monSpriteId].x + gBattleAnimArgs[1];
sprite->data[3] = gSprites[spriteId].y; sprite->data[3] = gSprites[monSpriteId].y;
sprite->data[4] = gSprites[spriteId].y + gBattleAnimArgs[2]; sprite->data[4] = gSprites[monSpriteId].y + gBattleAnimArgs[2];
InitSpriteDataForLinearTranslation(sprite); InitSpriteDataForLinearTranslation(sprite);
sprite->data[3] = 0; sprite->data[3] = 0;
sprite->data[4] = 0; sprite->data[4] = 0;
sprite->data[5] = spriteId; sprite->data[5] = monSpriteId;
sprite->invisible = TRUE; sprite->invisible = TRUE;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
sprite->callback = TranslateMonSpriteLinearFixedPoint; sprite->callback = TranslateSpriteLinearByIdFixedPoint;
} }
static void sub_8099394(struct Sprite *sprite) static void SlideMonToOffsetAndBack(struct Sprite *sprite)
{ {
u8 battlerId; u8 battlerId;
u8 spriteId; u8 spriteId;
sprite->invisible = TRUE; sprite->invisible = TRUE;
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == ANIM_ATTACKER)
battlerId = gBattleAnimAttacker; battlerId = gBattleAnimAttacker;
else else
battlerId = gBattleAnimTarget; battlerId = gBattleAnimTarget;
@@ -553,11 +555,11 @@ static void sub_8099394(struct Sprite *sprite)
if (gBattleAnimArgs[5] == 0) if (gBattleAnimArgs[5] == 0)
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
else else
StoreSpriteCallbackInData6(sprite, sub_809946C); StoreSpriteCallbackInData6(sprite, SlideMonToOffsetAndBack_End);
sprite->callback = TranslateMonSpriteLinearFixedPoint; sprite->callback = TranslateSpriteLinearByIdFixedPoint;
} }
static void sub_809946C(struct Sprite *sprite) static void SlideMonToOffsetAndBack_End(struct Sprite *sprite)
{ {
gSprites[sprite->data[5]].x2 = 0; gSprites[sprite->data[5]].x2 = 0;
gSprites[sprite->data[5]].y2 = 0; gSprites[sprite->data[5]].y2 = 0;
@@ -590,10 +592,10 @@ void AnimTask_WindUpLunge(u8 taskId)
gTasks[taskId].data[5] = gBattleAnimArgs[5] * 256 / gBattleAnimArgs[6]; gTasks[taskId].data[5] = gBattleAnimArgs[5] * 256 / gBattleAnimArgs[6];
gTasks[taskId].data[6] = gBattleAnimArgs[6]; gTasks[taskId].data[6] = gBattleAnimArgs[6];
gTasks[taskId].data[7] = wavePeriod; gTasks[taskId].data[7] = wavePeriod;
gTasks[taskId].func = AnimTask_WindUpLungePart1; gTasks[taskId].func = AnimTask_WindUpLunge_Step1;
} }
static void AnimTask_WindUpLungePart1(u8 taskId) static void AnimTask_WindUpLunge_Step1(u8 taskId)
{ {
u8 spriteId = gTasks[taskId].data[0]; u8 spriteId = gTasks[taskId].data[0];
gTasks[taskId].data[11] += gTasks[taskId].data[1]; gTasks[taskId].data[11] += gTasks[taskId].data[1];
@@ -601,10 +603,10 @@ static void AnimTask_WindUpLungePart1(u8 taskId)
gSprites[spriteId].y2 = Sin((u8)(gTasks[taskId].data[10] >> 8), gTasks[taskId].data[2]); gSprites[spriteId].y2 = Sin((u8)(gTasks[taskId].data[10] >> 8), gTasks[taskId].data[2]);
gTasks[taskId].data[10] += gTasks[taskId].data[7]; gTasks[taskId].data[10] += gTasks[taskId].data[7];
if (--gTasks[taskId].data[3] == 0) if (--gTasks[taskId].data[3] == 0)
gTasks[taskId].func = AnimTask_WindUpLungePart2; gTasks[taskId].func = AnimTask_WindUpLunge_Step2;
} }
static void AnimTask_WindUpLungePart2(u8 taskId) static void AnimTask_WindUpLunge_Step2(u8 taskId)
{ {
u8 spriteId; u8 spriteId;
@@ -620,17 +622,18 @@ static void AnimTask_WindUpLungePart2(u8 taskId)
} }
} }
// To move a mon off-screen when pushed out by Roar/Whirlwind
void AnimTask_SlideOffScreen(u8 taskId) void AnimTask_SlideOffScreen(u8 taskId)
{ {
u8 spriteId; u8 spriteId;
switch (gBattleAnimArgs[0]) switch (gBattleAnimArgs[0])
{ {
case 0: case ANIM_ATTACKER:
case 1: case ANIM_TARGET:
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
break; break;
case 2: case ANIM_ATK_PARTNER:
if (!IsBattlerSpriteVisible(gBattleAnimAttacker ^ BIT_FLANK)) if (!IsBattlerSpriteVisible(gBattleAnimAttacker ^ BIT_FLANK))
{ {
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
@@ -638,7 +641,7 @@ void AnimTask_SlideOffScreen(u8 taskId)
} }
spriteId = gBattlerSpriteIds[gBattleAnimAttacker ^ BIT_FLANK]; spriteId = gBattlerSpriteIds[gBattleAnimAttacker ^ BIT_FLANK];
break; break;
case 3: case ANIM_DEF_PARTNER:
if (!IsBattlerSpriteVisible(gBattleAnimTarget ^ BIT_FLANK)) if (!IsBattlerSpriteVisible(gBattleAnimTarget ^ BIT_FLANK))
{ {
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
@@ -655,14 +658,14 @@ void AnimTask_SlideOffScreen(u8 taskId)
gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].data[1] = gBattleAnimArgs[1];
else else
gTasks[taskId].data[1] = -gBattleAnimArgs[1]; gTasks[taskId].data[1] = -gBattleAnimArgs[1];
gTasks[taskId].func = sub_80996B8; gTasks[taskId].func = AnimTask_SlideOffScreen_Step;
} }
static void sub_80996B8(u8 taskId) static void AnimTask_SlideOffScreen_Step(u8 taskId)
{ {
u8 spriteId = gTasks[taskId].data[0]; u8 spriteId = gTasks[taskId].data[0];
gSprites[spriteId].x2 += gTasks[taskId].data[1]; gSprites[spriteId].x2 += gTasks[taskId].data[1];
if (gSprites[spriteId].x2 + gSprites[spriteId].x < -0x20 || gSprites[spriteId].x2 + gSprites[spriteId].x > 0x110) if (gSprites[spriteId].x2 + gSprites[spriteId].x < -32 || gSprites[spriteId].x2 + gSprites[spriteId].x > DISPLAY_WIDTH + 32)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
@@ -690,10 +693,10 @@ void AnimTask_SwayMon(u8 taskId)
else else
gTasks[taskId].data[5] = gBattleAnimTarget; gTasks[taskId].data[5] = gBattleAnimTarget;
gTasks[taskId].data[12] = 1; gTasks[taskId].data[12] = 1;
gTasks[taskId].func = AnimTask_SwayMonStep; gTasks[taskId].func = AnimTask_SwayMon_Step;
} }
static void AnimTask_SwayMonStep(u8 taskId) static void AnimTask_SwayMon_Step(u8 taskId)
{ {
u8 spriteId; u8 spriteId;
u32 waveIndex; u32 waveIndex;
@@ -745,10 +748,10 @@ void AnimTask_ScaleMonAndRestore(u8 taskId)
gTasks[taskId].data[4] = spriteId; gTasks[taskId].data[4] = spriteId;
gTasks[taskId].data[10] = 0x100; gTasks[taskId].data[10] = 0x100;
gTasks[taskId].data[11] = 0x100; gTasks[taskId].data[11] = 0x100;
gTasks[taskId].func = AnimTask_ScaleMonAndRestoreStep; gTasks[taskId].func = AnimTask_ScaleMonAndRestore_Step;
} }
static void AnimTask_ScaleMonAndRestoreStep(u8 taskId) static void AnimTask_ScaleMonAndRestore_Step(u8 taskId)
{ {
u8 spriteId; u8 spriteId;
gTasks[taskId].data[10] += gTasks[taskId].data[0]; gTasks[taskId].data[10] += gTasks[taskId].data[0];
@@ -789,7 +792,7 @@ void AnimTask_RotateMonSpriteToSide(u8 taskId)
gTasks[taskId].data[7] = 1; gTasks[taskId].data[7] = 1;
else else
{ {
if (gBattleAnimArgs[2] == 0) if (gBattleAnimArgs[2] == ANIM_ATTACKER)
gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : 0; gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : 0;
else else
gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER ? 1 : 0; gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER ? 1 : 0;
@@ -802,16 +805,17 @@ void AnimTask_RotateMonSpriteToSide(u8 taskId)
tmp = gTasks[taskId].data[4]; tmp = gTasks[taskId].data[4];
gTasks[taskId].data[4] = -tmp; gTasks[taskId].data[4] = -tmp;
} }
gTasks[taskId].func = sub_8099B54; gTasks[taskId].func = AnimTask_RotateMonSpriteToSide_Step;
} }
// Rotates mon to side and back to original position. For Peck and when a held item activates
void AnimTask_RotateMonToSideAndRestore(u8 taskId) void AnimTask_RotateMonToSideAndRestore(u8 taskId)
{ {
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]); u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]);
PrepareBattlerSpriteForRotScale(spriteId, 0); PrepareBattlerSpriteForRotScale(spriteId, 0);
gTasks[taskId].data[1] = 0; gTasks[taskId].data[1] = 0;
gTasks[taskId].data[2] = gBattleAnimArgs[0]; gTasks[taskId].data[2] = gBattleAnimArgs[0];
if (gBattleAnimArgs[2] == 0) if (gBattleAnimArgs[2] == ANIM_ATTACKER)
{ {
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[1] = -gBattleAnimArgs[1];
@@ -831,16 +835,15 @@ void AnimTask_RotateMonToSideAndRestore(u8 taskId)
gTasks[taskId].data[7] = 1; gTasks[taskId].data[7] = 1;
if (gTasks[taskId].data[7] ) if (gTasks[taskId].data[7] )
{ {
s16 tmp; s16 tmp = gTasks[taskId].data[3];
tmp = gTasks[taskId].data[3];
gTasks[taskId].data[3] = -tmp; gTasks[taskId].data[3] = -tmp;
tmp = gTasks[taskId].data[4]; tmp = gTasks[taskId].data[4];
gTasks[taskId].data[4] = -tmp; gTasks[taskId].data[4] = -tmp;
} }
gTasks[taskId].func = sub_8099B54; gTasks[taskId].func = AnimTask_RotateMonSpriteToSide_Step;
} }
static void sub_8099B54(u8 taskId) static void AnimTask_RotateMonSpriteToSide_Step(u8 taskId)
{ {
gTasks[taskId].data[3] += gTasks[taskId].data[4]; gTasks[taskId].data[3] += gTasks[taskId].data[4];
SetSpriteRotScale(gTasks[taskId].data[5], 0x100, 0x100, gTasks[taskId].data[3]); SetSpriteRotScale(gTasks[taskId].data[5], 0x100, 0x100, gTasks[taskId].data[3]);
@@ -895,10 +898,10 @@ void AnimTask_ShakeTargetBasedOnMovePowerOrDmg(u8 taskId)
gTasks[taskId].data[0] = 0; gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].data[1] = gBattleAnimArgs[1];
gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].data[2] = gBattleAnimArgs[2];
gTasks[taskId].func = sub_8099CB8; gTasks[taskId].func = AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step;
} }
static void sub_8099CB8(u8 taskId) static void AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
if (++task->data[0] > task->data[1]) if (++task->data[0] > task->data[1])
+349 -238
View File
File diff suppressed because it is too large Load Diff
+268 -187
View File
@@ -8,7 +8,7 @@
static void AnimConfusionDuck(struct Sprite *sprite); static void AnimConfusionDuck(struct Sprite *sprite);
static void AnimSimplePaletteBlend(struct Sprite *sprite); static void AnimSimplePaletteBlend(struct Sprite *sprite);
static void AnimComplexPaletteBlend(struct Sprite *sprite); static void AnimComplexPaletteBlend(struct Sprite *sprite);
static void sub_80B9B8C(struct Sprite *sprite); static void AnimCirclingSparkle(struct Sprite *sprite);
static void AnimShakeMonOrBattleTerrain(struct Sprite *sprite); static void AnimShakeMonOrBattleTerrain(struct Sprite *sprite);
static void AnimHitSplatBasic(struct Sprite *sprite); static void AnimHitSplatBasic(struct Sprite *sprite);
static void AnimHitSplatHandleInvert(struct Sprite *sprite); static void AnimHitSplatHandleInvert(struct Sprite *sprite);
@@ -17,22 +17,22 @@ static void AnimHitSplatOnMonEdge(struct Sprite *sprite);
static void AnimCrossImpact(struct Sprite *sprite); static void AnimCrossImpact(struct Sprite *sprite);
static void AnimFlashingHitSplat(struct Sprite *sprite); static void AnimFlashingHitSplat(struct Sprite *sprite);
static void AnimHitSplatPersistent(struct Sprite *sprite); static void AnimHitSplatPersistent(struct Sprite *sprite);
static void AnimConfusionDuckStep(struct Sprite *sprite); static void AnimConfusionDuck_Step(struct Sprite *sprite);
static void AnimSimplePaletteBlendStep(struct Sprite *sprite); static void AnimSimplePaletteBlend_Step(struct Sprite *sprite);
static void sub_80B9AD0(struct Sprite *sprite); static void AnimComplexPaletteBlend_Step1(struct Sprite *sprite);
static void sub_80B9B5C(struct Sprite *sprite); static void AnimComplexPaletteBlend_Step2(struct Sprite *sprite);
static void sub_80B9C2C(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount); static void BlendColorCycle(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
static void sub_80B9C7C(u8 taskId); static void AnimTask_BlendColorCycleLoop(u8 taskId);
static void sub_80B9DA0(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount); static void BlendColorCycleExclude(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
static void sub_80B9DF0(u8 taskId); static void AnimTask_BlendColorCycleExcludeLoop(u8 taskId);
static void sub_80B9EA8(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount); static void BlendColorCycleByTag(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
static void sub_80B9F04(u8 taskId); static void AnimTask_BlendColorCycleByTagLoop(u8 taskId);
static void sub_80B9FD8(u8 taskId); static void AnimTask_FlashAnimTagWithColor_Step1(u8 taskId);
static void sub_80BA090(u8 taskId); static void AnimTask_FlashAnimTagWithColor_Step2(u8 taskId);
static void sub_80BA3CC(void); static void AnimShakeMonOrBattleTerrain_UpdateCoordOffsetEnabled(void);
static void sub_80BA320(struct Sprite *sprite); static void AnimShakeMonOrBattleTerrain_Step(struct Sprite *sprite);
static void sub_80BA4D0(u8 taskId); static void AnimTask_ShakeBattleTerrain_Step(u8 taskId);
static void sub_80BA7BC(struct Sprite *sprite); static void AnimFlashingHitSplat_Step(struct Sprite *sprite);
static const union AnimCmd sAnim_ConfusionDuck_0[] = static const union AnimCmd sAnim_ConfusionDuck_0[] =
@@ -92,7 +92,7 @@ const struct SpriteTemplate gComplexPaletteBlendSpriteTemplate =
.callback = AnimComplexPaletteBlend, .callback = AnimComplexPaletteBlend,
}; };
static const union AnimCmd gUnknown_83E7B54[] = static const union AnimCmd sAnim_CirclingSparkle[] =
{ {
ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(0, 3),
ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(16, 3),
@@ -102,20 +102,21 @@ static const union AnimCmd gUnknown_83E7B54[] =
ANIMCMD_JUMP(0), ANIMCMD_JUMP(0),
}; };
static const union AnimCmd *const gUnknown_83E7B6C[] = static const union AnimCmd *const sAnims_CirclingSparkle[] =
{ {
gUnknown_83E7B54, sAnim_CirclingSparkle,
}; };
const struct SpriteTemplate gUnknown_83E7B70 = // Unused
static const struct SpriteTemplate sCirclingSparkleSpriteTemplate =
{ {
.tileTag = ANIM_TAG_SPARKLE_4, .tileTag = ANIM_TAG_SPARKLE_4,
.paletteTag = ANIM_TAG_SPARKLE_4, .paletteTag = ANIM_TAG_SPARKLE_4,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E7B6C, .anims = sAnims_CirclingSparkle,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80B9B8C, .callback = AnimCirclingSparkle,
}; };
const struct SpriteTemplate gShakeMonOrTerrainSpriteTemplate = const struct SpriteTemplate gShakeMonOrTerrainSpriteTemplate =
@@ -275,11 +276,11 @@ static void AnimConfusionDuck(struct Sprite *sprite)
StartSpriteAnim(sprite, 1); StartSpriteAnim(sprite, 1);
} }
sprite->data[3] = gBattleAnimArgs[4]; sprite->data[3] = gBattleAnimArgs[4];
sprite->callback = AnimConfusionDuckStep; sprite->callback = AnimConfusionDuck_Step;
sprite->callback(sprite); sprite->callback(sprite);
} }
static void AnimConfusionDuckStep(struct Sprite *sprite) static void AnimConfusionDuck_Step(struct Sprite *sprite)
{ {
sprite->x2 = Cos(sprite->data[0], 30); sprite->x2 = Cos(sprite->data[0], 30);
sprite->y2 = Sin(sprite->data[0], 10); sprite->y2 = Sin(sprite->data[0], 10);
@@ -300,36 +301,36 @@ static void AnimConfusionDuckStep(struct Sprite *sprite)
// arg 4: blend color // arg 4: blend color
static void AnimSimplePaletteBlend(struct Sprite *sprite) static void AnimSimplePaletteBlend(struct Sprite *sprite)
{ {
u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]); u32 selectedPalettes = UnpackSelectedBattlePalettes(gBattleAnimArgs[0]);
BeginNormalPaletteFade(selectedPalettes, gBattleAnimArgs[1], gBattleAnimArgs[2], gBattleAnimArgs[3], gBattleAnimArgs[4]); BeginNormalPaletteFade(selectedPalettes, gBattleAnimArgs[1], gBattleAnimArgs[2], gBattleAnimArgs[3], gBattleAnimArgs[4]);
sprite->invisible = TRUE; sprite->invisible = TRUE;
sprite->callback = AnimSimplePaletteBlendStep; sprite->callback = AnimSimplePaletteBlend_Step;
} }
// Unpacks a bitfield and returns a bitmask of its selected palettes. // Unpacks a bitfield and returns a bitmask of its selected palettes.
// Bits 0-6 of the selector parameter result in the following palettes being selected: // Bits 0-6 of the selector parameter result in the following palettes being selected:
// 0: battle background palettes (BG palettes 1, 2, and 3) // 0: F_PAL_BG, battle background palettes (BG palettes 1, 2, and 3)
// 1: gBattleAnimAttacker OBJ palette // 1: F_PAL_ATTACKER, gBattleAnimAttacker OBJ palette
// 2: gBattleAnimTarget OBJ palette // 2: F_PAL_TARGET, gBattleAnimTarget OBJ palette
// 3: gBattleAnimAttacker partner OBJ palette // 3: F_PAL_ATK_PARTNER, gBattleAnimAttacker partner OBJ palette
// 4: gBattleAnimTarget partner OBJ palette // 4: F_PAL_DEF_PARTNER, gBattleAnimTarget partner OBJ palette
// 5: BG palette 4 // 5: F_PAL_ANIM_1, BG palette 8
// 6: BG palette 5 // 6: F_PAL_ANIM_2, BG palette 9
u32 UnpackSelectedBattleAnimPalettes(s16 selector) u32 UnpackSelectedBattlePalettes(s16 selector)
{ {
u8 battleBackground = selector & 1; u8 battleBackground = selector & 1;
u8 attacker = (selector >> 1) & 1; u8 attacker = (selector >> 1) & 1;
u8 target = (selector >> 2) & 1; u8 target = (selector >> 2) & 1;
u8 attackerPartner = (selector >> 3) & 1; u8 attackerPartner = (selector >> 3) & 1;
u8 targetPartner = (selector >> 4) & 1; u8 targetPartner = (selector >> 4) & 1;
u8 arg5 = (selector >> 5) & 1; u8 anim1 = (selector >> 5) & 1;
u8 arg6 = (selector >> 6) & 1; u8 anim2 = (selector >> 6) & 1;
return SelectBattleAnimSpriteAndBgPalettes(battleBackground, attacker, target, attackerPartner, targetPartner, arg5, arg6); return GetBattlePalettesMask(battleBackground, attacker, target, attackerPartner, targetPartner, anim1, anim2);
} }
static void AnimSimplePaletteBlendStep(struct Sprite *sprite) static void AnimSimplePaletteBlend_Step(struct Sprite *sprite)
{ {
if (!gPaletteFade.active) if (!gPaletteFade.active)
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
@@ -347,13 +348,13 @@ static void AnimComplexPaletteBlend(struct Sprite *sprite)
sprite->data[5] = gBattleAnimArgs[5]; sprite->data[5] = gBattleAnimArgs[5];
sprite->data[6] = gBattleAnimArgs[6]; sprite->data[6] = gBattleAnimArgs[6];
sprite->data[7] = gBattleAnimArgs[0]; sprite->data[7] = gBattleAnimArgs[0];
selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]); selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]);
BlendPalettes(selectedPalettes, gBattleAnimArgs[4], gBattleAnimArgs[3]); BlendPalettes(selectedPalettes, gBattleAnimArgs[4], gBattleAnimArgs[3]);
sprite->invisible = TRUE; sprite->invisible = TRUE;
sprite->callback = sub_80B9AD0; sprite->callback = AnimComplexPaletteBlend_Step1;
} }
static void sub_80B9AD0(struct Sprite *sprite) static void AnimComplexPaletteBlend_Step1(struct Sprite *sprite)
{ {
u32 selectedPalettes; u32 selectedPalettes;
@@ -366,10 +367,10 @@ static void sub_80B9AD0(struct Sprite *sprite)
return; return;
if (sprite->data[2] == 0) if (sprite->data[2] == 0)
{ {
sprite->callback = sub_80B9B5C; sprite->callback = AnimComplexPaletteBlend_Step2;
return; return;
} }
selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]); selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]);
if (sprite->data[1] & 0x100) if (sprite->data[1] & 0x100)
BlendPalettes(selectedPalettes, sprite->data[4], sprite->data[3]); BlendPalettes(selectedPalettes, sprite->data[4], sprite->data[3]);
else else
@@ -379,19 +380,19 @@ static void sub_80B9AD0(struct Sprite *sprite)
--sprite->data[2]; --sprite->data[2];
} }
static void sub_80B9B5C(struct Sprite *sprite) static void AnimComplexPaletteBlend_Step2(struct Sprite *sprite)
{ {
u32 selectedPalettes; u32 selectedPalettes;
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]); selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]);
BlendPalettes(selectedPalettes, 0, 0); BlendPalettes(selectedPalettes, 0, 0);
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
} }
} }
static void sub_80B9B8C(struct Sprite *sprite) static void AnimCirclingSparkle(struct Sprite *sprite)
{ {
sprite->x += gBattleAnimArgs[0]; sprite->x += gBattleAnimArgs[0];
sprite->y += gBattleAnimArgs[1]; sprite->y += gBattleAnimArgs[1];
@@ -402,57 +403,75 @@ static void sub_80B9B8C(struct Sprite *sprite)
sprite->data[4] = 112; sprite->data[4] = 112;
sprite->data[5] = 0; sprite->data[5] = 0;
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
sprite->callback = TranslateSpriteInGrowingCircleOverDuration; sprite->callback = TranslateSpriteInGrowingCircle;
sprite->callback(sprite); sprite->callback(sprite);
} }
void AnimTask_CurseBlendEffect(u8 taskId) // Task data for AnimTask_BlendColorCycle, AnimTask_BlendColorCycleExclude, and AnimTask_BlendColorCycleByTag
#define tPalSelector data[0] // AnimTask_BlendColorCycle
#define tPalTag data[0] // AnimTask_BlendColorCycleByTag
#define tDelay data[1]
#define tNumBlends data[2]
#define tInitialBlendY data[3]
#define tTargetBlendY data[4]
#define tBlendColor data[5]
#define tRestoreBlend data[8]
#define tPalSelectorHi data[9]
#define tPalSelectorLo data[10]
// Blends mon/screen to designated color or back alternately tNumBlends times
// Many uses of this task only set a tNumBlends of 2, which has the effect of blending to a color and back once
void AnimTask_BlendColorCycle(u8 taskId)
{ {
gTasks[taskId].data[0] = gBattleAnimArgs[0]; gTasks[taskId].tPalSelector = gBattleAnimArgs[0];
gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].tDelay = gBattleAnimArgs[1];
gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].tNumBlends = gBattleAnimArgs[2];
gTasks[taskId].data[3] = gBattleAnimArgs[3]; gTasks[taskId].tInitialBlendY = gBattleAnimArgs[3];
gTasks[taskId].data[4] = gBattleAnimArgs[4]; gTasks[taskId].tTargetBlendY = gBattleAnimArgs[4];
gTasks[taskId].data[5] = gBattleAnimArgs[5]; gTasks[taskId].tBlendColor = gBattleAnimArgs[5];
gTasks[taskId].data[8] = 0; gTasks[taskId].tRestoreBlend = FALSE;
sub_80B9C2C(taskId, 0, gTasks[taskId].data[4]); BlendColorCycle(taskId, 0, gTasks[taskId].tTargetBlendY);
gTasks[taskId].func = sub_80B9C7C; gTasks[taskId].func = AnimTask_BlendColorCycleLoop;
} }
static void sub_80B9C2C(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount) static void BlendColorCycle(u8 taskId, u8 startBlendAmount, u8 targetBlendAmount)
{ {
u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gTasks[taskId].data[0]); u32 selectedPalettes = UnpackSelectedBattlePalettes(gTasks[taskId].tPalSelector);
BeginNormalPaletteFade(
BeginNormalPaletteFade(selectedPalettes, selectedPalettes,
gTasks[taskId].data[1], gTasks[taskId].tDelay,
initialBlendAmount, startBlendAmount,
targetBlendAmount, targetBlendAmount,
gTasks[taskId].data[5]); gTasks[taskId].tBlendColor);
--gTasks[taskId].data[2];
gTasks[taskId].data[8] ^= 1; gTasks[taskId].tNumBlends--;
gTasks[taskId].tRestoreBlend ^= 1;
} }
static void sub_80B9C7C(u8 taskId) static void AnimTask_BlendColorCycleLoop(u8 taskId)
{ {
u8 initialBlendAmount, targetBlendAmount; u8 startBlendAmount, targetBlendAmount;
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
if (gTasks[taskId].data[2] > 0) if (gTasks[taskId].tNumBlends > 0)
{ {
if (gTasks[taskId].data[8] == 0) if (!gTasks[taskId].tRestoreBlend)
{ {
initialBlendAmount = gTasks[taskId].data[3]; // Blend to designated color
targetBlendAmount = gTasks[taskId].data[4]; startBlendAmount = gTasks[taskId].tInitialBlendY;
targetBlendAmount = gTasks[taskId].tTargetBlendY;
} }
else else
{ {
initialBlendAmount = gTasks[taskId].data[4]; // Blend back to original color
targetBlendAmount = gTasks[taskId].data[3]; startBlendAmount = gTasks[taskId].tTargetBlendY;
targetBlendAmount = gTasks[taskId].tInitialBlendY;
} }
if (gTasks[taskId].data[2] == 1)
if (gTasks[taskId].tNumBlends == 1)
targetBlendAmount = 0; targetBlendAmount = 0;
sub_80B9C2C(taskId, initialBlendAmount, targetBlendAmount);
BlendColorCycle(taskId, startBlendAmount, targetBlendAmount);
} }
else else
{ {
@@ -461,64 +480,73 @@ static void sub_80B9C7C(u8 taskId)
} }
} }
// See AnimTask_BlendColorCycle. Same, but excludes Attacker and Target
void AnimTask_BlendColorCycleExclude(u8 taskId) void AnimTask_BlendColorCycleExclude(u8 taskId)
{ {
s32 battler; int battler;
u32 selectedPalettes = 0; u32 selectedPalettes = 0;
gTasks[taskId].data[0] = gBattleAnimArgs[0]; gTasks[taskId].data[0] = gBattleAnimArgs[0];
gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].tDelay = gBattleAnimArgs[1];
gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].tNumBlends = gBattleAnimArgs[2];
gTasks[taskId].data[3] = gBattleAnimArgs[3]; gTasks[taskId].tInitialBlendY = gBattleAnimArgs[3];
gTasks[taskId].data[4] = gBattleAnimArgs[4]; gTasks[taskId].tTargetBlendY = gBattleAnimArgs[4];
gTasks[taskId].data[5] = gBattleAnimArgs[5]; gTasks[taskId].tBlendColor = gBattleAnimArgs[5];
gTasks[taskId].data[8] = 0; gTasks[taskId].tRestoreBlend = 0;
for (battler = 0; battler < gBattlersCount; ++battler)
for (battler = 0; battler < gBattlersCount; battler++)
{
if (battler != gBattleAnimAttacker && battler != gBattleAnimTarget) if (battler != gBattleAnimAttacker && battler != gBattleAnimTarget)
selectedPalettes |= 1 << (battler + 16); selectedPalettes |= 1 << (battler + 16);
}
if (gBattleAnimArgs[0] == 1) if (gBattleAnimArgs[0] == 1)
selectedPalettes |= 0xE; selectedPalettes |= 0xE;
gTasks[taskId].data[9] = selectedPalettes >> 16;
gTasks[taskId].data[10] = selectedPalettes & 0xFF; gTasks[taskId].tPalSelectorHi = selectedPalettes >> 16;
sub_80B9DA0(taskId, 0, gTasks[taskId].data[4]); gTasks[taskId].tPalSelectorLo = selectedPalettes & 0xFF;
gTasks[taskId].func = sub_80B9DF0; BlendColorCycleExclude(taskId, 0, gTasks[taskId].tTargetBlendY);
gTasks[taskId].func = AnimTask_BlendColorCycleExcludeLoop;
} }
static void sub_80B9DA0(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount) static void BlendColorCycleExclude(u8 taskId, u8 startBlendAmount, u8 targetBlendAmount)
{ {
u32 selectedPalettes = ((u16)gTasks[taskId].data[9] << 16) | (u16)gTasks[taskId].data[10]; u32 selectedPalettes = ((u16)gTasks[taskId].tPalSelectorHi << 16) | (u16)gTasks[taskId].tPalSelectorLo;
BeginNormalPaletteFade(
BeginNormalPaletteFade(selectedPalettes, selectedPalettes,
gTasks[taskId].data[1], gTasks[taskId].tDelay,
initialBlendAmount, startBlendAmount,
targetBlendAmount, targetBlendAmount,
gTasks[taskId].data[5]); gTasks[taskId].tBlendColor);
--gTasks[taskId].data[2];
gTasks[taskId].data[8] ^= 1; gTasks[taskId].tNumBlends--;
gTasks[taskId].tRestoreBlend ^= 1;
} }
static void sub_80B9DF0(u8 taskId) static void AnimTask_BlendColorCycleExcludeLoop(u8 taskId)
{ {
u8 initialBlendAmount, targetBlendAmount; u8 startBlendAmount, targetBlendAmount;
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
if (gTasks[taskId].data[2] > 0) if (gTasks[taskId].tNumBlends > 0)
{ {
if (gTasks[taskId].data[8] == 0) if (!gTasks[taskId].tRestoreBlend)
{ {
initialBlendAmount = gTasks[taskId].data[3]; // Blend to designated color
targetBlendAmount = gTasks[taskId].data[4]; startBlendAmount = gTasks[taskId].tInitialBlendY;
targetBlendAmount = gTasks[taskId].tTargetBlendY;
} }
else else
{ {
initialBlendAmount = gTasks[taskId].data[4]; // Blend back to original color
targetBlendAmount = gTasks[taskId].data[3]; startBlendAmount = gTasks[taskId].tTargetBlendY;
targetBlendAmount = gTasks[taskId].tInitialBlendY;
} }
if (gTasks[taskId].data[2] == 1) if (gTasks[taskId].tNumBlends == 1)
targetBlendAmount = 0; targetBlendAmount = 0;
sub_80B9DA0(taskId, initialBlendAmount, targetBlendAmount);
BlendColorCycleExclude(taskId, startBlendAmount, targetBlendAmount);
} }
else else
{ {
@@ -527,56 +555,59 @@ static void sub_80B9DF0(u8 taskId)
} }
} }
// See AnimTask_BlendColorCycle. Same, but selects palette by ANIM_TAG_*
void AnimTask_BlendColorCycleByTag(u8 taskId) void AnimTask_BlendColorCycleByTag(u8 taskId)
{ {
u8 paletteIndex; gTasks[taskId].tPalTag = gBattleAnimArgs[0];
gTasks[taskId].tDelay = gBattleAnimArgs[1];
gTasks[taskId].tNumBlends = gBattleAnimArgs[2];
gTasks[taskId].tInitialBlendY = gBattleAnimArgs[3];
gTasks[taskId].tTargetBlendY = gBattleAnimArgs[4];
gTasks[taskId].tBlendColor = gBattleAnimArgs[5];
gTasks[taskId].tRestoreBlend = FALSE;
gTasks[taskId].data[0] = gBattleAnimArgs[0]; BlendColorCycleByTag(taskId, 0, gTasks[taskId].tTargetBlendY);
gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].func = AnimTask_BlendColorCycleByTagLoop;
gTasks[taskId].data[2] = gBattleAnimArgs[2];
gTasks[taskId].data[3] = gBattleAnimArgs[3];
gTasks[taskId].data[4] = gBattleAnimArgs[4];
gTasks[taskId].data[5] = gBattleAnimArgs[5];
gTasks[taskId].data[8] = 0;
sub_80B9EA8(taskId, 0, gTasks[taskId].data[4]);
gTasks[taskId].func = sub_80B9F04;
} }
static void sub_80B9EA8(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount) static void BlendColorCycleByTag(u8 taskId, u8 startBlendAmount, u8 targetBlendAmount)
{ {
u8 paletteIndex = IndexOfSpritePaletteTag(gTasks[taskId].data[0]); u8 paletteIndex = IndexOfSpritePaletteTag(gTasks[taskId].tPalTag);
BeginNormalPaletteFade(
BeginNormalPaletteFade(1 << (paletteIndex + 16), 1 << (paletteIndex + 16),
gTasks[taskId].data[1], gTasks[taskId].tDelay,
initialBlendAmount, startBlendAmount,
targetBlendAmount, targetBlendAmount,
gTasks[taskId].data[5]); gTasks[taskId].tBlendColor);
--gTasks[taskId].data[2];
gTasks[taskId].data[8] ^= 1; gTasks[taskId].tNumBlends--;
gTasks[taskId].tRestoreBlend ^= 1;
} }
static void sub_80B9F04(u8 taskId) static void AnimTask_BlendColorCycleByTagLoop(u8 taskId)
{ {
u8 initialBlendAmount, targetBlendAmount; u8 startBlendAmount, targetBlendAmount;
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
if (gTasks[taskId].data[2] > 0) if (gTasks[taskId].tNumBlends > 0)
{ {
if (gTasks[taskId].data[8] == 0) if (!gTasks[taskId].tRestoreBlend)
{ {
initialBlendAmount = gTasks[taskId].data[3]; // Blend to designated color
targetBlendAmount = gTasks[taskId].data[4]; startBlendAmount = gTasks[taskId].tInitialBlendY;
targetBlendAmount = gTasks[taskId].tTargetBlendY;
} }
else else
{ {
initialBlendAmount = gTasks[taskId].data[4]; // Blend back to original color
targetBlendAmount = gTasks[taskId].data[3]; startBlendAmount = gTasks[taskId].tTargetBlendY;
targetBlendAmount = gTasks[taskId].tInitialBlendY;
} }
if (gTasks[taskId].data[2] == 1) if (gTasks[taskId].tNumBlends == 1)
targetBlendAmount = 0; targetBlendAmount = 0;
sub_80B9EA8(taskId, initialBlendAmount, targetBlendAmount);
BlendColorCycleByTag(taskId, startBlendAmount, targetBlendAmount);
} }
else else
{ {
@@ -585,6 +616,18 @@ static void sub_80B9F04(u8 taskId)
} }
} }
#undef tPalSelector
#undef tPalTag
#undef tDelay
#undef tNumBlends
#undef tInitialBlendY
#undef tTargetBlendY
#undef tBlendColor
#undef tRestoreBlend
#undef tPalSelectorHi
#undef tPalSelectorLo
// Flashes the specified anim tag with given color. Used e.g. to flash the particles red in Hyper Beam
void AnimTask_FlashAnimTagWithColor(u8 taskId) void AnimTask_FlashAnimTagWithColor(u8 taskId)
{ {
u8 paletteIndex; u8 paletteIndex;
@@ -603,10 +646,10 @@ void AnimTask_FlashAnimTagWithColor(u8 taskId)
gBattleAnimArgs[4], gBattleAnimArgs[4],
gBattleAnimArgs[4], gBattleAnimArgs[4],
gBattleAnimArgs[3]); gBattleAnimArgs[3]);
gTasks[taskId].func = sub_80B9FD8; gTasks[taskId].func = AnimTask_FlashAnimTagWithColor_Step1;
} }
static void sub_80B9FD8(u8 taskId) static void AnimTask_FlashAnimTagWithColor_Step1(u8 taskId)
{ {
u32 selectedPalettes; u32 selectedPalettes;
@@ -619,7 +662,7 @@ static void sub_80B9FD8(u8 taskId)
return; return;
if (gTasks[taskId].data[2] == 0) if (gTasks[taskId].data[2] == 0)
{ {
gTasks[taskId].func = sub_80BA090; gTasks[taskId].func = AnimTask_FlashAnimTagWithColor_Step2;
return; return;
} }
selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].data[7]) + 16); selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].data[7]) + 16);
@@ -640,7 +683,7 @@ static void sub_80B9FD8(u8 taskId)
--gTasks[taskId].data[2]; --gTasks[taskId].data[2];
} }
static void sub_80BA090(u8 taskId) static void AnimTask_FlashAnimTagWithColor_Step2(u8 taskId)
{ {
u32 selectedPalettes; u32 selectedPalettes;
@@ -659,7 +702,7 @@ void AnimTask_InvertScreenColor(u8 taskId)
u8 targetBattler = gBattleAnimTarget; u8 targetBattler = gBattleAnimTarget;
if (gBattleAnimArgs[0] & 0x100) if (gBattleAnimArgs[0] & 0x100)
selectedPalettes = SelectBattleAnimSpriteAndBgPalettes(1, 0, 0, 0, 0, 0, 0); selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);
if (gBattleAnimArgs[1] & 0x100) if (gBattleAnimArgs[1] & 0x100)
selectedPalettes |= (0x10000 << attackerBattler); selectedPalettes |= (0x10000 << attackerBattler);
if (gBattleAnimArgs[2] & 0x100) if (gBattleAnimArgs[2] & 0x100)
@@ -668,8 +711,16 @@ void AnimTask_InvertScreenColor(u8 taskId)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
// not used // Unused
static void sub_80BA16C(u8 taskId) #define tTimer data[0]
#define tLength data[1]
#define tFlagsScenery data[2]
#define tFlagsAttacker data[3]
#define tFlagsTarget data[4]
#define tColorR data[5]
#define tColorG data[6]
#define tColorB data[7]
static void AnimTask_TintPalettes(u8 taskId)
{ {
u8 attackerBattler; u8 attackerBattler;
u8 targetBattler; u8 targetBattler;
@@ -708,6 +759,15 @@ static void sub_80BA16C(u8 taskId)
} }
} }
#undef tTimer
#undef tLength
#undef tFlagsScenery
#undef tFlagsAttacker
#undef tFlagsTarget
#undef tColorR
#undef tColorG
#undef tColorB
static void AnimShakeMonOrBattleTerrain(struct Sprite *sprite) static void AnimShakeMonOrBattleTerrain(struct Sprite *sprite)
{ {
u16 var0; u16 var0;
@@ -737,11 +797,11 @@ static void AnimShakeMonOrBattleTerrain(struct Sprite *sprite)
sprite->data[5] = gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[3];
var0 = sprite->data[5] - 2; var0 = sprite->data[5] - 2;
if (var0 < 2) if (var0 < 2)
sub_80BA3CC(); AnimShakeMonOrBattleTerrain_UpdateCoordOffsetEnabled();
sprite->callback = sub_80BA320; sprite->callback = AnimShakeMonOrBattleTerrain_Step;
} }
static void sub_80BA320(struct Sprite *sprite) static void AnimShakeMonOrBattleTerrain_Step(struct Sprite *sprite)
{ {
u8 i; u8 i;
u16 var0; u16 var0;
@@ -766,58 +826,70 @@ static void sub_80BA320(struct Sprite *sprite)
var0 = sprite->data[5] - 2; var0 = sprite->data[5] - 2;
if (var0 < 2) if (var0 < 2)
for (i = 0; i < gBattlersCount; ++i) for (i = 0; i < gBattlersCount; ++i)
gSprites[gBattlerSpriteIds[i]].coordOffsetEnabled = 0; gSprites[gBattlerSpriteIds[i]].coordOffsetEnabled = FALSE;
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
} }
} }
static void sub_80BA3CC(void) static void AnimShakeMonOrBattleTerrain_UpdateCoordOffsetEnabled(void)
{ {
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = 0; gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = FALSE;
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = 0; gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = FALSE;
if (gBattleAnimArgs[4] == 2) if (gBattleAnimArgs[4] == 2)
{ {
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = 1; gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = TRUE;
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = 1; gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = TRUE;
} }
else else
{ {
if (gBattleAnimArgs[4] == 0) if (gBattleAnimArgs[4] == 0)
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = 1; gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = TRUE;
else else
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = 1; gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = TRUE;
} }
} }
// Task data for AnimTask_ShakeBattleTerrain
#define tXOffset data[0]
#define tYOffset data[1]
#define tNumShakes data[2]
#define tTimer data[3]
#define tShakeDelay data[8]
// Can shake battle terrain back and forth on the X or down and back to original pos on Y (cant shake up from orig pos)
// arg0: x offset of shake
// arg1: y offset of shake
// arg2: number of shakes
// arg3: time between shakes
void AnimTask_ShakeBattleTerrain(u8 taskId) void AnimTask_ShakeBattleTerrain(u8 taskId)
{ {
gTasks[taskId].data[0] = gBattleAnimArgs[0]; gTasks[taskId].tXOffset = gBattleAnimArgs[0];
gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].tYOffset = gBattleAnimArgs[1];
gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].tNumShakes = gBattleAnimArgs[2];
gTasks[taskId].data[3] = gBattleAnimArgs[3]; gTasks[taskId].tTimer = gBattleAnimArgs[3];
gTasks[taskId].data[8] = gBattleAnimArgs[3]; gTasks[taskId].tShakeDelay = gBattleAnimArgs[3];
gBattle_BG3_X = gBattleAnimArgs[0]; gBattle_BG3_X = gBattleAnimArgs[0];
gBattle_BG3_Y = gBattleAnimArgs[1]; gBattle_BG3_Y = gBattleAnimArgs[1];
gTasks[taskId].func = sub_80BA4D0; gTasks[taskId].func = AnimTask_ShakeBattleTerrain_Step;
gTasks[taskId].func(taskId); gTasks[taskId].func(taskId);
} }
static void sub_80BA4D0(u8 taskId) static void AnimTask_ShakeBattleTerrain_Step(u8 taskId)
{ {
if (gTasks[taskId].data[3] == 0) if (gTasks[taskId].tTimer == 0)
{ {
if (gBattle_BG3_X == gTasks[taskId].data[0]) if (gBattle_BG3_X == gTasks[taskId].tXOffset)
gBattle_BG3_X = -gTasks[taskId].data[0]; gBattle_BG3_X = -gTasks[taskId].tXOffset;
else else
gBattle_BG3_X = gTasks[taskId].data[0]; gBattle_BG3_X = gTasks[taskId].tXOffset;
if (gBattle_BG3_Y == -gTasks[taskId].data[1]) if (gBattle_BG3_Y == -gTasks[taskId].tYOffset)
gBattle_BG3_Y = 0; gBattle_BG3_Y = 0;
else else
gBattle_BG3_Y = -gTasks[taskId].data[1]; gBattle_BG3_Y = -gTasks[taskId].tYOffset;
gTasks[taskId].data[3] = gTasks[taskId].data[8]; gTasks[taskId].tTimer = gTasks[taskId].tShakeDelay;
if (--gTasks[taskId].data[2] == 0) if (--gTasks[taskId].tNumShakes == 0)
{ {
gBattle_BG3_X = 0; gBattle_BG3_X = 0;
gBattle_BG3_Y = 0; gBattle_BG3_Y = 0;
@@ -826,26 +898,33 @@ static void sub_80BA4D0(u8 taskId)
} }
else else
{ {
--gTasks[taskId].data[3]; gTasks[taskId].tTimer--;
} }
} }
#undef tXOffset
#undef tYOffset
#undef tNumShakes
#undef tTimer
#undef tShakeDelay
static void AnimHitSplatBasic(struct Sprite *sprite) static void AnimHitSplatBasic(struct Sprite *sprite)
{ {
StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);
if (gBattleAnimArgs[2] == 0) if (gBattleAnimArgs[2] == 0)
InitSpritePosToAnimAttacker(sprite, 1); InitSpritePosToAnimAttacker(sprite, TRUE);
else else
InitSpritePosToAnimTarget(sprite, TRUE); InitSpritePosToAnimTarget(sprite, TRUE);
sprite->callback = RunStoredCallbackWhenAffineAnimEnds; sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
} }
// Same as basic hit splat but takes a length of time to persist for (arg4)
static void AnimHitSplatPersistent(struct Sprite *sprite) static void AnimHitSplatPersistent(struct Sprite *sprite)
{ {
StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);
if (gBattleAnimArgs[2] == 0) if (gBattleAnimArgs[2] == 0)
InitSpritePosToAnimAttacker(sprite, 1); InitSpritePosToAnimAttacker(sprite, TRUE);
else else
InitSpritePosToAnimTarget(sprite, TRUE); InitSpritePosToAnimTarget(sprite, TRUE);
sprite->data[0] = gBattleAnimArgs[4]; sprite->data[0] = gBattleAnimArgs[4];
@@ -853,6 +932,8 @@ static void AnimHitSplatPersistent(struct Sprite *sprite)
StoreSpriteCallbackInData6(sprite, DestroyAnimSpriteAfterTimer); StoreSpriteCallbackInData6(sprite, DestroyAnimSpriteAfterTimer);
} }
// For paired hit splats whose position is inverted when used by the opponent on the player.
// Used by Twineedle and Spike Cannon
static void AnimHitSplatHandleInvert(struct Sprite *sprite) static void AnimHitSplatHandleInvert(struct Sprite *sprite)
{ {
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER && !IsContest()) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER && !IsContest())
@@ -865,8 +946,8 @@ static void AnimHitSplatRandom(struct Sprite *sprite)
if (gBattleAnimArgs[1] == -1) if (gBattleAnimArgs[1] == -1)
gBattleAnimArgs[1] = Random() & 3; gBattleAnimArgs[1] = Random() & 3;
StartSpriteAffineAnim(sprite, gBattleAnimArgs[1]); StartSpriteAffineAnim(sprite, gBattleAnimArgs[1]);
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == ANIM_ATTACKER)
InitSpritePosToAnimAttacker(sprite, 0); InitSpritePosToAnimAttacker(sprite, FALSE);
else else
InitSpritePosToAnimTarget(sprite, FALSE); InitSpritePosToAnimTarget(sprite, FALSE);
sprite->x2 += (Random() % 48) - 24; sprite->x2 += (Random() % 48) - 24;
@@ -889,8 +970,8 @@ static void AnimHitSplatOnMonEdge(struct Sprite *sprite)
static void AnimCrossImpact(struct Sprite *sprite) static void AnimCrossImpact(struct Sprite *sprite)
{ {
if (gBattleAnimArgs[2] == 0) if (gBattleAnimArgs[2] == ANIM_ATTACKER)
InitSpritePosToAnimAttacker(sprite, 1); InitSpritePosToAnimAttacker(sprite, TRUE);
else else
InitSpritePosToAnimTarget(sprite, TRUE); InitSpritePosToAnimTarget(sprite, TRUE);
sprite->data[0] = gBattleAnimArgs[3]; sprite->data[0] = gBattleAnimArgs[3];
@@ -901,14 +982,14 @@ static void AnimCrossImpact(struct Sprite *sprite)
static void AnimFlashingHitSplat(struct Sprite *sprite) static void AnimFlashingHitSplat(struct Sprite *sprite)
{ {
StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);
if (gBattleAnimArgs[2] == 0) if (gBattleAnimArgs[2] == ANIM_ATTACKER)
InitSpritePosToAnimAttacker(sprite, 1); InitSpritePosToAnimAttacker(sprite, TRUE);
else else
InitSpritePosToAnimTarget(sprite, TRUE); InitSpritePosToAnimTarget(sprite, TRUE);
sprite->callback = sub_80BA7BC; sprite->callback = AnimFlashingHitSplat_Step;
} }
static void sub_80BA7BC(struct Sprite *sprite) static void AnimFlashingHitSplat_Step(struct Sprite *sprite)
{ {
sprite->invisible ^= 1; sprite->invisible ^= 1;
if (sprite->data[0]++ > 12) if (sprite->data[0]++ > 12)
+12 -12
View File
@@ -7,10 +7,10 @@ static void AnimAcidPoisonBubble(struct Sprite *sprite);
static void AnimSludgeBombHitParticle(struct Sprite *sprite); static void AnimSludgeBombHitParticle(struct Sprite *sprite);
static void AnimAcidPoisonDroplet(struct Sprite *sprite); static void AnimAcidPoisonDroplet(struct Sprite *sprite);
static void AnimBubbleEffect(struct Sprite *sprite); static void AnimBubbleEffect(struct Sprite *sprite);
static void sub_80B1684(struct Sprite *sprite); static void AnimSludgeProjectile_Step(struct Sprite *sprite);
static void sub_80B1728(struct Sprite *sprite); static void AnimAcidPoisonBubble_Step(struct Sprite *sprite);
static void sub_80B1798(struct Sprite *sprite); static void AnimSludgeBombHitParticle_Step(struct Sprite *sprite);
static void AnimBubbleEffectStep(struct Sprite *sprite); static void AnimBubbleEffect_Step(struct Sprite *sprite);
static const union AnimCmd sAnim_ToxicBubble[] = static const union AnimCmd sAnim_ToxicBubble[] =
{ {
@@ -194,10 +194,10 @@ static void AnimSludgeProjectile(struct Sprite *sprite)
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
sprite->data[5] = -30; sprite->data[5] = -30;
InitAnimArcTranslation(sprite); InitAnimArcTranslation(sprite);
sprite->callback = sub_80B1684; sprite->callback = AnimSludgeProjectile_Step;
} }
static void sub_80B1684(struct Sprite *sprite) static void AnimSludgeProjectile_Step(struct Sprite *sprite)
{ {
if (TranslateAnimHorizontalArc(sprite)) if (TranslateAnimHorizontalArc(sprite))
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
@@ -218,10 +218,10 @@ static void AnimAcidPoisonBubble(struct Sprite *sprite)
sprite->data[4] = l2 + gBattleAnimArgs[5]; sprite->data[4] = l2 + gBattleAnimArgs[5];
sprite->data[5] = -30; sprite->data[5] = -30;
InitAnimArcTranslation(sprite); InitAnimArcTranslation(sprite);
sprite->callback = sub_80B1728; sprite->callback = AnimAcidPoisonBubble_Step;
} }
static void sub_80B1728(struct Sprite *sprite) static void AnimAcidPoisonBubble_Step(struct Sprite *sprite)
{ {
if (TranslateAnimHorizontalArc(sprite)) if (TranslateAnimHorizontalArc(sprite))
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
@@ -237,10 +237,10 @@ static void AnimSludgeBombHitParticle(struct Sprite *sprite)
InitSpriteDataForLinearTranslation(sprite); InitSpriteDataForLinearTranslation(sprite);
sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2]; sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2];
sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2]; sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2];
sprite->callback = sub_80B1798; sprite->callback = AnimSludgeBombHitParticle_Step;
} }
static void sub_80B1798(struct Sprite *sprite) static void AnimSludgeBombHitParticle_Step(struct Sprite *sprite)
{ {
TranslateSpriteLinearFixedPoint(sprite); TranslateSpriteLinearFixedPoint(sprite);
sprite->data[1] -= sprite->data[5]; sprite->data[1] -= sprite->data[5];
@@ -284,10 +284,10 @@ static void AnimBubbleEffect(struct Sprite *sprite)
sprite->x += gBattleAnimArgs[0]; sprite->x += gBattleAnimArgs[0];
sprite->y += gBattleAnimArgs[1]; sprite->y += gBattleAnimArgs[1];
} }
sprite->callback = AnimBubbleEffectStep; sprite->callback = AnimBubbleEffect_Step;
} }
static void AnimBubbleEffectStep(struct Sprite *sprite) static void AnimBubbleEffect_Step(struct Sprite *sprite)
{ {
sprite->data[0] = (sprite->data[0] + 0xB) & 0xFF; sprite->data[0] = (sprite->data[0] + 0xB) & 0xFF;
sprite->x2 = Sin(sprite->data[0], 4); sprite->x2 = Sin(sprite->data[0], 4);
+54 -45
View File
@@ -12,18 +12,18 @@ static void AnimQuestionMark(struct Sprite *sprite);
static void AnimRedX(struct Sprite *sprite); static void AnimRedX(struct Sprite *sprite);
static void AnimSkillSwapOrb(struct Sprite *sprite); static void AnimSkillSwapOrb(struct Sprite *sprite);
static void AnimPsychoBoost(struct Sprite *sprite); static void AnimPsychoBoost(struct Sprite *sprite);
static void sub_80B300C(struct Sprite *sprite); static void AnimDefensiveWall_Step2(struct Sprite *sprite);
static void sub_80B3044(struct Sprite *sprite); static void AnimDefensiveWall_Step3(struct Sprite *sprite);
static void sub_80B30B0(struct Sprite *sprite); static void AnimDefensiveWall_Step4(struct Sprite *sprite);
static void sub_80B3168(struct Sprite *sprite); static void AnimDefensiveWall_Step5(struct Sprite *sprite);
static void sub_80B3384(struct Sprite *sprite); static void AnimQuestionMark_Step1(struct Sprite *sprite);
static void sub_80B33B8(struct Sprite *sprite); static void AnimQuestionMark_Step2(struct Sprite *sprite);
static void sub_80B3454(u8 taskId); static void AnimTask_MeditateStretchAttacker_Step(u8 taskId);
static void sub_80B34DC(u8 taskId); static void AnimTask_Teleport_Step(u8 taskId);
static void sub_80B3618(u8 taskId); static void AnimTask_ImprisonOrbs_Step(u8 taskId);
static void sub_80B3980(u8 taskId); static void AnimTask_SkillSwap_Step(u8 taskId);
static void sub_80B3B78(u8 taskId); static void AnimTask_ExtrasensoryDistortion_Step(u8 taskId);
static void sub_80B3D78(u8 taskId); static void AnimTask_TransparentCloneGrowAndShrink_Step(u8 taskId);
static const union AffineAnimCmd sAffineAnim_PsychUpSpiral[] = static const union AffineAnimCmd sAffineAnim_PsychUpSpiral[] =
{ {
@@ -415,6 +415,7 @@ const struct SpriteTemplate gPsychoBoostOrbSpriteTemplate =
.callback = AnimPsychoBoost, .callback = AnimPsychoBoost,
}; };
// For the rectangular wall sprite used by Reflect, Mirror Coat, etc
static void AnimDefensiveWall(struct Sprite *sprite) static void AnimDefensiveWall(struct Sprite *sprite)
{ {
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || IsContest()) if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || IsContest())
@@ -459,20 +460,22 @@ static void AnimDefensiveWall(struct Sprite *sprite)
if (IsContest()) if (IsContest())
sprite->y += 9; sprite->y += 9;
sprite->data[0] = 256 + IndexOfSpritePaletteTag(gBattleAnimArgs[2]) * 16; sprite->data[0] = 256 + IndexOfSpritePaletteTag(gBattleAnimArgs[2]) * 16;
sprite->callback = sub_80B300C; sprite->callback = AnimDefensiveWall_Step2;
sub_80B300C(sprite); sprite->callback(sprite);
} }
static void sub_80B300C(struct Sprite *sprite) // AnimDefensiveWall_Step1 is removed in FRLG from the removal of Contest handling
static void AnimDefensiveWall_Step2(struct Sprite *sprite)
{ {
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3])); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3]));
if (sprite->data[3] == 13) if (sprite->data[3] == 13)
sprite->callback = sub_80B3044; sprite->callback = AnimDefensiveWall_Step3;
else else
++sprite->data[3]; ++sprite->data[3];
} }
static void sub_80B3044(struct Sprite *sprite) static void AnimDefensiveWall_Step3(struct Sprite *sprite)
{ {
u16 color; u16 color;
u16 startOffset; u16 startOffset;
@@ -487,11 +490,11 @@ static void sub_80B3044(struct Sprite *sprite)
gPlttBufferFaded[startOffset + i] = gPlttBufferFaded[startOffset + i - 1]; gPlttBufferFaded[startOffset + i] = gPlttBufferFaded[startOffset + i - 1];
gPlttBufferFaded[startOffset + 1] = color; gPlttBufferFaded[startOffset + 1] = color;
if (++sprite->data[2] == 16) if (++sprite->data[2] == 16)
sprite->callback = sub_80B30B0; sprite->callback = AnimDefensiveWall_Step4;
} }
} }
static void sub_80B30B0(struct Sprite *sprite) static void AnimDefensiveWall_Step4(struct Sprite *sprite)
{ {
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3])); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3]));
if (--sprite->data[3] == -1) if (--sprite->data[3] == -1)
@@ -508,11 +511,11 @@ static void sub_80B30B0(struct Sprite *sprite)
gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; gSprites[gBattlerSpriteIds[battler]].invisible = FALSE;
} }
sprite->invisible = TRUE; sprite->invisible = TRUE;
sprite->callback = sub_80B3168; sprite->callback = AnimDefensiveWall_Step5;
} }
} }
static void sub_80B3168(struct Sprite *sprite) static void AnimDefensiveWall_Step5(struct Sprite *sprite)
{ {
if (!IsContest()) if (!IsContest())
{ {
@@ -531,13 +534,14 @@ static void sub_80B3168(struct Sprite *sprite)
sprite->callback = DestroyAnimSprite; sprite->callback = DestroyAnimSprite;
} }
// Animates the sparkle that appears during Reflect or Light Screen/Mirror Coat
static void AnimWallSparkle(struct Sprite *sprite) static void AnimWallSparkle(struct Sprite *sprite)
{ {
if (sprite->data[0] == 0) if (sprite->data[0] == 0)
{ {
int arg3 = gBattleAnimArgs[3]; bool32 ignoreOffsets = gBattleAnimArgs[3];
bool8 respectMonPicOffsets = FALSE; bool8 respectMonPicOffsets = FALSE;
if (arg3 == 0) if (!ignoreOffsets)
respectMonPicOffsets = TRUE; respectMonPicOffsets = TRUE;
if (!IsContest() && IsDoubleBattle()) if (!IsContest() && IsDoubleBattle())
{ {
@@ -589,6 +593,7 @@ static void AnimBentSpoon(struct Sprite *sprite)
sprite->callback = RunStoredCallbackWhenAnimEnds; sprite->callback = RunStoredCallbackWhenAnimEnds;
} }
// Used by Amnesia
static void AnimQuestionMark(struct Sprite *sprite) static void AnimQuestionMark(struct Sprite *sprite)
{ {
s16 x = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 2; s16 x = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 2;
@@ -600,20 +605,20 @@ static void AnimQuestionMark(struct Sprite *sprite)
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + y; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + y;
if (sprite->y < 16) if (sprite->y < 16)
sprite->y = 16; sprite->y = 16;
StoreSpriteCallbackInData6(sprite, sub_80B3384); StoreSpriteCallbackInData6(sprite, AnimQuestionMark_Step1);
sprite->callback = RunStoredCallbackWhenAnimEnds; sprite->callback = RunStoredCallbackWhenAnimEnds;
} }
static void sub_80B3384(struct Sprite *sprite) static void AnimQuestionMark_Step1(struct Sprite *sprite)
{ {
sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL;
sprite->affineAnims = sAffineAnims_QuestionMark; sprite->affineAnims = sAffineAnims_QuestionMark;
sprite->data[0] = 0; sprite->data[0] = 0;
InitSpriteAffineAnim(sprite); InitSpriteAffineAnim(sprite);
sprite->callback = sub_80B33B8; sprite->callback = AnimQuestionMark_Step2;
} }
static void sub_80B33B8(struct Sprite *sprite) static void AnimQuestionMark_Step2(struct Sprite *sprite)
{ {
switch (sprite->data[0]) switch (sprite->data[0])
{ {
@@ -640,10 +645,10 @@ void AnimTask_MeditateStretchAttacker(u8 taskId)
task->data[0] = spriteId; task->data[0] = spriteId;
PrepareAffineAnimInTaskData(task, spriteId, sAffineAnim_MeditateStretchAttacker); PrepareAffineAnimInTaskData(task, spriteId, sAffineAnim_MeditateStretchAttacker);
task->func = sub_80B3454; task->func = AnimTask_MeditateStretchAttacker_Step;
} }
static void sub_80B3454(u8 taskId) static void AnimTask_MeditateStretchAttacker_Step(u8 taskId)
{ {
if (!RunAffineAnimFromTaskData(&gTasks[taskId])) if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
@@ -659,10 +664,10 @@ void AnimTask_Teleport(u8 taskId)
task->data[2] = 0; task->data[2] = 0;
task->data[3] = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 4 : 8; task->data[3] = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 4 : 8;
PrepareAffineAnimInTaskData(task, task->data[0], sAffineAnim_Teleport); PrepareAffineAnimInTaskData(task, task->data[0], sAffineAnim_Teleport);
task->func = sub_80B34DC; task->func = AnimTask_Teleport_Step;
} }
static void sub_80B34DC(u8 taskId) static void AnimTask_Teleport_Step(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -682,7 +687,7 @@ static void sub_80B34DC(u8 taskId)
else else
{ {
gSprites[task->data[0]].invisible = TRUE; gSprites[task->data[0]].invisible = TRUE;
gSprites[task->data[0]].x = 272; gSprites[task->data[0]].x = DISPLAY_WIDTH + 32;
ResetSpriteRotScale(task->data[0]); ResetSpriteRotScale(task->data[0]);
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
@@ -704,10 +709,10 @@ void AnimTask_ImprisonOrbs(u8 taskId)
task->data[12] = var0 > var1 ? var0 : var1; task->data[12] = var0 > var1 ? var0 : var1;
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
task->func = sub_80B3618; task->func = AnimTask_ImprisonOrbs_Step;
} }
static void sub_80B3618(u8 taskId) static void AnimTask_ImprisonOrbs_Step(u8 taskId)
{ {
u16 i; u16 i;
u8 spriteId; u8 spriteId;
@@ -757,7 +762,7 @@ static void sub_80B3618(u8 taskId)
if (++task->data[1] == 32) if (++task->data[1] == 32)
{ {
for (i = 8; i < 13; ++i) for (i = 8; i < 13; ++i)
if (task->data[i] != 64) if (task->data[i] != MAX_SPRITES)
DestroySprite(&gSprites[task->data[i]]); DestroySprite(&gSprites[task->data[i]]);
++task->data[0]; ++task->data[0];
} }
@@ -773,7 +778,7 @@ static void sub_80B3618(u8 taskId)
} }
} }
static void sub_80B37A4(struct Sprite *sprite) static void AnimRedX_Step(struct Sprite *sprite)
{ {
if (sprite->data[1] > sprite->data[0] - 10) if (sprite->data[1] > sprite->data[0] - 10)
sprite->invisible = sprite->data[1] & 1; sprite->invisible = sprite->data[1] & 1;
@@ -790,7 +795,7 @@ static void AnimRedX(struct Sprite *sprite)
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
} }
sprite->data[0] = gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[1];
sprite->callback = sub_80B37A4; sprite->callback = AnimRedX_Step;
} }
void AnimTask_SkillSwap(u8 taskId) void AnimTask_SkillSwap(u8 taskId)
@@ -799,7 +804,7 @@ void AnimTask_SkillSwap(u8 taskId)
if (IsContest()) if (IsContest())
{ {
if (gBattleAnimArgs[0] == 1) if (gBattleAnimArgs[0] == ANIM_TARGET)
{ {
task->data[10] = -10; task->data[10] = -10;
task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8; task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8;
@@ -836,10 +841,10 @@ void AnimTask_SkillSwap(u8 taskId)
} }
} }
task->data[1] = 6; task->data[1] = 6;
task->func = sub_80B3980; task->func = AnimTask_SkillSwap_Step;
} }
static void sub_80B3980(u8 taskId) static void AnimTask_SkillSwap_Step(u8 taskId)
{ {
u8 spriteId; u8 spriteId;
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -881,6 +886,8 @@ static void AnimSkillSwapOrb(struct Sprite *sprite)
} }
} }
// The scanline effect that distorts the target during Extrasensory by segmenting the mon vertically and shifting the slices
// arg0: Stage. Stage 0 is a slight right distortion, 1 is a medium left distortion, and 2 is a severe right distortion
void AnimTask_ExtrasensoryDistortion(u8 taskId) void AnimTask_ExtrasensoryDistortion(u8 taskId)
{ {
s16 i; s16 i;
@@ -932,10 +939,10 @@ void AnimTask_ExtrasensoryDistortion(u8 taskId)
scanlineParams.initState = 1; scanlineParams.initState = 1;
scanlineParams.unused9 = 0; scanlineParams.unused9 = 0;
ScanlineEffect_SetParams(scanlineParams); ScanlineEffect_SetParams(scanlineParams);
task->func = sub_80B3B78; task->func = AnimTask_ExtrasensoryDistortion_Step;
} }
static void sub_80B3B78(u8 taskId) static void AnimTask_ExtrasensoryDistortion_Step(u8 taskId)
{ {
s16 sineIndex, i; s16 sineIndex, i;
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -969,6 +976,8 @@ static void sub_80B3B78(u8 taskId)
} }
} }
// Creates a cloned transparent sprite of the battler that grows and then shrinks back to original size. Used by Extrasensory
// arg0: battler
void AnimTask_TransparentCloneGrowAndShrink(u8 taskId) void AnimTask_TransparentCloneGrowAndShrink(u8 taskId)
{ {
s16 spriteId; s16 spriteId;
@@ -998,10 +1007,10 @@ void AnimTask_TransparentCloneGrowAndShrink(u8 taskId)
task->data[13] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); task->data[13] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
task->data[14] = matrixNum; task->data[14] = matrixNum;
task->data[15] = spriteId; task->data[15] = spriteId;
task->func = sub_80B3D78; task->func = AnimTask_TransparentCloneGrowAndShrink_Step;
} }
static void sub_80B3D78(u8 taskId) static void AnimTask_TransparentCloneGrowAndShrink_Step(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -1024,7 +1033,7 @@ static void sub_80B3D78(u8 taskId)
++task->data[0]; ++task->data[0];
break; break;
case 2: case 2:
obj_delete_but_dont_free_vram(&gSprites[task->data[15]]); DestroySpriteWithActiveSheet(&gSprites[task->data[15]]);
++task->data[0]; ++task->data[0];
break; break;
case 3: case 3:
+75 -81
View File
@@ -8,21 +8,21 @@
static void AnimFallingRock(struct Sprite *sprite); static void AnimFallingRock(struct Sprite *sprite);
static void AnimRockFragment(struct Sprite *sprite); static void AnimRockFragment(struct Sprite *sprite);
static void AnimDirtParticleAcrossScreen(struct Sprite *sprite); static void AnimFlyingSandCrescent(struct Sprite *sprite);
static void AnimRaiseSprite(struct Sprite *sprite); static void AnimRaiseSprite(struct Sprite *sprite);
static void sub_80B4D00(u8 taskId); static void AnimTask_Rollout_Step(u8 taskId);
static void AnimRolloutParticle(struct Sprite *sprite); static void AnimRolloutParticle(struct Sprite *sprite);
static void AnimRockTomb(struct Sprite *sprite); static void AnimRockTomb(struct Sprite *sprite);
static void AnimRockBlastRock(struct Sprite *sprite); static void AnimRockBlastRock(struct Sprite *sprite);
static void AnimRockScatter(struct Sprite *sprite); static void AnimRockScatter(struct Sprite *sprite);
static void AnimParticleInVortex(struct Sprite *sprite); static void AnimParticleInVortex(struct Sprite *sprite);
static void sub_80B46B4(struct Sprite *sprite); static void AnimFallingRock_Step(struct Sprite *sprite);
static void sub_80B47C4(struct Sprite *sprite); static void AnimParticleInVortex_Step(struct Sprite *sprite);
static void sub_80B490C(u8 taskId); static void AnimTask_LoadSandstormBackground_Step(u8 taskId);
static void sub_80B4E70(struct Task *task); static void CreateRolloutDirtSprite(struct Task *task);
static u8 sub_80B4FB8(void); static u8 GetRolloutCounter(void);
static void sub_80B5024(struct Sprite *sprite); static void AnimRockTomb_Step(struct Sprite *sprite);
static void sub_80B50F8(struct Sprite *sprite); static void AnimRockScatter_Step(struct Sprite *sprite);
static const union AnimCmd sAnim_FlyingRock_0[] = static const union AnimCmd sAnim_FlyingRock_0[] =
{ {
@@ -125,7 +125,7 @@ const struct SpriteTemplate gFlyingSandCrescentSpriteTemplate =
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimDirtParticleAcrossScreen, .callback = AnimFlyingSandCrescent,
}; };
static const struct Subsprite sFlyingSandSubsprites[] = static const struct Subsprite sFlyingSandSubsprites[] =
@@ -133,16 +133,16 @@ static const struct Subsprite sFlyingSandSubsprites[] =
{ {
.x = -16, .x = -16,
.y = 0, .y = 0,
.shape = ST_OAM_H_RECTANGLE, .shape = SPRITE_SHAPE(32x16),
.size = 2, .size = SPRITE_SIZE(32x16),
.tileOffset = 0, .tileOffset = 0,
.priority = 1, .priority = 1,
}, },
{ {
.x = 16, .x = 16,
.y = 0, .y = 0,
.shape = ST_OAM_H_RECTANGLE, .shape = SPRITE_SHAPE(32x16),
.size = 2, .size = SPRITE_SIZE(32x16),
.tileOffset = 8, .tileOffset = 8,
.priority = 1, .priority = 1,
}, },
@@ -153,37 +153,37 @@ static const struct SubspriteTable sFlyingSandSubspriteTable[] =
{ NELEMS(sFlyingSandSubsprites), sFlyingSandSubsprites }, { NELEMS(sFlyingSandSubsprites), sFlyingSandSubsprites },
}; };
static const union AnimCmd sAnim_BasicRock_0[] = static const union AnimCmd sAnim_Rock_Biggest[] =
{ {
ANIMCMD_FRAME(0, 1), ANIMCMD_FRAME(0, 1),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sAnim_BasicRock_1[] = static const union AnimCmd sAnim_Rock_Bigger[] =
{ {
ANIMCMD_FRAME(16, 1), ANIMCMD_FRAME(16, 1),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sAnim_WeatherBallRockDown_0[] = static const union AnimCmd sAnim_Rock_Big[] =
{ {
ANIMCMD_FRAME(32, 1), ANIMCMD_FRAME(32, 1),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sAnim_WeatherBallRockDown_1[] = static const union AnimCmd sAnim_Rock_Small[] =
{ {
ANIMCMD_FRAME(48, 1), ANIMCMD_FRAME(48, 1),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sAnim_TwisterRock_0[] = static const union AnimCmd sAnim_Rock_Smaller[] =
{ {
ANIMCMD_FRAME(64, 1), ANIMCMD_FRAME(64, 1),
ANIMCMD_END, ANIMCMD_END,
}; };
static const union AnimCmd sAnim_TwisterRock_1[] = static const union AnimCmd sAnim_Rock_Smallest[] =
{ {
ANIMCMD_FRAME(80, 1), ANIMCMD_FRAME(80, 1),
ANIMCMD_END, ANIMCMD_END,
@@ -191,20 +191,12 @@ static const union AnimCmd sAnim_TwisterRock_1[] =
static const union AnimCmd *const sAnims_BasicRock[] = static const union AnimCmd *const sAnims_BasicRock[] =
{ {
sAnim_BasicRock_0, sAnim_Rock_Biggest,
sAnim_BasicRock_1, sAnim_Rock_Bigger,
}; sAnim_Rock_Big,
sAnim_Rock_Small,
static const union AnimCmd *const sAnims_WeatherBallRockDown[] = sAnim_Rock_Smaller,
{ sAnim_Rock_Smallest,
sAnim_WeatherBallRockDown_0,
sAnim_WeatherBallRockDown_1,
};
static const union AnimCmd *const sAnims_TwisterRock[] =
{
sAnim_TwisterRock_0,
sAnim_TwisterRock_1,
}; };
const struct SpriteTemplate gAncientPowerRockSpriteTemplate = const struct SpriteTemplate gAncientPowerRockSpriteTemplate =
@@ -229,7 +221,7 @@ const struct SpriteTemplate gRolloutMudSpriteTemplate =
.callback = AnimRolloutParticle, .callback = AnimRolloutParticle,
}; };
const struct SpriteTemplate gUnknown_83E74F0 = const struct SpriteTemplate gRolloutRockSpriteTemplate =
{ {
.tileTag = ANIM_TAG_ROCKS, .tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS,
@@ -296,7 +288,7 @@ const struct SpriteTemplate gTwisterRockSpriteTemplate =
.tileTag = ANIM_TAG_ROCKS, .tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_TwisterRock, .anims = &sAnims_BasicRock[4],
.images = NULL, .images = NULL,
.affineAnims = sAffineAnims_BasicRock, .affineAnims = sAffineAnims_BasicRock,
.callback = AnimMoveTwisterParticle, .callback = AnimMoveTwisterParticle,
@@ -307,7 +299,7 @@ const struct SpriteTemplate gWeatherBallRockDownSpriteTemplate =
.tileTag = ANIM_TAG_ROCKS, .tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS,
.oam = &gOamData_AffineNormal_ObjNormal_32x32, .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = sAnims_WeatherBallRockDown, .anims = &sAnims_BasicRock[2],
.images = NULL, .images = NULL,
.affineAnims = sAffineAnims_BasicRock, .affineAnims = sAffineAnims_BasicRock,
.callback = AnimWeatherBallDown, .callback = AnimWeatherBallDown,
@@ -327,12 +319,12 @@ static void AnimFallingRock(struct Sprite *sprite)
sprite->data[3] = 16; sprite->data[3] = 16;
sprite->data[4] = -70; sprite->data[4] = -70;
sprite->data[5] = gBattleAnimArgs[2]; sprite->data[5] = gBattleAnimArgs[2];
StoreSpriteCallbackInData6(sprite, sub_80B46B4); StoreSpriteCallbackInData6(sprite, AnimFallingRock_Step);
sprite->callback = TranslateSpriteInEllipseOverDuration; sprite->callback = TranslateSpriteInEllipse;
sprite->callback(sprite); sprite->callback(sprite);
} }
static void sub_80B46B4(struct Sprite *sprite) static void AnimFallingRock_Step(struct Sprite *sprite)
{ {
sprite->x += sprite->data[5]; sprite->x += sprite->data[5];
sprite->data[0] = 192; sprite->data[0] = 192;
@@ -341,10 +333,11 @@ static void sub_80B46B4(struct Sprite *sprite)
sprite->data[3] = 32; sprite->data[3] = 32;
sprite->data[4] = -24; sprite->data[4] = -24;
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
sprite->callback = TranslateSpriteInEllipseOverDuration; sprite->callback = TranslateSpriteInEllipse;
sprite->callback(sprite); sprite->callback(sprite);
} }
// Animates the rock particles that are shown on the impact for Rock Blast / Rock Smash
static void AnimRockFragment(struct Sprite *sprite) static void AnimRockFragment(struct Sprite *sprite)
{ {
StartSpriteAnim(sprite, gBattleAnimArgs[5]); StartSpriteAnim(sprite, gBattleAnimArgs[5]);
@@ -366,6 +359,7 @@ static void AnimRockFragment(struct Sprite *sprite)
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
} }
// Swirls particle in vortex. Used for moves like Fire Spin or Sand Tomb
static void AnimParticleInVortex(struct Sprite *sprite) static void AnimParticleInVortex(struct Sprite *sprite)
{ {
if (gBattleAnimArgs[6] == 0) if (gBattleAnimArgs[6] == 0)
@@ -376,10 +370,10 @@ static void AnimParticleInVortex(struct Sprite *sprite)
sprite->data[1] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[2];
sprite->data[2] = gBattleAnimArgs[4]; sprite->data[2] = gBattleAnimArgs[4];
sprite->data[3] = gBattleAnimArgs[5]; sprite->data[3] = gBattleAnimArgs[5];
sprite->callback = sub_80B47C4; sprite->callback = AnimParticleInVortex_Step;
} }
static void sub_80B47C4(struct Sprite *sprite) static void AnimParticleInVortex_Step(struct Sprite *sprite)
{ {
sprite->data[4] += sprite->data[1]; sprite->data[4] += sprite->data[1];
sprite->y2 = -(sprite->data[4] >> 8); sprite->y2 = -(sprite->data[4] >> 8);
@@ -416,10 +410,10 @@ void AnimTask_LoadSandstormBackground(u8 taskId)
if (gBattleAnimArgs[0] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (gBattleAnimArgs[0] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
var0 = 1; var0 = 1;
gTasks[taskId].data[0] = var0; gTasks[taskId].data[0] = var0;
gTasks[taskId].func = sub_80B490C; gTasks[taskId].func = AnimTask_LoadSandstormBackground_Step;
} }
static void sub_80B490C(u8 taskId) static void AnimTask_LoadSandstormBackground_Step(u8 taskId)
{ {
struct BattleAnimBgData animBg; struct BattleAnimBgData animBg;
@@ -487,7 +481,7 @@ static void sub_80B490C(u8 taskId)
// arg 1: projectile speed // arg 1: projectile speed
// arg 2: y pixel drop // arg 2: y pixel drop
// arg 3: ??? unknown (possibly a color bit) // arg 3: ??? unknown (possibly a color bit)
static void AnimDirtParticleAcrossScreen(struct Sprite *sprite) static void AnimFlyingSandCrescent(struct Sprite *sprite)
{ {
if (sprite->data[0] == 0) if (sprite->data[0] == 0)
{ {
@@ -518,7 +512,7 @@ static void AnimDirtParticleAcrossScreen(struct Sprite *sprite)
sprite->data[4] &= 0xFF; sprite->data[4] &= 0xFF;
if (sprite->data[5] == 0) if (sprite->data[5] == 0)
{ {
if (sprite->x + sprite->x2 > 272) if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 32)
{ {
sprite->callback = DestroyAnimSprite; sprite->callback = DestroyAnimSprite;
} }
@@ -550,23 +544,23 @@ static void AnimRaiseSprite(struct Sprite *sprite)
void AnimTask_Rollout(u8 taskId) void AnimTask_Rollout(u8 taskId)
{ {
u16 var0, var1, var2, var3; u16 var0, var1, var2, var3;
u8 var4; u8 rolloutCounter;
s32 var5; s32 var5;
s16 pan1, pan2; s16 pan1, pan2;
struct Task *task; struct Task *task;
task = &gTasks[taskId]; task = &gTasks[taskId];
var0 = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); var0 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
var1 = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 24; var1 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 24;
var2 = GetBattlerSpriteCoord(gBattleAnimTarget, 2); var2 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
var3 = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + 24; var3 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 24;
if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget) if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget)
var3 = var1; var3 = var1;
var4 = sub_80B4FB8(); rolloutCounter = GetRolloutCounter();
if (var4 == 1) if (rolloutCounter == 1)
task->data[8] = 32; task->data[8] = 32;
else else
task->data[8] = 48 - (var4 * 8); task->data[8] = 48 - (rolloutCounter * 8);
task->data[0] = 0; task->data[0] = 0;
task->data[11] = 0; task->data[11] = 0;
task->data[9] = 0; task->data[9] = 0;
@@ -585,12 +579,12 @@ void AnimTask_Rollout(u8 taskId)
pan2 = BattleAnimAdjustPanning(SOUND_PAN_TARGET); pan2 = BattleAnimAdjustPanning(SOUND_PAN_TARGET);
task->data[13] = pan1; task->data[13] = pan1;
task->data[14] = (pan2 - pan1) / task->data[8]; task->data[14] = (pan2 - pan1) / task->data[8];
task->data[1] = var4; task->data[1] = rolloutCounter;
task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER);
task->func = sub_80B4D00; task->func = AnimTask_Rollout_Step;
} }
static void sub_80B4D00(u8 taskId) static void AnimTask_Rollout_Step(u8 taskId)
{ {
struct Task *task; struct Task *task;
@@ -634,7 +628,7 @@ static void sub_80B4D00(u8 taskId)
if (++task->data[9] >= task->data[10]) if (++task->data[9] >= task->data[10])
{ {
task->data[9] = 0; task->data[9] = 0;
sub_80B4E70(task); CreateRolloutDirtSprite(task);
task->data[13] += task->data[14]; task->data[13] += task->data[14];
PlaySE12WithPanning(SE_M_DIG, task->data[13]); PlaySE12WithPanning(SE_M_DIG, task->data[13]);
} }
@@ -650,10 +644,10 @@ static void sub_80B4D00(u8 taskId)
} }
} }
static void sub_80B4E70(struct Task *task) static void CreateRolloutDirtSprite(struct Task *task)
{ {
const struct SpriteTemplate *spriteTemplate; const struct SpriteTemplate *spriteTemplate;
s32 var0; s32 tileOffset;
u16 x, y; u16 x, y;
u8 spriteId; u8 spriteId;
@@ -661,20 +655,20 @@ static void sub_80B4E70(struct Task *task)
{ {
case 1: case 1:
spriteTemplate = &gRolloutMudSpriteTemplate; spriteTemplate = &gRolloutMudSpriteTemplate;
var0 = 0; tileOffset = 0;
break; break;
case 2: case 2:
case 3: case 3:
spriteTemplate = &gUnknown_83E74F0; spriteTemplate = &gRolloutRockSpriteTemplate;
var0 = 80; tileOffset = 80;
break; break;
case 4: case 4:
spriteTemplate = &gUnknown_83E74F0; spriteTemplate = &gRolloutRockSpriteTemplate;
var0 = 64; tileOffset = 64;
break; break;
case 5: case 5:
spriteTemplate = &gUnknown_83E74F0; spriteTemplate = &gRolloutRockSpriteTemplate;
var0 = 48; tileOffset = 48;
break; break;
default: default:
return; return;
@@ -689,7 +683,7 @@ static void sub_80B4E70(struct Task *task)
gSprites[spriteId].data[2] = ((task->data[12] * 20) + x) + (task->data[1] * 3); gSprites[spriteId].data[2] = ((task->data[12] * 20) + x) + (task->data[1] * 3);
gSprites[spriteId].data[4] = y; gSprites[spriteId].data[4] = y;
gSprites[spriteId].data[5] = -16 - (task->data[1] * 2); gSprites[spriteId].data[5] = -16 - (task->data[1] * 2);
gSprites[spriteId].oam.tileNum += var0; gSprites[spriteId].oam.tileNum += tileOffset;
InitAnimArcTranslation(&gSprites[spriteId]); InitAnimArcTranslation(&gSprites[spriteId]);
++task->data[11]; ++task->data[11];
} }
@@ -700,15 +694,15 @@ static void AnimRolloutParticle(struct Sprite *sprite)
{ {
if (TranslateAnimHorizontalArc(sprite)) if (TranslateAnimHorizontalArc(sprite))
{ {
u8 taskId = FindTaskIdByFunc(sub_80B4D00); u8 taskId = FindTaskIdByFunc(AnimTask_Rollout_Step);
if (taskId != TAIL_SENTINEL) if (taskId != TASK_NONE)
--gTasks[taskId].data[11]; --gTasks[taskId].data[11];
DestroySprite(sprite); DestroySprite(sprite);
} }
} }
static u8 sub_80B4FB8(void) static u8 GetRolloutCounter(void)
{ {
u8 retVal = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer; u8 retVal = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer;
u8 var0 = retVal - 1; u8 var0 = retVal - 1;
@@ -726,11 +720,11 @@ static void AnimRockTomb(struct Sprite *sprite)
sprite->data[3] -= gBattleAnimArgs[2]; sprite->data[3] -= gBattleAnimArgs[2];
sprite->data[0] = 3; sprite->data[0] = 3;
sprite->data[1] = gBattleAnimArgs[3]; sprite->data[1] = gBattleAnimArgs[3];
sprite->callback = sub_80B5024; sprite->callback = AnimRockTomb_Step;
sprite->invisible = TRUE; sprite->invisible = TRUE;
} }
static void sub_80B5024(struct Sprite *sprite) static void AnimRockTomb_Step(struct Sprite *sprite)
{ {
sprite->invisible = FALSE; sprite->invisible = FALSE;
if (sprite->data[3] != 0) if (sprite->data[3] != 0)
@@ -758,18 +752,18 @@ static void AnimRockBlastRock(struct Sprite *sprite)
static void AnimRockScatter(struct Sprite *sprite) static void AnimRockScatter(struct Sprite *sprite)
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 0); sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 1); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
sprite->x += gBattleAnimArgs[0]; sprite->x += gBattleAnimArgs[0];
sprite->y += gBattleAnimArgs[1]; sprite->y += gBattleAnimArgs[1];
sprite->data[1] = gBattleAnimArgs[0]; sprite->data[1] = gBattleAnimArgs[0];
sprite->data[2] = gBattleAnimArgs[1]; sprite->data[2] = gBattleAnimArgs[1];
sprite->data[5] = gBattleAnimArgs[2]; sprite->data[5] = gBattleAnimArgs[2];
StartSpriteAnim(sprite, gBattleAnimArgs[3]); StartSpriteAnim(sprite, gBattleAnimArgs[3]);
sprite->callback = sub_80B50F8; sprite->callback = AnimRockScatter_Step;
} }
static void sub_80B50F8(struct Sprite *sprite) static void AnimRockScatter_Step(struct Sprite *sprite)
{ {
sprite->data[0] += 8; sprite->data[0] += 8;
sprite->data[3] += sprite->data[1]; sprite->data[3] += sprite->data[1];
@@ -783,11 +777,11 @@ static void sub_80B50F8(struct Sprite *sprite)
void AnimTask_GetSeismicTossDamageLevel(u8 taskId) void AnimTask_GetSeismicTossDamageLevel(u8 taskId)
{ {
if (gAnimMoveDmg < 33) if (gAnimMoveDmg < 33)
gBattleAnimArgs[7] = 0; gBattleAnimArgs[ARG_RET_ID] = 0;
if ((u32)gAnimMoveDmg - 33 < 33) if ((u32)gAnimMoveDmg - 33 < 33)
gBattleAnimArgs[7] = 1; gBattleAnimArgs[ARG_RET_ID] = 1;
if (gAnimMoveDmg > 65) if (gAnimMoveDmg > 65)
gBattleAnimArgs[7] = 2; gBattleAnimArgs[ARG_RET_ID] = 2;
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
+197
View File
@@ -0,0 +1,197 @@
#include "global.h"
#include "battle_gfx_sfx_util.h"
#include "decompress.h"
#include "graphics.h"
#include "util.h"
#define TAG_SMOKESCREEN 55019
#define PALTAG_SHADOW 55039
#define GFXTAG_SHADOW 55129
static void SpriteCB_SmokescreenImpactMain(struct Sprite *);
static void SpriteCB_SmokescreenImpact(struct Sprite *);
static const struct CompressedSpriteSheet sSmokescreenImpactSpriteSheet =
{
.data = gSmokescreenImpactTiles, .size = 0x180, .tag = TAG_SMOKESCREEN
};
static const struct CompressedSpritePalette sSmokescreenImpactSpritePalette =
{
.data = gSmokescreenImpactPalette, .tag = TAG_SMOKESCREEN
};
static const struct OamData sOamData_SmokescreenImpact =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(16x16),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(16x16),
.tileNum = 0,
.priority = 1,
.paletteNum = 0,
.affineParam = 0
};
static const union AnimCmd sAnim_SmokescreenImpact_0[] =
{
ANIMCMD_FRAME(0, 4),
ANIMCMD_FRAME(4, 4),
ANIMCMD_FRAME(8, 4),
ANIMCMD_END
};
static const union AnimCmd sAnim_SmokescreenImpact_1[] =
{
ANIMCMD_FRAME(0, 4, .hFlip = TRUE),
ANIMCMD_FRAME(4, 4, .hFlip = TRUE),
ANIMCMD_FRAME(8, 4, .hFlip = TRUE),
ANIMCMD_END
};
static const union AnimCmd sAnim_SmokescreenImpact_2[] =
{
ANIMCMD_FRAME(0, 4, .vFlip = TRUE),
ANIMCMD_FRAME(4, 4, .vFlip = TRUE),
ANIMCMD_FRAME(8, 4, .vFlip = TRUE),
ANIMCMD_END
};
static const union AnimCmd sAnim_SmokescreenImpact_3[] =
{
ANIMCMD_FRAME(0, 4, .hFlip = TRUE, .vFlip = TRUE),
ANIMCMD_FRAME(4, 4, .hFlip = TRUE, .vFlip = TRUE),
ANIMCMD_FRAME(8, 4, .hFlip = TRUE, .vFlip = TRUE),
ANIMCMD_END
};
static const union AnimCmd *const sAnims_SmokescreenImpact[] =
{
sAnim_SmokescreenImpact_0,
sAnim_SmokescreenImpact_1,
sAnim_SmokescreenImpact_2,
sAnim_SmokescreenImpact_3,
};
static const struct SpriteTemplate sSmokescreenImpactSpriteTemplate =
{
.tileTag = TAG_SMOKESCREEN,
.paletteTag = TAG_SMOKESCREEN,
.oam = &sOamData_SmokescreenImpact,
.anims = sAnims_SmokescreenImpact,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_SmokescreenImpact
};
const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow =
{
.data = gEnemyMonShadow_Gfx, .size = 0x80, .tag = GFXTAG_SHADOW
};
static const struct OamData sOamData_EnemyShadow =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(32x8),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(32x8),
.tileNum = 0,
.priority = 3,
.paletteNum = 0,
.affineParam = 0
};
const struct SpriteTemplate gSpriteTemplate_EnemyShadow =
{
.tileTag = GFXTAG_SHADOW,
.paletteTag = PALTAG_SHADOW,
.oam = &sOamData_EnemyShadow,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_SetInvisible
};
#define sActiveSprites data[0]
#define sPersist data[1]
#define sMainSpriteId data[0]
u8 SmokescreenImpact(s16 x, s16 y, bool8 persist)
{
u8 mainSpriteId;
u8 spriteId1, spriteId2, spriteId3, spriteId4;
struct Sprite *mainSprite;
if (GetSpriteTileStartByTag(sSmokescreenImpactSpriteSheet.tag) == 0xFFFF)
{
LoadCompressedSpriteSheetUsingHeap(&sSmokescreenImpactSpriteSheet);
LoadCompressedSpritePaletteUsingHeap(&sSmokescreenImpactSpritePalette);
}
mainSpriteId = CreateInvisibleSpriteWithCallback(SpriteCB_SmokescreenImpactMain);
mainSprite = &gSprites[mainSpriteId];
mainSprite->sPersist = persist;
// Top left sprite
spriteId1 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x - 16, y - 16, 2);
gSprites[spriteId1].sMainSpriteId = mainSpriteId;
mainSprite->sActiveSprites++;
AnimateSprite(&gSprites[spriteId1]);
// Top right sprite
spriteId2 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x, y - 16, 2);
gSprites[spriteId2].sMainSpriteId = mainSpriteId;
mainSprite->sActiveSprites++;
StartSpriteAnim(&gSprites[spriteId2], 1);
AnimateSprite(&gSprites[spriteId2]);
// Bottom left sprite
spriteId3 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x - 16, y, 2);
gSprites[spriteId3].sMainSpriteId = mainSpriteId;
mainSprite->sActiveSprites++;
StartSpriteAnim(&gSprites[spriteId3], 2);
AnimateSprite(&gSprites[spriteId3]);
// Bottom right sprite
spriteId4 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x, y, 2);
gSprites[spriteId4].sMainSpriteId = mainSpriteId;
mainSprite->sActiveSprites++;
StartSpriteAnim(&gSprites[spriteId4], 3);
AnimateSprite(&gSprites[spriteId4]);
return mainSpriteId;
}
static void SpriteCB_SmokescreenImpactMain(struct Sprite *sprite)
{
if (sprite->sActiveSprites == 0)
{
FreeSpriteTilesByTag(sSmokescreenImpactSpriteSheet.tag);
FreeSpritePaletteByTag(sSmokescreenImpactSpritePalette.tag);
if (!sprite->sPersist)
DestroySprite(sprite);
else
sprite->callback = SpriteCallbackDummy;
}
}
static void SpriteCB_SmokescreenImpact(struct Sprite *sprite)
{
if (sprite->animEnded)
{
gSprites[sprite->sMainSpriteId].sActiveSprites--;
DestroySprite(sprite);
}
}
+55 -36
View File
@@ -6,14 +6,21 @@
#include "constants/battle_anim.h" #include "constants/battle_anim.h"
#include "constants/sound.h" #include "constants/sound.h"
static void sub_80DCE78(u8 taskId); static void SoundTask_FireBlast_Step1(u8 taskId);
static void sub_80DCEE4(u8 taskId); static void SoundTask_FireBlast_Step2(u8 taskId);
static void sub_80DCFE8(u8 taskId); static void SoundTask_LoopSEAdjustPanning_Step(u8 taskId);
static void sub_80DD270(u8 taskId); static void SoundTask_PlayDoubleCry_Step(u8 taskId);
static void sub_80DD390(u8 taskId); static void SoundTask_PlayCryWithEcho_Step(u8 taskId);
static void sub_80DD4D4(u8 taskId); static void SoundTask_AdjustPanningVar_Step(u8 taskId);
void sub_80DCE10(u8 taskId) // Loops the specified sound effect and pans from the
// attacker to the target. The second specified sound effect
// is played at the very end. This task is effectively
// hardcoded to the move FIRE_BLAST due to the baked-in
// durations.
// arg 0: looped sound effect
// arg 1: ending sound effect
void SoundTask_FireBlast(u8 taskId)
{ {
s8 pan1, pan2, panIncrement; s8 pan1, pan2, panIncrement;
@@ -26,10 +33,10 @@ void sub_80DCE10(u8 taskId)
gTasks[taskId].data[3] = pan2; gTasks[taskId].data[3] = pan2;
gTasks[taskId].data[4] = panIncrement; gTasks[taskId].data[4] = panIncrement;
gTasks[taskId].data[10] = 10; gTasks[taskId].data[10] = 10;
gTasks[taskId].func = sub_80DCE78; gTasks[taskId].func = SoundTask_FireBlast_Step1;
} }
static void sub_80DCE78(u8 taskId) static void SoundTask_FireBlast_Step1(u8 taskId)
{ {
s16 pan = gTasks[taskId].data[2]; s16 pan = gTasks[taskId].data[2];
s8 panIncrement = gTasks[taskId].data[4]; s8 panIncrement = gTasks[taskId].data[4];
@@ -38,7 +45,7 @@ static void sub_80DCE78(u8 taskId)
{ {
gTasks[taskId].data[10] = 5; gTasks[taskId].data[10] = 5;
gTasks[taskId].data[11] = 0; gTasks[taskId].data[11] = 0;
gTasks[taskId].func = sub_80DCEE4; gTasks[taskId].func = SoundTask_FireBlast_Step2;
} }
else else
{ {
@@ -52,7 +59,7 @@ static void sub_80DCE78(u8 taskId)
} }
} }
static void sub_80DCEE4(u8 taskId) static void SoundTask_FireBlast_Step2(u8 taskId)
{ {
if (++gTasks[taskId].data[10] == 6) if (++gTasks[taskId].data[10] == 6)
{ {
@@ -88,11 +95,11 @@ void SoundTask_LoopSEAdjustPanning(u8 taskId)
gTasks[taskId].data[10] = 0; gTasks[taskId].data[10] = 0;
gTasks[taskId].data[11] = sourcePan; gTasks[taskId].data[11] = sourcePan;
gTasks[taskId].data[12] = r9; gTasks[taskId].data[12] = r9;
gTasks[taskId].func = sub_80DCFE8; gTasks[taskId].func = SoundTask_LoopSEAdjustPanning_Step;
sub_80DCFE8(taskId); gTasks[taskId].func(taskId);
} }
static void sub_80DCFE8(u8 taskId) static void SoundTask_LoopSEAdjustPanning_Step(u8 taskId)
{ {
if (gTasks[taskId].data[12]++ == gTasks[taskId].data[6]) if (gTasks[taskId].data[12]++ == gTasks[taskId].data[6])
{ {
@@ -131,6 +138,7 @@ void SoundTask_PlayCryHighPitch(u8 taskId)
battlerId = BATTLE_PARTNER(gBattleAnimAttacker); battlerId = BATTLE_PARTNER(gBattleAnimAttacker);
else else
battlerId = BATTLE_PARTNER(gBattleAnimTarget); battlerId = BATTLE_PARTNER(gBattleAnimTarget);
// Check if battler is visible. // Check if battler is visible.
if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER)
&& !IsBattlerSpriteVisible(battlerId)) && !IsBattlerSpriteVisible(battlerId))
@@ -182,7 +190,7 @@ void SoundTask_PlayDoubleCry(u8 taskId)
PlayCry_ByMode(species, pan, CRY_MODE_GROWL_1); PlayCry_ByMode(species, pan, CRY_MODE_GROWL_1);
else // DOUBLE_CRY_ROAR else // DOUBLE_CRY_ROAR
PlayCry_ByMode(species, pan, CRY_MODE_ROAR_1); PlayCry_ByMode(species, pan, CRY_MODE_ROAR_1);
gTasks[taskId].func = sub_80DD270; gTasks[taskId].func = SoundTask_PlayDoubleCry_Step;
} }
else else
{ {
@@ -190,7 +198,7 @@ void SoundTask_PlayDoubleCry(u8 taskId)
} }
} }
static void sub_80DD270(u8 taskId) static void SoundTask_PlayDoubleCry_Step(u8 taskId)
{ {
u16 species = gTasks[taskId].data[1]; u16 species = gTasks[taskId].data[1];
s8 pan = gTasks[taskId].data[2]; s8 pan = gTasks[taskId].data[2];
@@ -199,7 +207,7 @@ static void sub_80DD270(u8 taskId)
{ {
++gTasks[taskId].data[9]; ++gTasks[taskId].data[9];
} }
else if (gTasks[taskId].data[0] == TAIL_SENTINEL) else if (gTasks[taskId].data[0] == DOUBLE_CRY_GROWL)
{ {
if (!IsCryPlaying()) if (!IsCryPlaying())
{ {
@@ -207,10 +215,13 @@ static void sub_80DD270(u8 taskId)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
} }
else if (!IsCryPlaying()) else // DOUBLE_CRY_ROAR
{ {
PlayCry_ByMode(species, pan, CRY_MODE_ROAR_2); if (!IsCryPlaying())
DestroyAnimVisualTask(taskId); {
PlayCry_ByMode(species, pan, CRY_MODE_ROAR_2);
DestroyAnimVisualTask(taskId);
}
} }
} }
@@ -222,19 +233,21 @@ void SoundTask_WaitForCry(u8 taskId)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
void sub_80DD334(u8 taskId) #define tSpecies data[1]
#define tPan data[2]
#define tState data[9]
void SoundTask_PlayCryWithEcho(u8 taskId)
{ {
u16 species; u16 species;
s8 pan; s8 pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
species = gAnimBattlerSpecies[gBattleAnimAttacker]; species = gAnimBattlerSpecies[gBattleAnimAttacker];
gTasks[taskId].data[1] = species; gTasks[taskId].tSpecies = species;
gTasks[taskId].data[2] = pan; gTasks[taskId].tPan = pan;
if (species != SPECIES_NONE) if (species != SPECIES_NONE)
{ {
PlayCry_ByMode(species, pan, CRY_MODE_ECHO_START); PlayCry_ByMode(species, pan, CRY_MODE_ECHO_START);
gTasks[taskId].func = sub_80DD390; gTasks[taskId].func = SoundTask_PlayCryWithEcho_Step;
} }
else else
{ {
@@ -242,23 +255,27 @@ void sub_80DD334(u8 taskId)
} }
} }
static void sub_80DD390(u8 taskId) static void SoundTask_PlayCryWithEcho_Step(u8 taskId)
{ {
if (gTasks[taskId].data[9] < 2) if (gTasks[taskId].tState < 2)
{ {
++gTasks[taskId].data[9]; gTasks[taskId].tState++;
} }
else if (!IsCryPlaying()) else if (!IsCryPlaying())
{ {
u16 species = gTasks[taskId].data[1]; u16 species = gTasks[taskId].tSpecies;
s8 pan = gTasks[taskId].data[2]; s8 pan = gTasks[taskId].tPan;
PlayCry_ByMode(species, pan, CRY_MODE_ECHO_END); PlayCry_ByMode(species, pan, CRY_MODE_ECHO_END);
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
} }
#undef tSpecies
#undef tPan
#undef tState
void SoundTask_PlaySE1WithPanning(u8 taskId) void SoundTask_PlaySE1WithPanning(u8 taskId)
{ {
u16 songId = gBattleAnimArgs[0]; u16 songId = gBattleAnimArgs[0];
@@ -277,6 +294,8 @@ void SoundTask_PlaySE2WithPanning(u8 taskId)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
// Adjusts panning and assigns it to gAnimCustomPanning. Doesnt play sound.
// Used by Confuse Ray and Will-O-Wisp (see uses of gAnimCustomPanning)
void SoundTask_AdjustPanningVar(u8 taskId) void SoundTask_AdjustPanningVar(u8 taskId)
{ {
s8 targetPan = gBattleAnimArgs[1]; s8 targetPan = gBattleAnimArgs[1];
@@ -292,11 +311,11 @@ void SoundTask_AdjustPanningVar(u8 taskId)
gTasks[taskId].data[5] = r9; gTasks[taskId].data[5] = r9;
gTasks[taskId].data[10] = 0; gTasks[taskId].data[10] = 0;
gTasks[taskId].data[11] = sourcePan; gTasks[taskId].data[11] = sourcePan;
gTasks[taskId].func = sub_80DD4D4; gTasks[taskId].func = SoundTask_AdjustPanningVar_Step;
sub_80DD4D4(taskId); gTasks[taskId].func(taskId);
} }
static void sub_80DD4D4(u8 taskId) static void SoundTask_AdjustPanningVar_Step(u8 taskId)
{ {
u16 oldPan, panIncrement = gTasks[taskId].data[3]; u16 oldPan, panIncrement = gTasks[taskId].data[3];
@@ -307,7 +326,7 @@ static void sub_80DD4D4(u8 taskId)
gTasks[taskId].data[11] = panIncrement + oldPan; gTasks[taskId].data[11] = panIncrement + oldPan;
gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11], oldPan); gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11], oldPan);
} }
gUnknown_2037F24 = gTasks[taskId].data[11]; gAnimCustomPanning = gTasks[taskId].data[11];
if (gTasks[taskId].data[11] == gTasks[taskId].data[2]) if (gTasks[taskId].data[11] == gTasks[taskId].data[2])
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
+6 -5
View File
@@ -3,6 +3,7 @@
#include "battle.h" #include "battle.h"
#include "battle_anim.h" #include "battle_anim.h"
#include "battle_main.h" #include "battle_main.h"
#include "battle_message.h"
#include "battle_controllers.h" #include "battle_controllers.h"
#include "battle_interface.h" #include "battle_interface.h"
#include "decompress.h" #include "decompress.h"
@@ -442,8 +443,8 @@ UNUSED void AnimTask_UnusedLevelUpHealthBox(u8 taskId)
gSprites[spriteId3].callback = SpriteCallbackDummy; gSprites[spriteId3].callback = SpriteCallbackDummy;
gSprites[spriteId4].callback = SpriteCallbackDummy; gSprites[spriteId4].callback = SpriteCallbackDummy;
GetBattleAnimBg1Data(&animBgData); GetBattleAnimBg1Data(&animBgData);
AnimLoadCompressedBgTilemap(animBgData.bgId, gUnknown_D2EC24_Tilemap); AnimLoadCompressedBgTilemap(animBgData.bgId, gUnusedLevelupAnimationTilemap);
AnimLoadCompressedBgGfx(animBgData.bgId, gUnknown_D2EC24_Gfx, animBgData.tilesOffset); AnimLoadCompressedBgGfx(animBgData.bgId, gUnusedLevelupAnimationGfx, animBgData.tilesOffset);
LoadCompressedPalette(gCureBubblesPal, animBgData.paletteId << 4, 32); LoadCompressedPalette(gCureBubblesPal, animBgData.paletteId << 4, 32);
gBattle_BG1_X = -gSprites[spriteId3].x + 32; gBattle_BG1_X = -gSprites[spriteId3].x + 32;
gBattle_BG1_Y = -gSprites[spriteId3].y - 32; gBattle_BG1_Y = -gSprites[spriteId3].y - 32;
@@ -660,7 +661,7 @@ void AnimTask_SwitchOutBallEffect(u8 taskId)
priority = gSprites[spriteId].oam.priority; priority = gSprites[spriteId].oam.priority;
subpriority = gSprites[spriteId].subpriority; subpriority = gSprites[spriteId].subpriority;
gTasks[taskId].data[10] = AnimateBallOpenParticles(x, y + 32, priority, subpriority, ballId); gTasks[taskId].data[10] = AnimateBallOpenParticles(x, y + 32, priority, subpriority, ballId);
selectedPalettes = SelectBattleAnimSpriteAndBgPalettes(1, 0, 0, 0, 0, 0, 0); selectedPalettes = GetBattlePalettesMask(1, 0, 0, 0, 0, 0, 0);
gTasks[taskId].data[11] = LaunchBallFadeMonTask(0, gBattleAnimAttacker, selectedPalettes, ballId); gTasks[taskId].data[11] = LaunchBallFadeMonTask(0, gBattleAnimAttacker, selectedPalettes, ballId);
gTasks[taskId].data[0]++; gTasks[taskId].data[0]++;
break; break;
@@ -2037,7 +2038,7 @@ void AnimTask_IsAttackerBehindSubstitute(u8 taskId)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
void AnimTask_TargetToEffectBattler(u8 taskId) void AnimTask_SetTargetToEffectBattler(u8 taskId)
{ {
gBattleAnimTarget = gEffectBattler; gBattleAnimTarget = gEffectBattler;
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
@@ -2278,7 +2279,7 @@ void AnimTask_SafariOrGhost_DecideAnimSides(u8 taskId)
void AnimTask_SafariGetReaction(u8 taskId) void AnimTask_SafariGetReaction(u8 taskId)
{ {
if (gBattleCommunication[MULTISTRING_CHOOSER] > 2) if (gBattleCommunication[MULTISTRING_CHOOSER] >= NUM_SAFARI_REACTIONS)
gBattleAnimArgs[7] = 0; gBattleAnimArgs[7] = 0;
else else
gBattleAnimArgs[7] = gBattleCommunication[MULTISTRING_CHOOSER]; gBattleAnimArgs[7] = gBattleCommunication[MULTISTRING_CHOOSER];
+89 -85
View File
@@ -9,19 +9,17 @@
#include "constants/battle_anim.h" #include "constants/battle_anim.h"
#include "constants/pokemon.h" #include "constants/pokemon.h"
// Function Declarations static u8 Task_FlashingCircleImpacts(u8 battlerId, bool8 b);
static u8 sub_8078178(u8 battlerId, bool8 b); static void Task_UpdateFlashingCircleImpacts(u8 taskId);
static void sub_80782BC(u8 taskId); static void AnimTask_FrozenIceCube_Step1(u8 taskId);
static void sub_80784D8(u8 taskId); static void AnimTask_FrozenIceCube_Step2(u8 taskId);
static void sub_8078528(u8 taskId); static void AnimTask_FrozenIceCube_Step3(u8 taskId);
static void sub_80785D8(u8 taskId); static void AnimTask_FrozenIceCube_Step4(u8 taskId);
static void sub_807862C(u8 taskId);
static void Task_DoStatusAnimation(u8 taskId); static void Task_DoStatusAnimation(u8 taskId);
static void sub_807834C(struct Sprite *sprite); static void AnimFlashingCircleImpact(struct Sprite *sprite);
static void sub_8078380(struct Sprite *sprite); static void AnimFlashingCircleImpact_Step(struct Sprite *sprite);
// Data static const union AnimCmd sAnim_FlickeringOrb[] =
static const union AnimCmd sUnknown_83BF3E0[] =
{ {
ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(0, 3),
ANIMCMD_FRAME(4, 3), ANIMCMD_FRAME(4, 3),
@@ -30,42 +28,44 @@ static const union AnimCmd sUnknown_83BF3E0[] =
ANIMCMD_JUMP(0) ANIMCMD_JUMP(0)
}; };
static const union AnimCmd *const sSpriteAnimTable_83BF3F4[] = static const union AnimCmd *const sAnims_FlickeringOrb[] =
{ {
sUnknown_83BF3E0 sAnim_FlickeringOrb
}; };
const struct SpriteTemplate gSpriteTemplate_83BF3F8 = // Unused
static const struct SpriteTemplate sFlickeringOrbSpriteTemplate =
{ {
.tileTag = ANIM_TAG_ORB, .tileTag = ANIM_TAG_ORB,
.paletteTag = ANIM_TAG_ORB, .paletteTag = ANIM_TAG_ORB,
.oam = &gOamData_AffineOff_ObjNormal_16x16, .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = sSpriteAnimTable_83BF3F4, .anims = sAnims_FlickeringOrb,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker2, .callback = AnimTranslateLinearAndFlicker,
}; };
const struct SpriteTemplate gSpriteTemplate_83BF410 = // Unused
static const struct SpriteTemplate sFlickeringOrbFlippedSpriteTemplate =
{ {
.tileTag = ANIM_TAG_ORB, .tileTag = ANIM_TAG_ORB,
.paletteTag = ANIM_TAG_ORB, .paletteTag = ANIM_TAG_ORB,
.oam = &gOamData_AffineOff_ObjNormal_16x16, .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = sSpriteAnimTable_83BF3F4, .anims = sAnims_FlickeringOrb,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker, .callback = AnimTranslateLinearAndFlicker_Flipped,
}; };
static const union AnimCmd sUnknown_83BF428[] = static const union AnimCmd sAnim_WeatherBallNormal[] =
{ {
ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(0, 3),
ANIMCMD_JUMP(0) ANIMCMD_JUMP(0)
}; };
static const union AnimCmd *const sSpriteAnimTable_83BF430[] = static const union AnimCmd *const sAnims_WeatherBallNormal[] =
{ {
sUnknown_83BF428 sAnim_WeatherBallNormal
}; };
const struct SpriteTemplate gWeatherBallUpSpriteTemplate = const struct SpriteTemplate gWeatherBallUpSpriteTemplate =
@@ -73,10 +73,10 @@ const struct SpriteTemplate gWeatherBallUpSpriteTemplate =
.tileTag = ANIM_TAG_WEATHER_BALL, .tileTag = ANIM_TAG_WEATHER_BALL,
.paletteTag = ANIM_TAG_WEATHER_BALL, .paletteTag = ANIM_TAG_WEATHER_BALL,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sSpriteAnimTable_83BF430, .anims = sAnims_WeatherBallNormal,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_WeatherBallUp, .callback = AnimWeatherBallUp,
}; };
const struct SpriteTemplate gWeatherBallNormalDownSpriteTemplate = const struct SpriteTemplate gWeatherBallNormalDownSpriteTemplate =
@@ -84,13 +84,13 @@ const struct SpriteTemplate gWeatherBallNormalDownSpriteTemplate =
.tileTag = ANIM_TAG_WEATHER_BALL, .tileTag = ANIM_TAG_WEATHER_BALL,
.paletteTag = ANIM_TAG_WEATHER_BALL, .paletteTag = ANIM_TAG_WEATHER_BALL,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sSpriteAnimTable_83BF430, .anims = sAnims_WeatherBallNormal,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimWeatherBallDown, .callback = AnimWeatherBallDown,
}; };
static const union AnimCmd sUnknown_83BF464[] = static const union AnimCmd sAnim_SpinningSparkle[] =
{ {
ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(0, 3),
ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(16, 3),
@@ -100,23 +100,24 @@ static const union AnimCmd sUnknown_83BF464[] =
ANIMCMD_END ANIMCMD_END
}; };
static const union AnimCmd *const sSpriteAnimTable_83BF47C[] = static const union AnimCmd *const sAnims_SpinningSparkle[] =
{ {
sUnknown_83BF464 sAnim_SpinningSparkle
}; };
const struct SpriteTemplate gSpriteTemplate_83BF480 = const struct SpriteTemplate gSpinningSparkleSpriteTemplate =
{ {
.tileTag = ANIM_TAG_SPARKLE_4, .tileTag = ANIM_TAG_SPARKLE_4,
.paletteTag = ANIM_TAG_SPARKLE_4, .paletteTag = ANIM_TAG_SPARKLE_4,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sSpriteAnimTable_83BF47C, .anims = sAnims_SpinningSparkle,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_TrackOffsetFromAttackerAndWaitAnim, .callback = AnimSpinningSparkle,
}; };
const struct SpriteTemplate gSpriteTemplate_83BF498 = // Unused
static const struct SpriteTemplate sFlickeringFootSpriteTemplate =
{ {
.tileTag = ANIM_TAG_MONSTER_FOOT, .tileTag = ANIM_TAG_MONSTER_FOOT,
.paletteTag = ANIM_TAG_MONSTER_FOOT, .paletteTag = ANIM_TAG_MONSTER_FOOT,
@@ -124,95 +125,98 @@ const struct SpriteTemplate gSpriteTemplate_83BF498 =
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker2, .callback = AnimTranslateLinearAndFlicker,
}; };
static const union AnimCmd sUnknown_83BF4B0[] = static const union AnimCmd sAnim_FlickeringImpact_0[] =
{ {
ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(0, 5),
ANIMCMD_JUMP(0) ANIMCMD_JUMP(0)
}; };
static const union AnimCmd sUnknown_83BF4B8[] = static const union AnimCmd sAnim_FlickeringImpact_1[] =
{ {
ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(0, 5),
ANIMCMD_JUMP(0) ANIMCMD_JUMP(0)
}; };
static const union AnimCmd sUnknown_83BF4C0[] = static const union AnimCmd sAnim_FlickeringImpact_2[] =
{ {
ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(0, 5),
ANIMCMD_JUMP(0) ANIMCMD_JUMP(0)
}; };
static const union AnimCmd *const sSpriteAniimTable_83BF4C8[] = static const union AnimCmd *const sAnims_FlickeringImpact[] =
{ {
sUnknown_83BF4B0, sAnim_FlickeringImpact_0,
sUnknown_83BF4B8, sAnim_FlickeringImpact_1,
sUnknown_83BF4C0 sAnim_FlickeringImpact_2
}; };
const struct SpriteTemplate gSpriteTemplate_83BF4D4 = // Unused
static const struct SpriteTemplate sFlickeringImpactSpriteTemplate =
{ {
.tileTag = ANIM_TAG_IMPACT, .tileTag = ANIM_TAG_IMPACT,
.paletteTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_IMPACT,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sSpriteAniimTable_83BF4C8, .anims = sAnims_FlickeringImpact,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker2, .callback = AnimTranslateLinearAndFlicker,
}; };
static const union AnimCmd sUnknown_83BF4EC[] = static const union AnimCmd sAnim_FlickeringShrinkOrb[] =
{ {
ANIMCMD_FRAME(0, 15), ANIMCMD_FRAME(0, 15),
ANIMCMD_JUMP(0) ANIMCMD_JUMP(0)
}; };
static const union AnimCmd *const sSpriteAnimTable_83BF4F4[] = static const union AnimCmd *const sAnims_FlickeringShrinkOrb[] =
{ {
sUnknown_83BF4EC sAnim_FlickeringShrinkOrb
}; };
static const union AffineAnimCmd sUnknown_83BF4F8[] = static const union AffineAnimCmd sAffineAnim_FlickeringShrinkOrb[] =
{ {
AFFINEANIMCMD_FRAME(96, 96, 0, 0), AFFINEANIMCMD_FRAME(96, 96, 0, 0),
AFFINEANIMCMD_FRAME(2, 2, 0, 1), AFFINEANIMCMD_FRAME(2, 2, 0, 1),
AFFINEANIMCMD_JUMP(1) AFFINEANIMCMD_JUMP(1)
}; };
static const union AffineAnimCmd *const sSpriteAffineAnimTable_83BF510[] = static const union AffineAnimCmd *const sAffineAnims_FlickeringShrinkOrb[] =
{ {
sUnknown_83BF4F8 sAffineAnim_FlickeringShrinkOrb
}; };
const struct SpriteTemplate gSpriteTemplate_83BF514 = // Unused
static const struct SpriteTemplate sFlickeringShrinkOrbSpriteTemplate =
{ {
.tileTag = ANIM_TAG_ORB, .tileTag = ANIM_TAG_ORB,
.paletteTag = ANIM_TAG_ORB, .paletteTag = ANIM_TAG_ORB,
.oam = &gOamData_AffineDouble_ObjNormal_16x16, .oam = &gOamData_AffineDouble_ObjNormal_16x16,
.anims = sSpriteAnimTable_83BF4F4, .anims = sAnims_FlickeringShrinkOrb,
.images = NULL, .images = NULL,
.affineAnims = sSpriteAffineAnimTable_83BF510, .affineAnims = sAffineAnims_FlickeringShrinkOrb,
.callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker, .callback = AnimTranslateLinearAndFlicker_Flipped,
}; };
static const u8 sUnknown_83BF52C[] = _("TASK OVER\nタスクがオ-バ-しました"); // Presumably some debug text
static const u8 sText_TaskOver[] = _("TASK OVER\nタスクがオ-バ-しました");
static const struct Subsprite sSubsprites_83BF544[] = static const struct Subsprite sFrozenIceCubeSubsprites[] =
{ {
{.x = -16, .y = -16, .shape = SPRITE_SHAPE(8x8), .size = 3, .tileOffset = 0, .priority = 2}, {.x = -16, .y = -16, .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .tileOffset = 0, .priority = 2},
{.x = -16, .y = 48, .shape = SPRITE_SHAPE(16x8), .size = 3, .tileOffset = 64, .priority = 2}, {.x = -16, .y = 48, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 64, .priority = 2},
{.x = 48, .y = -16, .shape = SPRITE_SHAPE(8x16), .size = 3, .tileOffset = 96, .priority = 2}, {.x = 48, .y = -16, .shape = SPRITE_SHAPE(32x64), .size = SPRITE_SIZE(32x64), .tileOffset = 96, .priority = 2},
{.x = 48, .y = 48, .shape = SPRITE_SHAPE(8x8), .size = 2, .tileOffset = 128, .priority = 2}, {.x = 48, .y = 48, .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32), .tileOffset = 128, .priority = 2},
}; };
static const struct SubspriteTable sUnknown_83BF554[] = static const struct SubspriteTable sFrozenIceCubeSubspriteTable[] =
{ {
{NELEMS(sSubsprites_83BF544), sSubsprites_83BF544}, {NELEMS(sFrozenIceCubeSubsprites), sFrozenIceCubeSubsprites},
}; };
static const struct SpriteTemplate sUnknown_83BF55C = static const struct SpriteTemplate sFrozenIceCubeSpriteTemplate =
{ {
.tileTag = ANIM_TAG_ICE_CUBE, .tileTag = ANIM_TAG_ICE_CUBE,
.paletteTag = ANIM_TAG_ICE_CUBE, .paletteTag = ANIM_TAG_ICE_CUBE,
@@ -223,7 +227,7 @@ static const struct SpriteTemplate sUnknown_83BF55C =
.callback = SpriteCallbackDummy, .callback = SpriteCallbackDummy,
}; };
static const struct SpriteTemplate sUnknown_83BF574 = static const struct SpriteTemplate sFlashingCircleImpactSpriteTemplate =
{ {
.tileTag = ANIM_TAG_CIRCLE_IMPACT, .tileTag = ANIM_TAG_CIRCLE_IMPACT,
.paletteTag = ANIM_TAG_CIRCLE_IMPACT, .paletteTag = ANIM_TAG_CIRCLE_IMPACT,
@@ -231,14 +235,14 @@ static const struct SpriteTemplate sUnknown_83BF574 =
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_807834C, .callback = AnimFlashingCircleImpact,
}; };
// Functions // Unused
static u8 sub_8078178(u8 battlerId, bool8 b) static u8 Task_FlashingCircleImpacts(u8 battlerId, bool8 b)
{ {
u8 battlerSpriteId = gBattlerSpriteIds[battlerId]; u8 battlerSpriteId = gBattlerSpriteIds[battlerId];
u8 taskId = CreateTask(sub_80782BC, 10); u8 taskId = CreateTask(Task_UpdateFlashingCircleImpacts, 10);
u8 spriteId2; u8 spriteId2;
u8 i; u8 i;
@@ -250,7 +254,7 @@ static u8 sub_8078178(u8 battlerId, bool8 b)
gTasks[taskId].data[1] = RGB_RED; gTasks[taskId].data[1] = RGB_RED;
for (i = 0; i < 10; i++) for (i = 0; i < 10; i++)
{ {
spriteId2 = CreateSprite(&sUnknown_83BF574, gSprites[battlerSpriteId].x, gSprites[battlerSpriteId].y + 32, 0); spriteId2 = CreateSprite(&sFlashingCircleImpactSpriteTemplate, gSprites[battlerSpriteId].x, gSprites[battlerSpriteId].y + 32, 0);
gSprites[spriteId2].data[0] = i * 51; gSprites[spriteId2].data[0] = i * 51;
gSprites[spriteId2].data[1] = -256; gSprites[spriteId2].data[1] = -256;
gSprites[spriteId2].invisible = TRUE; gSprites[spriteId2].invisible = TRUE;
@@ -263,7 +267,7 @@ static u8 sub_8078178(u8 battlerId, bool8 b)
gTasks[taskId].data[1] = RGB_BLUE; gTasks[taskId].data[1] = RGB_BLUE;
for (i = 0; i < 10; i++) for (i = 0; i < 10; i++)
{ {
spriteId2 = CreateSprite(&sUnknown_83BF574, gSprites[battlerSpriteId].x, gSprites[battlerSpriteId].y - 32, 0); spriteId2 = CreateSprite(&sFlashingCircleImpactSpriteTemplate, gSprites[battlerSpriteId].x, gSprites[battlerSpriteId].y - 32, 0);
gSprites[spriteId2].data[0] = i * 51; gSprites[spriteId2].data[0] = i * 51;
gSprites[spriteId2].data[1] = 256; gSprites[spriteId2].data[1] = 256;
gSprites[spriteId2].invisible = TRUE; gSprites[spriteId2].invisible = TRUE;
@@ -275,7 +279,7 @@ static u8 sub_8078178(u8 battlerId, bool8 b)
return taskId; return taskId;
} }
static void sub_80782BC(u8 taskId) static void Task_UpdateFlashingCircleImpacts(u8 taskId)
{ {
if (gTasks[taskId].data[2] == 2) if (gTasks[taskId].data[2] == 2)
{ {
@@ -308,13 +312,13 @@ static void sub_80782BC(u8 taskId)
} }
} }
static void sub_807834C(struct Sprite *sprite) static void AnimFlashingCircleImpact(struct Sprite *sprite)
{ {
if (sprite->data[6] == 0) if (sprite->data[6] == 0)
{ {
sprite->invisible = FALSE; sprite->invisible = FALSE;
sprite->callback = sub_8078380; sprite->callback = AnimFlashingCircleImpact_Step;
sub_8078380(sprite); sprite->callback(sprite);
} }
else else
{ {
@@ -322,7 +326,7 @@ static void sub_807834C(struct Sprite *sprite)
} }
} }
static void sub_8078380(struct Sprite *sprite) static void AnimFlashingCircleImpact_Step(struct Sprite *sprite)
{ {
sprite->x2 = Cos(sprite->data[0], 32); sprite->x2 = Cos(sprite->data[0], 32);
sprite->y2 = Sin(sprite->data[0], 8); sprite->y2 = Sin(sprite->data[0], 8);
@@ -354,21 +358,21 @@ void AnimTask_FrozenIceCube(u8 taskId)
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
spriteId = CreateSprite(&sUnknown_83BF55C, x, y, 4); spriteId = CreateSprite(&sFrozenIceCubeSpriteTemplate, x, y, 4);
if (GetSpriteTileStartByTag(ANIM_TAG_ICE_CUBE) == TAG_NONE) if (GetSpriteTileStartByTag(ANIM_TAG_ICE_CUBE) == 0xFFFF)
gSprites[spriteId].invisible = TRUE; gSprites[spriteId].invisible = TRUE;
SetSubspriteTables(&gSprites[spriteId], sUnknown_83BF554); SetSubspriteTables(&gSprites[spriteId], sFrozenIceCubeSubspriteTable);
gTasks[taskId].data[15] = spriteId; gTasks[taskId].data[15] = spriteId;
gTasks[taskId].func = sub_80784D8; gTasks[taskId].func = AnimTask_FrozenIceCube_Step1;
} }
static void sub_80784D8(u8 taskId) static void AnimTask_FrozenIceCube_Step1(u8 taskId)
{ {
gTasks[taskId].data[1]++; gTasks[taskId].data[1]++;
if (gTasks[taskId].data[1] == 10) if (gTasks[taskId].data[1] == 10)
{ {
gTasks[taskId].func = sub_8078528; gTasks[taskId].func = AnimTask_FrozenIceCube_Step2;
gTasks[taskId].data[1] = 0; gTasks[taskId].data[1] = 0;
} }
else else
@@ -379,7 +383,7 @@ static void sub_80784D8(u8 taskId)
} }
} }
static void sub_8078528(u8 taskId) static void AnimTask_FrozenIceCube_Step2(u8 taskId)
{ {
u8 palIndex = IndexOfSpritePaletteTag(ANIM_TAG_ICE_CUBE); u8 palIndex = IndexOfSpritePaletteTag(ANIM_TAG_ICE_CUBE);
@@ -405,19 +409,19 @@ static void sub_8078528(u8 taskId)
if (gTasks[taskId].data[4] == 2) if (gTasks[taskId].data[4] == 2)
{ {
gTasks[taskId].data[1] = 9; gTasks[taskId].data[1] = 9;
gTasks[taskId].func = sub_80785D8; gTasks[taskId].func = AnimTask_FrozenIceCube_Step3;
} }
} }
} }
} }
} }
static void sub_80785D8(u8 taskId) static void AnimTask_FrozenIceCube_Step3(u8 taskId)
{ {
gTasks[taskId].data[1]--; gTasks[taskId].data[1]--;
if (gTasks[taskId].data[1] == -1) if (gTasks[taskId].data[1] == -1)
{ {
gTasks[taskId].func = sub_807862C; gTasks[taskId].func = AnimTask_FrozenIceCube_Step4;
gTasks[taskId].data[1] = 0; gTasks[taskId].data[1] = 0;
} }
else else
@@ -428,7 +432,7 @@ static void sub_80785D8(u8 taskId)
} }
} }
static void sub_807862C(u8 taskId) static void AnimTask_FrozenIceCube_Step4(u8 taskId)
{ {
gTasks[taskId].data[1]++; gTasks[taskId].data[1]++;
if (gTasks[taskId].data[1] == 37) if (gTasks[taskId].data[1] == 37)
+63 -60
View File
@@ -18,22 +18,22 @@ struct AnimStatsChangeData
static void StartBlendAnimSpriteColor(u8 taskId, u32 selectedPalettes); static void StartBlendAnimSpriteColor(u8 taskId, u32 selectedPalettes);
static void AnimTask_BlendSpriteColor_Step2(u8 taskId); static void AnimTask_BlendSpriteColor_Step2(u8 taskId);
static void Task_WaitHardwarePaletteFade(u8 taskId); static void AnimTask_HardwarePaletteFade_Step(u8 taskId);
static void Task_DoCloneBattlerSpriteWithBlend(u8 taskId); static void AnimTask_TraceMonBlended_Step(u8 taskId);
static void Task_FinishCloneBattlerSpriteWithBlend(struct Sprite *sprite); static void AnimMonTrace(struct Sprite *sprite);
static void AnimTask_DrawFallingWhiteLinesOnAttacker_Step(u8 taskId); static void AnimTask_DrawFallingWhiteLinesOnAttacker_Step(u8 taskId);
static void StatsChangeAnimation_Step1(u8 taskId); static void StatsChangeAnimation_Step1(u8 taskId);
static void StatsChangeAnimation_Step2(u8 taskId); static void StatsChangeAnimation_Step2(u8 taskId);
static void StatsChangeAnimation_Step3(u8 taskId); static void StatsChangeAnimation_Step3(u8 taskId);
static void sub_80BB6CC(u8 taskId); static void AnimTask_Flash_Step(u8 taskId);
static void sub_80BB790(u32 selectedPalettes, u16 color); static void SetPalettesToColor(u32 selectedPalettes, u16 color);
static void sub_80BB8A4(u8 taskId); static void AnimTask_UpdateSlidingBg(u8 taskId);
static void sub_80BBC2C(u8 taskId); static void UpdateMonScrollingBgMask(u8 taskId);
static void sub_80BC19C(u8 taskId); static void AnimTask_WaitAndRestoreVisibility(u8 taskId);
static EWRAM_DATA struct AnimStatsChangeData *sAnimStatsChangeData = NULL; static EWRAM_DATA struct AnimStatsChangeData *sAnimStatsChangeData = NULL;
static const u16 sRgbWhite[] = { RGB(31, 31, 31) }; static const u16 sRgbWhite[] = { RGB_WHITE };
const u8 gBattleAnimRegOffsBgCnt[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT }; const u8 gBattleAnimRegOffsBgCnt[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT };
const u8 gBattleIntroRegOffsBgCnt[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT }; const u8 gBattleIntroRegOffsBgCnt[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT };
@@ -50,11 +50,11 @@ const u8 gBattleIntroRegOffsBgCnt[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, RE
// 8: Player battler right // 8: Player battler right
// 9: Enemy battler left // 9: Enemy battler left
// 10: Enemy battler right // 10: Enemy battler right
void AnimTask_BlendSelected(u8 taskId) void AnimTask_BlendBattleAnimPal(u8 taskId)
{ {
u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]); u32 selectedPalettes = UnpackSelectedBattlePalettes(gBattleAnimArgs[0]);
selectedPalettes |= SelectBattlerSpritePalettes( selectedPalettes |= GetBattleMonSpritePalettesMask(
(gBattleAnimArgs[0] >> 7) & 1, (gBattleAnimArgs[0] >> 7) & 1,
(gBattleAnimArgs[0] >> 8) & 1, (gBattleAnimArgs[0] >> 8) & 1,
(gBattleAnimArgs[0] >> 9) & 1, (gBattleAnimArgs[0] >> 9) & 1,
@@ -72,26 +72,26 @@ void AnimTask_BlendSelected(u8 taskId)
// 5: Blend all // 5: Blend all
// 6: Neither bg nor attacker's partner // 6: Neither bg nor attacker's partner
// 7: Neither bg nor target's partner // 7: Neither bg nor target's partner
void AnimTask_BlendExcept(u8 taskId) void AnimTask_BlendBattleAnimPalExclude(u8 taskId)
{ {
u8 battler; u8 battler;
u32 selectedPalettes; u32 selectedPalettes;
u8 animBattlers[2]; u8 animBattlers[2];
animBattlers[1] = 0xFF; animBattlers[1] = 0xFF;
selectedPalettes = UnpackSelectedBattleAnimPalettes(1); selectedPalettes = UnpackSelectedBattlePalettes(1);
switch (gBattleAnimArgs[0]) switch (gBattleAnimArgs[0])
{ {
case 2: case 2:
selectedPalettes = 0; selectedPalettes = 0;
// fall through // fall through
case 0: case ANIM_ATTACKER:
animBattlers[0] = gBattleAnimAttacker; animBattlers[0] = gBattleAnimAttacker;
break; break;
case 3: case 3:
selectedPalettes = 0; selectedPalettes = 0;
// fall through // fall through
case 1: case ANIM_TARGET:
animBattlers[0] = gBattleAnimTarget; animBattlers[0] = gBattleAnimTarget;
break; break;
case 4: case 4:
@@ -122,7 +122,7 @@ void AnimTask_BlendExcept(u8 taskId)
void AnimTask_SetCamouflageBlend(u8 taskId) void AnimTask_SetCamouflageBlend(u8 taskId)
{ {
u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]); u32 selectedPalettes = UnpackSelectedBattlePalettes(gBattleAnimArgs[0]);
switch (gBattleTerrain) switch (gBattleTerrain)
{ {
@@ -217,16 +217,17 @@ void AnimTask_HardwarePaletteFade(u8 taskId)
gBattleAnimArgs[2], gBattleAnimArgs[2],
gBattleAnimArgs[3], gBattleAnimArgs[3],
gBattleAnimArgs[4]); gBattleAnimArgs[4]);
gTasks[taskId].func = Task_WaitHardwarePaletteFade; gTasks[taskId].func = AnimTask_HardwarePaletteFade_Step;
} }
static void Task_WaitHardwarePaletteFade(u8 taskId) static void AnimTask_HardwarePaletteFade_Step(u8 taskId)
{ {
if (!gPaletteFade.active) if (!gPaletteFade.active)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
void AnimTask_CloneBattlerSpriteWithBlend(u8 taskId) // Used to leave blended traces of a mon, usually to imply speed as in Agility or Aerial Ace
void AnimTask_TraceMonBlended(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -236,9 +237,9 @@ void AnimTask_CloneBattlerSpriteWithBlend(u8 taskId)
task->data[3] = gBattleAnimArgs[2]; task->data[3] = gBattleAnimArgs[2];
task->data[4] = gBattleAnimArgs[3]; task->data[4] = gBattleAnimArgs[3];
task->data[5] = 0; task->data[5] = 0;
task->func = Task_DoCloneBattlerSpriteWithBlend; task->func = AnimTask_TraceMonBlended_Step;
} }
static void Task_DoCloneBattlerSpriteWithBlend(u8 taskId) static void AnimTask_TraceMonBlended_Step(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -257,7 +258,7 @@ static void Task_DoCloneBattlerSpriteWithBlend(u8 taskId)
gSprites[task->data[6]].data[0] = task->data[3]; gSprites[task->data[6]].data[0] = task->data[3];
gSprites[task->data[6]].data[1] = taskId; gSprites[task->data[6]].data[1] = taskId;
gSprites[task->data[6]].data[2] = 5; gSprites[task->data[6]].data[2] = 5;
gSprites[task->data[6]].callback = Task_FinishCloneBattlerSpriteWithBlend; gSprites[task->data[6]].callback = AnimMonTrace;
++task->data[5]; ++task->data[5];
} }
--task->data[4]; --task->data[4];
@@ -270,7 +271,7 @@ static void Task_DoCloneBattlerSpriteWithBlend(u8 taskId)
} }
} }
static void Task_FinishCloneBattlerSpriteWithBlend(struct Sprite *sprite) static void AnimMonTrace(struct Sprite *sprite)
{ {
if (sprite->data[0]) if (sprite->data[0])
{ {
@@ -279,11 +280,12 @@ static void Task_FinishCloneBattlerSpriteWithBlend(struct Sprite *sprite)
else else
{ {
--gTasks[sprite->data[1]].data[sprite->data[2]]; --gTasks[sprite->data[1]].data[sprite->data[2]];
obj_delete_but_dont_free_vram(sprite); DestroySpriteWithActiveSheet(sprite);
} }
} }
void AnimTask_SetUpCurseBackground(u8 taskId) // Only used by Curse for non-Ghost mons
void AnimTask_DrawFallingWhiteLinesOnAttacker(u8 taskId)
{ {
u16 species; u16 species;
s32 newSpriteId; s32 newSpriteId;
@@ -330,7 +332,7 @@ void AnimTask_SetUpCurseBackground(u8 taskId)
else else
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
newSpriteId = CreateCloneOfSpriteInWindowMode(gBattleAnimAttacker, spriteId, species); newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species);
GetBattleAnimBg1Data(&animBgData); GetBattleAnimBg1Data(&animBgData);
AnimLoadCompressedBgTilemap(animBgData.bgId, gFile_graphics_battle_anims_masks_curse_tilemap); AnimLoadCompressedBgTilemap(animBgData.bgId, gFile_graphics_battle_anims_masks_curse_tilemap);
if (IsContest()) if (IsContest())
@@ -446,11 +448,11 @@ static void StatsChangeAnimation_Step2(u8 taskId)
u8 battlerSpriteId; u8 battlerSpriteId;
battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler1]; battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler1];
spriteId = CreateCloneOfSpriteInWindowMode(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species); spriteId = CreateInvisibleSpriteCopy(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species);
if (sAnimStatsChangeData->data[3]) if (sAnimStatsChangeData->data[3])
{ {
battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler2]; battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler2];
newSpriteId = CreateCloneOfSpriteInWindowMode(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species); newSpriteId = CreateInvisibleSpriteCopy(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species);
} }
GetBattleAnimBg1Data(&animBgData); GetBattleAnimBg1Data(&animBgData);
if (sAnimStatsChangeData->data[0] == 0) if (sAnimStatsChangeData->data[0] == 0)
@@ -580,19 +582,19 @@ static void StatsChangeAnimation_Step3(u8 taskId)
void AnimTask_Flash(u8 taskId) void AnimTask_Flash(u8 taskId)
{ {
u32 selectedPalettes = SelectBattlerSpritePalettes(1, 1, 1, 1); u32 selectedPalettes = GetBattleMonSpritePalettesMask(1, 1, 1, 1);
sub_80BB790(selectedPalettes, 0); SetPalettesToColor(selectedPalettes, 0);
gTasks[taskId].data[14] = selectedPalettes >> 16; gTasks[taskId].data[14] = selectedPalettes >> 16;
selectedPalettes = SelectBattleAnimSpriteAndBgPalettes(1, 0, 0, 0, 0, 0, 0) & 0xFFFF; selectedPalettes = GetBattlePalettesMask(1, 0, 0, 0, 0, 0, 0) & 0xFFFF;
sub_80BB790(selectedPalettes, 0xFFFF); SetPalettesToColor(selectedPalettes, 0xFFFF);
gTasks[taskId].data[15] = selectedPalettes; gTasks[taskId].data[15] = selectedPalettes;
gTasks[taskId].data[0] = 0; gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = 0; gTasks[taskId].data[1] = 0;
gTasks[taskId].func = sub_80BB6CC; gTasks[taskId].func = AnimTask_Flash_Step;
} }
static void sub_80BB6CC(u8 taskId) static void AnimTask_Flash_Step(u8 taskId)
{ {
u16 i; u16 i;
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -637,7 +639,7 @@ static void sub_80BB6CC(u8 taskId)
} }
} }
static void sub_80BB790(u32 selectedPalettes, u16 color) static void SetPalettesToColor(u32 selectedPalettes, u16 color)
{ {
u16 i, curOffset, paletteOffset; u16 i, curOffset, paletteOffset;
@@ -665,7 +667,7 @@ void AnimTask_StartSlidingBg(u8 taskId)
u8 newTaskId; u8 newTaskId;
ToggleBg3Mode(0); ToggleBg3Mode(0);
newTaskId = CreateTask(sub_80BB8A4, 5); newTaskId = CreateTask(AnimTask_UpdateSlidingBg, 5);
if (gBattleAnimArgs[2] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (gBattleAnimArgs[2] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{ {
gBattleAnimArgs[0] = -gBattleAnimArgs[0]; gBattleAnimArgs[0] = -gBattleAnimArgs[0];
@@ -678,7 +680,7 @@ void AnimTask_StartSlidingBg(u8 taskId)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
static void sub_80BB8A4(u8 taskId) static void AnimTask_UpdateSlidingBg(u8 taskId)
{ {
gTasks[taskId].data[10] += gTasks[taskId].data[1]; gTasks[taskId].data[10] += gTasks[taskId].data[1];
gTasks[taskId].data[11] += gTasks[taskId].data[2]; gTasks[taskId].data[11] += gTasks[taskId].data[2];
@@ -713,6 +715,7 @@ void AnimTask_GetTargetIsAttackerPartner(u8 taskId)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
// For hiding or subsequently revealing all other battlers
void AnimTask_SetAllNonAttackersInvisiblity(u8 taskId) void AnimTask_SetAllNonAttackersInvisiblity(u8 taskId)
{ {
u16 battler; u16 battler;
@@ -723,7 +726,7 @@ void AnimTask_SetAllNonAttackersInvisiblity(u8 taskId)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
void StartMonScrollingBgMask(u8 taskId, s32 unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, u8 arg6, u8 arg7, const u32 *gfx, const u32 *tilemap, const u32 *palette) void StartMonScrollingBgMask(u8 taskId, s32 unused, u16 scrollSpeed, u8 battler1, bool8 includePartner, u8 numFadeSteps, u8 fadeStepDelay, u8 duration, const u32 *gfx, const u32 *tilemap, const u32 *palette)
{ {
u16 species; u16 species;
u8 spriteId, newSpriteId = 0; u8 spriteId, newSpriteId = 0;
@@ -731,8 +734,8 @@ void StartMonScrollingBgMask(u8 taskId, s32 unused, u16 arg2, u8 battler1, u8 ar
struct BattleAnimBgData animBgData; struct BattleAnimBgData animBgData;
u8 battler2 = BATTLE_PARTNER(battler1); u8 battler2 = BATTLE_PARTNER(battler1);
if (IsContest() || (arg4 && !IsBattlerSpriteVisible(battler2))) if (IsContest() || (includePartner && !IsBattlerSpriteVisible(battler2)))
arg4 = 0; includePartner = FALSE;
gBattle_WIN0H = 0; gBattle_WIN0H = 0;
gBattle_WIN0V = 0; gBattle_WIN0V = 0;
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR
@@ -753,9 +756,9 @@ void StartMonScrollingBgMask(u8 taskId, s32 unused, u16 arg2, u8 battler1, u8 ar
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES); species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES);
else else
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES); species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES);
spriteId = CreateCloneOfSpriteInWindowMode(battler1, gBattlerSpriteIds[battler1], species); spriteId = CreateInvisibleSpriteCopy(battler1, gBattlerSpriteIds[battler1], species);
if (arg4) if (includePartner)
newSpriteId = CreateCloneOfSpriteInWindowMode(battler2, gBattlerSpriteIds[battler2], species); newSpriteId = CreateInvisibleSpriteCopy(battler2, gBattlerSpriteIds[battler2], species);
GetBattleAnimBg1Data(&animBgData); GetBattleAnimBg1Data(&animBgData);
AnimLoadCompressedBgTilemap(animBgData.bgId, tilemap); AnimLoadCompressedBgTilemap(animBgData.bgId, tilemap);
if (IsContest()) if (IsContest())
@@ -764,17 +767,17 @@ void StartMonScrollingBgMask(u8 taskId, s32 unused, u16 arg2, u8 battler1, u8 ar
LoadCompressedPalette(palette, animBgData.paletteId * 16, 32); LoadCompressedPalette(palette, animBgData.paletteId * 16, 32);
gBattle_BG1_X = 0; gBattle_BG1_X = 0;
gBattle_BG1_Y = 0; gBattle_BG1_Y = 0;
gTasks[taskId].data[1] = arg2; gTasks[taskId].data[1] = scrollSpeed;
gTasks[taskId].data[4] = arg5; gTasks[taskId].data[4] = numFadeSteps;
gTasks[taskId].data[5] = arg7; gTasks[taskId].data[5] = duration;
gTasks[taskId].data[6] = arg6; gTasks[taskId].data[6] = fadeStepDelay;
gTasks[taskId].data[0] = spriteId; gTasks[taskId].data[0] = spriteId;
gTasks[taskId].data[2] = arg4; gTasks[taskId].data[2] = includePartner;
gTasks[taskId].data[3] = newSpriteId; gTasks[taskId].data[3] = newSpriteId;
gTasks[taskId].func = sub_80BBC2C; gTasks[taskId].func = UpdateMonScrollingBgMask;
} }
static void sub_80BBC2C(u8 taskId) static void UpdateMonScrollingBgMask(u8 taskId)
{ {
gTasks[taskId].data[13] += gTasks[taskId].data[1] < 0 ? -gTasks[taskId].data[1] : gTasks[taskId].data[1]; gTasks[taskId].data[13] += gTasks[taskId].data[1] < 0 ? -gTasks[taskId].data[1] : gTasks[taskId].data[1];
if (gTasks[taskId].data[1] < 0) if (gTasks[taskId].data[1] < 0)
@@ -856,7 +859,7 @@ void AnimTask_CopyPalUnfadedToBackup(u8 taskId)
s32 paletteIndex = 0; s32 paletteIndex = 0;
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == 0)
for (selectedPalettes = SelectBattleAnimSpriteAndBgPalettes(1, 0, 0, 0, 0, 0, 0); for (selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);
(selectedPalettes & 1) == 0; (selectedPalettes & 1) == 0;
++paletteIndex) ++paletteIndex)
selectedPalettes >>= 1; selectedPalettes >>= 1;
@@ -874,7 +877,7 @@ void AnimTask_CopyPalUnfadedFromBackup(u8 taskId)
s32 paletteIndex = 0; s32 paletteIndex = 0;
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == 0)
for (selectedPalettes = SelectBattleAnimSpriteAndBgPalettes(1, 0, 0, 0, 0, 0, 0); for (selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);
(selectedPalettes & 1) == 0; (selectedPalettes & 1) == 0;
++paletteIndex) ++paletteIndex)
selectedPalettes >>= 1; selectedPalettes >>= 1;
@@ -892,7 +895,7 @@ void AnimTask_CopyPalFadedToUnfaded(u8 taskId)
s32 paletteIndex = 0; s32 paletteIndex = 0;
if (gBattleAnimArgs[0] == 0) if (gBattleAnimArgs[0] == 0)
for (selectedPalettes = SelectBattleAnimSpriteAndBgPalettes(1, 0, 0, 0, 0, 0, 0); for (selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);
(selectedPalettes & 1) == 0; (selectedPalettes & 1) == 0;
++paletteIndex) ++paletteIndex)
selectedPalettes >>= 1; selectedPalettes >>= 1;
@@ -907,9 +910,9 @@ void AnimTask_CopyPalFadedToUnfaded(u8 taskId)
void AnimTask_IsContest(u8 taskId) void AnimTask_IsContest(u8 taskId)
{ {
if (IsContest()) if (IsContest())
gBattleAnimArgs[7] = 1; gBattleAnimArgs[ARG_RET_ID] = TRUE;
else else
gBattleAnimArgs[7] = 0; gBattleAnimArgs[ARG_RET_ID] = FALSE;
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
@@ -923,9 +926,9 @@ void AnimTask_SetAnimAttackerAndTargetForEffectTgt(u8 taskId)
void AnimTask_IsTargetSameSide(u8 taskId) void AnimTask_IsTargetSameSide(u8 taskId)
{ {
if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
gBattleAnimArgs[7] = 1; gBattleAnimArgs[ARG_RET_ID] = TRUE;
else else
gBattleAnimArgs[7] = 0; gBattleAnimArgs[ARG_RET_ID] = FALSE;
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
@@ -952,12 +955,12 @@ void AnimTask_SetAttackerInvisibleWaitForSignal(u8 taskId)
{ {
gTasks[taskId].data[0] = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible; gTasks[taskId].data[0] = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible;
gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible = 1; gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible = 1;
gTasks[taskId].func = sub_80BC19C; gTasks[taskId].func = AnimTask_WaitAndRestoreVisibility;
--gAnimVisualTaskCount; --gAnimVisualTaskCount;
} }
} }
static void sub_80BC19C(u8 taskId) static void AnimTask_WaitAndRestoreVisibility(u8 taskId)
{ {
if (gBattleAnimArgs[7] == 0x1000) if (gBattleAnimArgs[7] == 0x1000)
{ {
+24 -27
View File
@@ -12,8 +12,6 @@
#include "trig.h" #include "trig.h"
#include "util.h" #include "util.h"
#define ISO_RANDOMIZE2(val)(1103515245 * (val) + 12345)
static void AnimRainDrop(struct Sprite *); static void AnimRainDrop(struct Sprite *);
static void AnimRainDrop_Step(struct Sprite *); static void AnimRainDrop_Step(struct Sprite *);
static void AnimWaterBubbleProjectile(struct Sprite *); static void AnimWaterBubbleProjectile(struct Sprite *);
@@ -55,9 +53,8 @@ static void AnimTask_WaterSport_Step(u8);
static void CreateWaterSportDroplet(struct Task *); static void CreateWaterSportDroplet(struct Task *);
static void CreateWaterPulseRingBubbles(struct Sprite *, s32, s32); static void CreateWaterPulseRingBubbles(struct Sprite *, s32, s32);
// Both unused? Comment copied from pokeemerald static const u8 sUnusedWater_Gfx[] = INCBIN_U8("graphics/battle_anims/unk_83E44F4.4bpp");
static const u8 gUnknown_83E44F4[] = INCBIN_U8("graphics/battle_anims/unk_83E44F4.4bpp"); static const u8 sUnusedWater[] = INCBIN_U8("graphics/battle_anims/unk_83E4874.bin");
static const u8 gUnknown_83E4874[] = INCBIN_U8("graphics/battle_anims/unk_83E4874.bin");
static const union AnimCmd sAnim_RainDrop[] = static const union AnimCmd sAnim_RainDrop[] =
{ {
@@ -488,8 +485,8 @@ void AnimTask_CreateRaindrops(u8 taskId)
gTasks[taskId].data[0]++; gTasks[taskId].data[0]++;
if (gTasks[taskId].data[0] % gTasks[taskId].data[2] == 1) if (gTasks[taskId].data[0] % gTasks[taskId].data[2] == 1)
{ {
x = Random() % 240; x = Random() % DISPLAY_WIDTH;
y = Random() % 80; y = Random() % (DISPLAY_HEIGHT / 2);
CreateSprite(&gRainDropSpriteTemplate, x, y, 4); CreateSprite(&gRainDropSpriteTemplate, x, y, 4);
} }
if (gTasks[taskId].data[0] == gTasks[taskId].data[3]) if (gTasks[taskId].data[0] == gTasks[taskId].data[3])
@@ -521,23 +518,23 @@ static void AnimWaterBubbleProjectile(struct Sprite *sprite)
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) - gBattleAnimArgs[0]; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) - gBattleAnimArgs[0];
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];
sprite->animPaused = TRUE; sprite->animPaused = TRUE;
} }
else else
{ {
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + gBattleAnimArgs[0]; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[0];
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];
sprite->animPaused = TRUE; sprite->animPaused = TRUE;
} }
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[2] = -gBattleAnimArgs[2]; gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[6]; sprite->data[0] = gBattleAnimArgs[6];
sprite->data[1] = sprite->x; sprite->data[1] = sprite->x;
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[3] = sprite->y; sprite->data[3] = sprite->y;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
InitAnimLinearTranslation(sprite); InitAnimLinearTranslation(sprite);
spriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); spriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);
sprite->data[5] = spriteId; sprite->data[5] = spriteId;
@@ -599,9 +596,9 @@ static void AnimAuroraBeamRings(struct Sprite *sprite)
unkArg = gBattleAnimArgs[2]; unkArg = gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[4]; sprite->data[0] = gBattleAnimArgs[4];
sprite->data[1] = sprite->x; sprite->data[1] = sprite->x;
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + unkArg; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + unkArg;
sprite->data[3] = sprite->y; sprite->data[3] = sprite->y;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
InitAnimLinearTranslation(sprite); InitAnimLinearTranslation(sprite);
sprite->callback = AnimAuroraBeamRings_Step; sprite->callback = AnimAuroraBeamRings_Step;
sprite->affineAnimPaused = TRUE; sprite->affineAnimPaused = TRUE;
@@ -653,9 +650,9 @@ static void AnimToTargetInSinWave(struct Sprite *sprite)
InitSpritePosToAnimAttacker(sprite, TRUE); InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[0] = 30; sprite->data[0] = 30;
sprite->data[1] = sprite->x; sprite->data[1] = sprite->x;
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[3] = sprite->y; sprite->data[3] = sprite->y;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
InitAnimLinearTranslation(sprite); InitAnimLinearTranslation(sprite);
sprite->data[5] = 0xD200 / sprite->data[0]; sprite->data[5] = 0xD200 / sprite->data[0];
sprite->data[7] = gBattleAnimArgs[3]; sprite->data[7] = gBattleAnimArgs[3];
@@ -708,8 +705,8 @@ static void AnimHydroCannonCharge(struct Sprite *sprite)
{ {
u8 priority; u8 priority;
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
sprite->y2 = -10; sprite->y2 = -10;
priority = GetBattlerSpriteSubpriority(gBattleAnimAttacker); priority = GetBattlerSpriteSubpriority(gBattleAnimAttacker);
if (!IsContest()) if (!IsContest())
@@ -755,14 +752,14 @@ static void AnimHydroCannonBeam(struct Sprite *sprite)
else else
animType = FALSE; animType = FALSE;
if ((u8)gBattleAnimArgs[5] == 0) if ((u8)gBattleAnimArgs[5] == 0)
coordType = 3; coordType = BATTLER_COORD_Y_PIC_OFFSET;
else else
coordType = 1; coordType = 1;
InitSpritePosToAnimAttacker(sprite, animType); InitSpritePosToAnimAttacker(sprite, animType);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[2] = -gBattleAnimArgs[2]; gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[4]; sprite->data[0] = gBattleAnimArgs[4];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, coordType) + gBattleAnimArgs[3]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, coordType) + gBattleAnimArgs[3];
sprite->callback = StartAnimLinearTranslation; sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
@@ -1173,8 +1170,8 @@ static u8 GetWaterSpoutPowerForAnim(void)
static void CreateWaterSpoutLaunchDroplets(struct Task *task, u8 taskId) static void CreateWaterSpoutLaunchDroplets(struct Task *task, u8 taskId)
{ {
s16 i; s16 i;
s16 attackerCoordX = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); s16 attackerCoordX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
s16 attackerCoordY = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); s16 attackerCoordY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
s16 trigIndex = 172; s16 trigIndex = 172;
u8 subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1; u8 subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1;
s16 increment = 4 - task->data[1]; s16 increment = 4 - task->data[1];
@@ -1347,8 +1344,8 @@ void AnimTask_WaterSport(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
task->data[3] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); task->data[3] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
task->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); task->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
task->data[7] = (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) ? 1 : -1; task->data[7] = (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) ? 1 : -1;
if (IsContest()) if (IsContest())
task->data[7] *= -1; task->data[7] *= -1;
@@ -1520,8 +1517,8 @@ static void AnimWaterPulseRingBubble(struct Sprite *sprite)
void AnimWaterPulseRing(struct Sprite *sprite) void AnimWaterPulseRing(struct Sprite *sprite)
{ {
InitSpritePosToAnimAttacker(sprite, TRUE); InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[3] = gBattleAnimArgs[2]; sprite->data[3] = gBattleAnimArgs[2];
sprite->data[4] = gBattleAnimArgs[3]; sprite->data[4] = gBattleAnimArgs[3];
sprite->callback = AnimWaterPulseRing_Step; sprite->callback = AnimWaterPulseRing_Step;
+2 -3
View File
@@ -15,7 +15,6 @@
#include "battle_interface.h" #include "battle_interface.h"
#include "battle_message.h" #include "battle_message.h"
#include "reshow_battle_screen.h" #include "reshow_battle_screen.h"
#include "battle_string_ids.h"
#include "constants/songs.h" #include "constants/songs.h"
#include "constants/items.h" #include "constants/items.h"
@@ -1662,7 +1661,7 @@ static void OakOldManHandleSuccessBallThrowAnim(void)
{ {
gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;
gDoingBattleAnim = TRUE; gDoingBattleAnim = TRUE;
InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW); InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;
} }
@@ -1672,7 +1671,7 @@ static void OakOldManHandleBallThrowAnim(void)
gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId;
gDoingBattleAnim = TRUE; gDoingBattleAnim = TRUE;
InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW); InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;
} }
-1
View File
@@ -15,7 +15,6 @@
#include "battle_controllers.h" #include "battle_controllers.h"
#include "battle_interface.h" #include "battle_interface.h"
#include "battle_message.h" #include "battle_message.h"
#include "battle_string_ids.h"
#include "reshow_battle_screen.h" #include "reshow_battle_screen.h"
#include "teachy_tv.h" #include "teachy_tv.h"
#include "constants/songs.h" #include "constants/songs.h"
+2 -2
View File
@@ -376,7 +376,7 @@ static void SafariHandleSuccessBallThrowAnim(void)
{ {
gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;
gDoingBattleAnim = TRUE; gDoingBattleAnim = TRUE;
InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW); InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;
} }
@@ -386,7 +386,7 @@ static void SafariHandleBallThrowAnim(void)
gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId;
gDoingBattleAnim = TRUE; gDoingBattleAnim = TRUE;
InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW); InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;
} }
+21 -22
View File
@@ -9,7 +9,6 @@
#include "battle_message.h" #include "battle_message.h"
#include "battle_scripts.h" #include "battle_scripts.h"
#include "battle_setup.h" #include "battle_setup.h"
#include "battle_string_ids.h"
#include "berry.h" #include "berry.h"
#include "data.h" #include "data.h"
#include "decompress.h" #include "decompress.h"
@@ -2274,8 +2273,8 @@ static void BattleStartClearSetData(void)
gLeveledUpInBattle = 0; gLeveledUpInBattle = 0;
gAbsentBattlerFlags = 0; gAbsentBattlerFlags = 0;
gBattleStruct->runTries = 0; gBattleStruct->runTries = 0;
gBattleStruct->safariGoNearCounter = 0; gBattleStruct->safariRockThrowCounter = 0;
gBattleStruct->safariPkblThrowCounter = 0; gBattleStruct->safariBaitThrowCounter = 0;
*(&gBattleStruct->safariCatchFactor) = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275; *(&gBattleStruct->safariCatchFactor) = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275;
*(&gBattleStruct->safariEscapeFactor) = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].safariZoneFleeRate * 100 / 1275; *(&gBattleStruct->safariEscapeFactor) = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].safariZoneFleeRate * 100 / 1275;
if (gBattleStruct->safariEscapeFactor <= 1) if (gBattleStruct->safariEscapeFactor <= 1)
@@ -4331,32 +4330,32 @@ static void HandleAction_WatchesCarefully(void)
gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0; gBattle_BG0_X = 0;
gBattle_BG0_Y = 0; gBattle_BG0_Y = 0;
if (gBattleStruct->safariGoNearCounter != 0) if (gBattleStruct->safariRockThrowCounter != 0)
{ {
--gBattleStruct->safariGoNearCounter; --gBattleStruct->safariRockThrowCounter;
if (gBattleStruct->safariGoNearCounter == 0) if (gBattleStruct->safariRockThrowCounter == 0)
{ {
*(&gBattleStruct->safariCatchFactor) = gBaseStats[GetMonData(gEnemyParty, MON_DATA_SPECIES)].catchRate * 100 / 1275; *(&gBattleStruct->safariCatchFactor) = gBaseStats[GetMonData(gEnemyParty, MON_DATA_SPECIES)].catchRate * 100 / 1275;
gBattleCommunication[MULTISTRING_CHOOSER] = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_WATCHING;
} }
else else
{ {
gBattleCommunication[MULTISTRING_CHOOSER] = 1; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_ANGRY;
} }
} }
else else
{ {
if (gBattleStruct->safariPkblThrowCounter != 0) if (gBattleStruct->safariBaitThrowCounter != 0)
{ {
--gBattleStruct->safariPkblThrowCounter; --gBattleStruct->safariBaitThrowCounter;
if (gBattleStruct->safariPkblThrowCounter == 0) if (gBattleStruct->safariBaitThrowCounter == 0)
gBattleCommunication[MULTISTRING_CHOOSER] = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_WATCHING;
else else
gBattleCommunication[5] = 2; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_EATING;
} }
else else
{ {
gBattleCommunication[MULTISTRING_CHOOSER] = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_WATCHING;
} }
} }
gBattlescriptCurrInstr = gBattlescriptsForSafariActions[0]; gBattlescriptCurrInstr = gBattlescriptsForSafariActions[0];
@@ -4379,10 +4378,10 @@ static void HandleAction_ThrowBait(void)
gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0; gBattle_BG0_X = 0;
gBattle_BG0_Y = 0; gBattle_BG0_Y = 0;
gBattleStruct->safariPkblThrowCounter += Random() % 5 + 2; gBattleStruct->safariBaitThrowCounter += Random() % 5 + 2;
if (gBattleStruct->safariPkblThrowCounter > 6) if (gBattleStruct->safariBaitThrowCounter > 6)
gBattleStruct->safariPkblThrowCounter = 6; gBattleStruct->safariBaitThrowCounter = 6;
gBattleStruct->safariGoNearCounter = 0; gBattleStruct->safariRockThrowCounter = 0;
gBattleStruct->safariCatchFactor >>= 1; gBattleStruct->safariCatchFactor >>= 1;
if (gBattleStruct->safariCatchFactor <= 2) if (gBattleStruct->safariCatchFactor <= 2)
gBattleStruct->safariCatchFactor = 3; gBattleStruct->safariCatchFactor = 3;
@@ -4395,10 +4394,10 @@ static void HandleAction_ThrowRock(void)
gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0; gBattle_BG0_X = 0;
gBattle_BG0_Y = 0; gBattle_BG0_Y = 0;
gBattleStruct->safariGoNearCounter += Random() % 5 + 2; gBattleStruct->safariRockThrowCounter += Random() % 5 + 2;
if (gBattleStruct->safariGoNearCounter > 6) if (gBattleStruct->safariRockThrowCounter > 6)
gBattleStruct->safariGoNearCounter = 6; gBattleStruct->safariRockThrowCounter = 6;
gBattleStruct->safariPkblThrowCounter = 0; gBattleStruct->safariBaitThrowCounter = 0;
gBattleStruct->safariCatchFactor <<= 1; gBattleStruct->safariCatchFactor <<= 1;
if (gBattleStruct->safariCatchFactor > 20) if (gBattleStruct->safariCatchFactor > 20)
gBattleStruct->safariCatchFactor = 20; gBattleStruct->safariCatchFactor = 20;
+1 -2
View File
@@ -1,6 +1,5 @@
#include "global.h" #include "global.h"
#include "gflib.h" #include "gflib.h"
#include "battle_string_ids.h"
#include "battle.h" #include "battle.h"
#include "battle_anim.h" #include "battle_anim.h"
#include "strings.h" #include "strings.h"
@@ -1186,7 +1185,7 @@ const u16 gInobedientStringIds[] =
[B_MSG_PRETEND_NOT_NOTICE] = STRINGID_PKMNPRETENDNOTNOTICE [B_MSG_PRETEND_NOT_NOTICE] = STRINGID_PKMNPRETENDNOTNOTICE
}; };
const u16 gSafariPokeblockResultStringIds[] = const u16 gSafariReactionStringIds[NUM_SAFARI_REACTIONS] =
{ {
[B_MSG_MON_WATCHING] = STRINGID_PKMNWATCHINGCAREFULLY, [B_MSG_MON_WATCHING] = STRINGID_PKMNWATCHINGCAREFULLY,
[B_MSG_MON_ANGRY] = STRINGID_PKMNANGRY, [B_MSG_MON_ANGRY] = STRINGID_PKMNANGRY,
-1
View File
@@ -23,7 +23,6 @@
#include "battle_anim.h" #include "battle_anim.h"
#include "battle_ai_script_commands.h" #include "battle_ai_script_commands.h"
#include "battle_scripts.h" #include "battle_scripts.h"
#include "battle_string_ids.h"
#include "reshow_battle_screen.h" #include "reshow_battle_screen.h"
#include "battle_controllers.h" #include "battle_controllers.h"
#include "battle_interface.h" #include "battle_interface.h"
-1
View File
@@ -15,7 +15,6 @@
#include "battle_message.h" #include "battle_message.h"
#include "constants/battle_anim.h" #include "constants/battle_anim.h"
#include "battle_controllers.h" #include "battle_controllers.h"
#include "battle_string_ids.h"
#include "battle_ai_script_commands.h" #include "battle_ai_script_commands.h"
#include "constants/battle.h" #include "constants/battle.h"
#include "constants/moves.h" #include "constants/moves.h"
File diff suppressed because it is too large Load Diff
-1
View File
@@ -22,7 +22,6 @@
#include "task.h" #include "task.h"
#include "text_window.h" #include "text_window.h"
#include "trig.h" #include "trig.h"
#include "battle_string_ids.h"
#include "constants/moves.h" #include "constants/moves.h"
#include "constants/songs.h" #include "constants/songs.h"
#include "constants/pokemon.h" #include "constants/pokemon.h"
+5 -5
View File
@@ -779,8 +779,8 @@ const u32 gBattleAnimSpriteGfx_Roots[] = INCBIN_U32("graphics/battle_anims/sprit
const u32 gBattleAnimSpritePal_ItemBag[] = INCBIN_U32("graphics/battle_anims/sprites/item_bag.gbapal.lz"); const u32 gBattleAnimSpritePal_ItemBag[] = INCBIN_U32("graphics/battle_anims/sprites/item_bag.gbapal.lz");
const u32 gBattleAnimSpriteGfx_ItemBag[] = INCBIN_U32("graphics/battle_anims/sprites/item_bag.4bpp.lz"); const u32 gBattleAnimSpriteGfx_ItemBag[] = INCBIN_U32("graphics/battle_anims/sprites/item_bag.4bpp.lz");
const u32 gBattleAnimSpritePal_TriForceTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/tri_attack_triangle.gbapal.lz"); const u32 gBattleAnimSpritePal_TriAttackTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/tri_attack_triangle.gbapal.lz");
const u32 gBattleAnimSpriteGfx_TriForceTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/tri_attack_triangle.4bpp.lz"); const u32 gBattleAnimSpriteGfx_TriAttackTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/tri_attack_triangle.4bpp.lz");
const u32 gBattleAnimSpritePal_LetterZ[] = INCBIN_U32("graphics/battle_anims/sprites/letter_z.gbapal.lz"); const u32 gBattleAnimSpritePal_LetterZ[] = INCBIN_U32("graphics/battle_anims/sprites/letter_z.gbapal.lz");
const u32 gBattleAnimSpriteGfx_LetterZ[] = INCBIN_U32("graphics/battle_anims/sprites/letter_z.4bpp.lz"); const u32 gBattleAnimSpriteGfx_LetterZ[] = INCBIN_U32("graphics/battle_anims/sprites/letter_z.4bpp.lz");
@@ -915,8 +915,8 @@ const u32 gBattleAnimSpriteGfx_TagHand[] = INCBIN_U32("graphics/battle_anims/spr
const u32 gBattleAnimSpriteGfx_NoiseLine[] = INCBIN_U32("graphics/battle_anims/sprites/noise_line.4bpp.lz"); const u32 gBattleAnimSpriteGfx_NoiseLine[] = INCBIN_U32("graphics/battle_anims/sprites/noise_line.4bpp.lz");
const u32 gUnknown_D2EC24_Gfx[] = INCBIN_U32("graphics/battle_anims/masks/unknown_D2EC24.4bpp.lz"); const u32 gUnusedLevelupAnimationGfx[] = INCBIN_U32("graphics/battle_anims/masks/unknown_D2EC24.4bpp.lz");
const u32 gUnknown_D2EC24_Tilemap[] = INCBIN_U32("graphics/battle_anims/masks/unknown_D2EC24.bin.lz"); const u32 gUnusedLevelupAnimationTilemap[] = INCBIN_U32("graphics/battle_anims/masks/unknown_D2EC24.bin.lz");
const u32 gBattleAnimSpriteGfx_SmallRedEye[] = INCBIN_U32("graphics/battle_anims/sprites/small_red_eye.4bpp.lz"); const u32 gBattleAnimSpriteGfx_SmallRedEye[] = INCBIN_U32("graphics/battle_anims/sprites/small_red_eye.4bpp.lz");
const u32 gBattleAnimSpritePal_SmallRedEye[] = INCBIN_U32("graphics/battle_anims/sprites/small_red_eye.gbapal.lz"); const u32 gBattleAnimSpritePal_SmallRedEye[] = INCBIN_U32("graphics/battle_anims/sprites/small_red_eye.gbapal.lz");
@@ -1021,7 +1021,7 @@ const u32 gBattleAnimSpritePal_Protect[] = INCBIN_U32("graphics/battle_anims/spr
const u32 gBattleAnimBgPalette_MuddyWater[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_muddy.gbapal.lz"); const u32 gBattleAnimBgPalette_MuddyWater[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_muddy.gbapal.lz");
const u32 gFile_graphics_battle_interface_enemy_mon_shadow_sheet[] = INCBIN_U32("graphics/battle_interface/enemy_mon_shadow.4bpp.lz"); const u32 gEnemyMonShadow_Gfx[] = INCBIN_U32("graphics/battle_interface/enemy_mon_shadow.4bpp.lz");
const u32 gFile_graphics_battle_interface_ball_status_bar_sheet[] = INCBIN_U32("graphics/battle_interface/ball_status_bar.4bpp.lz"); const u32 gFile_graphics_battle_interface_ball_status_bar_sheet[] = INCBIN_U32("graphics/battle_interface/ball_status_bar.4bpp.lz");
+2 -2
View File
@@ -319,7 +319,7 @@ static void sub_80709B4(struct PaletteStruct *a1)
return; return;
if (val > 2) if (val > 2)
return; return;
ResetPaletteStructByUid(a1->base->uid); PaletteStruct_ResetById(a1->base->uid);
} }
} }
else else
@@ -328,7 +328,7 @@ static void sub_80709B4(struct PaletteStruct *a1)
} }
} }
void ResetPaletteStructByUid(u16 a1) void PaletteStruct_ResetById(u16 a1)
{ {
u8 paletteNum = GetPaletteNumByUid(a1); u8 paletteNum = GetPaletteNumByUid(a1);
if (paletteNum != 16) if (paletteNum != 16)
-73
View File
@@ -1,73 +0,0 @@
#include "global.h"
#include "decompress.h"
#include "util.h"
static void SmokescreenImpact_Callback(struct Sprite *sprite);
extern const struct CompressedSpriteSheet gSmokescreenImpactSpriteSheet;
extern const struct CompressedSpritePalette gSmokescreenImpactSpritePalette;
extern const struct SpriteTemplate gSmokescreenImpactSpriteTemplate;
u8 SmokescreenImpact(s16 x, s16 y, u8 a3)
{
u8 mainSpriteId;
u8 spriteId1, spriteId2, spriteId3, spriteId4;
struct Sprite *mainSprite;
if (GetSpriteTileStartByTag(gSmokescreenImpactSpriteSheet.tag) == 0xFFFF)
{
LoadCompressedSpriteSheetUsingHeap(&gSmokescreenImpactSpriteSheet);
LoadCompressedSpritePaletteUsingHeap(&gSmokescreenImpactSpritePalette);
}
mainSpriteId = CreateInvisibleSpriteWithCallback(SmokescreenImpact_Callback);
mainSprite = &gSprites[mainSpriteId];
mainSprite->data[1] = a3;
spriteId1 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x - 16, y - 16, 2);
gSprites[spriteId1].data[0] = mainSpriteId;
mainSprite->data[0]++;
AnimateSprite(&gSprites[spriteId1]);
spriteId2 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x, y - 16, 2);
gSprites[spriteId2].data[0] = mainSpriteId;
mainSprite->data[0]++;
StartSpriteAnim(&gSprites[spriteId2], 1);
AnimateSprite(&gSprites[spriteId2]);
spriteId3 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x - 16, y, 2);
gSprites[spriteId3].data[0] = mainSpriteId;
mainSprite->data[0]++;
StartSpriteAnim(&gSprites[spriteId3], 2);
AnimateSprite(&gSprites[spriteId3]);
spriteId4 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x, y, 2);
gSprites[spriteId4].data[0] = mainSpriteId;
mainSprite->data[0]++;
StartSpriteAnim(&gSprites[spriteId4], 3);
AnimateSprite(&gSprites[spriteId4]);
return mainSpriteId;
}
static void SmokescreenImpact_Callback(struct Sprite *sprite)
{
if (!sprite->data[0])
{
FreeSpriteTilesByTag(gSmokescreenImpactSpriteSheet.tag);
FreeSpritePaletteByTag(gSmokescreenImpactSpritePalette.tag);
if (!sprite->data[1])
DestroySprite(sprite);
else
sprite->callback = SpriteCallbackDummy;
}
}
void SpriteCB_DestroySprite(struct Sprite *sprite)
{
if (sprite->animEnded)
{
gSprites[sprite->data[0]].data[0]--;
DestroySprite(sprite);
}
}
+1 -1
View File
@@ -2140,7 +2140,7 @@ static void HandleRedrawTradeMenuOnSide(u8 side)
gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].data[4] = (sTradeMonSpriteCoords[whichParty * PARTY_SIZE][1] * 8) - 12; gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].data[4] = (sTradeMonSpriteCoords[whichParty * PARTY_SIZE][1] * 8) - 12;
StoreSpriteCallbackInData6(&gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]], SpriteCB_MonIcon); StoreSpriteCallbackInData6(&gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]], SpriteCB_MonIcon);
sTradeMenuResourcesPtr->menuRedrawState[side]++; sTradeMenuResourcesPtr->menuRedrawState[side]++;
StartSpriteLinearTranslationFromCurrentPos(&gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]]); TradeMenuBouncePartySprites(&gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]]);
CopyToBgTilemapBufferRect_ChangePalette(1, sTradePartyBoxTilemap, side * 15, 0, 15, 17, 0); CopyToBgTilemapBufferRect_ChangePalette(1, sTradePartyBoxTilemap, side * 15, 0, 15, 17, 0);
CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(0);
+1 -1
View File
@@ -55,7 +55,7 @@
.include "src/safari_zone.o" .include "src/safari_zone.o"
.include "src/item_use.o" .include "src/item_use.o"
.include "src/battle_anim_effects_1.o" .include "src/battle_anim_effects_1.o"
.include "src/dragon.o" .include "src/battle_anim_dragon.o"
.include "src/battle_anim_utility_funcs.o" .include "src/battle_anim_utility_funcs.o"
.include "src/battle_intro.o" .include "src/battle_intro.o"
.include "src/easy_chat.o" .include "src/easy_chat.o"