diff --git a/asm/non_matching/color/SetEntityObjPalette.inc b/asm/non_matching/color/SetEntityObjPalette.inc deleted file mode 100644 index 38a34a20..00000000 --- a/asm/non_matching/color/SetEntityObjPalette.inc +++ /dev/null @@ -1,80 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - adds r4, r0, #0 - adds r3, r1, #0 - cmp r3, #0 - bge _0801D1A8 - movs r3, #0 -_0801D1A8: - adds r0, r4, #0 - adds r0, #0x28 - ldrb r0, [r0] - subs r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0x7e - bls _0801D1BE - adds r0, r4, #0 - adds r0, #0x27 - strb r3, [r0] -_0801D1BE: - movs r0, #0xf - adds r1, r3, #0 - ands r1, r0 - ldrb r2, [r4, #0x1a] - movs r5, #0x10 - rsbs r5, r5, #0 - adds r0, r5, #0 - ands r0, r2 - orrs r0, r1 - movs r2, #0xf - adds r1, r3, #0 - ands r1, r2 - lsls r1, r1, #4 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x1a] - lsls r1, r3, #2 - ldr r0, _0801D22C @ =gPaletteList - adds r4, r1, r0 - ldr r0, [r4] - lsls r0, r0, #0x1c - lsrs r0, r0, #0x1c - cmp r0, #4 - beq _0801D22A - ldrb r0, [r4, #1] - adds r0, #1 - strb r0, [r4, #1] - ldr r0, [r4] - lsls r0, r0, #0x18 - lsrs r3, r0, #0x1c - ldrb r1, [r4] - adds r0, r5, #0 - ands r0, r1 - movs r1, #3 - orrs r0, r1 - strb r0, [r4] - subs r3, #1 - cmp r3, #0 - beq _0801D22A - movs r7, #0xf - adds r6, r5, #0 - movs r5, #2 -_0801D212: - adds r4, #4 - lsls r2, r3, #4 - ldrb r1, [r4] - adds r0, r7, #0 - ands r0, r1 - orrs r0, r2 - ands r0, r6 - orrs r0, r5 - strb r0, [r4] - subs r3, #1 - cmp r3, #0 - bne _0801D212 -_0801D22A: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0801D22C: .4byte gPaletteList - .syntax divided diff --git a/src/color.c b/src/color.c index 17de6630..78cb5a11 100644 --- a/src/color.c +++ b/src/color.c @@ -13,13 +13,20 @@ extern Palette gUnk_02001A3C; void LoadObjPaletteAtIndex(u32 a1, u32 a2); void CleanUpObjPalettes(); u32 FindFreeObjPalette(u32); -void SetEntityObjPalette(Entity*, u32); +void SetEntityObjPalette(Entity*, s32); u32 sub_0801D458(u32); void sub_0801D48C(u32, u32); static void sub_0801CFD0(u32 a1); extern union SplitWord gUnk_08133368[]; +typedef struct { + u8 _0_0 : 4; + u8 _0_4 : 4; + u8 _1; + u16 _2; +} Palette2; + void ResetPaletteTable(u32 a1) { u32 i; @@ -152,9 +159,11 @@ u32 FindFreeObjPalette(u32 paletteCount) { return 0xffffffff; } -NONMATCH("asm/non_matching/color/SetEntityObjPalette.inc", void SetEntityObjPalette(Entity* entity, u32 palette)) { +void SetEntityObjPalette(Entity* entity, s32 palette) { u32 uVar1; - Palette* pal; + u32 mask; + FORCE_REGISTER(u32 tmp, r1); + Palette2* pPVar1; if (palette < 0) { palette = 0; @@ -162,21 +171,26 @@ NONMATCH("asm/non_matching/color/SetEntityObjPalette.inc", void SetEntityObjPale if (0x7e < (u8)(entity->spriteAnimation[2] - 1)) { entity->spriteAnimation[1] = palette; } - entity->palette.b.b0 = palette; - entity->palette.b.b4 = palette; - pal = &gPaletteList[palette]; - if ((s8)pal->_0_0 != 4) { - pal->_1++; - uVar1 = pal->_0_4; - pal->_0_0 = 3; + + entity->palette.b.b0 = palette & 0xf; + + mask = 0xF; + tmp = (palette & mask) << 4; + *(u8*)&entity->palette.b &= mask; + *(u8*)&entity->palette.b |= tmp; + + pPVar1 = (Palette2*)&gPaletteList[palette]; + if ((s8)pPVar1->_0_0 != 4) { + pPVar1->_1++; + uVar1 = pPVar1->_0_4; + pPVar1->_0_0 = 3; while (uVar1 = uVar1 - 1, uVar1 != 0) { - pal = pal + 1; - pal->_0_4 = uVar1; - pal->_0_0 = 2; + pPVar1 = pPVar1 + 1; + pPVar1->_0_4 = uVar1; + pPVar1->_0_0 = 2; } } } -END_NONMATCH void UnloadOBJPalette(Entity* entity) { u8* p = &entity->spriteAnimation[1];