diff --git a/asm/code_800ED38.s b/asm/code_800ED38.s index 49ee41eda..5a089b655 100644 --- a/asm/code_800ED38.s +++ b/asm/code_800ED38.s @@ -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 diff --git a/include/dungeon_pokemon_sprites.h b/include/dungeon_pokemon_sprites.h index 8e345aa64..2508b8f62 100644 --- a/include/dungeon_pokemon_sprites.h +++ b/include/dungeon_pokemon_sprites.h @@ -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; diff --git a/src/code_800F958.c b/src/code_800F958.c index da605ba7b..ffdb727ad 100644 --- a/src/code_800F958.c +++ b/src/code_800F958.c @@ -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;