fase 2: fades de jd8 a màquina d'estats i helper wait_frame_or_skip a les cinemàtiques

This commit is contained in:
2026-04-15 18:12:03 +02:00
parent 7f85b50c63
commit 80fa7b46e7
3 changed files with 1414 additions and 1341 deletions

View File

@@ -186,44 +186,89 @@ void JD8_SetPaletteColor(Uint8 index, Uint8 r, Uint8 g, Uint8 b) {
main_palette[index].b = b << 2;
}
void JD8_FadeOut() {
for (int j = 0; j < 32; j++) {
// Màquina d'estats del fade. Evita que JD8_FadeOut/JD8_FadeToPal hagen de
// mantindre whiles interns. Cada pas aplica un delta a la paleta activa i
// el caller decideix quan fer Flip.
namespace {
enum FadeType {
FADE_NONE = 0,
FADE_OUT,
FADE_TO_PAL,
};
constexpr int FADE_STEPS = 32;
FadeType fade_type = FADE_NONE;
Color fade_target[256];
int fade_step = 0;
void apply_fade_step() {
if (fade_type == FADE_OUT) {
for (int i = 0; i < 256; i++) {
if (main_palette[i].r >= 8)
main_palette[i].r -= 8;
else
main_palette[i].r = 0;
if (main_palette[i].g >= 8)
main_palette[i].g -= 8;
else
main_palette[i].g = 0;
if (main_palette[i].b >= 8)
main_palette[i].b -= 8;
else
main_palette[i].b = 0;
main_palette[i].r = main_palette[i].r >= 8 ? main_palette[i].r - 8 : 0;
main_palette[i].g = main_palette[i].g >= 8 ? main_palette[i].g - 8 : 0;
main_palette[i].b = main_palette[i].b >= 8 ? main_palette[i].b - 8 : 0;
}
} else if (fade_type == FADE_TO_PAL) {
for (int i = 0; i < 256; i++) {
main_palette[i].r = main_palette[i].r <= int(fade_target[i].r) - 8
? main_palette[i].r + 8
: fade_target[i].r;
main_palette[i].g = main_palette[i].g <= int(fade_target[i].g) - 8
? main_palette[i].g + 8
: fade_target[i].g;
main_palette[i].b = main_palette[i].b <= int(fade_target[i].b) - 8
? main_palette[i].b + 8
: fade_target[i].b;
}
JD8_Flip();
}
}
#define MAX(a, b) (a) > (b) ? (a) : (b)
} // namespace
void JD8_FadeStartOut() {
fade_type = FADE_OUT;
fade_step = 0;
}
void JD8_FadeStartToPal(JD8_Palette pal) {
fade_type = FADE_TO_PAL;
memcpy(fade_target, pal, sizeof(Color) * 256);
fade_step = 0;
}
bool JD8_FadeIsActive() {
return fade_type != FADE_NONE;
}
bool JD8_FadeTickStep() {
if (fade_type == FADE_NONE) return true;
apply_fade_step();
fade_step++;
if (fade_step >= FADE_STEPS) {
fade_type = FADE_NONE;
return true;
}
return false;
}
void JD8_FadeOut() {
JD8_FadeStartOut();
while (true) {
const bool done = JD8_FadeTickStep();
JD8_Flip();
if (done) break;
}
}
void JD8_FadeToPal(JD8_Palette pal) {
for (int j = 0; j < 32; j++) {
for (int i = 0; i < 256; i++) {
if (main_palette[i].r <= int(pal[i].r) - 8)
main_palette[i].r += 8;
else
main_palette[i].r = pal[i].r;
if (main_palette[i].g <= int(pal[i].g) - 8)
main_palette[i].g += 8;
else
main_palette[i].g = pal[i].g;
if (main_palette[i].b <= int(pal[i].b) - 8)
main_palette[i].b += 8;
else
main_palette[i].b = pal[i].b;
}
JD8_FadeStartToPal(pal);
while (true) {
const bool done = JD8_FadeTickStep();
JD8_Flip();
if (done) break;
}
}