diff options
Diffstat (limited to 'src/field/field_weather.c')
-rw-r--r-- | src/field/field_weather.c | 1215 |
1 files changed, 0 insertions, 1215 deletions
diff --git a/src/field/field_weather.c b/src/field/field_weather.c deleted file mode 100644 index 7beb1b440..000000000 --- a/src/field/field_weather.c +++ /dev/null @@ -1,1215 +0,0 @@ -#include "global.h" -#include "blend_palette.h" -#include "field_map_obj.h" -#include "field_weather.h" -#include "palette.h" -#include "random.h" -#include "script.h" -#include "constants/weather.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "trig.h" -#include "ewram.h" - -#define MACRO1(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00)) - -enum { - GAMMA_NONE, - GAMMA_NORMAL, - GAMMA_ALT, -}; - -struct RGBColor -{ - u16 r:5; - u16 g:5; - u16 b:5; -}; - -struct WeatherPaletteData -{ - u16 gammaShiftColors[8][0x1000]; // 0x1000 is the number of bytes that make up all palettes. -}; - -struct WeatherCallbacks -{ - void (*initVars)(void); - void (*main)(void); - void (*initAll)(void); - bool8 (*finish)(void); -}; - -EWRAM_DATA struct Weather gWeather = {0}; -EWRAM_DATA u8 gFieldEffectPaletteGammaTypes[32] = {0}; -EWRAM_DATA u16 gUnknown_0202FF58 = {0}; - -static const u8 *sPaletteGammaTypes; - -const u8 DroughtPaletteData_0[] = INCBIN_U8("graphics/weather/drought0.bin.lz"); -const u8 DroughtPaletteData_1[] = INCBIN_U8("graphics/weather/drought1.bin.lz"); -const u8 DroughtPaletteData_2[] = INCBIN_U8("graphics/weather/drought2.bin.lz"); -const u8 DroughtPaletteData_3[] = INCBIN_U8("graphics/weather/drought3.bin.lz"); -const u8 DroughtPaletteData_4[] = INCBIN_U8("graphics/weather/drought4.bin.lz"); -const u8 DroughtPaletteData_5[] = INCBIN_U8("graphics/weather/drought5.bin.lz"); - -static const u8 *const sCompressedDroughtPalettes[] = -{ - DroughtPaletteData_0, - DroughtPaletteData_1, - DroughtPaletteData_2, - DroughtPaletteData_3, - DroughtPaletteData_4, - DroughtPaletteData_5, - (u8*)eDroughtPaletteData.gammaShiftColors, -}; - -// This is a pointer to gWeather. All code in this file accesses gWeather directly, -// while code in other field weather files accesses gWeather through this pointer. -// This is likely the result of compiler optimization, since using the pointer in -// this file produces the same result as accessing gWeather directly. -struct Weather *const gWeatherPtr = &gWeather; - -static bool8 LightenSpritePaletteInFog(u8); -static void BuildGammaShiftTables(void); -static void UpdateWeatherGammaShift(void); -static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex); -static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor); -static void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor); -static void ApplyFogBlend(u8 blendCoeff, u16 blendColor); -static bool8 FadeInScreen_RainShowShade(void); -static bool8 FadeInScreen_Drought(void); -static bool8 FadeInScreen_Fog1(void); -static void FadeInScreenWithWeather(void); -static void DoNothing(void); -void None_Init(void); -void None_Main(void); -bool8 None_Finish(void); -void Clouds_InitVars(void); -void Clouds_Main(void); -void Clouds_InitAll(void); -bool8 Clouds_Finish(void); -void Weather2_InitVars(void); -void Weather2_Main(void); -void Weather2_InitAll(void); -bool8 Weather2_Finish(void); -void LightRain_InitVars(void); -void LightRain_Main(void); -void LightRain_InitAll(void); -bool8 LightRain_Finish(void); -void Snow_InitVars(void); -void Snow_Main(void); -void Snow_InitAll(void); -bool8 Snow_Finish(void); -void MedRain_InitVars(void); -void Rain_Main(void); -void MedRain_InitAll(void); -bool8 Rain_Finish(void); -void Fog1_InitVars(void); -void Fog1_Main(void); -void Fog1_InitAll(void); -bool8 Fog1_Finish(void); -void Ash_InitVars(void); -void Ash_Main(void); -void Ash_InitAll(void); -bool8 Ash_Finish(void); -void Sandstorm_InitVars(void); -void Sandstorm_Main(void); -void Sandstorm_InitAll(void); -bool8 Sandstorm_Finish(void); -void Fog2_InitVars(void); -void Fog2_Main(void); -void Fog2_InitAll(void); -bool8 Fog2_Finish(void); -void Fog1_InitVars(void); -void Fog1_Main(void); -void Fog1_InitAll(void); -bool8 Fog1_Finish(void); -void Shade_InitVars(void); -void Shade_Main(void); -void Shade_InitAll(void); -bool8 Shade_Finish(void); -void Drought_InitVars(void); -void Drought_Main(void); -void Drought_InitAll(void); -bool8 Drought_Finish(void); -void HeavyRain_InitVars(void); -void Rain_Main(void); -void HeavyRain_InitAll(void); -bool8 Rain_Finish(void); -void Bubbles_InitVars(void); -void Bubbles_Main(void); -void Bubbles_InitAll(void); -bool8 Bubbles_Finish(void); - -static const struct WeatherCallbacks sWeatherFuncs[] = -{ - {None_Init, None_Main, None_Init, None_Finish}, - {Clouds_InitVars, Clouds_Main, Clouds_InitAll, Clouds_Finish}, - {Weather2_InitVars, Weather2_Main, Weather2_InitAll, Weather2_Finish}, - {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, - {Snow_InitVars, Snow_Main, Snow_InitAll, Snow_Finish}, - {MedRain_InitVars, Rain_Main, MedRain_InitAll, Rain_Finish}, - {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish}, - {Ash_InitVars, Ash_Main, Ash_InitAll, Ash_Finish}, - {Sandstorm_InitVars, Sandstorm_Main, Sandstorm_InitAll, Sandstorm_Finish}, - {Fog2_InitVars, Fog2_Main, Fog2_InitAll, Fog2_Finish}, - {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish}, - {Shade_InitVars, Shade_Main, Shade_InitAll, Shade_Finish}, - {Drought_InitVars, Drought_Main, Drought_InitAll, Drought_Finish}, - {HeavyRain_InitVars, Rain_Main, HeavyRain_InitAll, Rain_Finish}, - {Bubbles_InitVars, Bubbles_Main, Bubbles_InitAll, Bubbles_Finish}, -}; - -void (*const gWeatherPalStateFuncs[])(void) = -{ - UpdateWeatherGammaShift, // WEATHER_PAL_STATE_CHANGING_WEATHER - FadeInScreenWithWeather, // WEATHER_PAL_STATE_SCREEN_FADING_IN - DoNothing, // WEATHER_PAL_STATE_SCREEN_FADING_OUT - DoNothing, // WEATHER_PAL_STATE_IDLE -}; - -// This table specifies which of the gamma shift tables should be -// applied to each of the background and sprite palettes. -static const u8 sBasePaletteGammaTypes[32] = -{ - // background palettes - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NONE, - GAMMA_NONE, - // sprite palettes - GAMMA_ALT, - GAMMA_NORMAL, - GAMMA_ALT, - GAMMA_ALT, - GAMMA_ALT, - GAMMA_ALT, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_ALT, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, -}; - -const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal"); - -void StartWeather(void) -{ - u8 index; - - if (!FuncIsActiveTask(Task_WeatherMain)) - { - index = AllocSpritePalette(0x1200); - CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32); - BuildGammaShiftTables(); - gWeatherPtr->altGammaSpritePalIndex = index; - gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(0x1201); - gWeatherPtr->rainSpriteCount = 0; - gWeatherPtr->unknown_6D8 = 0; - gWeatherPtr->cloudSpritesCreated = 0; - gWeatherPtr->snowflakeSpriteCount = 0; - gWeatherPtr->ashSpritesCreated = 0; - gWeatherPtr->fog1SpritesCreated = 0; - gWeatherPtr->fog2SpritesCreated = 0; - gWeatherPtr->sandstormSprites1Created = 0; - gWeatherPtr->sandstormSprites2Created = 0; - gWeatherPtr->unknown_72E = 0; - gWeatherPtr->lightenedFogSpritePalsCount = 0; - Weather_SetBlendCoeffs(16, 0); - gWeatherPtr->currWeather = 0; - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; - gWeatherPtr->readyForInit = FALSE; - gWeatherPtr->weatherChangeComplete = TRUE; - gWeatherPtr->taskId = CreateTask(Task_WeatherInit, 80); - } -} - -void ChangeWeather(u8 weather) -{ - if (weather != WEATHER_RAIN_LIGHT && weather != WEATHER_RAIN_MED && weather != WEATHER_RAIN_HEAVY) - { - PlayRainSoundEffect(); - } - - if (gWeatherPtr->nextWeather != weather && gWeatherPtr->currWeather == weather) - { - sWeatherFuncs[weather].initVars(); - } - - gWeatherPtr->weatherChangeComplete = FALSE; - gWeatherPtr->nextWeather = weather; - gWeatherPtr->finishStep = 0; -} - -void sub_807C988(u8 weather) -{ - PlayRainSoundEffect(); - gWeatherPtr->currWeather = weather; - gWeatherPtr->nextWeather = weather; -} - -void sub_807C9B4(u8 weather) -{ - PlayRainSoundEffect(); - gWeatherPtr->currWeather = weather; - gWeatherPtr->nextWeather = weather; - gWeatherPtr->readyForInit = TRUE; -} - -void Task_WeatherInit(u8 taskId) -{ - // Waits until it's ok to initialize weather. - // When the screen fades in, this is set to TRUE. - if (gWeatherPtr->readyForInit) - { - sWeatherFuncs[gWeatherPtr->currWeather].initAll(); - gTasks[taskId].func = Task_WeatherMain; - } -} - -void Task_WeatherMain(u8 taskId) -{ - if (gWeatherPtr->currWeather != gWeatherPtr->nextWeather) - { - if (!sWeatherFuncs[gWeatherPtr->currWeather].finish()) - { - // Finished cleaning up previous weather. Now transition to next weather. - sWeatherFuncs[gWeatherPtr->nextWeather].initVars(); - gWeatherPtr->gammaStepFrameCounter = 0; - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; - gWeatherPtr->currWeather = gWeatherPtr->nextWeather; - gWeatherPtr->weatherChangeComplete = TRUE; - } - } - else - { - sWeatherFuncs[gWeatherPtr->currWeather].main(); - } - - gWeatherPalStateFuncs[gWeatherPtr->palProcessingState](); -} - -void None_Init(void) -{ - gWeatherPtr->gammaTargetIndex = 0; - gWeatherPtr->gammaStepDelay = 0; -} - -void None_Main(void) -{ -} - -u8 None_Finish(void) -{ - return 0; -} - -// Builds two tables that contain gamma shifts for palette colors. -// It's unclear why the two tables aren't declared as const arrays, since -// this function always builds the same two tables. -static void BuildGammaShiftTables(void) -{ - u16 v0; - u8 (*v1)[32]; - u16 v2; - u16 v4; - u16 v5; - u16 v6; - u16 v9; - u32 v10; - u16 v11; - s16 dunno; - - sPaletteGammaTypes = sBasePaletteGammaTypes; - for (v0 = 0; v0 <= 1; v0++) - { - if (v0 == 0) - v1 = gWeatherPtr->gammaShifts; - else - v1 = gWeatherPtr->altGammaShifts; - - for (v2 = 0; v2 < 32; v2++) - { - v4 = v2 << 8; - if (v0 == 0) - v5 = (v2 << 8) / 16; - else - v5 = 0; - for (v6 = 0; v6 <= 2; v6++) - { - v4 = (v4 - v5); - v1[v6][v2] = v4 >> 8; - } - v9 = v4; - v10 = 0x1f00 - v4; - if ((0x1f00 - v4) < 0) - { - v10 += 0xf; - } - v11 = v10 >> 4; - if (v2 < 12) - { - for (; v6 < 19; v6++) - { - v4 += v11; - dunno = v4 - v9; - if (dunno > 0) - v4 -= (dunno + ((u16)dunno >> 15)) >> 1; - v1[v6][v2] = v4 >> 8; - if (v1[v6][v2] > 0x1f) - v1[v6][v2] = 0x1f; - } - } - else - { - for (; v6 < 19; v6++) - { - v4 += v11; - v1[v6][v2] = v4 >> 8; - if (v1[v6][v2] > 0x1f) - v1[v6][v2] = 0x1f; - } - } - } - } -} - -// When the weather is changing, it gradually updates the palettes -// towards the desired gamma shift. -static void UpdateWeatherGammaShift(void) -{ - if (gWeatherPtr->gammaIndex == gWeatherPtr->gammaTargetIndex) - { - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; - } - else - { - if (++gWeatherPtr->gammaStepFrameCounter >= gWeatherPtr->gammaStepDelay) - { - gWeatherPtr->gammaStepFrameCounter = 0; - if (gWeatherPtr->gammaIndex < gWeatherPtr->gammaTargetIndex) - gWeatherPtr->gammaIndex++; - else - gWeatherPtr->gammaIndex--; - - ApplyGammaShift(0, 32, gWeatherPtr->gammaIndex); - } - } -} - -static void FadeInScreenWithWeather(void) -{ - if (++gWeatherPtr->unknown_6CB > 1) - gWeatherPtr->unknown_6CA = 0; - - switch (gWeatherPtr->currWeather) - { - case WEATHER_RAIN_LIGHT: - case WEATHER_RAIN_MED: - case WEATHER_RAIN_HEAVY: - case WEATHER_SNOW: - case WEATHER_SHADE: - if (FadeInScreen_RainShowShade() == FALSE) - { - gWeatherPtr->gammaIndex = 3; - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; - } - break; - case WEATHER_DROUGHT: - if (FadeInScreen_Drought() == FALSE) - { - gWeatherPtr->gammaIndex = -6; - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; - } - break; - case WEATHER_FOG_1: - if (FadeInScreen_Fog1() == FALSE) - { - gWeatherPtr->gammaIndex = 0; - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; - } - break; - case WEATHER_ASH: - case WEATHER_SANDSTORM: - case WEATHER_FOG_2: - case WEATHER_FOG_3: - default: - if (!gPaletteFade.active) - { - gWeatherPtr->gammaIndex = gWeatherPtr->gammaTargetIndex; - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; - } - break; - } -} - -bool8 FadeInScreen_RainShowShade(void) -{ - if (gWeatherPtr->fadeScreenCounter == 16) - return FALSE; - - if (++gWeatherPtr->fadeScreenCounter >= 16) - { - ApplyGammaShift(0, 32, 3); - gWeatherPtr->fadeScreenCounter = 16; - return FALSE; - } - - ApplyGammaShiftWithBlend(0, 32, 3, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); - return TRUE; -} - -bool8 FadeInScreen_Drought(void) -{ - if (gWeatherPtr->fadeScreenCounter == 16) - return FALSE; - - if (++gWeatherPtr->fadeScreenCounter >= 16) - { - ApplyGammaShift(0, 32, -6); - gWeatherPtr->fadeScreenCounter = 16; - return FALSE; - } - - ApplyDroughtGammaShiftWithBlend(-6, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); - return TRUE; -} - -bool8 FadeInScreen_Fog1(void) -{ - if (gWeatherPtr->fadeScreenCounter == 16) - return FALSE; - - gWeatherPtr->fadeScreenCounter++; - ApplyFogBlend(16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); - return TRUE; -} - -static void DoNothing(void) -{ } - -static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) -{ - u16 curPalIndex; - u16 palOffset; - u8 *gammaTable; - u16 i; - - if (gammaIndex > 0) - { - gammaIndex--; - palOffset = startPalIndex * 16; - numPalettes += startPalIndex; - curPalIndex = startPalIndex; - - // Loop through the speficied palette range and apply necessary gamma shifts to the colors. - while (curPalIndex < numPalettes) - { - if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) - { - // No palette change. - CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); - palOffset += 16; - } - else - { - u8 r, g, b; - - if (sPaletteGammaTypes[curPalIndex] == GAMMA_ALT || curPalIndex - 16 == gWeatherPtr->altGammaSpritePalIndex) - gammaTable = gWeatherPtr->altGammaShifts[gammaIndex]; - else - gammaTable = gWeatherPtr->gammaShifts[gammaIndex]; - - if (curPalIndex == 16 || curPalIndex > 27) - { - for (i = 0; i < 16; i++) - { - if (gPlttBufferUnfaded[palOffset] == RGB(31, 12, 11)) - { - // Skip gamma shift for this specific color. (Why?) - palOffset++; - } - else - { - // Apply gamma shift to the original color. - struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - r = gammaTable[baseColor.r]; - g = gammaTable[baseColor.g]; - b = gammaTable[baseColor.b]; - gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; - } - } - } - else - { - for (i = 0; i < 16; i++) - { - // Apply gamma shift to the original color. - struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - r = gammaTable[baseColor.r]; - g = gammaTable[baseColor.g]; - b = gammaTable[baseColor.b]; - gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; - } - } - } - - curPalIndex++; - } - } - else if (gammaIndex < 0) - { - // A negative gammIndex value means that the blending will come from the special Drought weather's palette tables. - gammaIndex = -gammaIndex - 1; - palOffset = startPalIndex * 16; - numPalettes += startPalIndex; - curPalIndex = startPalIndex; - - while (curPalIndex < numPalettes) - { - if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) - { - // No palette change. - CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); - palOffset += 16; - } - else - { - if (curPalIndex == 16 || curPalIndex > 27) - { - for (i = 0; i < 16; i++) - { - // Skip gamma shift for this specific color. (Why?) - if (gPlttBufferUnfaded[palOffset] != RGB(31, 12, 11)) - gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])]; - - palOffset++; - } - } - else - { - for (i = 0; i < 16; i++) - { - gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])]; - palOffset++; - } - } - } - - curPalIndex++; - } - } - else - { - // No palette blending. - CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16)); - } -} - -static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor) -{ - u16 palOffset; - u16 curPalIndex; - u16 i; - struct RGBColor color = *(struct RGBColor *)&blendColor; - u8 rBlend = color.r; - u8 gBlend = color.g; - u8 bBlend = color.b; - - palOffset = startPalIndex * 16; - numPalettes += startPalIndex; - gammaIndex--; - curPalIndex = startPalIndex; - - while (curPalIndex < numPalettes) - { - if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) - { - // No gamma shift. Simply blend the colors. - BlendPalette(palOffset, 16, blendCoeff, blendColor); - palOffset += 16; - } - else - { - u8 *gammaTable; - - if (sPaletteGammaTypes[curPalIndex] == GAMMA_NORMAL) - gammaTable = gWeatherPtr->gammaShifts[gammaIndex]; - else - gammaTable = gWeatherPtr->altGammaShifts[gammaIndex]; - - for (i = 0; i < 16; i++) - { - struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - u8 r = gammaTable[baseColor.r]; - u8 g = gammaTable[baseColor.g]; - u8 b = gammaTable[baseColor.b]; - - // Apply gamma shift and target blend color to the original color. - r += ((rBlend - r) * blendCoeff) >> 4; - g += ((gBlend - g) * blendCoeff) >> 4; - b += ((bBlend - b) * blendCoeff) >> 4; - gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; - } - } - - curPalIndex++; - } -} - -void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor) -{ - struct RGBColor color; - u8 rBlend; - u8 gBlend; - u8 bBlend; - u16 curPalIndex; - u16 palOffset; - u16 i; - - gammaIndex = -gammaIndex - 1; - color = *(struct RGBColor *)&blendColor; - rBlend = color.r; - gBlend = color.g; - bBlend = color.b; - palOffset = 0; - for (curPalIndex = 0; curPalIndex < 32; curPalIndex++) - { - if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) - { - // No gamma shift. Simply blend the colors. - BlendPalette(palOffset, 16, blendCoeff, blendColor); - palOffset += 16; - } - else - { - for (i = 0; i < 16; i++) - { - u32 offset; - struct RGBColor color1; - struct RGBColor color2; - u8 r1, g1, b1; - u8 r2, g2, b2; - - color1 = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - r1 = color1.r; - g1 = color1.g; - b1 = color1.b; - - offset = ((b1 & 0x1E) << 7) | ((g1 & 0x1E) << 3) | ((r1 & 0x1E) >> 1); - color2 = *(struct RGBColor *)&eDroughtPaletteData.gammaShiftColors[gammaIndex][offset]; - r2 = color2.r; - g2 = color2.g; - b2 = color2.b; - - r2 += ((rBlend - r2) * blendCoeff) >> 4; - g2 += ((gBlend - g2) * blendCoeff) >> 4; - b2 += ((bBlend - b2) * blendCoeff) >> 4; - - gPlttBufferFaded[palOffset++] = (b2 << 10) | (g2 << 5) | r2; - } - } - } -} - -void ApplyFogBlend(u8 blendCoeff, u16 blendColor) -{ - struct RGBColor color; - u8 rBlend; - u8 gBlend; - u8 bBlend; - u16 curPalIndex; - - BlendPalette(0, 0x100, blendCoeff, blendColor); - color = *(struct RGBColor *)&blendColor; - rBlend = color.r; - gBlend = color.g; - bBlend = color.b; - - for (curPalIndex = 16; curPalIndex < 32; curPalIndex++) - { - if (LightenSpritePaletteInFog(curPalIndex)) - { - u16 palEnd = (curPalIndex + 1) * 16; - u16 palOffset = curPalIndex * 16; - - while (palOffset < palEnd) - { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - u8 r = color.r; - u8 g = color.g; - u8 b = color.b; - - r += ((28 - r) * 3) >> 2; - g += ((31 - g) * 3) >> 2; - b += ((28 - b) * 3) >> 2; - - r += ((rBlend - r) * blendCoeff) >> 4; - g += ((gBlend - g) * blendCoeff) >> 4; - b += ((bBlend - b) * blendCoeff) >> 4; - - gPlttBufferFaded[palOffset] = (b << 10) | (g << 5) | r; - palOffset++; - } - } - else - { - BlendPalette(curPalIndex * 16, 16, blendCoeff, blendColor); - } - } -} - -static void MarkFogSpritePalToLighten(u8 paletteIndex) -{ - if (gWeatherPtr->lightenedFogSpritePalsCount < 6) - { - gWeatherPtr->lightenedFogSpritePals[gWeatherPtr->lightenedFogSpritePalsCount] = paletteIndex; - gWeatherPtr->lightenedFogSpritePalsCount++; - } -} - -static bool8 LightenSpritePaletteInFog(u8 paletteIndex) -{ - u16 i; - - for (i = 0; i < gWeatherPtr->lightenedFogSpritePalsCount; i++) - { - if (gWeatherPtr->lightenedFogSpritePals[i] == paletteIndex) - return TRUE; - } - - return FALSE; -} - -void sub_807D5BC(s8 gammaIndex) -{ - if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) - { - ApplyGammaShift(0, 32, gammaIndex); - gWeatherPtr->gammaIndex = gammaIndex; - } -} - -void sub_807D5F0(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay) -{ - if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) - { - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; - gWeatherPtr->gammaIndex = gammaIndex; - gWeatherPtr->gammaTargetIndex = gammaTargetIndex; - gWeatherPtr->gammaStepFrameCounter = 0; - gWeatherPtr->gammaStepDelay = gammaStepDelay; - sub_807D5BC(gammaIndex); - } -} - -void FadeScreen(u8 mode, u8 delay) -{ - u32 fadeColor; - bool8 fadeOut; - bool8 useWeatherPal; - - switch (mode) - { - case FADE_FROM_BLACK: - fadeColor = 0; - fadeOut = FALSE; - break; - case FADE_FROM_WHITE: - fadeColor = 0xFFFF; - fadeOut = FALSE; - break; - case FADE_TO_BLACK: - fadeColor = 0; - fadeOut = TRUE; - break; - case FADE_TO_WHITE: - fadeColor = 0xFFFF; - fadeOut = TRUE; - break; - default: - return; - } - - switch (gWeatherPtr->currWeather) - { - case WEATHER_RAIN_LIGHT: - case WEATHER_RAIN_MED: - case WEATHER_RAIN_HEAVY: - case WEATHER_SNOW: - case WEATHER_FOG_1: - case WEATHER_SHADE: - case WEATHER_DROUGHT: - useWeatherPal = TRUE; - break; - default: - useWeatherPal = FALSE; - break; - } - - if (fadeOut) - { - if (useWeatherPal) - CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); - - BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor); - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; - } - else - { - gWeatherPtr->fadeDestColor = fadeColor; - if (useWeatherPal) - gWeatherPtr->fadeScreenCounter = 0; - else - BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor); - - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN; - gWeatherPtr->unknown_6CA = 1; - gWeatherPtr->unknown_6CB = 0; - Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB); - gWeatherPtr->readyForInit = TRUE; - } -} - -bool8 IsWeatherNotFadingIn(void) -{ - return (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_IN); -} - -void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) -{ - u16 paletteIndex = 16 + spritePaletteIndex; - u16 i; - - switch (gWeatherPtr->palProcessingState) - { - case WEATHER_PAL_STATE_SCREEN_FADING_IN: - if (gWeatherPtr->unknown_6CA != 0) - { - if (gWeatherPtr->currWeather == WEATHER_FOG_1) - MarkFogSpritePalToLighten(paletteIndex); - paletteIndex *= 16; - for (i = 0; i < 16; i++) - gPlttBufferFaded[paletteIndex + i] = gWeatherPtr->fadeDestColor; - } - break; - case WEATHER_PAL_STATE_SCREEN_FADING_OUT: - paletteIndex *= 16; - CpuFastCopy(gPlttBufferFaded + paletteIndex, gPlttBufferUnfaded + paletteIndex, 32); - BlendPalette(paletteIndex, 16, gPaletteFade.y, gPaletteFade.blendColor); - break; - // WEATHER_PAL_STATE_CHANGING_WEATHER - // WEATHER_PAL_STATE_CHANGING_IDLE - default: - if (gWeatherPtr->currWeather != WEATHER_FOG_1) - { - ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); - } - else - { - paletteIndex *= 16; - BlendPalette(paletteIndex, 16, 12, 0x73FC); - } - break; - } -} - -void ApplyWeatherGammaShiftToPal(u8 paletteIndex) -{ - ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); -} - -u8 unref_sub_807D894(void) -{ - if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_SCREEN_FADING_IN) - return gWeatherPtr->unknown_6CA; - else - return 0; -} - -void LoadCustomWeatherSpritePalette(const u16 *palette) -{ - LoadPalette(palette, 0x100 + gWeatherPtr->weatherPicSpritePalIndex * 16, 32); - UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex); -} - -static void LoadDroughtWeatherPalette(u8 *gammaIndexPtr, u8 *b) -{ - u8 gammaIndex = *gammaIndexPtr; - u16 i; - - if (gammaIndex < 7) - { - gammaIndex--; - LZ77UnCompWram(sCompressedDroughtPalettes[gammaIndex], eDroughtPaletteData.gammaShiftColors[gammaIndex]); - if (gammaIndex == 0) - { - eDroughtPaletteData.gammaShiftColors[gammaIndex][0] = RGB(1, 1, 1); - for (i = 1; i < 0x1000; i++) - eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex][i - 1]; - } - else - { - for (i = 0; i < 0x1000; i++) - eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex - 1][i]; - } - if (++(*gammaIndexPtr) == 7) - { - *gammaIndexPtr = 32; - *b = 32; - } - } -} - -void ResetDroughtWeatherPaletteLoading(void) -{ - gWeatherPtr->loadDroughtPalsIndex = 1; - gWeatherPtr->loadDroughtPalsOffset = 1; -} - -bool8 LoadDroughtWeatherPalettes(void) -{ - if (gWeatherPtr->loadDroughtPalsIndex < 32) - { - LoadDroughtWeatherPalette(&gWeatherPtr->loadDroughtPalsIndex, &gWeatherPtr->loadDroughtPalsOffset); - if (gWeatherPtr->loadDroughtPalsIndex < 32) - return TRUE; - } - return FALSE; -} - -void sub_807DA04(s8 gammaIndex) -{ - sub_807D5BC(-gammaIndex - 1); -} - -void sub_807DA14(void) -{ - gWeatherPtr->unknown_73C = 0; - gWeatherPtr->unknown_740 = 0; - gWeatherPtr->unknown_742 = 0; - gWeatherPtr->unknown_73E = 0; - gUnknown_0202FF58 = 5; -} - -void sub_807DA4C(void) -{ - switch (gWeatherPtr->unknown_742) - { - case 0: - if (++gWeatherPtr->unknown_740 > gUnknown_0202FF58) - { - gWeatherPtr->unknown_740 = 0; - sub_807DA04(gWeatherPtr->unknown_73C++); - if (gWeatherPtr->unknown_73C > 5) - { - gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C; - gWeatherPtr->unknown_742 = 1; - gWeatherPtr->unknown_740 = 0x3C; - } - } - break; - case 1: - gWeatherPtr->unknown_740 = (gWeatherPtr->unknown_740 + 3) & 0x7F; - gWeatherPtr->unknown_73C = ((gSineTable[gWeatherPtr->unknown_740] - 1) >> 6) + 2; - if (gWeatherPtr->unknown_73C != gWeatherPtr->unknown_73E) - sub_807DA04(gWeatherPtr->unknown_73C); - gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C; - break; - case 2: - if (++gWeatherPtr->unknown_740 > gUnknown_0202FF58) - { - gWeatherPtr->unknown_740 = 0; - sub_807DA04(--gWeatherPtr->unknown_73C); - if (gWeatherPtr->unknown_73C == 3) - gWeatherPtr->unknown_742 = 0; - } - break; - } -} - -void Weather_SetBlendCoeffs(u8 eva, u8 evb) -{ - gWeatherPtr->currBlendEVA = eva; - gWeatherPtr->currBlendEVB = evb; - gWeatherPtr->targetBlendEVA = eva; - gWeatherPtr->targetBlendEVB = evb; - REG_BLDALPHA = BLDALPHA_BLEND(eva, evb); -} - -void Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay) -{ - gWeatherPtr->targetBlendEVA = eva; - gWeatherPtr->targetBlendEVB = evb; - gWeatherPtr->blendDelay = delay; - gWeatherPtr->blendFrameCounter = 0; - gWeatherPtr->blendUpdateCounter = 0; -} - -bool8 Weather_UpdateBlend(void) -{ - if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA - && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB) - return TRUE; - - if (++gWeatherPtr->blendFrameCounter > gWeatherPtr->blendDelay) - { - gWeatherPtr->blendFrameCounter = 0; - gWeatherPtr->blendUpdateCounter++; - - // Update currBlendEVA and currBlendEVB on alternate frames - if (gWeatherPtr->blendUpdateCounter & 1) - { - if (gWeatherPtr->currBlendEVA < gWeatherPtr->targetBlendEVA) - gWeatherPtr->currBlendEVA++; - else if (gWeatherPtr->currBlendEVA > gWeatherPtr->targetBlendEVA) - gWeatherPtr->currBlendEVA--; - } - else - { - if (gWeatherPtr->currBlendEVB < gWeatherPtr->targetBlendEVB) - gWeatherPtr->currBlendEVB++; - else if (gWeatherPtr->currBlendEVB > gWeatherPtr->targetBlendEVB) - gWeatherPtr->currBlendEVB--; - } - } - - REG_BLDALPHA = BLDALPHA_BLEND(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB); - - if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA - && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB) - return TRUE; - - return FALSE; -} - -void unref_sub_807DCB4(u8 a) -{ - switch (a) - { - case 1: - SetWeather(WEATHER_CLOUDS); - break; - case 2: - SetWeather(WEATHER_SUNNY); - break; - case 3: - SetWeather(WEATHER_RAIN_LIGHT); - break; - case 4: - SetWeather(WEATHER_SNOW); - break; - case 5: - SetWeather(WEATHER_RAIN_MED); - break; - case 6: - SetWeather(WEATHER_FOG_1); - break; - case 7: - SetWeather(WEATHER_FOG_2); - break; - case 8: - SetWeather(WEATHER_ASH); - break; - case 9: - SetWeather(WEATHER_SANDSTORM); - break; - case 10: - SetWeather(WEATHER_SHADE); - break; - } -} - -u8 GetCurrentWeather(void) -{ - return gWeatherPtr->currWeather; -} - -void SetRainStrengthFromSoundEffect(u16 soundEffect) -{ - if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT) - { - switch (soundEffect) - { - case SE_T_KOAME: - gWeatherPtr->rainStrength = 0; - break; - case SE_T_OOAME: - gWeatherPtr->rainStrength = 1; - break; - case SE_T_AME: - gWeatherPtr->rainStrength = 2; - break; - default: - return; - } - - PlaySE(soundEffect); - } -} - -void PlayRainSoundEffect(void) -{ - if (IsSpecialSEPlaying()) - { - switch (gWeatherPtr->rainStrength) - { - case 0: - PlaySE(SE_T_KOAME_E); - break; - case 1: - PlaySE(SE_T_OOAME_E); - break; - case 2: - default: - PlaySE(SE_T_AME_E); - break; - } - } -} - -u8 IsWeatherChangeComplete(void) -{ - return gWeatherPtr->weatherChangeComplete; -} - -void SetWeatherScreenFadeOut(void) -{ - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; -} - -void unref_sub_807DE24(void) -{ - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; -} - -void PreservePaletteInWeather(u8 preservedPalIndex) -{ - CpuCopy16(sBasePaletteGammaTypes, gFieldEffectPaletteGammaTypes, 32); - gFieldEffectPaletteGammaTypes[preservedPalIndex] = GAMMA_NONE; - sPaletteGammaTypes = gFieldEffectPaletteGammaTypes; -} - -void ResetPreservedPalettesInWeather(void) -{ - sPaletteGammaTypes = sBasePaletteGammaTypes; -} |