diff options
Diffstat (limited to 'src/roulette_util.c')
-rwxr-xr-x | src/roulette_util.c | 424 |
1 files changed, 94 insertions, 330 deletions
diff --git a/src/roulette_util.c b/src/roulette_util.c index a197cfa09..c556a4af5 100755 --- a/src/roulette_util.c +++ b/src/roulette_util.c @@ -206,463 +206,227 @@ void sub_8151A9C(struct UnkStruct0 *r0, u16 r1) } } -void sub_8151B3C(struct InnerStruct203CF18 *arg0) +void InitPulseBlend(struct PulseBlend *pulseBlend) { u8 i = 0; - arg0->unk0 = 0; - memset(&arg0->unk4, 0, sizeof(arg0->unk4)); + pulseBlend->usedPulseBlendPalettes = 0; + memset(&pulseBlend->pulseBlendPalettes, 0, sizeof(pulseBlend->pulseBlendPalettes)); for (; i < 16; i++) - { - arg0->unk4[i].unk0 = i; - } + pulseBlend->pulseBlendPalettes[i].paletteSelector = i; } -int sub_8151B68(struct InnerStruct203CF18 *arg0, const struct InnerStruct203CF18_3 *arg1) +int InitPulseBlendPaletteSettings(struct PulseBlend *pulseBlend, const struct PulseBlendSettings *settings) { u8 i = 0; - struct InnerStruct203CF18_2 *r4 = NULL; + struct PulseBlendPalette *pulseBlendPalette = NULL; - if (!arg0->unk4[0].unk1_7) + if (!pulseBlend->pulseBlendPalettes[0].inUse) { - r4 = &arg0->unk4[0]; + pulseBlendPalette = &pulseBlend->pulseBlendPalettes[0]; } else { while (++i < 16) { - if (!arg0->unk4[i].unk1_7) + if (!pulseBlend->pulseBlendPalettes[i].inUse) { - r4 = &arg0->unk4[i]; + pulseBlendPalette = &pulseBlend->pulseBlendPalettes[i]; break; } } } - if (r4 == 0) + if (pulseBlendPalette == NULL) return 0xFF; - r4->unk1_0 = 0; - r4->unk1_4 = 0; - r4->unk1_6 = 1; - r4->unk1_7 = 1; - r4->unk2 = 0; - r4->unk3 = 0; - memcpy(&r4->unk4, arg1, sizeof(*arg1)); + pulseBlendPalette->blendCoeff = 0; + pulseBlendPalette->fadeDirection = 0; + pulseBlendPalette->available = 1; + pulseBlendPalette->inUse = 1; + pulseBlendPalette->delayCounter = 0; + pulseBlendPalette->fadeCycleCounter = 0; + memcpy(&pulseBlendPalette->pulseBlendSettings, settings, sizeof(*settings)); return i; } -void sub_8151BD4(struct InnerStruct203CF18_2 *arg0) +static void ClearPulseBlendPalettesSettings(struct PulseBlendPalette *pulseBlendPalette) { u16 i; - if (!arg0->unk1_6 && arg0->unk4.unk7_6) + if (!pulseBlendPalette->available && pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload) { - for (i = arg0->unk4.unk2; i < arg0->unk4.unk2 + arg0->unk4.unk4; i++) + for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++) gPlttBufferFaded[i] = gPlttBufferUnfaded[i]; } - memset(&arg0->unk4, 0, sizeof(arg0->unk4)); - arg0->unk1_0 = 0; - arg0->unk1_4 = 0; - arg0->unk1_5 = 0; - arg0->unk1_6 = 1; - arg0->unk1_7 = 0; - arg0->unk3 = 0; - arg0->unk2 = 0; + memset(&pulseBlendPalette->pulseBlendSettings, 0, sizeof(pulseBlendPalette->pulseBlendSettings)); + pulseBlendPalette->blendCoeff = 0; + pulseBlendPalette->fadeDirection = 0; + pulseBlendPalette->unk1_5 = 0; + pulseBlendPalette->available = 1; + pulseBlendPalette->inUse = 0; + pulseBlendPalette->fadeCycleCounter = 0; + pulseBlendPalette->delayCounter = 0; } -void sub_8151C50(struct InnerStruct203CF18 *arg0, u16 arg1, u8 arg2) +void UnloadUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection) { u16 i = 0; - if (!arg2) + if (!multiSelection) { - sub_8151BD4(&arg0->unk4[arg1 & 0xF]); + ClearPulseBlendPalettesSettings(&pulseBlend->pulseBlendPalettes[pulseBlendPaletteSelector & 0xF]); } else { for (i = 0; i < 16; i++) { - if ((arg1 & 1) && arg0->unk4[i].unk1_7) - sub_8151BD4(&arg0->unk4[i]); + if ((pulseBlendPaletteSelector & 1) && pulseBlend->pulseBlendPalettes[i].inUse) + ClearPulseBlendPalettesSettings(&pulseBlend->pulseBlendPalettes[i]); - arg1 >>= 1; + pulseBlendPaletteSelector >>= 1; } } } -// there seems to be a temp var involved inside the first if block -void sub_8151CA8(struct InnerStruct203CF18 *arg0, u16 arg1, u8 arg2) +void MarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection) { u8 i = 0; - if (!arg2) + if (!multiSelection) { - i = arg1 & 0xF; - arg0->unk4[i].unk1_6 = 0; - arg0->unk0 |= 1 << i; + i = pulseBlendPaletteSelector & 0xF; + pulseBlend->pulseBlendPalettes[i].available = 0; + pulseBlend->usedPulseBlendPalettes |= 1 << i; } else { for (i = 0; i < 16; i++) { - if (!(arg1 & 1) || !arg0->unk4[i].unk1_7 || !arg0->unk4[i].unk1_6) + if (!(pulseBlendPaletteSelector & 1) || !pulseBlend->pulseBlendPalettes[i].inUse || !pulseBlend->pulseBlendPalettes[i].available) { - arg1 <<= 1; + pulseBlendPaletteSelector <<= 1; } else { - arg0->unk4[i].unk1_6 = 0; - arg0->unk0 |= 1 << i; + pulseBlend->pulseBlendPalettes[i].available = 0; + pulseBlend->usedPulseBlendPalettes |= 1 << i; } } } } -void sub_8151D28(struct InnerStruct203CF18 *arg0, u16 arg1, u8 arg2) +void UnmarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection) { u16 i; - struct InnerStruct203CF18_2 *var0; + struct PulseBlendPalette *pulseBlendPalette; u8 j = 0; - if (!arg2) + if (!multiSelection) { - var0 = &arg0->unk4[arg1 & 0xF]; - if (!var0->unk1_6 && var0->unk1_7) + pulseBlendPalette = &pulseBlend->pulseBlendPalettes[pulseBlendPaletteSelector & 0xF]; + if (!pulseBlendPalette->available && pulseBlendPalette->inUse) { - if (var0->unk4.unk7_6) + if (pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload) { - for (i = var0->unk4.unk2; i < var0->unk4.unk2 + var0->unk4.unk4; i++) + for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++) gPlttBufferFaded[i] = gPlttBufferUnfaded[i]; } - var0->unk1_6 = 1; - arg0->unk0 &= ~(1 << j); + pulseBlendPalette->available = 1; + pulseBlend->usedPulseBlendPalettes &= ~(1 << j); } } else { for (j = 0; j < 16; j++) { - var0 = &arg0->unk4[j]; - if (!(arg1 & 1) || var0->unk1_6 || !var0->unk1_7) + pulseBlendPalette = &pulseBlend->pulseBlendPalettes[j]; + if (!(pulseBlendPaletteSelector & 1) || pulseBlendPalette->available || !pulseBlendPalette->inUse) { - arg1 <<= 1; + pulseBlendPaletteSelector <<= 1; } else { - if (var0->unk4.unk7_6) + if (pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload) { - for (i = var0->unk4.unk2; i < var0->unk4.unk2 + var0->unk4.unk4; i++) + for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++) gPlttBufferFaded[i] = gPlttBufferUnfaded[i]; } - var0->unk1_6 = 1; - arg0->unk0 &= ~(1 << j); + pulseBlendPalette->available = 1; + pulseBlend->usedPulseBlendPalettes &= ~(1 << j); } } } } -#ifdef NONMATCHING -void sub_8151E50(struct InnerStruct203CF18 *arg0) +void UpdatePulseBlend(struct PulseBlend *pulseBlend) { - struct InnerStruct203CF18_2 *var0; + struct PulseBlendPalette *pulseBlendPalette; u8 i = 0; - if (arg0->unk0) + if (pulseBlend->usedPulseBlendPalettes) { for (i = 0; i < 16; i++) { - var0 = &arg0->unk4[i]; - if ((!var0->unk1_6 && var0->unk1_7) && (!gPaletteFade.active || !var0->unk4.unk7_7)) + pulseBlendPalette = &pulseBlend->pulseBlendPalettes[i]; + if ((!pulseBlendPalette->available && pulseBlendPalette->inUse) && (!gPaletteFade.active || !pulseBlendPalette->pulseBlendSettings.unk7_7)) { - if (--var0->unk2 == 0xFF) + if (--pulseBlendPalette->delayCounter == 0xFF) { - var0->unk2 = var0->unk4.unk5; - BlendPalette(var0->unk4.unk2, var0->unk4.unk4, var0->unk1_0, var0->unk4.unk0); - switch (var0->unk4.unk7_4) + pulseBlendPalette->delayCounter = pulseBlendPalette->pulseBlendSettings.delay; + BlendPalette(pulseBlendPalette->pulseBlendSettings.paletteOffset, pulseBlendPalette->pulseBlendSettings.numColors, pulseBlendPalette->blendCoeff, pulseBlendPalette->pulseBlendSettings.blendColor); + switch (pulseBlendPalette->pulseBlendSettings.fadeType) { - case 0: - if (var0->unk1_0++ == var0->unk4.unk7_0) + case 0: // Fade all the way to the max blend amount, then wrap around + // BUG: This comparison will never be true for maxBlendCoeff values that are >= 8. This is because + // maxBlendCoeff is a signed 4-bit field, but blendCoeff is an unsigned 4-bit field. This code is never + // reached, anyway, so the bug is not observable in vanilla gameplay. + if (pulseBlendPalette->blendCoeff++ == pulseBlendPalette->pulseBlendSettings.maxBlendCoeff) { - var0->unk3++; - var0->unk1_0 = 0; + pulseBlendPalette->fadeCycleCounter++; + pulseBlendPalette->blendCoeff = 0; } break; - case 1: - if (var0->unk1_4) + case 1: // Fade in and out + if (pulseBlendPalette->fadeDirection) { - if (--var0->unk1_0 == 0) + if (--pulseBlendPalette->blendCoeff == 0) { - var0->unk3++; - var0->unk1_4 ^= 1; + pulseBlendPalette->fadeCycleCounter++; + pulseBlendPalette->fadeDirection ^= 1; } } else { - if (var0->unk1_0++ == var0->unk4.unk7_0 - 1) + u8 max = (pulseBlendPalette->pulseBlendSettings.maxBlendCoeff - 1) & 0xF; + if (pulseBlendPalette->blendCoeff++ == max) { - var0->unk3++; - var0->unk1_4 ^= 1; + pulseBlendPalette->fadeCycleCounter++; + pulseBlendPalette->fadeDirection ^= 1; } } break; - case 2: - if (var0->unk1_4) - var0->unk1_0 = 0; + case 2: // Flip back and forth + if (pulseBlendPalette->fadeDirection) + pulseBlendPalette->blendCoeff = 0; else - var0->unk1_0 = var0->unk4.unk7_0; + pulseBlendPalette->blendCoeff = pulseBlendPalette->pulseBlendSettings.maxBlendCoeff & 0xF; - var0->unk1_4 ^= 1; - var0->unk3++; + pulseBlendPalette->fadeDirection ^= 1; + pulseBlendPalette->fadeCycleCounter++; break; } - if (var0->unk4.unk6 != 0xFF && var0->unk3 == 0xFF) - sub_8151D28(arg0, var0->unk0, 0); + if (pulseBlendPalette->pulseBlendSettings.numFadeCycles != 0xFF + && pulseBlendPalette->fadeCycleCounter == pulseBlendPalette->pulseBlendSettings.numFadeCycles) + UnmarkUsedPulseBlendPalettes(pulseBlend, pulseBlendPalette->paletteSelector, FALSE); } } } } } -#else -NAKED -void sub_8151E50(struct InnerStruct203CF18 *arg0) -{ - asm_unified("\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - mov r10, r0\n\ - ldr r1, [sp]\n\ - ldrh r0, [r1]\n\ - cmp r0, 0\n\ - bne _08151E6C\n\ - b _08151FF6\n\ -_08151E6C:\n\ - movs r2, 0xF\n\ - mov r9, r2\n\ - movs r3, 0x10\n\ - negs r3, r3\n\ - mov r8, r3\n\ - movs r7, 0x1\n\ -_08151E78:\n\ - mov r5, r10\n\ - lsls r0, r5, 1\n\ - add r0, r10\n\ - lsls r0, 2\n\ - adds r0, 0x4\n\ - ldr r1, [sp]\n\ - adds r4, r1, r0\n\ - ldrb r2, [r4, 0x1]\n\ - movs r3, 0xC0\n\ - ands r3, r2\n\ - cmp r3, 0x80\n\ - beq _08151E92\n\ - b _08151FE6\n\ -_08151E92:\n\ - ldr r0, =gPaletteFade\n\ - ldrb r1, [r0, 0x7]\n\ - adds r0, r3, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08151EA8\n\ - ldrb r0, [r4, 0xB]\n\ - ands r3, r0\n\ - cmp r3, 0\n\ - beq _08151EA8\n\ - b _08151FE6\n\ -_08151EA8:\n\ - ldrb r0, [r4, 0x2]\n\ - subs r0, 0x1\n\ - strb r0, [r4, 0x2]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0xFF\n\ - beq _08151EB8\n\ - b _08151FE6\n\ -_08151EB8:\n\ - ldrb r0, [r4, 0x9]\n\ - strb r0, [r4, 0x2]\n\ - ldrh r0, [r4, 0x6]\n\ - ldrb r1, [r4, 0x8]\n\ - lsls r2, 28\n\ - lsrs r2, 28\n\ - ldrh r3, [r4, 0x4]\n\ - bl BlendPalette\n\ - ldrb r5, [r4, 0xB]\n\ - lsls r0, r5, 26\n\ - asrs r0, 30\n\ - cmp r0, 0x1\n\ - beq _08151F16\n\ - cmp r0, 0x1\n\ - bgt _08151EE4\n\ - cmp r0, 0\n\ - beq _08151EEA\n\ - b _08151FD0\n\ - .pool\n\ -_08151EE4:\n\ - cmp r0, 0x2\n\ - beq _08151F92\n\ - b _08151FD0\n\ -_08151EEA:\n\ - ldrb r2, [r4, 0x1]\n\ - lsls r1, r2, 28\n\ - lsrs r0, r1, 28\n\ - adds r0, 0x1\n\ - mov r3, r9\n\ - ands r0, r3\n\ - mov r6, r8\n\ - adds r3, r6, 0\n\ - ands r3, r2\n\ - orrs r3, r0\n\ - strb r3, [r4, 0x1]\n\ - lsrs r1, 28\n\ - lsls r0, r5, 28\n\ - asrs r0, 28\n\ - cmp r1, r0\n\ - bne _08151FD0\n\ - ldrb r0, [r4, 0x3]\n\ - adds r0, 0x1\n\ - strb r0, [r4, 0x3]\n\ - ands r3, r6\n\ - strb r3, [r4, 0x1]\n\ - b _08151FD0\n\ -_08151F16:\n\ - ldrb r3, [r4, 0x1]\n\ - movs r0, 0x10\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08151F54\n\ - lsls r0, r3, 28\n\ - lsrs r0, 28\n\ - subs r0, 0x1\n\ - mov r5, r9\n\ - ands r0, r5\n\ - mov r2, r8\n\ - ands r2, r3\n\ - orrs r2, r0\n\ - strb r2, [r4, 0x1]\n\ - cmp r0, 0\n\ - bne _08151FD0\n\ - ldrb r0, [r4, 0x3]\n\ - adds r0, 0x1\n\ - strb r0, [r4, 0x3]\n\ - lsls r0, r2, 27\n\ - lsrs r0, 31\n\ - eors r0, r7\n\ - ands r0, r7\n\ - lsls r0, 4\n\ - movs r3, 0x11\n\ - negs r3, r3\n\ - adds r1, r3, 0\n\ - ands r2, r1\n\ - orrs r2, r0\n\ - strb r2, [r4, 0x1]\n\ - b _08151FD0\n\ -_08151F54:\n\ - lsls r0, r5, 28\n\ - asrs r0, 28\n\ - subs r0, 0x1\n\ - mov r5, r9\n\ - ands r0, r5\n\ - lsls r2, r3, 28\n\ - lsrs r1, r2, 28\n\ - adds r1, 0x1\n\ - ands r1, r5\n\ - mov r5, r8\n\ - ands r3, r5\n\ - orrs r3, r1\n\ - strb r3, [r4, 0x1]\n\ - lsrs r2, 28\n\ - cmp r2, r0\n\ - bne _08151FD0\n\ - ldrb r0, [r4, 0x3]\n\ - adds r0, 0x1\n\ - strb r0, [r4, 0x3]\n\ - lsls r0, r3, 27\n\ - lsrs r0, 31\n\ - eors r0, r7\n\ - ands r0, r7\n\ - lsls r0, 4\n\ - movs r2, 0x11\n\ - negs r2, r2\n\ - adds r1, r2, 0\n\ - ands r3, r1\n\ - orrs r3, r0\n\ - strb r3, [r4, 0x1]\n\ - b _08151FD0\n\ -_08151F92:\n\ - ldrb r2, [r4, 0x1]\n\ - movs r0, 0x10\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08151FA2\n\ - mov r0, r8\n\ - ands r0, r2\n\ - b _08151FB0\n\ -_08151FA2:\n\ - lsls r1, r5, 28\n\ - asrs r1, 28\n\ - mov r3, r9\n\ - ands r1, r3\n\ - mov r0, r8\n\ - ands r0, r2\n\ - orrs r0, r1\n\ -_08151FB0:\n\ - strb r0, [r4, 0x1]\n\ - ldrb r2, [r4, 0x1]\n\ - lsls r0, r2, 27\n\ - lsrs r0, 31\n\ - eors r0, r7\n\ - ands r0, r7\n\ - lsls r0, 4\n\ - movs r5, 0x11\n\ - negs r5, r5\n\ - adds r1, r5, 0\n\ - ands r2, r1\n\ - orrs r2, r0\n\ - strb r2, [r4, 0x1]\n\ - ldrb r0, [r4, 0x3]\n\ - adds r0, 0x1\n\ - strb r0, [r4, 0x3]\n\ -_08151FD0:\n\ - ldrb r1, [r4, 0xA]\n\ - cmp r1, 0xFF\n\ - beq _08151FE6\n\ - ldrb r0, [r4, 0x3]\n\ - cmp r0, r1\n\ - bne _08151FE6\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp]\n\ - movs r2, 0\n\ - bl sub_8151D28\n\ -_08151FE6:\n\ - mov r0, r10\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - cmp r0, 0xF\n\ - bhi _08151FF6\n\ - b _08151E78\n\ -_08151FF6:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0"); -} -#endif // NONMATCHING void sub_8152008(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height) { |