Merge pull request #309 from PikalaxALT/pokemon_special_anim

Pokemon special anim
This commit is contained in:
PikalaxALT
2020-03-22 14:50:33 -04:00
committed by GitHub
20 changed files with 2830 additions and 5430 deletions
File diff suppressed because it is too large Load Diff
-200
View File
@@ -1,200 +0,0 @@
#include "constants/region_map_sections.h"
#include "constants/flags.h"
#include "constants/moves.h"
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
.align 2
gUnknown_8459634:: @ 8459634 data16 2x2
.2byte 0x0044, 0x0000
.2byte 0x000d, 0x0001
gUnknown_845963C:: @ 845963C gbapal
.incbin "graphics/pokemon_special_anim/unk_845963C.gbapal"
gUnknown_845965C:: @ 845965C gbapal
.incbin "graphics/pokemon_special_anim/unk_845965C.gbapal"
gUnknown_845967C:: @ 845967C 4bpp.lz
.incbin "graphics/pokemon_special_anim/unk_845967C.4bpp.lz"
gUnknown_845973C:: @ 845973C bin.lz
.incbin "graphics/pokemon_special_anim/unk_845973C.bin.lz"
gUnknown_8459868:: @ 8459868 gbapal
.incbin "graphics/pokemon_special_anim/unk_8459868.gbapal"
gUnknown_8459888:: @ 8459888 4bpp.lz
.incbin "graphics/pokemon_special_anim/unk_8459888.4bpp.lz"
gUnknown_84598A4:: @ 84598A4 gbapal
.incbin "graphics/pokemon_special_anim/unk_84598A4.gbapal"
gUnknown_84598C4:: @ 84598C4 4bpp.lz
.incbin "graphics/pokemon_special_anim/unk_84598C4.4bpp.lz"
gUnknown_8459940:: @ 8459940 gbapal
.incbin "graphics/pokemon_special_anim/unk_8459940.gbapal"
gUnknown_8459960:: @ 8459960 4bpp.lz
.incbin "graphics/pokemon_special_anim/unk_8459960.4bpp.lz"
gUnknown_8459980:: @ 8459980 bg_template
.4byte 0x000041f0
@ {
@ .bg = 0,
@ .charBaseIndex = 0,
@ .mapBaseIndex = 31,
@ .screenSize = 0,
@ .paletteMode = 0,
@ .priority = 0,
@ .baseTile = 0x0001
@ }
.4byte 0x000031cf
@ {
@ .bg = 3,
@ .charBaseIndex = 3,
@ .mapBaseIndex = 28,
@ .screenSize = 0,
@ .paletteMode = 0,
@ .priority = 3,
@ .baseTile = 0x0000
@ }
gUnknown_8459988:: @ 8459988 window_template
.byte 0, 1, 15, 28, 4, 15
.2byte 0x000a
.byte 255, 0, 0, 0, 0, 0
.2byte 0x0000
gUnknown_8459998:: @ 8459998 dataptr
.4byte gUnknown_841B2ED @ 1,
.4byte gUnknown_841B2F1 @ 2, and ‥ ‥ ‥
.4byte gUnknown_841B2FF @ Poof!
gUnknown_84599A4:: @ 84599A4
.2byte 0x0000, 0x0010
gUnknown_84599A8:: @ 84599A8 unref, data16?
.2byte 0x0044
gUnknown_84599AA:: @ 84599AA data16
.2byte 0x0100, 0x0155, 0x01aa, 0x0200
gUnknown_84599B2:: @ 84599B2 data8
.byte 0xf8, 0xf8, 0x06, 0xf3, 0x08, 0xf8
gUnknown_84599B8:: @ 84599B8 sprite_sheet
obj_tiles gUnknown_84598C4, 0x0080, 2
gUnknown_84599C0:: @ 84599C0 sprite_palette
obj_pal gUnknown_84598A4, 2
gUnknown_84599C8:: @ 84599C8 sprite_sheet
obj_tiles gUnknown_8459960, 0x0060, 5
gUnknown_84599D0:: @ 84599D0 sprite_palette
obj_pal gUnknown_8459940, 5
gUnknown_84599D8:: @ 84599D8
.4byte 0xc0000300, 0x00000400
gUnknown_84599E0:: @ 84599E0
obj_rot_scal_anim_frame 256, 256, 0, 0
obj_rot_scal_anim_end
gUnknown_84599F0:: @ 84599F0
obj_rot_scal_anim_frame 341, 341, 0, 0
obj_rot_scal_anim_end
gUnknown_8459A00:: @ 8459A00
obj_rot_scal_anim_frame 426, 426, 0, 0
obj_rot_scal_anim_end
gUnknown_8459A10:: @ 8459A10
obj_rot_scal_anim_frame 512, 512, 0, 0
obj_rot_scal_anim_end
gUnknown_8459A20:: @ 8459A20 dataptr
.4byte gUnknown_84599E0
.4byte gUnknown_84599F0
.4byte gUnknown_8459A00
.4byte gUnknown_8459A10
gUnknown_8459A30:: @ 8459A30 spr_template
spr_template 0, 0, gUnknown_84599D8, gDummySpriteAnimTable, NULL, gUnknown_8459A20, SpriteCallbackDummy
gUnknown_8459A48:: @ 8459A48 affine_anim_cmd?
obj_rot_scal_anim_frame 256, 256, 0, 0
obj_rot_scal_anim_frame -28, -28, 0, 8
obj_rot_scal_anim_end
gUnknown_8459A60:: @ 459A60
obj_rot_scal_anim_frame 341, 341, 0, 0
obj_rot_scal_anim_frame -37, -37, 0, 8
obj_rot_scal_anim_end
gUnknown_8459A78:: @ 459A78
obj_rot_scal_anim_frame 426, 426, 0, 0
obj_rot_scal_anim_frame -47, -47, 0, 8
obj_rot_scal_anim_end
gUnknown_8459A90:: @ 459A90
obj_rot_scal_anim_frame 512, 512, 0, 0
obj_rot_scal_anim_frame -56, -56, 0, 8
obj_rot_scal_anim_end
gUnknown_8459AA8:: @ 8459AA8 dataptr
.4byte gUnknown_8459A48
.4byte gUnknown_8459A60
.4byte gUnknown_8459A78
.4byte gUnknown_8459A90
gUnknown_8459AB8:: @ 8459AB8
.4byte 0x00008400, 0x00000400
gUnknown_8459AC0:: @ 8459AC0
obj_image_anim_frame 0x0000, 3
obj_image_anim_end
gUnknown_8459AC8:: @ 8459AC8
.4byte gUnknown_8459AC0
gUnknown_8459ACC:: @ 8459ACC spr_template
spr_template 0, 0, gUnknown_8459AB8, gUnknown_8459AC8, NULL, gDummySpriteAffineAnimTable, sub_811E7B4
gUnknown_8459AE4:: @ 8459AE4
.4byte 0x40000000, 0x00000400
gUnknown_8459AEC:: @ 8459AEC spr_template
spr_template 2, 2, gUnknown_8459AE4, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_811E300
gUnknown_8459B04:: @ 8459B04
.4byte 0x00000000, 0x00000000
gUnknown_8459B0C:: @ 8459B0C
obj_image_anim_frame 0x0000, 16
obj_image_anim_frame 0x0001, 8
obj_image_anim_frame 0x0002, 4
obj_image_anim_end
gUnknown_8459B1C:: @ 8459B1C
obj_image_anim_frame 0x0001, 4
obj_image_anim_frame 0x0000, 4
obj_image_anim_end
gUnknown_8459B28:: @ 8459B28
.4byte gUnknown_8459B0C
.4byte gUnknown_8459B1C
gUnknown_8459B30:: @ 8459B30 spr_template
spr_template 5, 5, gUnknown_8459B04, gUnknown_8459B28, NULL, gDummySpriteAffineAnimTable, sub_811E520
gUnknown_8459B48:: @ 8459B48 dataptr
.4byte gUnknown_841B2A9
.4byte gUnknown_841B2B7
.4byte gUnknown_841B2BE
.4byte gUnknown_841B2CC
.4byte gUnknown_841B2D4
.4byte gUnknown_841B2C6
-1
View File
@@ -211,7 +211,6 @@
#define PARTY_SIZE 6 #define PARTY_SIZE 6
#define MAX_TOTAL_EVS 510 #define MAX_TOTAL_EVS 510
#define UNOWN_FORM_COUNT 28 #define UNOWN_FORM_COUNT 28
#define MAX_MON_LEVEL 100
#define BOX_NAME_LENGTH 8 #define BOX_NAME_LENGTH 8
#endif // GUARD_CONSTANTS_POKEMON_H #endif // GUARD_CONSTANTS_POKEMON_H
+2 -2
View File
@@ -24,8 +24,8 @@ void AddTextPrinterParameterized5(u8 windowId, u8 fontId, const u8 *str, u8 x, u
void Menu_PrintFormatIntlPlayerName(u8 windowId, const u8 * src, u16 x, u16 y); void Menu_PrintFormatIntlPlayerName(u8 windowId, const u8 * src, u16 x, u16 y);
void StartBlendTask(u8 eva_start, u8 evb_start, u8 eva_end, u8 evb_end, u8 ev_step, u8 priority); void StartBlendTask(u8 eva_start, u8 evb_start, u8 eva_end, u8 evb_end, u8 ev_step, u8 priority);
bool8 IsBlendTaskActive(void); bool8 IsBlendTaskActive(void);
u8 sub_812EA78(u16 species, u32 personality, u8 a2); u8 Menu2_GetMonSpriteAnchorCoord(u16 species, u32 personality, u8 a2);
s8 sub_812EAE4(u16 species, u32 personality, u8 a2); s8 Menu2_GetMonSpriteAnchorCoordMinusx20(u16 species, u32 personality, u8 a2);
// list_menu // list_menu
void sub_8107CD8(u8 palOffset, u16 speciesId); void sub_8107CD8(u8 palOffset, u16 speciesId);
+1 -1
View File
@@ -322,7 +322,7 @@ extern const struct Evolution gEvolutionTable[][EVOS_PER_MON];
extern const u8 gStatStageRatios[][2]; extern const u8 gStatStageRatios[][2];
extern struct SpriteTemplate gMultiuseSpriteTemplate; extern struct SpriteTemplate gMultiuseSpriteTemplate;
extern struct PokemonStorage* gPokemonStoragePtr; extern struct PokemonStorage* gPokemonStoragePtr;
extern const u32 gExperienceTables[][MAX_MON_LEVEL + 1]; extern const u32 gExperienceTables[][MAX_LEVEL + 1];
extern const u16 *const gLevelUpLearnsets[]; extern const u16 *const gLevelUpLearnsets[];
extern const u8 gFacilityClassToPicIndex[]; extern const u8 gFacilityClassToPicIndex[];
extern const u8 gFacilityClassToTrainerClass[]; extern const u8 gFacilityClassToTrainerClass[];
+7 -7
View File
@@ -3,14 +3,14 @@
#include "global.h" #include "global.h"
void sub_811E5B8(u16, u16, u16, u16, u16, u16); void CreateLevelUpVerticalSpritesTask(u16 x, u16 y, u16 tileTag, u16 paletteTag, u16 priority, u16 subpriority);
bool8 sub_811E680(void); bool8 LevelUpVerticalSpritesTaskIsRunning(void);
void BufferMonStatsToTaskData(struct Pokemon *mon, u16 *currStats); void GetMonLevelUpWindowStats(struct Pokemon *mon, u16 *currStats);
void DrawLevelUpWindowPg1(u16 windowId, u16 *statsBefore, u16 *statsAfter, u8 bgClr, u8 fgClr, u8 shadowClr); void DrawLevelUpWindowPg1(u16 windowId, u16 *statsBefore, u16 *statsAfter, u8 bgClr, u8 fgClr, u8 shadowClr);
void DrawLevelUpWindowPg2(u16 windowId, u16 *currStats, u8 bgClr, u8 fgClr, u8 shadowClr); void DrawLevelUpWindowPg2(u16 windowId, u16 *currStats, u8 bgClr, u8 fgClr, u8 shadowClr);
void sub_811C540(u8 slotId, u16 itemId, MainCallback callback); void StartUseItemAnim_Normal(u8 slotId, u16 itemId, MainCallback callback);
void sub_811C5AC(u8 slotId, u16 itemId, MainCallback callback); void StartUseItemAnim_CantEvolve(u8 slotId, u16 itemId, MainCallback callback);
u32 sub_811D178(void); bool32 PSA_IsCancelDisabled(void);
void sub_811C568(u8 slotId, u16 itemId, u16 moveId, MainCallback callback); void StartUseItemAnim_ForgetMoveAndLearnTMorHM(u8 slotId, u16 itemId, u16 moveId, MainCallback callback);
#endif // GUARD_POKEMON_SPECIAL_ANIM_H #endif // GUARD_POKEMON_SPECIAL_ANIM_H
+94
View File
@@ -0,0 +1,94 @@
#ifndef GUARD_POKEMON_SPECIAL_ANIM_INTERNAL_H
#define GUARD_POKEMON_SPECIAL_ANIM_INTERNAL_H
#include "pokemon_special_anim.h"
enum
{
PSA_TEXT_ITEM_USED,
PSA_TEXT_LEVEL_ELEVATED,
PSA_TEXT_FORGET_1,
PSA_TEXT_FORGET_2_AND,
PSA_TEXT_FORGET_POOF,
PSA_TEXT_FORGET_FORGOT,
PSA_TEXT_FORGET_AND,
PSA_TEXT_MACHINE_SET,
PSA_TEXT_HUH,
PSA_TEXT_LEARNED_MOVE
};
struct PokemonSpecialAnimScene
{
u16 state;
u16 field_0002;
u16 field_0004;
u16 monSpriteY1;
u16 monSpriteY2;
u8 lastCloseness;
struct Sprite * monSprite;
struct Sprite * itemIconSprite;
u8 textBuf[0x900];
u8 field_0914[BG_SCREEN_SIZE];
u8 field_1114[BG_SCREEN_SIZE];
u8 field_1914[BG_SCREEN_SIZE];
u8 field_2114[0x720];
}; // size=0x2834
struct PokemonSpecialAnim
{
/*0x0000*/ u8 filler_0000[0x4];
/*0x0004*/ MainCallback savedCallback;
/*0x0008*/ struct Pokemon pokemon;
/*0x006c*/ u8 nickname[POKEMON_NAME_LENGTH + 1];
/*0x0077*/ u8 nameOfMoveForgotten[13];
/*0x0084*/ u8 nameOfMoveToTeach[13];
/*0x0091*/ bool8 cancelDisabled;
/*0x0092*/ u16 state;
/*0x0094*/ u16 species;
/*0x0096*/ u16 itemId;
/*0x0098*/ u16 animType;
/*0x009a*/ u16 slotId;
/*0x009c*/ u16 closeness;
/*0x009e*/ u16 delayTimer;
/*0x00a0*/ u32 personality;
/*0x00a4*/ u32 field_00a4;
/*0x00a8*/ struct PokemonSpecialAnimScene sceneResources;
}; // size=0x28dc
struct PokemonSpecialAnim * GetPSAStruct(void);
struct Pokemon * PSA_GetPokemon(void);
struct PokemonSpecialAnimScene * PSA_GetSceneWork(void);
u16 PSA_GetItemId(void);
u8 *PSA_GetNameOfMoveForgotten(void);
u8 *PSA_GetNameOfMoveToTeach(void);
u8 *PSA_CopyMonNickname(u8 *dest);
u8 *PSA_GetMonNickname(void);
u8 PSA_GetAnimType(void);
u16 PSA_GetMonSpecies(void);
u32 PSA_GetMonPersonality(void);
void InitPokemonSpecialAnimScene(struct PokemonSpecialAnimScene * buffer, u16 animType);
bool8 PokemonSpecialAnimSceneInitIsNotFinished(void);
void PSA_FreeWindowBuffers(void);
void PSA_ShowMessageWindow(void);
void PSA_HideMessageWindow(void);
void PSA_PrintMessage(u8 messageId);
void PSA_AfterPoof_ClearMessageWindow(void);
bool8 PSA_IsMessagePrintTaskActive(void);
void PSA_DarkenMonSprite(void);
bool8 PSA_RunPoofAnim(void);
void PSA_UseTM_SetUpZoomOutAnim(void);
void PSA_UseTM_CleanUpForCancel(void);
bool8 PSA_UseTM_RunZoomOutAnim(void);
void PSA_UseTM_SetUpMachineSetWobble(void);
bool8 PSA_UseTM_RunMachineSetWobble(void);
bool8 PSA_LevelUpVerticalSpritesTaskIsRunning(void);
void PSA_CreateMonSpriteAtCloseness(u8 closeness);
void PSA_SetUpZoomAnim(u8 closeness);
bool8 PSA_IsZoomTaskActive(void);
void PSA_SetUpItemUseOnMonAnim(u16 itemId, u8 closeness, bool32 a2);
void CreateItemIconSpriteAtMaxCloseness(u16 itemId);
bool8 PSA_IsItemUseOnMonAnimActive(void);
void PSA_UseItem_CleanUpForCancel(void);
#endif //GUARD_POKEMON_SPECIAL_ANIM_INTERNAL_H
+22
View File
@@ -1441,4 +1441,26 @@ extern const u8 gPCText_Pokecenter[];
extern const u8 gPCText_Machine[]; extern const u8 gPCText_Machine[];
extern const u8 gPCText_Simple[]; extern const u8 gPCText_Simple[];
// pokemon_special_anim
extern const u8 gUnknown_841B2ED[];
extern const u8 gUnknown_841B2F1[];
extern const u8 gUnknown_841B2FF[];
extern const u8 gUnknown_841B285[];
extern const u8 gUnknown_841B293[];
extern const u8 gUnknown_841B295[];
extern const u8 gUnknown_841B2A7[];
extern const u8 gUnknown_841B32E[];
extern const u8 gUnknown_841B306[];
extern const u8 gUnknown_841B315[];
extern const u8 gUnknown_841B31B[];
extern const u8 gUnknown_841B329[];
extern const u8 gUnknown_841B2A9[];
extern const u8 gUnknown_841B2B7[];
extern const u8 gUnknown_841B2BE[];
extern const u8 gUnknown_841B2CC[];
extern const u8 gUnknown_841B2D4[];
extern const u8 gUnknown_841B2C6[];
extern const u8 gUnknown_841B2E5[];
extern const u8 gUnknown_841B2DC[];
#endif //GUARD_STRINGS_H #endif //GUARD_STRINGS_H
+4 -2
View File
@@ -251,7 +251,8 @@ SECTIONS {
src/union_room.o(.text); src/union_room.o(.text);
src/rfu_union_tool.o(.text); src/rfu_union_tool.o(.text);
src/union_room_battle.o(.text); src/union_room_battle.o(.text);
asm/pokemon_special_anim.o(.text); src/pokemon_special_anim.o(.text);
src/pokemon_special_anim_scene.o(.text);
src/party_menu.o(.text); src/party_menu.o(.text);
src/union_room_chat.o(.text); src/union_room_chat.o(.text);
src/union_room_chat_display.o(.text); src/union_room_chat_display.o(.text);
@@ -553,7 +554,8 @@ SECTIONS {
src/rfu_union_tool.o(.rodata); src/rfu_union_tool.o(.rodata);
src/union_room_battle.o(.rodata); src/union_room_battle.o(.rodata);
src/union_room_message.o(.rodata); src/union_room_message.o(.rodata);
data/pokemon_special_anim.o(.rodata); src/pokemon_special_anim.o(.rodata);
src/pokemon_special_anim_scene.o(.rodata);
src/party_menu.o(.rodata); src/party_menu.o(.rodata);
src/union_room_chat.o(.rodata); src/union_room_chat.o(.rodata);
src/union_room_chat_display.o(.rodata); src/union_room_chat_display.o(.rodata);
+2 -2
View File
@@ -1226,7 +1226,7 @@ static void sub_80303A8(u8 taskId)
case 2: case 2:
PlaySE(SE_REGI); PlaySE(SE_REGI);
if (IsMonGettingExpSentOut()) if (IsMonGettingExpSentOut())
sub_811E5B8(sprite->pos1.x + sprite->pos2.x, CreateLevelUpVerticalSpritesTask(sprite->pos1.x + sprite->pos2.x,
sprite->pos1.y + sprite->pos2.y, sprite->pos1.y + sprite->pos2.y,
10000, 10000,
10000, 10000,
@@ -1235,7 +1235,7 @@ static void sub_80303A8(u8 taskId)
++data[15]; ++data[15];
break; break;
case 3: case 3:
if (!sub_811E680()) if (!LevelUpVerticalSpritesTaskIsRunning())
{ {
sprite->invisible = FALSE; sprite->invisible = FALSE;
++data[15]; ++data[15];
+2 -2
View File
@@ -5828,7 +5828,7 @@ static void DrawLevelUpWindow1(void)
{ {
u16 currStats[NUM_STATS]; u16 currStats[NUM_STATS];
BufferMonStatsToTaskData(&gPlayerParty[gBattleStruct->expGetterMonId], currStats); GetMonLevelUpWindowStats(&gPlayerParty[gBattleStruct->expGetterMonId], currStats);
DrawLevelUpWindowPg1(12, gBattleResources->beforeLvlUp->stats, currStats, 0xE, 0xD, 0xF); DrawLevelUpWindowPg1(12, gBattleResources->beforeLvlUp->stats, currStats, 0xE, 0xD, 0xF);
} }
@@ -5836,7 +5836,7 @@ static void DrawLevelUpWindow2(void)
{ {
u16 currStats[NUM_STATS]; u16 currStats[NUM_STATS];
BufferMonStatsToTaskData(&gPlayerParty[gBattleStruct->expGetterMonId], currStats); GetMonLevelUpWindowStats(&gPlayerParty[gBattleStruct->expGetterMonId], currStats);
DrawLevelUpWindowPg2(12, currStats, 0xE, 0xD, 0xF); DrawLevelUpWindowPg2(12, currStats, 0xE, 0xD, 0xF);
} }
+1 -1
View File
@@ -15,7 +15,7 @@
:(n <= 36) ? ((n + 14) * CUBE(n) / 50) \ :(n <= 36) ? ((n + 14) * CUBE(n) / 50) \
: (((n / 2) + 32) * CUBE(n) / 50) : (((n / 2) + 32) * CUBE(n) / 50)
const u32 gExperienceTables[][MAX_MON_LEVEL + 1] = const u32 gExperienceTables[][MAX_LEVEL + 1] =
{ {
{ // Medium Fast { // Medium Fast
0, // 0 0, // 0
+2 -2
View File
@@ -479,7 +479,7 @@ static void ApplyDaycareExperience(struct Pokemon *mon)
bool8 firstMove; bool8 firstMove;
u16 learnedMove; u16 learnedMove;
for (i = 0; i < MAX_MON_LEVEL; i++) for (i = 0; i < MAX_LEVEL; i++)
{ {
// Add the mon's gained daycare experience level by level until it can't level up anymore. // Add the mon's gained daycare experience level by level until it can't level up anymore.
if (TryIncrementMonLevel(mon)) if (TryIncrementMonLevel(mon))
@@ -513,7 +513,7 @@ static u16 TakeSelectedPokemonFromDaycare(struct DaycareMon *daycareMon)
species = GetBoxMonData(&daycareMon->mon, MON_DATA_SPECIES); species = GetBoxMonData(&daycareMon->mon, MON_DATA_SPECIES);
BoxMonToMon(&daycareMon->mon, &pokemon); BoxMonToMon(&daycareMon->mon, &pokemon);
if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_MON_LEVEL) if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL)
{ {
experience = GetMonData(&pokemon, MON_DATA_EXP) + daycareMon->steps; experience = GetMonData(&pokemon, MON_DATA_EXP) + daycareMon->steps;
SetMonData(&pokemon, MON_DATA_EXP, &experience); SetMonData(&pokemon, MON_DATA_EXP, &experience);
+6 -6
View File
@@ -9,7 +9,7 @@
static void Task_SmoothBlendLayers(u8 taskId); static void Task_SmoothBlendLayers(u8 taskId);
static const u8 gUnknown_845FD54[][5] = { static const u8 sMonSpriteAnchorCoords[][5] = {
[SPECIES_BULBASAUR - 1] = {0x16, 0x1b, 0x30, 0x16, 0x29}, [SPECIES_BULBASAUR - 1] = {0x16, 0x1b, 0x30, 0x16, 0x29},
[SPECIES_IVYSAUR - 1] = {0x14, 0x1b, 0x30, 0x15, 0x2a}, [SPECIES_IVYSAUR - 1] = {0x14, 0x1b, 0x30, 0x15, 0x2a},
[SPECIES_VENUSAUR - 1] = {0x1b, 0x20, 0x20, 0x1b, 0x33}, [SPECIES_VENUSAUR - 1] = {0x1b, 0x20, 0x20, 0x1b, 0x33},
@@ -635,7 +635,7 @@ static void Task_SmoothBlendLayers(u8 taskId)
} }
} }
u8 sub_812EA78(u16 species, u32 personality, u8 a2) u8 Menu2_GetMonSpriteAnchorCoord(u16 species, u32 personality, u8 a2)
{ {
if (species == SPECIES_UNOWN) if (species == SPECIES_UNOWN)
{ {
@@ -658,13 +658,13 @@ u8 sub_812EA78(u16 species, u32 personality, u8 a2)
if (species != SPECIES_NONE && a2 < 5) if (species != SPECIES_NONE && a2 < 5)
{ {
species--; species--;
if (gUnknown_845FD54[species][a2] != 0xFF) if (sMonSpriteAnchorCoords[species][a2] != 0xFF)
return gUnknown_845FD54[species][a2]; return sMonSpriteAnchorCoords[species][a2];
} }
return 32; return 32;
} }
s8 sub_812EAE4(u16 species, u32 personality, u8 a2) s8 Menu2_GetMonSpriteAnchorCoordMinusx20(u16 species, u32 personality, u8 a2)
{ {
return sub_812EA78(species, personality, a2) - 32; return Menu2_GetMonSpriteAnchorCoord(species, personality, a2) - 32;
} }
+11 -11
View File
@@ -380,7 +380,7 @@ static void sub_8125898(u8 taskId, UNUSED TaskFunc func);
static void sub_8125F4C(u8 taskId, UNUSED TaskFunc func); static void sub_8125F4C(u8 taskId, UNUSED TaskFunc func);
static void sub_8125F5C(u8 taskId); static void sub_8125F5C(u8 taskId);
static void sub_8126BD4(void); static void sub_8126BD4(void);
static bool8 sub_8126C24(void); static bool8 MonCanEvolve(void);
static EWRAM_DATA struct PartyMenuInternal *sPartyMenuInternal = NULL; static EWRAM_DATA struct PartyMenuInternal *sPartyMenuInternal = NULL;
EWRAM_DATA struct PartyMenu gPartyMenu = {0}; EWRAM_DATA struct PartyMenu gPartyMenu = {0};
@@ -4295,21 +4295,21 @@ static void sub_8124DE0(void)
{ {
if (CheckIfItemIsTMHMOrEvolutionStone(gSpecialVar_ItemId) == 2) // Evolution stone if (CheckIfItemIsTMHMOrEvolutionStone(gSpecialVar_ItemId) == 2) // Evolution stone
{ {
if (sub_8126C24() == TRUE) if (MonCanEvolve() == TRUE)
sub_811C540(gPartyMenu.slotId, gSpecialVar_ItemId, sub_8126BD4); StartUseItemAnim_Normal(gPartyMenu.slotId, gSpecialVar_ItemId, sub_8126BD4);
else else
sub_811C5AC(gPartyMenu.slotId, gSpecialVar_ItemId, gPartyMenu.exitCallback); StartUseItemAnim_CantEvolve(gPartyMenu.slotId, gSpecialVar_ItemId, gPartyMenu.exitCallback);
} }
else else
{ {
sub_811C540(gPartyMenu.slotId, gSpecialVar_ItemId, sub_8124E48); StartUseItemAnim_Normal(gPartyMenu.slotId, gSpecialVar_ItemId, sub_8124E48);
} }
} }
static void sub_8124E48(void) static void sub_8124E48(void)
{ {
if (ItemId_GetPocket(gSpecialVar_ItemId) == POCKET_TM_CASE if (ItemId_GetPocket(gSpecialVar_ItemId) == POCKET_TM_CASE
&& sub_811D178() == 1) && PSA_IsCancelDisabled() == TRUE)
{ {
GiveMoveToMon(&gPlayerParty[gPartyMenu.slotId], ItemIdToBattleMoveId(gSpecialVar_ItemId)); GiveMoveToMon(&gPlayerParty[gPartyMenu.slotId], ItemIdToBattleMoveId(gSpecialVar_ItemId));
AdjustFriendship(&gPlayerParty[gPartyMenu.slotId], 4); AdjustFriendship(&gPlayerParty[gPartyMenu.slotId], 4);
@@ -4325,7 +4325,7 @@ static void sub_8124E48(void)
static void sub_8124EFC(void) static void sub_8124EFC(void)
{ {
if (sub_811D178() == 1) if (PSA_IsCancelDisabled() == TRUE)
{ {
struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];
u8 moveIdx = GetMoveSlotToReplace(); u8 moveIdx = GetMoveSlotToReplace();
@@ -4919,7 +4919,7 @@ static void CB2_ReturnToPartyMenuWhileLearningMove(void)
if (learnMoveState == 0 && moveIdx != MAX_MON_MOVES) if (learnMoveState == 0 && moveIdx != MAX_MON_MOVES)
{ {
move = GetMonData(&gPlayerParty[gPartyMenu.slotId], moveIdx + MON_DATA_MOVE1); move = GetMonData(&gPlayerParty[gPartyMenu.slotId], moveIdx + MON_DATA_MOVE1);
sub_811C568(gPartyMenu.slotId, gSpecialVar_ItemId, move, sub_8124EFC); StartUseItemAnim_ForgetMoveAndLearnTMorHM(gPartyMenu.slotId, gSpecialVar_ItemId, move, sub_8124EFC);
gItemUseCB = sub_8125F4C; gItemUseCB = sub_8125F4C;
gPartyMenu.action = learnMoveState; gPartyMenu.action = learnMoveState;
} }
@@ -5075,9 +5075,9 @@ static void ItemUseCB_RareCandyStep(u8 taskId, UNUSED TaskFunc func)
s16 *arrayPtr = ptr->data; s16 *arrayPtr = ptr->data;
u8 level; u8 level;
BufferMonStatsToTaskData(mon, arrayPtr); GetMonLevelUpWindowStats(mon, arrayPtr);
ExecuteTableBasedItemEffect_(gPartyMenu.slotId, gSpecialVar_ItemId, 0); ExecuteTableBasedItemEffect_(gPartyMenu.slotId, gSpecialVar_ItemId, 0);
BufferMonStatsToTaskData(mon, &ptr->data[NUM_STATS]); GetMonLevelUpWindowStats(mon, &ptr->data[NUM_STATS]);
gPartyMenuUseExitCallback = TRUE; gPartyMenuUseExitCallback = TRUE;
ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, gSpecialVar_ItemId, 0xFFFF); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, gSpecialVar_ItemId, 0xFFFF);
PlayFanfareByFanfareNum(0); PlayFanfareByFanfareNum(0);
@@ -5347,7 +5347,7 @@ static void sub_8126BD4(void)
RemoveBagItem(gSpecialVar_ItemId, 1); RemoveBagItem(gSpecialVar_ItemId, 1);
} }
static bool8 sub_8126C24(void) static bool8 MonCanEvolve(void)
{ {
if (!IsNationalPokedexEnabled() if (!IsNationalPokedexEnabled()
&& GetEvolutionTargetSpecies(&gPlayerParty[gPartyMenu.slotId], 2, gSpecialVar_ItemId) > KANTO_DEX_COUNT) && GetEvolutionTargetSpecies(&gPlayerParty[gPartyMenu.slotId], 2, gSpecialVar_ItemId) > KANTO_DEX_COUNT)
+2 -2
View File
@@ -2143,7 +2143,7 @@ static u8 GetLevelFromMonExp(struct Pokemon *mon)
u32 exp = GetMonData(mon, MON_DATA_EXP, NULL); u32 exp = GetMonData(mon, MON_DATA_EXP, NULL);
s32 level = 1; s32 level = 1;
while (level <= MAX_MON_LEVEL && gExperienceTables[gBaseStats[species].growthRate][level] <= exp) while (level <= MAX_LEVEL && gExperienceTables[gBaseStats[species].growthRate][level] <= exp)
level++; level++;
return level - 1; return level - 1;
@@ -2155,7 +2155,7 @@ u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon)
u32 exp = GetBoxMonData(boxMon, MON_DATA_EXP, NULL); u32 exp = GetBoxMonData(boxMon, MON_DATA_EXP, NULL);
s32 level = 1; s32 level = 1;
while (level <= MAX_MON_LEVEL && gExperienceTables[gBaseStats[species].growthRate][level] <= exp) while (level <= MAX_LEVEL && gExperienceTables[gBaseStats[species].growthRate][level] <= exp)
level++; level++;
return level - 1; return level - 1;
+708
View File
@@ -0,0 +1,708 @@
#include "global.h"
#include "gflib.h"
#include "data.h"
#include "party_menu.h"
#include "pokemon_special_anim_internal.h"
#include "item_use.h"
#include "task.h"
#include "constants/songs.h"
#include "constants/items.h"
// Functions related to the special anims Pokemon
// make when using an item on them in the field.
static EWRAM_DATA bool32 sCancelDisabled = FALSE;
static EWRAM_DATA u8 sPSATaskId = 0;
static EWRAM_DATA struct PokemonSpecialAnim * sPSAWork = NULL;
static struct PokemonSpecialAnim * AllocPSA(u8 slotId, u16 itemId, MainCallback callback);
static void SetUpUseItemAnim_Normal(struct PokemonSpecialAnim * ptr);
static void SetUpUseItemAnim_ForgetMoveAndLearnTMorHM(struct PokemonSpecialAnim * ptr);
static void SetUpUseItemAnim_CantEvolve(struct PokemonSpecialAnim * ptr);
static void Task_UseItem_Normal(u8 taskId);
static void Task_ForgetMove(u8 taskId);
static void Task_EvoStone_CantEvolve(u8 taskId);
static void Task_UseTM_NoForget(u8 taskId);
static void Task_MachineSet(u8 taskId);
static void Task_CleanUp(u8 taskId);
static u8 GetClosenessFromFriendship(u16 friendship);
static u16 GetAnimTypeByItemId(u16 itemId);
void StartUseItemAnim_Normal(u8 slotId, u16 itemId, MainCallback callback)
{
struct PokemonSpecialAnim * ptr = AllocPSA(slotId, itemId, callback);
if (ptr == NULL)
SetMainCallback2(callback);
else
SetUpUseItemAnim_Normal(ptr);
}
void StartUseItemAnim_ForgetMoveAndLearnTMorHM(u8 slotId, u16 itemId, u16 moveId, MainCallback callback)
{
struct PokemonSpecialAnim * ptr = AllocPSA(slotId, itemId, callback);
if (ptr == NULL)
SetMainCallback2(callback);
else
{
StringCopy(ptr->nameOfMoveForgotten, gMoveNames[moveId]);
SetUpUseItemAnim_ForgetMoveAndLearnTMorHM(ptr);
}
}
void StartUseItemAnim_CantEvolve(u8 slotId, u16 itemId, MainCallback callback)
{
struct PokemonSpecialAnim * ptr = AllocPSA(slotId, itemId, callback);
if (ptr == NULL)
SetMainCallback2(callback);
else
SetUpUseItemAnim_CantEvolve(ptr);
}
static struct PokemonSpecialAnim * AllocPSA(u8 slotId, u16 itemId, MainCallback callback)
{
struct PokemonSpecialAnim * ptr;
struct Pokemon * pokemon;
u16 moveId;
if (!gMain.inBattle)
ResetTasks();
ResetSpriteData();
FreeAllSpritePalettes();
ptr = Alloc(sizeof(struct PokemonSpecialAnim));
if (ptr == NULL)
{
SetMainCallback2(callback);
return NULL;
}
pokemon = &gPlayerParty[slotId];
ptr->state = 0;
ptr->savedCallback = callback;
ptr->species = GetMonData(pokemon, MON_DATA_SPECIES);
ptr->closeness = GetClosenessFromFriendship(GetMonData(pokemon, MON_DATA_FRIENDSHIP));
ptr->personality = GetMonData(pokemon, MON_DATA_PERSONALITY);
ptr->slotId = slotId;
ptr->itemId = itemId;
ptr->animType = GetAnimTypeByItemId(itemId);
ptr->pokemon = *pokemon;
ptr->field_00a4 = 0;
GetMonData(pokemon, MON_DATA_NICKNAME, ptr->nickname);
if (ptr->animType == 4)
{
moveId = ItemIdToBattleMoveId(itemId);
StringCopy(ptr->nameOfMoveToTeach, gMoveNames[moveId]);
}
return ptr;
}
static void VBlankCB_PSA(void)
{
TransferPlttBuffer();
LoadOam();
ProcessSpriteCopyRequests();
}
static void CB2_PSA(void)
{
RunTextPrinters();
RunTasks();
AnimateSprites();
BuildOamBuffer();
UpdatePaletteFade();
}
static void SetUseItemAnimCallback(u8 taskId, TaskFunc func)
{
struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
ptr->state = 0;
gTasks[taskId].func = func;
}
static void SetUpUseItemAnim_Normal(struct PokemonSpecialAnim * ptr)
{
u8 taskId;
switch (ptr->animType)
{
case 0:
case 1:
case 3:
taskId = CreateTask(Task_UseItem_Normal, 0);
break;
case 4:
taskId = CreateTask(Task_UseTM_NoForget, 0);
break;
default:
SetMainCallback2(ptr->savedCallback);
Free(ptr);
return;
}
ptr->cancelDisabled = FALSE;
SetWordTaskArg(taskId, 0, (uintptr_t)ptr);
SetMainCallback2(CB2_PSA);
sPSATaskId = taskId;
}
static void SetUpUseItemAnim_ForgetMoveAndLearnTMorHM(struct PokemonSpecialAnim * ptr)
{
u8 taskId = CreateTask(Task_ForgetMove, 0);
SetWordTaskArg(taskId, 0, (uintptr_t)ptr);
SetMainCallback2(CB2_PSA);
sPSATaskId = taskId;
ptr->cancelDisabled = FALSE;
}
static void SetUpUseItemAnim_CantEvolve(struct PokemonSpecialAnim * ptr)
{
u8 taskId = CreateTask(Task_EvoStone_CantEvolve, 0);
SetWordTaskArg(taskId, 0, (uintptr_t)ptr);
SetMainCallback2(CB2_PSA);
sPSATaskId = taskId;
}
static void Task_UseItem_Normal(u8 taskId)
{
struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
if (!ptr->cancelDisabled && JOY_HELD(A_BUTTON | B_BUTTON))
{
PSA_UseItem_CleanUpForCancel();
SetUseItemAnimCallback(taskId, Task_CleanUp);
return;
}
switch (ptr->state)
{
case 0:
SetVBlankCallback(NULL);
InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType);
PSA_CreateMonSpriteAtCloseness(0);
ptr->state++;
break;
case 1:
if (!PokemonSpecialAnimSceneInitIsNotFinished())
{
BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
ptr->state++;
SetVBlankCallback(VBlankCB_PSA);
}
break;
case 2:
if (!gPaletteFade.active)
{
ptr->state++;
}
break;
case 3:
PSA_SetUpZoomAnim(ptr->closeness);
ptr->state++;
break;
case 4:
if (!PSA_IsZoomTaskActive())
{
ptr->delayTimer = 0;
ptr->state++;
}
break;
case 5:
if (!PSA_LevelUpVerticalSpritesTaskIsRunning())
{
ptr->state++;
}
break;
case 6:
PSA_SetUpItemUseOnMonAnim(ptr->itemId, ptr->closeness, TRUE);
ptr->state++;
break;
case 7:
if (!PSA_IsItemUseOnMonAnimActive())
{
ptr->cancelDisabled = TRUE;
if (ptr->closeness == 3)
{
PlayCry1(ptr->species, 0);
}
PSA_ShowMessageWindow();
ptr->state++;
}
break;
case 8:
PSA_PrintMessage(PSA_TEXT_ITEM_USED);
ptr->state++;
break;
case 9:
if (!PSA_IsMessagePrintTaskActive())
{
ptr->state++;
}
break;
case 10:
PSA_SetUpZoomAnim(0);
ptr->state++;
break;
case 11:
if (!PSA_IsZoomTaskActive())
{
ptr->cancelDisabled = TRUE;
ptr->state++;
}
break;
case 12:
if (JOY_NEW(A_BUTTON | B_BUTTON))
{
if (CheckIfItemIsTMHMOrEvolutionStone(ptr->itemId) != 2) // evo stone
{
BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
ptr->state++;
}
else
{
ptr->state += 2;
}
}
break;
case 13:
if (!gPaletteFade.active)
{
ptr->state++;
}
break;
case 14:
SetMainCallback2(ptr->savedCallback);
PSA_FreeWindowBuffers();
Free(ptr);
DestroyTask(taskId);
break;
}
}
static void Task_ForgetMove(u8 taskId)
{
struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
u8 r4;
switch (ptr->state)
{
case 0:
SetVBlankCallback(NULL);
InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType);
PSA_CreateMonSpriteAtCloseness(3);
ptr->state++;
break;
case 1:
if (!PokemonSpecialAnimSceneInitIsNotFinished())
{
BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
ptr->state++;
SetVBlankCallback(VBlankCB_PSA);
}
break;
case 2:
if (!gPaletteFade.active)
{
ptr->delayTimer = 0;
ptr->state++;
}
break;
case 3:
ptr->delayTimer++;
if (ptr->delayTimer > 30)
{
PSA_ShowMessageWindow();
ptr->state++;
}
break;
case 4:
PSA_PrintMessage(PSA_TEXT_FORGET_1);
ptr->state++;
break;
case 5:
if (!PSA_IsMessagePrintTaskActive())
{
ptr->delayTimer = 0;
ptr->state++;
}
break;
case 6:
ptr->delayTimer++;
if (ptr->delayTimer > 30)
{
PSA_PrintMessage(PSA_TEXT_FORGET_2_AND);
ptr->state++;
}
break;
case 7:
if (!PSA_IsMessagePrintTaskActive())
{
ptr->delayTimer = 0;
ptr->state++;
}
break;
case 8:
ptr->delayTimer++;
if (ptr->delayTimer > 30)
{
PlaySE(SE_W255);
PSA_PrintMessage(PSA_TEXT_FORGET_POOF);
PSA_DarkenMonSprite();
ptr->state++;
}
break;
case 9:
r4 = PSA_RunPoofAnim();
if (!(r4 | PSA_IsMessagePrintTaskActive()))
{
PSA_AfterPoof_ClearMessageWindow();
ptr->state++;
}
break;
case 10:
PSA_PrintMessage(PSA_TEXT_FORGET_FORGOT);
ptr->state++;
break;
case 11:
if (!PSA_IsMessagePrintTaskActive())
{
PSA_PrintMessage(PSA_TEXT_FORGET_AND);
ptr->state++;
}
break;
case 12:
if (!PSA_IsMessagePrintTaskActive())
{
PSA_HideMessageWindow();
ptr->state++;
}
break;
case 13:
SetUseItemAnimCallback(taskId, Task_MachineSet);
break;
}
}
static void Task_EvoStone_CantEvolve(u8 taskId)
{
struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
if (!ptr->cancelDisabled && JOY_HELD(B_BUTTON))
{
SetUseItemAnimCallback(taskId, Task_CleanUp);
return;
}
switch (ptr->state)
{
case 0:
SetVBlankCallback(NULL);
InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType);
PSA_CreateMonSpriteAtCloseness(0);
ptr->state++;
break;
case 1:
if (!PokemonSpecialAnimSceneInitIsNotFinished())
{
BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
ptr->state++;
SetVBlankCallback(VBlankCB_PSA);
}
break;
case 2:
if (!gPaletteFade.active)
{
ptr->state++;
}
break;
case 3:
PSA_SetUpZoomAnim(ptr->closeness);
ptr->state++;
break;
case 4:
PSA_SetUpItemUseOnMonAnim(ptr->itemId, ptr->closeness, FALSE);
ptr->state++;
break;
case 5:
if (!PSA_IsItemUseOnMonAnimActive())
{
PSA_ShowMessageWindow();
ptr->state++;
}
break;
case 6:
PSA_PrintMessage(PSA_TEXT_HUH);
ptr->state++;
break;
case 7:
if (!PSA_IsMessagePrintTaskActive())
{
ptr->cancelDisabled = TRUE;
ptr->state++;
}
break;
case 8:
if (JOY_NEW(A_BUTTON | B_BUTTON))
{
BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
ptr->state++;
}
break;
case 9:
if (!gPaletteFade.active)
{
SetMainCallback2(ptr->savedCallback);
PSA_FreeWindowBuffers();
Free(ptr);
DestroyTask(taskId);
}
break;
}
}
static void Task_UseTM_NoForget(u8 taskId)
{
struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
if (JOY_NEW(B_BUTTON))
{
SetUseItemAnimCallback(taskId, Task_CleanUp);
return;
}
switch (ptr->state)
{
case 0:
SetVBlankCallback(NULL);
InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType);
PSA_CreateMonSpriteAtCloseness(3);
ptr->state++;
break;
case 1:
if (!PokemonSpecialAnimSceneInitIsNotFinished())
{
BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
ptr->state++;
SetVBlankCallback(VBlankCB_PSA);
}
break;
case 2:
if (!gPaletteFade.active)
{
ptr->delayTimer = 0;
ptr->state++;
}
break;
case 3:
ptr->delayTimer++;
if (ptr->delayTimer > 20)
{
SetUseItemAnimCallback(taskId, Task_MachineSet);
}
break;
}
}
static void Task_MachineSet(u8 taskId)
{
struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
if (!ptr->cancelDisabled && JOY_NEW(B_BUTTON))
{
PSA_UseTM_CleanUpForCancel();
SetUseItemAnimCallback(taskId, Task_CleanUp);
return;
}
switch (ptr->state)
{
case 0:
CreateItemIconSpriteAtMaxCloseness(ptr->itemId);
ptr->delayTimer = 0;
ptr->state++;
break;
case 1:
PSA_ShowMessageWindow();
PSA_PrintMessage(PSA_TEXT_MACHINE_SET);
ptr->state++;
break;
case 2:
if (!PSA_IsMessagePrintTaskActive())
{
PSA_HideMessageWindow();
ptr->state++;
}
break;
case 3:
PSA_UseTM_SetUpMachineSetWobble();
ptr->state++;
break;
case 4:
if (!PSA_UseTM_RunMachineSetWobble())
{
ptr->state++;
}
break;
case 5:
PSA_UseTM_SetUpZoomOutAnim();
ptr->state++;
break;
case 6:
if (!PSA_UseTM_RunZoomOutAnim())
{
ptr->delayTimer = 0;
ptr->state++;
}
break;
case 7:
ptr->delayTimer++;
if (ptr->delayTimer > 30)
{
PSA_ShowMessageWindow();
PSA_PrintMessage(PSA_TEXT_LEARNED_MOVE);
ptr->state++;
}
break;
case 8:
if (!PSA_IsMessagePrintTaskActive())
{
PlayFanfare(MUS_FANFA1);
ptr->cancelDisabled = TRUE;
ptr->state++;
}
break;
case 9:
if (IsFanfareTaskInactive())
{
SetUseItemAnimCallback(taskId, Task_CleanUp);
}
break;
}
}
static void Task_CleanUp(u8 taskId)
{
struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
switch (ptr->state)
{
case 0:
SetVBlankCallback(VBlankCB_PSA);
BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
ptr->state++;
break;
case 1:
if (!gPaletteFade.active && (ptr->field_00a4 != 1 || IsCryFinished()))
{
sCancelDisabled = ptr->cancelDisabled;
SetMainCallback2(ptr->savedCallback);
DestroyTask(taskId);
PSA_FreeWindowBuffers();
Free(ptr);
}
break;
}
}
static const struct {
u16 itemId;
u16 animType;
} gUnknown_8459634[2] = {
{ITEM_RARE_CANDY, 0},
{ITEM_POTION, 1}
};
static u16 GetAnimTypeByItemId(u16 itemId)
{
int i;
for (i = 0; i < NELEMS(gUnknown_8459634); i++)
{
if (gUnknown_8459634[i].itemId == itemId)
return gUnknown_8459634[i].animType;
}
if (itemId >= ITEM_TM01 && itemId <= ITEM_HM08)
{
return 4;
}
return 0;
}
static u8 GetClosenessFromFriendship(u16 friendship)
{
if (friendship <= 100)
return 0;
else if (friendship <= 150)
return 1;
else if (friendship <= 200)
return 2;
else
return 3;
}
struct PokemonSpecialAnim * GetPSAStruct(void)
{
return (void *)GetWordTaskArg(sPSATaskId, 0);
}
struct Pokemon * PSA_GetPokemon(void)
{
sPSAWork = GetPSAStruct();
return &sPSAWork->pokemon;
}
struct PokemonSpecialAnimScene * PSA_GetSceneWork(void)
{
return &GetPSAStruct()->sceneResources;
}
u16 PSA_GetItemId(void)
{
return GetPSAStruct()->itemId;
}
u8 *PSA_GetNameOfMoveForgotten(void)
{
return GetPSAStruct()->nameOfMoveForgotten;
}
u8 *PSA_GetNameOfMoveToTeach(void)
{
return GetPSAStruct()->nameOfMoveToTeach;
}
u8 *PSA_CopyMonNickname(u8 *dest)
{
return StringCopy(dest, GetPSAStruct()->nickname);
}
u8 *PSA_GetMonNickname(void)
{
return GetPSAStruct()->nickname;
}
u8 PSA_GetAnimType(void)
{
return GetPSAStruct()->animType;
}
u16 PSA_GetMonSpecies(void)
{
return GetPSAStruct()->species;
}
u32 PSA_GetMonPersonality(void)
{
return GetPSAStruct()->personality;
}
void GetMonLevelUpWindowStats(struct Pokemon * pokemon, u16 *data)
{
data[0] = GetMonData(pokemon, MON_DATA_MAX_HP);
data[1] = GetMonData(pokemon, MON_DATA_ATK);
data[2] = GetMonData(pokemon, MON_DATA_DEF);
data[3] = GetMonData(pokemon, MON_DATA_SPEED);
data[4] = GetMonData(pokemon, MON_DATA_SPATK);
data[5] = GetMonData(pokemon, MON_DATA_SPDEF);
}
bool32 PSA_IsCancelDisabled(void)
{
return sCancelDisabled;
}
File diff suppressed because it is too large Load Diff
+1 -8
View File
@@ -59,15 +59,8 @@ gUnknown_3000E89: @ 3000E89
.include "src/quest_log.o" .include "src/quest_log.o"
.align 2 .align 2
.include "src/union_room.o" .include "src/union_room.o"
.align 2 .align 2
@ .include "src/pokemon_special_anim.o" .include "src/pokemon_special_anim_scene.o"
gUnknown_3002030: @ 3002030
.space 0x8
gUnknown_3002038: @ 3002038
.space 0x8
.align 2 .align 2
.include "src/wireless_communication_status_screen.o" .include "src/wireless_communication_status_screen.o"
.align 2 .align 2
+1 -11
View File
@@ -261,18 +261,8 @@ gPlayerAvatar: @ 2037078
.include "src/rfu_union_tool.o" .include "src/rfu_union_tool.o"
.align 2 .align 2
.include "src/union_room_battle.o" .include "src/union_room_battle.o"
.align 2 .align 2
@ .include "src/pokemon_special_anim.o" .include "src/pokemon_special_anim.o"
gUnknown_203B090: @ 203B090
.space 0x4
gUnknown_203B094: @ 203B094
.space 0x4
gUnknown_203B098: @ 203B098
.space 0x4
.align 2 .align 2
.include "src/party_menu.o" .include "src/party_menu.o"
.align 2 .align 2