through sub_811CA20

This commit is contained in:
PikalaxALT
2020-03-19 20:40:26 -04:00
parent 33b65b5470
commit b36ea2db98
3 changed files with 414 additions and 814 deletions
+412
View File
@@ -0,0 +1,412 @@
#include "global.h"
#include "gflib.h"
#include "data.h"
#include "party_menu.h"
#include "item_use.h"
#include "task.h"
#include "constants/songs.h"
// Functions related to the special anims Pokemon
// make when using an item on them in the field.
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 field_009e;
/*0x00a0*/ u32 personality;
/*0x00a4*/ u32 field_00a4;
/*0x00a8*/ u8 field_00a8[0x2834];
}; // size=0x28dc
EWRAM_DATA u8 gUnknown_203B094 = 0;
struct PokemonSpecialAnim * sub_811C5D4(u8 slotId, u16 itemId, MainCallback callback);
void sub_811C748(struct PokemonSpecialAnim * ptr);
void sub_811C7BC(struct PokemonSpecialAnim * ptr);
void sub_811C7FC(struct PokemonSpecialAnim * ptr);
void sub_811C834(u8 taskId);
void sub_811CA20(u8 taskId);
void sub_811CBE4(u8 taskId);
void sub_811CD68(u8 taskId);
void sub_811CE4C(u8 taskId);
void sub_811CF88(u8 taskId);
u8 sub_811D058(u16 friendship);
u16 sub_811D018(u16 itemId);
void sub_811D184(u8 *buffer, u16 animType);
bool8 sub_811D280(void);
void sub_811D29C(void);
void sub_811D2A8(void);
void sub_811D2D0(void);
void sub_811D2EC(u8 a0);
void sub_811D4D4(void);
bool8 sub_811D4EC(void);
void sub_811D4FC(void);
bool8 sub_811D530(void);
bool8 sub_811D754(void);
void sub_811D830(u8 a0);
void sub_811D948(u8 closeness);
bool8 sub_811D9A8(void);
void sub_811DC54(u16 itemId, u8 closeness, u8 a2);
bool8 sub_811DD90(void);
void sub_811E040(void);
void sub_811C540(u8 slotId, u16 itemId, MainCallback callback)
{
struct PokemonSpecialAnim * ptr = sub_811C5D4(slotId, itemId, callback);
if (ptr == NULL)
SetMainCallback2(callback);
else
sub_811C748(ptr);
}
void sub_811C568(u8 slotId, u16 itemId, u16 moveId, MainCallback callback)
{
struct PokemonSpecialAnim * ptr = sub_811C5D4(slotId, itemId, callback);
if (ptr == NULL)
SetMainCallback2(callback);
else
{
StringCopy(ptr->nameOfMoveForgotten, gMoveNames[moveId]);
sub_811C7BC(ptr);
}
}
void sub_811C5AC(u8 slotId, u16 itemId, MainCallback callback)
{
struct PokemonSpecialAnim * ptr = sub_811C5D4(slotId, itemId, callback);
if (ptr == NULL)
SetMainCallback2(callback);
else
sub_811C7FC(ptr);
}
struct PokemonSpecialAnim * sub_811C5D4(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 = sub_811D058(GetMonData(pokemon, MON_DATA_FRIENDSHIP));
ptr->personality = GetMonData(pokemon, MON_DATA_PERSONALITY);
ptr->slotId = slotId;
ptr->itemId = itemId;
ptr->animType = sub_811D018(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;
}
void sub_811C6E8(void)
{
TransferPlttBuffer();
LoadOam();
ProcessSpriteCopyRequests();
}
void sub_811C6FC(void)
{
RunTextPrinters();
RunTasks();
AnimateSprites();
BuildOamBuffer();
UpdatePaletteFade();
}
void sub_811C718(u8 taskId, TaskFunc func)
{
struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
ptr->state = 0;
gTasks[taskId].func = func;
}
void sub_811C748(struct PokemonSpecialAnim * ptr)
{
u8 taskId;
switch (ptr->animType)
{
case 0:
case 1:
case 3:
taskId = CreateTask(sub_811C834, 0);
break;
case 4:
taskId = CreateTask(sub_811CD68, 0);
break;
default:
SetMainCallback2(ptr->savedCallback);
Free(ptr);
return;
}
ptr->cancelDisabled = FALSE;
SetWordTaskArg(taskId, 0, (uintptr_t)ptr);
SetMainCallback2(sub_811C6FC);
gUnknown_203B094 = taskId;
}
void sub_811C7BC(struct PokemonSpecialAnim * ptr)
{
u8 taskId = CreateTask(sub_811CA20, 0);
SetWordTaskArg(taskId, 0, (uintptr_t)ptr);
SetMainCallback2(sub_811C6FC);
gUnknown_203B094 = taskId;
ptr->cancelDisabled = FALSE;
}
void sub_811C7FC(struct PokemonSpecialAnim * ptr)
{
u8 taskId = CreateTask(sub_811CBE4, 0);
SetWordTaskArg(taskId, 0, (uintptr_t)ptr);
SetMainCallback2(sub_811C6FC);
gUnknown_203B094 = taskId;
}
void sub_811C834(u8 taskId)
{
struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
if (!ptr->cancelDisabled && JOY_HELD(A_BUTTON | B_BUTTON))
{
sub_811E040();
sub_811C718(taskId, sub_811CF88);
return;
}
switch (ptr->state)
{
case 0:
SetVBlankCallback(NULL);
sub_811D184(ptr->field_00a8, ptr->animType);
sub_811D830(0);
ptr->state++;
break;
case 1:
if (!sub_811D280())
{
BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
ptr->state++;
SetVBlankCallback(sub_811C6E8);
}
break;
case 2:
if (!gPaletteFade.active)
{
ptr->state++;
}
break;
case 3:
sub_811D948(ptr->closeness);
ptr->state++;
break;
case 4:
if (!sub_811D9A8())
{
ptr->field_009e = 0;
ptr->state++;
}
break;
case 5:
if (!sub_811D754())
{
ptr->state++;
}
break;
case 6:
sub_811DC54(ptr->itemId, ptr->closeness, 1);
ptr->state++;
break;
case 7:
if (!sub_811DD90())
{
ptr->cancelDisabled = TRUE;
if (ptr->closeness == 3)
{
PlayCry1(ptr->species, 0);
}
sub_811D2A8();
ptr->state++;
}
break;
case 8:
sub_811D2EC(0);
ptr->state++;
break;
case 9:
if (!sub_811D4EC())
{
ptr->state++;
}
break;
case 10:
sub_811D948(0);
ptr->state++;
break;
case 11:
if (!sub_811D9A8())
{
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);
sub_811D29C();
Free(ptr);
DestroyTask(taskId);
break;
}
}
void sub_811CA20(u8 taskId)
{
struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
u8 r4;
switch (ptr->state)
{
case 0:
SetVBlankCallback(NULL);
sub_811D184(ptr->field_00a8, ptr->animType);
sub_811D830(3);
ptr->state++;
break;
case 1:
if (!sub_811D280())
{
BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
ptr->state++;
SetVBlankCallback(sub_811C6E8);
}
break;
case 2:
if (!gPaletteFade.active)
{
ptr->field_009e = 0;
ptr->state++;
}
break;
case 3:
ptr->field_009e++;
if (ptr->field_009e > 30)
{
sub_811D2A8();
ptr->state++;
}
break;
case 4:
sub_811D2EC(2);
ptr->state++;
break;
case 5:
if (!sub_811D4EC())
{
ptr->field_009e = 0;
ptr->state++;
}
break;
case 6:
ptr->field_009e++;
if (ptr->field_009e > 30)
{
sub_811D2EC(3);
ptr->state++;
}
break;
case 7:
if (!sub_811D4EC())
{
ptr->field_009e = 0;
ptr->state++;
}
break;
case 8:
ptr->field_009e++;
if (ptr->field_009e > 30)
{
PlaySE(SE_W255);
sub_811D2EC(4);
sub_811D4FC();
ptr->state++;
}
break;
case 9:
r4 = sub_811D530();
if (!(r4 | sub_811D4EC()))
{
sub_811D4D4();
ptr->state++;
}
break;
case 10:
sub_811D2EC(5);
ptr->state++;
break;
case 11:
if (!sub_811D4EC())
{
sub_811D2EC(6);
ptr->state++;
}
break;
case 12:
if (!sub_811D4EC())
{
sub_811D2D0();
ptr->state++;
}
break;
case 13:
sub_811C718(taskId, sub_811CE4C);
break;
}
}