mirror of
https://github.com/pret/pmd-red.git
synced 2026-09-30 04:47:58 -05:00
decomp more status graphics func
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user