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)/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: CFLAGS := -O2 -mthumb-interwork -quiet
+46 -46
View File
@@ -14,7 +14,7 @@
.byte 0x02
.4byte \template
.if \anim_battler == ANIM_TARGET
.byte 0x80 | (\subpriority_offset & 0x7F)
.byte ANIMSPRITE_IS_TARGET | (\subpriority_offset & 0x7F)
.else
.byte (\subpriority_offset & 0x7F)
.endif
@@ -34,20 +34,20 @@
.Lcreatetask_\@_2:
.endm
.macro delay param0:req
.macro delay frames:req
.byte 0x4
.byte \param0
.byte \frames
.endm
.macro waitforvisualfinish
.byte 0x5
.endm
.macro hang1
.macro nop
.byte 0x6
.endm
.macro hang2
.macro nop2
.byte 0x7
.endm
@@ -79,30 +79,30 @@
.byte 0xd
.endm
.macro call param0:req
.macro call ptr:req
.byte 0xe
.4byte \param0
.4byte \ptr
.endm
.macro return
.byte 0xf
.endm
.macro setarg param0:req, param1:req
.macro setarg argId:req, value:req
.byte 0x10
.byte \param0
.2byte \param1
.byte \argId
.2byte \value
.endm
.macro choosetwoturnanim param0:req, param1:req
.macro choosetwoturnanim ptr1:req, ptr2:req
.byte 0x11
.4byte \param0
.4byte \param1
.4byte \ptr1
.4byte \ptr2
.endm
.macro jumpifmoveturn param0:req, ptr:req
.macro jumpifmoveturn value:req, ptr:req
.byte 0x12
.byte \param0
.byte \value
.4byte \ptr
.endm
@@ -144,13 +144,13 @@
.byte \pan
.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
.2byte \se
.byte \param1
.byte \param2
.byte \param3
.byte \param4
.byte \currentPan
.byte \targetPan
.byte \incrementPan
.byte \delay
.endm
.macro loopsewithpan se:req, pan:req, wait:req, times:req
@@ -168,9 +168,9 @@
.byte \wait
.endm
.macro setbldcnt param0:req
.macro setbldcnt bldcnt:req
.byte 0x1e
.2byte \param0
.2byte \bldcnt
.endm
.macro createsoundtask addr:req, argv:vararg
@@ -186,19 +186,19 @@
.byte 0x20
.endm
.macro jumpargeq param0:req, param1:req, ptr:req
.macro jumpargeq argId:req, value:req, ptr:req
.byte 0x21
.byte \param0
.2byte \param1
.byte \argId
.2byte \value
.4byte \ptr
.endm
.macro monbg_22 battler:req
.macro monbg_static battler:req
.byte 0x22
.byte \battler
.endm
.macro clearmonbg_23 battler:req
.macro clearmonbg_static battler:req
.byte 0x23
.byte \battler
.endm
@@ -208,41 +208,41 @@
.4byte \ptr
.endm
.macro fadetobgfromset param0:req, param1:req, param2:req
.macro fadetobgfromset bgOpponent:req, bgPlayer:req, bgContest:req
.byte 0x25
.byte \param0
.byte \param1
.byte \param2
.byte \bgOpponent
.byte \bgPlayer
.byte \bgContest
.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
.2byte \se
.byte \param1
.byte \param2
.byte \param3
.byte \param4
.byte \currentPan
.byte \targetPan
.byte \incrementPan
.byte \delay
.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
.2byte \se
.byte \param1
.byte \param2
.byte \param3
.byte \param4
.byte \currentPan
.byte \targetPan
.byte \incrementPan
.byte \delay
.endm
.macro monbgprio_28 battler:req
.macro splitbgprio battler:req
.byte 0x28
.byte \battler
.endm
.macro monbgprio_29
.macro splitbgprio_all
.byte 0x29
.endm
.macro monbgprio_2A battler:req
.macro splitbgprio_foes battler:req
.byte 0x2a
.byte \battler
.endm
@@ -257,12 +257,12 @@
.byte \battler
.endm
.macro doublebattle_2D battler:req
.macro teamattack_moveback battler:req
.byte 0x2d
.byte \battler
.endm
.macro doublebattle_2E battler:req
.macro teamattack_movefwd battler:req
.byte 0x2e
.byte \battler
.endm
+23
View File
@@ -488,3 +488,26 @@
.set OAM_SIZE_8x32, OAM_SIZE_1 | OAM_V_RECTANGLE
.set OAM_SIZE_16x32, OAM_SIZE_2 | 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/trainers.h"
#include "constants/game_stat.h"
#include "battle_string_ids.h"
#include "constants/battle_string_ids.h"
.include "asm/macros/battle_script.inc"
@ Define these here since misc_constants.inc conflicts with the C headers
.set NULL, 0
+2 -2
View File
@@ -9,7 +9,7 @@
#include "constants/pokemon.h"
#include "constants/songs.h"
#include "constants/game_stat.h"
#include "battle_string_ids.h"
#include "constants/battle_string_ids.h"
.include "asm/macros/battle_script.inc"
@ Define these here since misc_constants.inc conflicts with the C headers
.set NULL, 0
@@ -209,7 +209,7 @@ BattleScript_PokeFluteEnd::
finishaction
BattleScript_WatchesCarefully::
printfromtable gSafariPokeblockResultStringIds
printfromtable gSafariReactionStringIds
waitmessage B_WAIT_TIME_LONG
playanimation BS_OPPONENT1, B_ANIM_SAFARI_REACTION
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 caughtMonNick[POKEMON_NAME_LENGTH + 1];
u8 field_78; // unused
u8 safariGoNearCounter;
u8 safariPkblThrowCounter;
u8 safariRockThrowCounter;
u8 safariBaitThrowCounter;
u8 safariEscapeFactor;
u8 safariCatchFactor;
u8 linkBattleVsSpriteId_V;
+74 -364
View File
@@ -17,6 +17,36 @@ enum
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
{
u8 *bgTiles;
@@ -60,9 +90,8 @@ extern u8 gBattleAnimTarget;
extern u8 gBattlerSpriteIds[MAX_BATTLERS_COUNT];
extern s32 gAnimMoveDmg;
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_16x16;
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_16x32;
extern const struct OamData gOamData_AffineDouble_ObjBlend_32x64;
extern const struct MonCoords gCastformFrontSpriteCoords[];
extern const struct CompressedSpriteSheet gBattleAnimPicTable[];
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 ResetBattleAnimBg(u8);
void ClearBattleAnimationVars(void);
@@ -152,209 +200,19 @@ s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan);
bool8 IsBattlerSpriteVisible(u8 battlerId);
s16 KeepPanInRange(s16 a, s32 oldPan);
void RelocateBattleBgPal(u16 paletteNum, u16 *dest, s32 offset, u8 largeScreen);
// battle_intro.c
void SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value);
s32 GetAnimBgAttribute(u8 bgId, u8 attributeId);
void HandleIntroSlide(u8 terrain);
void BattleIntroSlideEnd(u8 taskId);
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 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);
u8 ItemIdToBallId(u16 itemId);
u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId);
u8 LaunchBallFadeMonTask(bool8 unFadeLater, u8 battlerId, u32 arg2, u8 ballId);
void DoLoadHealthboxPalsForLevelUp(u8 *, u8 *, u8 battlerId);
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);
// battle_anim_mons.c
extern const struct MonCoords gCastformFrontSpriteCoords[];
u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType);
u8 GetBattlerSpriteCoord2(u8 battlerId, u8 coordType);
u8 GetBattlerSpriteDefault_Y(u8 battlerId);
@@ -363,15 +221,15 @@ u8 GetGhostSpriteDefault_Y(u8 battlerId);
u8 GetBattlerYCoordWithElevation(u8 battlerId);
u8 GetAnimBattlerSpriteId(u8 animBattler);
void StoreSpriteCallbackInData6(struct Sprite *sprite, SpriteCallback callback);
void TranslateSpriteInCircleOverDuration(struct Sprite *sprite);
void TranslateSpriteInGrowingCircleOverDuration(struct Sprite *sprite);
void TranslateSpriteInEllipseOverDuration(struct Sprite *sprite);
void TranslateSpriteInCircle(struct Sprite *sprite);
void TranslateSpriteInGrowingCircle(struct Sprite *sprite);
void TranslateSpriteInEllipse(struct Sprite *sprite);
void WaitAnimForDuration(struct Sprite *sprite);
void SetupLinearTranslationWithFixedDuration(struct Sprite *sprite);
void ConvertPosDataToTranslateLinearData(struct Sprite *sprite);
void TranslateSpriteLinear(struct Sprite *sprite);
void TranslateSpriteLinearFixedPoint(struct Sprite *sprite);
void TranslateMonSpriteLinear(struct Sprite *sprite);
void TranslateMonSpriteLinearFixedPoint(struct Sprite *sprite);
void TranslateSpriteLinearById(struct Sprite *sprite);
void TranslateSpriteLinearByIdFixedPoint(struct Sprite *sprite);
void TranslateSpriteLinearAndFlicker(struct Sprite *sprite);
void DestroySpriteAndMatrix(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);
u8 GetBattleBgPaletteNum(void);
void ToggleBg3Mode(bool8 arg0);
void StartSpriteLinearTranslationFromCurrentPos(struct Sprite *sprite);
void TradeMenuBouncePartySprites(struct Sprite *sprite);
void InitSpriteDataForLinearTranslation(struct Sprite *sprite);
void InitAnimLinearTranslation(struct Sprite *sprite);
void StartAnimLinearTranslation(struct Sprite *sprite);
void PlayerThrowBall_StartAnimLinearTranslation(struct Sprite *sprite);
bool8 AnimTranslateLinear(struct Sprite *sprite);
void RunLinearTranslation_ThenceSetCBtoStoredInData6(struct Sprite *sprite);
void BattleAnim_InitLinearTranslationWithDuration(struct Sprite *sprite);
void BattleAnim_InitAndRunLinearTranslationWithDuration(struct Sprite *sprite);
void AnimTranslateLinear_WithFollowup(struct Sprite *sprite);
void InitAnimLinearTranslationWithSpeed(struct Sprite *sprite);
void InitAnimLinearTranslationWithSpeedAndPos(struct Sprite *sprite);
void InitAndRunAnimFastLinearTranslation(struct Sprite *sprite);
bool8 AnimFastTranslateLinear(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 PrepareBattlerSpriteForRotScale(u8 spriteId, u8 objMode);
void ResetSpriteRotScale(u8 spriteId);
@@ -421,18 +279,15 @@ void TrySetSpriteRotScale(struct Sprite *sprite, bool8 recalcCenterVector, s16 x
void TryResetSpriteAffineState(struct Sprite *sprite);
u16 ArcTan2Neg(s16 a, s16 b);
void SetGreyscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor);
u32 SelectBattleAnimSpriteAndBgPalettes(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 GetBattlePalettesMask(bool8 battleBackground, bool8 attacker, bool8 target, bool8 attackerPartner, bool8 targetPartner, bool8 a6, bool8 a7);
u32 GetBattleMonSpritePalettesMask(bool8 playerLeft, bool8 playerRight, bool8 foeLeft, bool8 foeRight);
u8 GetSpritePalIdxByBattler(u8 a1);
void AnimSpriteOnMonPos(struct Sprite *sprite);
void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite);
void AnimThrowProjectile(struct Sprite *sprite);
void AnimSnoreZ(struct Sprite *sprite);
void AnimTravelDiagonally(struct Sprite *sprite);
s16 CloneBattlerSpriteWithBlend(u8 animBattler);
void obj_delete_but_dont_free_vram(struct Sprite *sprite);
void AnimTask_AlphaFadeIn(u8 taskId);
void AnimTask_BlendMonInAndOut(u8 task);
void AnimTask_BlendPalInAndOutByTag(u8 taskId);
void DestroySpriteWithActiveSheet(struct Sprite *sprite);
void PrepareAffineAnimInTaskData(struct Task *task, u8 spriteId, const union AffineAnimCmd *affineAnimCmds);
bool8 RunAffineAnimFromTaskData(struct Task *task);
void SetBattlerSpriteYOffsetFromYScale(u8 spriteId);
@@ -441,173 +296,28 @@ void StorePointerInVars(s16 *lo, s16 *hi, const void *ptr);
void *LoadPointerFromVars(s16 lo, s16 hi);
void BattleAnimHelper_SetSpriteSquashParams(struct Task *task, u8 spriteId, s16 xScale0, s16 yScale0, s16 xScale1, s16 yScale1, u16 duration);
u8 BattleAnimHelper_RunSpriteSquash(struct Task *task);
void AnimTask_GetFrustrationPowerLevel(u8 taskId);
void ResetSpritePriorityOfAllVisibleBattlers(void);
void InitPrioritiesForVisibleBattlers(void);
u8 GetBattlerSpriteSubpriority(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 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);
s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr);
void SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x, s16 *y);
u8 CreateCloneOfSpriteInWindowMode(s32 battlerId, u8 spriteId, s32 species);
void SpriteCB_AnimTranslateSpriteLinearAndFlicker(struct Sprite *sprite);
void SpriteCB_AnimTranslateSpriteLinearAndFlicker2(struct Sprite *sprite);
void SpriteCB_TrackOffsetFromAttackerAndWaitAnim(struct Sprite *sprite);
void AnimTask_AttackerPunchWithTrace(u8 taskId);
void SpriteCB_WeatherBallUp(struct Sprite *sprite);
u8 CreateInvisibleSpriteCopy(s32 battlerId, u8 spriteId, s32 species);
void AnimTranslateLinearAndFlicker_Flipped(struct Sprite *sprite);
void AnimTranslateLinearAndFlicker(struct Sprite *sprite);
void AnimSpinningSparkle(struct Sprite *sprite);
void AnimWeatherBallUp(struct Sprite *sprite);
void AnimWeatherBallDown(struct Sprite *sprite);
// battle_anim_mon_movement.c
void AnimTask_ShakeMon(u8 taskId);
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 AnimParticleBurst(struct Sprite *);
void AnimMoveTwisterParticle(struct Sprite *);
u32 UnpackSelectedBattlePalettes(s16 selector);
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 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);
// smokescreen.c
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 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 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
+1
View File
@@ -2,6 +2,7 @@
#define GUARD_BATTLE_MESSAGE_H
#include "global.h"
#include "constants/battle_string_ids.h"
// for 0xFD
+71 -52
View File
@@ -237,7 +237,7 @@
#define ANIM_TAG_SPOTLIGHT (ANIM_SPRITES_START + 227)
#define ANIM_TAG_LETTER_Z (ANIM_SPRITES_START + 228)
#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_FIRE (ANIM_SPRITES_START + 232)
#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_WHITE_CIRCLE_OF_LIGHT (ANIM_SPRITES_START + 267)
#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_SPARKLE_6 (ANIM_SPRITES_START + 271)
#define ANIM_TAG_SPLASH (ANIM_SPRITES_START + 272)
@@ -318,7 +318,7 @@
#define SOUND_PAN_TARGET 63
// 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_GHOST 2
#define BG_PSYCHIC 3
@@ -346,59 +346,62 @@
#define BG_SOLAR_BEAM_PLAYER 25
#define BG_SOLAR_BEAM_CONTESTS 26
// table ids for general animations
#define B_ANIM_CASTFORM_CHANGE 0x0
#define B_ANIM_STATS_CHANGE 0x1
#define B_ANIM_SUBSTITUTE_FADE 0x2
#define B_ANIM_SUBSTITUTE_APPEAR 0x3
#define B_ANIM_BAIT_THROW 0x4
#define B_ANIM_ITEM_KNOCKOFF 0x5
#define B_ANIM_TURN_TRAP 0x6
#define B_ANIM_HELD_ITEM_EFFECT 0x7
#define B_ANIM_SMOKEBALL_ESCAPE 0x8
#define B_ANIM_FOCUS_BAND 0x9
#define B_ANIM_RAIN_CONTINUES 0xA
#define B_ANIM_SUN_CONTINUES 0xB
#define B_ANIM_SANDSTORM_CONTINUES 0xC
#define B_ANIM_HAIL_CONTINUES 0xD
#define B_ANIM_LEECH_SEED_DRAIN 0xE
#define B_ANIM_MON_HIT 0xF
#define B_ANIM_ITEM_STEAL 0x10
#define B_ANIM_SNATCH_MOVE 0x11
#define B_ANIM_FUTURE_SIGHT_HIT 0x12
#define B_ANIM_DOOM_DESIRE_HIT 0x13
#define B_ANIM_FOCUS_PUNCH_SETUP 0x14
#define B_ANIM_INGRAIN_HEAL 0x15
#define B_ANIM_WISH_HEAL 0x16
#define B_ANIM_MON_SCARED 0x17
#define B_ANIM_GHOST_GET_OUT 0x18
#define B_ANIM_SILPH_SCOPED 0x19
#define B_ANIM_ROCK_THROW 0x1A
#define B_ANIM_SAFARI_REACTION 0x1B
// table ids for general animations (gBattleAnims_General)
#define B_ANIM_CASTFORM_CHANGE 0
#define B_ANIM_STATS_CHANGE 1
#define B_ANIM_SUBSTITUTE_FADE 2
#define B_ANIM_SUBSTITUTE_APPEAR 3
#define B_ANIM_BAIT_THROW 4
#define B_ANIM_ITEM_KNOCKOFF 5
#define B_ANIM_TURN_TRAP 6
#define B_ANIM_HELD_ITEM_EFFECT 7
#define B_ANIM_SMOKEBALL_ESCAPE 8
#define B_ANIM_FOCUS_BAND 9
#define B_ANIM_RAIN_CONTINUES 10
#define B_ANIM_SUN_CONTINUES 11
#define B_ANIM_SANDSTORM_CONTINUES 12
#define B_ANIM_HAIL_CONTINUES 13
#define B_ANIM_LEECH_SEED_DRAIN 14
#define B_ANIM_MON_HIT 15
#define B_ANIM_ITEM_STEAL 16
#define B_ANIM_SNATCH_MOVE 17
#define B_ANIM_FUTURE_SIGHT_HIT 18
#define B_ANIM_DOOM_DESIRE_HIT 19
#define B_ANIM_FOCUS_PUNCH_SETUP 20
#define B_ANIM_INGRAIN_HEAL 21
#define B_ANIM_WISH_HEAL 22
#define B_ANIM_MON_SCARED 23
#define B_ANIM_GHOST_GET_OUT 24
#define B_ANIM_SILPH_SCOPED 25
#define B_ANIM_ROCK_THROW 26
#define B_ANIM_SAFARI_REACTION 27
// special animations table
#define B_ANIM_LVL_UP 0x0
#define B_ANIM_SWITCH_OUT_PLAYER_MON 0x1
#define B_ANIM_SWITCH_OUT_OPPONENT_MON 0x2
#define B_ANIM_BALL_THROW 0x3
#define B_ANIM_SAFARI_BALL_THROW 0x4
#define B_ANIM_SUBSTITUTE_TO_MON 0x5
#define B_ANIM_MON_TO_SUBSTITUTE 0x6
// special animations table (gBattleAnims_Special)
#define B_ANIM_LVL_UP 0
#define B_ANIM_SWITCH_OUT_PLAYER_MON 1
#define B_ANIM_SWITCH_OUT_OPPONENT_MON 2
#define B_ANIM_BALL_THROW 3
#define B_ANIM_BALL_THROW_WITH_TRAINER 4
#define B_ANIM_SUBSTITUTE_TO_MON 5
#define B_ANIM_MON_TO_SUBSTITUTE 6
// status animation table
#define B_ANIM_STATUS_PSN 0x0
#define B_ANIM_STATUS_CONFUSION 0x1
#define B_ANIM_STATUS_BRN 0x2
#define B_ANIM_STATUS_INFATUATION 0x3
#define B_ANIM_STATUS_SLP 0x4
#define B_ANIM_STATUS_PRZ 0x5
#define B_ANIM_STATUS_FRZ 0x6
#define B_ANIM_STATUS_CURSED 0x7
#define B_ANIM_STATUS_NIGHTMARE 0x8
#define B_ANIM_STATUS_WRAPPED 0x9 // does not actually exist
// status animation table (gBattleAnims_StatusConditions)
#define B_ANIM_STATUS_PSN 0
#define B_ANIM_STATUS_CONFUSION 1
#define B_ANIM_STATUS_BRN 2
#define B_ANIM_STATUS_INFATUATION 3
#define B_ANIM_STATUS_SLP 4
#define B_ANIM_STATUS_PRZ 5
#define B_ANIM_STATUS_FRZ 6
#define B_ANIM_STATUS_CURSED 7
#define B_ANIM_STATUS_NIGHTMARE 8
#define B_ANIM_STATUS_WRAPPED 9 // does not actually exist
// 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.
#define TRAP_ANIM_BIND 0
@@ -415,6 +418,22 @@
#define ANIM_WEATHER_SANDSTORM 3
#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.
#define BACK_ANIM_NONE 0x00
#define BACK_ANIM_H_SLIDE_QUICK 0x01
@@ -551,10 +551,11 @@
#define B_MSG_CREPT_CLOSER 0
#define B_MSG_CANT_GET_CLOSER 1
// gSafariPokeblockResultStringIds
#define B_MSG_MON_WATCHING 0
#define B_MSG_MON_ANGRY 1
#define B_MSG_MON_EATING 2
// gSafariReactionStringIds
#define B_MSG_MON_WATCHING 0
#define B_MSG_MON_ANGRY 1
#define B_MSG_MON_EATING 2
#define NUM_SAFARI_REACTIONS 3
// gFlashFireStringIds
#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;
};
#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 gMoveNames[][13];
-14
View File
@@ -79,20 +79,6 @@
#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
#define NAKED __attribute__((naked))
#define UNUSED __attribute__((unused))
+1
View File
@@ -9,6 +9,7 @@
#include "constants/vars.h"
#include "constants/species.h"
#include "constants/easy_chat.h"
#include "constants/rgb.h"
// Prevent cross-jump optimization.
#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 gBattleStatMask2_Tilemap[];
extern const u32 gSmokescreenImpactTiles[];
extern const u32 gSmokescreenImpactPalette[];
extern const u32 gEnemyMonShadow_Gfx[];
// battle anim particle gfx
extern const u32 gBattleAnimSpriteGfx_Bone[];
extern const u32 gBattleAnimSpriteGfx_Spark[];
@@ -3908,7 +3912,7 @@ extern const u32 gBattleAnimSpriteGfx_Pokeball[];
extern const u32 gBattleAnimSpriteGfx_Spotlight[];
extern const u32 gBattleAnimSpriteGfx_LetterZ[];
extern const u32 gBattleAnimSpriteGfx_RapidSpin[];
extern const u32 gBattleAnimSpriteGfx_TriForceTriangle[];
extern const u32 gBattleAnimSpriteGfx_TriAttackTriangle[];
extern const u32 gBattleAnimSpriteGfx_WispOrb[];
extern const u32 gBattleAnimSpriteGfx_WispFire[];
extern const u32 gBattleAnimSpriteGfx_GoldStars[];
@@ -4161,7 +4165,7 @@ extern const u32 gBattleAnimSpritePal_JaggedMusicNote[];
extern const u32 gBattleAnimSpritePal_Pokeball[];
extern const u32 gBattleAnimSpritePal_LetterZ[];
extern const u32 gBattleAnimSpritePal_RapidSpin[];
extern const u32 gBattleAnimSpritePal_TriForceTriangle[];
extern const u32 gBattleAnimSpritePal_TriAttackTriangle[];
extern const u32 gBattleAnimSpritePal_WispOrb[];
extern const u32 gBattleAnimSpritePal_GoldStars[];
extern const u32 gBattleAnimSpritePal_EclipsingOrb[];
@@ -4215,8 +4219,8 @@ extern const u32 gBattleAnimSpritePal_WhipHit[];
extern const u32 gBattleAnimSpritePal_BlueRing2[];
// battle anim task
extern const u32 gUnknown_D2EC24_Gfx[];
extern const u32 gUnknown_D2EC24_Tilemap[];
extern const u32 gUnusedLevelupAnimationGfx[];
extern const u32 gUnusedLevelupAnimationTilemap[];
extern const u32 gCureBubblesGfx[];
extern const u32 gCureBubblesPal[];
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);
bool32 sub_807185C(u8 var);
void sub_8071898(void);
void ResetPaletteStructByUid(u16 a1);
void PaletteStruct_ResetById(u16 a1);
void ResetPaletteStruct(u8 paletteNum);
#endif // GUARD_PALETTE_H
+1
View File
@@ -4,6 +4,7 @@
#include "global.h"
#define MAX_SPRITES 64
#define SPRITE_NONE 0xFF
#define TAG_NONE 0xFFFF
struct SpriteSheet
+32 -32
View File
@@ -81,7 +81,7 @@ SECTIONS {
src/blend_palette.o(.text);
src/daycare.o(.text);
src/battle_interface.o(.text);
src/smokescreen.o(.text);
src/battle_anim_smokescreen.o(.text);
src/pokeball.o(.text);
src/load_save.o(.text);
src/trade.o(.text);
@@ -162,21 +162,21 @@ SECTIONS {
src/item_use.o(.text);
src/battle_anim_effects_1.o(.text);
src/battle_anim_effects_2.o(.text);
src/water.o(.text);
src/fire.o(.text);
src/electric.o(.text);
src/ice.o(.text);
src/fighting.o(.text);
src/poison.o(.text);
src/flying.o(.text);
src/psychic.o(.text);
src/bug.o(.text);
src/rock.o(.text);
src/ghost.o(.text);
src/dragon.o(.text);
src/dark.o(.text);
src/ground.o(.text);
src/normal.o(.text);
src/battle_anim_water.o(.text);
src/battle_anim_fire.o(.text);
src/battle_anim_electric.o(.text);
src/battle_anim_ice.o(.text);
src/battle_anim_fight.o(.text);
src/battle_anim_poison.o(.text);
src/battle_anim_flying.o(.text);
src/battle_anim_psychic.o(.text);
src/battle_anim_bug.o(.text);
src/battle_anim_rock.o(.text);
src/battle_anim_ghost.o(.text);
src/battle_anim_dragon.o(.text);
src/battle_anim_dark.o(.text);
src/battle_anim_ground.o(.text);
src/battle_anim_normal.o(.text);
src/battle_anim_utility_funcs.o(.text);
src/battle_intro.o(.text);
src/bike.o(.text);
@@ -409,7 +409,7 @@ SECTIONS {
src/battle_util.o(.rodata);
src/battle_script_commands.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_link_opponent.o(.rodata);
src/pokemon.o(.rodata);
@@ -474,21 +474,21 @@ SECTIONS {
src/item_use.o(.rodata);
src/battle_anim_effects_1.o(.rodata);
src/battle_anim_effects_2.o(.rodata);
src/water.o(.rodata);
src/fire.o(.rodata);
src/electric.o(.rodata);
src/ice.o(.rodata);
src/fighting.o(.rodata);
src/poison.o(.rodata);
src/flying.o(.rodata);
src/psychic.o(.rodata);
src/bug.o(.rodata);
src/rock.o(.rodata);
src/ghost.o(.rodata);
src/dragon.o(.rodata);
src/dark.o(.rodata);
src/ground.o(.rodata);
src/normal.o(.rodata);
src/battle_anim_water.o(.rodata);
src/battle_anim_fire.o(.rodata);
src/battle_anim_electric.o(.rodata);
src/battle_anim_ice.o(.rodata);
src/battle_anim_fight.o(.rodata);
src/battle_anim_poison.o(.rodata);
src/battle_anim_flying.o(.rodata);
src/battle_anim_psychic.o(.rodata);
src/battle_anim_bug.o(.rodata);
src/battle_anim_rock.o(.rodata);
src/battle_anim_ghost.o(.rodata);
src/battle_anim_dragon.o(.rodata);
src/battle_anim_dark.o(.rodata);
src/battle_anim_ground.o(.rodata);
src/battle_anim_normal.o(.rodata);
src/battle_anim_utility_funcs.o(.rodata);
src/battle_intro.o(.rodata);
src/bike.o(.rodata);
+2 -2
View File
@@ -1714,13 +1714,13 @@ static void Cmd_if_random_safari_flee(void)
{
u8 safariFleeRate;
if (gBattleStruct->safariGoNearCounter)
if (gBattleStruct->safariRockThrowCounter)
{
safariFleeRate = gBattleStruct->safariEscapeFactor * 2;
if (safariFleeRate > 20)
safariFleeRate = 20;
}
else if (gBattleStruct->safariPkblThrowCounter != 0)
else if (gBattleStruct->safariBaitThrowCounter != 0)
{
safariFleeRate = gBattleStruct->safariEscapeFactor / 4;
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 AnimLeechLifeNeedle(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_Step(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 AnimMissileArc(struct Sprite *sprite);
static void AnimMissileArc_Step(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[] =
{
@@ -210,11 +210,11 @@ static void AnimMegahornHorn(struct Sprite *sprite)
gBattleAnimArgs[3] = -gBattleAnimArgs[3];
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
}
sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, 2) + gBattleAnimArgs[0];
sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, 3) + gBattleAnimArgs[1];
sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0];
sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];
sprite->data[0] = gBattleAnimArgs[4];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
@@ -231,11 +231,11 @@ static void AnimLeechLifeNeedle(struct Sprite *sprite)
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
}
sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, 2) + gBattleAnimArgs[0];
sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, 3) + gBattleAnimArgs[1];
sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0];
sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];
sprite->data[0] = gBattleAnimArgs[2];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
@@ -257,19 +257,19 @@ static void AnimTranslateWebThread(struct Sprite *sprite)
sprite->data[3] = sprite->y;
if (!gBattleAnimArgs[4])
{
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
}
else
{
SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]);
}
BattleAnim_InitLinearTranslationWithDuration(sprite);
InitAnimLinearTranslationWithSpeed(sprite);
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))
{
@@ -290,10 +290,10 @@ static void AnimStringWrap(struct Sprite *sprite)
sprite->y += gBattleAnimArgs[1];
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
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)
{
@@ -311,10 +311,10 @@ static void AnimSpiderWeb(struct Sprite *sprite)
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
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)
{
@@ -328,12 +328,12 @@ static void sub_80B42E8(struct Sprite *sprite)
if (sprite->data[0] == 0)
{
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_BLDALPHA, 0);
@@ -377,8 +377,8 @@ static void AnimTranslateStinger(struct Sprite *sprite)
}
}
InitSpritePosToAnimAttacker(sprite, 1);
lVarX = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2];
lVarY = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
lVarX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
lVarY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
rot = ArcTan2Neg(lVarX - sprite->x, lVarY - sprite->y);
rot += 0xC000;
TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rot);
@@ -402,15 +402,15 @@ static void AnimMissileArc(struct Sprite *sprite)
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[4];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
sprite->data[5] = gBattleAnimArgs[5];
InitAnimArcTranslation(sprite);
sprite->callback = AnimMissileArcStep;
sprite->callback = AnimMissileArc_Step;
sprite->invisible = TRUE;
}
static void AnimMissileArcStep(struct Sprite *sprite)
static void AnimMissileArc_Step(struct Sprite *sprite)
{
sprite->invisible = FALSE;
@@ -447,15 +447,15 @@ static void AnimMissileArcStep(struct Sprite *sprite)
static void AnimTailGlowOrb(struct Sprite *sprite)
{
if (gBattleAnimArgs[0] == 0)
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + 18;
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + 18;
}
else
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + 18;
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + 18;
}
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
+59 -56
View File
@@ -6,23 +6,24 @@
#include "trig.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 AnimTearDrop(struct Sprite *sprite);
static void AnimClawSlash(struct Sprite *sprite);
static void AnimTask_AttackerFadeToInvisible_Step(u8 taskId);
static void AnimTask_AttackerFadeFromInvisible_Step(u8 taskId);
static void sub_80B7B48(struct Sprite *sprite);
static void sub_80B7C10(struct Sprite *sprite);
static void sub_80B7C50(struct Sprite *sprite);
static void sub_80B7D88(struct Sprite *sprite);
static void sub_80B856C(u8 priority);
static void sub_80B7F58(u8 taskId);
static void sub_80B843C(struct Task *task);
static void sub_80B82C0(u8 taskId);
static void sub_80B8920(u8 taskId);
static void AnimBite_Step1(struct Sprite *sprite);
static void AnimBite_Step2(struct Sprite *sprite);
static void AnimTearDrop_Step(struct Sprite *sprite);
static void SetAllBattlersSpritePriority(u8 priority);
static void AnimTask_MoveAttackerMementoShadow_Step(u8 taskId);
static void DoMementoShadowEffect(struct Task *task);
static void AnimTask_MoveTargetMementoShadow_Step(u8 taskId);
static void AnimTask_MetallicShine_Step(u8 taskId);
const struct SpriteTemplate gUnknown_83E7878 =
// Unused
const struct SpriteTemplate sUnusedBagStealSpriteTemplate =
{
.tileTag = ANIM_TAG_TIED_BAG,
.paletteTag = ANIM_TAG_TIED_BAG,
@@ -30,7 +31,7 @@ const struct SpriteTemplate gUnknown_83E7878 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80B7ACC,
.callback = AnimUnusedBagSteal,
};
static const union AffineAnimCmd sAffineAnim_Bite_0[] =
@@ -265,7 +266,7 @@ void AnimTask_InitAttackerFadeFromInvisible(u8 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[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[4] = -sprite->data[2];
sprite->data[6] = 0xFFD8;
sprite->callback = sub_80B7B48;
sprite->callback = AnimUnusedBagSteal_Step;
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[4] += sprite->data[2];
@@ -306,6 +307,7 @@ static void sub_80B7B48(struct Sprite *sprite)
DestroyAnimSprite(sprite);
}
// Move sprite inward for Bite/Crunch and Clamp
static void AnimBite(struct Sprite *sprite)
{
sprite->x += gBattleAnimArgs[0];
@@ -314,20 +316,20 @@ static void AnimBite(struct Sprite *sprite)
sprite->data[0] = gBattleAnimArgs[3];
sprite->data[1] = gBattleAnimArgs[4];
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[5] += sprite->data[1];
sprite->x2 = sprite->data[4] >> 8;
sprite->y2 = sprite->data[5] >> 8;
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[5] -= sprite->data[1];
@@ -337,12 +339,13 @@ static void sub_80B7C50(struct Sprite *sprite)
DestroySpriteAndMatrix(sprite);
}
// Launches a tear drop away from the battler. Used by Fake Tears
static void AnimTearDrop(struct Sprite *sprite)
{
u8 battler;
s8 xOffset;
if (gBattleAnimArgs[0] == 0)
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
battler = gBattleAnimAttacker;
else
battler = gBattleAnimTarget;
@@ -376,10 +379,10 @@ static void AnimTearDrop(struct Sprite *sprite)
sprite->data[4] = sprite->y + 12;
sprite->data[5] = -12;
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))
DestroySpriteAndMatrix(sprite);
@@ -416,7 +419,7 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId)
scanlineParams.dmaDest = &REG_BG1VOFS;
var0 = WINOUT_WIN01_BG1;
if (!IsContest())
gBattle_BG2_X += 240;
gBattle_BG2_X += DISPLAY_WIDTH;
}
else
{
@@ -426,7 +429,7 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId)
scanlineParams.dmaDest = &REG_BG2VOFS;
var0 = WINOUT_WIN01_BG2;
if (!IsContest())
gBattle_BG1_X += 240;
gBattle_BG1_X += DISPLAY_WIDTH;
}
scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
scanlineParams.initState = 1;
@@ -436,7 +439,7 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId)
task->data[0] = 0;
task->data[1] = 0;
task->data[2] = 0;
sub_80B856C(3);
SetAllBattlersSpritePriority(3);
for (i = 0; i < 112; ++i)
{
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_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_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];
@@ -477,13 +480,13 @@ static void sub_80B7F58(u8 taskId)
break;
case 1:
task->data[4] -= 8;
sub_80B843C(task);
DoMementoShadowEffect(task);
if (task->data[4] < task->data[8])
++task->data[0];
break;
case 2:
task->data[4] -= 8;
sub_80B843C(task);
DoMementoShadowEffect(task);
task->data[14] += 4;
task->data[15] -= 4;
if (task->data[14] >= task->data[15])
@@ -527,12 +530,12 @@ void AnimTask_MoveTargetMementoShadow(u8 taskId)
if (task->data[3] == 1)
{
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
gBattle_BG2_X += 240;
gBattle_BG2_X += DISPLAY_WIDTH;
}
else
{
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];
}
@@ -549,7 +552,7 @@ void AnimTask_MoveTargetMementoShadow(u8 taskId)
task->data[10] = gBattle_BG2_Y;
FillPalette(RGB_BLACK, 9 * 16, 32);
}
sub_80B856C(3);
SetAllBattlersSpritePriority(3);
++task->data[0];
break;
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_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_WIN0V = 160;
gBattle_WIN0V = DISPLAY_HEIGHT;
task->data[0] = 0;
task->data[1] = 0;
task->data[2] = 0;
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 8));
task->func = sub_80B82C0;
task->func = AnimTask_MoveTargetMementoShadow_Step;
break;
}
}
static void sub_80B82C0(u8 taskId)
static void AnimTask_MoveTargetMementoShadow_Step(u8 taskId)
{
u8 pos;
u16 i;
@@ -614,7 +617,7 @@ static void sub_80B82C0(u8 taskId)
task->data[5] += 8;
if (task->data[5] >= task->data[7])
task->data[5] = task->data[7];
sub_80B843C(task);
DoMementoShadowEffect(task);
if (task->data[5] == task->data[7])
++task->data[0];
break;
@@ -632,7 +635,7 @@ static void sub_80B82C0(u8 taskId)
task->data[4] += 8;
if (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])
{
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;
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;
for (i = 0; i < MAX_BATTLERS_COUNT; ++i)
{
u8 spriteId = GetAnimBattlerSpriteId(i);
if (spriteId != 0xFF)
if (spriteId != SPRITE_NONE)
gSprites[spriteId].oam.priority = priority;
}
}
@@ -738,7 +740,7 @@ void AnimTask_InitMementoShadow(u8 taskId)
DestroyAnimVisualTask(taskId);
}
void sub_80B8664(u8 taskId)
void AnimTask_MementoHandleBg(u8 taskId)
{
bool8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? TRUE : FALSE;
@@ -748,6 +750,7 @@ void sub_80B8664(u8 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)
{
sprite->x += gBattleAnimArgs[0];
@@ -799,7 +802,7 @@ void AnimTask_MetallicShine(u8 taskId)
else
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
newSpriteId = CreateCloneOfSpriteInWindowMode(gBattleAnimAttacker, spriteId, species);
newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species);
GetBattleAnimBg1Data(&animBg);
AnimLoadCompressedBgTilemap(animBg.bgId, gMetalShineTilemap);
AnimLoadCompressedBgGfx(animBg.bgId, gMetalShineGfx, animBg.tilesOffset);
@@ -816,10 +819,10 @@ void AnimTask_MetallicShine(u8 taskId)
gTasks[taskId].data[2] = gBattleAnimArgs[1];
gTasks[taskId].data[3] = gBattleAnimArgs[2];
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;
u16 paletteNum;
@@ -863,7 +866,7 @@ static void sub_80B8920(u8 taskId)
// Changes battler's palette to either greyscale or original.
// arg0: which battler
// arg1: 0 grayscale, 1 original
void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId)
void AnimTask_SetGrayscaleOrOriginalPal(u8 taskId)
{
u8 spriteId, battler;
bool8 calcSpriteId = FALSE;
@@ -871,10 +874,10 @@ void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId)
switch (gBattleAnimArgs[0])
{
case 0:
case 1:
case 2:
case 3:
case ANIM_ATTACKER:
case ANIM_TARGET:
case ANIM_ATK_PARTNER:
case ANIM_DEF_PARTNER:
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
break;
case 4:
@@ -894,7 +897,7 @@ void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId)
calcSpriteId = TRUE;
break;
default:
spriteId = 0xFF;
spriteId = SPRITE_NONE;
break;
}
if (calcSpriteId)
@@ -903,9 +906,9 @@ void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId)
if (IsBattlerSpriteVisible(battler))
spriteId = gBattlerSpriteIds[battler];
else
spriteId = 0xFF;
spriteId = SPRITE_NONE;
}
if (spriteId != 0xFF)
if (spriteId != SPRITE_NONE)
SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]);
DestroyAnimVisualTask(taskId);
}
@@ -913,8 +916,8 @@ void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId)
void GetIsDoomDesireHitTurn(u8 taskId)
{
if (gAnimMoveTurn < 2)
gBattleAnimArgs[7] = 0;
gBattleAnimArgs[ARG_RET_ID] = FALSE;
if (gAnimMoveTurn == 2)
gBattleAnimArgs[7] = 1;
gBattleAnimArgs[ARG_RET_ID] = TRUE;
DestroyAnimVisualTask(taskId);
}
+50 -47
View File
@@ -4,19 +4,19 @@
#include "task.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 AnimDragonRageFirePlume(struct Sprite *sprite);
static void AnimDragonDanceOrb(struct Sprite *sprite);
static void AnimOverheatFlame(struct Sprite *sprite);
static void sub_80B74D8(struct Sprite *sprite);
static void sub_80B76B0(u8 taskId);
static void sub_80B776C(struct Task *task);
static void sub_80B7894(struct Sprite *sprite);
static void AnimDragonDanceOrb_Step(struct Sprite *sprite);
static void AnimTask_DragonDanceWaver_Step(u8 taskId);
static void UpdateDragonDanceScanlineEffect(struct Task *task);
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(16, 4),
@@ -26,9 +26,9 @@ static const union AnimCmd gUnknown_83E7710[] =
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 =
@@ -36,10 +36,10 @@ const struct SpriteTemplate gOutrageFlameSpriteTemplate =
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E7728,
.anims = sAnims_OutrageOverheatFire,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80B725C,
.callback = AnimOutrageFlame,
};
static const union AnimCmd sAnim_DragonBreathFire_0[] =
@@ -180,16 +180,16 @@ const struct SpriteTemplate gOverheatFlameSpriteTemplate =
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E7728,
.anims = sAnims_OutrageOverheatFire,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimOverheatFlame,
};
static void sub_80B725C(struct Sprite *sprite)
static void AnimOutrageFlame(struct Sprite *sprite)
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{
sprite->x -= gBattleAnimArgs[0];
@@ -210,11 +210,11 @@ static void sub_80B725C(struct Sprite *sprite)
sprite->callback = TranslateSpriteLinearAndFlicker;
}
static void sub_80B72F8(struct Sprite *sprite)
static void StartDragonFireTranslation(struct Sprite *sprite)
{
SetSpriteCoordsToAnimAttackerCoords(sprite);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{
sprite->x -= gBattleAnimArgs[1];
@@ -239,13 +239,13 @@ static void AnimDragonRageFirePlume(struct Sprite *sprite)
{
if (gBattleAnimArgs[0] == 0)
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1);
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
}
else
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
}
SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[1]);
sprite->y += gBattleAnimArgs[2];
@@ -253,11 +253,12 @@ static void AnimDragonRageFirePlume(struct Sprite *sprite)
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
}
// For Dragon Breath and Dragon Rage
static void AnimDragonFireToTarget(struct Sprite *sprite)
{
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
StartSpriteAffineAnim(sprite, 1);
sub_80B72F8(sprite);
StartDragonFireTranslation(sprite);
}
static void AnimDragonDanceOrb(struct Sprite *sprite)
@@ -265,8 +266,8 @@ static void AnimDragonDanceOrb(struct Sprite *sprite)
u16 r5;
u16 r0;
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[4] = 0;
sprite->data[5] = 1;
sprite->data[6] = gBattleAnimArgs[0];
@@ -278,10 +279,10 @@ static void AnimDragonDanceOrb(struct Sprite *sprite)
sprite->data[7] = r0 / 2;
sprite->x2 = Cos(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])
{
@@ -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)
{
struct ScanlineEffectParams sp;
struct ScanlineEffectParams scanlineParams;
struct Task *task = &gTasks[taskId];
u16 i;
u8 r1;
if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
{
sp.dmaDest = &REG_BG1HOFS;
scanlineParams.dmaDest = &REG_BG1HOFS;
task->data[2] = gBattle_BG1_X;
}
else
{
sp.dmaDest = &REG_BG2HOFS;
scanlineParams.dmaDest = &REG_BG2HOFS;
task->data[2] = gBattle_BG2_X;
}
sp.dmaControl = 0xA2600001;
sp.initState = 1;
sp.unused9 = 0;
scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
scanlineParams.initState = 1;
scanlineParams.unused9 = 0;
r1 = GetBattlerYCoordWithElevation(gBattleAnimAttacker);
task->data[3] = r1 - 32;
task->data[4] = r1 + 32;
@@ -349,11 +352,11 @@ void AnimTask_DragonDanceWaver(u8 taskId)
gScanlineEffectRegBuffers[0][i] = task->data[2];
gScanlineEffectRegBuffers[1][i] = task->data[2];
}
ScanlineEffect_SetParams(sp);
task->func = sub_80B76B0;
ScanlineEffect_SetParams(scanlineParams);
task->func = AnimTask_DragonDanceWaver_Step;
}
static void sub_80B76B0(u8 taskId)
static void AnimTask_DragonDanceWaver_Step(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -366,12 +369,12 @@ static void sub_80B76B0(u8 taskId)
if (++task->data[6] == 3)
++task->data[0];
}
sub_80B776C(task);
UpdateDragonDanceScanlineEffect(task);
break;
case 1:
if (++task->data[1] > 0x3C)
++task->data[0];
sub_80B776C(task);
UpdateDragonDanceScanlineEffect(task);
break;
case 2:
if (++task->data[7] > 1)
@@ -380,7 +383,7 @@ static void sub_80B76B0(u8 taskId)
if (--task->data[6] == 0)
++task->data[0];
}
sub_80B776C(task);
UpdateDragonDanceScanlineEffect(task);
break;
case 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];
@@ -406,21 +409,21 @@ static void sub_80B776C(struct Task *task)
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->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[4];
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[4];
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->y += sprite->data[2] * gBattleAnimArgs[0];
sprite->data[3] = gBattleAnimArgs[3];
sprite->callback = sub_80B7894;
sprite->callback = AnimOverheatFlame_Step;
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[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"
static void AnimLightning(struct Sprite *sprite);
static void sub_80ADC58(struct Sprite *sprite);
static void sub_80ADCB8(struct Sprite *sprite);
static void sub_80ADD4C(struct Sprite *sprite);
static void AnimUnusedSpinningFist(struct Sprite *sprite);
static void AnimUnusedCirclingShock(struct Sprite *sprite);
static void AnimSparkElectricity(struct Sprite *sprite);
static void AnimZapCannonSpark(struct Sprite *sprite);
static void AnimThunderboltOrb(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 AnimGrowingShockWaveOrb(struct Sprite *sprite);
static void AnimShockWaveProgressingBolt(struct Sprite *sprite);
static void sub_80ADC3C(struct Sprite *sprite);
static void sub_80ADC9C(struct Sprite *sprite);
static void sub_80ADF38(struct Sprite *sprite);
static void sub_80AE130(struct Sprite *sprite);
static void sub_80AE278(u8 taskId);
static void sub_80AE4F4(struct Sprite *sprite);
static void sub_80AE5BC(u8 taskId);
static void sub_80AE704(struct Sprite *sprite);
static void sub_80AE83C(struct Sprite *sprite);
static bool8 sub_80AEB98(struct Task *task, u8 taskId);
static bool8 sub_80AEE74(struct Task *task, u8 taskId);
static bool8 sub_80AF058(struct Task *task, u8 taskId);
static void sub_80AF0C8(struct Sprite *sprite);
static void AnimLightning_Step(struct Sprite *sprite);
static void AnimUnusedSpinningFist_Step(struct Sprite *sprite);
static void AnimZapCannonSpark_Step(struct Sprite *sprite);
static void AnimSparkElectricityFlashing_Step(struct Sprite *sprite);
static void AnimTask_ElectricBolt_Step(u8 taskId);
static void AnimThunderWave_Step(struct Sprite *sprite);
static void AnimTask_ElectricChargingParticles_Step(u8 taskId);
static void AnimElectricChargingParticles(struct Sprite *sprite);
static void AnimVoltTackleOrbSlide_Step(struct Sprite *sprite);
static bool8 CreateVoltTackleBolt(struct Task *task, u8 taskId);
static bool8 CreateShockWaveBoltSprite(struct Task *task, u8 taskId);
static bool8 CreateShockWaveLightningSprite(struct Task *task, u8 taskId);
static void AnimShockWaveLightning(struct Sprite *sprite);
static const union AnimCmd sAnim_Lightning[] =
{
@@ -60,7 +60,7 @@ const struct SpriteTemplate gLightningSpriteTemplate =
.callback = AnimLightning,
};
static const union AffineAnimCmd gUnknown_83E5F50[] =
static const union AffineAnimCmd sAffineAnim_UnusedSpinningFist[] =
{
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 20),
@@ -68,23 +68,23 @@ static const union AffineAnimCmd gUnknown_83E5F50[] =
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,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E5F70,
.callback = sub_80ADC58,
.affineAnims = sAffineAnims_UnusedSpinningFist,
.callback = AnimUnusedSpinningFist,
};
static const union AnimCmd gUnknown_83E5F8C[] =
static const union AnimCmd sAnim_UnusedCirclingShock[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_FRAME(16, 5),
@@ -95,20 +95,20 @@ static const union AnimCmd gUnknown_83E5F8C[] =
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,
.paletteTag = ANIM_TAG_SHOCK,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5FA8,
.anims = sAnims_UnusedCirclingShock,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80ADCB8,
.callback = AnimUnusedCirclingShock,
};
const struct SpriteTemplate gSparkElectricitySpriteTemplate =
@@ -119,7 +119,7 @@ const struct SpriteTemplate gSparkElectricitySpriteTemplate =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80ADD4C,
.callback = AnimSparkElectricity,
};
const struct SpriteTemplate gZapCannonBallSpriteTemplate =
@@ -458,31 +458,31 @@ static void AnimLightning(struct Sprite *sprite)
else
sprite->x += gBattleAnimArgs[0];
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)
DestroyAnimSprite(sprite);
}
static void sub_80ADC58(struct Sprite *sprite)
static void AnimUnusedSpinningFist(struct Sprite *sprite)
{
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
sprite->x -= gBattleAnimArgs[0];
else
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)
DestroySpriteAndMatrix(sprite);
}
static void sub_80ADCB8(struct Sprite *sprite)
static void AnimUnusedCirclingShock(struct Sprite *sprite)
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
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[3] = gBattleAnimArgs[4];
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
sprite->callback = TranslateSpriteInCircleOverDuration;
sprite->callback = TranslateSpriteInCircle;
}
static void sub_80ADD4C(struct Sprite *sprite)
static void AnimSparkElectricity(struct Sprite *sprite)
{
u8 battler;
u32 matrixNum;
@@ -512,20 +512,20 @@ static void sub_80ADD4C(struct Sprite *sprite)
switch (gBattleAnimArgs[4])
{
case 0:
case ANIM_ATTACKER:
battler = gBattleAnimAttacker;
break;
case 1:
case ANIM_TARGET:
default:
battler = gBattleAnimTarget;
break;
case 2:
case ANIM_ATK_PARTNER:
if (!IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))
battler = gBattleAnimAttacker;
else
battler = BATTLE_PARTNER(gBattleAnimAttacker);
break;
case 3:
case ANIM_DEF_PARTNER:
if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))
battler = BATTLE_PARTNER(gBattleAnimTarget);
else
@@ -568,11 +568,11 @@ static void AnimZapCannonSpark(struct Sprite *sprite)
sprite->data[6] = gBattleAnimArgs[5];
sprite->data[7] = gBattleAnimArgs[4];
sprite->oam.tileNum += gBattleAnimArgs[6] * 4;
sprite->callback = sub_80ADF38;
sprite->callback = AnimZapCannonSpark_Step;
sprite->callback(sprite);
}
static void sub_80ADF38(struct Sprite *sprite)
static void AnimZapCannonSpark_Step(struct Sprite *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)
{
@@ -608,7 +608,7 @@ static void AnimThunderboltOrb(struct Sprite *sprite)
sprite->data[3] = gBattleAnimArgs[0];
sprite->data[4] = gBattleAnimArgs[3];
sprite->data[5] = gBattleAnimArgs[3];
sprite->callback = sub_80ADFB0;
sprite->callback = AnimThunderboltOrb_Step;
}
static void AnimSparkElectricityFlashing(struct Sprite *sprite)
@@ -629,11 +629,11 @@ static void AnimSparkElectricityFlashing(struct Sprite *sprite)
sprite->data[6] = gBattleAnimArgs[5];
sprite->data[7] = gBattleAnimArgs[4];
sprite->oam.tileNum += gBattleAnimArgs[6] * 4;
sprite->callback = sub_80AE130;
sprite->callback = AnimSparkElectricityFlashing_Step;
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->y2 = Cos(sprite->data[7], sprite->data[5]);
@@ -644,6 +644,7 @@ static void sub_80AE130(struct Sprite *sprite)
DestroyAnimSprite(sprite);
}
// Electricity arcs around the target. Used for Paralysis and various electric move hits
static void AnimElectricity(struct Sprite *sprite)
{
InitSpritePosToAnimTarget(sprite, FALSE);
@@ -657,15 +658,16 @@ static void AnimElectricity(struct Sprite *sprite)
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
// The vertical falling thunder bolt used in Thunder Wave/Shock/Bolt
void AnimTask_ElectricBolt(u8 taskId)
{
gTasks[taskId].data[0] = GetBattlerSpriteCoord(gBattleAnimTarget, 0) + gBattleAnimArgs[0];
gTasks[taskId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + gBattleAnimArgs[1];
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 r2;
@@ -735,18 +737,19 @@ static void AnimElectricBoltSegment(struct Sprite *sprite)
{
if (!sprite->data[0])
{
sprite->oam.shape = ST_OAM_V_RECTANGLE;
sprite->oam.size = ST_OAM_SIZE_0;
sprite->oam.shape = SPRITE_SHAPE(8x16);
sprite->oam.size = SPRITE_SIZE(8x16);
}
else
{
sprite->oam.shape = ST_OAM_SQUARE;
sprite->oam.size = ST_OAM_SIZE_1;
sprite->oam.shape = SPRITE_SHAPE(16x16);
sprite->oam.size = SPRITE_SIZE(16x16);
}
if (++sprite->data[1] == 15)
DestroySprite(sprite);
}
// The horizontal bands of electricity used in Thunder Wave
static void AnimThunderWave(struct Sprite *sprite)
{
u8 spriteId;
@@ -756,11 +759,11 @@ static void AnimThunderWave(struct Sprite *sprite)
spriteId = CreateSprite(&gThunderWaveSpriteTemplate, sprite->x + 32, sprite->y, sprite->subpriority);
gSprites[spriteId].oam.tileNum += 8;
++gAnimVisualTaskCount;
gSprites[spriteId].callback = sub_80AE4F4;
sprite->callback = sub_80AE4F4;
gSprites[spriteId].callback = AnimThunderWave_Step;
sprite->callback = AnimThunderWave_Step;
}
static void sub_80AE4F4(struct Sprite *sprite)
static void AnimThunderWave_Step(struct Sprite *sprite)
{
if (++sprite->data[0] == 3)
{
@@ -771,6 +774,7 @@ static void sub_80AE4F4(struct Sprite *sprite)
DestroyAnimSprite(sprite);
}
// Animates small electric orbs moving from around the battler inward. For Charge/Shock Wave
void AnimTask_ElectricChargingParticles(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -793,10 +797,10 @@ void AnimTask_ElectricChargingParticles(u8 taskId)
task->data[11] = gBattleAnimArgs[3];
task->data[12] = 0;
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];
@@ -821,7 +825,7 @@ static void sub_80AE5BC(u8 taskId)
sprite->data[4] = task->data[15];
sprite->data[5] = taskId;
InitAnimLinearTranslation(sprite);
StoreSpriteCallbackInData6(sprite, sub_80AE704);
StoreSpriteCallbackInData6(sprite, AnimElectricChargingParticles);
sprite->callback = RunStoredCallbackWhenAnimEnds;
if (++task->data[9] > 15)
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))
{
@@ -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);
sprite->callback = sub_80AE6D0;
sprite->callback = AnimElectricChargingParticles_Step;
}
static void AnimGrowingChargeOrb(struct Sprite *sprite)
{
if (!gBattleAnimArgs[0])
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
@@ -873,9 +877,10 @@ static void AnimGrowingChargeOrb(struct Sprite *sprite)
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
}
// The quick electric burst at the end of Charge / during the Volt Tackle hit
static void AnimElectricPuff(struct Sprite *sprite)
{
if (!gBattleAnimArgs[0])
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
@@ -891,6 +896,7 @@ static void AnimElectricPuff(struct Sprite *sprite)
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)
{
StartSpriteAffineAnim(sprite, 1);
@@ -900,10 +906,10 @@ static void AnimVoltTackleOrbSlide(struct Sprite *sprite)
sprite->data[7] = 16;
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
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])
{
@@ -975,6 +981,7 @@ void AnimTask_VoltTackleAttackerReappear(u8 taskId)
}
}
// The horizontal bolts of electricity for Volt Tackle
void AnimTask_VoltTackleBolt(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -1036,7 +1043,7 @@ void AnimTask_VoltTackleBolt(u8 taskId)
if (++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];
}
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);
@@ -1112,7 +1119,7 @@ void AnimTask_ShockWaveProgressingBolt(u8 taskId)
task->data[4] = 7;
task->data[5] = -1;
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[14] = task->data[12];
task->data[15] = (task->data[13] - task->data[12]) / 3;
@@ -1122,7 +1129,7 @@ void AnimTask_ShockWaveProgressingBolt(u8 taskId)
if (++task->data[1] > 0)
{
task->data[1] = 0;
if (sub_80AEE74(task, taskId))
if (CreateShockWaveBoltSprite(task, taskId))
{
if (task->data[2] == 5)
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);
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)
{
if (++sprite->data[0] > 12)
@@ -1234,7 +1242,7 @@ void AnimTask_ShockWaveLightning(u8 taskId)
if (++task->data[1] > 1)
{
task->data[1] = 0;
if (sub_80AF058(task, taskId))
if (CreateShockWaveLightningSprite(task, taskId))
++task->data[0];
}
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]);
if (spriteId != MAX_SPRITES)
{
gSprites[spriteId].callback = sub_80AF0C8;
gSprites[spriteId].callback = AnimShockWaveLightning;
gSprites[spriteId].data[6] = taskId;
gSprites[spriteId].data[7] = 10;
++task->data[10];
@@ -1262,7 +1270,7 @@ static bool8 sub_80AF058(struct Task *task, u8 taskId)
return FALSE;
}
static void sub_80AF0C8(struct Sprite *sprite)
static void AnimShockWaveLightning(struct Sprite *sprite)
{
if (sprite->animEnded)
{
+92 -94
View File
@@ -5,7 +5,7 @@
#include "task.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 AnimJumpKick(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 AnimRevengeScratch(struct Sprite *sprite);
static void AnimFocusPunchFist(struct Sprite *sprite);
static void sub_80B0B2C(struct Sprite *sprite);
static void sub_80B0BD8(struct Sprite *sprite);
static void sub_80B0CB4(struct Sprite *sprite);
static void AnimFistOrFootRandomPos_Step(struct Sprite *sprite);
static void AnimCrossChopHand_Step(struct Sprite *sprite);
static void AnimSlidingKick_Step(struct Sprite *sprite);
static void AnimSpinningKickOrPunchFinish(struct Sprite *sprite);
static void AnimStompFootStep(struct Sprite *sprite);
static void AnimStompFootEnd(struct Sprite *sprite);
static void sub_80B0EF0(struct Sprite *sprite);
static void sub_80B1050(struct Sprite *sprite);
static void sub_80B111C(struct Sprite *sprite);
static void sub_80B11E4(struct Sprite *sprite);
static void sub_80B12A4(struct Sprite *sprite);
static void AnimBrickBreakWall_Step(struct Sprite *sprite);
static void AnimBrickBreakWallShard_Step(struct Sprite *sprite);
static void AnimSuperpowerOrb_Step(struct Sprite *sprite);
static void AnimSuperpowerRock_Step1(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,
.paletteTag = ANIM_TAG_HUMANOID_FOOT,
@@ -43,54 +43,46 @@ const struct SpriteTemplate gUnknown_83E668C =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = unc_080B08A0,
.callback = AnimUnusedHumanoidFoot,
};
static const union AnimCmd sAnim_HandOrFoot[] =
static const union AnimCmd sAnim_Fist[] =
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
};
static const union AnimCmd sAnim_SlidingKick_0[] =
static const union AnimCmd sAnim_FootWide[] =
{
ANIMCMD_FRAME(16, 1),
ANIMCMD_END,
};
static const union AnimCmd sAnim_SlidingKick_1[] =
static const union AnimCmd sAnim_FootTall[] =
{
ANIMCMD_FRAME(32, 1),
ANIMCMD_END,
};
static const union AnimCmd sAnim_CrossChopHand_0[] =
static const union AnimCmd sAnim_HandLeft[] =
{
ANIMCMD_FRAME(48, 1),
ANIMCMD_END,
};
static const union AnimCmd sAnim_CrossChopHand_1[] =
static const union AnimCmd sAnim_HandRight[] =
{
ANIMCMD_FRAME(48, 1, .hFlip = TRUE),
ANIMCMD_END,
};
static const union AnimCmd *const sAnims_HandOrFoot[] =
static const union AnimCmd *const sAnims_HandsAndFeet[] =
{
sAnim_HandOrFoot,
};
static const union AnimCmd *const sAnims_SlidingKick[] =
{
sAnim_SlidingKick_0,
sAnim_SlidingKick_1,
};
static const union AnimCmd *const sAnims_CrossChopHand[] =
{
sAnim_CrossChopHand_0,
sAnim_CrossChopHand_1,
sAnim_Fist,
sAnim_FootWide,
sAnim_FootTall,
sAnim_HandLeft,
sAnim_HandRight,
};
const struct SpriteTemplate gKarateChopSpriteTemplate =
@@ -98,7 +90,7 @@ const struct SpriteTemplate gKarateChopSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_HandOrFoot,
.anims = sAnims_HandsAndFeet,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimSlideHandOrFootToTarget,
@@ -109,7 +101,7 @@ const struct SpriteTemplate gJumpKickSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_HandOrFoot,
.anims = sAnims_HandsAndFeet,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimJumpKick,
@@ -120,7 +112,7 @@ const struct SpriteTemplate gFistFootSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_HandOrFoot,
.anims = sAnims_HandsAndFeet,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimBasicFistOrFoot,
@@ -131,7 +123,7 @@ const struct SpriteTemplate gFistFootRandomPosSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_HandOrFoot,
.anims = sAnims_HandsAndFeet,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimFistOrFootRandomPos,
@@ -142,7 +134,7 @@ const struct SpriteTemplate gCrossChopHandSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_CrossChopHand,
.anims = &sAnims_HandsAndFeet[3],
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimCrossChopHand,
@@ -153,7 +145,7 @@ const struct SpriteTemplate gSlidingKickSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_SlidingKick,
.anims = &sAnims_HandsAndFeet[1],
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimSlidingKick,
@@ -171,12 +163,13 @@ static const union AffineAnimCmd *const sAffineAnims_SpinningHandOrFoot[] =
sAffineAnim_SpinningHandOrFoot,
};
// Blaze Kick / Meteor Mash
const struct SpriteTemplate gSpinningHandOrFootSpriteTemplate =
{
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineDouble_ObjNormal_32x32,
.anims = sAnims_HandOrFoot,
.anims = sAnims_HandsAndFeet,
.images = NULL,
.affineAnims = sAffineAnims_SpinningHandOrFoot,
.callback = AnimSpinningKickOrPunch,
@@ -199,7 +192,7 @@ const struct SpriteTemplate gMegaPunchKickSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineDouble_ObjNormal_32x32,
.anims = sAnims_HandOrFoot,
.anims = sAnims_HandsAndFeet,
.images = NULL,
.affineAnims = sAffineAnims_MegaPunchKick,
.callback = AnimSpinningKickOrPunch,
@@ -210,7 +203,7 @@ const struct SpriteTemplate gStompFootSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_SlidingKick,
.anims = &sAnims_HandsAndFeet[1],
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimStompFoot,
@@ -301,7 +294,7 @@ const struct SpriteTemplate gArmThrustHandSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_HandOrFoot,
.anims = sAnims_HandsAndFeet,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimArmThrustHit,
@@ -405,13 +398,13 @@ const struct SpriteTemplate gFocusPunchFistSpriteTemplate =
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gOamData_AffineDouble_ObjNormal_32x32,
.anims = sAnims_HandOrFoot,
.anims = sAnims_HandsAndFeet,
.images = NULL,
.affineAnims = sAffineAnims_FocusPunchFist,
.callback = AnimFocusPunchFist,
};
static void unc_080B08A0(struct Sprite *sprite)
static void AnimUnusedHumanoidFoot(struct Sprite *sprite)
{
SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
sprite->y += gBattleAnimArgs[1];
@@ -429,7 +422,7 @@ static void AnimSlideHandOrFootToTarget(struct Sprite *sprite)
}
StartSpriteAnim(sprite, gBattleAnimArgs[6]);
gBattleAnimArgs[6] = 0;
AnimSnoreZ(sprite);
AnimTravelDiagonally(sprite);
}
static void AnimJumpKick(struct Sprite *sprite)
@@ -475,8 +468,8 @@ static void AnimFistOrFootRandomPos(struct Sprite *sprite)
if (gBattleAnimArgs[2] < 0)
gBattleAnimArgs[2] = Random() % 5;
StartSpriteAnim(sprite, gBattleAnimArgs[2]);
sprite->x = GetBattlerSpriteCoord(battler, 2);
sprite->y = GetBattlerSpriteCoord(battler, 3);
sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET);
xMod = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_WIDTH) / 2;
yMod = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4;
x = Random() % xMod;
@@ -491,19 +484,19 @@ static void AnimFistOrFootRandomPos(struct Sprite *sprite)
sprite->y += y;
sprite->data[0] = gBattleAnimArgs[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);
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[7] != 64)
if (sprite->data[7] != MAX_SPRITES)
{
FreeOamMatrix(gSprites[sprite->data[7]].oam.matrixNum);
DestroySprite(&gSprites[sprite->data[7]]);
@@ -531,10 +524,10 @@ static void AnimCrossChopHand(struct Sprite *sprite)
}
sprite->data[4] = sprite->y - 20;
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)
{
@@ -550,6 +543,7 @@ static void sub_80B0BD8(struct Sprite *sprite)
}
}
// Rolling Kick / Low Kick
static void AnimSlidingKick(struct Sprite *sprite)
{
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[6] = gBattleAnimArgs[4];
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))
{
@@ -622,8 +616,8 @@ static void AnimStompFootStep(struct Sprite *sprite)
if (--sprite->data[0] == -1)
{
sprite->data[0] = 6;
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->callback = StartAnimLinearTranslation;
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)
{
if (gBattleAnimArgs[0] == 0)
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1);
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
}
else
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
}
sprite->x += gBattleAnimArgs[1];
sprite->y += gBattleAnimArgs[2];
@@ -676,10 +671,10 @@ static void AnimBrickBreakWall(struct Sprite *sprite)
sprite->data[1] = gBattleAnimArgs[3];
sprite->data[2] = gBattleAnimArgs[4];
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])
{
@@ -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)
{
if (gBattleAnimArgs[0] == 0)
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0) + gBattleAnimArgs[2];
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + gBattleAnimArgs[3];
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[2];
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[3];
}
else
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 0) + gBattleAnimArgs[2];
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + gBattleAnimArgs[3];
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[2];
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[3];
}
sprite->oam.tileNum += gBattleAnimArgs[1] * 16;
sprite->data[0] = 0;
@@ -745,10 +741,10 @@ static void AnimBrickBreakWallShard(struct Sprite *sprite)
DestroyAnimSprite(sprite);
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->y += sprite->data[7];
@@ -760,8 +756,8 @@ static void AnimSuperpowerOrb(struct Sprite *sprite)
{
if (gBattleAnimArgs[0] == 0)
{
sprite->x = GetBattlerSpriteCoord(gBattlerAttacker, 2);
sprite->y = GetBattlerSpriteCoord(gBattlerAttacker, 3);
sprite->x = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_Y_PIC_OFFSET);
sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);
sprite->data[7] = gBattleAnimTarget;
}
@@ -773,25 +769,26 @@ static void AnimSuperpowerOrb(struct Sprite *sprite)
sprite->data[0] = 0;
sprite->data[1] = 12;
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)
{
SetGpuReg(REG_OFFSET_BLDCNT, 0);
sprite->data[0] = 16;
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[4] = GetBattlerSpriteCoord(sprite->data[7], 3);
sprite->data[4] = GetBattlerSpriteCoord(sprite->data[7], BATTLER_COORD_Y_PIC_OFFSET);
InitAnimLinearTranslation(sprite);
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)
{
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));
sprite->data[6] = gBattleAnimArgs[1];
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;
@@ -821,20 +818,20 @@ static void sub_80B11E4(struct Sprite *sprite)
}
else
{
s16 pos0 = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
s16 pos1 = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
s16 pos2 = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
s16 pos3 = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
s16 pos0 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
s16 pos1 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
s16 pos2 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
s16 pos3 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[0] = pos2 - pos0;
sprite->data[1] = pos3 - pos1;
sprite->data[2] = sprite->x << 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;
@@ -851,10 +848,10 @@ static void AnimSuperpowerFireball(struct Sprite *sprite)
{
u8 battler;
if (gBattleAnimArgs[0] == 0)
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
{
sprite->x = GetBattlerSpriteCoord(gBattlerAttacker, 2);
sprite->y = GetBattlerSpriteCoord(gBattlerAttacker, 3);
sprite->x = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_Y_PIC_OFFSET);
battler = gBattleAnimTarget;
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->data[0] = 16;
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[4] = GetBattlerSpriteCoord(battler, 3);
sprite->data[4] = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET);
InitAnimLinearTranslation(sprite);
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])
DestroyAnimSprite(sprite);
@@ -888,8 +885,8 @@ static void AnimArmThrustHit(struct Sprite *sprite)
{
u8 turn;
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[1] = gBattleAnimArgs[3];
sprite->data[2] = gBattleAnimArgs[0];
sprite->data[3] = gBattleAnimArgs[1];
@@ -905,12 +902,12 @@ static void AnimArmThrustHit(struct Sprite *sprite)
StartSpriteAnim(sprite, sprite->data[1]);
sprite->x2 = sprite->data[2];
sprite->y2 = sprite->data[3];
sprite->callback = sub_80B13D4;
sprite->callback = AnimArmThrustHit_Step;
}
static void AnimRevengeScratch(struct Sprite *sprite)
{
if (gBattleAnimArgs[2] == 0)
if (gBattleAnimArgs[2] == ANIM_ATTACKER)
InitSpritePosToAnimAttacker(sprite, 0);
else
InitSpritePosToAnimTarget(sprite, FALSE);
@@ -922,6 +919,7 @@ static void AnimRevengeScratch(struct Sprite *sprite)
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
// Fist shrinks toward target and shakes
static void AnimFocusPunchFist(struct Sprite *sprite)
{
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 AnimLargeFlame(struct Sprite *sprite);
static void AnimFirePlume(struct Sprite *sprite);
static void sub_80ACAA8(struct Sprite *sprite);
static void sub_80ACBB0(struct Sprite *sprite);
static void AnimUnusedSmallEmber(struct Sprite *sprite);
static void AnimSunlight(struct Sprite *sprite);
static void AnimEmberFlare(struct Sprite *sprite);
static void AnimBurnFlame(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 AnimWillOWispOrb(struct Sprite *sprite);
static void AnimWillOWispFire(struct Sprite *sprite);
static void sub_80ACA6C(struct Sprite *sprite);
static void sub_80ACB1C(struct Sprite *sprite);
static void AnimLargeFlame_Step(struct Sprite *sprite);
static void AnimUnusedSmallEmber_Step(struct Sprite *sprite);
static void AnimFireRing_Step1(struct Sprite *sprite);
static void AnimFireRing_Step2(struct Sprite *sprite);
static void AnimFireRing_Step3(struct Sprite *sprite);
static void UpdateFireRingCircleOffset(struct Sprite *sprite);
static void sub_80ACE28(struct Sprite *sprite);
static void sub_80ACE50(struct Sprite *sprite);
static void AnimFireSpiralOutward_Step1(struct Sprite *sprite);
static void AnimFireSpiralOutward_Step2(struct Sprite *sprite);
static void AnimTask_EruptionLaunchRocks_Step(u8 taskId);
static void sub_80AD1F8(u8 spriteId, u8 taskId, u8 a3);
static u16 sub_80AD374(u8 spriteId);
static void sub_80AD3C8(struct Sprite *sprite, s16 x, s16 y);
static void sub_80AD3E4(struct Sprite *sprite);
static void sub_80AD4A8(struct Sprite *sprite);
static void sub_80AD690(struct Sprite *sprite);
static void sub_80AD870(u8 taskId);
static void CreateEruptionLaunchRocks(u8 spriteId, u8 taskId, u8 a3);
static u16 GetEruptionLaunchRockInitialYPos(u8 spriteId);
static void InitEruptionLaunchRockCoordData(struct Sprite *sprite, s16 x, s16 y);
static void UpdateEruptionLaunchRockPos(struct Sprite *sprite);
static void AnimEruptionFallingRock_Step(struct Sprite *sprite);
static void AnimWillOWispOrb_Step(struct Sprite *sprite);
static void AnimTask_MoveHeatWaveTargets_Step(u8 taskId);
static const union AnimCmd sAnim_FireSpiralSpread_0[] =
{
@@ -160,7 +160,7 @@ const struct SpriteTemplate gFirePlumeSpriteTemplate =
.callback = AnimFirePlume,
};
const struct SpriteTemplate gUnknown_83E5CB8 =
static const struct SpriteTemplate sUnusedEmberFirePlumeSpriteTemplate =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
@@ -171,7 +171,7 @@ const struct SpriteTemplate gUnknown_83E5CB8 =
.callback = AnimFirePlume,
};
static const union AnimCmd gUnknown_83E5CD0[] =
static const union AnimCmd sAnim_UnusedSmallEmber[] =
{
ANIMCMD_FRAME(16, 6),
ANIMCMD_FRAME(32, 6),
@@ -179,20 +179,20 @@ static const union AnimCmd gUnknown_83E5CD0[] =
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,
.paletteTag = ANIM_TAG_SMALL_EMBER,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5CE0,
.anims = sAnims_UnusedSmallEmber,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80ACAA8,
.callback = AnimUnusedSmallEmber,
};
static const union AffineAnimCmd sAffineAnim_SunlightRay[] =
@@ -215,7 +215,7 @@ const struct SpriteTemplate gSunlightRaySpriteTemplate =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = sAffineAnims_SunlightRay,
.callback = sub_80ACBB0,
.callback = AnimSunlight,
};
static const union AnimCmd sAnim_BasicFire[] =
@@ -289,22 +289,22 @@ static const union AnimCmd *const sAnims_FireBlastCross[] =
sAnim_FireBlastCross,
};
static const union AffineAnimCmd gUnknown_83E5DBC[] =
static const union AffineAnimCmd sAffineAnim_Unused_0[] =
{
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1),
AFFINEANIMCMD_END,
};
static const union AffineAnimCmd gUnknown_83E5DCC[] =
static const union AffineAnimCmd sAffineAnim_Unused_1[] =
{
AFFINEANIMCMD_FRAME(0xA0, 0xA0, 0, 0),
AFFINEANIMCMD_END,
};
static const union AffineAnimCmd *const gUnknown_83E5DDC[] =
static const union AffineAnimCmd *const sAffineAnims_Unused[] =
{
gUnknown_83E5DBC,
gUnknown_83E5DCC,
sAffineAnim_Unused_0,
sAffineAnim_Unused_1,
};
const struct SpriteTemplate gFireBlastCrossSpriteTemplate =
@@ -351,7 +351,7 @@ static const struct SpriteTemplate gEruptionLaunchRockSpriteTemplate =
.callback = AnimEruptionLaunchRock,
};
static const s16 sEruptionLaunchRockCoords[][2] =
static const s16 sEruptionLaunchRockSpeeds[][2] =
{
{-2, -5},
{-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,
};
// For the first stage of Fire Punch
static void AnimFireSpiralInward(struct Sprite *sprite)
{
sprite->data[0] = gBattleAnimArgs[0];
@@ -465,10 +466,11 @@ static void AnimFireSpiralInward(struct Sprite *sprite)
sprite->data[3] = 0x1E;
sprite->data[4] = 0xFE00;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
sprite->callback = TranslateSpriteInGrowingCircleOverDuration;
sprite->callback = TranslateSpriteInGrowingCircle;
sprite->callback(sprite);
}
// For the impact spread of fire sprites for moves like Blaze Kick or Fire Punch
static void AnimFireSpread(struct Sprite *sprite)
{
SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
@@ -498,7 +500,7 @@ static void AnimFirePlume(struct Sprite *sprite)
sprite->data[1] = gBattleAnimArgs[2];
sprite->data[4] = gBattleAnimArgs[3];
sprite->data[3] = gBattleAnimArgs[5];
sprite->callback = sub_80ACA6C;
sprite->callback = AnimLargeFlame_Step;
}
static void AnimLargeFlame(struct Sprite *sprite)
@@ -518,10 +520,10 @@ static void AnimLargeFlame(struct Sprite *sprite)
sprite->data[1] = gBattleAnimArgs[2];
sprite->data[4] = gBattleAnimArgs[3];
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])
{
@@ -532,7 +534,7 @@ static void sub_80ACA6C(struct Sprite *sprite)
DestroySpriteAndMatrix(sprite);
}
static void sub_80ACAA8(struct Sprite *sprite)
static void AnimUnusedSmallEmber(struct Sprite *sprite)
{
SetSpriteCoordsToAnimAttackerCoords(sprite);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
@@ -551,10 +553,10 @@ static void sub_80ACAA8(struct Sprite *sprite)
sprite->data[3] = gBattleAnimArgs[5];
sprite->data[4] = gBattleAnimArgs[6];
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])
{
@@ -576,8 +578,8 @@ static void sub_80ACB1C(struct Sprite *sprite)
}
}
//sunlight
static void sub_80ACBB0(struct Sprite *sprite)
// Sunlight from Sunny Day / sunny weather
static void AnimSunlight(struct Sprite *sprite)
{
sprite->x = 0;
sprite->y = 0;
@@ -588,8 +590,6 @@ static void sub_80ACBB0(struct Sprite *sprite)
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
//fire 2
// Animates the secondary effect of MOVE_EMBER, where the flames grow and slide
// horizontally a bit.
// 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_OPPONENT_RIGHT)))
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->callback = AnimSnoreZ;
sprite->callback = AnimTravelDiagonally;
sprite->callback(sprite);
}
@@ -613,7 +613,7 @@ static void AnimBurnFlame(struct Sprite *sprite)
{
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->callback = AnimSnoreZ;
sprite->callback = AnimTravelDiagonally;
}
// 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)
static void AnimFireRing(struct Sprite *sprite)
{
InitSpritePosToAnimAttacker(sprite, 1);
InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[7] = gBattleAnimArgs[2];
sprite->data[0] = 0;
sprite->callback = AnimFireRing_Step1;
@@ -706,19 +706,19 @@ static void AnimFireSpiralOutward(struct Sprite *sprite)
sprite->data[0] = gBattleAnimArgs[3];
sprite->invisible = TRUE;
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->data[0] = sprite->data[1];
sprite->data[1] = 0;
sprite->callback = sub_80ACE50;
sprite->callback = AnimFireSpiralOutward_Step2;
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->y2 = Cos(sprite->data[1], sprite->data[2] >> 8);
@@ -728,258 +728,337 @@ static void sub_80ACE50(struct Sprite *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];
task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER);
task->data[0] = 0;
task->data[1] = 0;
task->data[2] = 0;
task->data[3] = 0;
task->data[4] = gSprites[task->data[15]].y;
task->data[5] = GetBattlerSide(gBattleAnimAttacker);
task->data[6] = 0;
task->tAttackerSpriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
task->tState = 0;
task->tTimer1 = 0;
task->tTimer2 = 0;
task->tTimer3 = 0;
task->tAttackerY = gSprites[task->tAttackerSpriteId].y;
task->tAttackerSide = GetBattlerSide(gBattleAnimAttacker);
task->tActiveSprites = 0;
PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL);
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];
switch (task->data[0])
switch (task->tState)
{
case 0:
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x100, 0x100, 0xE0, 0x200, 0x20);
++task->data[0];
// fall through
BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x100, 0x100, 0xE0, 0x200, 32);
task->tState++;
case 1:
if (++task->data[1] > 1)
if (++task->tTimer1 > 1)
{
task->data[1] = 0;
if (++task->data[2] & 0x1)
gSprites[task->data[15]].x2 = 3;
task->tTimer1 = 0;
if (++task->tTimer2 & 1)
gSprites[task->tAttackerSpriteId].x2 = 3;
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;
++gSprites[task->data[15]].y;
task->tTimer3 = 0;
gSprites[task->tAttackerSpriteId].y++;
}
}
if(!BattleAnimHelper_RunSpriteSquash(task))
{
SetBattlerSpriteYOffsetFromYScale(task->data[15]);
gSprites[task->data[15]].x2 = 0;
task->data[1] = 0;
task->data[2] = 0;
task->data[3] = 0;
++task->data[0];
SetBattlerSpriteYOffsetFromYScale(task->tAttackerSpriteId);
gSprites[task->tAttackerSpriteId].x2 = 0;
task->tTimer1 = 0;
task->tTimer2 = 0;
task->tTimer3 = 0;
task->tState++;
}
break;
case 2:
if (++task->data[1] > 4)
if (++task->tTimer1 > 4)
{
if (task->data[5])
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0xE0, 0x200, 0x180, 0xF0, 0x6);
if (task->tAttackerSide != B_SIDE_PLAYER)
BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0xE0, 0x200, 0x180, 0xF0, 6);
else
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0xE0, 0x200, 0x180, 0xC0, 0x6);
task->data[1] = 0;
++task->data[0];
BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0xE0, 0x200, 0x180, 0xC0, 6);
task->tTimer1 = 0;
task->tState++;
}
break;
case 3:
if (!BattleAnimHelper_RunSpriteSquash(task))
{
sub_80AD1F8(task->data[15], taskId, 6);
++task->data[0];
CreateEruptionLaunchRocks(task->tAttackerSpriteId, taskId, IDX_ACTIVE_SPRITES);
task->tState++;
}
break;
case 4:
if (++task->data[1] > 1)
if (++task->tTimer1 > 1)
{
task->data[1] = 0;
if (++task->data[2] & 1)
gSprites[task->data[15]].y2 += 3;
task->tTimer1 = 0;
if (++task->tTimer2 & 1)
gSprites[task->tAttackerSpriteId].y2 += 3;
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])
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x180, 0xF0, 0x100, 0x100, 0x8);
if (task->tAttackerSide != B_SIDE_PLAYER)
BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x180, 0xF0, 0x100, 0x100, 8);
else
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x180, 0xC0, 0x100, 0x100, 0x8);
if (task->data[2] & 1)
gSprites[task->data[15]].y2 -= 3;
task->data[1] = 0;
task->data[2] = 0;
task->data[3] = 0;
++task->data[0];
BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x180, 0xC0, 0x100, 0x100, 8);
if (task->tTimer2 & 1)
gSprites[task->tAttackerSpriteId].y2 -= 3;
task->tTimer1 = 0;
task->tTimer2 = 0;
task->tTimer3 = 0;
task->tState++;
}
break;
case 5:
if (task->data[5])
--gSprites[task->data[15]].y;
if (task->tAttackerSide != B_SIDE_PLAYER)
gSprites[task->tAttackerSpriteId].y--;
if (!BattleAnimHelper_RunSpriteSquash(task))
{
gSprites[task->data[15]].y = task->data[4];
ResetSpriteRotScale(task->data[15]);
task->data[2] = 0;
++task->data[0];
gSprites[task->tAttackerSpriteId].y = task->tAttackerY;
ResetSpriteRotScale(task->tAttackerSpriteId);
task->tTimer2 = 0;
task->tState++;
}
break;
case 6:
if (!task->data[6])
if (task->tActiveSprites == 0)
DestroyAnimVisualTask(taskId);
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;
s8 sign;
u16 y = sub_80AD374(spriteId);
u16 y = GetEruptionLaunchRockInitialYPos(spriteId);
u16 x = gSprites[spriteId].x;
if(GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
if(!GetBattlerSide(gBattleAnimAttacker))
{
x -= 0xC;
x -= 12;
sign = 1;
}
else
{
x += 0x10;
x += 16;
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);
if (spriteId != 0x40)
if (spriteId != MAX_SPRITES)
{
gSprites[spriteId].oam.tileNum += j * 4 + 0x40;
if (++j >= 5)
j = 0;
sub_80AD3C8(&gSprites[spriteId], sEruptionLaunchRockCoords[i][0] * sign, sEruptionLaunchRockCoords[i][1]);
gSprites[spriteId].data[6] = taskId;
gSprites[spriteId].data[7] = a3;
++gTasks[taskId].data[a3];
InitEruptionLaunchRockCoordData(&gSprites[spriteId], sEruptionLaunchRockSpeeds[i][0] * sign, sEruptionLaunchRockSpeeds[i][1]);
gSprites[spriteId].sTaskId = taskId;
gSprites[spriteId].sActiveSpritesIdx = activeSpritesIdx;
gTasks[taskId].data[activeSpritesIdx]++;
}
}
}
static void AnimEruptionLaunchRock(struct Sprite *sprite)
{
sub_80AD3E4(sprite);
UpdateEruptionLaunchRockPos(sprite);
if (sprite->invisible)
{
--gTasks[sprite->data[6]].data[sprite->data[7]];
gTasks[sprite->sTaskId].data[sprite->sActiveSpritesIdx]--;
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)
var1 = ((var1 << 16) + 0x4A0000) >> 16;
y += 74;
else
var1 = ((var1 << 16) + 0x2C0000) >> 16;
return var1;
y += 44;
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->data[1] = 0;
sprite->data[2] = (u16)sprite->x * 8;
sprite->data[3] = (u16)sprite->y * 8;
sprite->data[4] = x * 8;
sprite->data[5] = y * 8;
sprite->sSpeedDelay = 0;
sprite->sLaunchStage = 0;
sprite->sX = (u16)sprite->x * 8;
sprite->sY = (u16)sprite->y * 8;
sprite->sSpeedX = speedX * 8;
sprite->sSpeedY = speedY * 8;
}
static void sub_80AD3E4(struct Sprite *sprite)
static void UpdateEruptionLaunchRockPos(struct Sprite *sprite)
{
s32 var1;
if (++sprite->data[0] > 2)
int extraLaunchSpeed;
if (++sprite->sSpeedDelay > 2)
{
sprite->data[0] = 0;
++sprite->data[1];
var1 = (u16)sprite->data[1] * (u16)sprite->data[1];
sprite->data[3] += var1;
sprite->sSpeedDelay = 0;
++sprite->sLaunchStage;
extraLaunchSpeed = (u16)sprite->sLaunchStage * (u16)sprite->sLaunchStage;
sprite->sY += extraLaunchSpeed;
}
sprite->data[2] += sprite->data[4];
sprite->x = sprite->data[2] >> 3;
sprite->data[3] += sprite->data[5];
sprite->y = sprite->data[3] >> 3;
if (sprite->x < -8 || sprite->x > 0xf8 || sprite->y < -8 || sprite->y > 120)
sprite->sX += sprite->sSpeedX;
sprite->x = sprite->sX >> 3;
sprite->sY += sprite->sSpeedY;
sprite->y = sprite->sY >> 3;
if (sprite->x < -8 || sprite->x > DISPLAY_WIDTH + 8 || sprite->y < -8 || sprite->y > 120)
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)
{
sprite->x = gBattleAnimArgs[0];
sprite->y = gBattleAnimArgs[1];
sprite->data[0] = 0;
sprite->data[1] = 0;
sprite->data[2] = 0;
sprite->data[6] = gBattleAnimArgs[2];
sprite->data[7] = gBattleAnimArgs[3];
sprite->sState = 0;
sprite->sBounceTimer = 0;
sprite->sBounceDir = 0;
sprite->sFallDelay = gBattleAnimArgs[2];
sprite->sTargetY = gBattleAnimArgs[3];
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:
if (sprite->data[6] != 0)
// Wait to begin falling
if (sprite->sFallDelay != 0)
{
--sprite->data[6];
sprite->sFallDelay--;
return;
}
++sprite->data[0];
sprite->sState++;
// fall through
case 1:
// Rock is falling
sprite->y += 8;
if (sprite->y >= sprite->data[7])
if (sprite->y >= sprite->sTargetY)
{
sprite->y = sprite->data[7];
++sprite->data[0];
sprite->y = sprite->sTargetY;
sprite->sState++;
}
break;
case 2:
if (++sprite->data[1] > 1)
// Bounce up and down on landing spot
if (++sprite->sBounceTimer > 1)
{
sprite->data[1] = 0;
if ((++sprite->data[2] & 1) != 0)
sprite->sBounceTimer = 0;
if ((++sprite->sBounceDir & 1) != 0)
sprite->y2 = -3;
else
sprite->y2 = 3;
}
if (++sprite->data[3] > 16)
if (++sprite->sEndTimer > 16)
DestroyAnimSprite(sprite);
break;
}
}
#undef sState
#undef sBounceTimer
#undef sBounceDir
#undef sEndTimer
#undef sFallDelay
#undef sTargetY
//wisp orb
static void AnimWillOWispOrb(struct Sprite *sprite)
{
switch (sprite->data[0])
{
case 0:
InitSpritePosToAnimAttacker(sprite, 0);
InitSpritePosToAnimAttacker(sprite, FALSE);
StartSpriteAnim(sprite, gBattleAnimArgs[2]);
sprite->data[7] = gBattleAnimArgs[2];
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
@@ -1016,14 +1095,14 @@ static void AnimWillOWispOrb(struct Sprite *sprite)
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->data[3] = sprite->y;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
BattleAnim_InitLinearTranslationWithDuration(sprite);
sprite->callback = sub_80AD690;
InitAnimLinearTranslationWithSpeed(sprite);
sprite->callback = AnimWillOWispOrb_Step;
}
break;
}
}
static void sub_80AD690(struct Sprite *sprite)
static void AnimWillOWispOrb_Step(struct Sprite *sprite)
{
s16 initialData5, newData5;
@@ -1034,7 +1113,7 @@ static void sub_80AD690(struct Sprite *sprite)
sprite->data[5] = (sprite->data[5] + 4) & 0xFF;
newData5 = sprite->data[5];
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
{
@@ -1042,7 +1121,6 @@ static void sub_80AD690(struct Sprite *sprite)
}
}
//wisp fire
static void AnimWillOWispFire(struct Sprite *sprite)
{
if (!sprite->data[0])
@@ -1083,10 +1161,10 @@ void AnimTask_MoveHeatWaveTargets(u8 taskId)
task->data[13] = IsBattlerSpriteVisible(gBattleAnimTarget ^ BIT_FLANK) + 1;
task->data[14] = GetAnimBattlerSpriteId(ANIM_TARGET);
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];
@@ -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 1: color code
void AnimTask_BlendBackground(u8 taskId)
@@ -1165,29 +1243,40 @@ void AnimTask_BlendBackground(u8 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)
{
s8 unk;
s8 dir;
u8 spriteId;
if (gTasks[taskId].data[0] == 0)
if (gTasks[taskId].tShakeNum == 0)
{
gTasks[taskId].data[1] = gBattleAnimArgs[0];
gTasks[taskId].data[2] = gBattleAnimArgs[1];
gTasks[taskId].data[3] = gBattleAnimArgs[2];
gTasks[taskId].data[4] = gBattleAnimArgs[3];
gTasks[taskId].tMaxShakes = gBattleAnimArgs[0];
gTasks[taskId].tShakeOffset = gBattleAnimArgs[1];
gTasks[taskId].tVertical = gBattleAnimArgs[2];
gTasks[taskId].tPatternId = gBattleAnimArgs[3];
}
++gTasks[taskId].data[0];
gTasks[taskId].tShakeNum++;
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
unk = sShakeDirsPattern1[gTasks[taskId].data[0] % 10];
if (gTasks[taskId].data[3] == 1)
gSprites[spriteId].y2 = gBattleAnimArgs[1] * unk < 0 ? -(gBattleAnimArgs[1] * unk) : gBattleAnimArgs[1] * unk;
dir = sShakeDirsPattern1[gTasks[taskId].tShakeNum % 10];
if (gTasks[taskId].tVertical == TRUE)
gSprites[spriteId].y2 = gBattleAnimArgs[1] * dir < 0 ? -(gBattleAnimArgs[1] * dir) : gBattleAnimArgs[1] * dir;
else
gSprites[spriteId].x2 = gBattleAnimArgs[1] * unk;
if (gTasks[taskId].data[0] == gTasks[taskId].data[1])
gSprites[spriteId].x2 = gBattleAnimArgs[1] * dir;
if (gTasks[taskId].tShakeNum == gTasks[taskId].tMaxShakes)
{
gSprites[spriteId].x2 = 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 AnimFlyBallAttack(struct Sprite *sprite);
static void AnimFallingFeather(struct Sprite *sprite);
static void sub_80B24C0(struct Sprite *sprite);
static void sub_80B2514(struct Sprite *sprite);
static void AnimUnusedBubbleThrow(struct Sprite *sprite);
static void AnimUnusedFeather(struct Sprite *sprite);
static void AnimWhirlwindLine(struct Sprite *sprite);
static void AnimBounceBallShrink(struct Sprite *sprite);
static void AnimBounceBallLand(struct Sprite *sprite);
static void AnimDiveBall(struct Sprite *sprite);
static void AnimDiveWaterSplash(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 sub_80B190C(struct Sprite *sprite);
static void sub_80B198C(u8 taskId);
static void sub_80B1A9C(struct Sprite *sprite);
static void sub_80B1BF8(struct Sprite *sprite);
static void sub_80B1CC0(struct Sprite *sprite);
static void AnimEllipticalGust_Step(struct Sprite *sprite);
static void AnimTask_AnimateGustTornadoPalette_Step(u8 taskId);
static void AnimGustToTarget_Step(struct Sprite *sprite);
static void AnimFlyBallUp_Step(struct Sprite *sprite);
static void AnimFlyBallAttack_Step(struct Sprite *sprite);
static void AnimFallingFeather_Step(struct Sprite *sprite);
static void sub_80B268C(struct Sprite *sprite);
static void sub_80B2820(struct Sprite *sprite);
static void sub_80B2A50(struct Sprite *sprite);
static void sub_80B2AB0(struct Sprite *sprite);
static void sub_80B2C88(struct Sprite *sprite);
static void sub_80B2CF8(struct Sprite *sprite);
static void sub_80B2E20(struct Sprite *sprite);
static void AnimUnusedFeather_Step(struct Sprite *sprite);
static void AnimWhirlwindLine_Step(struct Sprite *sprite);
static void AnimDiveBall_Step1(struct Sprite *sprite);
static void AnimDiveBall_Step2(struct Sprite *sprite);
static void AnimSprayWaterDroplet_Step(struct Sprite *sprite);
static void AnimUnusedFlashingLight_Step(struct Sprite *sprite);
static void AnimSkyAttackBird_Step(struct Sprite *sprite);
const struct SpriteTemplate gEllipticalGustSpriteTemplate =
{
@@ -177,10 +177,9 @@ const struct SpriteTemplate gFallingFeatherSpriteTemplate =
.callback = AnimFallingFeather,
};
// not used
static const u16 gUnknown_83E6C18[] = INCBIN_U16("graphics/battle_anims/unk_83E6C18.gbapal");
static const u16 sUnusedPal[] = INCBIN_U16("graphics/battle_anims/unk_83E6C18.gbapal");
const struct SpriteTemplate gUnknown_83E6C38 =
static const struct SpriteTemplate sUnusedBubbleThrowSpriteTemplate =
{
.tileTag = ANIM_TAG_SMALL_BUBBLES,
.paletteTag = ANIM_TAG_SMALL_BUBBLES,
@@ -188,10 +187,10 @@ const struct SpriteTemplate gUnknown_83E6C38 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80B24C0,
.callback = AnimUnusedBubbleThrow,
};
const struct SpriteTemplate gUnknown_83E6C50 =
static const struct SpriteTemplate sUnusedFeatherSpriteTemplate =
{
.tileTag = ANIM_TAG_WHITE_FEATHER,
.paletteTag = ANIM_TAG_WHITE_FEATHER,
@@ -199,7 +198,7 @@ const struct SpriteTemplate gUnknown_83E6C50 =
.anims = sAnims_FallingFeather,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80B2514,
.callback = AnimUnusedFeather,
};
static const union AnimCmd sAnim_WhirlwindLines[] =
@@ -301,8 +300,7 @@ const struct SpriteTemplate gDiveBallSpriteTemplate =
.callback = AnimDiveBall,
};
// not used
static const union AffineAnimCmd gUnknown_83E6D58[] =
static const union AffineAnimCmd sAnim_Unused[] =
{
AFFINEANIMCMD_FRAME(0x100, 0x0, 0, 0),
AFFINEANIMCMD_FRAME(0x0, 0x20, 0, 12),
@@ -310,10 +308,9 @@ static const union AffineAnimCmd gUnknown_83E6D58[] =
AFFINEANIMCMD_END,
};
// not used
static const union AffineAnimCmd *const gUnknown_83E6D80[] =
static const union AffineAnimCmd *const sAnims_Unused[] =
{
gUnknown_83E6D58,
sAnim_Unused,
};
const struct SpriteTemplate gDiveWaterSplashSpriteTemplate =
@@ -338,7 +335,7 @@ const struct SpriteTemplate gSprayWaterDropletSpriteTemplate =
.callback = AnimSprayWaterDroplet,
};
const struct SpriteTemplate gUnknown_83E6DAC =
static const struct SpriteTemplate sUnusedFlashingLightSpriteTemplate =
{
.tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,
.paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,
@@ -346,7 +343,7 @@ const struct SpriteTemplate gUnknown_83E6DAC =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80B2CE4,
.callback = AnimUnusedFlashingLight,
};
const struct SpriteTemplate gSkyAttackBirdSpriteTemplate =
@@ -365,11 +362,11 @@ static void AnimEllipticalGust(struct Sprite *sprite)
InitSpritePosToAnimTarget(sprite, FALSE);
sprite->y += 20;
sprite->data[1] = 191;
sprite->callback = sub_80B190C;
sprite->callback = AnimEllipticalGust_Step;
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->y2 = Cos(sprite->data[1], 8);
@@ -379,15 +376,16 @@ static void sub_80B190C(struct Sprite *sprite)
DestroyAnimSprite(sprite);
}
// Animates the palette on the gust tornado to make it look like its spinning
void AnimTask_AnimateGustTornadoPalette(u8 taskId)
{
gTasks[taskId].data[0] = gBattleAnimArgs[1];
gTasks[taskId].data[1] = gBattleAnimArgs[0];
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;
u16 temp;
@@ -423,10 +421,10 @@ static void AnimGustToTarget(struct Sprite *sprite)
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
InitAnimLinearTranslation(sprite);
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))
DestroyAnimSprite(sprite);
@@ -472,11 +470,11 @@ static void AnimFlyBallUp(struct Sprite *sprite)
InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[0] = gBattleAnimArgs[2];
sprite->data[1] = gBattleAnimArgs[3];
sprite->callback = sub_80B1BF8;
sprite->callback = AnimFlyBallUp_Step;
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)
{
@@ -495,7 +493,7 @@ static void AnimFlyBallAttack(struct Sprite *sprite)
{
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{
sprite->x = 272;
sprite->x = DISPLAY_WIDTH + 32;
sprite->y = -32;
StartSpriteAffineAnim(sprite, 1);
}
@@ -510,10 +508,10 @@ static void AnimFlyBallAttack(struct Sprite *sprite)
sprite->data[3] = sprite->y;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
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;
AnimTranslateLinear(sprite);
@@ -524,8 +522,8 @@ static void sub_80B1CC0(struct Sprite *sprite)
sprite->data[3] &= 0xFF;
}
if (sprite->x + sprite->x2 < -32
|| sprite->x + sprite->x2 > 272
|| sprite->y + sprite->y2 > 160)
|| sprite->x + sprite->x2 > DISPLAY_WIDTH + 32
|| sprite->y + sprite->y2 > DISPLAY_HEIGHT)
{
gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = FALSE;
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->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
@@ -891,7 +889,7 @@ static void sub_80B24C0(struct Sprite *sprite)
sprite->callback = TranslateAnimSpriteToTargetMonLocation;
}
static void sub_80B2514(struct Sprite *sprite)
static void AnimUnusedFeather(struct Sprite *sprite)
{
u8 matrixNum;
s16 rn, sinVal;
@@ -935,10 +933,10 @@ static void sub_80B2514(struct Sprite *sprite)
sprite->animNum = 1;
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 *tData = (struct FeatherDanceData *)sprite->data;
@@ -992,12 +990,12 @@ static void AnimWhirlwindLine(struct Sprite *sprite)
u16 arg;
u8 mult;
if (!gBattleAnimArgs[2])
if (gBattleAnimArgs[2] == ANIM_ATTACKER)
InitSpritePosToAnimAttacker(sprite, 0);
else
InitSpritePosToAnimTarget(sprite, FALSE);
if ((!gBattleAnimArgs[2] && GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
|| (gBattleAnimArgs[2] == 1 && GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER))
if ((gBattleAnimArgs[2] == ANIM_ATTACKER && GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
|| (gBattleAnimArgs[2] == ANIM_TARGET && GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER))
sprite->x += 8;
SeekSpriteAnim(sprite, gBattleAnimArgs[4]);
sprite->x -= 32;
@@ -1007,10 +1005,10 @@ static void AnimWhirlwindLine(struct Sprite *sprite)
sprite->x2 += mult * arg;
sprite->data[0] = arg;
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;
if (++sprite->data[0] == 6)
@@ -1064,7 +1062,7 @@ static void AnimBounceBallLand(struct Sprite *sprite)
switch (sprite->data[0])
{
case 0:
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
sprite->y2 = -sprite->y - 32;
++sprite->data[0];
break;
@@ -1089,11 +1087,11 @@ static void AnimDiveBall(struct Sprite *sprite)
InitSpritePosToAnimAttacker(sprite, 1);
sprite->data[0] = gBattleAnimArgs[2];
sprite->data[1] = gBattleAnimArgs[3];
sprite->callback = sub_80B2A50;
sprite->callback = AnimDiveBall_Step1;
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)
{
@@ -1108,11 +1106,11 @@ static void sub_80B2A50(struct Sprite *sprite)
{
sprite->invisible = TRUE;
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;
if (sprite->y + sprite->y2 > -32)
@@ -1131,13 +1129,13 @@ static void AnimDiveWaterSplash(struct Sprite *sprite)
case 0:
if (!gBattleAnimArgs[0])
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1);
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
}
else
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
}
sprite->data[1] = 512;
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)
{
s32 v1 = 0x1FF & Random();
@@ -1185,18 +1184,18 @@ static void AnimSprayWaterDroplet(struct Sprite *sprite)
sprite->oam.matrixNum = ST_OAM_HFLIP;
if (gBattleAnimArgs[1] == 0)
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 32;
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 32;
}
else
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + 32;
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
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)
{
@@ -1216,14 +1215,14 @@ static void sub_80B2C88(struct Sprite *sprite)
DestroyAnimSprite(sprite);
}
static void sub_80B2CE4(struct Sprite *sprite)
static void AnimUnusedFlashingLight(struct Sprite *sprite)
{
sprite->data[6] = 0;
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])
{
@@ -1248,8 +1247,8 @@ static void AnimSkyAttackBird(struct Sprite *sprite)
s16 posx = sprite->x;
s16 posy = sprite->y;
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[4] = sprite->x << 4;
sprite->data[5] = sprite->y << 4;
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 += 49152;
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[5] += sprite->data[7];
sprite->x = sprite->data[4] >> 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)
DestroySpriteAndMatrix(sprite);
}
// not used
static void sub_80B2E64(u8 taskId)
// Unused
static void AnimTask_SetAttackerVisibility(u8 taskId)
{
if (gBattleAnimArgs[0] == 0)
{
+121 -117
View File
@@ -9,39 +9,39 @@
#include "constants/songs.h"
static void AnimConfuseRayBallBounce(struct Sprite *sprite);
static void sub_80B52D0(struct Sprite *sprite);
static void sub_80B5344(struct Sprite *sprite);
static void sub_80B53C0(struct Sprite *sprite);
static void AnimConfuseRayBallBounce_Step1(struct Sprite *sprite);
static void AnimConfuseRayBallBounce_Step2(struct Sprite *sprite);
static void UpdateConfuseRayBallBlend(struct Sprite *sprite);
static void AnimConfuseRayBallSpiral(struct Sprite *sprite);
static void sub_80B5470(struct Sprite *sprite);
static void sub_80B5570(u8 taskId);
static void sub_80B55C8(u8 taskId);
static void AnimConfuseRayBallSpiral_Step(struct Sprite *sprite);
static void AnimTask_NightShadeClone_Step1(u8 taskId);
static void AnimTask_NightShadeClone_Step2(u8 taskId);
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 sub_80B5810(struct Sprite *sprite);
static void sub_80B59D4(u8 taskId);
static void sub_80B5AD4(u8 taskId);
static void sub_80B5D38(u8 taskId);
static void sub_80B5DCC(u8 taskId);
static void AnimLick_Step(struct Sprite *sprite);
static void AnimTask_NightmareClone_Step(u8 taskId);
static void AnimTask_SpiteTargetShadow_Step1(u8 taskId);
static void AnimTask_SpiteTargetShadow_Step2(u8 taskId);
static void AnimTask_SpiteTargetShadow_Step3(u8 taskId);
static void AnimDestinyBondWhiteShadow(struct Sprite *sprite);
static void sub_80B5FE0(struct Sprite *sprite);
static void sub_80B623C(u8 taskId);
static void sub_80B6468(u8 taskId);
static void sub_80B65F0(u8 taskId);
static void AnimDestinyBondWhiteShadow_Step(struct Sprite *sprite);
static void AnimTask_DestinyBondWhiteShadow_Step(u8 taskId);
static void AnimTask_CurseStretchingBlackBg_Step1(u8 taskId);
static void AnimTask_CurseStretchingBlackBg_Step2(u8 taskId);
static void AnimCurseNail(struct Sprite *sprite);
static void sub_80B66A8(struct Sprite *sprite);
static void sub_80B6728(struct Sprite *sprite);
static void sub_80B67A0(struct Sprite *sprite);
static void AnimCurseNail_Step1(struct Sprite *sprite);
static void AnimCurseNail_Step2(struct Sprite *sprite);
static void AnimCurseNail_End(struct Sprite *sprite);
static void AnimGhostStatusSprite(struct Sprite *sprite);
static void sub_80B68A8(struct Sprite *sprite);
static void sub_80B696C(u8 taskId);
static void AnimGhostStatusSprite_End(struct Sprite *sprite);
static void AnimTask_GrudgeFlames_Step(u8 taskId);
static void AnimGrudgeFlame(struct Sprite *sprite);
static void sub_80B7158(struct Sprite *sprite);
static void sub_80B6BE4(u8 taskId);
static void sub_80B6F30(u8 taskId);
static void sub_80B6FC4(u8 taskId);
static void sub_80B71B0(struct Sprite *sprite);
static void AnimMonMoveCircular(struct Sprite *sprite);
static void AnimTask_GhostGetOut_Step1(u8 taskId);
static void AnimTask_GhostGetOut_Step2(u8 taskId);
static void AnimTask_GhostGetOut_Step3(u8 taskId);
static void AnimMonMoveCircular_Step(struct Sprite *sprite);
static const union AffineAnimCmd sAffineAnim_ConfuseRayBallBounce[] =
{
@@ -125,17 +125,15 @@ const struct SpriteTemplate gLickSpriteTemplate =
.callback = AnimLick,
};
// not used
static const union AffineAnimCmd gUnknown_83E7654[] =
static const union AffineAnimCmd sAffineAnim_Unused[] =
{
AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),
AFFINEANIMCMD_END,
};
// not used
static const union AffineAnimCmd *const gUnknown_83E7664[] =
static const union AffineAnimCmd *const sAffineAnims_Unused[] =
{
gUnknown_83E7654,
sAffineAnim_Unused,
};
const struct SpriteTemplate gDestinyBondWhiteShadowSpriteTemplate =
@@ -207,7 +205,8 @@ const struct SpriteTemplate gGrudgeFlameSpriteTemplate =
.callback = AnimGrudgeFlame,
};
const struct SpriteTemplate gUnknown_83E76F8 =
// Unused
static const struct SpriteTemplate sMonMoveCircularSpriteTemplate =
{
.tileTag = 0,
.paletteTag = 0,
@@ -215,7 +214,7 @@ const struct SpriteTemplate gUnknown_83E76F8 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80B7158,
.callback = AnimMonMoveCircular,
};
static void AnimConfuseRayBallBounce(struct Sprite *sprite)
@@ -223,24 +222,24 @@ static void AnimConfuseRayBallBounce(struct Sprite *sprite)
InitSpritePosToAnimAttacker(sprite, 1);
sprite->data[0] = gBattleAnimArgs[2];
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[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
BattleAnim_InitLinearTranslationWithDuration(sprite);
sprite->callback = sub_80B52D0;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
InitAnimLinearTranslationWithSpeed(sprite);
sprite->callback = AnimConfuseRayBallBounce_Step1;
sprite->data[6] = 16;
SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL));
SetGpuReg(REG_OFFSET_BLDALPHA, sprite->data[6]);
}
static void sub_80B52D0(struct Sprite *sprite)
static void AnimConfuseRayBallBounce_Step1(struct Sprite *sprite)
{
s16 r0, r2;
sub_80B53C0(sprite);
UpdateConfuseRayBallBlend(sprite);
if (AnimTranslateLinear(sprite))
{
sprite->callback = sub_80B5344;
sprite->callback = AnimConfuseRayBallBounce_Step2;
return;
}
sprite->x2 += Sin(sprite->data[5], 10);
@@ -252,10 +251,10 @@ static void sub_80B52D0(struct Sprite *sprite)
return;
if (r0 <= 0)
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;
@@ -275,11 +274,11 @@ static void sub_80B5344(struct Sprite *sprite)
}
else
{
sub_80B53C0(sprite);
UpdateConfuseRayBallBlend(sprite);
}
}
static void sub_80B53C0(struct Sprite *sprite)
static void UpdateConfuseRayBallBlend(struct Sprite *sprite)
{
s16 r0;
@@ -309,11 +308,11 @@ static void sub_80B53C0(struct Sprite *sprite)
static void AnimConfuseRayBallSpiral(struct Sprite *sprite)
{
InitSpritePosToAnimTarget(sprite, TRUE);
sprite->callback = sub_80B5470;
sprite->callback = AnimConfuseRayBallSpiral_Step;
sprite->callback(sprite);
}
static void sub_80B5470(struct Sprite *sprite)
static void AnimConfuseRayBallSpiral_Step(struct Sprite *sprite)
{
u16 temp1;
@@ -332,6 +331,7 @@ static void sub_80B5470(struct Sprite *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)
{
u8 spriteId;
@@ -346,10 +346,10 @@ void AnimTask_NightShadeClone(u8 taskId)
gTasks[taskId].data[1] = *gBattleAnimArgs;
gTasks[taskId].data[2] = 0;
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;
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]));
if (gTasks[taskId].data[2] != 9)
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;
@@ -398,8 +398,8 @@ static void AnimShadowBall(struct Sprite *sprite)
s16 oldPosX = sprite->x;
s16 oldPosY = sprite->y;
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[0] = 0;
sprite->data[1] = gBattleAnimArgs[0];
sprite->data[2] = gBattleAnimArgs[1];
@@ -408,10 +408,10 @@ static void AnimShadowBall(struct Sprite *sprite)
sprite->data[5] = sprite->y << 4;
sprite->data[6] = ((oldPosX - sprite->x) << 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])
{
@@ -429,8 +429,8 @@ static void AnimShadowBallStep(struct Sprite *sprite)
sprite->data[2] -= 1;
if (sprite->data[2] > 0)
break;
sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[4] = sprite->x << 4;
sprite->data[5] = sprite->y << 4;
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;
if (sprite->data[3] > 0)
break;
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[0] += 1;
break;
case 3:
@@ -458,10 +458,10 @@ static void AnimShadowBallStep(struct Sprite *sprite)
static void AnimLick(struct Sprite *sprite)
{
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 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)
{
struct Task *task;
task = &gTasks[taskId];
task->data[0] = CloneBattlerSpriteWithBlend(1);
task->data[0] = CloneBattlerSpriteWithBlend(ANIM_TARGET);
if (task->data[0] < 0)
{
DestroyAnimVisualTask(taskId);
@@ -539,10 +540,10 @@ void AnimTask_NightmareClone(u8 taskId)
gSprites[task->data[0]].data[4] = 0;
StoreSpriteCallbackInData6(&gSprites[task->data[0]], SpriteCallbackDummy);
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;
@@ -563,7 +564,7 @@ static void sub_80B59D4(u8 taskId)
break;
if (task->data[1] <= 80)
break;
obj_delete_but_dont_free_vram(&gSprites[task->data[0]]);
DestroySpriteWithActiveSheet(&gSprites[task->data[0]]);
task->data[4] = 1;
break;
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)
{
struct Task *task;
task = &gTasks[taskId];
task->data[15] = 0;
task->func = sub_80B5AD4;
task->func = AnimTask_SpiteTargetShadow_Step1;
task->func(taskId);
}
static void sub_80B5AD4(u8 taskId)
static void AnimTask_SpiteTargetShadow_Step1(u8 taskId)
{
s16 startLine;
struct Task *task = &gTasks[taskId];
@@ -670,7 +672,7 @@ static void sub_80B5AD4(u8 taskId)
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);
else
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
task->func = sub_80B5D38;
task->func = AnimTask_SpiteTargetShadow_Step2;
++task->data[15];
break;
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];
@@ -693,12 +695,12 @@ static void sub_80B5D38(u8 taskId)
if (task->data[1] == 128)
{
task->data[15] = 0;
task->func = sub_80B5DCC;
task->func = AnimTask_SpiteTargetShadow_Step3;
task->func(taskId);
}
}
static void sub_80B5DCC(u8 taskId)
static void AnimTask_SpiteTargetShadow_Step3(u8 taskId)
{
struct Task *task = &gTasks[taskId];
u8 rank = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget);
@@ -718,7 +720,7 @@ static void sub_80B5DCC(u8 taskId)
break;
case 2:
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);
SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
@@ -740,17 +742,17 @@ static void AnimDestinyBondWhiteShadow(struct Sprite *sprite)
if (gBattleAnimArgs[0] == 0)
{
battler1X = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
battler1Y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 28;
battler2X = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
battler2Y = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + 28;
battler1X = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
battler1Y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 28;
battler2X = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
battler2Y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 28;
}
else
{
battler1X = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
battler1Y = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + 28;
battler2X = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
battler2Y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 28;
battler1X = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
battler1Y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 28;
battler2X = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
battler2Y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 28;
}
yDiff = battler2Y - battler1Y;
sprite->data[0] = battler1X * 16;
@@ -764,11 +766,11 @@ static void AnimDestinyBondWhiteShadow(struct Sprite *sprite)
sprite->oam.priority = 2;
sprite->x = battler1X;
sprite->y = battler1Y;
sprite->callback = sub_80B5FE0;
sprite->callback = AnimDestinyBondWhiteShadow_Step;
sprite->invisible = TRUE;
}
static void sub_80B5FE0(struct Sprite *sprite)
static void AnimDestinyBondWhiteShadow_Step(struct Sprite *sprite)
{
if (sprite->data[4])
{
@@ -798,11 +800,11 @@ void AnimTask_DestinyBondWhiteShadow(u8 taskId)
task->data[8] = 0;
task->data[9] = 16;
task->data[10] = gBattleAnimArgs[0];
baseX = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
baseX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
baseY = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM);
if (!IsContest())
{
for (battler = 0; battler < 4; ++battler)
for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler)
{
if (battler != gBattleAnimAttacker
&& battler != (gBattleAnimAttacker ^ 2)
@@ -811,7 +813,7 @@ void AnimTask_DestinyBondWhiteShadow(u8 taskId)
spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55);
if (spriteId != MAX_SPRITES)
{
x = GetBattlerSpriteCoord(battler, 2);
x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2);
y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_BOTTOM);
gSprites[spriteId].data[0] = baseX << 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[5] = x;
gSprites[spriteId].data[6] = y;
gSprites[spriteId].callback = sub_80B5FE0;
gSprites[spriteId].callback = AnimDestinyBondWhiteShadow_Step;
task->data[task->data[12] + 13] = spriteId;
++task->data[12];
}
@@ -841,15 +843,15 @@ void AnimTask_DestinyBondWhiteShadow(u8 taskId)
gSprites[spriteId].data[4] = gBattleAnimArgs[1];
gSprites[spriteId].data[5] = x;
gSprites[spriteId].data[6] = y;
gSprites[spriteId].callback = sub_80B5FE0;
gSprites[spriteId].callback = AnimDestinyBondWhiteShadow_Step;
task->data[13] = spriteId;
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;
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) |
(WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR)));
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())
startX = 40;
else
@@ -951,10 +953,10 @@ void AnimTask_CurseStretchingBlackBg(u8 taskId)
gTasks[taskId].data[4] = bottomDistance;
gTasks[taskId].data[5] = startX;
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;
u16 left, right, top, bottom, selectedPalettes;
@@ -980,15 +982,15 @@ static void sub_80B6468(u8 taskId)
right = 240;
top = 0;
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));
gTasks[taskId].func = sub_80B65F0;
gTasks[taskId].func = AnimTask_CurseStretchingBlackBg_Step2;
}
gBattle_WIN0H = WIN_RANGE(left, right);
gBattle_WIN0V = WIN_RANGE(top, bottom);
}
static void sub_80B65F0(u8 taskId)
static void AnimTask_CurseStretchingBlackBg_Step2(u8 taskId)
{
if (!gPaletteFade.active)
{
@@ -1023,10 +1025,10 @@ static void AnimCurseNail(struct Sprite *sprite)
sprite->x += xDelta;
sprite->data[1] = xDelta2;
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;
@@ -1047,7 +1049,7 @@ static void sub_80B66A8(struct Sprite *sprite)
{
sprite->data[0] = 30;
sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData6(sprite, sub_80B6728);
StoreSpriteCallbackInData6(sprite, AnimCurseNail_Step2);
}
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)
{
@@ -1079,12 +1081,12 @@ static void sub_80B6728(struct Sprite *sprite)
if (sprite->data[2] == 16)
{
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_BLDALPHA, 0);
@@ -1125,12 +1127,12 @@ static void AnimGhostStatusSprite(struct Sprite *sprite)
if (coeffB == 16 && coeffA == 0)
{
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_BLDALPHA, 0);
@@ -1143,7 +1145,7 @@ void AnimTask_GrudgeFlames(u8 taskId)
task->data[0] = 0;
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[11] = (GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 2) + 8;
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_BLDALPHA, BLDALPHA_BLEND(0, 0x10));
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;
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];
task->data[15] = 0;
task->func = sub_80B6BE4;
sub_80B6BE4(taskId);
task->func = AnimTask_GhostGetOut_Step1;
task->func(taskId);
}
static void sub_80B6BE4(u8 taskId)
static void AnimTask_GhostGetOut_Step1(u8 taskId)
{
s16 y;
struct BattleAnimBgData animBgData;
@@ -1365,14 +1369,14 @@ static void sub_80B6BE4(u8 taskId)
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);
else
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
task->func = sub_80B6F30;
task->func = AnimTask_GhostGetOut_Step2;
task->data[15] = 0;
break;
}
++task->data[15];
}
static void sub_80B6F30(u8 taskId)
static void AnimTask_GhostGetOut_Step2(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -1386,12 +1390,12 @@ static void sub_80B6F30(u8 taskId)
if (task->data[1] == 128)
{
task->data[15] = 0;
task->func = sub_80B6FC4;
sub_80B6FC4(taskId);
task->func = AnimTask_GhostGetOut_Step3;
task->func(taskId);
}
}
static void sub_80B6FC4(u8 taskId)
static void AnimTask_GhostGetOut_Step3(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -1447,7 +1451,7 @@ static void sub_80B6FC4(u8 taskId)
++task->data[15];
}
static void sub_80B7158(struct Sprite *sprite)
static void AnimMonMoveCircular(struct Sprite *sprite)
{
sprite->invisible = TRUE;
sprite->data[5] = gBattlerSpriteIds[gBattleAnimAttacker];
@@ -1455,11 +1459,11 @@ static void sub_80B7158(struct Sprite *sprite)
sprite->data[1] = 10;
sprite->data[2] = gBattleAnimArgs[0];
sprite->data[3] = gBattleAnimArgs[1];
sprite->callback = sub_80B71B0;
sprite->callback = AnimMonMoveCircular_Step;
gSprites[sprite->data[5]].y += 8;
}
static void sub_80B71B0(struct Sprite *sprite)
static void AnimMonMoveCircular_Step(struct Sprite *sprite)
{
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 AnimDirtScatter(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 AnimBonemerangProjectileStep(struct Sprite *sprite);
static void AnimBonemerangProjectileEnd(struct Sprite *sprite);
static void AnimBonemerangProjectile_Step(struct Sprite *sprite);
static void AnimBonemerangProjectile_End(struct Sprite *sprite);
static void AnimMudSportDirtRising(struct Sprite *sprite);
static void AnimMudSportDirtFalling(struct Sprite *sprite);
static void sub_80B8ED4(u8 taskId);
static void sub_80B908C(u8 taskId);
static void sub_80B92B8(u8 useBg1, s16 y, s16 endY);
static void sub_80B912C(u8 taskId);
static void sub_80B91B0(u8 taskId);
static void AnimFissureDirtPlumeParticleStep(struct Sprite *sprite);
static void sub_80B9584(u8 taskId);
static void sub_80B967C(u8 taskId);
static void sub_80B9760(struct Task *task);
static void sub_80B98A8(u8 taskId);
static void AnimTask_DigBounceMovement(u8 taskId);
static void AnimTask_DigDisappear(u8 taskId);
static void SetDigScanlineEffect(u8 useBg1, s16 y, s16 endY);
static void AnimTask_DigSetVisibleUnderground(u8 taskId);
static void AnimTask_DigRiseUpFromHole(u8 taskId);
static void AnimDirtPlumeParticle_Step(struct Sprite *sprite);
static void AnimTask_ShakeTerrain(u8 taskId);
static void AnimTask_ShakeBattlers(u8 taskId);
static void SetBattlersXOffsetForShake(struct Task *task);
static void WaitForFissureCompletion(u8 taskId);
static const union AffineAnimCmd sAffineAnim_Bonemerang[] =
{
@@ -122,7 +122,7 @@ const struct SpriteTemplate gDirtPlumeSpriteTemplate =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimFissureDirtPlumeParticle,
.callback = AnimDirtPlumeParticle,
};
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.
static void AnimBonemerangProjectile(struct Sprite *sprite)
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[0] = 20;
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[5] = -40;
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))
{
@@ -159,15 +159,15 @@ static void AnimBonemerangProjectileStep(struct Sprite *sprite)
sprite->y2 = 0;
sprite->x2 = 0;
sprite->data[0] = 20;
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[5] = 40;
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))
DestroyAnimSprite(sprite);
@@ -186,8 +186,8 @@ static void AnimBoneHitProjectile(struct Sprite *sprite)
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[4];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
@@ -204,8 +204,8 @@ static void AnimDirtScatter(struct Sprite *sprite)
s16 xOffset, yOffset;
InitSpritePosToAnimAttacker(sprite, 1);
targetXPos = GetBattlerSpriteCoord2(gBattleAnimTarget, 2);
targetYPos = GetBattlerSpriteCoord2(gBattleAnimTarget, 3);
targetXPos = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2);
targetYPos = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
xOffset = Random() & 0x1F;
yOffset = Random() & 0x1F;
if (xOffset > 16)
@@ -229,8 +229,8 @@ static void AnimMudSportDirt(struct Sprite *sprite)
++sprite->oam.tileNum;
if (gBattleAnimArgs[0] == 0)
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + gBattleAnimArgs[1];
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[2];
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1];
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[1] > 0 ? 1 : -1;
sprite->callback = AnimMudSportDirtRising;
}
@@ -283,14 +283,14 @@ void AnimTask_DigDownMovement(u8 taskId)
{
struct Task *task = &gTasks[taskId];
if (gBattleAnimArgs[0] == 0)
task->func = sub_80B8ED4;
if (gBattleAnimArgs[0] == FALSE)
task->func = AnimTask_DigBounceMovement;
else
task->func = sub_80B908C;
task->func = AnimTask_DigDisappear;
task->func(taskId);
}
static void sub_80B8ED4(u8 taskId)
static void AnimTask_DigBounceMovement(u8 taskId)
{
u8 var0;
struct Task *task = &gTasks[taskId];
@@ -319,7 +319,7 @@ static void sub_80B8ED4(u8 taskId)
++task->data[0];
break;
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];
break;
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);
@@ -376,15 +376,15 @@ void AnimTask_DigUpMovement(u8 taskId)
{
struct Task *task = &gTasks[taskId];
if (gBattleAnimArgs[0] == 0)
task->func = sub_80B912C;
if (gBattleAnimArgs[0] == FALSE)
task->func = AnimTask_DigSetVisibleUnderground;
else
task->func = sub_80B91B0;
task->func = AnimTask_DigRiseUpFromHole;
task->func(taskId);
}
static void sub_80B912C(u8 taskId)
static void AnimTask_DigSetVisibleUnderground(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -394,7 +394,7 @@ static void sub_80B912C(u8 taskId)
task->data[10] = GetAnimBattlerSpriteId(ANIM_ATTACKER);
gSprites[task->data[10]].invisible = FALSE;
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];
break;
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;
struct Task *task = &gTasks[taskId];
@@ -422,7 +422,7 @@ static void sub_80B91B0(u8 taskId)
++task->data[0];
break;
case 1:
sub_80B92B8(task->data[11], 0, task->data[15]);
SetDigScanlineEffect(task->data[11], 0, task->data[15]);
++task->data[0];
break;
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;
struct ScanlineEffectParams scanlineParams;
@@ -485,7 +485,7 @@ static void sub_80B92B8(u8 useBG1, s16 y, s16 endY)
// arg 3: target y offset
// arg 4: wave amplitude
// arg 5: duration
static void AnimFissureDirtPlumeParticle(struct Sprite *sprite)
static void AnimDirtPlumeParticle(struct Sprite *sprite)
{
s8 battler;
s16 xOffset;
@@ -500,17 +500,17 @@ static void AnimFissureDirtPlumeParticle(struct Sprite *sprite)
xOffset *= -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->data[0] = gBattleAnimArgs[5];
sprite->data[2] = sprite->x + gBattleAnimArgs[2];
sprite->data[4] = sprite->y + gBattleAnimArgs[3];
sprite->data[5] = gBattleAnimArgs[4];
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))
DestroyAnimSprite(sprite);
@@ -530,7 +530,7 @@ static void AnimDigDirtMound(struct Sprite *sprite)
battler = gBattleAnimAttacker;
else
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->oam.tileNum += gBattleAnimArgs[1] * 8;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
@@ -538,151 +538,178 @@ static void AnimDigDirtMound(struct Sprite *sprite)
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)
{
u16 i;
struct Task *task = &gTasks[taskId];
if (gBattleAnimArgs[1])
task->data[14] = task->data[15] = gBattleAnimArgs[1] + 3;
if (gBattleAnimArgs[1] != 0)
task->tHorizOffset = task->tInitHorizOffset = gBattleAnimArgs[1] + 3;
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])
{
case 5:
task->data[13] = gBattle_BG3_X;
task->func = sub_80B9584;
case MAX_BATTLERS_COUNT + 1: // Shake terrain
task->tInitialX = gBattle_BG3_X;
task->func = AnimTask_ShakeTerrain;
break;
case 4:
task->data[13] = 0;
for (i = 0; i < MAX_BATTLERS_COUNT; ++i)
case MAX_BATTLERS_COUNT: // Shake all battlers
task->tNumBattlers = 0;
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
if (IsBattlerSpriteVisible(i))
{
task->data[task->data[13] + 9] = gBattlerSpriteIds[i];
++task->data[13];
task->tbattlerSpriteIds(task->tNumBattlers) = gBattlerSpriteIds[i];
task->tNumBattlers++;
}
}
task->func = sub_80B967C;
task->func = AnimTask_ShakeBattlers;
break;
default:
task->data[9] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
if (task->data[9] == 0xFF)
default: // Shake specific battler
task->tbattlerSpriteIds(0) = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
if (task->tbattlerSpriteIds(0) == SPRITE_NONE)
{
DestroyAnimVisualTask(taskId);
}
else
{
task->data[13] = 1;
task->func = sub_80B967C;
task->tNumBattlers = 1;
task->func = AnimTask_ShakeBattlers;
}
break;
}
}
static void sub_80B9584(u8 taskId)
static void AnimTask_ShakeTerrain(u8 taskId)
{
struct Task *task = &gTasks[taskId];
switch (task->data[0])
switch (task->tState)
{
case 0:
if (++task->data[1] > 1)
if (++task->tDelay > 1)
{
task->data[1] = 0;
if ((task->data[2] & 1) == 0)
gBattle_BG3_X = task->data[13] + task->data[15];
task->tDelay = 0;
if ((task->tTimer & 1) == 0)
gBattle_BG3_X = task->tInitialX + task->tInitHorizOffset;
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->data[14];
++task->data[0];
task->tTimer = 0;
task->tHorizOffset--;
task->tState++;
}
}
break;
case 1:
if (++task->data[1] > 1)
if (++task->tDelay > 1)
{
task->data[1] = 0;
if ((task->data[2] & 1) == 0)
gBattle_BG3_X = task->data[13] + task->data[14];
task->tDelay = 0;
if ((task->tTimer & 1) == 0)
gBattle_BG3_X = task->tInitialX + task->tHorizOffset;
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;
if (--task->data[14] == 0)
++task->data[0];
task->tTimer = 0;
if (--task->tHorizOffset == 0)
task->tState++;
}
}
break;
case 2:
gBattle_BG3_X = task->data[13];
gBattle_BG3_X = task->tInitialX;
DestroyAnimVisualTask(taskId);
break;
}
}
static void sub_80B967C(u8 taskId)
static void AnimTask_ShakeBattlers(u8 taskId)
{
u16 i;
struct Task *task = &gTasks[taskId];
switch (task->data[0])
switch (task->tState)
{
case 0:
if (++task->data[1] > 1)
if (++task->tDelay > 1)
{
task->data[1] = 0;
sub_80B9760(task);
if (++task->data[2] == task->data[3])
task->tDelay = 0;
SetBattlersXOffsetForShake(task);
if (++task->tTimer == task->tMaxTime)
{
task->data[2] = 0;
--task->data[14];
++task->data[0];
task->tTimer = 0;
task->tHorizOffset--;
task->tState++;
}
}
break;
case 1:
if (++task->data[1] > 1)
if (++task->tDelay > 1)
{
task->data[1] = 0;
sub_80B9760(task);
if (++task->data[2] == 4)
task->tDelay = 0;
SetBattlersXOffsetForShake(task);
if (++task->tTimer == 4)
{
task->data[2] = 0;
if (--task->data[14] == 0)
++task->data[0];
task->tTimer = 0;
if (--task->tHorizOffset == 0)
task->tState++;
}
}
break;
case 2:
for (i = 0; i < task->data[13]; ++i)
gSprites[task->data[9 + i]].x2 = 0;
for (i = 0; i < task->tNumBattlers; i++)
gSprites[task->tbattlerSpriteIds(i)].x2 = 0;
DestroyAnimVisualTask(taskId);
break;
}
}
static void sub_80B9760(struct Task *task)
static void SetBattlersXOffsetForShake(struct Task *task)
{
u16 i, xOffset;
if ((task->data[2] & 1) == 0)
xOffset = (task->data[14] / 2) + (task->data[14] & 1);
if ((task->tTimer & 1) == 0)
xOffset = (task->tHorizOffset / 2) + (task->tHorizOffset & 1);
else
xOffset = -(task->data[14] / 2);
for (i = 0; i < task->data[13]; ++i)
gSprites[task->data[9 + i]].x2 = xOffset;
xOffset = -(task->tHorizOffset / 2);
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)
{
gBattleAnimArgs[15] = gAnimMovePower > 99;
@@ -696,19 +723,21 @@ void AnimTask_PositionFissureBgOnBattler(u8 taskId)
if (gBattleAnimArgs[0] > 1)
battler ^= BIT_FLANK;
newTask = &gTasks[CreateTask(sub_80B98A8, gBattleAnimArgs[1])];
newTask->data[1] = (32 - GetBattlerSpriteCoord(battler, 2)) & 0x1FF;
newTask->data[2] = (64 - GetBattlerSpriteCoord(battler, 3)) & 0xFF;
newTask = &gTasks[CreateTask(WaitForFissureCompletion, gBattleAnimArgs[1])];
newTask->data[1] = (32 - GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2)) & 0x1FF;
newTask->data[2] = (64 - GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET)) & 0xFF;
gBattle_BG3_X = newTask->data[1];
gBattle_BG3_Y = newTask->data[2];
newTask->data[3] = gBattleAnimArgs[2];
DestroyAnimVisualTask(taskId);
}
static void sub_80B98A8(u8 taskId)
static void WaitForFissureCompletion(u8 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])
{
gBattle_BG3_X = 0;
+70 -69
View File
@@ -9,21 +9,21 @@
struct HailStruct
{
s32 unk0:10;
s32 unk1:10;
s32 unk2:8;
s32 x:10;
s32 y:10;
s32 bPosition:8;
s32 unk3:4;
};
static void sub_80AF108(struct Sprite *sprite);
static void sub_80AF28C(struct Sprite *sprite);
static void AnimUnusedIceCrystalThrow(struct Sprite *sprite);
static void AnimUnusedIceCrystalThrow_Step(struct Sprite *sprite);
static void AnimIcePunchSwirlingParticle(struct Sprite *sprite);
static void AnimIceBeamParticle(struct Sprite *sprite);
static void AnimIceEffectParticle(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_Step2(struct Sprite *sprite);
static void AnimSwirlingSnowball_Step3(struct Sprite *sprite);
static void AnimSwirlingSnowball_End(struct Sprite *sprite);
static void AnimMoveParticleBeyondTarget(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 InitIceBallParticle(struct Sprite *sprite);
static void AnimIceBallParticle(struct Sprite *sprite);
static void AnimTask_Haze2(u8 taskId);
static void AnimTask_OverlayFogTiles(u8 taskId);
static void AnimTask_HazeScrollingFog_Step(u8 taskId);
static void AnimTask_MistBallFog_Step(u8 taskId);
static void AnimTask_Hail2(u8 taskId);
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(1, 5, .hFlip = TRUE),
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 gUnknown_83E62D0 =
static const struct SpriteTemplate sUnusedIceCrystalThrowSpriteTemplate =
{
.tileTag = ANIM_TAG_ICE_CRYSTALS,
.paletteTag = ANIM_TAG_ICE_CRYSTALS,
@@ -65,10 +64,10 @@ static const struct SpriteTemplate gUnknown_83E62D0 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80AF108,
.callback = AnimUnusedIceCrystalThrow,
};
static const union AnimCmd gUnknown_83E62E8[] =
static const union AnimCmd sAnim_IceCrystalLargeChunk[] =
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
@@ -105,10 +104,10 @@ static const union AnimCmd sAnim_SmallBubblePair[] =
ANIMCMD_JUMP(0),
};
// unused
static const union AnimCmd *const gUnknown_83E631C[] =
// Unused, contains just the top left corner of the large ice crystal
static const union AnimCmd *const sAnims_IceCrystalLargeChunk[] =
{
gUnknown_83E62E8,
sAnim_IceCrystalLargeChunk,
};
static const union AnimCmd *const sAnims_IceCrystalLarge[] =
@@ -245,7 +244,7 @@ const struct SpriteTemplate gSwirlingSnowballSpriteTemplate =
.anims = sAnims_Snowball,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimSwirlingSnowball_Step1,
.callback = AnimSwirlingSnowball,
};
const struct SpriteTemplate gBlizzardIceCrystalSpriteTemplate =
@@ -332,7 +331,7 @@ const struct SpriteTemplate gSmogCloudSpriteTemplate =
.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,
};
@@ -348,7 +347,7 @@ const struct SpriteTemplate gMistBallSpriteTemplate =
.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,
};
@@ -366,16 +365,16 @@ const struct SpriteTemplate gPoisonGasCloudSpriteTemplate =
static const struct HailStruct sHailCoordData[] =
{
{100, 120, 0, 2},
{85, 120, 0, 0},
{242, 120, 1, 1},
{66, 120, 2, 1},
{182, 120, 3, 0},
{60, 120, 0, 2},
{214, 120, 1, 0},
{113, 120, 0, 1},
{210, 120, 3, 1},
{38, 120, 2, 0},
{.x = 100, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 2},
{.x = 85, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 0},
{.x = 242, .y = 120, .bPosition = B_POSITION_OPPONENT_LEFT, .unk3 = 1},
{.x = 66, .y = 120, .bPosition = B_POSITION_PLAYER_RIGHT, .unk3 = 1},
{.x = 182, .y = 120, .bPosition = B_POSITION_OPPONENT_RIGHT, .unk3 = 0},
{.x = 60, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 2},
{.x = 214, .y = 120, .bPosition = B_POSITION_OPPONENT_LEFT, .unk3 = 0},
{.x = 113, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 1},
{.x = 210, .y = 120, .bPosition = B_POSITION_OPPONENT_RIGHT, .unk3 = 1},
{.x = 38, .y = 120, .bPosition = B_POSITION_PLAYER_RIGHT, .unk3 = 0},
};
static const union AffineAnimCmd sAffineAnim_HailParticle_0[] =
@@ -518,8 +517,7 @@ const struct SpriteTemplate gIceBallImpactShardSpriteTemplate =
.callback = InitIceBallParticle,
};
// not used
static void sub_80AF108(struct Sprite *sprite)
static void AnimUnusedIceCrystalThrow(struct Sprite *sprite)
{
s16 targetX, targetY, attackerX, attackerY;
@@ -533,13 +531,15 @@ static void sub_80AF108(struct Sprite *sprite)
sprite->data[2] = gBattleAnimArgs[2] + targetX;
sprite->data[3] = gBattleAnimArgs[1] + attackerY;
sprite->data[4] = gBattleAnimArgs[3] + targetY;
SetupLinearTranslationWithFixedDuration(sprite);
ConvertPosDataToTranslateLinearData(sprite);
// 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[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->y = attackerY;
@@ -548,14 +548,13 @@ static void sub_80AF108(struct Sprite *sprite)
sprite->data[2] = targetX;
sprite->data[3] = attackerY;
sprite->data[4] = targetY;
SetupLinearTranslationWithFixedDuration(sprite);
ConvertPosDataToTranslateLinearData(sprite);
sprite->data[3] = gBattleAnimArgs[5];
sprite->data[4] = gBattleAnimArgs[6];
sprite->callback = sub_80AF28C;
sprite->callback = AnimUnusedIceCrystalThrow_Step;
}
// not used
static void sub_80AF28C(struct Sprite *sprite)
static void AnimUnusedIceCrystalThrow_Step(struct Sprite *sprite)
{
if (sprite->data[0] != 0)
{
@@ -584,7 +583,7 @@ static void AnimIcePunchSwirlingParticle(struct Sprite *sprite)
sprite->data[3] = 30;
sprite->data[4] = -512;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
sprite->callback = TranslateSpriteInGrowingCircleOverDuration;
sprite->callback = TranslateSpriteInGrowingCircle;
sprite->callback(sprite);
}
@@ -645,7 +644,7 @@ static void AnimFlickerIceEffectParticle(struct Sprite *sprite)
// arg 3: target y offset
// arg 4: particle speed
// arg 5: multiple targets? (boolean)
static void AnimSwirlingSnowball_Step1(struct Sprite *sprite)
static void AnimSwirlingSnowball(struct Sprite *sprite)
{
s32 i;
s16 tempDataHolder[8];
@@ -676,8 +675,9 @@ static void AnimSwirlingSnowball_Step1(struct Sprite *sprite)
{
sprite->data[0] = 1;
AnimFastTranslateLinear(sprite);
if ((u32)(sprite->x + sprite->x2 + 16) > 272
|| sprite->y + sprite->y2 > 160
if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16
|| sprite->x + sprite->x2 < -16
|| sprite->y + sprite->y2 > DISPLAY_HEIGHT
|| sprite->y + sprite->y2 < -16)
break;
}
@@ -686,11 +686,11 @@ static void AnimSwirlingSnowball_Step1(struct Sprite *sprite)
sprite->x2 = sprite->y2 = 0;
for (i = 0; i < 8; ++i)
sprite->data[i] = tempDataHolder[i];
sprite->callback = InitAndStartAnimFastLinearTranslationWithSpeed;
StoreSpriteCallbackInData6(sprite, AnimSwirlingSnowball_Step2);
sprite->callback = InitAnimFastLinearTranslationWithSpeedAndPos;
StoreSpriteCallbackInData6(sprite, AnimSwirlingSnowball_Step1);
}
static void AnimSwirlingSnowball_Step2(struct Sprite *sprite)
static void AnimSwirlingSnowball_Step1(struct Sprite *sprite)
{
s16 tempVar;
@@ -703,11 +703,11 @@ static void AnimSwirlingSnowball_Step2(struct Sprite *sprite)
sprite->data[3] = Sin(sprite->data[0], tempVar);
sprite->data[4] = Cos(sprite->data[0], 0xF);
sprite->data[5] = 0;
sprite->callback = AnimSwirlingSnowball_Step3;
sprite->callback = AnimSwirlingSnowball_Step2;
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;
@@ -780,8 +780,9 @@ static void AnimMoveParticleBeyondTarget(struct Sprite *sprite)
{
sprite->data[0] = 1;
AnimFastTranslateLinear(sprite);
if ((u32)(sprite->x + sprite->x2 + 16) > 272
|| sprite->y + sprite->y2 > 160
if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16
|| sprite->x + sprite->x2 < -16
|| sprite->y + sprite->y2 > DISPLAY_HEIGHT
|| sprite->y + sprite->y2 < -16)
break;
}
@@ -806,8 +807,9 @@ static void AnimWiggleParticleTowardsTarget(struct Sprite *sprite)
sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF;
if (sprite->data[0] == 1)
{
if ((u32)(sprite->x + sprite->x2 + 16) > 272
|| sprite->y + sprite->y2 > 160
if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16
|| sprite->x + sprite->x2 < -16
|| sprite->y + sprite->y2 > DISPLAY_HEIGHT
|| sprite->y + sprite->y2 < -16)
DestroyAnimSprite(sprite);
}
@@ -927,7 +929,7 @@ static void AnimSwirlingFogAnim(struct Sprite *sprite)
}
// Fades mons to black and places foggy overlay in Haze.
void AnimTask_Haze1(u8 taskId)
void AnimTask_HazeScrollingFog(u8 taskId)
{
struct BattleAnimBgData animBg;
@@ -947,10 +949,10 @@ void AnimTask_Haze1(u8 taskId)
LoadPalette(&gDefaultWeatherSpritePalette, animBg.paletteId * 16, 32);
if (IsContest())
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;
@@ -962,7 +964,7 @@ static void AnimTask_Haze2(u8 taskId)
{
gTasks[taskId].data[10] = 0;
++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]));
if (gTasks[taskId].data[11] == 9)
{
@@ -1024,8 +1026,7 @@ static void AnimThrowMistBall(struct Sprite *sprite)
sprite->callback = TranslateAnimSpriteToTargetMonLocation;
}
// Displays misty background in Mist Ball.
void AnimTask_LoadMistTiles(u8 taskId)
void AnimTask_MistBallFog(u8 taskId)
{
struct BattleAnimBgData animBg;
@@ -1046,10 +1047,10 @@ void AnimTask_LoadMistTiles(u8 taskId)
if (IsContest())
RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0);
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;
@@ -1058,7 +1059,7 @@ static void AnimTask_OverlayFogTiles(u8 taskId)
{
case 0:
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]));
if (gTasks[taskId].data[11] == 5)
{
@@ -1230,7 +1231,7 @@ static void MovePoisonGasCloud(struct Sprite *sprite)
sprite->data[2] = -0x10;
++sprite->data[7];
sprite->x2 = sprite->y2 = 0;
BattleAnim_InitLinearTranslationWithDuration(sprite);
InitAnimLinearTranslationWithSpeed(sprite);
}
break;
case 2:
@@ -1249,7 +1250,7 @@ static void MovePoisonGasCloud(struct Sprite *sprite)
}
// Creates Hail.
void AnimTask_Hail1(u8 taskId)
void AnimTask_Hail(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -1310,7 +1311,7 @@ static bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId,
if (unk != 2)
{
id = GetBattlerAtPosition(sHailCoordData[hailStructId].unk2);
id = GetBattlerAtPosition(sHailCoordData[hailStructId].bPosition);
if (IsBattlerSpriteVisible(id))
{
possibleBool = TRUE;
@@ -1330,14 +1331,14 @@ static bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId,
}
else
{
battlerX = (sHailCoordData[hailStructId].unk0);
battlerY = (sHailCoordData[hailStructId].unk1);
battlerX = sHailCoordData[hailStructId].x;
battlerY = sHailCoordData[hailStructId].y;
}
}
else
{
battlerX = (sHailCoordData[hailStructId].unk0);
battlerY = (sHailCoordData[hailStructId].unk1);
battlerX = sHailCoordData[hailStructId].x;
battlerY = sHailCoordData[hailStructId].y;
}
spriteX = battlerX - ((battlerY + 8) / 2);
id = CreateSprite(&sHailParticleSpriteTemplate, spriteX, -8, 18);
+117 -114
View File
@@ -7,27 +7,27 @@
#undef abs
#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_ShakeMonInPlaceStep(u8 taskId);
static void AnimTask_ShakeAndSinkMonStep(u8 taskId);
static void AnimTask_TranslateMonEllipticalStep(u8 taskId);
static void AnimTask_ShakeMonInPlace_Step(u8 taskId);
static void AnimTask_ShakeAndSinkMon_Step(u8 taskId);
static void AnimTask_TranslateMonElliptical_Step(u8 taskId);
static void DoHorizontalLunge(struct Sprite *sprite);
static void ReverseHorizontalLungeDirection(struct Sprite *sprite);
static void DoVerticalDip(struct Sprite *sprite);
static void ReverseVerticalDipDirection(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 sub_8099394(struct Sprite *sprite);
static void sub_809946C(struct Sprite *sprite);
static void AnimTask_WindUpLungePart1(u8 taskId);
static void AnimTask_WindUpLungePart2(u8 taskId);
static void sub_80996B8(u8 taskId);
static void AnimTask_SwayMonStep(u8 taskId);
static void AnimTask_ScaleMonAndRestoreStep(u8 taskId);
static void sub_8099B54(u8 taskId);
static void sub_8099CB8(u8 taskId);
static void SlideMonToOffsetAndBack(struct Sprite *sprite);
static void SlideMonToOffsetAndBack_End(struct Sprite *sprite);
static void AnimTask_WindUpLunge_Step1(u8 taskId);
static void AnimTask_WindUpLunge_Step2(u8 taskId);
static void AnimTask_SlideOffScreen_Step(u8 taskId);
static void AnimTask_SwayMon_Step(u8 taskId);
static void AnimTask_ScaleMonAndRestore_Step(u8 taskId);
static void AnimTask_RotateMonSpriteToSide_Step(u8 taskId);
static void AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step(u8 taskId);
const struct SpriteTemplate gHorizontalLungeSpriteTemplate =
{
@@ -81,7 +81,7 @@ const struct SpriteTemplate gSlideMonToOffsetAndBackSpriteTemplate =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_8099394,
.callback = SlideMonToOffsetAndBack,
};
// 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]);
if (spriteId == 0xFF)
DestroyAnimVisualTask(taskId);
else
if (spriteId == SPRITE_NONE)
{
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_ShakeMonStep;
gTasks[taskId].func(taskId);
DestroyAnimVisualTask(taskId);
return;
}
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)
{
@@ -152,7 +152,7 @@ void AnimTask_ShakeMon2(u8 taskId)
if (gBattleAnimArgs[0] < MAX_BATTLERS_COUNT)
{
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
if (spriteId == 0xFF)
if (spriteId == SPRITE_NONE)
abort = TRUE;
}
else if (gBattleAnimArgs[0] != 8)
@@ -178,21 +178,23 @@ void AnimTask_ShakeMon2(u8 taskId)
}
else
spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
if (abort)
DestroyAnimVisualTask(taskId);
else
{
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);
DestroyAnimVisualTask(taskId);
return;
}
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)
@@ -231,25 +233,25 @@ void AnimTask_ShakeMonInPlace(u8 taskId)
{
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
if (spriteId == 0xFF)
DestroyAnimVisualTask(taskId);
else
if (spriteId == SPRITE_NONE)
{
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_ShakeMonInPlaceStep;
gTasks[taskId].func(taskId);
DestroyAnimVisualTask(taskId);
return;
}
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)
{
@@ -299,22 +301,22 @@ void AnimTask_ShakeAndSinkMon(u8 taskId)
gTasks[taskId].data[2] = gBattleAnimArgs[2];
gTasks[taskId].data[3] = gBattleAnimArgs[3];
gTasks[taskId].data[4] = gBattleAnimArgs[4];
gTasks[taskId].func = AnimTask_ShakeAndSinkMonStep;
gTasks[taskId].func = AnimTask_ShakeAndSinkMon_Step;
gTasks[taskId].func(taskId);
}
static void AnimTask_ShakeAndSinkMonStep(u8 taskId)
static void AnimTask_ShakeAndSinkMon_Step(u8 taskId)
{
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]++)
{
gTasks[taskId].data[8] = 0;
if (gSprites[spriteId].x2 == data1)
data1 = -data1;
gSprites[spriteId].x2 += data1;
if (gSprites[spriteId].x2 == x)
x = -x;
gSprites[spriteId].x2 += x;
}
gTasks[taskId].data[1] = data1;
gTasks[taskId].data[1] = x;
gTasks[taskId].data[9] += gTasks[taskId].data[3];
gSprites[spriteId].y2 = gTasks[taskId].data[9] >> 8;
if (--gTasks[taskId].data[4] == 0)
@@ -342,11 +344,11 @@ void AnimTask_TranslateMonElliptical(u8 taskId)
gTasks[taskId].data[2] = gBattleAnimArgs[2];
gTasks[taskId].data[3] = gBattleAnimArgs[3];
gTasks[taskId].data[4] = wavePeriod;
gTasks[taskId].func = AnimTask_TranslateMonEllipticalStep;
gTasks[taskId].func = AnimTask_TranslateMonElliptical_Step;
gTasks[taskId].func(taskId);
}
static void AnimTask_TranslateMonEllipticalStep(u8 taskId)
static void AnimTask_TranslateMonElliptical_Step(u8 taskId)
{
u8 spriteId = gTasks[taskId].data[0];
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[4] = gBattleAnimArgs[0];
StoreSpriteCallbackInData6(sprite, ReverseHorizontalLungeDirection);
sprite->callback = TranslateMonSpriteLinear;
sprite->callback = TranslateSpriteLinearById;
}
static void ReverseHorizontalLungeDirection(struct Sprite *sprite)
{
sprite->data[0] = sprite->data[4];
sprite->data[1] = -sprite->data[1];
sprite->callback = TranslateMonSpriteLinear;
sprite->callback = TranslateSpriteLinearById;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
@@ -422,14 +424,14 @@ static void DoVerticalDip(struct Sprite *sprite)
sprite->data[3] = spriteId;
sprite->data[4] = gBattleAnimArgs[0];
StoreSpriteCallbackInData6(sprite, ReverseVerticalDipDirection);
sprite->callback = TranslateMonSpriteLinear;
sprite->callback = TranslateSpriteLinearById;
}
static void ReverseVerticalDipDirection(struct Sprite *sprite)
{
sprite->data[0] = sprite->data[4];
sprite->data[2] = -sprite->data[2];
sprite->callback = TranslateMonSpriteLinear;
sprite->callback = TranslateSpriteLinearById;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
@@ -462,19 +464,19 @@ static void SlideMonToOriginalPos(struct Sprite *sprite)
sprite->data[1] = 0;
sprite->data[7] = gBattleAnimArgs[1];
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];
struct Sprite *otherSprite = &gSprites[sprite->data[7] >> 8];
struct Sprite *monSprite = &gSprites[sprite->data[7] >> 8];
if (sprite->data[0] == 0)
{
if (data7 == 1 || data7 == 0)
otherSprite->x2 = 0;
monSprite->x2 = 0;
if (data7 == 2 || data7 == 0)
otherSprite->y2 = 0;
monSprite->y2 = 0;
DestroyAnimSprite(sprite);
}
else
@@ -482,8 +484,8 @@ static void SlideMonToOriginalPosStep(struct Sprite *sprite)
sprite->data[0]--;
sprite->data[3] += sprite->data[1];
sprite->data[4] += sprite->data[2];
otherSprite->x2 = (sprite->data[3] >> 8) + sprite->data[5];
otherSprite->y2 = (sprite->data[4] >> 8) + sprite->data[6];
monSprite->x2 = (sprite->data[3] >> 8) + sprite->data[5];
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)
{
u8 battlerId;
u8 spriteId;
u8 monSpriteId;
if (gBattleAnimArgs[0] == 0)
battlerId = gBattleAnimAttacker;
else
battlerId = gBattleAnimTarget;
spriteId = gBattlerSpriteIds[battlerId];
monSpriteId = gBattlerSpriteIds[battlerId];
if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
{
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
@@ -511,25 +513,25 @@ static void SlideMonToOffset(struct Sprite *sprite)
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
}
sprite->data[0] = gBattleAnimArgs[4];
sprite->data[1] = gSprites[spriteId].x;
sprite->data[2] = gSprites[spriteId].x + gBattleAnimArgs[1];
sprite->data[3] = gSprites[spriteId].y;
sprite->data[4] = gSprites[spriteId].y + gBattleAnimArgs[2];
sprite->data[1] = gSprites[monSpriteId].x;
sprite->data[2] = gSprites[monSpriteId].x + gBattleAnimArgs[1];
sprite->data[3] = gSprites[monSpriteId].y;
sprite->data[4] = gSprites[monSpriteId].y + gBattleAnimArgs[2];
InitSpriteDataForLinearTranslation(sprite);
sprite->data[3] = 0;
sprite->data[4] = 0;
sprite->data[5] = spriteId;
sprite->data[5] = monSpriteId;
sprite->invisible = TRUE;
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 spriteId;
sprite->invisible = TRUE;
if (gBattleAnimArgs[0] == 0)
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
battlerId = gBattleAnimAttacker;
else
battlerId = gBattleAnimTarget;
@@ -553,11 +555,11 @@ static void sub_8099394(struct Sprite *sprite)
if (gBattleAnimArgs[5] == 0)
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
else
StoreSpriteCallbackInData6(sprite, sub_809946C);
sprite->callback = TranslateMonSpriteLinearFixedPoint;
StoreSpriteCallbackInData6(sprite, SlideMonToOffsetAndBack_End);
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]].y2 = 0;
@@ -590,10 +592,10 @@ void AnimTask_WindUpLunge(u8 taskId)
gTasks[taskId].data[5] = gBattleAnimArgs[5] * 256 / gBattleAnimArgs[6];
gTasks[taskId].data[6] = gBattleAnimArgs[6];
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];
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]);
gTasks[taskId].data[10] += gTasks[taskId].data[7];
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;
@@ -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)
{
u8 spriteId;
switch (gBattleAnimArgs[0])
{
case 0:
case 1:
case ANIM_ATTACKER:
case ANIM_TARGET:
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
break;
case 2:
case ANIM_ATK_PARTNER:
if (!IsBattlerSpriteVisible(gBattleAnimAttacker ^ BIT_FLANK))
{
DestroyAnimVisualTask(taskId);
@@ -638,7 +641,7 @@ void AnimTask_SlideOffScreen(u8 taskId)
}
spriteId = gBattlerSpriteIds[gBattleAnimAttacker ^ BIT_FLANK];
break;
case 3:
case ANIM_DEF_PARTNER:
if (!IsBattlerSpriteVisible(gBattleAnimTarget ^ BIT_FLANK))
{
DestroyAnimVisualTask(taskId);
@@ -655,14 +658,14 @@ void AnimTask_SlideOffScreen(u8 taskId)
gTasks[taskId].data[1] = gBattleAnimArgs[1];
else
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];
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);
}
@@ -690,10 +693,10 @@ void AnimTask_SwayMon(u8 taskId)
else
gTasks[taskId].data[5] = gBattleAnimTarget;
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;
u32 waveIndex;
@@ -745,10 +748,10 @@ void AnimTask_ScaleMonAndRestore(u8 taskId)
gTasks[taskId].data[4] = spriteId;
gTasks[taskId].data[10] = 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;
gTasks[taskId].data[10] += gTasks[taskId].data[0];
@@ -789,7 +792,7 @@ void AnimTask_RotateMonSpriteToSide(u8 taskId)
gTasks[taskId].data[7] = 1;
else
{
if (gBattleAnimArgs[2] == 0)
if (gBattleAnimArgs[2] == ANIM_ATTACKER)
gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : 0;
else
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];
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)
{
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]);
PrepareBattlerSpriteForRotScale(spriteId, 0);
gTasks[taskId].data[1] = 0;
gTasks[taskId].data[2] = gBattleAnimArgs[0];
if (gBattleAnimArgs[2] == 0)
if (gBattleAnimArgs[2] == ANIM_ATTACKER)
{
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
@@ -831,16 +835,15 @@ void AnimTask_RotateMonToSideAndRestore(u8 taskId)
gTasks[taskId].data[7] = 1;
if (gTasks[taskId].data[7] )
{
s16 tmp;
tmp = gTasks[taskId].data[3];
s16 tmp = gTasks[taskId].data[3];
gTasks[taskId].data[3] = -tmp;
tmp = gTasks[taskId].data[4];
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];
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[1] = gBattleAnimArgs[1];
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];
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 AnimSimplePaletteBlend(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 AnimHitSplatBasic(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 AnimFlashingHitSplat(struct Sprite *sprite);
static void AnimHitSplatPersistent(struct Sprite *sprite);
static void AnimConfusionDuckStep(struct Sprite *sprite);
static void AnimSimplePaletteBlendStep(struct Sprite *sprite);
static void sub_80B9AD0(struct Sprite *sprite);
static void sub_80B9B5C(struct Sprite *sprite);
static void sub_80B9C2C(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
static void sub_80B9C7C(u8 taskId);
static void sub_80B9DA0(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
static void sub_80B9DF0(u8 taskId);
static void sub_80B9EA8(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
static void sub_80B9F04(u8 taskId);
static void sub_80B9FD8(u8 taskId);
static void sub_80BA090(u8 taskId);
static void sub_80BA3CC(void);
static void sub_80BA320(struct Sprite *sprite);
static void sub_80BA4D0(u8 taskId);
static void sub_80BA7BC(struct Sprite *sprite);
static void AnimConfusionDuck_Step(struct Sprite *sprite);
static void AnimSimplePaletteBlend_Step(struct Sprite *sprite);
static void AnimComplexPaletteBlend_Step1(struct Sprite *sprite);
static void AnimComplexPaletteBlend_Step2(struct Sprite *sprite);
static void BlendColorCycle(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
static void AnimTask_BlendColorCycleLoop(u8 taskId);
static void BlendColorCycleExclude(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
static void AnimTask_BlendColorCycleExcludeLoop(u8 taskId);
static void BlendColorCycleByTag(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
static void AnimTask_BlendColorCycleByTagLoop(u8 taskId);
static void AnimTask_FlashAnimTagWithColor_Step1(u8 taskId);
static void AnimTask_FlashAnimTagWithColor_Step2(u8 taskId);
static void AnimShakeMonOrBattleTerrain_UpdateCoordOffsetEnabled(void);
static void AnimShakeMonOrBattleTerrain_Step(struct Sprite *sprite);
static void AnimTask_ShakeBattleTerrain_Step(u8 taskId);
static void AnimFlashingHitSplat_Step(struct Sprite *sprite);
static const union AnimCmd sAnim_ConfusionDuck_0[] =
@@ -92,7 +92,7 @@ const struct SpriteTemplate gComplexPaletteBlendSpriteTemplate =
.callback = AnimComplexPaletteBlend,
};
static const union AnimCmd gUnknown_83E7B54[] =
static const union AnimCmd sAnim_CirclingSparkle[] =
{
ANIMCMD_FRAME(0, 3),
ANIMCMD_FRAME(16, 3),
@@ -102,20 +102,21 @@ static const union AnimCmd gUnknown_83E7B54[] =
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,
.paletteTag = ANIM_TAG_SPARKLE_4,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E7B6C,
.anims = sAnims_CirclingSparkle,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80B9B8C,
.callback = AnimCirclingSparkle,
};
const struct SpriteTemplate gShakeMonOrTerrainSpriteTemplate =
@@ -275,11 +276,11 @@ static void AnimConfusionDuck(struct Sprite *sprite)
StartSpriteAnim(sprite, 1);
}
sprite->data[3] = gBattleAnimArgs[4];
sprite->callback = AnimConfusionDuckStep;
sprite->callback = AnimConfusionDuck_Step;
sprite->callback(sprite);
}
static void AnimConfusionDuckStep(struct Sprite *sprite)
static void AnimConfusionDuck_Step(struct Sprite *sprite)
{
sprite->x2 = Cos(sprite->data[0], 30);
sprite->y2 = Sin(sprite->data[0], 10);
@@ -300,36 +301,36 @@ static void AnimConfusionDuckStep(struct Sprite *sprite)
// arg 4: blend color
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]);
sprite->invisible = TRUE;
sprite->callback = AnimSimplePaletteBlendStep;
sprite->callback = AnimSimplePaletteBlend_Step;
}
// 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:
// 0: battle background palettes (BG palettes 1, 2, and 3)
// 1: gBattleAnimAttacker OBJ palette
// 2: gBattleAnimTarget OBJ palette
// 3: gBattleAnimAttacker partner OBJ palette
// 4: gBattleAnimTarget partner OBJ palette
// 5: BG palette 4
// 6: BG palette 5
u32 UnpackSelectedBattleAnimPalettes(s16 selector)
// 0: F_PAL_BG, battle background palettes (BG palettes 1, 2, and 3)
// 1: F_PAL_ATTACKER, gBattleAnimAttacker OBJ palette
// 2: F_PAL_TARGET, gBattleAnimTarget OBJ palette
// 3: F_PAL_ATK_PARTNER, gBattleAnimAttacker partner OBJ palette
// 4: F_PAL_DEF_PARTNER, gBattleAnimTarget partner OBJ palette
// 5: F_PAL_ANIM_1, BG palette 8
// 6: F_PAL_ANIM_2, BG palette 9
u32 UnpackSelectedBattlePalettes(s16 selector)
{
u8 battleBackground = selector & 1;
u8 attacker = (selector >> 1) & 1;
u8 target = (selector >> 2) & 1;
u8 attackerPartner = (selector >> 3) & 1;
u8 targetPartner = (selector >> 4) & 1;
u8 arg5 = (selector >> 5) & 1;
u8 arg6 = (selector >> 6) & 1;
u8 anim1 = (selector >> 5) & 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)
DestroyAnimSprite(sprite);
@@ -347,13 +348,13 @@ static void AnimComplexPaletteBlend(struct Sprite *sprite)
sprite->data[5] = gBattleAnimArgs[5];
sprite->data[6] = gBattleAnimArgs[6];
sprite->data[7] = gBattleAnimArgs[0];
selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]);
selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]);
BlendPalettes(selectedPalettes, gBattleAnimArgs[4], gBattleAnimArgs[3]);
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;
@@ -366,10 +367,10 @@ static void sub_80B9AD0(struct Sprite *sprite)
return;
if (sprite->data[2] == 0)
{
sprite->callback = sub_80B9B5C;
sprite->callback = AnimComplexPaletteBlend_Step2;
return;
}
selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]);
selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]);
if (sprite->data[1] & 0x100)
BlendPalettes(selectedPalettes, sprite->data[4], sprite->data[3]);
else
@@ -379,19 +380,19 @@ static void sub_80B9AD0(struct Sprite *sprite)
--sprite->data[2];
}
static void sub_80B9B5C(struct Sprite *sprite)
static void AnimComplexPaletteBlend_Step2(struct Sprite *sprite)
{
u32 selectedPalettes;
if (!gPaletteFade.active)
{
selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]);
selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]);
BlendPalettes(selectedPalettes, 0, 0);
DestroyAnimSprite(sprite);
}
}
static void sub_80B9B8C(struct Sprite *sprite)
static void AnimCirclingSparkle(struct Sprite *sprite)
{
sprite->x += gBattleAnimArgs[0];
sprite->y += gBattleAnimArgs[1];
@@ -402,57 +403,75 @@ static void sub_80B9B8C(struct Sprite *sprite)
sprite->data[4] = 112;
sprite->data[5] = 0;
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
sprite->callback = TranslateSpriteInGrowingCircleOverDuration;
sprite->callback = TranslateSpriteInGrowingCircle;
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].data[1] = gBattleAnimArgs[1];
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_80B9C2C(taskId, 0, gTasks[taskId].data[4]);
gTasks[taskId].func = sub_80B9C7C;
gTasks[taskId].tPalSelector = 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;
BlendColorCycle(taskId, 0, gTasks[taskId].tTargetBlendY);
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]);
BeginNormalPaletteFade(selectedPalettes,
gTasks[taskId].data[1],
initialBlendAmount,
targetBlendAmount,
gTasks[taskId].data[5]);
--gTasks[taskId].data[2];
gTasks[taskId].data[8] ^= 1;
u32 selectedPalettes = UnpackSelectedBattlePalettes(gTasks[taskId].tPalSelector);
BeginNormalPaletteFade(
selectedPalettes,
gTasks[taskId].tDelay,
startBlendAmount,
targetBlendAmount,
gTasks[taskId].tBlendColor);
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 (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];
targetBlendAmount = gTasks[taskId].data[4];
// Blend to designated color
startBlendAmount = gTasks[taskId].tInitialBlendY;
targetBlendAmount = gTasks[taskId].tTargetBlendY;
}
else
{
initialBlendAmount = gTasks[taskId].data[4];
targetBlendAmount = gTasks[taskId].data[3];
// Blend back to original color
startBlendAmount = gTasks[taskId].tTargetBlendY;
targetBlendAmount = gTasks[taskId].tInitialBlendY;
}
if (gTasks[taskId].data[2] == 1)
if (gTasks[taskId].tNumBlends == 1)
targetBlendAmount = 0;
sub_80B9C2C(taskId, initialBlendAmount, targetBlendAmount);
BlendColorCycle(taskId, startBlendAmount, targetBlendAmount);
}
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)
{
s32 battler;
int battler;
u32 selectedPalettes = 0;
gTasks[taskId].data[0] = gBattleAnimArgs[0];
gTasks[taskId].data[1] = gBattleAnimArgs[1];
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;
for (battler = 0; battler < gBattlersCount; ++battler)
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 = 0;
for (battler = 0; battler < gBattlersCount; battler++)
{
if (battler != gBattleAnimAttacker && battler != gBattleAnimTarget)
selectedPalettes |= 1 << (battler + 16);
}
if (gBattleAnimArgs[0] == 1)
selectedPalettes |= 0xE;
gTasks[taskId].data[9] = selectedPalettes >> 16;
gTasks[taskId].data[10] = selectedPalettes & 0xFF;
sub_80B9DA0(taskId, 0, gTasks[taskId].data[4]);
gTasks[taskId].func = sub_80B9DF0;
gTasks[taskId].tPalSelectorHi = selectedPalettes >> 16;
gTasks[taskId].tPalSelectorLo = selectedPalettes & 0xFF;
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];
BeginNormalPaletteFade(selectedPalettes,
gTasks[taskId].data[1],
initialBlendAmount,
targetBlendAmount,
gTasks[taskId].data[5]);
--gTasks[taskId].data[2];
gTasks[taskId].data[8] ^= 1;
u32 selectedPalettes = ((u16)gTasks[taskId].tPalSelectorHi << 16) | (u16)gTasks[taskId].tPalSelectorLo;
BeginNormalPaletteFade(
selectedPalettes,
gTasks[taskId].tDelay,
startBlendAmount,
targetBlendAmount,
gTasks[taskId].tBlendColor);
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 (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];
targetBlendAmount = gTasks[taskId].data[4];
// Blend to designated color
startBlendAmount = gTasks[taskId].tInitialBlendY;
targetBlendAmount = gTasks[taskId].tTargetBlendY;
}
else
{
initialBlendAmount = gTasks[taskId].data[4];
targetBlendAmount = gTasks[taskId].data[3];
// Blend back to original color
startBlendAmount = gTasks[taskId].tTargetBlendY;
targetBlendAmount = gTasks[taskId].tInitialBlendY;
}
if (gTasks[taskId].data[2] == 1)
if (gTasks[taskId].tNumBlends == 1)
targetBlendAmount = 0;
sub_80B9DA0(taskId, initialBlendAmount, targetBlendAmount);
BlendColorCycleExclude(taskId, startBlendAmount, targetBlendAmount);
}
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)
{
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];
gTasks[taskId].data[1] = gBattleAnimArgs[1];
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;
BlendColorCycleByTag(taskId, 0, gTasks[taskId].tTargetBlendY);
gTasks[taskId].func = AnimTask_BlendColorCycleByTagLoop;
}
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]);
BeginNormalPaletteFade(1 << (paletteIndex + 16),
gTasks[taskId].data[1],
initialBlendAmount,
targetBlendAmount,
gTasks[taskId].data[5]);
--gTasks[taskId].data[2];
gTasks[taskId].data[8] ^= 1;
u8 paletteIndex = IndexOfSpritePaletteTag(gTasks[taskId].tPalTag);
BeginNormalPaletteFade(
1 << (paletteIndex + 16),
gTasks[taskId].tDelay,
startBlendAmount,
targetBlendAmount,
gTasks[taskId].tBlendColor);
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 (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];
targetBlendAmount = gTasks[taskId].data[4];
// Blend to designated color
startBlendAmount = gTasks[taskId].tInitialBlendY;
targetBlendAmount = gTasks[taskId].tTargetBlendY;
}
else
{
initialBlendAmount = gTasks[taskId].data[4];
targetBlendAmount = gTasks[taskId].data[3];
// Blend back to original color
startBlendAmount = gTasks[taskId].tTargetBlendY;
targetBlendAmount = gTasks[taskId].tInitialBlendY;
}
if (gTasks[taskId].data[2] == 1)
if (gTasks[taskId].tNumBlends == 1)
targetBlendAmount = 0;
sub_80B9EA8(taskId, initialBlendAmount, targetBlendAmount);
BlendColorCycleByTag(taskId, startBlendAmount, targetBlendAmount);
}
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)
{
u8 paletteIndex;
@@ -603,10 +646,10 @@ void AnimTask_FlashAnimTagWithColor(u8 taskId)
gBattleAnimArgs[4],
gBattleAnimArgs[4],
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;
@@ -619,7 +662,7 @@ static void sub_80B9FD8(u8 taskId)
return;
if (gTasks[taskId].data[2] == 0)
{
gTasks[taskId].func = sub_80BA090;
gTasks[taskId].func = AnimTask_FlashAnimTagWithColor_Step2;
return;
}
selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].data[7]) + 16);
@@ -640,7 +683,7 @@ static void sub_80B9FD8(u8 taskId)
--gTasks[taskId].data[2];
}
static void sub_80BA090(u8 taskId)
static void AnimTask_FlashAnimTagWithColor_Step2(u8 taskId)
{
u32 selectedPalettes;
@@ -659,7 +702,7 @@ void AnimTask_InvertScreenColor(u8 taskId)
u8 targetBattler = gBattleAnimTarget;
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)
selectedPalettes |= (0x10000 << attackerBattler);
if (gBattleAnimArgs[2] & 0x100)
@@ -668,8 +711,16 @@ void AnimTask_InvertScreenColor(u8 taskId)
DestroyAnimVisualTask(taskId);
}
// not used
static void sub_80BA16C(u8 taskId)
// Unused
#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 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)
{
u16 var0;
@@ -737,11 +797,11 @@ static void AnimShakeMonOrBattleTerrain(struct Sprite *sprite)
sprite->data[5] = gBattleAnimArgs[3];
var0 = sprite->data[5] - 2;
if (var0 < 2)
sub_80BA3CC();
sprite->callback = sub_80BA320;
AnimShakeMonOrBattleTerrain_UpdateCoordOffsetEnabled();
sprite->callback = AnimShakeMonOrBattleTerrain_Step;
}
static void sub_80BA320(struct Sprite *sprite)
static void AnimShakeMonOrBattleTerrain_Step(struct Sprite *sprite)
{
u8 i;
u16 var0;
@@ -766,58 +826,70 @@ static void sub_80BA320(struct Sprite *sprite)
var0 = sprite->data[5] - 2;
if (var0 < 2)
for (i = 0; i < gBattlersCount; ++i)
gSprites[gBattlerSpriteIds[i]].coordOffsetEnabled = 0;
gSprites[gBattlerSpriteIds[i]].coordOffsetEnabled = FALSE;
DestroyAnimSprite(sprite);
}
}
static void sub_80BA3CC(void)
static void AnimShakeMonOrBattleTerrain_UpdateCoordOffsetEnabled(void)
{
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = 0;
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = 0;
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = FALSE;
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = FALSE;
if (gBattleAnimArgs[4] == 2)
{
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = 1;
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = 1;
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = TRUE;
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = TRUE;
}
else
{
if (gBattleAnimArgs[4] == 0)
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = 1;
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = TRUE;
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)
{
gTasks[taskId].data[0] = gBattleAnimArgs[0];
gTasks[taskId].data[1] = gBattleAnimArgs[1];
gTasks[taskId].data[2] = gBattleAnimArgs[2];
gTasks[taskId].data[3] = gBattleAnimArgs[3];
gTasks[taskId].data[8] = gBattleAnimArgs[3];
gTasks[taskId].tXOffset = gBattleAnimArgs[0];
gTasks[taskId].tYOffset = gBattleAnimArgs[1];
gTasks[taskId].tNumShakes = gBattleAnimArgs[2];
gTasks[taskId].tTimer = gBattleAnimArgs[3];
gTasks[taskId].tShakeDelay = gBattleAnimArgs[3];
gBattle_BG3_X = gBattleAnimArgs[0];
gBattle_BG3_Y = gBattleAnimArgs[1];
gTasks[taskId].func = sub_80BA4D0;
gTasks[taskId].func = AnimTask_ShakeBattleTerrain_Step;
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])
gBattle_BG3_X = -gTasks[taskId].data[0];
if (gBattle_BG3_X == gTasks[taskId].tXOffset)
gBattle_BG3_X = -gTasks[taskId].tXOffset;
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;
else
gBattle_BG3_Y = -gTasks[taskId].data[1];
gBattle_BG3_Y = -gTasks[taskId].tYOffset;
gTasks[taskId].data[3] = gTasks[taskId].data[8];
if (--gTasks[taskId].data[2] == 0)
gTasks[taskId].tTimer = gTasks[taskId].tShakeDelay;
if (--gTasks[taskId].tNumShakes == 0)
{
gBattle_BG3_X = 0;
gBattle_BG3_Y = 0;
@@ -826,26 +898,33 @@ static void sub_80BA4D0(u8 taskId)
}
else
{
--gTasks[taskId].data[3];
gTasks[taskId].tTimer--;
}
}
#undef tXOffset
#undef tYOffset
#undef tNumShakes
#undef tTimer
#undef tShakeDelay
static void AnimHitSplatBasic(struct Sprite *sprite)
{
StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);
if (gBattleAnimArgs[2] == 0)
InitSpritePosToAnimAttacker(sprite, 1);
InitSpritePosToAnimAttacker(sprite, TRUE);
else
InitSpritePosToAnimTarget(sprite, TRUE);
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
// Same as basic hit splat but takes a length of time to persist for (arg4)
static void AnimHitSplatPersistent(struct Sprite *sprite)
{
StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);
if (gBattleAnimArgs[2] == 0)
InitSpritePosToAnimAttacker(sprite, 1);
InitSpritePosToAnimAttacker(sprite, TRUE);
else
InitSpritePosToAnimTarget(sprite, TRUE);
sprite->data[0] = gBattleAnimArgs[4];
@@ -853,6 +932,8 @@ static void AnimHitSplatPersistent(struct Sprite *sprite)
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)
{
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER && !IsContest())
@@ -865,8 +946,8 @@ static void AnimHitSplatRandom(struct Sprite *sprite)
if (gBattleAnimArgs[1] == -1)
gBattleAnimArgs[1] = Random() & 3;
StartSpriteAffineAnim(sprite, gBattleAnimArgs[1]);
if (gBattleAnimArgs[0] == 0)
InitSpritePosToAnimAttacker(sprite, 0);
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
InitSpritePosToAnimAttacker(sprite, FALSE);
else
InitSpritePosToAnimTarget(sprite, FALSE);
sprite->x2 += (Random() % 48) - 24;
@@ -889,8 +970,8 @@ static void AnimHitSplatOnMonEdge(struct Sprite *sprite)
static void AnimCrossImpact(struct Sprite *sprite)
{
if (gBattleAnimArgs[2] == 0)
InitSpritePosToAnimAttacker(sprite, 1);
if (gBattleAnimArgs[2] == ANIM_ATTACKER)
InitSpritePosToAnimAttacker(sprite, TRUE);
else
InitSpritePosToAnimTarget(sprite, TRUE);
sprite->data[0] = gBattleAnimArgs[3];
@@ -901,14 +982,14 @@ static void AnimCrossImpact(struct Sprite *sprite)
static void AnimFlashingHitSplat(struct Sprite *sprite)
{
StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);
if (gBattleAnimArgs[2] == 0)
InitSpritePosToAnimAttacker(sprite, 1);
if (gBattleAnimArgs[2] == ANIM_ATTACKER)
InitSpritePosToAnimAttacker(sprite, TRUE);
else
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;
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 AnimAcidPoisonDroplet(struct Sprite *sprite);
static void AnimBubbleEffect(struct Sprite *sprite);
static void sub_80B1684(struct Sprite *sprite);
static void sub_80B1728(struct Sprite *sprite);
static void sub_80B1798(struct Sprite *sprite);
static void AnimBubbleEffectStep(struct Sprite *sprite);
static void AnimSludgeProjectile_Step(struct Sprite *sprite);
static void AnimAcidPoisonBubble_Step(struct Sprite *sprite);
static void AnimSludgeBombHitParticle_Step(struct Sprite *sprite);
static void AnimBubbleEffect_Step(struct Sprite *sprite);
static const union AnimCmd sAnim_ToxicBubble[] =
{
@@ -194,10 +194,10 @@ static void AnimSludgeProjectile(struct Sprite *sprite)
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
sprite->data[5] = -30;
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))
DestroyAnimSprite(sprite);
@@ -218,10 +218,10 @@ static void AnimAcidPoisonBubble(struct Sprite *sprite)
sprite->data[4] = l2 + gBattleAnimArgs[5];
sprite->data[5] = -30;
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))
DestroyAnimSprite(sprite);
@@ -237,10 +237,10 @@ static void AnimSludgeBombHitParticle(struct Sprite *sprite)
InitSpriteDataForLinearTranslation(sprite);
sprite->data[5] = sprite->data[1] / 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);
sprite->data[1] -= sprite->data[5];
@@ -284,10 +284,10 @@ static void AnimBubbleEffect(struct Sprite *sprite)
sprite->x += gBattleAnimArgs[0];
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->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 AnimSkillSwapOrb(struct Sprite *sprite);
static void AnimPsychoBoost(struct Sprite *sprite);
static void sub_80B300C(struct Sprite *sprite);
static void sub_80B3044(struct Sprite *sprite);
static void sub_80B30B0(struct Sprite *sprite);
static void sub_80B3168(struct Sprite *sprite);
static void sub_80B3384(struct Sprite *sprite);
static void sub_80B33B8(struct Sprite *sprite);
static void sub_80B3454(u8 taskId);
static void sub_80B34DC(u8 taskId);
static void sub_80B3618(u8 taskId);
static void sub_80B3980(u8 taskId);
static void sub_80B3B78(u8 taskId);
static void sub_80B3D78(u8 taskId);
static void AnimDefensiveWall_Step2(struct Sprite *sprite);
static void AnimDefensiveWall_Step3(struct Sprite *sprite);
static void AnimDefensiveWall_Step4(struct Sprite *sprite);
static void AnimDefensiveWall_Step5(struct Sprite *sprite);
static void AnimQuestionMark_Step1(struct Sprite *sprite);
static void AnimQuestionMark_Step2(struct Sprite *sprite);
static void AnimTask_MeditateStretchAttacker_Step(u8 taskId);
static void AnimTask_Teleport_Step(u8 taskId);
static void AnimTask_ImprisonOrbs_Step(u8 taskId);
static void AnimTask_SkillSwap_Step(u8 taskId);
static void AnimTask_ExtrasensoryDistortion_Step(u8 taskId);
static void AnimTask_TransparentCloneGrowAndShrink_Step(u8 taskId);
static const union AffineAnimCmd sAffineAnim_PsychUpSpiral[] =
{
@@ -415,6 +415,7 @@ const struct SpriteTemplate gPsychoBoostOrbSpriteTemplate =
.callback = AnimPsychoBoost,
};
// For the rectangular wall sprite used by Reflect, Mirror Coat, etc
static void AnimDefensiveWall(struct Sprite *sprite)
{
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || IsContest())
@@ -459,20 +460,22 @@ static void AnimDefensiveWall(struct Sprite *sprite)
if (IsContest())
sprite->y += 9;
sprite->data[0] = 256 + IndexOfSpritePaletteTag(gBattleAnimArgs[2]) * 16;
sprite->callback = sub_80B300C;
sub_80B300C(sprite);
sprite->callback = AnimDefensiveWall_Step2;
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]));
if (sprite->data[3] == 13)
sprite->callback = sub_80B3044;
sprite->callback = AnimDefensiveWall_Step3;
else
++sprite->data[3];
}
static void sub_80B3044(struct Sprite *sprite)
static void AnimDefensiveWall_Step3(struct Sprite *sprite)
{
u16 color;
u16 startOffset;
@@ -487,11 +490,11 @@ static void sub_80B3044(struct Sprite *sprite)
gPlttBufferFaded[startOffset + i] = gPlttBufferFaded[startOffset + i - 1];
gPlttBufferFaded[startOffset + 1] = color;
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]));
if (--sprite->data[3] == -1)
@@ -508,11 +511,11 @@ static void sub_80B30B0(struct Sprite *sprite)
gSprites[gBattlerSpriteIds[battler]].invisible = FALSE;
}
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())
{
@@ -531,13 +534,14 @@ static void sub_80B3168(struct Sprite *sprite)
sprite->callback = DestroyAnimSprite;
}
// Animates the sparkle that appears during Reflect or Light Screen/Mirror Coat
static void AnimWallSparkle(struct Sprite *sprite)
{
if (sprite->data[0] == 0)
{
int arg3 = gBattleAnimArgs[3];
bool32 ignoreOffsets = gBattleAnimArgs[3];
bool8 respectMonPicOffsets = FALSE;
if (arg3 == 0)
if (!ignoreOffsets)
respectMonPicOffsets = TRUE;
if (!IsContest() && IsDoubleBattle())
{
@@ -589,6 +593,7 @@ static void AnimBentSpoon(struct Sprite *sprite)
sprite->callback = RunStoredCallbackWhenAnimEnds;
}
// Used by Amnesia
static void AnimQuestionMark(struct Sprite *sprite)
{
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;
if (sprite->y < 16)
sprite->y = 16;
StoreSpriteCallbackInData6(sprite, sub_80B3384);
StoreSpriteCallbackInData6(sprite, AnimQuestionMark_Step1);
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->affineAnims = sAffineAnims_QuestionMark;
sprite->data[0] = 0;
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])
{
@@ -640,10 +645,10 @@ void AnimTask_MeditateStretchAttacker(u8 taskId)
task->data[0] = spriteId;
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]))
DestroyAnimVisualTask(taskId);
@@ -659,10 +664,10 @@ void AnimTask_Teleport(u8 taskId)
task->data[2] = 0;
task->data[3] = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 4 : 8;
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];
@@ -682,7 +687,7 @@ static void sub_80B34DC(u8 taskId)
else
{
gSprites[task->data[0]].invisible = TRUE;
gSprites[task->data[0]].x = 272;
gSprites[task->data[0]].x = DISPLAY_WIDTH + 32;
ResetSpriteRotScale(task->data[0]);
DestroyAnimVisualTask(taskId);
}
@@ -704,10 +709,10 @@ void AnimTask_ImprisonOrbs(u8 taskId)
task->data[12] = var0 > var1 ? var0 : var1;
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
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;
u8 spriteId;
@@ -757,7 +762,7 @@ static void sub_80B3618(u8 taskId)
if (++task->data[1] == 32)
{
for (i = 8; i < 13; ++i)
if (task->data[i] != 64)
if (task->data[i] != MAX_SPRITES)
DestroySprite(&gSprites[task->data[i]]);
++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)
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->data[0] = gBattleAnimArgs[1];
sprite->callback = sub_80B37A4;
sprite->callback = AnimRedX_Step;
}
void AnimTask_SkillSwap(u8 taskId)
@@ -799,7 +804,7 @@ void AnimTask_SkillSwap(u8 taskId)
if (IsContest())
{
if (gBattleAnimArgs[0] == 1)
if (gBattleAnimArgs[0] == ANIM_TARGET)
{
task->data[10] = -10;
task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8;
@@ -836,10 +841,10 @@ void AnimTask_SkillSwap(u8 taskId)
}
}
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;
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)
{
s16 i;
@@ -932,10 +939,10 @@ void AnimTask_ExtrasensoryDistortion(u8 taskId)
scanlineParams.initState = 1;
scanlineParams.unused9 = 0;
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;
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)
{
s16 spriteId;
@@ -998,10 +1007,10 @@ void AnimTask_TransparentCloneGrowAndShrink(u8 taskId)
task->data[13] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
task->data[14] = matrixNum;
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];
@@ -1024,7 +1033,7 @@ static void sub_80B3D78(u8 taskId)
++task->data[0];
break;
case 2:
obj_delete_but_dont_free_vram(&gSprites[task->data[15]]);
DestroySpriteWithActiveSheet(&gSprites[task->data[15]]);
++task->data[0];
break;
case 3:
+75 -81
View File
@@ -8,21 +8,21 @@
static void AnimFallingRock(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 sub_80B4D00(u8 taskId);
static void AnimTask_Rollout_Step(u8 taskId);
static void AnimRolloutParticle(struct Sprite *sprite);
static void AnimRockTomb(struct Sprite *sprite);
static void AnimRockBlastRock(struct Sprite *sprite);
static void AnimRockScatter(struct Sprite *sprite);
static void AnimParticleInVortex(struct Sprite *sprite);
static void sub_80B46B4(struct Sprite *sprite);
static void sub_80B47C4(struct Sprite *sprite);
static void sub_80B490C(u8 taskId);
static void sub_80B4E70(struct Task *task);
static u8 sub_80B4FB8(void);
static void sub_80B5024(struct Sprite *sprite);
static void sub_80B50F8(struct Sprite *sprite);
static void AnimFallingRock_Step(struct Sprite *sprite);
static void AnimParticleInVortex_Step(struct Sprite *sprite);
static void AnimTask_LoadSandstormBackground_Step(u8 taskId);
static void CreateRolloutDirtSprite(struct Task *task);
static u8 GetRolloutCounter(void);
static void AnimRockTomb_Step(struct Sprite *sprite);
static void AnimRockScatter_Step(struct Sprite *sprite);
static const union AnimCmd sAnim_FlyingRock_0[] =
{
@@ -125,7 +125,7 @@ const struct SpriteTemplate gFlyingSandCrescentSpriteTemplate =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimDirtParticleAcrossScreen,
.callback = AnimFlyingSandCrescent,
};
static const struct Subsprite sFlyingSandSubsprites[] =
@@ -133,16 +133,16 @@ static const struct Subsprite sFlyingSandSubsprites[] =
{
.x = -16,
.y = 0,
.shape = ST_OAM_H_RECTANGLE,
.size = 2,
.shape = SPRITE_SHAPE(32x16),
.size = SPRITE_SIZE(32x16),
.tileOffset = 0,
.priority = 1,
},
{
.x = 16,
.y = 0,
.shape = ST_OAM_H_RECTANGLE,
.size = 2,
.shape = SPRITE_SHAPE(32x16),
.size = SPRITE_SIZE(32x16),
.tileOffset = 8,
.priority = 1,
},
@@ -153,37 +153,37 @@ static const struct SubspriteTable sFlyingSandSubspriteTable[] =
{ NELEMS(sFlyingSandSubsprites), sFlyingSandSubsprites },
};
static const union AnimCmd sAnim_BasicRock_0[] =
static const union AnimCmd sAnim_Rock_Biggest[] =
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
};
static const union AnimCmd sAnim_BasicRock_1[] =
static const union AnimCmd sAnim_Rock_Bigger[] =
{
ANIMCMD_FRAME(16, 1),
ANIMCMD_END,
};
static const union AnimCmd sAnim_WeatherBallRockDown_0[] =
static const union AnimCmd sAnim_Rock_Big[] =
{
ANIMCMD_FRAME(32, 1),
ANIMCMD_END,
};
static const union AnimCmd sAnim_WeatherBallRockDown_1[] =
static const union AnimCmd sAnim_Rock_Small[] =
{
ANIMCMD_FRAME(48, 1),
ANIMCMD_END,
};
static const union AnimCmd sAnim_TwisterRock_0[] =
static const union AnimCmd sAnim_Rock_Smaller[] =
{
ANIMCMD_FRAME(64, 1),
ANIMCMD_END,
};
static const union AnimCmd sAnim_TwisterRock_1[] =
static const union AnimCmd sAnim_Rock_Smallest[] =
{
ANIMCMD_FRAME(80, 1),
ANIMCMD_END,
@@ -191,20 +191,12 @@ static const union AnimCmd sAnim_TwisterRock_1[] =
static const union AnimCmd *const sAnims_BasicRock[] =
{
sAnim_BasicRock_0,
sAnim_BasicRock_1,
};
static const union AnimCmd *const sAnims_WeatherBallRockDown[] =
{
sAnim_WeatherBallRockDown_0,
sAnim_WeatherBallRockDown_1,
};
static const union AnimCmd *const sAnims_TwisterRock[] =
{
sAnim_TwisterRock_0,
sAnim_TwisterRock_1,
sAnim_Rock_Biggest,
sAnim_Rock_Bigger,
sAnim_Rock_Big,
sAnim_Rock_Small,
sAnim_Rock_Smaller,
sAnim_Rock_Smallest,
};
const struct SpriteTemplate gAncientPowerRockSpriteTemplate =
@@ -229,7 +221,7 @@ const struct SpriteTemplate gRolloutMudSpriteTemplate =
.callback = AnimRolloutParticle,
};
const struct SpriteTemplate gUnknown_83E74F0 =
const struct SpriteTemplate gRolloutRockSpriteTemplate =
{
.tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS,
@@ -296,7 +288,7 @@ const struct SpriteTemplate gTwisterRockSpriteTemplate =
.tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sAnims_TwisterRock,
.anims = &sAnims_BasicRock[4],
.images = NULL,
.affineAnims = sAffineAnims_BasicRock,
.callback = AnimMoveTwisterParticle,
@@ -307,7 +299,7 @@ const struct SpriteTemplate gWeatherBallRockDownSpriteTemplate =
.tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS,
.oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = sAnims_WeatherBallRockDown,
.anims = &sAnims_BasicRock[2],
.images = NULL,
.affineAnims = sAffineAnims_BasicRock,
.callback = AnimWeatherBallDown,
@@ -327,12 +319,12 @@ static void AnimFallingRock(struct Sprite *sprite)
sprite->data[3] = 16;
sprite->data[4] = -70;
sprite->data[5] = gBattleAnimArgs[2];
StoreSpriteCallbackInData6(sprite, sub_80B46B4);
sprite->callback = TranslateSpriteInEllipseOverDuration;
StoreSpriteCallbackInData6(sprite, AnimFallingRock_Step);
sprite->callback = TranslateSpriteInEllipse;
sprite->callback(sprite);
}
static void sub_80B46B4(struct Sprite *sprite)
static void AnimFallingRock_Step(struct Sprite *sprite)
{
sprite->x += sprite->data[5];
sprite->data[0] = 192;
@@ -341,10 +333,11 @@ static void sub_80B46B4(struct Sprite *sprite)
sprite->data[3] = 32;
sprite->data[4] = -24;
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
sprite->callback = TranslateSpriteInEllipseOverDuration;
sprite->callback = TranslateSpriteInEllipse;
sprite->callback(sprite);
}
// Animates the rock particles that are shown on the impact for Rock Blast / Rock Smash
static void AnimRockFragment(struct Sprite *sprite)
{
StartSpriteAnim(sprite, gBattleAnimArgs[5]);
@@ -366,6 +359,7 @@ static void AnimRockFragment(struct Sprite *sprite)
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
}
// Swirls particle in vortex. Used for moves like Fire Spin or Sand Tomb
static void AnimParticleInVortex(struct Sprite *sprite)
{
if (gBattleAnimArgs[6] == 0)
@@ -376,10 +370,10 @@ static void AnimParticleInVortex(struct Sprite *sprite)
sprite->data[1] = gBattleAnimArgs[2];
sprite->data[2] = gBattleAnimArgs[4];
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->y2 = -(sprite->data[4] >> 8);
@@ -416,10 +410,10 @@ void AnimTask_LoadSandstormBackground(u8 taskId)
if (gBattleAnimArgs[0] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
var0 = 1;
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;
@@ -487,7 +481,7 @@ static void sub_80B490C(u8 taskId)
// arg 1: projectile speed
// arg 2: y pixel drop
// arg 3: ??? unknown (possibly a color bit)
static void AnimDirtParticleAcrossScreen(struct Sprite *sprite)
static void AnimFlyingSandCrescent(struct Sprite *sprite)
{
if (sprite->data[0] == 0)
{
@@ -518,7 +512,7 @@ static void AnimDirtParticleAcrossScreen(struct Sprite *sprite)
sprite->data[4] &= 0xFF;
if (sprite->data[5] == 0)
{
if (sprite->x + sprite->x2 > 272)
if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 32)
{
sprite->callback = DestroyAnimSprite;
}
@@ -550,23 +544,23 @@ static void AnimRaiseSprite(struct Sprite *sprite)
void AnimTask_Rollout(u8 taskId)
{
u16 var0, var1, var2, var3;
u8 var4;
u8 rolloutCounter;
s32 var5;
s16 pan1, pan2;
struct Task *task;
task = &gTasks[taskId];
var0 = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
var1 = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 24;
var2 = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
var3 = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + 24;
var0 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
var1 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 24;
var2 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
var3 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 24;
if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget)
var3 = var1;
var4 = sub_80B4FB8();
if (var4 == 1)
rolloutCounter = GetRolloutCounter();
if (rolloutCounter == 1)
task->data[8] = 32;
else
task->data[8] = 48 - (var4 * 8);
task->data[8] = 48 - (rolloutCounter * 8);
task->data[0] = 0;
task->data[11] = 0;
task->data[9] = 0;
@@ -585,12 +579,12 @@ void AnimTask_Rollout(u8 taskId)
pan2 = BattleAnimAdjustPanning(SOUND_PAN_TARGET);
task->data[13] = pan1;
task->data[14] = (pan2 - pan1) / task->data[8];
task->data[1] = var4;
task->data[1] = rolloutCounter;
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;
@@ -634,7 +628,7 @@ static void sub_80B4D00(u8 taskId)
if (++task->data[9] >= task->data[10])
{
task->data[9] = 0;
sub_80B4E70(task);
CreateRolloutDirtSprite(task);
task->data[13] += task->data[14];
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;
s32 var0;
s32 tileOffset;
u16 x, y;
u8 spriteId;
@@ -661,20 +655,20 @@ static void sub_80B4E70(struct Task *task)
{
case 1:
spriteTemplate = &gRolloutMudSpriteTemplate;
var0 = 0;
tileOffset = 0;
break;
case 2:
case 3:
spriteTemplate = &gUnknown_83E74F0;
var0 = 80;
spriteTemplate = &gRolloutRockSpriteTemplate;
tileOffset = 80;
break;
case 4:
spriteTemplate = &gUnknown_83E74F0;
var0 = 64;
spriteTemplate = &gRolloutRockSpriteTemplate;
tileOffset = 64;
break;
case 5:
spriteTemplate = &gUnknown_83E74F0;
var0 = 48;
spriteTemplate = &gRolloutRockSpriteTemplate;
tileOffset = 48;
break;
default:
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[4] = y;
gSprites[spriteId].data[5] = -16 - (task->data[1] * 2);
gSprites[spriteId].oam.tileNum += var0;
gSprites[spriteId].oam.tileNum += tileOffset;
InitAnimArcTranslation(&gSprites[spriteId]);
++task->data[11];
}
@@ -700,15 +694,15 @@ static void AnimRolloutParticle(struct Sprite *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];
DestroySprite(sprite);
}
}
static u8 sub_80B4FB8(void)
static u8 GetRolloutCounter(void)
{
u8 retVal = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer;
u8 var0 = retVal - 1;
@@ -726,11 +720,11 @@ static void AnimRockTomb(struct Sprite *sprite)
sprite->data[3] -= gBattleAnimArgs[2];
sprite->data[0] = 3;
sprite->data[1] = gBattleAnimArgs[3];
sprite->callback = sub_80B5024;
sprite->callback = AnimRockTomb_Step;
sprite->invisible = TRUE;
}
static void sub_80B5024(struct Sprite *sprite)
static void AnimRockTomb_Step(struct Sprite *sprite)
{
sprite->invisible = FALSE;
if (sprite->data[3] != 0)
@@ -758,18 +752,18 @@ static void AnimRockBlastRock(struct Sprite *sprite)
static void AnimRockScatter(struct Sprite *sprite)
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
sprite->x += gBattleAnimArgs[0];
sprite->y += gBattleAnimArgs[1];
sprite->data[1] = gBattleAnimArgs[0];
sprite->data[2] = gBattleAnimArgs[1];
sprite->data[5] = gBattleAnimArgs[2];
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[3] += sprite->data[1];
@@ -783,11 +777,11 @@ static void sub_80B50F8(struct Sprite *sprite)
void AnimTask_GetSeismicTossDamageLevel(u8 taskId)
{
if (gAnimMoveDmg < 33)
gBattleAnimArgs[7] = 0;
gBattleAnimArgs[ARG_RET_ID] = 0;
if ((u32)gAnimMoveDmg - 33 < 33)
gBattleAnimArgs[7] = 1;
gBattleAnimArgs[ARG_RET_ID] = 1;
if (gAnimMoveDmg > 65)
gBattleAnimArgs[7] = 2;
gBattleAnimArgs[ARG_RET_ID] = 2;
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/sound.h"
static void sub_80DCE78(u8 taskId);
static void sub_80DCEE4(u8 taskId);
static void sub_80DCFE8(u8 taskId);
static void sub_80DD270(u8 taskId);
static void sub_80DD390(u8 taskId);
static void sub_80DD4D4(u8 taskId);
static void SoundTask_FireBlast_Step1(u8 taskId);
static void SoundTask_FireBlast_Step2(u8 taskId);
static void SoundTask_LoopSEAdjustPanning_Step(u8 taskId);
static void SoundTask_PlayDoubleCry_Step(u8 taskId);
static void SoundTask_PlayCryWithEcho_Step(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;
@@ -26,10 +33,10 @@ void sub_80DCE10(u8 taskId)
gTasks[taskId].data[3] = pan2;
gTasks[taskId].data[4] = panIncrement;
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];
s8 panIncrement = gTasks[taskId].data[4];
@@ -38,7 +45,7 @@ static void sub_80DCE78(u8 taskId)
{
gTasks[taskId].data[10] = 5;
gTasks[taskId].data[11] = 0;
gTasks[taskId].func = sub_80DCEE4;
gTasks[taskId].func = SoundTask_FireBlast_Step2;
}
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)
{
@@ -88,11 +95,11 @@ void SoundTask_LoopSEAdjustPanning(u8 taskId)
gTasks[taskId].data[10] = 0;
gTasks[taskId].data[11] = sourcePan;
gTasks[taskId].data[12] = r9;
gTasks[taskId].func = sub_80DCFE8;
sub_80DCFE8(taskId);
gTasks[taskId].func = SoundTask_LoopSEAdjustPanning_Step;
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])
{
@@ -131,6 +138,7 @@ void SoundTask_PlayCryHighPitch(u8 taskId)
battlerId = BATTLE_PARTNER(gBattleAnimAttacker);
else
battlerId = BATTLE_PARTNER(gBattleAnimTarget);
// Check if battler is visible.
if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER)
&& !IsBattlerSpriteVisible(battlerId))
@@ -182,7 +190,7 @@ void SoundTask_PlayDoubleCry(u8 taskId)
PlayCry_ByMode(species, pan, CRY_MODE_GROWL_1);
else // DOUBLE_CRY_ROAR
PlayCry_ByMode(species, pan, CRY_MODE_ROAR_1);
gTasks[taskId].func = sub_80DD270;
gTasks[taskId].func = SoundTask_PlayDoubleCry_Step;
}
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];
s8 pan = gTasks[taskId].data[2];
@@ -199,7 +207,7 @@ static void sub_80DD270(u8 taskId)
{
++gTasks[taskId].data[9];
}
else if (gTasks[taskId].data[0] == TAIL_SENTINEL)
else if (gTasks[taskId].data[0] == DOUBLE_CRY_GROWL)
{
if (!IsCryPlaying())
{
@@ -207,10 +215,13 @@ static void sub_80DD270(u8 taskId)
DestroyAnimVisualTask(taskId);
}
}
else if (!IsCryPlaying())
else // DOUBLE_CRY_ROAR
{
PlayCry_ByMode(species, pan, CRY_MODE_ROAR_2);
DestroyAnimVisualTask(taskId);
if (!IsCryPlaying())
{
PlayCry_ByMode(species, pan, CRY_MODE_ROAR_2);
DestroyAnimVisualTask(taskId);
}
}
}
@@ -222,19 +233,21 @@ void SoundTask_WaitForCry(u8 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;
s8 pan;
pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
s8 pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
species = gAnimBattlerSpecies[gBattleAnimAttacker];
gTasks[taskId].data[1] = species;
gTasks[taskId].data[2] = pan;
gTasks[taskId].tSpecies = species;
gTasks[taskId].tPan = pan;
if (species != SPECIES_NONE)
{
PlayCry_ByMode(species, pan, CRY_MODE_ECHO_START);
gTasks[taskId].func = sub_80DD390;
gTasks[taskId].func = SoundTask_PlayCryWithEcho_Step;
}
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())
{
u16 species = gTasks[taskId].data[1];
s8 pan = gTasks[taskId].data[2];
u16 species = gTasks[taskId].tSpecies;
s8 pan = gTasks[taskId].tPan;
PlayCry_ByMode(species, pan, CRY_MODE_ECHO_END);
DestroyAnimVisualTask(taskId);
}
}
#undef tSpecies
#undef tPan
#undef tState
void SoundTask_PlaySE1WithPanning(u8 taskId)
{
u16 songId = gBattleAnimArgs[0];
@@ -277,6 +294,8 @@ void SoundTask_PlaySE2WithPanning(u8 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)
{
s8 targetPan = gBattleAnimArgs[1];
@@ -292,11 +311,11 @@ void SoundTask_AdjustPanningVar(u8 taskId)
gTasks[taskId].data[5] = r9;
gTasks[taskId].data[10] = 0;
gTasks[taskId].data[11] = sourcePan;
gTasks[taskId].func = sub_80DD4D4;
sub_80DD4D4(taskId);
gTasks[taskId].func = SoundTask_AdjustPanningVar_Step;
gTasks[taskId].func(taskId);
}
static void sub_80DD4D4(u8 taskId)
static void SoundTask_AdjustPanningVar_Step(u8 taskId)
{
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] = 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])
DestroyAnimVisualTask(taskId);
}
+6 -5
View File
@@ -3,6 +3,7 @@
#include "battle.h"
#include "battle_anim.h"
#include "battle_main.h"
#include "battle_message.h"
#include "battle_controllers.h"
#include "battle_interface.h"
#include "decompress.h"
@@ -442,8 +443,8 @@ UNUSED void AnimTask_UnusedLevelUpHealthBox(u8 taskId)
gSprites[spriteId3].callback = SpriteCallbackDummy;
gSprites[spriteId4].callback = SpriteCallbackDummy;
GetBattleAnimBg1Data(&animBgData);
AnimLoadCompressedBgTilemap(animBgData.bgId, gUnknown_D2EC24_Tilemap);
AnimLoadCompressedBgGfx(animBgData.bgId, gUnknown_D2EC24_Gfx, animBgData.tilesOffset);
AnimLoadCompressedBgTilemap(animBgData.bgId, gUnusedLevelupAnimationTilemap);
AnimLoadCompressedBgGfx(animBgData.bgId, gUnusedLevelupAnimationGfx, animBgData.tilesOffset);
LoadCompressedPalette(gCureBubblesPal, animBgData.paletteId << 4, 32);
gBattle_BG1_X = -gSprites[spriteId3].x + 32;
gBattle_BG1_Y = -gSprites[spriteId3].y - 32;
@@ -660,7 +661,7 @@ void AnimTask_SwitchOutBallEffect(u8 taskId)
priority = gSprites[spriteId].oam.priority;
subpriority = gSprites[spriteId].subpriority;
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[0]++;
break;
@@ -2037,7 +2038,7 @@ void AnimTask_IsAttackerBehindSubstitute(u8 taskId)
DestroyAnimVisualTask(taskId);
}
void AnimTask_TargetToEffectBattler(u8 taskId)
void AnimTask_SetTargetToEffectBattler(u8 taskId)
{
gBattleAnimTarget = gEffectBattler;
DestroyAnimVisualTask(taskId);
@@ -2278,7 +2279,7 @@ void AnimTask_SafariOrGhost_DecideAnimSides(u8 taskId)
void AnimTask_SafariGetReaction(u8 taskId)
{
if (gBattleCommunication[MULTISTRING_CHOOSER] > 2)
if (gBattleCommunication[MULTISTRING_CHOOSER] >= NUM_SAFARI_REACTIONS)
gBattleAnimArgs[7] = 0;
else
gBattleAnimArgs[7] = gBattleCommunication[MULTISTRING_CHOOSER];
+89 -85
View File
@@ -9,19 +9,17 @@
#include "constants/battle_anim.h"
#include "constants/pokemon.h"
// Function Declarations
static u8 sub_8078178(u8 battlerId, bool8 b);
static void sub_80782BC(u8 taskId);
static void sub_80784D8(u8 taskId);
static void sub_8078528(u8 taskId);
static void sub_80785D8(u8 taskId);
static void sub_807862C(u8 taskId);
static u8 Task_FlashingCircleImpacts(u8 battlerId, bool8 b);
static void Task_UpdateFlashingCircleImpacts(u8 taskId);
static void AnimTask_FrozenIceCube_Step1(u8 taskId);
static void AnimTask_FrozenIceCube_Step2(u8 taskId);
static void AnimTask_FrozenIceCube_Step3(u8 taskId);
static void AnimTask_FrozenIceCube_Step4(u8 taskId);
static void Task_DoStatusAnimation(u8 taskId);
static void sub_807834C(struct Sprite *sprite);
static void sub_8078380(struct Sprite *sprite);
static void AnimFlashingCircleImpact(struct Sprite *sprite);
static void AnimFlashingCircleImpact_Step(struct Sprite *sprite);
// Data
static const union AnimCmd sUnknown_83BF3E0[] =
static const union AnimCmd sAnim_FlickeringOrb[] =
{
ANIMCMD_FRAME(0, 3),
ANIMCMD_FRAME(4, 3),
@@ -30,42 +28,44 @@ static const union AnimCmd sUnknown_83BF3E0[] =
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,
.paletteTag = ANIM_TAG_ORB,
.oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = sSpriteAnimTable_83BF3F4,
.anims = sAnims_FlickeringOrb,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker2,
.callback = AnimTranslateLinearAndFlicker,
};
const struct SpriteTemplate gSpriteTemplate_83BF410 =
// Unused
static const struct SpriteTemplate sFlickeringOrbFlippedSpriteTemplate =
{
.tileTag = ANIM_TAG_ORB,
.paletteTag = ANIM_TAG_ORB,
.oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = sSpriteAnimTable_83BF3F4,
.anims = sAnims_FlickeringOrb,
.images = NULL,
.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_JUMP(0)
};
static const union AnimCmd *const sSpriteAnimTable_83BF430[] =
static const union AnimCmd *const sAnims_WeatherBallNormal[] =
{
sUnknown_83BF428
sAnim_WeatherBallNormal
};
const struct SpriteTemplate gWeatherBallUpSpriteTemplate =
@@ -73,10 +73,10 @@ const struct SpriteTemplate gWeatherBallUpSpriteTemplate =
.tileTag = ANIM_TAG_WEATHER_BALL,
.paletteTag = ANIM_TAG_WEATHER_BALL,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sSpriteAnimTable_83BF430,
.anims = sAnims_WeatherBallNormal,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_WeatherBallUp,
.callback = AnimWeatherBallUp,
};
const struct SpriteTemplate gWeatherBallNormalDownSpriteTemplate =
@@ -84,13 +84,13 @@ const struct SpriteTemplate gWeatherBallNormalDownSpriteTemplate =
.tileTag = ANIM_TAG_WEATHER_BALL,
.paletteTag = ANIM_TAG_WEATHER_BALL,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sSpriteAnimTable_83BF430,
.anims = sAnims_WeatherBallNormal,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimWeatherBallDown,
};
static const union AnimCmd sUnknown_83BF464[] =
static const union AnimCmd sAnim_SpinningSparkle[] =
{
ANIMCMD_FRAME(0, 3),
ANIMCMD_FRAME(16, 3),
@@ -100,23 +100,24 @@ static const union AnimCmd sUnknown_83BF464[] =
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,
.paletteTag = ANIM_TAG_SPARKLE_4,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sSpriteAnimTable_83BF47C,
.anims = sAnims_SpinningSparkle,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_TrackOffsetFromAttackerAndWaitAnim,
.callback = AnimSpinningSparkle,
};
const struct SpriteTemplate gSpriteTemplate_83BF498 =
// Unused
static const struct SpriteTemplate sFlickeringFootSpriteTemplate =
{
.tileTag = ANIM_TAG_MONSTER_FOOT,
.paletteTag = ANIM_TAG_MONSTER_FOOT,
@@ -124,95 +125,98 @@ const struct SpriteTemplate gSpriteTemplate_83BF498 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.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_JUMP(0)
};
static const union AnimCmd sUnknown_83BF4B8[] =
static const union AnimCmd sAnim_FlickeringImpact_1[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sUnknown_83BF4C0[] =
static const union AnimCmd sAnim_FlickeringImpact_2[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_JUMP(0)
};
static const union AnimCmd *const sSpriteAniimTable_83BF4C8[] =
static const union AnimCmd *const sAnims_FlickeringImpact[] =
{
sUnknown_83BF4B0,
sUnknown_83BF4B8,
sUnknown_83BF4C0
sAnim_FlickeringImpact_0,
sAnim_FlickeringImpact_1,
sAnim_FlickeringImpact_2
};
const struct SpriteTemplate gSpriteTemplate_83BF4D4 =
// Unused
static const struct SpriteTemplate sFlickeringImpactSpriteTemplate =
{
.tileTag = ANIM_TAG_IMPACT,
.paletteTag = ANIM_TAG_IMPACT,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = sSpriteAniimTable_83BF4C8,
.anims = sAnims_FlickeringImpact,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker2,
.callback = AnimTranslateLinearAndFlicker,
};
static const union AnimCmd sUnknown_83BF4EC[] =
static const union AnimCmd sAnim_FlickeringShrinkOrb[] =
{
ANIMCMD_FRAME(0, 15),
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(2, 2, 0, 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,
.paletteTag = ANIM_TAG_ORB,
.oam = &gOamData_AffineDouble_ObjNormal_16x16,
.anims = sSpriteAnimTable_83BF4F4,
.anims = sAnims_FlickeringShrinkOrb,
.images = NULL,
.affineAnims = sSpriteAffineAnimTable_83BF510,
.callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker,
.affineAnims = sAffineAnims_FlickeringShrinkOrb,
.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 = 48, .shape = SPRITE_SHAPE(16x8), .size = 3, .tileOffset = 64, .priority = 2},
{.x = 48, .y = -16, .shape = SPRITE_SHAPE(8x16), .size = 3, .tileOffset = 96, .priority = 2},
{.x = 48, .y = 48, .shape = SPRITE_SHAPE(8x8), .size = 2, .tileOffset = 128, .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(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 64, .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(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,
.paletteTag = ANIM_TAG_ICE_CUBE,
@@ -223,7 +227,7 @@ static const struct SpriteTemplate sUnknown_83BF55C =
.callback = SpriteCallbackDummy,
};
static const struct SpriteTemplate sUnknown_83BF574 =
static const struct SpriteTemplate sFlashingCircleImpactSpriteTemplate =
{
.tileTag = ANIM_TAG_CIRCLE_IMPACT,
.paletteTag = ANIM_TAG_CIRCLE_IMPACT,
@@ -231,14 +235,14 @@ static const struct SpriteTemplate sUnknown_83BF574 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_807834C,
.callback = AnimFlashingCircleImpact,
};
// Functions
static u8 sub_8078178(u8 battlerId, bool8 b)
// Unused
static u8 Task_FlashingCircleImpacts(u8 battlerId, bool8 b)
{
u8 battlerSpriteId = gBattlerSpriteIds[battlerId];
u8 taskId = CreateTask(sub_80782BC, 10);
u8 taskId = CreateTask(Task_UpdateFlashingCircleImpacts, 10);
u8 spriteId2;
u8 i;
@@ -250,7 +254,7 @@ static u8 sub_8078178(u8 battlerId, bool8 b)
gTasks[taskId].data[1] = RGB_RED;
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[1] = -256;
gSprites[spriteId2].invisible = TRUE;
@@ -263,7 +267,7 @@ static u8 sub_8078178(u8 battlerId, bool8 b)
gTasks[taskId].data[1] = RGB_BLUE;
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[1] = 256;
gSprites[spriteId2].invisible = TRUE;
@@ -275,7 +279,7 @@ static u8 sub_8078178(u8 battlerId, bool8 b)
return taskId;
}
static void sub_80782BC(u8 taskId)
static void Task_UpdateFlashingCircleImpacts(u8 taskId)
{
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)
{
sprite->invisible = FALSE;
sprite->callback = sub_8078380;
sub_8078380(sprite);
sprite->callback = AnimFlashingCircleImpact_Step;
sprite->callback(sprite);
}
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->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_BLDALPHA, BLDALPHA_BLEND(0, 16));
spriteId = CreateSprite(&sUnknown_83BF55C, x, y, 4);
if (GetSpriteTileStartByTag(ANIM_TAG_ICE_CUBE) == TAG_NONE)
spriteId = CreateSprite(&sFrozenIceCubeSpriteTemplate, x, y, 4);
if (GetSpriteTileStartByTag(ANIM_TAG_ICE_CUBE) == 0xFFFF)
gSprites[spriteId].invisible = TRUE;
SetSubspriteTables(&gSprites[spriteId], sUnknown_83BF554);
SetSubspriteTables(&gSprites[spriteId], sFrozenIceCubeSubspriteTable);
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]++;
if (gTasks[taskId].data[1] == 10)
{
gTasks[taskId].func = sub_8078528;
gTasks[taskId].func = AnimTask_FrozenIceCube_Step2;
gTasks[taskId].data[1] = 0;
}
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);
@@ -405,19 +409,19 @@ static void sub_8078528(u8 taskId)
if (gTasks[taskId].data[4] == 2)
{
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]--;
if (gTasks[taskId].data[1] == -1)
{
gTasks[taskId].func = sub_807862C;
gTasks[taskId].func = AnimTask_FrozenIceCube_Step4;
gTasks[taskId].data[1] = 0;
}
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]++;
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 AnimTask_BlendSpriteColor_Step2(u8 taskId);
static void Task_WaitHardwarePaletteFade(u8 taskId);
static void Task_DoCloneBattlerSpriteWithBlend(u8 taskId);
static void Task_FinishCloneBattlerSpriteWithBlend(struct Sprite *sprite);
static void AnimTask_HardwarePaletteFade_Step(u8 taskId);
static void AnimTask_TraceMonBlended_Step(u8 taskId);
static void AnimMonTrace(struct Sprite *sprite);
static void AnimTask_DrawFallingWhiteLinesOnAttacker_Step(u8 taskId);
static void StatsChangeAnimation_Step1(u8 taskId);
static void StatsChangeAnimation_Step2(u8 taskId);
static void StatsChangeAnimation_Step3(u8 taskId);
static void sub_80BB6CC(u8 taskId);
static void sub_80BB790(u32 selectedPalettes, u16 color);
static void sub_80BB8A4(u8 taskId);
static void sub_80BBC2C(u8 taskId);
static void sub_80BC19C(u8 taskId);
static void AnimTask_Flash_Step(u8 taskId);
static void SetPalettesToColor(u32 selectedPalettes, u16 color);
static void AnimTask_UpdateSlidingBg(u8 taskId);
static void UpdateMonScrollingBgMask(u8 taskId);
static void AnimTask_WaitAndRestoreVisibility(u8 taskId);
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 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
// 9: Enemy battler left
// 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] >> 8) & 1,
(gBattleAnimArgs[0] >> 9) & 1,
@@ -72,26 +72,26 @@ void AnimTask_BlendSelected(u8 taskId)
// 5: Blend all
// 6: Neither bg nor attacker's partner
// 7: Neither bg nor target's partner
void AnimTask_BlendExcept(u8 taskId)
void AnimTask_BlendBattleAnimPalExclude(u8 taskId)
{
u8 battler;
u32 selectedPalettes;
u8 animBattlers[2];
animBattlers[1] = 0xFF;
selectedPalettes = UnpackSelectedBattleAnimPalettes(1);
selectedPalettes = UnpackSelectedBattlePalettes(1);
switch (gBattleAnimArgs[0])
{
case 2:
selectedPalettes = 0;
// fall through
case 0:
case ANIM_ATTACKER:
animBattlers[0] = gBattleAnimAttacker;
break;
case 3:
selectedPalettes = 0;
// fall through
case 1:
case ANIM_TARGET:
animBattlers[0] = gBattleAnimTarget;
break;
case 4:
@@ -122,7 +122,7 @@ void AnimTask_BlendExcept(u8 taskId)
void AnimTask_SetCamouflageBlend(u8 taskId)
{
u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]);
u32 selectedPalettes = UnpackSelectedBattlePalettes(gBattleAnimArgs[0]);
switch (gBattleTerrain)
{
@@ -217,16 +217,17 @@ void AnimTask_HardwarePaletteFade(u8 taskId)
gBattleAnimArgs[2],
gBattleAnimArgs[3],
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)
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];
@@ -236,9 +237,9 @@ void AnimTask_CloneBattlerSpriteWithBlend(u8 taskId)
task->data[3] = gBattleAnimArgs[2];
task->data[4] = gBattleAnimArgs[3];
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];
@@ -257,7 +258,7 @@ static void Task_DoCloneBattlerSpriteWithBlend(u8 taskId)
gSprites[task->data[6]].data[0] = task->data[3];
gSprites[task->data[6]].data[1] = taskId;
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[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])
{
@@ -279,11 +280,12 @@ static void Task_FinishCloneBattlerSpriteWithBlend(struct Sprite *sprite)
else
{
--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;
s32 newSpriteId;
@@ -330,7 +332,7 @@ void AnimTask_SetUpCurseBackground(u8 taskId)
else
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
newSpriteId = CreateCloneOfSpriteInWindowMode(gBattleAnimAttacker, spriteId, species);
newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species);
GetBattleAnimBg1Data(&animBgData);
AnimLoadCompressedBgTilemap(animBgData.bgId, gFile_graphics_battle_anims_masks_curse_tilemap);
if (IsContest())
@@ -446,11 +448,11 @@ static void StatsChangeAnimation_Step2(u8 taskId)
u8 battlerSpriteId;
battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler1];
spriteId = CreateCloneOfSpriteInWindowMode(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species);
spriteId = CreateInvisibleSpriteCopy(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species);
if (sAnimStatsChangeData->data[3])
{
battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler2];
newSpriteId = CreateCloneOfSpriteInWindowMode(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species);
newSpriteId = CreateInvisibleSpriteCopy(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species);
}
GetBattleAnimBg1Data(&animBgData);
if (sAnimStatsChangeData->data[0] == 0)
@@ -580,19 +582,19 @@ static void StatsChangeAnimation_Step3(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;
selectedPalettes = SelectBattleAnimSpriteAndBgPalettes(1, 0, 0, 0, 0, 0, 0) & 0xFFFF;
sub_80BB790(selectedPalettes, 0xFFFF);
selectedPalettes = GetBattlePalettesMask(1, 0, 0, 0, 0, 0, 0) & 0xFFFF;
SetPalettesToColor(selectedPalettes, 0xFFFF);
gTasks[taskId].data[15] = selectedPalettes;
gTasks[taskId].data[0] = 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;
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;
@@ -665,7 +667,7 @@ void AnimTask_StartSlidingBg(u8 taskId)
u8 newTaskId;
ToggleBg3Mode(0);
newTaskId = CreateTask(sub_80BB8A4, 5);
newTaskId = CreateTask(AnimTask_UpdateSlidingBg, 5);
if (gBattleAnimArgs[2] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
@@ -678,7 +680,7 @@ void AnimTask_StartSlidingBg(u8 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[11] += gTasks[taskId].data[2];
@@ -713,6 +715,7 @@ void AnimTask_GetTargetIsAttackerPartner(u8 taskId)
DestroyAnimVisualTask(taskId);
}
// For hiding or subsequently revealing all other battlers
void AnimTask_SetAllNonAttackersInvisiblity(u8 taskId)
{
u16 battler;
@@ -723,7 +726,7 @@ void AnimTask_SetAllNonAttackersInvisiblity(u8 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;
u8 spriteId, newSpriteId = 0;
@@ -731,8 +734,8 @@ void StartMonScrollingBgMask(u8 taskId, s32 unused, u16 arg2, u8 battler1, u8 ar
struct BattleAnimBgData animBgData;
u8 battler2 = BATTLE_PARTNER(battler1);
if (IsContest() || (arg4 && !IsBattlerSpriteVisible(battler2)))
arg4 = 0;
if (IsContest() || (includePartner && !IsBattlerSpriteVisible(battler2)))
includePartner = FALSE;
gBattle_WIN0H = 0;
gBattle_WIN0V = 0;
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);
else
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES);
spriteId = CreateCloneOfSpriteInWindowMode(battler1, gBattlerSpriteIds[battler1], species);
if (arg4)
newSpriteId = CreateCloneOfSpriteInWindowMode(battler2, gBattlerSpriteIds[battler2], species);
spriteId = CreateInvisibleSpriteCopy(battler1, gBattlerSpriteIds[battler1], species);
if (includePartner)
newSpriteId = CreateInvisibleSpriteCopy(battler2, gBattlerSpriteIds[battler2], species);
GetBattleAnimBg1Data(&animBgData);
AnimLoadCompressedBgTilemap(animBgData.bgId, tilemap);
if (IsContest())
@@ -764,17 +767,17 @@ void StartMonScrollingBgMask(u8 taskId, s32 unused, u16 arg2, u8 battler1, u8 ar
LoadCompressedPalette(palette, animBgData.paletteId * 16, 32);
gBattle_BG1_X = 0;
gBattle_BG1_Y = 0;
gTasks[taskId].data[1] = arg2;
gTasks[taskId].data[4] = arg5;
gTasks[taskId].data[5] = arg7;
gTasks[taskId].data[6] = arg6;
gTasks[taskId].data[1] = scrollSpeed;
gTasks[taskId].data[4] = numFadeSteps;
gTasks[taskId].data[5] = duration;
gTasks[taskId].data[6] = fadeStepDelay;
gTasks[taskId].data[0] = spriteId;
gTasks[taskId].data[2] = arg4;
gTasks[taskId].data[2] = includePartner;
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];
if (gTasks[taskId].data[1] < 0)
@@ -856,7 +859,7 @@ void AnimTask_CopyPalUnfadedToBackup(u8 taskId)
s32 paletteIndex = 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;
++paletteIndex)
selectedPalettes >>= 1;
@@ -874,7 +877,7 @@ void AnimTask_CopyPalUnfadedFromBackup(u8 taskId)
s32 paletteIndex = 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;
++paletteIndex)
selectedPalettes >>= 1;
@@ -892,7 +895,7 @@ void AnimTask_CopyPalFadedToUnfaded(u8 taskId)
s32 paletteIndex = 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;
++paletteIndex)
selectedPalettes >>= 1;
@@ -907,9 +910,9 @@ void AnimTask_CopyPalFadedToUnfaded(u8 taskId)
void AnimTask_IsContest(u8 taskId)
{
if (IsContest())
gBattleAnimArgs[7] = 1;
gBattleAnimArgs[ARG_RET_ID] = TRUE;
else
gBattleAnimArgs[7] = 0;
gBattleAnimArgs[ARG_RET_ID] = FALSE;
DestroyAnimVisualTask(taskId);
}
@@ -923,9 +926,9 @@ void AnimTask_SetAnimAttackerAndTargetForEffectTgt(u8 taskId)
void AnimTask_IsTargetSameSide(u8 taskId)
{
if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
gBattleAnimArgs[7] = 1;
gBattleAnimArgs[ARG_RET_ID] = TRUE;
else
gBattleAnimArgs[7] = 0;
gBattleAnimArgs[ARG_RET_ID] = FALSE;
DestroyAnimVisualTask(taskId);
}
@@ -952,12 +955,12 @@ void AnimTask_SetAttackerInvisibleWaitForSignal(u8 taskId)
{
gTasks[taskId].data[0] = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible;
gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible = 1;
gTasks[taskId].func = sub_80BC19C;
gTasks[taskId].func = AnimTask_WaitAndRestoreVisibility;
--gAnimVisualTaskCount;
}
}
static void sub_80BC19C(u8 taskId)
static void AnimTask_WaitAndRestoreVisibility(u8 taskId)
{
if (gBattleAnimArgs[7] == 0x1000)
{
+24 -27
View File
@@ -12,8 +12,6 @@
#include "trig.h"
#include "util.h"
#define ISO_RANDOMIZE2(val)(1103515245 * (val) + 12345)
static void AnimRainDrop(struct Sprite *);
static void AnimRainDrop_Step(struct Sprite *);
static void AnimWaterBubbleProjectile(struct Sprite *);
@@ -55,9 +53,8 @@ static void AnimTask_WaterSport_Step(u8);
static void CreateWaterSportDroplet(struct Task *);
static void CreateWaterPulseRingBubbles(struct Sprite *, s32, s32);
// Both unused? Comment copied from pokeemerald
static const u8 gUnknown_83E44F4[] = INCBIN_U8("graphics/battle_anims/unk_83E44F4.4bpp");
static const u8 gUnknown_83E4874[] = INCBIN_U8("graphics/battle_anims/unk_83E4874.bin");
static const u8 sUnusedWater_Gfx[] = INCBIN_U8("graphics/battle_anims/unk_83E44F4.4bpp");
static const u8 sUnusedWater[] = INCBIN_U8("graphics/battle_anims/unk_83E4874.bin");
static const union AnimCmd sAnim_RainDrop[] =
{
@@ -488,8 +485,8 @@ void AnimTask_CreateRaindrops(u8 taskId)
gTasks[taskId].data[0]++;
if (gTasks[taskId].data[0] % gTasks[taskId].data[2] == 1)
{
x = Random() % 240;
y = Random() % 80;
x = Random() % DISPLAY_WIDTH;
y = Random() % (DISPLAY_HEIGHT / 2);
CreateSprite(&gRainDropSpriteTemplate, x, y, 4);
}
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)
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) - gBattleAnimArgs[0];
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[1];
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) - gBattleAnimArgs[0];
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];
sprite->animPaused = TRUE;
}
else
{
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + gBattleAnimArgs[0];
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[1];
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[0];
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];
sprite->animPaused = TRUE;
}
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[6];
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[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
InitAnimLinearTranslation(sprite);
spriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);
sprite->data[5] = spriteId;
@@ -599,9 +596,9 @@ static void AnimAuroraBeamRings(struct Sprite *sprite)
unkArg = gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[4];
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[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
InitAnimLinearTranslation(sprite);
sprite->callback = AnimAuroraBeamRings_Step;
sprite->affineAnimPaused = TRUE;
@@ -653,9 +650,9 @@ static void AnimToTargetInSinWave(struct Sprite *sprite)
InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[0] = 30;
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[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
InitAnimLinearTranslation(sprite);
sprite->data[5] = 0xD200 / sprite->data[0];
sprite->data[7] = gBattleAnimArgs[3];
@@ -708,8 +705,8 @@ static void AnimHydroCannonCharge(struct Sprite *sprite)
{
u8 priority;
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1);
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
sprite->y2 = -10;
priority = GetBattlerSpriteSubpriority(gBattleAnimAttacker);
if (!IsContest())
@@ -755,14 +752,14 @@ static void AnimHydroCannonBeam(struct Sprite *sprite)
else
animType = FALSE;
if ((u8)gBattleAnimArgs[5] == 0)
coordType = 3;
coordType = BATTLER_COORD_Y_PIC_OFFSET;
else
coordType = 1;
InitSpritePosToAnimAttacker(sprite, animType);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
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->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
@@ -1173,8 +1170,8 @@ static u8 GetWaterSpoutPowerForAnim(void)
static void CreateWaterSpoutLaunchDroplets(struct Task *task, u8 taskId)
{
s16 i;
s16 attackerCoordX = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
s16 attackerCoordY = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
s16 attackerCoordX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
s16 attackerCoordY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
s16 trigIndex = 172;
u8 subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1;
s16 increment = 4 - task->data[1];
@@ -1347,8 +1344,8 @@ void AnimTask_WaterSport(u8 taskId)
{
struct Task *task = &gTasks[taskId];
task->data[3] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
task->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
task->data[3] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
task->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
task->data[7] = (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) ? 1 : -1;
if (IsContest())
task->data[7] *= -1;
@@ -1520,8 +1517,8 @@ static void AnimWaterPulseRingBubble(struct Sprite *sprite)
void AnimWaterPulseRing(struct Sprite *sprite)
{
InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
sprite->data[3] = gBattleAnimArgs[2];
sprite->data[4] = gBattleAnimArgs[3];
sprite->callback = AnimWaterPulseRing_Step;
+2 -3
View File
@@ -15,7 +15,6 @@
#include "battle_interface.h"
#include "battle_message.h"
#include "reshow_battle_screen.h"
#include "battle_string_ids.h"
#include "constants/songs.h"
#include "constants/items.h"
@@ -1662,7 +1661,7 @@ static void OakOldManHandleSuccessBallThrowAnim(void)
{
gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;
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;
}
@@ -1672,7 +1671,7 @@ static void OakOldManHandleBallThrowAnim(void)
gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId;
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;
}
-1
View File
@@ -15,7 +15,6 @@
#include "battle_controllers.h"
#include "battle_interface.h"
#include "battle_message.h"
#include "battle_string_ids.h"
#include "reshow_battle_screen.h"
#include "teachy_tv.h"
#include "constants/songs.h"
+2 -2
View File
@@ -376,7 +376,7 @@ static void SafariHandleSuccessBallThrowAnim(void)
{
gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;
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;
}
@@ -386,7 +386,7 @@ static void SafariHandleBallThrowAnim(void)
gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId;
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;
}
+21 -22
View File
@@ -9,7 +9,6 @@
#include "battle_message.h"
#include "battle_scripts.h"
#include "battle_setup.h"
#include "battle_string_ids.h"
#include "berry.h"
#include "data.h"
#include "decompress.h"
@@ -2274,8 +2273,8 @@ static void BattleStartClearSetData(void)
gLeveledUpInBattle = 0;
gAbsentBattlerFlags = 0;
gBattleStruct->runTries = 0;
gBattleStruct->safariGoNearCounter = 0;
gBattleStruct->safariPkblThrowCounter = 0;
gBattleStruct->safariRockThrowCounter = 0;
gBattleStruct->safariBaitThrowCounter = 0;
*(&gBattleStruct->safariCatchFactor) = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275;
*(&gBattleStruct->safariEscapeFactor) = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].safariZoneFleeRate * 100 / 1275;
if (gBattleStruct->safariEscapeFactor <= 1)
@@ -4331,32 +4330,32 @@ static void HandleAction_WatchesCarefully(void)
gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
if (gBattleStruct->safariGoNearCounter != 0)
if (gBattleStruct->safariRockThrowCounter != 0)
{
--gBattleStruct->safariGoNearCounter;
if (gBattleStruct->safariGoNearCounter == 0)
--gBattleStruct->safariRockThrowCounter;
if (gBattleStruct->safariRockThrowCounter == 0)
{
*(&gBattleStruct->safariCatchFactor) = gBaseStats[GetMonData(gEnemyParty, MON_DATA_SPECIES)].catchRate * 100 / 1275;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_WATCHING;
}
else
{
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_ANGRY;
}
}
else
{
if (gBattleStruct->safariPkblThrowCounter != 0)
if (gBattleStruct->safariBaitThrowCounter != 0)
{
--gBattleStruct->safariPkblThrowCounter;
if (gBattleStruct->safariPkblThrowCounter == 0)
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
--gBattleStruct->safariBaitThrowCounter;
if (gBattleStruct->safariBaitThrowCounter == 0)
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_WATCHING;
else
gBattleCommunication[5] = 2;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_EATING;
}
else
{
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_WATCHING;
}
}
gBattlescriptCurrInstr = gBattlescriptsForSafariActions[0];
@@ -4379,10 +4378,10 @@ static void HandleAction_ThrowBait(void)
gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
gBattleStruct->safariPkblThrowCounter += Random() % 5 + 2;
if (gBattleStruct->safariPkblThrowCounter > 6)
gBattleStruct->safariPkblThrowCounter = 6;
gBattleStruct->safariGoNearCounter = 0;
gBattleStruct->safariBaitThrowCounter += Random() % 5 + 2;
if (gBattleStruct->safariBaitThrowCounter > 6)
gBattleStruct->safariBaitThrowCounter = 6;
gBattleStruct->safariRockThrowCounter = 0;
gBattleStruct->safariCatchFactor >>= 1;
if (gBattleStruct->safariCatchFactor <= 2)
gBattleStruct->safariCatchFactor = 3;
@@ -4395,10 +4394,10 @@ static void HandleAction_ThrowRock(void)
gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
gBattleStruct->safariGoNearCounter += Random() % 5 + 2;
if (gBattleStruct->safariGoNearCounter > 6)
gBattleStruct->safariGoNearCounter = 6;
gBattleStruct->safariPkblThrowCounter = 0;
gBattleStruct->safariRockThrowCounter += Random() % 5 + 2;
if (gBattleStruct->safariRockThrowCounter > 6)
gBattleStruct->safariRockThrowCounter = 6;
gBattleStruct->safariBaitThrowCounter = 0;
gBattleStruct->safariCatchFactor <<= 1;
if (gBattleStruct->safariCatchFactor > 20)
gBattleStruct->safariCatchFactor = 20;
+1 -2
View File
@@ -1,6 +1,5 @@
#include "global.h"
#include "gflib.h"
#include "battle_string_ids.h"
#include "battle.h"
#include "battle_anim.h"
#include "strings.h"
@@ -1186,7 +1185,7 @@ const u16 gInobedientStringIds[] =
[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_ANGRY] = STRINGID_PKMNANGRY,
-1
View File
@@ -23,7 +23,6 @@
#include "battle_anim.h"
#include "battle_ai_script_commands.h"
#include "battle_scripts.h"
#include "battle_string_ids.h"
#include "reshow_battle_screen.h"
#include "battle_controllers.h"
#include "battle_interface.h"
-1
View File
@@ -15,7 +15,6 @@
#include "battle_message.h"
#include "constants/battle_anim.h"
#include "battle_controllers.h"
#include "battle_string_ids.h"
#include "battle_ai_script_commands.h"
#include "constants/battle.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 "text_window.h"
#include "trig.h"
#include "battle_string_ids.h"
#include "constants/moves.h"
#include "constants/songs.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 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 gBattleAnimSpriteGfx_TriForceTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/tri_attack_triangle.4bpp.lz");
const u32 gBattleAnimSpritePal_TriAttackTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/tri_attack_triangle.gbapal.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 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 gUnknown_D2EC24_Gfx[] = 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 gUnusedLevelupAnimationGfx[] = INCBIN_U32("graphics/battle_anims/masks/unknown_D2EC24.4bpp.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 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 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");
+2 -2
View File
@@ -319,7 +319,7 @@ static void sub_80709B4(struct PaletteStruct *a1)
return;
if (val > 2)
return;
ResetPaletteStructByUid(a1->base->uid);
PaletteStruct_ResetById(a1->base->uid);
}
}
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);
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;
StoreSpriteCallbackInData6(&gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]], SpriteCB_MonIcon);
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);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(0);
+1 -1
View File
@@ -55,7 +55,7 @@
.include "src/safari_zone.o"
.include "src/item_use.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_intro.o"
.include "src/easy_chat.o"