decompile mon_markings

This commit is contained in:
drifloony 2017-07-17 18:47:41 -07:00
parent 67ced1d77e
commit 1af7c00d13
4 changed files with 380 additions and 1011 deletions

File diff suppressed because it is too large Load Diff

View File

@ -191,7 +191,7 @@ SECTIONS {
asm/pokenav.o(.text);
src/pokenav.o(.text);
asm/pokenav.o(.text_80F708C);
asm/mon_markings.o(.text);
src/mon_markings.o(.text);
src/mauville_old_man.o(.text);
asm/mauville_old_man.o(.text);
src/mail.o(.text);

377
src/mon_markings.c Normal file
View File

@ -0,0 +1,377 @@
#include "global.h"
#include "main.h"
#include "menu_cursor.h"
#include "text_window.h"
#include "songs.h"
#include "sound.h"
#include "sprite.h"
struct PokemonMarkMenu
{
/*0x0000*/ u16 baseTileTag;
/*0x0002*/ u16 basePaletteTag;
/*0x0004*/ u8 markings; // bit flags
/*0x0005*/ s8 cursorPos;
/*0x0006*/ bool8 markingsArray[4];
/*0x000A*/ u8 cursorBaseY;
/*0x000B*/ bool8 spriteSheetLoadRequired;
/*0x000C*/ struct Sprite *menuWindowSprites[2]; // upper and lower halves of menu window
/*0x0014*/ struct Sprite *menuMarkingSprites[4];
/*0x0024*/ struct Sprite *menuTextSprite;
/*0x0028*/ u8 *frameTiles;
/*0x002C*/ u16 *framePalette;
/*0x0030*/ u8 menuWindowSpriteTiles[0x1000];
/*0x1030*/ u8 filler1030[0x80];
/*0x10B0*/ u8 tileLoadState;
};
extern u8 gPokenavConditionMenuMisc_Gfx[];
extern u16 gUnknown_08E966B8[];
extern u16 gUnknown_083E49F4[];
extern u8 gUnknown_083E4A14[];
extern struct OamData gOamData_83E5214;
extern struct OamData gOamData_83E521C;
extern const union AnimCmd *const gSpriteAnimTable_83E5274[];
extern const union AnimCmd *const gSpriteAnimTable_83E52AC[];
extern struct OamData gOamData_83E52B4;
extern const union AnimCmd *const gSpriteAnimTable_83E533C[];
static EWRAM_DATA struct PokemonMarkMenu *sMenu = NULL;
void sub_80F761C(s16, s16, u16, u16);
void nullsub_65(struct Sprite *);
void sub_80F78CC(struct Sprite *);
void sub_80F7908(struct Sprite *);
struct Sprite *sub_80F7960(u16, u16, u16 *, u16);
void sub_80F727C(struct PokemonMarkMenu *ptr)
{
sMenu = ptr;
sMenu->spriteSheetLoadRequired = FALSE;
}
void sub_80F728C(void)
{
const struct FrameGraphics *frame = GetTextWindowFrameGraphics(gSaveBlock2.optionsWindowFrameType);
sMenu->frameTiles = frame->tiles;
sMenu->framePalette = frame->palette;
sMenu->tileLoadState = 0;
CpuFill16(0, sMenu->menuWindowSpriteTiles, sizeof(sMenu->menuWindowSpriteTiles));
}
bool8 sub_80F72D4(void)
{
u16 i;
u8 *dest = sMenu->menuWindowSpriteTiles + sMenu->tileLoadState * 0x100;
switch (sMenu->tileLoadState)
{
case 0:
CpuFastCopy(sMenu->frameTiles, dest, TILE_SIZE_4BPP);
for (i = 0; i < 6; i++)
{
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);
}
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 2, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);
sMenu->tileLoadState++;
break;
default:
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 3, dest, TILE_SIZE_4BPP);
for (i = 0; i < 6; i++)
{
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 4, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);
}
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 5, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);
sMenu->tileLoadState++;
break;
case 13:
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 6, dest, TILE_SIZE_4BPP);
for (i = 0; i < 6; i++)
{
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 7, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);
}
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 8, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);
sMenu->tileLoadState++;
return FALSE;
case 14:
return FALSE;
}
return TRUE;
}
void sub_80F7404(void)
{
sub_80F728C();
while (sub_80F72D4())
;
}
void sub_80F7418(u8 markings, s16 x, s16 y)
{
u16 i;
sMenu->cursorPos = 0;
sMenu->markings = markings;
for (i = 0; i < 4; i++)
sMenu->markingsArray[i] = (sMenu->markings >> i) & 1;
DestroyMenuCursor();
sub_80F761C(x, y, sMenu->baseTileTag, sMenu->basePaletteTag);
}
void sub_80F7470(void)
{
u16 i;
for (i = 0; i < 3; i++)
{
FreeSpriteTilesByTag(sMenu->baseTileTag + i);
}
FreeSpritePaletteByTag(sMenu->basePaletteTag);
FreeSpritePaletteByTag(sMenu->basePaletteTag + 1);
for (i = 0; i < 2; i++)
{
if (!sMenu->menuWindowSprites[i])
return;
DestroySprite(sMenu->menuWindowSprites[i]);
}
for (i = 0; i < 4; i++)
{
if (!sMenu->menuMarkingSprites[i])
return;
DestroySprite(sMenu->menuMarkingSprites[i]);
}
DestroyMenuCursor();
if (sMenu->menuTextSprite)
DestroySprite(sMenu->menuTextSprite);
}
bool8 sub_80F7500(void)
{
u16 i;
struct SpriteSheet sheets[3] =
{
{ sMenu->menuWindowSpriteTiles, 0x1000, sMenu->baseTileTag },
{ gPokenavConditionMenuMisc_Gfx, 0x520, sMenu->baseTileTag + 1 },
{ NULL, 0, 0 }
};
if (sMenu->spriteSheetLoadRequired)
{
LoadTilesForSpriteSheets(sheets);
sMenu->spriteSheetLoadRequired = FALSE;
}
if (gMain.newKeys & DPAD_UP)
{
s8 pos;
PlaySE(SE_SELECT);
pos = --sMenu->cursorPos;
if (pos < 0)
sMenu->cursorPos = 5;
return TRUE;
}
if (gMain.newKeys & DPAD_DOWN)
{
s8 pos;
PlaySE(SE_SELECT);
pos = ++sMenu->cursorPos;
if (pos > 5)
sMenu->cursorPos = 0;
return TRUE;
}
if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
switch (sMenu->cursorPos)
{
case 4:
sMenu->markings = 0;
for (i = 0; i < 4; i++)
sMenu->markings |= sMenu->markingsArray[i] << i;
return FALSE;
case 5:
return FALSE;
}
sMenu->markingsArray[sMenu->cursorPos] = sMenu->markingsArray[sMenu->cursorPos] ? FALSE : TRUE;
return TRUE;
}
if (gMain.newKeys & B_BUTTON)
{
PlaySE(SE_SELECT);
return FALSE;
}
return TRUE;
}
void sub_80F761C(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag)
{
u16 i;
u8 spriteId;
struct SpriteSheet sheets[] =
{
{ sMenu->menuWindowSpriteTiles, 0x1000, baseTileTag },
{ gPokenavConditionMenuMisc_Gfx, 0x520, baseTileTag + 1 },
{ NULL, 0 }
};
struct SpritePalette palettes[] =
{
{ sMenu->framePalette, basePaletteTag },
{ gUnknown_08E966B8, basePaletteTag + 1},
{ NULL, 0 }
};
struct SpriteTemplate sprTemplate;
struct SpriteTemplate *sprTemplatePtr = &sprTemplate;
sprTemplatePtr->tileTag = baseTileTag;
sprTemplatePtr->paletteTag = basePaletteTag;
sprTemplatePtr->oam = &gOamData_83E5214;
sprTemplatePtr->anims = gSpriteAnimTable_83E52AC;
sprTemplatePtr->images = NULL;
sprTemplatePtr->affineAnims = gDummySpriteAffineAnimTable;
sprTemplatePtr->callback = nullsub_65;
sMenu->spriteSheetLoadRequired = TRUE;
AllocTilesForSpriteSheets(sheets);
LoadSpritePalettes(palettes);
for (i = 0; i < 2; i++)
{
spriteId = CreateSprite(sprTemplatePtr, x + 32, y + 32, 2);
if (spriteId != 64)
{
sMenu->menuWindowSprites[i] = &gSprites[spriteId];
StartSpriteAnim(&gSprites[spriteId], i);
}
else
{
sMenu->menuWindowSprites[i] = NULL;
return;
}
}
sMenu->menuWindowSprites[1]->pos1.y = y + 96;
sprTemplatePtr->tileTag++;
sprTemplatePtr->paletteTag++;
sprTemplatePtr->anims = gSpriteAnimTable_83E5274;
sprTemplatePtr->callback = sub_80F78CC;
sprTemplatePtr->oam = &gOamData_83E521C;
for (i = 0; i < 4; i++)
{
spriteId = CreateSprite(sprTemplatePtr, x + 32, y + 16 + 16 * i, 1);
if (spriteId != 64)
{
sMenu->menuMarkingSprites[i] = &gSprites[spriteId];
gSprites[spriteId].data0 = i;
}
else
{
sMenu->menuMarkingSprites[i] = NULL;
return;
}
}
sprTemplatePtr->callback = SpriteCallbackDummy;
spriteId = CreateSprite(sprTemplatePtr, 0, 0, 1);
if (spriteId != 64)
{
sMenu->menuTextSprite = &gSprites[spriteId];
sMenu->menuTextSprite->oam.shape = ST_OAM_H_RECTANGLE;
sMenu->menuTextSprite->oam.size = 3;
StartSpriteAnim(sMenu->menuTextSprite, 9);
sMenu->menuTextSprite->pos1.x = x + 32;
sMenu->menuTextSprite->pos1.y = y + 80;
CalcCenterToCornerVec(sMenu->menuTextSprite, 1, 2, 0);
}
else
{
sMenu->menuTextSprite = NULL;
}
sMenu->cursorBaseY = y + 8;
sub_814A5C0(0, basePaletteTag + 1, 15, 0, 0x30);
sub_814A880(x + 8, sMenu->cursorBaseY);
sub_814AABC(sub_80F7908);
}
void nullsub_65(struct Sprite *sprite)
{
}
void sub_80F78CC(struct Sprite *sprite)
{
if (sMenu->markingsArray[sprite->data0])
StartSpriteAnim(sprite, 2 * sprite->data0 + 1);
else
StartSpriteAnim(sprite, 2 * sprite->data0);
}
void sub_80F7908(struct Sprite *sprite)
{
sprite->pos1.y = 16 * sMenu->cursorPos + sMenu->cursorBaseY;
}
struct Sprite *sub_80F7920(u16 tileTag, u16 paletteTag, u16 *palette)
{
if (!palette)
palette = gUnknown_083E49F4;
return sub_80F7960(tileTag, paletteTag, palette, 16);
}
struct Sprite *sub_80F7940(u16 tileTag, u16 paletteTag, u16 *palette)
{
if (!palette)
palette = gUnknown_083E49F4;
return sub_80F7960(tileTag, paletteTag, palette, 1);
}
struct Sprite *sub_80F7960(u16 tileTag, u16 paletteTag, u16 *palette, u16 size)
{
u8 spriteId;
struct SpriteTemplate sprTemplate;
struct SpriteSheet sheet = { gUnknown_083E4A14, 0x80, tileTag };
struct SpritePalette sprPalette = { palette, paletteTag };
sprTemplate.tileTag = tileTag;
sprTemplate.paletteTag = paletteTag;
sprTemplate.oam = &gOamData_83E52B4;
sprTemplate.anims = gSpriteAnimTable_83E533C;
sprTemplate.images = NULL;
sprTemplate.affineAnims = gDummySpriteAffineAnimTable;
sprTemplate.callback = nullsub_65;
sheet.size = size * 0x80;
LoadSpriteSheet(&sheet);
LoadSpritePalette(&sprPalette);
spriteId = CreateSprite(&sprTemplate, 0, 0, 0);
if (spriteId != 64)
return &gSprites[spriteId];
else
return NULL;
}
void sub_80F7A10(u8 markings, void *dest)
{
void *src = gUnknown_083E4A14 + markings * 0x80;
DmaCopy16(3, src, dest, 0x80);
}

View File

@ -746,9 +746,9 @@ gUnknown_020388B0: @ 20388B0
gUnknown_020388B4: @ 20388B4
.space 0x4
gUnknown_020388B8: @ 20388B8
.space 0x4
.include "src/mon_markings.o"
.align 2
gUnknown_020388BC: @ 20388BC
.space 0x4