From 752ce9b90d756e01766c12136169eefe335ac016 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Oct 2017 16:55:25 +0200 Subject: start working on battle anim --- src/battle_anim.c | 650 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/decompress.c | 2 +- src/sprite.c | 2 +- 3 files changed, 652 insertions(+), 2 deletions(-) create mode 100644 src/battle_anim.c (limited to 'src') diff --git a/src/battle_anim.c b/src/battle_anim.c new file mode 100644 index 000000000..6c316157f --- /dev/null +++ b/src/battle_anim.c @@ -0,0 +1,650 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "sprite.h" +#include "contest.h" +#include "m4a.h" +#include "pokemon.h" +#include "battle_interface.h" +#include "task.h" +#include "decompress.h" +#include "sound.h" +#include "dma3.h" +#include "bg.h" +#include "gpu_regs.h" +#include "palette.h" + +// sprites start at 10000 and thus must be subtracted of 10000 to account for the true index. +#define GET_TRUE_SPRITE_INDEX(i) ((i - 10000)) +#define SCRIPT_READ_32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) +#define SCRIPT_READ_32_(ptr) (((ptr)[0]) + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) +#define SCRIPT_READ_16(ptr) ((ptr)[0] | ((ptr)[1] << 8)) +#define SCRIPT_READ_16_(ptr) ((ptr)[0] + ((ptr)[1] << 8)) + +#define ANIM_SPRITE_INDEX_COUNT 8 +#define ANIM_ARGS_COUNT 8 + +extern u8 gBankAttacker; +extern u8 gBankTarget; +extern u16 gBattle_WIN0H; +extern u16 gBattle_WIN0V; +extern u16 gBattle_WIN1H; +extern u16 gBattle_WIN1V; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG2_X; +extern u16 gBattle_BG2_Y; +extern u16 gBattlePartyID[BATTLE_BANKS_COUNT]; +extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT]; +extern struct MusicPlayerInfo gMPlay_BGM; +extern struct MusicPlayerInfo gMPlay_SE1; +extern struct MusicPlayerInfo gMPlay_SE2; + +EWRAM_DATA const u8 *gBattleAnimScriptPtr = NULL; +EWRAM_DATA const u8 *gBattleAnimScriptRetAddr = NULL; +EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL; +EWRAM_DATA s8 gAnimFramesToWait = 0; +EWRAM_DATA bool8 gAnimScriptActive = FALSE; +EWRAM_DATA u8 gAnimVisualTaskCount = 0; +EWRAM_DATA u8 gAnimSoundTaskCount = 0; +EWRAM_DATA struct DisableStruct *gAnimDisableStructPtr = NULL; +EWRAM_DATA u32 gAnimMoveDmg = 0; +EWRAM_DATA u16 gAnimMovePower = 0; +EWRAM_DATA u16 gAnimSpriteIndexArray[ANIM_SPRITE_INDEX_COUNT] = {0}; +EWRAM_DATA u8 gAnimFriendship = 0; +EWRAM_DATA u16 gWeatherMoveAnim = 0; +EWRAM_DATA s16 gBattleAnimArgs[ANIM_ARGS_COUNT] = {0}; +EWRAM_DATA u16 gSoundAnimFramesToWait = 0; +EWRAM_DATA u8 gMonAnimTaskIdArray[2] = {0}; +EWRAM_DATA u8 gUnknown_02038432 = 0; +EWRAM_DATA u8 gUnknown_02038433 = 0; +EWRAM_DATA u16 gAnimMoveIndex = 0; // set but unused. +EWRAM_DATA u8 gAnimBankAttacker = 0; +EWRAM_DATA u8 gAnimBankTarget = 0; +EWRAM_DATA u16 gAnimSpeciesByBanks[BATTLE_BANKS_COUNT] = {0}; +EWRAM_DATA u8 gUnknown_02038440 = 0; + +extern void (* const sScriptCmdTable[])(void); +extern const u16 gUnknown_082C8D64[]; +extern const u8 * const gBattleAnims_Moves[]; +extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; +extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; + +extern void sub_80A8278(void); // rom_80A5C6C.s +extern void sub_80A6B30(struct UnknownAnimStruct2*); // rom_80A5C6C.s +extern void sub_80A6B90(struct UnknownAnimStruct2*, u32 arg1); // rom_80A5C6C.s +extern u8 sub_80A82E4(u8 bank); // rom_80A5C6C.s +extern u8 sub_80A5C6C(u8 bank, u8 attributeId); // rom_80A5C6C.s +extern bool8 AnimBankSpriteExists(u8 bank); // rom_80A5C6C.s + +// this file's functions +void RunAnimScriptCommand(void); +void task_pA_ma0A_obj_to_bg_pal(u8 taskId); +void sub_80A46A0(void); + +void ClearBattleAnimationVars(void) +{ + s32 i; + + gAnimFramesToWait = 0; + gAnimScriptActive = FALSE; + gAnimVisualTaskCount = 0; + gAnimSoundTaskCount = 0; + gAnimDisableStructPtr = NULL; + gAnimMoveDmg = 0; + gAnimMovePower = 0; + gAnimFriendship = 0; + + // clear index array. + for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) + gAnimSpriteIndexArray[i] |= 0xFFFF; + + // clear anim args. + for (i = 0; i < ANIM_ARGS_COUNT; i++) + gBattleAnimArgs[i] = 0; + + gMonAnimTaskIdArray[0] = 0xFF; + gMonAnimTaskIdArray[1] = 0xFF; + gUnknown_02038432 = 0; + gUnknown_02038433 = 0; + gAnimMoveIndex = 0; + gAnimBankAttacker = 0; + gAnimBankTarget = 0; + gUnknown_02038440 = 0; +} + +void DoMoveAnim(u16 move) +{ + gAnimBankAttacker = gBankAttacker; + gAnimBankTarget = gBankTarget; + DoBattleAnim(gBattleAnims_Moves, move, TRUE); +} + +void DoBattleAnim(const u8 *const animsTable[], u16 tableId, bool8 isMoveAnim) +{ + s32 i; + + if (!IsContest()) + { + sub_80A8278(); + sub_8072A88(0); + for (i = 0; i < BATTLE_BANKS_COUNT; i++) + { + if (GetBankSide(i) != 0) + gAnimSpeciesByBanks[i] = GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_SPECIES); + else + gAnimSpeciesByBanks[i] = GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_SPECIES); + } + } + else + { + for (i = 0; i < 4; i++) + gAnimSpeciesByBanks[i] = gContestResources->field_18->field_0; + } + + if (!isMoveAnim) + gAnimMoveIndex = 0; + else + gAnimMoveIndex = tableId; + + for (i = 0; i < ANIM_ARGS_COUNT; i++) + gBattleAnimArgs[i] = 0; + + gMonAnimTaskIdArray[0] = 0xFF; + gMonAnimTaskIdArray[1] = 0xFF; + gBattleAnimScriptPtr = animsTable[tableId]; + gAnimScriptActive = TRUE; + gAnimFramesToWait = 0; + gAnimScriptCallback = RunAnimScriptCommand; + + for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) + gAnimSpriteIndexArray[i] |= 0xFFFF; + + if (isMoveAnim) + { + for (i = 0; gUnknown_082C8D64[i] != 0xFFFF; i++) + { + if (tableId == gUnknown_082C8D64[i]) + { + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128); + break; + } + } + } + + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + gBattle_WIN1H = 0; + gBattle_WIN1V = 0; +} + +void DestroyAnimSprite(struct Sprite *sprite) +{ + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + gAnimVisualTaskCount--; +} + +void DestroyAnimVisualTask(u8 taskId) +{ + DestroyTask(taskId); + gAnimVisualTaskCount--; +} + +void DestroyAnimSoundTask(u8 taskId) +{ + DestroyTask(taskId); + gAnimSoundTaskCount--; +} + +/*static*/ void AddSpriteIndex(u16 index) +{ + s32 i; + + for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) + { + if (gAnimSpriteIndexArray[i] == 0xFFFF) + { + gAnimSpriteIndexArray[i] = index; + return; + } + } +} + +/*static*/ void ClearSpriteIndex(u16 index) +{ + s32 i; + + for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) + { + if (gAnimSpriteIndexArray[i] == index) + { + gAnimSpriteIndexArray[i] |= 0xFFFF; + return; + } + } +} + +/*static*/ void WaitAnimFrameCount(void) +{ + if (gAnimFramesToWait <= 0) + { + gAnimScriptCallback = RunAnimScriptCommand; + gAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait--; + } +} + +/*static*/ void RunAnimScriptCommand(void) +{ + do + { + sScriptCmdTable[gBattleAnimScriptPtr[0]](); + } while (gAnimFramesToWait == 0 && gAnimScriptActive); +} + +/*static*/ void ScriptCmd_loadspritegfx(void) +{ + u16 index; + + gBattleAnimScriptPtr++; + index = SCRIPT_READ_16(gBattleAnimScriptPtr); + LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]); + LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]); + gBattleAnimScriptPtr += 2; + AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); + gAnimFramesToWait = 1; + gAnimScriptCallback = WaitAnimFrameCount; +} + +/*static*/ void ScriptCmd_unloadspritegfx(void) +{ + u16 index; + + gBattleAnimScriptPtr++; + index = SCRIPT_READ_16(gBattleAnimScriptPtr); + FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); + FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); + gBattleAnimScriptPtr += 2; + ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); +} + +/*static*/ void ScriptCmd_createsprite(void) +{ + s32 i; + const struct SpriteTemplate *template; + u8 argVar; + u8 argsCount; + s16 subpriority; + + gBattleAnimScriptPtr++; + template = (const struct SpriteTemplate *)(SCRIPT_READ_32_(gBattleAnimScriptPtr)); + gBattleAnimScriptPtr += 4; + + argVar = gBattleAnimScriptPtr[0]; + gBattleAnimScriptPtr++; + + argsCount = gBattleAnimScriptPtr[0]; + gBattleAnimScriptPtr++; + for (i = 0; i < argsCount; i++) + { + gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); + gBattleAnimScriptPtr += 2; + } + + if (argVar & 0x80) + { + argVar ^= 0x80; + if (argVar >= 0x40) + argVar -= 0x40; + else + argVar *= -1; + + subpriority = sub_80A82E4(gAnimBankTarget) + (s8)(argVar); + } + else + { + if (argVar >= 0x40) + argVar -= 0x40; + else + argVar *= -1; + + subpriority = sub_80A82E4(gAnimBankAttacker) + (s8)(argVar); + } + + if (subpriority < 3) + subpriority = 3; + + CreateSpriteAndAnimate(template, sub_80A5C6C(gAnimBankTarget, 2), sub_80A5C6C(gAnimBankTarget, 3), subpriority); + gAnimVisualTaskCount++; +} + +/*static*/ void ScriptCmd_createvisualtask(void) +{ + TaskFunc taskFunc; + u8 taskPriority; + u8 taskId; + u8 numArgs; + s32 i; + + gBattleAnimScriptPtr++; + + taskFunc = (TaskFunc)SCRIPT_READ_32_(gBattleAnimScriptPtr); + gBattleAnimScriptPtr += 4; + + taskPriority = gBattleAnimScriptPtr[0]; + gBattleAnimScriptPtr++; + + numArgs = gBattleAnimScriptPtr[0]; + gBattleAnimScriptPtr++; + + for (i = 0; i < numArgs; i++) + { + gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); + gBattleAnimScriptPtr += 2; + } + + taskId = CreateTask(taskFunc, taskPriority); + taskFunc(taskId); + gAnimVisualTaskCount++; +} + +/*static*/ void ScriptCmd_delay(void) +{ + gBattleAnimScriptPtr++; + gAnimFramesToWait = gBattleAnimScriptPtr[0]; + if (gAnimFramesToWait == 0) + gAnimFramesToWait = -1; + gBattleAnimScriptPtr++; + gAnimScriptCallback = WaitAnimFrameCount; +} + +// wait for visual tasks to finish. +/*static*/ void ScriptCmd_waitforvisualfinish(void) +{ + if (gAnimVisualTaskCount == 0) + { + gBattleAnimScriptPtr++; + gAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait = 1; + } +} + +/*static*/ void ScriptCmd_hang1(void) +{ +} + +/*static*/ void ScriptCmd_hang2(void) +{ +} + +/*static*/ void ScriptCmd_end(void) +{ + s32 i; + bool32 continuousAnim = FALSE; + + // keep waiting as long as there is animations to be done. + if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0 + || gMonAnimTaskIdArray[0] != 0xFF || gMonAnimTaskIdArray[1] != 0xFF) + { + gSoundAnimFramesToWait = 0; + gAnimFramesToWait = 1; + return; + } + + // finish the sound effects. + if (IsSEPlaying()) + { + if (++gSoundAnimFramesToWait <= 90) // wait 90 frames, then halt the sound effect. + { + gAnimFramesToWait = 1; + return; + } + else + { + m4aMPlayStop(&gMPlay_SE1); + m4aMPlayStop(&gMPlay_SE2); + } + } + + // the SE has halted, so set the SE Frame Counter to 0 and continue. + gSoundAnimFramesToWait = 0; + + for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) + { + if (gAnimSpriteIndexArray[i] != 0xFFFF) + { + FreeSpriteTilesByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag); + FreeSpritePaletteByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag); + gAnimSpriteIndexArray[i] |= 0xFFFF; // set terminator. + } + } + + if (!continuousAnim) // may have been used for debug? + { + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); + if (!IsContest()) + { + sub_80A8278(); + sub_8072A88(1); + } + gAnimScriptActive = FALSE; + } +} + +/*static*/ void ScriptCmd_playse(void) +{ + gBattleAnimScriptPtr++; + PlaySE(SCRIPT_READ_16(gBattleAnimScriptPtr)); + gBattleAnimScriptPtr += 2; +} + +#define t1_MONBG_BANK 0 +#define t1_MON_IN_BG2 1 +#define t1_CREATE_ANOTHER_TASK 2 +#define t1_IS_SECONDMON_BG 3 + +#define t2_BANK_SPRITE_ID 0 +#define t2_MON_IN_BG2 5 +#define t2_MONBG_BANK 6 + +/*static*/ void sub_80A40F4(u8 taskId) +{ + u8 newTaskId; + + s16 *selfData = gTasks[taskId].data; + u8 bankSpriteId = gBankSpriteIds[selfData[t1_MONBG_BANK]]; + gSprites[bankSpriteId].invisible = 1; + + if (!selfData[t1_CREATE_ANOTHER_TASK]) + { + DestroyAnimVisualTask(taskId); + return; + } + + newTaskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10); + gTasks[newTaskId].data[t2_BANK_SPRITE_ID] = bankSpriteId; + gTasks[newTaskId].data[1] = gSprites[bankSpriteId].pos1.x + gSprites[bankSpriteId].pos2.x; + gTasks[newTaskId].data[2] = gSprites[bankSpriteId].pos1.y + gSprites[bankSpriteId].pos2.y; + + if (!selfData[t1_MON_IN_BG2]) + { + gTasks[newTaskId].data[3] = gBattle_BG1_X; + gTasks[newTaskId].data[4] = gBattle_BG1_Y; + } + else + { + gTasks[newTaskId].data[3] = gBattle_BG2_X; + gTasks[newTaskId].data[4] = gBattle_BG2_Y; + } + + gTasks[newTaskId].data[t2_MON_IN_BG2] = selfData[t1_MON_IN_BG2]; + gTasks[newTaskId].data[t2_MONBG_BANK] = selfData[t1_MONBG_BANK]; + gMonAnimTaskIdArray[selfData[t1_IS_SECONDMON_BG]] = newTaskId; + DestroyAnimVisualTask(taskId); +} + +/*static*/ void ScriptCmd_monbg(void) +{ + bool8 toBG_2; + u8 taskId; + u8 bank; + u8 animBank; + + gBattleAnimScriptPtr++; + + animBank = gBattleAnimScriptPtr[0]; + if (animBank & ANIM_BANK_TARGET) + bank = gAnimBankTarget; + else + bank = gAnimBankAttacker; + + if (IsAnimBankSpriteVisible(bank)) + { + u8 identity = GetBankIdentity(bank); + if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest()) + toBG_2 = FALSE; + else + toBG_2 = TRUE; + + sub_80A438C(bank, toBG_2, FALSE); + taskId = CreateTask(sub_80A40F4, 10); + gAnimVisualTaskCount++; + gTasks[taskId].data[t1_MONBG_BANK] = bank; + gTasks[taskId].data[t1_MON_IN_BG2] = toBG_2; + gTasks[taskId].data[t1_CREATE_ANOTHER_TASK] = TRUE; + gTasks[taskId].data[t1_IS_SECONDMON_BG] = 0; + + } + + bank ^= BIT_MON; + if (IsAnimBankSpriteVisible(bank)) + { + u8 identity = GetBankIdentity(bank); + if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest()) + toBG_2 = FALSE; + else + toBG_2 = TRUE; + + sub_80A438C(bank, toBG_2, FALSE); + taskId = CreateTask(sub_80A40F4, 10); + gAnimVisualTaskCount++; + gTasks[taskId].data[0] = bank; + gTasks[taskId].data[1] = toBG_2; + gTasks[taskId].data[t1_CREATE_ANOTHER_TASK] = TRUE; + gTasks[taskId].data[t1_IS_SECONDMON_BG] = 1; + } + + gBattleAnimScriptPtr++; + gAnimFramesToWait = 1; + gAnimScriptCallback = WaitAnimFrameCount; +} + +bool8 IsAnimBankSpriteVisible(u8 bank) +{ + if (IsContest()) + { + if (bank == gAnimBankAttacker) + return TRUE; + else + return FALSE; + } + if (!AnimBankSpriteExists(bank)) + return FALSE; + if (IsContest()) + return TRUE; // this line wont ever be reached. + if (!gBattleSpritesDataPtr->bankData[bank].invisible || !gSprites[gBankSpriteIds[bank]].invisible) + return TRUE; + + return FALSE; +} + +void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible) +{ + struct UnknownAnimStruct2 unknownStruct; + u8 bankSpriteId; + + if (!toBG_2) + { + u8 bankIdentity; + + if (IsContest() == TRUE) + { + RequestDma3Fill(0, (void*)(VRAM + 0x8000), 0x2000, 1); + RequestDma3Fill(0xFF, (void*)(VRAM + 0xF000), 0x1000, 0); + } + else + { + RequestDma3Fill(0, (void*)(VRAM + 0x4000), 0x2000, 1); + RequestDma3Fill(0xFF, (void*)(VRAM + 0xe000), 0x1000, 0); + } + + sub_80A6B30(&unknownStruct); + CpuFill16(0, unknownStruct.unk0, 0x1000); + CpuFill16(0xFF, unknownStruct.unk4, 0x800); + + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 2); + SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 1); + SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 0); + + bankSpriteId = gBankSpriteIds[bank]; + + gBattle_BG1_X = -(gSprites[bankSpriteId].pos1.x + gSprites[bankSpriteId].pos2.x) + 0x20; + if (IsContest() && IsSpeciesNotUnown(gContestResources->field_18->field_0)) + gBattle_BG1_X--; + + gBattle_BG1_Y = -(gSprites[bankSpriteId].pos1.y + gSprites[bankSpriteId].pos2.y) + 0x20; + if (setSpriteInvisible) + gSprites[gBankSpriteIds[bank]].invisible = 1; + + SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); + SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); + + LoadPalette(&gPlttBufferUnfaded[0x100 + bank * 16], unknownStruct.unk8 * 16, 0x20); + CpuCopy32(&gPlttBufferUnfaded[0x100 + bank * 16], (void*)(BG_PLTT + unknownStruct.unk8 * 32), 0x20); + + if (IsContest()) + bankIdentity = 0; + else + bankIdentity = GetBankIdentity(bank); + + sub_8118FBC(1, 0, 0, bankIdentity, unknownStruct.unk8, unknownStruct.unk0, unknownStruct.unk4, unknownStruct.unkA); + + if (IsContest()) + sub_80A46A0(); + } + else + { + RequestDma3Fill(0, (void*)(VRAM + 0x6000), 0x2000, 1); + RequestDma3Fill(0, (void*)(VRAM + 0xF000), 0x1000, 1); + sub_80A6B90(&unknownStruct, 2); + CpuFill16(0, unknownStruct.unk0 + 0x1000, 0x1000); + CpuFill16(0, unknownStruct.unk4 + 0x400, 0x800); + SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); + SetAnimBgAttribute(2, BG_ANIM_SCREEN_SIZE, 1); + SetAnimBgAttribute(2, BG_ANIM_AREA_OVERFLOW_MODE, 0); + + bankSpriteId = gBankSpriteIds[bank]; + + gBattle_BG2_X = -(gSprites[bankSpriteId].pos1.x + gSprites[bankSpriteId].pos2.x) + 0x20; + gBattle_BG2_Y = -(gSprites[bankSpriteId].pos1.y + gSprites[bankSpriteId].pos2.y) + 0x20; + + if (setSpriteInvisible) + gSprites[gBankSpriteIds[bank]].invisible = 1; + + SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X); + SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y); + + LoadPalette(&gPlttBufferUnfaded[0x100 + bank * 16], 0x90, 0x20); + CpuCopy32(&gPlttBufferUnfaded[0x100 + bank * 16], (void*)(BG_PLTT + 0x120), 0x20); + + sub_8118FBC(2, 0, 0, GetBankIdentity(bank), unknownStruct.unk8, unknownStruct.unk0 + 0x1000, unknownStruct.unk4 + 0x400, unknownStruct.unkA); + } +} + diff --git a/src/decompress.c b/src/decompress.c index 2863ff1f5..9210799ec 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -465,7 +465,7 @@ u32 sub_8034974(void* ptr) return (ptr_[3] << 16) | (ptr_[2] << 8) | (ptr_[1]); } -bool8 LoadCompressedObjectPicUsingHeap(struct CompressedSpriteSheet* src) +bool8 LoadCompressedObjectPicUsingHeap(const struct CompressedSpriteSheet* src) { struct SpriteSheet dest; void* buffer; diff --git a/src/sprite.c b/src/sprite.c index 17b0f181a..daa019019 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -594,7 +594,7 @@ u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, return index; } -u8 CreateSpriteAndAnimate(struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) +u8 CreateSpriteAndAnimate(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) { u8 i; -- cgit v1.2.3 From ebb2999c03e7f9291bf905d644ddc03991e4280e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Oct 2017 23:37:44 +0200 Subject: more of battle anim done --- src/battle_anim.c | 640 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 637 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/battle_anim.c b/src/battle_anim.c index 6c316157f..7a2b7902c 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -13,13 +13,18 @@ #include "bg.h" #include "gpu_regs.h" #include "palette.h" +#include "main.h" // sprites start at 10000 and thus must be subtracted of 10000 to account for the true index. #define GET_TRUE_SPRITE_INDEX(i) ((i - 10000)) + #define SCRIPT_READ_32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) -#define SCRIPT_READ_32_(ptr) (((ptr)[0]) + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) #define SCRIPT_READ_16(ptr) ((ptr)[0] | ((ptr)[1] << 8)) +#define SCRIPT_READ_PTR(ptr) ((const u8*)(SCRIPT_READ_32(ptr))) + #define SCRIPT_READ_16_(ptr) ((ptr)[0] + ((ptr)[1] << 8)) +#define SCRIPT_READ_32_(ptr) (((ptr)[0]) + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) +#define SCRIPT_READ_PTR_(ptr) ((const u8*)(SCRIPT_READ_32_(ptr))) #define ANIM_SPRITE_INDEX_COUNT 8 #define ANIM_ARGS_COUNT 8 @@ -56,7 +61,7 @@ EWRAM_DATA u16 gWeatherMoveAnim = 0; EWRAM_DATA s16 gBattleAnimArgs[ANIM_ARGS_COUNT] = {0}; EWRAM_DATA u16 gSoundAnimFramesToWait = 0; EWRAM_DATA u8 gMonAnimTaskIdArray[2] = {0}; -EWRAM_DATA u8 gUnknown_02038432 = 0; +EWRAM_DATA u8 gAnimMoveTurn = 0; EWRAM_DATA u8 gUnknown_02038433 = 0; EWRAM_DATA u16 gAnimMoveIndex = 0; // set but unused. EWRAM_DATA u8 gAnimBankAttacker = 0; @@ -69,6 +74,7 @@ extern const u16 gUnknown_082C8D64[]; extern const u8 * const gBattleAnims_Moves[]; extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; +extern const struct BattleAnimBackground gBattleAnimBackgroundTable[]; extern void sub_80A8278(void); // rom_80A5C6C.s extern void sub_80A6B30(struct UnknownAnimStruct2*); // rom_80A5C6C.s @@ -76,11 +82,18 @@ extern void sub_80A6B90(struct UnknownAnimStruct2*, u32 arg1); // rom_80A5C6C.s extern u8 sub_80A82E4(u8 bank); // rom_80A5C6C.s extern u8 sub_80A5C6C(u8 bank, u8 attributeId); // rom_80A5C6C.s extern bool8 AnimBankSpriteExists(u8 bank); // rom_80A5C6C.s +extern void sub_80A6C68(u8 arg0); // rom_80A5C6C.s +extern u8 sub_80A6D94(void); // this file's functions void RunAnimScriptCommand(void); void task_pA_ma0A_obj_to_bg_pal(u8 taskId); void sub_80A46A0(void); +void sub_80A4980(u8 taskId); +void sub_80A4BB0(u8 taskId); +void Task_FadeToBg(u8 taskId); +void LoadDefaultBg(void); +void LoadMoveBg(u16 bgId); void ClearBattleAnimationVars(void) { @@ -105,7 +118,7 @@ void ClearBattleAnimationVars(void) gMonAnimTaskIdArray[0] = 0xFF; gMonAnimTaskIdArray[1] = 0xFF; - gUnknown_02038432 = 0; + gAnimMoveTurn = 0; gUnknown_02038433 = 0; gAnimMoveIndex = 0; gAnimBankAttacker = 0; @@ -648,3 +661,624 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible) } } +/*static*/ void sub_80A46A0(void) +{ + s32 i, j; + struct UnknownAnimStruct2 unknownStruct; + u16 *ptr; + + if (IsSpeciesNotUnown(gContestResources->field_18->field_0)) + { + sub_80A6B30(&unknownStruct); + ptr = unknownStruct.unk4; + for (i = 0; i < 8; i++) + { + for (j = 0; j < 4; j++) + { + u16 temp = ptr[j + i * 32]; + + ptr[j + i * 32] = ptr[7 - j + i * 32]; + ptr[7 - j + i * 32] = temp; + } + } + for (i = 0; i < 8; i++) + { + for (j = 0; j < 8; j++) + ptr[j + i * 32] ^= 0x400; + } + } +} + +void sub_80A4720(u16 a, u16 *b, u32 c, u8 d) +{ + s32 i, j; + s32 var; + + if (d == 0) + var = 32; + else + var = 64; + a <<= 12; + for (i = 0; i < var; i++) + { + for (j = 0; j < 32; j++) + b[j + i * 32] = ((b[j + i * 32] & 0xFFF) | a) + c; + } +} + +void sub_80A477C(bool8 to_BG2) +{ + struct UnknownAnimStruct2 unknownStruct; + sub_80A6B30(&unknownStruct); + + if (!to_BG2 || IsContest()) + { + sub_80A6C68(1); + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + } + else + { + sub_80A6C68(2); + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + } +} + +/*static*/ void task_pA_ma0A_obj_to_bg_pal(u8 taskId) +{ + u8 r4; + u8 r6; + s16 r3; + s16 r2; + struct UnknownAnimStruct2 unknownStruct; + + r4 = gTasks[taskId].data[0]; + r6 = gTasks[taskId].data[6]; + sub_80A6B30(&unknownStruct); + r3 = gTasks[taskId].data[1] - (gSprites[r4].pos1.x + gSprites[r4].pos2.x); + r2 = gTasks[taskId].data[2] - (gSprites[r4].pos1.y + gSprites[r4].pos2.y); + + if (gTasks[taskId].data[5] == 0) + { + u16 *src; + u16 *dst; + + gBattle_BG1_X = r3 + gTasks[taskId].data[3]; + gBattle_BG1_Y = r2 + gTasks[taskId].data[4]; + src = gPlttBufferFaded + 0x100 + r6 * 16; + dst = gPlttBufferFaded + 0x100 + unknownStruct.unk8 * 16 - 256; + CpuCopy32(src, dst, 0x20); + } + else + { + u16 *src; + u16 *dst; + + gBattle_BG2_X = r3 + gTasks[taskId].data[3]; + gBattle_BG2_Y = r2 + gTasks[taskId].data[4]; + src = gPlttBufferFaded + 0x100 + r6 * 16; + dst = gPlttBufferFaded + 0x100 - 112; + CpuCopy32(src, dst, 0x20); + } +} + +/*static*/ void ScriptCmd_clearmonbg(void) +{ + u8 animBankId; + u8 bank; + u8 taskId; + + gBattleAnimScriptPtr++; + animBankId = gBattleAnimScriptPtr[0]; + + if (animBankId == ANIM_BANK_ATTACKER) + animBankId = ANIM_BANK_ATK_PARTNER; + else if (animBankId == ANIM_BANK_TARGET) + animBankId = ANIM_BANK_DEF_PARTNER; + + if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER) + bank = gAnimBankAttacker; + else + bank = gAnimBankTarget; + + if (gMonAnimTaskIdArray[0] != 0xFF) + gSprites[gBankSpriteIds[bank]].invisible = 0; + if (animBankId > 1 && gMonAnimTaskIdArray[1] != 0xFF) + gSprites[gBankSpriteIds[bank ^ BIT_MON]].invisible = 0; + else + animBankId = 0; + + taskId = CreateTask(sub_80A4980, 5); + gTasks[taskId].data[0] = animBankId; + gTasks[taskId].data[2] = bank; + + gBattleAnimScriptPtr++; +} + +/*static*/ void sub_80A4980(u8 taskId) +{ + gTasks[taskId].data[1]++; + if (gTasks[taskId].data[1] != 1) + { + u8 to_BG2; + u8 identity = GetBankIdentity(gTasks[taskId].data[2]); + if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest()) + to_BG2 = FALSE; + else + to_BG2 = TRUE; + + if (gMonAnimTaskIdArray[0] != 0xFF) + { + sub_80A477C(to_BG2); + DestroyTask(gMonAnimTaskIdArray[0]); + gMonAnimTaskIdArray[0] = 0xFF; + } + if (gTasks[taskId].data[0] > 1) + { + sub_80A477C(to_BG2 ^ 1); + DestroyTask(gMonAnimTaskIdArray[1]); + gMonAnimTaskIdArray[1] = 0xFF; + } + DestroyTask(taskId); + } +} + +/*static*/ void ScriptCmd_monbg_22(void) +{ + bool8 toBG_2; + u8 bank; + u8 animBankId; + + gBattleAnimScriptPtr++; + + animBankId = gBattleAnimScriptPtr[0]; + + if (animBankId == ANIM_BANK_ATTACKER) + animBankId = ANIM_BANK_ATK_PARTNER; + else if (animBankId == ANIM_BANK_TARGET) + animBankId = ANIM_BANK_DEF_PARTNER; + + if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER) + bank = gAnimBankAttacker; + else + bank = gAnimBankTarget; + + if (IsAnimBankSpriteVisible(bank)) + { + u8 identity = GetBankIdentity(bank); + if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest()) + toBG_2 = FALSE; + else + toBG_2 = TRUE; + + sub_80A438C(bank, toBG_2, FALSE); + } + + bank ^= BIT_MON; + if (animBankId > 1 && IsAnimBankSpriteVisible(bank)) + { + u8 identity = GetBankIdentity(bank); + if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest()) + toBG_2 = FALSE; + else + toBG_2 = TRUE; + + sub_80A438C(bank, toBG_2, FALSE); + } + + gBattleAnimScriptPtr++; +} + +/*static*/ void ScriptCmd_clearmonbg_23(void) +{ + u8 animBankId; + u8 bank; + u8 taskId; + + gBattleAnimScriptPtr++; + animBankId = gBattleAnimScriptPtr[0]; + + if (animBankId == ANIM_BANK_ATTACKER) + animBankId = ANIM_BANK_ATK_PARTNER; + else if (animBankId == ANIM_BANK_TARGET) + animBankId = ANIM_BANK_DEF_PARTNER; + + if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER) + bank = gAnimBankAttacker; + else + bank = gAnimBankTarget; + + if (IsAnimBankSpriteVisible(bank)) + gSprites[gBankSpriteIds[bank]].invisible = 0; + if (animBankId > 1 && IsAnimBankSpriteVisible(bank ^ BIT_MON)) + gSprites[gBankSpriteIds[bank ^ BIT_MON]].invisible = 0; + else + animBankId = 0; + + taskId = CreateTask(sub_80A4BB0, 5); + gTasks[taskId].data[0] = animBankId; + gTasks[taskId].data[2] = bank; + + gBattleAnimScriptPtr++; +} + +/*static*/ void sub_80A4BB0(u8 taskId) +{ + gTasks[taskId].data[1]++; + if (gTasks[taskId].data[1] != 1) + { + bool8 toBG_2; + u8 bank = gTasks[taskId].data[2]; + u8 identity = GetBankIdentity(bank); + if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest()) + toBG_2 = FALSE; + else + toBG_2 = TRUE; + + if (IsAnimBankSpriteVisible(bank)) + sub_80A477C(toBG_2); + if (gTasks[taskId].data[0] > 1 && IsAnimBankSpriteVisible(bank ^ BIT_MON)) + sub_80A477C(toBG_2 ^ 1); + + DestroyTask(taskId); + } +} + +#undef t1_MONBG_BANK +#undef t1_MON_IN_BG2 +#undef t1_CREATE_ANOTHER_TASK +#undef t1_IS_SECONDMON_BG + +#undef t2_BANK_SPRITE_ID +#undef t2_MON_IN_BG2 +#undef t2_MONBG_BANK + +/*static*/ void ScriptCmd_setalpha(void) +{ + u16 half1, half2; + + gBattleAnimScriptPtr++; + half1 = *(gBattleAnimScriptPtr++); + half2 = *(gBattleAnimScriptPtr++) << 8; + SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40); + SetGpuReg(REG_OFFSET_BLDALPHA, half1 | half2); +} + +/*static*/ void ScriptCmd_setbldcnt(void) +{ + u16 half1, half2; + + gBattleAnimScriptPtr++; + half1 = *(gBattleAnimScriptPtr++); + half2 = *(gBattleAnimScriptPtr++) << 8; + SetGpuReg(REG_OFFSET_BLDCNT, half1 | half2); +} + +/*static*/ void ScriptCmd_blendoff(void) +{ + gBattleAnimScriptPtr++; + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); +} + +/*static*/ void ScriptCmd_call(void) +{ + gBattleAnimScriptPtr++; + gBattleAnimScriptRetAddr = gBattleAnimScriptPtr + 4; + gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); +} + +/*static*/ void ScriptCmd_return(void) +{ + gBattleAnimScriptPtr = gBattleAnimScriptRetAddr; +} + +/*static*/ void ScriptCmd_setarg(void) +{ + const u8 *addr = gBattleAnimScriptPtr; + u16 value; + u8 argId; + + gBattleAnimScriptPtr++; + argId = gBattleAnimScriptPtr[0]; + gBattleAnimScriptPtr++; + value = SCRIPT_READ_16(gBattleAnimScriptPtr); + gBattleAnimScriptPtr = addr + 4; + gBattleAnimArgs[argId] = value; +} + +/*static*/ void ScriptCmd_choosetwoturnanim(void) +{ + gBattleAnimScriptPtr++; + if (gAnimMoveTurn & 1) + gBattleAnimScriptPtr += 4; + gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); +} + +/*static*/ void ScriptCmd_jumpifmoveturn(void) +{ + u8 toCheck; + gBattleAnimScriptPtr++; + toCheck = gBattleAnimScriptPtr[0]; + gBattleAnimScriptPtr++; + + if (toCheck == gAnimMoveTurn) + gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); + else + gBattleAnimScriptPtr += 4; +} + +/*static*/ void ScriptCmd_jump(void) +{ + gBattleAnimScriptPtr++; + gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); +} + +// Uses of this function that rely on a TRUE return are expecting inBattle to not be ticked as defined in contest behavior. As a result, if misused, this function cannot reliably discern between field and contest status and could result in undefined behavior. +bool8 IsContest(void) +{ + if (!gMain.inBattle) + return TRUE; + else + return FALSE; +} + +#define tBackgroundId data[0] +#define tState data[10] + +/*static*/ void ScriptCmd_fadetobg(void) +{ + u8 backgroundId; + u8 taskId; + + gBattleAnimScriptPtr++; + backgroundId = gBattleAnimScriptPtr[0]; + gBattleAnimScriptPtr++; + taskId = CreateTask(Task_FadeToBg, 5); + gTasks[taskId].tBackgroundId = backgroundId; + gUnknown_02038433 = 1; +} + +/*static*/ void ScriptCmd_fadetobgfromset(void) +{ + u8 bg1, bg2, bg3; + u8 taskId; + + gBattleAnimScriptPtr++; + bg1 = gBattleAnimScriptPtr[0]; + bg2 = gBattleAnimScriptPtr[1]; + bg3 = gBattleAnimScriptPtr[2]; + gBattleAnimScriptPtr += 3; + taskId = CreateTask(Task_FadeToBg, 5); + + if (IsContest()) + gTasks[taskId].tBackgroundId = bg3; + else if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER) + gTasks[taskId].tBackgroundId = bg2; + else + gTasks[taskId].tBackgroundId = bg1; + + gUnknown_02038433 = 1; +} + +/*static*/ void Task_FadeToBg(u8 taskId) +{ + if (gTasks[taskId].tState == 0) + { + BeginHardwarePaletteFade(0xE8, 0, 0, 16, 0); + gTasks[taskId].tState++; + return; + } + if (gPaletteFade.active) + return; + if (gTasks[taskId].tState == 1) + { + gTasks[taskId].tState++; + gUnknown_02038433 = 2; + } + else if (gTasks[taskId].tState == 2) + { + s16 bgId = (u16)gTasks[taskId].tBackgroundId; + + if (bgId == -1) + LoadDefaultBg(); + else + LoadMoveBg(bgId); + + BeginHardwarePaletteFade(0xE8, 0, 16, 0, 1); + gTasks[taskId].tState++; + return; + } + if (gPaletteFade.active) + return; + if (gTasks[taskId].tState == 3) + { + DestroyTask(taskId); + gUnknown_02038433 = 0; + } +} + +extern u8 gDecompressionBuffer[]; + +/*static*/ void LoadMoveBg(u16 bgId) +{ + if (IsContest()) + { + void *tilemap = gBattleAnimBackgroundTable[bgId].tilemap; + void *dmaSrc; + void *dmaDest; + + LZDecompressWram(tilemap, gDecompressionBuffer); + sub_80A4720(sub_80A6D94(), (void*)(gDecompressionBuffer), 0x100, 0); + dmaSrc = gDecompressionBuffer; + dmaDest = (void *)(VRAM + 0xD000); + DmaCopy32(3, dmaSrc, dmaDest, 0x800); + LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)(VRAM + 0x2000)); + LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, sub_80A6D94() * 16, 32); + } + else + { + LZDecompressVram(gBattleAnimBackgroundTable[bgId].tilemap, (void *)(VRAM + 0xD000)); + LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)(VRAM + 0x8000)); + LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, 32, 32); + } +} + +/*static*/ void LoadDefaultBg(void) +{ + if (IsContest()) + LoadContestBgAfterMoveAnim(); + else + LoadFittingBackgroundForBattle(); +} + +/*static*/ void ScriptCmd_restorebg(void) +{ + u8 taskId; + + gBattleAnimScriptPtr++; + taskId = CreateTask(Task_FadeToBg, 5); + gTasks[taskId].data[0] = 0xFFFF; + gUnknown_02038433 = 1; +} + +/*static*/ void ScriptCmd_waitbgfadeout(void) +{ + if (gUnknown_02038433 == 2) + { + gBattleAnimScriptPtr++; + gAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait = 1; + } +} + +/*static*/ void ScriptCmd_waitbgfadein(void) +{ + if (gUnknown_02038433 == 0) + { + gBattleAnimScriptPtr++; + gAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait = 1; + } +} + +/*static*/ void ScriptCmd_changebg(void) +{ + gBattleAnimScriptPtr++; + LoadMoveBg(gBattleAnimScriptPtr[0]); + gBattleAnimScriptPtr++; +} + +s8 BattleAnimAdjustPanning(s8 pan) +{ + if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].flag_x10) + { + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + pan = 63; + else + pan = -64; + } + else if (IsContest()) + { + if (gAnimBankAttacker != gAnimBankTarget || gAnimBankAttacker != 2 || pan != 63) + pan *= -1; + } + else if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER) + { + if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER) + { + if (pan == 63) + pan = -64; + else if (pan != -64) + pan *= -1; + } + } + else if (GetBankSide(gAnimBankTarget) == SIDE_OPPONENT) + { + if (pan == -64) + pan = 63; + } + else + { + pan *= -1; + } + + if (pan > 63) + pan = 63; + else if (pan < -64) + pan = -64; + + return pan; +} + +s8 BattleAnimAdjustPanning2(s8 pan) +{ + if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].flag_x10) + { + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + pan = 63; + else + pan = -64; + } + else + { + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER || IsContest()) + pan = -pan; + } + return pan; +} + +s16 sub_80A52EC(s16 a) +{ + s16 var = a; + + if (var > 63) + var = 63; + else if (var < -64) + var = -64; + + return var; +} + +s16 sub_80A5314(s16 a, s16 b, s16 c) +{ + u16 var; + + if (a < b) + var = ((c < 0) ? -c : c); + else if (a > b) + var = -((c < 0) ? -c : c); + else + var = 0; + + return var; +} + +/*static*/ void ScriptCmd_playsewithpan(void) +{ + u16 songId; + s8 pan; + + gBattleAnimScriptPtr++; + songId = SCRIPT_READ_16(gBattleAnimScriptPtr); + pan = gBattleAnimScriptPtr[2]; + PlaySE12WithPanning(songId, BattleAnimAdjustPanning(pan)); + gBattleAnimScriptPtr += 3; +} + +/*static*/ void ScriptCmd_setpan(void) +{ + s8 pan; + + gBattleAnimScriptPtr++; + pan = gBattleAnimScriptPtr[0]; + SE12PanpotControl(BattleAnimAdjustPanning(pan)); + gBattleAnimScriptPtr++; +} -- cgit v1.2.3 From dd0f19476c3a15514e3d08855cee3266fdbdf2ed Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 15 Oct 2017 23:21:59 +0200 Subject: battle anim file is decompiled --- src/battle_anim.c | 1018 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 793 insertions(+), 225 deletions(-) (limited to 'src') diff --git a/src/battle_anim.c b/src/battle_anim.c index 7a2b7902c..13b74a84a 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -18,16 +18,11 @@ // sprites start at 10000 and thus must be subtracted of 10000 to account for the true index. #define GET_TRUE_SPRITE_INDEX(i) ((i - 10000)) -#define SCRIPT_READ_32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) #define SCRIPT_READ_16(ptr) ((ptr)[0] | ((ptr)[1] << 8)) +#define SCRIPT_READ_32(ptr) (((ptr)[0]) + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) #define SCRIPT_READ_PTR(ptr) ((const u8*)(SCRIPT_READ_32(ptr))) -#define SCRIPT_READ_16_(ptr) ((ptr)[0] + ((ptr)[1] << 8)) -#define SCRIPT_READ_32_(ptr) (((ptr)[0]) + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) -#define SCRIPT_READ_PTR_(ptr) ((const u8*)(SCRIPT_READ_32_(ptr))) - #define ANIM_SPRITE_INDEX_COUNT 8 -#define ANIM_ARGS_COUNT 8 extern u8 gBankAttacker; extern u8 gBankTarget; @@ -44,32 +39,8 @@ extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT]; extern struct MusicPlayerInfo gMPlay_BGM; extern struct MusicPlayerInfo gMPlay_SE1; extern struct MusicPlayerInfo gMPlay_SE2; +extern u8 gDecompressionBuffer[]; -EWRAM_DATA const u8 *gBattleAnimScriptPtr = NULL; -EWRAM_DATA const u8 *gBattleAnimScriptRetAddr = NULL; -EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL; -EWRAM_DATA s8 gAnimFramesToWait = 0; -EWRAM_DATA bool8 gAnimScriptActive = FALSE; -EWRAM_DATA u8 gAnimVisualTaskCount = 0; -EWRAM_DATA u8 gAnimSoundTaskCount = 0; -EWRAM_DATA struct DisableStruct *gAnimDisableStructPtr = NULL; -EWRAM_DATA u32 gAnimMoveDmg = 0; -EWRAM_DATA u16 gAnimMovePower = 0; -EWRAM_DATA u16 gAnimSpriteIndexArray[ANIM_SPRITE_INDEX_COUNT] = {0}; -EWRAM_DATA u8 gAnimFriendship = 0; -EWRAM_DATA u16 gWeatherMoveAnim = 0; -EWRAM_DATA s16 gBattleAnimArgs[ANIM_ARGS_COUNT] = {0}; -EWRAM_DATA u16 gSoundAnimFramesToWait = 0; -EWRAM_DATA u8 gMonAnimTaskIdArray[2] = {0}; -EWRAM_DATA u8 gAnimMoveTurn = 0; -EWRAM_DATA u8 gUnknown_02038433 = 0; -EWRAM_DATA u16 gAnimMoveIndex = 0; // set but unused. -EWRAM_DATA u8 gAnimBankAttacker = 0; -EWRAM_DATA u8 gAnimBankTarget = 0; -EWRAM_DATA u16 gAnimSpeciesByBanks[BATTLE_BANKS_COUNT] = {0}; -EWRAM_DATA u8 gUnknown_02038440 = 0; - -extern void (* const sScriptCmdTable[])(void); extern const u16 gUnknown_082C8D64[]; extern const u8 * const gBattleAnims_Moves[]; extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; @@ -83,17 +54,150 @@ extern u8 sub_80A82E4(u8 bank); // rom_80A5C6C.s extern u8 sub_80A5C6C(u8 bank, u8 attributeId); // rom_80A5C6C.s extern bool8 AnimBankSpriteExists(u8 bank); // rom_80A5C6C.s extern void sub_80A6C68(u8 arg0); // rom_80A5C6C.s +extern u8 GetAnimBankSpriteId(u8 wantedBank); // rom_80A5C6C.s extern u8 sub_80A6D94(void); +extern u8 sub_80A8364(u8); +extern bool8 IsDoubleBattle(void); // this file's functions -void RunAnimScriptCommand(void); -void task_pA_ma0A_obj_to_bg_pal(u8 taskId); -void sub_80A46A0(void); -void sub_80A4980(u8 taskId); -void sub_80A4BB0(u8 taskId); -void Task_FadeToBg(u8 taskId); -void LoadDefaultBg(void); -void LoadMoveBg(u16 bgId); +static void ScriptCmd_loadspritegfx(void); +static void ScriptCmd_unloadspritegfx(void); +static void ScriptCmd_createsprite(void); +static void ScriptCmd_createvisualtask(void); +static void ScriptCmd_delay(void); +static void ScriptCmd_waitforvisualfinish(void); +static void ScriptCmd_hang1(void); +static void ScriptCmd_hang2(void); +static void ScriptCmd_end(void); +static void ScriptCmd_playse(void); +static void ScriptCmd_monbg(void); +static void ScriptCmd_clearmonbg(void); +static void ScriptCmd_setalpha(void); +static void ScriptCmd_blendoff(void); +static void ScriptCmd_call(void); +static void ScriptCmd_return(void); +static void ScriptCmd_setarg(void); +static void ScriptCmd_choosetwoturnanim(void); +static void ScriptCmd_jumpifmoveturn(void); +static void ScriptCmd_jump(void); +static void ScriptCmd_fadetobg(void); +static void ScriptCmd_restorebg(void); +static void ScriptCmd_waitbgfadeout(void); +static void ScriptCmd_waitbgfadein(void); +static void ScriptCmd_changebg(void); +static void ScriptCmd_playsewithpan(void); +static void ScriptCmd_setpan(void); +static void ScriptCmd_panse_1B(void); +static void ScriptCmd_loopsewithpan(void); +static void ScriptCmd_waitplaysewithpan(void); +static void ScriptCmd_setbldcnt(void); +static void ScriptCmd_createsoundtask(void); +static void ScriptCmd_waitsound(void); +static void ScriptCmd_jumpargeq(void); +static void ScriptCmd_monbg_22(void); +static void ScriptCmd_clearmonbg_23(void); +static void ScriptCmd_jumpifcontest(void); +static void ScriptCmd_fadetobgfromset(void); +static void ScriptCmd_panse_26(void); +static void ScriptCmd_panse_27(void); +static void ScriptCmd_monbgprio_28(void); +static void ScriptCmd_monbgprio_29(void); +static void ScriptCmd_monbgprio_2A(void); +static void ScriptCmd_invisible(void); +static void ScriptCmd_visible(void); +static void ScriptCmd_doublebattle_2D(void); +static void ScriptCmd_doublebattle_2E(void); +static void ScriptCmd_stopsound(void); + +static void RunAnimScriptCommand(void); +static void task_pA_ma0A_obj_to_bg_pal(u8 taskId); +static void sub_80A46A0(void); +static void sub_80A4980(u8 taskId); +static void sub_80A4BB0(u8 taskId); +static void Task_FadeToBg(u8 taskId); +static void Task_PanFromInitialToTarget(u8 taskId); +static void Task_LoopAndPlaySE(u8 taskId); +static void Task_WaitAndPlaySE(u8 taskId); +static void LoadDefaultBg(void); +static void LoadMoveBg(u16 bgId); + +// ewram +EWRAM_DATA static const u8 *sBattleAnimScriptPtr = NULL; +EWRAM_DATA static const u8 *sBattleAnimScriptRetAddr = NULL; +EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL; +EWRAM_DATA static s8 gAnimFramesToWait = 0; +EWRAM_DATA bool8 gAnimScriptActive = FALSE; +EWRAM_DATA u8 gAnimVisualTaskCount = 0; +EWRAM_DATA u8 gAnimSoundTaskCount = 0; +EWRAM_DATA struct DisableStruct *gAnimDisableStructPtr = NULL; +EWRAM_DATA u32 gAnimMoveDmg = 0; +EWRAM_DATA u16 gAnimMovePower = 0; +EWRAM_DATA static u16 sAnimSpriteIndexArray[ANIM_SPRITE_INDEX_COUNT] = {0}; +EWRAM_DATA u8 gAnimFriendship = 0; +EWRAM_DATA u16 gWeatherMoveAnim = 0; +EWRAM_DATA s16 gBattleAnimArgs[ANIM_ARGS_COUNT] = {0}; +EWRAM_DATA static u16 sSoundAnimFramesToWait = 0; +EWRAM_DATA static u8 sMonAnimTaskIdArray[2] = {0}; +EWRAM_DATA u8 gAnimMoveTurn = 0; +EWRAM_DATA static u8 sAnimBackgroundFadeState = 0; +EWRAM_DATA static u16 sAnimMoveIndex = 0; // set but unused. +EWRAM_DATA u8 gAnimBankAttacker = 0; +EWRAM_DATA u8 gAnimBankTarget = 0; +EWRAM_DATA u16 gAnimSpeciesByBanks[BATTLE_BANKS_COUNT] = {0}; +EWRAM_DATA u8 gUnknown_02038440 = 0; + +// const rom data +static void (* const sScriptCmdTable[])(void) = +{ + ScriptCmd_loadspritegfx, + ScriptCmd_unloadspritegfx, + ScriptCmd_createsprite, + ScriptCmd_createvisualtask, + ScriptCmd_delay, + ScriptCmd_waitforvisualfinish, + ScriptCmd_hang1, + ScriptCmd_hang2, + ScriptCmd_end, + ScriptCmd_playse, + ScriptCmd_monbg, + ScriptCmd_clearmonbg, + ScriptCmd_setalpha, + ScriptCmd_blendoff, + ScriptCmd_call, + ScriptCmd_return, + ScriptCmd_setarg, + ScriptCmd_choosetwoturnanim, + ScriptCmd_jumpifmoveturn, + ScriptCmd_jump, + ScriptCmd_fadetobg, + ScriptCmd_restorebg, + ScriptCmd_waitbgfadeout, + ScriptCmd_waitbgfadein, + ScriptCmd_changebg, + ScriptCmd_playsewithpan, + ScriptCmd_setpan, + ScriptCmd_panse_1B, + ScriptCmd_loopsewithpan, + ScriptCmd_waitplaysewithpan, + ScriptCmd_setbldcnt, + ScriptCmd_createsoundtask, + ScriptCmd_waitsound, + ScriptCmd_jumpargeq, + ScriptCmd_monbg_22, + ScriptCmd_clearmonbg_23, + ScriptCmd_jumpifcontest, + ScriptCmd_fadetobgfromset, + ScriptCmd_panse_26, + ScriptCmd_panse_27, + ScriptCmd_monbgprio_28, + ScriptCmd_monbgprio_29, + ScriptCmd_monbgprio_2A, + ScriptCmd_invisible, + ScriptCmd_visible, + ScriptCmd_doublebattle_2D, + ScriptCmd_doublebattle_2E, + ScriptCmd_stopsound +}; void ClearBattleAnimationVars(void) { @@ -110,17 +214,17 @@ void ClearBattleAnimationVars(void) // clear index array. for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) - gAnimSpriteIndexArray[i] |= 0xFFFF; + sAnimSpriteIndexArray[i] |= 0xFFFF; // clear anim args. for (i = 0; i < ANIM_ARGS_COUNT; i++) gBattleAnimArgs[i] = 0; - gMonAnimTaskIdArray[0] = 0xFF; - gMonAnimTaskIdArray[1] = 0xFF; + sMonAnimTaskIdArray[0] = 0xFF; + sMonAnimTaskIdArray[1] = 0xFF; gAnimMoveTurn = 0; - gUnknown_02038433 = 0; - gAnimMoveIndex = 0; + sAnimBackgroundFadeState = 0; + sAnimMoveIndex = 0; gAnimBankAttacker = 0; gAnimBankTarget = 0; gUnknown_02038440 = 0; @@ -156,22 +260,22 @@ void DoBattleAnim(const u8 *const animsTable[], u16 tableId, bool8 isMoveAnim) } if (!isMoveAnim) - gAnimMoveIndex = 0; + sAnimMoveIndex = 0; else - gAnimMoveIndex = tableId; + sAnimMoveIndex = tableId; for (i = 0; i < ANIM_ARGS_COUNT; i++) gBattleAnimArgs[i] = 0; - gMonAnimTaskIdArray[0] = 0xFF; - gMonAnimTaskIdArray[1] = 0xFF; - gBattleAnimScriptPtr = animsTable[tableId]; + sMonAnimTaskIdArray[0] = 0xFF; + sMonAnimTaskIdArray[1] = 0xFF; + sBattleAnimScriptPtr = animsTable[tableId]; gAnimScriptActive = TRUE; gAnimFramesToWait = 0; gAnimScriptCallback = RunAnimScriptCommand; for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) - gAnimSpriteIndexArray[i] |= 0xFFFF; + sAnimSpriteIndexArray[i] |= 0xFFFF; if (isMoveAnim) { @@ -210,35 +314,35 @@ void DestroyAnimSoundTask(u8 taskId) gAnimSoundTaskCount--; } -/*static*/ void AddSpriteIndex(u16 index) +static void AddSpriteIndex(u16 index) { s32 i; for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) { - if (gAnimSpriteIndexArray[i] == 0xFFFF) + if (sAnimSpriteIndexArray[i] == 0xFFFF) { - gAnimSpriteIndexArray[i] = index; + sAnimSpriteIndexArray[i] = index; return; } } } -/*static*/ void ClearSpriteIndex(u16 index) +static void ClearSpriteIndex(u16 index) { s32 i; for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) { - if (gAnimSpriteIndexArray[i] == index) + if (sAnimSpriteIndexArray[i] == index) { - gAnimSpriteIndexArray[i] |= 0xFFFF; + sAnimSpriteIndexArray[i] |= 0xFFFF; return; } } } -/*static*/ void WaitAnimFrameCount(void) +static void WaitAnimFrameCount(void) { if (gAnimFramesToWait <= 0) { @@ -251,41 +355,41 @@ void DestroyAnimSoundTask(u8 taskId) } } -/*static*/ void RunAnimScriptCommand(void) +static void RunAnimScriptCommand(void) { do { - sScriptCmdTable[gBattleAnimScriptPtr[0]](); + sScriptCmdTable[sBattleAnimScriptPtr[0]](); } while (gAnimFramesToWait == 0 && gAnimScriptActive); } -/*static*/ void ScriptCmd_loadspritegfx(void) +static void ScriptCmd_loadspritegfx(void) { u16 index; - gBattleAnimScriptPtr++; - index = SCRIPT_READ_16(gBattleAnimScriptPtr); + sBattleAnimScriptPtr++; + index = SCRIPT_READ_16(sBattleAnimScriptPtr); LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]); LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]); - gBattleAnimScriptPtr += 2; + sBattleAnimScriptPtr += 2; AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); gAnimFramesToWait = 1; gAnimScriptCallback = WaitAnimFrameCount; } -/*static*/ void ScriptCmd_unloadspritegfx(void) +static void ScriptCmd_unloadspritegfx(void) { u16 index; - gBattleAnimScriptPtr++; - index = SCRIPT_READ_16(gBattleAnimScriptPtr); + sBattleAnimScriptPtr++; + index = SCRIPT_READ_16(sBattleAnimScriptPtr); FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); - gBattleAnimScriptPtr += 2; + sBattleAnimScriptPtr += 2; ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); } -/*static*/ void ScriptCmd_createsprite(void) +static void ScriptCmd_createsprite(void) { s32 i; const struct SpriteTemplate *template; @@ -293,19 +397,19 @@ void DestroyAnimSoundTask(u8 taskId) u8 argsCount; s16 subpriority; - gBattleAnimScriptPtr++; - template = (const struct SpriteTemplate *)(SCRIPT_READ_32_(gBattleAnimScriptPtr)); - gBattleAnimScriptPtr += 4; + sBattleAnimScriptPtr++; + template = (const struct SpriteTemplate *)(SCRIPT_READ_32(sBattleAnimScriptPtr)); + sBattleAnimScriptPtr += 4; - argVar = gBattleAnimScriptPtr[0]; - gBattleAnimScriptPtr++; + argVar = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; - argsCount = gBattleAnimScriptPtr[0]; - gBattleAnimScriptPtr++; + argsCount = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; for (i = 0; i < argsCount; i++) { - gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); - gBattleAnimScriptPtr += 2; + gBattleAnimArgs[i] = SCRIPT_READ_16(sBattleAnimScriptPtr); + sBattleAnimScriptPtr += 2; } if (argVar & 0x80) @@ -335,7 +439,7 @@ void DestroyAnimSoundTask(u8 taskId) gAnimVisualTaskCount++; } -/*static*/ void ScriptCmd_createvisualtask(void) +static void ScriptCmd_createvisualtask(void) { TaskFunc taskFunc; u8 taskPriority; @@ -343,21 +447,21 @@ void DestroyAnimSoundTask(u8 taskId) u8 numArgs; s32 i; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; - taskFunc = (TaskFunc)SCRIPT_READ_32_(gBattleAnimScriptPtr); - gBattleAnimScriptPtr += 4; + taskFunc = (TaskFunc)SCRIPT_READ_32(sBattleAnimScriptPtr); + sBattleAnimScriptPtr += 4; - taskPriority = gBattleAnimScriptPtr[0]; - gBattleAnimScriptPtr++; + taskPriority = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; - numArgs = gBattleAnimScriptPtr[0]; - gBattleAnimScriptPtr++; + numArgs = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; for (i = 0; i < numArgs; i++) { - gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); - gBattleAnimScriptPtr += 2; + gBattleAnimArgs[i] = SCRIPT_READ_16(sBattleAnimScriptPtr); + sBattleAnimScriptPtr += 2; } taskId = CreateTask(taskFunc, taskPriority); @@ -365,22 +469,22 @@ void DestroyAnimSoundTask(u8 taskId) gAnimVisualTaskCount++; } -/*static*/ void ScriptCmd_delay(void) +static void ScriptCmd_delay(void) { - gBattleAnimScriptPtr++; - gAnimFramesToWait = gBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; + gAnimFramesToWait = sBattleAnimScriptPtr[0]; if (gAnimFramesToWait == 0) gAnimFramesToWait = -1; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; gAnimScriptCallback = WaitAnimFrameCount; } // wait for visual tasks to finish. -/*static*/ void ScriptCmd_waitforvisualfinish(void) +static void ScriptCmd_waitforvisualfinish(void) { if (gAnimVisualTaskCount == 0) { - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; gAnimFramesToWait = 0; } else @@ -389,24 +493,24 @@ void DestroyAnimSoundTask(u8 taskId) } } -/*static*/ void ScriptCmd_hang1(void) +static void ScriptCmd_hang1(void) { } -/*static*/ void ScriptCmd_hang2(void) +static void ScriptCmd_hang2(void) { } -/*static*/ void ScriptCmd_end(void) +static void ScriptCmd_end(void) { s32 i; bool32 continuousAnim = FALSE; // keep waiting as long as there is animations to be done. if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0 - || gMonAnimTaskIdArray[0] != 0xFF || gMonAnimTaskIdArray[1] != 0xFF) + || sMonAnimTaskIdArray[0] != 0xFF || sMonAnimTaskIdArray[1] != 0xFF) { - gSoundAnimFramesToWait = 0; + sSoundAnimFramesToWait = 0; gAnimFramesToWait = 1; return; } @@ -414,7 +518,7 @@ void DestroyAnimSoundTask(u8 taskId) // finish the sound effects. if (IsSEPlaying()) { - if (++gSoundAnimFramesToWait <= 90) // wait 90 frames, then halt the sound effect. + if (++sSoundAnimFramesToWait <= 90) // wait 90 frames, then halt the sound effect. { gAnimFramesToWait = 1; return; @@ -427,15 +531,15 @@ void DestroyAnimSoundTask(u8 taskId) } // the SE has halted, so set the SE Frame Counter to 0 and continue. - gSoundAnimFramesToWait = 0; + sSoundAnimFramesToWait = 0; for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) { - if (gAnimSpriteIndexArray[i] != 0xFFFF) + if (sAnimSpriteIndexArray[i] != 0xFFFF) { - FreeSpriteTilesByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag); - FreeSpritePaletteByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag); - gAnimSpriteIndexArray[i] |= 0xFFFF; // set terminator. + FreeSpriteTilesByTag(gBattleAnimPicTable[sAnimSpriteIndexArray[i]].tag); + FreeSpritePaletteByTag(gBattleAnimPicTable[sAnimSpriteIndexArray[i]].tag); + sAnimSpriteIndexArray[i] |= 0xFFFF; // set terminator. } } @@ -451,11 +555,11 @@ void DestroyAnimSoundTask(u8 taskId) } } -/*static*/ void ScriptCmd_playse(void) +static void ScriptCmd_playse(void) { - gBattleAnimScriptPtr++; - PlaySE(SCRIPT_READ_16(gBattleAnimScriptPtr)); - gBattleAnimScriptPtr += 2; + sBattleAnimScriptPtr++; + PlaySE(SCRIPT_READ_16(sBattleAnimScriptPtr)); + sBattleAnimScriptPtr += 2; } #define t1_MONBG_BANK 0 @@ -467,7 +571,7 @@ void DestroyAnimSoundTask(u8 taskId) #define t2_MON_IN_BG2 5 #define t2_MONBG_BANK 6 -/*static*/ void sub_80A40F4(u8 taskId) +static void sub_80A40F4(u8 taskId) { u8 newTaskId; @@ -499,20 +603,20 @@ void DestroyAnimSoundTask(u8 taskId) gTasks[newTaskId].data[t2_MON_IN_BG2] = selfData[t1_MON_IN_BG2]; gTasks[newTaskId].data[t2_MONBG_BANK] = selfData[t1_MONBG_BANK]; - gMonAnimTaskIdArray[selfData[t1_IS_SECONDMON_BG]] = newTaskId; + sMonAnimTaskIdArray[selfData[t1_IS_SECONDMON_BG]] = newTaskId; DestroyAnimVisualTask(taskId); } -/*static*/ void ScriptCmd_monbg(void) +static void ScriptCmd_monbg(void) { bool8 toBG_2; u8 taskId; u8 bank; u8 animBank; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; - animBank = gBattleAnimScriptPtr[0]; + animBank = sBattleAnimScriptPtr[0]; if (animBank & ANIM_BANK_TARGET) bank = gAnimBankTarget; else @@ -554,7 +658,7 @@ void DestroyAnimSoundTask(u8 taskId) gTasks[taskId].data[t1_IS_SECONDMON_BG] = 1; } - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; gAnimFramesToWait = 1; gAnimScriptCallback = WaitAnimFrameCount; } @@ -661,7 +765,7 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible) } } -/*static*/ void sub_80A46A0(void) +static void sub_80A46A0(void) { s32 i, j; struct UnknownAnimStruct2 unknownStruct; @@ -725,7 +829,7 @@ void sub_80A477C(bool8 to_BG2) } } -/*static*/ void task_pA_ma0A_obj_to_bg_pal(u8 taskId) +static void task_pA_ma0A_obj_to_bg_pal(u8 taskId) { u8 r4; u8 r6; @@ -763,14 +867,14 @@ void sub_80A477C(bool8 to_BG2) } } -/*static*/ void ScriptCmd_clearmonbg(void) +static void ScriptCmd_clearmonbg(void) { u8 animBankId; u8 bank; u8 taskId; - gBattleAnimScriptPtr++; - animBankId = gBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; + animBankId = sBattleAnimScriptPtr[0]; if (animBankId == ANIM_BANK_ATTACKER) animBankId = ANIM_BANK_ATK_PARTNER; @@ -782,9 +886,9 @@ void sub_80A477C(bool8 to_BG2) else bank = gAnimBankTarget; - if (gMonAnimTaskIdArray[0] != 0xFF) + if (sMonAnimTaskIdArray[0] != 0xFF) gSprites[gBankSpriteIds[bank]].invisible = 0; - if (animBankId > 1 && gMonAnimTaskIdArray[1] != 0xFF) + if (animBankId > 1 && sMonAnimTaskIdArray[1] != 0xFF) gSprites[gBankSpriteIds[bank ^ BIT_MON]].invisible = 0; else animBankId = 0; @@ -793,10 +897,10 @@ void sub_80A477C(bool8 to_BG2) gTasks[taskId].data[0] = animBankId; gTasks[taskId].data[2] = bank; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; } -/*static*/ void sub_80A4980(u8 taskId) +static void sub_80A4980(u8 taskId) { gTasks[taskId].data[1]++; if (gTasks[taskId].data[1] != 1) @@ -808,31 +912,31 @@ void sub_80A477C(bool8 to_BG2) else to_BG2 = TRUE; - if (gMonAnimTaskIdArray[0] != 0xFF) + if (sMonAnimTaskIdArray[0] != 0xFF) { sub_80A477C(to_BG2); - DestroyTask(gMonAnimTaskIdArray[0]); - gMonAnimTaskIdArray[0] = 0xFF; + DestroyTask(sMonAnimTaskIdArray[0]); + sMonAnimTaskIdArray[0] = 0xFF; } if (gTasks[taskId].data[0] > 1) { sub_80A477C(to_BG2 ^ 1); - DestroyTask(gMonAnimTaskIdArray[1]); - gMonAnimTaskIdArray[1] = 0xFF; + DestroyTask(sMonAnimTaskIdArray[1]); + sMonAnimTaskIdArray[1] = 0xFF; } DestroyTask(taskId); } } -/*static*/ void ScriptCmd_monbg_22(void) +static void ScriptCmd_monbg_22(void) { bool8 toBG_2; u8 bank; u8 animBankId; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; - animBankId = gBattleAnimScriptPtr[0]; + animBankId = sBattleAnimScriptPtr[0]; if (animBankId == ANIM_BANK_ATTACKER) animBankId = ANIM_BANK_ATK_PARTNER; @@ -867,17 +971,17 @@ void sub_80A477C(bool8 to_BG2) sub_80A438C(bank, toBG_2, FALSE); } - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; } -/*static*/ void ScriptCmd_clearmonbg_23(void) +static void ScriptCmd_clearmonbg_23(void) { u8 animBankId; u8 bank; u8 taskId; - gBattleAnimScriptPtr++; - animBankId = gBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; + animBankId = sBattleAnimScriptPtr[0]; if (animBankId == ANIM_BANK_ATTACKER) animBankId = ANIM_BANK_ATK_PARTNER; @@ -900,10 +1004,10 @@ void sub_80A477C(bool8 to_BG2) gTasks[taskId].data[0] = animBankId; gTasks[taskId].data[2] = bank; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; } -/*static*/ void sub_80A4BB0(u8 taskId) +static void sub_80A4BB0(u8 taskId) { gTasks[taskId].data[1]++; if (gTasks[taskId].data[1] != 1) @@ -934,85 +1038,85 @@ void sub_80A477C(bool8 to_BG2) #undef t2_MON_IN_BG2 #undef t2_MONBG_BANK -/*static*/ void ScriptCmd_setalpha(void) +static void ScriptCmd_setalpha(void) { u16 half1, half2; - gBattleAnimScriptPtr++; - half1 = *(gBattleAnimScriptPtr++); - half2 = *(gBattleAnimScriptPtr++) << 8; + sBattleAnimScriptPtr++; + half1 = *(sBattleAnimScriptPtr++); + half2 = *(sBattleAnimScriptPtr++) << 8; SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40); SetGpuReg(REG_OFFSET_BLDALPHA, half1 | half2); } -/*static*/ void ScriptCmd_setbldcnt(void) +static void ScriptCmd_setbldcnt(void) { u16 half1, half2; - gBattleAnimScriptPtr++; - half1 = *(gBattleAnimScriptPtr++); - half2 = *(gBattleAnimScriptPtr++) << 8; + sBattleAnimScriptPtr++; + half1 = *(sBattleAnimScriptPtr++); + half2 = *(sBattleAnimScriptPtr++) << 8; SetGpuReg(REG_OFFSET_BLDCNT, half1 | half2); } -/*static*/ void ScriptCmd_blendoff(void) +static void ScriptCmd_blendoff(void) { - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); } -/*static*/ void ScriptCmd_call(void) +static void ScriptCmd_call(void) { - gBattleAnimScriptPtr++; - gBattleAnimScriptRetAddr = gBattleAnimScriptPtr + 4; - gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); + sBattleAnimScriptPtr++; + sBattleAnimScriptRetAddr = sBattleAnimScriptPtr + 4; + sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr); } -/*static*/ void ScriptCmd_return(void) +static void ScriptCmd_return(void) { - gBattleAnimScriptPtr = gBattleAnimScriptRetAddr; + sBattleAnimScriptPtr = sBattleAnimScriptRetAddr; } -/*static*/ void ScriptCmd_setarg(void) +static void ScriptCmd_setarg(void) { - const u8 *addr = gBattleAnimScriptPtr; + const u8 *addr = sBattleAnimScriptPtr; u16 value; u8 argId; - gBattleAnimScriptPtr++; - argId = gBattleAnimScriptPtr[0]; - gBattleAnimScriptPtr++; - value = SCRIPT_READ_16(gBattleAnimScriptPtr); - gBattleAnimScriptPtr = addr + 4; + sBattleAnimScriptPtr++; + argId = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; + value = SCRIPT_READ_16(sBattleAnimScriptPtr); + sBattleAnimScriptPtr = addr + 4; gBattleAnimArgs[argId] = value; } -/*static*/ void ScriptCmd_choosetwoturnanim(void) +static void ScriptCmd_choosetwoturnanim(void) { - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; if (gAnimMoveTurn & 1) - gBattleAnimScriptPtr += 4; - gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); + sBattleAnimScriptPtr += 4; + sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr); } -/*static*/ void ScriptCmd_jumpifmoveturn(void) +static void ScriptCmd_jumpifmoveturn(void) { u8 toCheck; - gBattleAnimScriptPtr++; - toCheck = gBattleAnimScriptPtr[0]; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; + toCheck = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; if (toCheck == gAnimMoveTurn) - gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); + sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr); else - gBattleAnimScriptPtr += 4; + sBattleAnimScriptPtr += 4; } -/*static*/ void ScriptCmd_jump(void) +static void ScriptCmd_jump(void) { - gBattleAnimScriptPtr++; - gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); + sBattleAnimScriptPtr++; + sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr); } // Uses of this function that rely on a TRUE return are expecting inBattle to not be ticked as defined in contest behavior. As a result, if misused, this function cannot reliably discern between field and contest status and could result in undefined behavior. @@ -1027,29 +1131,29 @@ bool8 IsContest(void) #define tBackgroundId data[0] #define tState data[10] -/*static*/ void ScriptCmd_fadetobg(void) +static void ScriptCmd_fadetobg(void) { u8 backgroundId; u8 taskId; - gBattleAnimScriptPtr++; - backgroundId = gBattleAnimScriptPtr[0]; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; + backgroundId = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; taskId = CreateTask(Task_FadeToBg, 5); gTasks[taskId].tBackgroundId = backgroundId; - gUnknown_02038433 = 1; + sAnimBackgroundFadeState = 1; } -/*static*/ void ScriptCmd_fadetobgfromset(void) +static void ScriptCmd_fadetobgfromset(void) { u8 bg1, bg2, bg3; u8 taskId; - gBattleAnimScriptPtr++; - bg1 = gBattleAnimScriptPtr[0]; - bg2 = gBattleAnimScriptPtr[1]; - bg3 = gBattleAnimScriptPtr[2]; - gBattleAnimScriptPtr += 3; + sBattleAnimScriptPtr++; + bg1 = sBattleAnimScriptPtr[0]; + bg2 = sBattleAnimScriptPtr[1]; + bg3 = sBattleAnimScriptPtr[2]; + sBattleAnimScriptPtr += 3; taskId = CreateTask(Task_FadeToBg, 5); if (IsContest()) @@ -1059,10 +1163,10 @@ bool8 IsContest(void) else gTasks[taskId].tBackgroundId = bg1; - gUnknown_02038433 = 1; + sAnimBackgroundFadeState = 1; } -/*static*/ void Task_FadeToBg(u8 taskId) +static void Task_FadeToBg(u8 taskId) { if (gTasks[taskId].tState == 0) { @@ -1075,11 +1179,11 @@ bool8 IsContest(void) if (gTasks[taskId].tState == 1) { gTasks[taskId].tState++; - gUnknown_02038433 = 2; + sAnimBackgroundFadeState = 2; } else if (gTasks[taskId].tState == 2) { - s16 bgId = (u16)gTasks[taskId].tBackgroundId; + s16 bgId = gTasks[taskId].tBackgroundId; if (bgId == -1) LoadDefaultBg(); @@ -1095,17 +1199,15 @@ bool8 IsContest(void) if (gTasks[taskId].tState == 3) { DestroyTask(taskId); - gUnknown_02038433 = 0; + sAnimBackgroundFadeState = 0; } } -extern u8 gDecompressionBuffer[]; - -/*static*/ void LoadMoveBg(u16 bgId) +static void LoadMoveBg(u16 bgId) { if (IsContest()) { - void *tilemap = gBattleAnimBackgroundTable[bgId].tilemap; + const void *tilemap = gBattleAnimBackgroundTable[bgId].tilemap; void *dmaSrc; void *dmaDest; @@ -1125,7 +1227,7 @@ extern u8 gDecompressionBuffer[]; } } -/*static*/ void LoadDefaultBg(void) +static void LoadDefaultBg(void) { if (IsContest()) LoadContestBgAfterMoveAnim(); @@ -1133,21 +1235,24 @@ extern u8 gDecompressionBuffer[]; LoadFittingBackgroundForBattle(); } -/*static*/ void ScriptCmd_restorebg(void) +static void ScriptCmd_restorebg(void) { u8 taskId; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; taskId = CreateTask(Task_FadeToBg, 5); - gTasks[taskId].data[0] = 0xFFFF; - gUnknown_02038433 = 1; + gTasks[taskId].tBackgroundId = -1; + sAnimBackgroundFadeState = 1; } -/*static*/ void ScriptCmd_waitbgfadeout(void) +#undef tBackgroundId +#undef tState + +static void ScriptCmd_waitbgfadeout(void) { - if (gUnknown_02038433 == 2) + if (sAnimBackgroundFadeState == 2) { - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; gAnimFramesToWait = 0; } else @@ -1156,11 +1261,11 @@ extern u8 gDecompressionBuffer[]; } } -/*static*/ void ScriptCmd_waitbgfadein(void) +static void ScriptCmd_waitbgfadein(void) { - if (gUnknown_02038433 == 0) + if (sAnimBackgroundFadeState == 0) { - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; gAnimFramesToWait = 0; } else @@ -1169,11 +1274,11 @@ extern u8 gDecompressionBuffer[]; } } -/*static*/ void ScriptCmd_changebg(void) +static void ScriptCmd_changebg(void) { - gBattleAnimScriptPtr++; - LoadMoveBg(gBattleAnimScriptPtr[0]); - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; + LoadMoveBg(sBattleAnimScriptPtr[0]); + sBattleAnimScriptPtr++; } s8 BattleAnimAdjustPanning(s8 pan) @@ -1247,38 +1352,501 @@ s16 sub_80A52EC(s16 a) return var; } -s16 sub_80A5314(s16 a, s16 b, s16 c) +s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan) { - u16 var; + s16 ret; - if (a < b) - var = ((c < 0) ? -c : c); - else if (a > b) - var = -((c < 0) ? -c : c); + if (sourcePan < targetPan) + ret = ((incrementPan < 0) ? -incrementPan : incrementPan); + else if (sourcePan > targetPan) + ret = -((incrementPan < 0) ? -incrementPan : incrementPan); else - var = 0; + ret = 0; - return var; + return ret; } -/*static*/ void ScriptCmd_playsewithpan(void) +static void ScriptCmd_playsewithpan(void) { u16 songId; s8 pan; - gBattleAnimScriptPtr++; - songId = SCRIPT_READ_16(gBattleAnimScriptPtr); - pan = gBattleAnimScriptPtr[2]; + sBattleAnimScriptPtr++; + songId = SCRIPT_READ_16(sBattleAnimScriptPtr); + pan = sBattleAnimScriptPtr[2]; PlaySE12WithPanning(songId, BattleAnimAdjustPanning(pan)); - gBattleAnimScriptPtr += 3; + sBattleAnimScriptPtr += 3; } -/*static*/ void ScriptCmd_setpan(void) +static void ScriptCmd_setpan(void) { s8 pan; - gBattleAnimScriptPtr++; - pan = gBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; + pan = sBattleAnimScriptPtr[0]; SE12PanpotControl(BattleAnimAdjustPanning(pan)); - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; +} + +#define tInitialPan data[0] +#define tTargetPan data[1] +#define tIncrementPan data[2] +#define tFramesToWait data[3] +#define tCurrentPan data[4] +#define tFrameCounter data[8] + +static void ScriptCmd_panse_1B(void) +{ + u16 songNum; + s8 currentPanArg, incrementPan, incrementPanArg, currentPan, targetPan; + u8 framesToWait; + u8 taskId; + + sBattleAnimScriptPtr++; + songNum = SCRIPT_READ_16(sBattleAnimScriptPtr); + currentPanArg = sBattleAnimScriptPtr[2]; + incrementPan = sBattleAnimScriptPtr[3]; + incrementPanArg = sBattleAnimScriptPtr[4]; + framesToWait = sBattleAnimScriptPtr[5]; + + currentPan = BattleAnimAdjustPanning(currentPanArg); + targetPan = BattleAnimAdjustPanning(incrementPan); + incrementPan = CalculatePanIncrement(currentPan, targetPan, incrementPanArg); + taskId = CreateTask(Task_PanFromInitialToTarget, 1); + gTasks[taskId].tInitialPan = currentPan; + gTasks[taskId].tTargetPan = targetPan; + gTasks[taskId].tIncrementPan = incrementPan; + gTasks[taskId].tFramesToWait = framesToWait; + gTasks[taskId].tCurrentPan = currentPan; + + PlaySE12WithPanning(songNum, currentPan); + + gAnimSoundTaskCount++; + sBattleAnimScriptPtr += 6; +} + +void Task_PanFromInitialToTarget(u8 taskId) +{ + bool32 destroyTask = FALSE; + if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tFramesToWait) + { + s16 pan; + s16 initialPanning, targetPanning, currentPan, incrementPan; + + gTasks[taskId].tFrameCounter = 0; + initialPanning = gTasks[taskId].tInitialPan; + targetPanning = gTasks[taskId].tTargetPan; + currentPan = gTasks[taskId].tCurrentPan; + incrementPan = gTasks[taskId].tIncrementPan; + pan = currentPan + incrementPan; + gTasks[taskId].tCurrentPan = pan; + + if (incrementPan == 0) // If we're not incrementing, just cancel the task immediately + { + destroyTask = TRUE; + } + else if (initialPanning < targetPanning) // Panning increasing + { + if (pan >= targetPanning) // Target reached + destroyTask = TRUE; + } + else // Panning decreasing + { + if (pan <= targetPanning) // Target reached + destroyTask = TRUE; + } + + if (destroyTask) + { + pan = targetPanning; + DestroyTask(taskId); + gAnimSoundTaskCount--; + } + + SE12PanpotControl(pan); + } +} + +static void ScriptCmd_panse_26(void) +{ + u16 songId; + s8 currentPan, targetPan, incrementPan; + u8 framesToWait; + u8 taskId; + + sBattleAnimScriptPtr++; + songId = SCRIPT_READ_16(sBattleAnimScriptPtr); + currentPan = sBattleAnimScriptPtr[2]; + targetPan = sBattleAnimScriptPtr[3]; + incrementPan = sBattleAnimScriptPtr[4]; + framesToWait = sBattleAnimScriptPtr[5]; + + taskId = CreateTask(Task_PanFromInitialToTarget, 1); + gTasks[taskId].tInitialPan = currentPan; + gTasks[taskId].tTargetPan = targetPan; + gTasks[taskId].tIncrementPan = incrementPan; + gTasks[taskId].tFramesToWait = framesToWait; + gTasks[taskId].tCurrentPan = currentPan; + + PlaySE12WithPanning(songId, currentPan); + + gAnimSoundTaskCount++; + sBattleAnimScriptPtr += 6; +} + +static void ScriptCmd_panse_27(void) +{ + u16 songId; + s8 targetPanArg, incrementPanArg, currentPanArg, currentPan, targetPan, incrementPan; + u8 framesToWait; + u8 taskId; + + sBattleAnimScriptPtr++; + songId = SCRIPT_READ_16(sBattleAnimScriptPtr); + currentPanArg = sBattleAnimScriptPtr[2]; + targetPanArg = sBattleAnimScriptPtr[3]; + incrementPanArg = sBattleAnimScriptPtr[4]; + framesToWait = sBattleAnimScriptPtr[5]; + + currentPan = BattleAnimAdjustPanning2(currentPanArg); + targetPan = BattleAnimAdjustPanning2(targetPanArg); + incrementPan = BattleAnimAdjustPanning2(incrementPanArg); + + taskId = CreateTask(Task_PanFromInitialToTarget, 1); + gTasks[taskId].tInitialPan = currentPan; + gTasks[taskId].tTargetPan = targetPan; + gTasks[taskId].tIncrementPan = incrementPan; + gTasks[taskId].tFramesToWait = framesToWait; + gTasks[taskId].tCurrentPan = currentPan; + + PlaySE12WithPanning(songId, currentPan); + + gAnimSoundTaskCount++; + sBattleAnimScriptPtr += 6; +} + +#undef tInitialPan +#undef tTargetPan +#undef tIncrementPan +#undef tFramesToWait +#undef tCurrentPan +#undef tFrameCounter + +#define tSongId data[0] +#define tPanning data[1] +#define tFramesToWait data[2] +#define tNumberOfPlays data[3] +#define tFrameCounter data[8] + +static void ScriptCmd_loopsewithpan(void) +{ + u16 songId; + s8 panningArg, panning; + u8 framesToWait, numberOfPlays; + u8 taskId; + + sBattleAnimScriptPtr++; + songId = SCRIPT_READ_16(sBattleAnimScriptPtr); + panningArg = sBattleAnimScriptPtr[2]; + framesToWait = sBattleAnimScriptPtr[3]; + numberOfPlays = sBattleAnimScriptPtr[4]; + panning = BattleAnimAdjustPanning(panningArg); + + taskId = CreateTask(Task_LoopAndPlaySE, 1); + gTasks[taskId].tSongId = songId; + gTasks[taskId].tPanning = panning; + gTasks[taskId].tFramesToWait = framesToWait; + gTasks[taskId].tNumberOfPlays = numberOfPlays; + gTasks[taskId].tFrameCounter = framesToWait; + gTasks[taskId].func(taskId); + + gAnimSoundTaskCount++; + sBattleAnimScriptPtr += 5; +} + +static void Task_LoopAndPlaySE(u8 taskId) +{ + if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tFramesToWait) + { + u16 songId; + s8 panning; + u8 numberOfPlays; + + gTasks[taskId].tFrameCounter = 0; + songId = gTasks[taskId].tSongId; + panning = gTasks[taskId].tPanning; + numberOfPlays = --gTasks[taskId].tNumberOfPlays; + PlaySE12WithPanning(songId, panning); + if (numberOfPlays == 0) + { + DestroyTask(taskId); + gAnimSoundTaskCount--; + } + } +} + +#undef tSongId +#undef tPanning +#undef tFramesToWait +#undef tNumberOfPlays +#undef tFrameCounter + +#define tSongId data[0] +#define tPanning data[1] +#define tFramesToWait data[2] + +static void ScriptCmd_waitplaysewithpan(void) +{ + u16 songId; + s8 panningArg, panning; + u8 framesToWait; + u8 taskId; + + sBattleAnimScriptPtr++; + songId = SCRIPT_READ_16(sBattleAnimScriptPtr); + panningArg = sBattleAnimScriptPtr[2]; + framesToWait = sBattleAnimScriptPtr[3]; + panning = BattleAnimAdjustPanning(panningArg); + + taskId = CreateTask(Task_WaitAndPlaySE, 1); + gTasks[taskId].tSongId = songId; + gTasks[taskId].tPanning = panning; + gTasks[taskId].tFramesToWait = framesToWait; + + gAnimSoundTaskCount++; + sBattleAnimScriptPtr += 4; +} + +static void Task_WaitAndPlaySE(u8 taskId) +{ + if (gTasks[taskId].tFramesToWait-- <= 0) + { + PlaySE12WithPanning(gTasks[taskId].tSongId, gTasks[taskId].tPanning); + DestroyTask(taskId); + gAnimSoundTaskCount--; + } +} + +#undef tSongId +#undef tPanning +#undef tFramesToWait + +static void ScriptCmd_createsoundtask(void) +{ + TaskFunc func; + u8 numArgs, taskId; + s32 i; + + sBattleAnimScriptPtr++; + func = (TaskFunc)SCRIPT_READ_32(sBattleAnimScriptPtr); + sBattleAnimScriptPtr += 4; + numArgs = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; + for (i = 0; i < numArgs; i++) + { + gBattleAnimArgs[i] = SCRIPT_READ_16(sBattleAnimScriptPtr); + sBattleAnimScriptPtr += 2; + } + taskId = CreateTask(func, 1); + func(taskId); + gAnimSoundTaskCount++; +} + +static void ScriptCmd_waitsound(void) +{ + if (gAnimSoundTaskCount != 0) + { + sSoundAnimFramesToWait = 0; + gAnimFramesToWait = 1; + } + else if (IsSEPlaying()) + { + if (++sSoundAnimFramesToWait > 90) + { + m4aMPlayStop(&gMPlay_SE1); + m4aMPlayStop(&gMPlay_SE2); + sSoundAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait = 1; + } + } + else + { + sSoundAnimFramesToWait = 0; + sBattleAnimScriptPtr++; + gAnimFramesToWait = 0; + } +} + +static void ScriptCmd_jumpargeq(void) +{ + u8 argId; + s16 valueToCheck; + + sBattleAnimScriptPtr++; + argId = sBattleAnimScriptPtr[0]; + valueToCheck = SCRIPT_READ_16(sBattleAnimScriptPtr + 1); + + if (valueToCheck == gBattleAnimArgs[argId]) + sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr + 3); + else + sBattleAnimScriptPtr += 7; +} + +static void ScriptCmd_jumpifcontest(void) +{ + sBattleAnimScriptPtr++; + if (IsContest()) + sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr); + else + sBattleAnimScriptPtr += 4; +} + +static void ScriptCmd_monbgprio_28(void) +{ + u8 wantedBank; + u8 bank; + u8 bankIdentity; + + wantedBank = sBattleAnimScriptPtr[1]; + sBattleAnimScriptPtr += 2; + + if (wantedBank != ANIM_BANK_ATTACKER) + bank = gAnimBankTarget; + else + bank = gAnimBankAttacker; + + bankIdentity = GetBankIdentity(bank); + if (!IsContest() && (bankIdentity == IDENTITY_PLAYER_MON1 || bankIdentity == IDENTITY_OPPONENT_MON2)) + { + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); + SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); + } +} + +static void ScriptCmd_monbgprio_29(void) +{ + sBattleAnimScriptPtr++; + if (!IsContest()) + { + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); + SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); + } +} + +static void ScriptCmd_monbgprio_2A(void) +{ + u8 wantedBank; + u8 bankIdentity; + u8 bank; + + wantedBank = sBattleAnimScriptPtr[1]; + sBattleAnimScriptPtr += 2; + if (GetBankSide(gAnimBankAttacker) != GetBankSide(gAnimBankTarget)) + { + if (wantedBank != ANIM_BANK_ATTACKER) + bank = gAnimBankTarget; + else + bank = gAnimBankAttacker; + + bankIdentity = GetBankIdentity(bank); + if (!IsContest() && (bankIdentity == IDENTITY_PLAYER_MON1 || bankIdentity == IDENTITY_OPPONENT_MON2)) + { + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); + SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); + } + } +} + +static void ScriptCmd_invisible(void) +{ + u8 spriteId; + + spriteId = GetAnimBankSpriteId(sBattleAnimScriptPtr[1]); + if (spriteId != 0xFF) + gSprites[spriteId].invisible = 1; + + sBattleAnimScriptPtr += 2; +} + +static void ScriptCmd_visible(void) +{ + u8 spriteId; + + spriteId = GetAnimBankSpriteId(sBattleAnimScriptPtr[1]); + if (spriteId != 0xFF) + gSprites[spriteId].invisible = 0; + + sBattleAnimScriptPtr += 2; +} + +static void ScriptCmd_doublebattle_2D(void) +{ + u8 wantedBank; + u8 r4; + u8 spriteId; + + wantedBank = sBattleAnimScriptPtr[1]; + sBattleAnimScriptPtr += 2; + if (!IsContest() && IsDoubleBattle() + && GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget)) + { + if (wantedBank == ANIM_BANK_ATTACKER) + { + r4 = sub_80A8364(gAnimBankAttacker); + spriteId = GetAnimBankSpriteId(0); + } + else + { + r4 = sub_80A8364(gAnimBankTarget); + spriteId = GetAnimBankSpriteId(1); + } + if (spriteId != 0xFF) + { + gSprites[spriteId].invisible = FALSE; + if (r4 == 2) + gSprites[spriteId].oam.priority = 3; + + if (r4 == 1) + sub_80A477C(FALSE); + else + sub_80A477C(TRUE); + } + } +} + +static void ScriptCmd_doublebattle_2E(void) +{ + u8 wantedBank; + u8 r4; + u8 spriteId; + + wantedBank = sBattleAnimScriptPtr[1]; + sBattleAnimScriptPtr += 2; + if (!IsContest() && IsDoubleBattle() + && GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget)) + { + if (wantedBank == ANIM_BANK_ATTACKER) + { + r4 = sub_80A8364(gAnimBankAttacker); + spriteId = GetAnimBankSpriteId(0); + } + else + { + r4 = sub_80A8364(gAnimBankTarget); + spriteId = GetAnimBankSpriteId(1); + } + + if (spriteId != 0xFF && r4 == 2) + gSprites[spriteId].oam.priority = 2; + } +} + +static void ScriptCmd_stopsound(void) +{ + m4aMPlayStop(&gMPlay_SE1); + m4aMPlayStop(&gMPlay_SE2); + sBattleAnimScriptPtr++; } -- cgit v1.2.3 From 36035518dcd36c915b8b8f3461881ea813933454 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 20 Oct 2017 00:01:17 +0200 Subject: review battle anim changes --- src/battle_anim.c | 56 +++++++++++++++++++++++++++---------------------------- 1 file changed, 27 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/battle_anim.c b/src/battle_anim.c index 13b74a84a..8b858f34a 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -831,26 +831,24 @@ void sub_80A477C(bool8 to_BG2) static void task_pA_ma0A_obj_to_bg_pal(u8 taskId) { - u8 r4; - u8 r6; - s16 r3; - s16 r2; + u8 spriteId, palIndex; + s16 x, y; struct UnknownAnimStruct2 unknownStruct; - r4 = gTasks[taskId].data[0]; - r6 = gTasks[taskId].data[6]; + spriteId = gTasks[taskId].data[0]; + palIndex = gTasks[taskId].data[6]; sub_80A6B30(&unknownStruct); - r3 = gTasks[taskId].data[1] - (gSprites[r4].pos1.x + gSprites[r4].pos2.x); - r2 = gTasks[taskId].data[2] - (gSprites[r4].pos1.y + gSprites[r4].pos2.y); + x = gTasks[taskId].data[1] - (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x); + y = gTasks[taskId].data[2] - (gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y); if (gTasks[taskId].data[5] == 0) { u16 *src; u16 *dst; - gBattle_BG1_X = r3 + gTasks[taskId].data[3]; - gBattle_BG1_Y = r2 + gTasks[taskId].data[4]; - src = gPlttBufferFaded + 0x100 + r6 * 16; + gBattle_BG1_X = x + gTasks[taskId].data[3]; + gBattle_BG1_Y = y + gTasks[taskId].data[4]; + src = gPlttBufferFaded + 0x100 + palIndex * 16; dst = gPlttBufferFaded + 0x100 + unknownStruct.unk8 * 16 - 256; CpuCopy32(src, dst, 0x20); } @@ -859,9 +857,9 @@ static void task_pA_ma0A_obj_to_bg_pal(u8 taskId) u16 *src; u16 *dst; - gBattle_BG2_X = r3 + gTasks[taskId].data[3]; - gBattle_BG2_Y = r2 + gTasks[taskId].data[4]; - src = gPlttBufferFaded + 0x100 + r6 * 16; + gBattle_BG2_X = x + gTasks[taskId].data[3]; + gBattle_BG2_Y = y + gTasks[taskId].data[4]; + src = gPlttBufferFaded + 0x100 + palIndex * 16; dst = gPlttBufferFaded + 0x100 - 112; CpuCopy32(src, dst, 0x20); } @@ -1232,7 +1230,7 @@ static void LoadDefaultBg(void) if (IsContest()) LoadContestBgAfterMoveAnim(); else - LoadFittingBackgroundForBattle(); + DrawMainBattleBackground(); } static void ScriptCmd_restorebg(void) @@ -1286,39 +1284,39 @@ s8 BattleAnimAdjustPanning(s8 pan) if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].flag_x10) { if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) - pan = 63; + pan = PAN_ATTACKER_OPPONENT; else - pan = -64; + pan = PAN_ATTACKER_PLAYER; } else if (IsContest()) { - if (gAnimBankAttacker != gAnimBankTarget || gAnimBankAttacker != 2 || pan != 63) + if (gAnimBankAttacker != gAnimBankTarget || gAnimBankAttacker != 2 || pan != PAN_ATTACKER_OPPONENT) pan *= -1; } else if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER) { if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER) { - if (pan == 63) - pan = -64; - else if (pan != -64) + if (pan == PAN_ATTACKER_OPPONENT) + pan = PAN_ATTACKER_PLAYER; + else if (pan != PAN_ATTACKER_PLAYER) pan *= -1; } } else if (GetBankSide(gAnimBankTarget) == SIDE_OPPONENT) { - if (pan == -64) - pan = 63; + if (pan == PAN_ATTACKER_PLAYER) + pan = PAN_ATTACKER_OPPONENT; } else { pan *= -1; } - if (pan > 63) - pan = 63; - else if (pan < -64) - pan = -64; + if (pan > PAN_ATTACKER_OPPONENT) + pan = PAN_ATTACKER_OPPONENT; + else if (pan < PAN_ATTACKER_PLAYER) + pan = PAN_ATTACKER_PLAYER; return pan; } @@ -1328,9 +1326,9 @@ s8 BattleAnimAdjustPanning2(s8 pan) if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].flag_x10) { if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) - pan = 63; + pan = PAN_ATTACKER_OPPONENT; else - pan = -64; + pan = PAN_ATTACKER_PLAYER; } else { -- cgit v1.2.3