decomp more status graphics func

This commit is contained in:
Seth Barberee
2024-12-28 14:39:01 -08:00
parent d0a0285f75
commit 46dbaf66af
3 changed files with 113 additions and 229 deletions

View File

@@ -925,232 +925,4 @@ _0800F5F8: .4byte 0x00000fff
_0800F5FC: .4byte 0x000003ff
thumb_func_end DrawStatusSprite
thumb_func_start LoadStatusGraphics
LoadStatusGraphics:
push {r4-r7,lr}
mov r7, r9
mov r6, r8
push {r6,r7}
lsls r1, 24
lsrs r1, 24
mov r9, r1
lsls r1, r0, 1
adds r1, r0
lsls r1, 3
ldr r0, _0800F660
adds r1, r0
ldr r7, [r1, 0x14]
ldr r3, [r1, 0x10]
ldr r2, [r1]
ldr r0, [r1, 0x4]
muls r0, r2
lsls r4, r0, 5
mov r8, r4
ldr r0, [r1, 0x8]
ldr r1, _0800F664
adds r0, r1
lsls r5, r0, 5
adds r6, r5, 0
ldr r0, _0800F668
ldr r0, [r0]
ldr r0, [r0]
cmp r0, 0
bge _0800F63C
adds r0, 0x3
_0800F63C:
asrs r0, 2
adds r1, r3, 0
bl __modsi3
muls r0, r4
ldr r1, _0800F66C
adds r0, r1
adds r1, r7, r0
mov r2, r9
cmp r2, 0
beq _0800F674
ldr r2, _0800F670
adds r0, r5, r2
adds r2, r4, 0
bl sub_80098BC
b _0800F67E
.align 2, 0
_0800F660: .4byte gStatusGraphics
_0800F664: .4byte 0x0000032b
_0800F668: .4byte gDungeonPokemonSprites
_0800F66C: .4byte gStatusGraphics4bpp
_0800F670: .4byte 0x06010000
_0800F674:
ldr r2, _0800F68C
adds r0, r6, r2
mov r2, r8
bl CpuCopy
_0800F67E:
pop {r3,r4}
mov r8, r3
mov r9, r4
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_0800F68C: .4byte 0x06010000
thumb_func_end LoadStatusGraphics
thumb_func_start InitDungeonPokemonSprites
InitDungeonPokemonSprites:
push {r4,r5,lr}
ldr r5, _0800F738
ldr r0, [r5]
cmp r0, 0
bne _0800F6AC
ldr r4, _0800F73C
adds r0, r4, 0
movs r1, 0xC
bl MemoryAlloc
str r0, [r5]
adds r1, r4, 0
bl MemoryClear8
_0800F6AC:
ldr r1, [r5]
movs r0, 0
str r0, [r1]
movs r0, 0x1
movs r1, 0
bl LoadStatusGraphics
movs r0, 0x2
movs r1, 0
bl LoadStatusGraphics
movs r0, 0x3
movs r1, 0
bl LoadStatusGraphics
movs r0, 0x4
movs r1, 0
bl LoadStatusGraphics
movs r0, 0x5
movs r1, 0
bl LoadStatusGraphics
movs r0, 0x6
movs r1, 0
bl LoadStatusGraphics
movs r0, 0x7
movs r1, 0
bl LoadStatusGraphics
movs r0, 0x8
movs r1, 0
bl LoadStatusGraphics
movs r0, 0x9
movs r1, 0
bl LoadStatusGraphics
movs r0, 0xA
movs r1, 0
bl LoadStatusGraphics
movs r0, 0xB
movs r1, 0
bl LoadStatusGraphics
movs r0, 0xC
movs r1, 0
bl LoadStatusGraphics
movs r0, 0xD
movs r1, 0
bl LoadStatusGraphics
movs r0, 0xE
movs r1, 0
bl LoadStatusGraphics
movs r0, 0xF
movs r1, 0
bl LoadStatusGraphics
movs r0, 0x10
movs r1, 0
bl LoadStatusGraphics
pop {r4,r5}
pop {r0}
bx r0
.align 2, 0
_0800F738: .4byte gDungeonPokemonSprites
_0800F73C: .4byte 0x00000584
thumb_func_end InitDungeonPokemonSprites
thumb_func_start FreeDungeonPokemonSprites
FreeDungeonPokemonSprites:
push {r4,lr}
ldr r4, _0800F758
ldr r0, [r4]
cmp r0, 0
beq _0800F752
bl MemoryFree
movs r0, 0
str r0, [r4]
_0800F752:
pop {r4}
pop {r0}
bx r0
.align 2, 0
_0800F758: .4byte gDungeonPokemonSprites
thumb_func_end FreeDungeonPokemonSprites
thumb_func_start UpdateDungeonPokemonSprite
@ void UpdateDungeonPokemonSprite(int id, short species, int status, char visible)
UpdateDungeonPokemonSprite:
push {r4-r7,lr}
adds r4, r0, 0
adds r7, r2, 0
lsls r1, 16
asrs r5, r1, 16
lsls r3, 24
lsrs r6, r3, 24
ldr r0, _0800F790
ldr r0, [r0]
cmp r0, 0
beq _0800F788
adds r0, r4, 0
bl GetDungeonPokemonSprite
cmp r0, 0
beq _0800F788
movs r1, 0
strh r5, [r0, 0x8]
str r7, [r0, 0xC]
strb r6, [r0, 0x10]
adds r0, 0x38
strb r1, [r0]
_0800F788:
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_0800F790: .4byte gDungeonPokemonSprites
thumb_func_end UpdateDungeonPokemonSprite
thumb_func_start sub_800F794
sub_800F794:
push {r4-r6,lr}
adds r1, r0, 0
adds r4, r2, 0
adds r5, r3, 0
ldr r6, [sp, 0x10]
ldr r0, _0800F7CC
ldr r0, [r0]
cmp r0, 0
beq _0800F7C6
adds r0, r1, 0
bl GetDungeonPokemonSprite
adds r2, r0, 0
cmp r2, 0
beq _0800F7C6
adds r1, r2, 0
adds r1, 0x38
movs r0, 0x1
strb r0, [r1]
strh r4, [r2, 0x3C]
strh r5, [r2, 0x3E]
ldr r0, [r6]
str r0, [r2, 0x20]
ldr r0, [r6, 0xC]
str r0, [r2, 0x24]
_0800F7C6:
pop {r4-r6}
pop {r0}
bx r0
.align 2, 0
_0800F7CC: .4byte gDungeonPokemonSprites
thumb_func_end sub_800F794
.align 2,0

View File

@@ -26,6 +26,7 @@ typedef struct DungeonPokemonSprite
/* 0x24 */ u32 unk24;
/* 0x28 */ DungeonPokemonStatusSprite statusSprites[2];
/* 0x38 */ u8 unk38;
u16 fill3A;
/* 0x3C */ u16 unk3C;
/* 0x3E */ u16 unk3E;
} DungeonPokemonSprite;

View File

@@ -1,16 +1,127 @@
#include "global.h"
#include "code_800F958.h"
#include "code_8009804.h"
#include "cpu.h"
#include "dungeon_pokemon_sprites.h"
#include "memory.h"
struct StatusGraphicsInfo
{
/* 0x0 */ s32 width;
/* 0x4 */ s32 height;
/* 0x8 */ s32 vramIndex;
/* 0xC */ s32 unk;
/* 0x10 */ s32 graphicsCount;
/* 0x14 */ s32 offsetIntoGraphic;
};
extern struct StatusGraphicsInfo gStatusGraphics[]; // 0x80CE79C
extern u8 *gStatusGraphics4bpp[]; // TODO use INCBIN_U8
extern DungeonPokemonSprite *NewDungeonPokemonSprite(void);
extern DungeonPokemonSprite* GetDungeonPokemonSprite(s32 id);
extern DungeonPos gUnknown_80D3564;
void LoadStatusGraphics(s32, s32);
void sub_800F2EC(DungeonPokemonSprite *, s32, s16 *);
void LoadStatusGraphics(s32 graphicIndex, bool8 param_2)
{
s32 frame;
s32 size;
s32 vramIndex;
s32 offset;
u8 *ptr;
s32 graphicsCount;
struct StatusGraphicsInfo *graphic = &gStatusGraphics[graphicIndex];
offset = graphic->offsetIntoGraphic;
graphicsCount = graphic->graphicsCount;
size = graphic->width * graphic->height * 0x20;
vramIndex = (graphic->vramIndex + 0x32b) * 0x20;
frame = (gDungeonPokemonSprites->frame / 4) % graphicsCount;
frame *= size;
ptr = (u8 *)gStatusGraphics4bpp + (offset) + (frame);
if (param_2) {
sub_80098BC((void *)(VRAM + 0x10000 + vramIndex), (void *)ptr, size);
}
else {
CpuCopy((void *)(VRAM + 0x10000 + vramIndex), ptr, size);
}
return;
}
void InitDungeonPokemonSprites(void)
{
if (gDungeonPokemonSprites == NULL) {
gDungeonPokemonSprites = MemoryAlloc(sizeof(DungeonPokemonSprites),0xc);
MemoryClear8(gDungeonPokemonSprites,sizeof(DungeonPokemonSprites));
}
gDungeonPokemonSprites->frame = 0;
LoadStatusGraphics(1,0);
LoadStatusGraphics(2,0);
LoadStatusGraphics(3,0);
LoadStatusGraphics(4,0);
LoadStatusGraphics(5,0);
LoadStatusGraphics(6,0);
LoadStatusGraphics(7,0);
LoadStatusGraphics(8,0);
LoadStatusGraphics(9,0);
LoadStatusGraphics(10,0);
LoadStatusGraphics(0xb,0);
LoadStatusGraphics(0xc,0);
LoadStatusGraphics(0xd,0);
LoadStatusGraphics(0xe,0);
LoadStatusGraphics(0xf,0);
LoadStatusGraphics(0x10,0);
return;
}
void FreeDungeonPokemonSprites(void)
{
if (gDungeonPokemonSprites != 0) {
MemoryFree(gDungeonPokemonSprites);
gDungeonPokemonSprites = NULL;
}
}
void UpdateDungeonPokemonSprite(s32 id, s32 species, s32 status, u32 visible)
{
DungeonPokemonSprite *sprite;
s32 species_s32 = (s16)species;
u32 visible_u8 = (u8)visible;
if (gDungeonPokemonSprites != 0) {
sprite = GetDungeonPokemonSprite(id);
if (sprite != 0) {
sprite->species = species_s32;
sprite->status = status;
sprite->visible = visible_u8;
sprite->unk38 = 0;
}
}
}
void sub_800F794(s32 id, s32 r1, s32 r2, s32 r3, s32 *r4)
{
if(gDungeonPokemonSprites)
{
DungeonPokemonSprite *sprite = GetDungeonPokemonSprite(id);
if(sprite)
{
sprite->unk38 = 1;
sprite->unk3C = r2;
sprite->unk3E = r3;
sprite->unk20 = r4[0];
sprite->unk24 = r4[3];
}
}
}
void sub_800F7D0(s16 *r0)
{
s32 index;