Decompile a few pokemon summary screen functions

This commit is contained in:
DizzyEggg
2018-07-28 23:26:19 +02:00
parent 919e7b4387
commit 4080c6f831
3 changed files with 276 additions and 896 deletions

View File

@@ -27,21 +27,8 @@
#include "scanline_effect.h"
#include "menu_helpers.h"
#include "daycare.h"
struct ContestMove
{
u8 effect;
u8 type;
u8 comboID;
u8 combo[4];
};
struct ContestEffect
{
u8 type;
u8 appeal;
u8 jam;
};
#include "data2.h"
#include "contest.h"
extern struct UnkSummaryStruct* gUnknown_0203CF1C;
extern struct BgTemplate gUnknown_0861CBB4;
@@ -69,6 +56,8 @@ extern u8 gUnknown_0861CE74[];
extern u8 gUnknown_0861CE7B[];
extern struct WindowTemplate gUnknown_0861CCEC;
extern struct WindowTemplate gUnknown_0861CD14;
extern const u8 *const gContestEffectDescriptionPointers[];
extern const u8 *const gMoveDescriptionPointers[];
void sub_81C488C(u8 a);
extern u8 sub_81221EC();
@@ -96,6 +85,7 @@ extern u8 gText_PkmnInfo[];
extern u8 gText_PkmnSkills[];
extern u8 gText_BattleMoves[];
extern u8 gText_ContestMoves[];
extern u8 gText_HMMovesCantBeForgotten2[];
extern u8 gText_Cancel2[];
extern u8 gText_Info[];
extern u8 gText_Switch[];
@@ -144,7 +134,9 @@ extern u8 gUnknown_0861CE8E[];
extern u8 gText_OneDash[];
extern u8 gText_TwoDashes[];
extern u8 gText_ThreeDashes[];
extern u8 gText_Cancel[];
extern u8 gUnknown_0861CE97[];
extern const struct SpriteTemplate gUnknown_0861CFC4;
extern void sub_8199C30(u8 a, u8 b, u8 c, u8 d, u8 e, u8 f);
extern bool8 sub_81A6BF4();
@@ -173,6 +165,9 @@ void sub_81C4984();
void sub_81C4A08();
void sub_81C4A88();
void sub_81C4280();
void sub_81C43A0();
void sub_81C4484();
void sub_81C4420();
void sub_81C0510(u8 taskId);
void sub_81C171C(u8 taskId);
void ResetAllBgsCoordinates();
@@ -341,10 +336,7 @@ struct UnkSummaryStruct
u8 unk40C9;
u8 unk40CA;
u8 unk40CB[8];
u8 unk40D3;
u8 unk40D4;
u8 unk40D5;
u8 unk_filler5[0x19];
u8 unk40D3[0x1C];
u8 unk40EF;
s16 unk40F0;
u8 unk_filler4[6];
@@ -506,8 +498,8 @@ bool8 sub_81BFB10(void)
gMain.state++;
break;
case 17:
gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &gUnknown_0203CF1C->unk40F0);
if (gUnknown_0203CF1C->unk40D3 != 0xFF)
gUnknown_0203CF1C->unk40D3[0] = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &gUnknown_0203CF1C->unk40F0);
if (gUnknown_0203CF1C->unk40D3[0] != 0xFF)
{
gUnknown_0203CF1C->unk40F0 = 0;
gMain.state++;
@@ -890,10 +882,10 @@ void sub_81C0704(u8 taskId)
break;
case 1:
sub_81C4898();
DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D3]);
DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D3[0]]);
break;
case 2:
DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D4]);
DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D3[1]]);
break;
case 3:
sub_81C0098(&gUnknown_0203CF1C->currentMon);
@@ -916,10 +908,10 @@ void sub_81C0704(u8 taskId)
data[1] = 0;
break;
case 8:
gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &data[1]);
if (gUnknown_0203CF1C->unk40D3 == 0xFF)
gUnknown_0203CF1C->unk40D3[0] = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &data[1]);
if (gUnknown_0203CF1C->unk40D3[0] == 0xFF)
return;
gSprites[gUnknown_0203CF1C->unk40D3].data[2] = 1;
gSprites[gUnknown_0203CF1C->unk40D3[0]].data[2] = 1;
sub_81C0E24();
data[1] = 0;
break;
@@ -934,7 +926,7 @@ void sub_81C0704(u8 taskId)
sub_81C2524();
break;
case 12:
gSprites[gUnknown_0203CF1C->unk40D3].data[2] = 0;
gSprites[gUnknown_0203CF1C->unk40D3[0]].data[2] = 0;
break;
default:
if (sub_81221EC() == 0 && FuncIsActiveTask(sub_81C20F0) == 0)
@@ -1139,7 +1131,7 @@ void sub_81C0E48(u8 taskId)
gUnknown_0203CF1C->unk40C6 = 0;
move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6];
ClearWindowTilemap(0x13);
if (gSprites[gUnknown_0203CF1C->unk40D5].invisible == 0)
if (gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible == 0)
ClearWindowTilemap(0xD);
sub_81C1DA4(9, -3);
sub_81C1EFC(9, -3, move);
@@ -1245,7 +1237,7 @@ void sub_81C1070(s16 *a, s8 b, u8 *c)
if ((*c == 4 && gUnknown_0203CF1C->unk40C4 == 0) || a[1] == 1)
{
ClearWindowTilemap(19);
if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible)
if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible)
ClearWindowTilemap(13);
schedule_bg_copy_tilemap_to_vram(0);
sub_81C1DA4(9, -3);
@@ -1889,7 +1881,7 @@ void sub_81C1940(u8 taskId)
{
ClearWindowTilemap(19);
if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible)
if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible)
ClearWindowTilemap(13);
move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6];
gTasks[taskId].func = sub_81C174C;
@@ -1903,7 +1895,7 @@ void sub_81C1940(u8 taskId)
if (gUnknown_0203CF1C->unk40C0 != 3)
{
ClearWindowTilemap(19);
if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible)
if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible)
ClearWindowTilemap(13);
move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6];
gTasks[taskId].func = sub_81C174C;
@@ -1915,7 +1907,7 @@ void sub_81C1940(u8 taskId)
else if (gMain.newKeys & (A_BUTTON | B_BUTTON))
{
ClearWindowTilemap(19);
if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible)
if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible)
ClearWindowTilemap(13);
move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6];
sub_81C3E9C(move);
@@ -2208,7 +2200,7 @@ void sub_81C1E20(u8 taskId)
}
else
{
if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible)
if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible)
PutWindowTilemap(13);
PutWindowTilemap(19);
}
@@ -2259,7 +2251,7 @@ void sub_81C1F80(u8 taskId)
}
else
{
if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible)
if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible)
{
PutWindowTilemap(13);
}
@@ -3591,3 +3583,238 @@ void sub_81C3D54(u8 taskId)
}
data[0]++;
}
void sub_81C3E2C(u8 moveSlot)
{
u16 move;
if (moveSlot == 4)
move = gUnknown_0203CF1C->unk40C4;
else
move = gUnknown_0203CF1C->summary.moves[moveSlot];
if (move != MOVE_NONE)
{
u8 windowId = sub_81C2D2C(&gUnknown_0861CD14, 2);
sub_81C25A4(windowId, gContestEffectDescriptionPointers[gContestMoves[move].effect], 6, 1, 0, 0);
}
}
void sub_81C3E9C(u16 move)
{
u8 windowId = sub_81C2D2C(&gUnknown_0861CD14, 2);
FillWindowPixelBuffer(windowId, 0);
if (move != MOVE_NONE)
{
if (gUnknown_0203CF1C->unk40C0 == 2)
{
sub_81C3C5C(move);
sub_81C25A4(windowId, gMoveDescriptionPointers[move - 1], 6, 1, 0, 0);
}
else
{
sub_81C25A4(windowId, gContestEffectDescriptionPointers[gContestMoves[move].effect], 6, 1, 0, 0);
}
PutWindowTilemap(windowId);
}
else
{
ClearWindowTilemap(windowId);
}
schedule_bg_copy_tilemap_to_vram(0);
}
void sub_81C3F44(void)
{
u8 windowId1 = sub_81C2D2C(&gUnknown_0861CD14, 0);
u8 windowId2 = sub_81C2D2C(&gUnknown_0861CD14, 1);
if (gUnknown_0203CF1C->unk40C4 == MOVE_NONE)
{
sub_81C25A4(windowId1, gText_Cancel, 0, 0x41, 0, 1);
}
else
{
u16 move = gUnknown_0203CF1C->unk40C4;
if (gUnknown_0203CF1C->unk40C0 == 2)
sub_81C25A4(windowId1, gMoveNames[move], 0, 0x41, 0, 6);
else
sub_81C25A4(windowId1, gMoveNames[move], 0, 0x41, 0, 5);
ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].pp, 1, 2);
DynamicPlaceholderTextUtil_Reset();
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1);
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_0861CE97);
sub_81C25A4(windowId2, gStringVar4, GetStringRightAlignXOffset(1, gStringVar4, 0x2C), 0x41, 0, 12);
}
}
void sub_81C4064(void)
{
u8 windowId = sub_81C2D2C(&gUnknown_0861CD14, 0);
FillWindowPixelRect(windowId, 0, 0, 0x42, 0x48, 0x10);
CopyWindowToVram(windowId, 2);
}
void sub_81C40A0(u8 a, u8 b)
{
u8 windowId1 = sub_81C2D2C(&gUnknown_0861CD14, 0);
u8 windowId2 = sub_81C2D2C(&gUnknown_0861CD14, 1);
FillWindowPixelRect(windowId1, 0, 0, a * 16, 0x48, 0x10);
FillWindowPixelRect(windowId1, 0, 0, b * 16, 0x48, 0x10);
FillWindowPixelRect(windowId2, 0, 0, a * 16, 0x30, 0x10);
FillWindowPixelRect(windowId2, 0, 0, b * 16, 0x30, 0x10);
sub_81C3B08(a);
sub_81C3B08(b);
}
void sub_81C4154(void)
{
u8 windowId = sub_81C2D2C(&gUnknown_0861CD14, 2);
FillWindowPixelBuffer(windowId, 0);
sub_81C25A4(windowId, gText_HMMovesCantBeForgotten2, 6, 1, 0, 0);
}
void sub_81C4190(void)
{
u8 i;
for (i = 0; i < 28; i++)
gUnknown_0203CF1C->unk40D3[i] |= 0xFF;
}
void sub_81C41C0(u8 spriteArrayId)
{
if (gUnknown_0203CF1C->unk40D3[spriteArrayId] != 0xFF)
{
DestroySprite(&gSprites[gUnknown_0203CF1C->unk40D3[spriteArrayId]]);
gUnknown_0203CF1C->unk40D3[spriteArrayId] = 0xFF;
}
}
void sub_81C4204(u8 spriteArrayId, bool8 invisible)
{
gSprites[gUnknown_0203CF1C->unk40D3[spriteArrayId]].invisible = invisible;
}
void sub_81C424C(void)
{
u8 i;
for (i = 3; i < 28; i++)
{
if (gUnknown_0203CF1C->unk40D3[i] != 0xFF)
sub_81C4204(i, TRUE);
}
}
void sub_81C4280(void)
{
switch (gUnknown_0203CF1C->unk40C0)
{
case 0:
sub_81C43A0();
break;
case 2:
sub_81C4420();
sub_81C44F0();
break;
case 3:
sub_81C4484();
sub_81C44F0();
break;
}
}
void sub_81C42C8(void)
{
u8 i;
for (i = 3; i < 8; i++)
{
if (gUnknown_0203CF1C->unk40D3[i] == 0xFF)
gUnknown_0203CF1C->unk40D3[i] = CreateSprite(&gUnknown_0861CFC4, 0, 0, 2);
sub_81C4204(i, TRUE);
}
}
extern const u8 gUnknown_0861CFDC[];
void sub_81C4318(u8 typeId, u8 x, u8 y, u8 spriteArrayId)
{
struct Sprite *sprite = &gSprites[gUnknown_0203CF1C->unk40D3[spriteArrayId]];
StartSpriteAnim(sprite, typeId);
sprite->oam.paletteNum = gUnknown_0861CFDC[typeId];
sprite->pos1.x = x + 16;
sprite->pos1.y = y + 8;
sub_81C4204(spriteArrayId, FALSE);
}
void sub_81C43A0(void)
{
struct PokeSummary *summary = &gUnknown_0203CF1C->summary;
if (summary->isEgg)
{
sub_81C4318(TYPE_MYSTERY, 0x78, 0x30, 3);
sub_81C4204(4, TRUE);
}
else
{
sub_81C4318(gBaseStats[summary->species].type1, 0x78, 0x30, 3);
if (gBaseStats[summary->species].type1 != gBaseStats[summary->species].type2)
{
sub_81C4318(gBaseStats[summary->species].type2, 0xA0, 0x30, 4);
sub_81C4204(4, FALSE);
}
else
{
sub_81C4204(4, TRUE);
}
}
}
void sub_81C4420(void)
{
u8 i;
struct PokeSummary *summary = &gUnknown_0203CF1C->summary;
for (i = 0; i < 4; i++)
{
if (summary->moves[i] != MOVE_NONE)
sub_81C4318(gBattleMoves[summary->moves[i]].type, 0x55, 0x20 + (i * 0x10), i + 3);
else
sub_81C4204(i + 3, TRUE);
}
}
void sub_81C4484(void)
{
u8 i;
struct PokeSummary *summary = &gUnknown_0203CF1C->summary;
for (i = 0; i < 4; i++)
{
if (summary->moves[i] != MOVE_NONE)
sub_81C4318(NUMBER_OF_MON_TYPES + gContestMoves[summary->moves[i]].contestCategory, 0x55, 0x20 + (i * 0x10), i + 3);
else
sub_81C4204(i + 3, TRUE);
}
}
void sub_81C44F0(void)
{
if (gUnknown_0203CF1C->unk40C4 == MOVE_NONE)
{
sub_81C4204(7, TRUE);
}
else
{
if (gUnknown_0203CF1C->unk40C0 == 2)
sub_81C4318(gBattleMoves[gUnknown_0203CF1C->unk40C4].type, 0x55, 0x60, 7);
else
sub_81C4318(NUMBER_OF_MON_TYPES + gContestMoves[gUnknown_0203CF1C->unk40C4].contestCategory, 0x55, 0x60, 7);
}
}