From 5045958c96ab1187433259376179ab8b389614ff Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Thu, 11 Mar 2021 21:26:56 -0500 Subject: [PATCH 001/145] OW windows now light up at night. --- data/tilesets/primary/general/palettes/04.pal | 6 ++-- .../tilesets/secondary/rustboro/metatiles.bin | Bin 5600 -> 5600 bytes .../secondary/rustboro/palettes/06.pal | 30 +++++++++--------- .../secondary/rustboro/palettes/10.pal | 2 +- data/tilesets/secondary/rustboro/tiles.png | Bin 3938 -> 4003 bytes src/overworld.c | 1 + src/util.c | 3 +- 7 files changed, 22 insertions(+), 20 deletions(-) diff --git a/data/tilesets/primary/general/palettes/04.pal b/data/tilesets/primary/general/palettes/04.pal index d8051b7bac..11ebd16a64 100644 --- a/data/tilesets/primary/general/palettes/04.pal +++ b/data/tilesets/primary/general/palettes/04.pal @@ -2,13 +2,13 @@ JASC-PAL 0100 16 24 41 82 -255 255 255 +248 0 248 222 230 238 255 0 255 255 0 255 255 0 255 156 164 189 -82 106 213 +80 104 208 65 90 189 57 82 156 41 65 139 @@ -16,4 +16,4 @@ JASC-PAL 139 164 222 106 131 213 82 106 213 -115 197 164 +248 0 248 diff --git a/data/tilesets/secondary/rustboro/metatiles.bin b/data/tilesets/secondary/rustboro/metatiles.bin index 5a0d1b0d14d6f8fd5d408d19880e64b556a6cdd0..585e3a6c299ba5f8428ca95b4b8020298f1f21c6 100644 GIT binary patch delta 34 scmV+-0NwxKE8r`zr~?R;W0hm1W2Ix0umgAqmSdM=remjLvoHj(5fNby>;M1& delta 34 dcmaE${Xl!e3T6%lD44u~xdP7FY{0TX5CD+i2Iv3) diff --git a/data/tilesets/secondary/rustboro/palettes/06.pal b/data/tilesets/secondary/rustboro/palettes/06.pal index 955b1d21a8..767ae160d5 100644 --- a/data/tilesets/secondary/rustboro/palettes/06.pal +++ b/data/tilesets/secondary/rustboro/palettes/06.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 115 197 164 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +255 255 255 +238 238 213 +205 205 164 +136 144 152 +131 131 139 +98 98 123 +65 74 106 +41 49 90 +205 213 230 +139 180 213 +205 238 189 +164 205 172 +139 189 139 +123 164 74 +115 197 164 diff --git a/data/tilesets/secondary/rustboro/palettes/10.pal b/data/tilesets/secondary/rustboro/palettes/10.pal index 6f0bfa7ee9..d68d54ce9a 100644 --- a/data/tilesets/secondary/rustboro/palettes/10.pal +++ b/data/tilesets/secondary/rustboro/palettes/10.pal @@ -5,7 +5,7 @@ JASC-PAL 255 255 255 222 222 222 172 180 189 -139 148 156 +136 144 152 131 131 139 98 98 123 65 74 106 diff --git a/data/tilesets/secondary/rustboro/tiles.png b/data/tilesets/secondary/rustboro/tiles.png index c3a3bfbab469519db64233b1868d8c9370d06d49..0ae3620c7d018237d642c731975612b49eddc80f 100644 GIT binary patch delta 3926 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 TIME_OF_DAY_MAX ? TIME_OF_DAY_MAX : gTimeOfDay; BlendPalettes(palettes, sTimeOfDayBlendVars[gTimeOfDay].coeff, sTimeOfDayBlendVars[gTimeOfDay].blendColor); } diff --git a/src/util.c b/src/util.c index a4e3fa4cfc..33983e9f40 100644 --- a/src/util.c +++ b/src/util.c @@ -264,6 +264,7 @@ u32 CalcByteArraySum(const u8* data, u32 length) void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { u16 i; + struct PlttData *data2 = (struct PlttData *)&blendColor; for (i = 0; i < numEntries; i++) { u16 index = i + palOffset; @@ -271,7 +272,7 @@ void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) s8 r = data1->r; s8 g = data1->g; s8 b = data1->b; - struct PlttData *data2 = (struct PlttData *)&blendColor; + gPlttBufferFaded[index] = RGB(r + (((data2->r - r) * coeff) >> 4), g + (((data2->g - g) * coeff) >> 4), b + (((data2->b - b) * coeff) >> 4)); From 127749369d14e66be49df81aa49696e59f23c2c0 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Thu, 11 Mar 2021 22:38:06 -0500 Subject: [PATCH 002/145] Allowed map headers to specify light palettes. --- data/tilesets/headers.inc | 2 +- .../secondary/rustboro/palettes/06.pal | 2 +- include/global.fieldmap.h | 1 + include/palette.h | 2 + src/fieldmap.c | 8 +++- src/overworld.c | 9 ++-- src/palette.c | 48 ++++++++++++++++--- 7 files changed, 59 insertions(+), 13 deletions(-) diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index c56234b13b..aefc245db5 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -24,7 +24,7 @@ gTileset_Petalburg:: @ 83DF71C gTileset_Rustboro:: @ 83DF734 .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0 @ padding + .2byte 1 << 6 @ 1 << 6 .4byte gTilesetTiles_Rustboro .4byte gTilesetPalettes_Rustboro .4byte gMetatiles_Rustboro diff --git a/data/tilesets/secondary/rustboro/palettes/06.pal b/data/tilesets/secondary/rustboro/palettes/06.pal index 767ae160d5..5851fc31aa 100644 --- a/data/tilesets/secondary/rustboro/palettes/06.pal +++ b/data/tilesets/secondary/rustboro/palettes/06.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -115 197 164 +248 224 120 255 255 255 238 238 213 205 205 164 diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 0e65cc844c..248e2a6c00 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -29,6 +29,7 @@ struct Tileset { /*0x00*/ bool8 isCompressed; /*0x01*/ bool8 isSecondary; + /*0x02*/ u16 lightPalettes; /*0x04*/ void *tiles; /*0x08*/ void *palettes; /*0x0c*/ u16 *metatiles; diff --git a/include/palette.h b/include/palette.h index ebc1cc0bb4..4a54b1d552 100644 --- a/include/palette.h +++ b/include/palette.h @@ -76,6 +76,8 @@ void BeginHardwarePaletteFade(u8, u8, u8, u8, u8); void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color); void BlendPalettesUnfaded(u32, u8, u16); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); +void TimePalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor); +void TimePalettes(u32 palettes, u8 coeff, u16 color); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); void TintPalette_SepiaTone(u16 *palette, u16 count); diff --git a/src/fieldmap.c b/src/fieldmap.c index e437ea7fc2..d084dcf387 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -884,8 +884,14 @@ void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size) } else if (tileset->isSecondary == TRUE) { + u8 i; LoadPalette(((u16*)tileset->palettes) + (NUM_PALS_IN_PRIMARY * 16), destOffset, size); - FieldmapPaletteDummy(destOffset, size >> 1); + for (i = NUM_PALS_IN_PRIMARY; i < NUM_PALS_TOTAL; i++) { + if (tileset->lightPalettes & (1 << i)) { + u16 index = i * 16; + gPlttBufferFaded[index] = gPlttBufferUnfaded[index] |= 0x8000; + } + } } else { diff --git a/src/overworld.c b/src/overworld.c index 5bbb1b3762..294bec37bf 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1521,13 +1521,14 @@ void BlendPalettesWithTime(u32 palettes) { palettes &= ~(1 << (i + 16)); } palettes &= ~0xE000; // Don't blend tile palettes [13,15] - palettes &= ~(1 << 6); - gTimeOfDay = gTimeOfDay > TIME_OF_DAY_MAX ? TIME_OF_DAY_MAX : gTimeOfDay; - BlendPalettes(palettes, sTimeOfDayBlendVars[gTimeOfDay].coeff, sTimeOfDayBlendVars[gTimeOfDay].blendColor); + gTimeOfDay = min(TIME_OF_DAY_MAX, gTimeOfDay); + if (!palettes) + return; + TimePalettes(palettes, sTimeOfDayBlendVars[gTimeOfDay].coeff, sTimeOfDayBlendVars[gTimeOfDay].blendColor); } } -u8 UpdateSpritePaletteWithTime(u8 paletteNum) { +u8 UpdateSpritePaletteWithTime(u8 paletteNum) { // TODO: Optimize this BlendPalettesWithTime(1 << (paletteNum + 16)); return paletteNum; } diff --git a/src/palette.c b/src/palette.c index a367a5ed43..593c9bcd45 100644 --- a/src/palette.c +++ b/src/palette.c @@ -457,7 +457,7 @@ static u8 GetPaletteNumByUid(u16 uid) } // Like normal palette fade, but respects sprite/tile palettes immune to time of day fading -static u8 UpdateTimeOfDayPaletteFade(void) // Like normal, but respects sprite palettes immune to fading +static u8 UpdateTimeOfDayPaletteFade(void) { u8 paletteNum; u16 paletteOffset; @@ -496,13 +496,13 @@ static u8 UpdateTimeOfDayPaletteFade(void) // Like normal, but respects sprite p if (gPaletteFade.yDec) { if (gPaletteFade.objPaletteToggle) { // sprite palettes if (gPaletteFade.y >= gPaletteFade.targetY || GetSpritePaletteTagByPaletteNum(paletteNum) & 0x8000) - BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + TimePalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); // tile palettes } else if (gPaletteFade.y >= gPaletteFade.targetY || (paletteNum >= 13 && paletteNum <= 15)) { - BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + TimePalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); } } else { - BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + TimePalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); } } } @@ -978,6 +978,42 @@ void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) } } +// Like BlendPalette, but ignores blendColor if the transparency high bit is set +void TimePalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { + u16 i; + s8 r, g, b; + struct PlttData *data2 = (struct PlttData *)&blendColor; + for (i = 0; i < numEntries; i++) { + u16 index = i + palOffset; + struct PlttData *data1 = (struct PlttData *)&gPlttBufferUnfaded[index]; + if (i == 0) { + if (data1->unused_15) { // Use transparency color to blend + data2 = data1; + gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; + } + else if (data2->unused_15) // Set transparency/blending color + gPlttBufferUnfaded[index] = gPlttBufferFaded[index] = blendColor; + continue; + } + r = data1->r; + g = data1->g; + b = data1->b; + gPlttBufferFaded[index] = RGB(r + (((data2->r - r) * coeff) >> 4), + g + (((data2->g - g) * coeff) >> 4), + b + (((data2->b - b) * coeff) >> 4)); + } +} + +// Apply time effect to a series of palettes +void TimePalettes(u32 palettes, u8 coeff, u16 color) { + u16 paletteOffset; + for (paletteOffset = 0; palettes; paletteOffset += 16) { + if (palettes & 1) + TimePalette(paletteOffset, 16, coeff, color); + palettes >>= 1; + } +} + void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) { void *src = gPlttBufferUnfaded; @@ -1123,8 +1159,8 @@ static bool32 IsBlendPalettesGraduallyTaskActive(u8 id) int i; for (i = 0; i < NUM_TASKS; i++) - if ((gTasks[i].isActive == TRUE) - && (gTasks[i].func == Task_BlendPalettesGradually) + if ((gTasks[i].isActive == TRUE) + && (gTasks[i].func == Task_BlendPalettesGradually) && (gTasks[i].tId == id)) return TRUE; From 73234e0c748c19bea198527e8c0abc2a88a0ae9d Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Fri, 12 Mar 2021 02:07:34 -0500 Subject: [PATCH 003/145] Changed Route 104 windows palette. --- .../tilesets/secondary/rustboro/metatiles.bin | Bin 5600 -> 5600 bytes .../secondary/rustboro/palettes/06.pal | 20 +++++++++--------- data/tilesets/secondary/rustboro/tiles.png | Bin 4003 -> 12786 bytes src/palette.c | 17 +++++++++------ 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/data/tilesets/secondary/rustboro/metatiles.bin b/data/tilesets/secondary/rustboro/metatiles.bin index 585e3a6c299ba5f8428ca95b4b8020298f1f21c6..63ecf0306eed55fba51975805e7469fdd82f728a 100644 GIT binary patch delta 108 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 Eg77eZ)&Kwi delta 3949 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 B@M{17 diff --git a/src/palette.c b/src/palette.c index 593c9bcd45..f433f442b2 100644 --- a/src/palette.c +++ b/src/palette.c @@ -983,24 +983,27 @@ void TimePalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { u16 i; s8 r, g, b; struct PlttData *data2 = (struct PlttData *)&blendColor; + struct PlttData *data3; + struct PlttData *blendData; + u16 altBlendIndices = 0; for (i = 0; i < numEntries; i++) { u16 index = i + palOffset; struct PlttData *data1 = (struct PlttData *)&gPlttBufferUnfaded[index]; if (i == 0) { - if (data1->unused_15) { // Use transparency color to blend - data2 = data1; + if (data1->unused_15) { // Color 0 is a bitmask for which colors to blend; color 15 is the alt blend color gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; + altBlendIndices = gPlttBufferUnfaded[index] & 0x7FFF; + data3 = (struct PlttData *)&gPlttBufferUnfaded[index+15]; } - else if (data2->unused_15) // Set transparency/blending color - gPlttBufferUnfaded[index] = gPlttBufferFaded[index] = blendColor; continue; } r = data1->r; g = data1->g; b = data1->b; - gPlttBufferFaded[index] = RGB(r + (((data2->r - r) * coeff) >> 4), - g + (((data2->g - g) * coeff) >> 4), - b + (((data2->b - b) * coeff) >> 4)); + blendData = (altBlendIndices && altBlendIndices & (1 << i)) ? data3 : data2; + gPlttBufferFaded[index] = RGB(r + (((blendData->r - r) * coeff) >> 4), + g + (((blendData->g - g) * coeff) >> 4), + b + (((blendData->b - b) * coeff) >> 4)); } } From 3a7c2e3480773b95945a2ded71d083897994b551 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Fri, 12 Mar 2021 21:20:47 -0500 Subject: [PATCH 004/145] Updated Petalburg tileset lights. --- data/tilesets/headers.inc | 4 +-- .../secondary/petalburg/metatiles.bin | Bin 2304 -> 2304 bytes .../secondary/petalburg/palettes/06.pal | 4 +-- .../secondary/petalburg/palettes/07.pal | 28 +++++++++--------- data/tilesets/secondary/petalburg/tiles.png | Bin 1740 -> 1738 bytes 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index aefc245db5..32eec2ab94 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -13,7 +13,7 @@ gTileset_General:: @ 83DF704 gTileset_Petalburg:: @ 83DF71C .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0 @ padding + .2byte 0xC0 @ lightPalettes 7,8 .4byte gTilesetTiles_Petalburg .4byte gTilesetPalettes_Petalburg .4byte gMetatiles_Petalburg @@ -24,7 +24,7 @@ gTileset_Petalburg:: @ 83DF71C gTileset_Rustboro:: @ 83DF734 .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 1 << 6 @ 1 << 6 + .2byte 1 << 6 @ lightPalettes .4byte gTilesetTiles_Rustboro .4byte gTilesetPalettes_Rustboro .4byte gMetatiles_Rustboro diff --git a/data/tilesets/secondary/petalburg/metatiles.bin b/data/tilesets/secondary/petalburg/metatiles.bin index 3711f4aeef135df2d52e729beee708e72769e30b..3ca46efec7868bb936838d926c003fd61abdf1cb 100644 GIT binary patch delta 35 rcmZn=Y7m<6mAPnY*~A}}%th16HkUBUGP4);70oT0SG0KsO9l%72__Cm delta 35 rcmZn=Y7m<6mAPqZ+r%H0%uUnUHkUBUGP5`JHO+0B*R**CO9l%75k?Nk diff --git a/data/tilesets/secondary/petalburg/palettes/06.pal b/data/tilesets/secondary/petalburg/palettes/06.pal index b893aa09e4..0c727de68c 100644 --- a/data/tilesets/secondary/petalburg/palettes/06.pal +++ b/data/tilesets/secondary/petalburg/palettes/06.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -24 41 82 +0 128 8 255 255 255 230 222 222 213 213 197 @@ -16,4 +16,4 @@ JASC-PAL 205 197 123 180 164 123 164 139 98 -115 197 164 +248 224 120 diff --git a/data/tilesets/secondary/petalburg/palettes/07.pal b/data/tilesets/secondary/petalburg/palettes/07.pal index 4b0812f094..3f7cad9b2c 100644 --- a/data/tilesets/secondary/petalburg/palettes/07.pal +++ b/data/tilesets/secondary/petalburg/palettes/07.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 +0 128 8 +213 222 172 0 0 0 +189 189 131 +164 172 123 +131 131 139 +98 106 123 +65 74 106 0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +164 213 230 +106 189 197 +112 192 160 +205 213 238 +156 156 180 +115 172 57 +248 224 120 diff --git a/data/tilesets/secondary/petalburg/tiles.png b/data/tilesets/secondary/petalburg/tiles.png index 00d6d94a4ef2f74d70ca5eb58cfe0497deeb66b5..c3ae46ad7cc2d244042381cb4d43a10ddf4c553f 100644 GIT binary patch delta 1626 zcmV-g2BrDT4ayCWU+WH0*O9gig`%8}EdPk!Q=y8G$9cX#g{Wf-54uc=|sSU=N|J}_c+{6xHV zL}{cnbz4aW@cZ#-KpCTywSwk1uh-X=)|>q(`lvKq|8af&dXv3_Zu0XSAo|Fne`v&_ zpK}1tKPnvp;QC3Qk2&YG05Cd^7$6t|tXN*x+v+CjJGg;71n>s@lLMTN7-J*G^A@CC zxDMk7)CItxz=d-jMVw#i!U>FQaqboZmT{p8-n&BZmh>S5@aTzhfl&u7U~dXssP)kS zAq0e>k+Y!Hr^-A!3Yt{Q!;A}*e`>&#^B}jhI_#Lz=37cfY)HRlvAhKr5((M6uJDj6 zL|6EXWdZ$=vF2OG+|lq+DUrI%5(!G*Gd7^G1YNYCRLTOzp%CsAlm`tfkvjcX9BYg5 z0WN3{0l6S{#txhJNl?L+_|#JSS2K9p+^$MdP<>|`yNMHeDM{WW}i+q5jD89--9Pr2F) zU=Mws0k|`M&Y>R{2q1*qKsD<)XR(HzvFFBsDfOtAvj6}b6#?1>yC7Q{gLg&G5dSOM?Ey~|>7L&tzX3?M})4H7`L0N_y_gI~h*QjVi8weyF% zxni28ZRY_FpTQaj^_UqYNEEhxFAGR_ zyymIJ0vGg6rvu|sfT1n-z zU>Hv}zI#YW?WfJU?6z_%mrSn=*jx%gsRW=4DF87Hf&lY}FSH=~REf}qsF1LP1z2fT zD)6>pewhUlK=A!Pe*-oOd{`Dx`C@>h0Jl`t&5WHGlL-JU1XyzbQbxcX5(75p0BcgR zfb=X_wMUj!yKBV&@@Eb(nH(KWzygn2xV|kMl(E37J&pl#9S{;_0BftO{r>8jahU}g z07;HuJ|usqEx@A{JCZSw7R<$<06@|f$kWRz#=v*aB6yR4f1m@er^^6Nlm$md-M2AW z*!~WtCl8V!D6}Cf!ru=30idb?l@wrATF_s^x=`9An^+ebw`&%Ef0L8D4Y`ML45qTg zf^<%p#1?dC7pEmcHnA==Zc_^n)N=sSBv=zjIw!35WekkY?3BX?1nU9@6AXAS^B9OF zlc;S&Hm_n$f2d}X%4j5K!K0l40vzthe25lkfVKd}notw0j0<`lcu*FwBZQ7_K`_C9 zn?6P^1wczyK&$B>PH-i{GQb%C12!;STb{PS*-pEFSF8!u%sP-80n#*lGXmhcEdhkz z)BtS(l!J-^McX9Vy&x|(0I(z7sc+{k&;T{y6EV{+f7~HTqHd^8$GhRSu|V_z`fhy9 z07N%bjqd*iupNC?_O1rd6*meOJkqA5@X>cCKFYw+=UnR|!0rs6eA=NNBX4%qxhYWR zBc+P~-6?i;gWdQUD!xhO`B$A0l`aOTz6hAnwgw!6xB=D$s0sE4*&yjbag0f90X$VH zKVy%+oYmjP5@Fb0s) z?PP&04Tz^v2NCjO=}G{veTK3aaB#5q^58%MJbKoiUbvx0Q-Fu%3zSd;NGUswVXyb< zMXx6TPs$hW?5rI=Dc`>j0JRbym({Amxqf+gfA|Uk_{2VhHm(V60T$F}*?ScYeC=q}`%mCtP#QR`+dj@;KqqYqIWr1GT7)c1$9(HU(q8~zA0ssVH34qNc z0l1m&^|rGBv;dygx3D9&htQq};3qMF<^b3MKB&td4Z!9hv`x#jau&>QXARIv0z0Dr zNJD5#Kq>}>06kF709Gdac4*`C6}E4wFZe5;jgpL{pRObToW}N0{=~q!F6p{1iIRF3v07*qoM6N<$f+}CvHvj+t delta 1628 zcmV-i2BZ1P4a^OYU+WN-T39gig`%8}EdPk!Q=y8G$9cX#g{Wf-53FR5YBSU=H`-ZNr#{6xHV zL}{cnbz4aW@Y~U7KpCTywSwkXuh!R<)|>q(dapEG|9*Y_YLmTzZu0XSAbQWDe`v&_ zA9DcC-zyyg;OcRok2&YG05Cd=7$6t|tXN*v+v+Cj8@Pcy1n>s@lLMTL7-J*G^A@CC zxC-M3)CItxz=bm&MVw#g!ZD0&aqboZmT{p8-n&BZmh>S5@aVB}fl&u7V80i*Q0t=u zLI?;$BWFRYPnCIe6f~)p`xzG~f7O5~=Rt01b=VQ5&DWHU*pPnBVtEZNBoeYWUEv{D zh_3J%%L4i#W6jr$xufBOQX+MiB@&drWo$rU3A$)OsgwnbLm}KLC=VJ|B6a$&IMx>9 z16Ir#XPX1=A=2Ek1UhX7>U(6^jT`yQbb6e^Yv<6mG*b z4)8XYmSg~c)!*Z9+lc@`h%=>OeJIx;j^|Uy*~wZki_S%a`g8d3rfFG9Gl0&Jo^Z7n zz#jTE18`^jj6**z5I_jIhHBPv&SDKaW6zBNQ|eJKX8`~>Dgv|zW+nyzpzaAD;P@hd z+)5F@z=bg^Kk5boLp7ZPe=HG$v0R7_#=1KX5KF{B1fBx;Vji$e3}74i0C0R!1Xv;l zun`3;l&&ZOEQo>f3pEA^u>#(SI~T>^nvMa17(j|p8YF;f0l=d=20w-Ar5s0HYUdAi zbHy}G+s*?VK7%z5>N%+$SoeM09ZC~GwOTCzP+iULrK;DjS5ob6e{9wlkSJ{XP8N{v zc*RqT1up2DP6x(?07F~u$w7sHq^MRZ6*TqIfLh$b?)sXZ$7*YQI;*;&VLTSo7Q7ya zz%U+dd~=_W+7Fv`*=^-UE}32$u(=d~QVBp8QUGEY1OeuEpJ_q#p%S4BQ6XUo3$W6x zRN!sH{5%UJfZ+Roe+Fz6_^>RX^4S1K0dAO-DBnE8G0oJ5s z0qI$=Y7Z={cH4>p;dx^H8$ zu>BoOPaY&eP-sI|gufm513*;)Dk;FKw4lF+b)mFLHnA==Zq_XR_BtoG8*&fh7))h} z1?ikHi7n{P&QD5&Y+_w#+@uyBsOJEtNw6l6bWT|9%NQ7)*$Iaa2-XD*CK&Km<}naU zCQ;jlY+l8he^AXNmC;Dff=4?81UTH0`4BD80Br$`HK8V085i_A@SrSUM+hC=f?$FH z*L{p!3V@cZfL7B%oZw1?Wq>mP25exuwmfZtvz>MUuUHeRnROsH0;Fm9W(2@>TLK8b zt^wKtC8paE*Y2V$mOf4D`IMBPxGj(5XtV}a-c^zHbX z0f=s>8r}a3U_1J(>|G9^D{d4nc%)59;iKM}x2D|YyRD6@l^RGH1DqRdveGxFDZ4Ed8aRaOiP!sG8vO&^=;uw?I0(h!Y zfZ9OYS%|mFLmTBcInBUGCppyi4 zN<{yM(3XHy3 Date: Fri, 12 Mar 2021 22:07:46 -0500 Subject: [PATCH 005/145] Added Slateport light palettes. --- data/tilesets/headers.inc | 2 +- .../secondary/slateport/metatiles.bin | Bin 6496 -> 6496 bytes .../secondary/slateport/palettes/06.pal | 4 +-- .../secondary/slateport/palettes/12.pal | 24 +++++++++--------- data/tilesets/secondary/slateport/tiles.png | Bin 6559 -> 6558 bytes 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index 32eec2ab94..4ebfe80a52 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -46,7 +46,7 @@ gTileset_Dewford:: @ 83DF74C gTileset_Slateport:: @ 83DF764 .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0 @ padding + .2byte 1 << 12 @ lightPalettes .4byte gTilesetTiles_Slateport .4byte gTilesetPalettes_Slateport .4byte gMetatiles_Slateport diff --git a/data/tilesets/secondary/slateport/metatiles.bin b/data/tilesets/secondary/slateport/metatiles.bin index 72f671f71def8f5a93264b76c854c5b797ee20b8..0cb7f64acaf96c38d35e004426fe9fc0bfca9d57 100644 GIT binary patch delta 89 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 XO+g0LU9D9F_$TAD=K3YNq`3b9I;wn& delta 6495 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 bEy{uBMuOlQf)_U{_)nKE8egb7Pm25>ez(A` From 56b9764aecf64aa3aed33b30acdc000e4098510e Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Fri, 12 Mar 2021 23:20:15 -0500 Subject: [PATCH 006/145] Added default light blending color. Fixed light palette header offsets. Changed blending function names. --- data/tilesets/headers.inc | 6 +++--- include/global.fieldmap.h | 3 ++- include/overworld.h | 2 +- include/palette.h | 4 ++-- src/field_weather_effect.c | 4 ++-- src/fieldmap.c | 4 +++- src/overworld.c | 8 ++++---- src/palette.c | 17 ++++++++++------- 8 files changed, 27 insertions(+), 21 deletions(-) diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index 4ebfe80a52..38e74bb66a 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -13,7 +13,7 @@ gTileset_General:: @ 83DF704 gTileset_Petalburg:: @ 83DF71C .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0xC0 @ lightPalettes 7,8 + .2byte 3 @ lightPalettes 6,7 .4byte gTilesetTiles_Petalburg .4byte gTilesetPalettes_Petalburg .4byte gMetatiles_Petalburg @@ -24,7 +24,7 @@ gTileset_Petalburg:: @ 83DF71C gTileset_Rustboro:: @ 83DF734 .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 1 << 6 @ lightPalettes + .2byte 1 @ lightPalettes 6 .4byte gTilesetTiles_Rustboro .4byte gTilesetPalettes_Rustboro .4byte gMetatiles_Rustboro @@ -46,7 +46,7 @@ gTileset_Dewford:: @ 83DF74C gTileset_Slateport:: @ 83DF764 .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 1 << 12 @ lightPalettes + .2byte 0x41 @ lightPalettes 6,12 .4byte gTilesetTiles_Slateport .4byte gTilesetPalettes_Slateport .4byte gMetatiles_Slateport diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 248e2a6c00..84a9c14a67 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -29,7 +29,8 @@ struct Tileset { /*0x00*/ bool8 isCompressed; /*0x01*/ bool8 isSecondary; - /*0x02*/ u16 lightPalettes; + /*0x02*/ u8 lightPalettes; // Bitmask determining whether a palette should be time-blended as a light + /*0x03*/ u8 customLightColor; // Bitmask determining which light palettes have custom light colors (color 15) /*0x04*/ void *tiles; /*0x08*/ void *palettes; /*0x0c*/ u16 *metatiles; diff --git a/include/overworld.h b/include/overworld.h index 86d5426b28..918a5dcce9 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -136,7 +136,7 @@ void CleanupOverworldWindowsAndTilemaps(void); bool32 IsUpdateLinkStateCBActive(void); void CB1_Overworld(void); void CB2_OverworldBasic(void); -void BlendPalettesWithTime(u32); +void UpdatePalettesWithTime(u32); void CB2_Overworld(void); void SetMainCallback1(void (*cb)(void)); void SetUnusedCallback(void *a0); diff --git a/include/palette.h b/include/palette.h index 4a54b1d552..f9bd20560d 100644 --- a/include/palette.h +++ b/include/palette.h @@ -76,8 +76,8 @@ void BeginHardwarePaletteFade(u8, u8, u8, u8, u8); void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color); void BlendPalettesUnfaded(u32, u8, u16); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); -void TimePalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor); -void TimePalettes(u32 palettes, u8 coeff, u16 color); +void TimeBlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor); +void TimeBlendPalettes(u32 palettes, u8 coeff, u16 color); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); void TintPalette_SepiaTone(u16 *palette, u16 count); diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index 9f78940666..db480772c6 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -1142,7 +1142,7 @@ void Thunderstorm_Main(void) { ApplyWeatherGammaShiftIfIdle(3); if (gTimeOfDay != TIME_OF_DAY_DAY) - BlendPalettesWithTime(0xFFFFFFFF); + UpdatePalettesWithTime(0xFFFFFFFF); gWeatherPtr->thunderAllowEnd = TRUE; if (--gWeatherPtr->thunderShortRetries != 0) { @@ -1183,7 +1183,7 @@ void Thunderstorm_Main(void) case TSTORM_STATE_FADE_THUNDER_LONG: if (--gWeatherPtr->thunderDelay == 0) { - gTimeOfDay == TIME_OF_DAY_DAY ? sub_80ABC7C(19, 3, 5) : BlendPalettesWithTime(0xFFFFFFFF); + gTimeOfDay == TIME_OF_DAY_DAY ? sub_80ABC7C(19, 3, 5) : UpdatePalettesWithTime(0xFFFFFFFF); gWeatherPtr->initStep++; } break; diff --git a/src/fieldmap.c b/src/fieldmap.c index d084dcf387..b3b35a7b08 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -887,9 +887,11 @@ void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size) u8 i; LoadPalette(((u16*)tileset->palettes) + (NUM_PALS_IN_PRIMARY * 16), destOffset, size); for (i = NUM_PALS_IN_PRIMARY; i < NUM_PALS_TOTAL; i++) { - if (tileset->lightPalettes & (1 << i)) { + if (tileset->lightPalettes & (1 << (i - NUM_PALS_IN_PRIMARY))) { // Mark as light palette u16 index = i * 16; gPlttBufferFaded[index] = gPlttBufferUnfaded[index] |= 0x8000; + if (tileset->customLightColor & (1 << (i - NUM_PALS_IN_PRIMARY))) // Mark as custom light color + gPlttBufferFaded[index+15] = gPlttBufferUnfaded[index+15] |= 0x8000; } } } diff --git a/src/overworld.c b/src/overworld.c index 294bec37bf..5a7ace7b8d 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -846,7 +846,7 @@ void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum) RoamerMove(); DoCurrentWeather(); ResetFieldTasksArgs(); - BlendPalettesWithTime(0xFFFFFFFF); + UpdatePalettesWithTime(0xFFFFFFFF); RunOnResumeMapScript(); if (gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER @@ -1512,7 +1512,7 @@ static bool8 FadePalettesWithTime(void) { } } -void BlendPalettesWithTime(u32 palettes) { +void UpdatePalettesWithTime(u32 palettes) { // Only blend if not transitioning between times and the map type allows if (gTimeOfDayState == 0 && MapHasNaturalLight(gMapHeader.mapType)) { u8 i; @@ -1524,12 +1524,12 @@ void BlendPalettesWithTime(u32 palettes) { gTimeOfDay = min(TIME_OF_DAY_MAX, gTimeOfDay); if (!palettes) return; - TimePalettes(palettes, sTimeOfDayBlendVars[gTimeOfDay].coeff, sTimeOfDayBlendVars[gTimeOfDay].blendColor); + TimeBlendPalettes(palettes, sTimeOfDayBlendVars[gTimeOfDay].coeff, sTimeOfDayBlendVars[gTimeOfDay].blendColor); } } u8 UpdateSpritePaletteWithTime(u8 paletteNum) { // TODO: Optimize this - BlendPalettesWithTime(1 << (paletteNum + 16)); + UpdatePalettesWithTime(1 << (paletteNum + 16)); return paletteNum; } diff --git a/src/palette.c b/src/palette.c index f433f442b2..1b38003df5 100644 --- a/src/palette.c +++ b/src/palette.c @@ -496,13 +496,13 @@ static u8 UpdateTimeOfDayPaletteFade(void) if (gPaletteFade.yDec) { if (gPaletteFade.objPaletteToggle) { // sprite palettes if (gPaletteFade.y >= gPaletteFade.targetY || GetSpritePaletteTagByPaletteNum(paletteNum) & 0x8000) - TimePalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + TimeBlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); // tile palettes } else if (gPaletteFade.y >= gPaletteFade.targetY || (paletteNum >= 13 && paletteNum <= 15)) { - TimePalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + TimeBlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); } } else { - TimePalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + TimeBlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); } } } @@ -979,8 +979,9 @@ void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) } // Like BlendPalette, but ignores blendColor if the transparency high bit is set -void TimePalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { +void TimeBlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { u16 i; + u16 defaultBlendColor = 0x3f9f; s8 r, g, b; struct PlttData *data2 = (struct PlttData *)&blendColor; struct PlttData *data3; @@ -992,8 +993,10 @@ void TimePalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { if (i == 0) { if (data1->unused_15) { // Color 0 is a bitmask for which colors to blend; color 15 is the alt blend color gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; - altBlendIndices = gPlttBufferUnfaded[index] & 0x7FFF; + altBlendIndices = gPlttBufferUnfaded[index] & 0x7FFF; // Note that color 15 will never be light-blended data3 = (struct PlttData *)&gPlttBufferUnfaded[index+15]; + if (!data3->unused_15) // use default blend color instead + data3 = (struct PlttData *)&defaultBlendColor; } continue; } @@ -1008,11 +1011,11 @@ void TimePalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { } // Apply time effect to a series of palettes -void TimePalettes(u32 palettes, u8 coeff, u16 color) { +void TimeBlendPalettes(u32 palettes, u8 coeff, u16 color) { u16 paletteOffset; for (paletteOffset = 0; palettes; paletteOffset += 16) { if (palettes & 1) - TimePalette(paletteOffset, 16, coeff, color); + TimeBlendPalette(paletteOffset, 16, coeff, color); palettes >>= 1; } } From 4a04282c0b6a8714fcc75cacea63decb9c746fea Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Mon, 15 Mar 2021 23:58:46 -0400 Subject: [PATCH 007/145] Added Mauville light palettes. --- data/tilesets/headers.inc | 2 +- .../tilesets/secondary/mauville/metatiles.bin | Bin 8160 -> 8160 bytes .../secondary/mauville/palettes/07.pal | 6 +++--- .../secondary/mauville/palettes/08.pal | 10 +++++----- .../secondary/mauville/palettes/09.pal | 12 ++++++------ .../secondary/mauville/palettes/10.pal | 6 +++--- data/tilesets/secondary/mauville/tiles.png | Bin 6069 -> 6068 bytes 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index 38e74bb66a..f495aae2c0 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -57,7 +57,7 @@ gTileset_Slateport:: @ 83DF764 gTileset_Mauville:: @ 83DF77C .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0 @ padding + .2byte 0x12 @ lightPalettes 7,10 .4byte gTilesetTiles_Mauville .4byte gTilesetPalettes_Mauville .4byte gMetatiles_Mauville diff --git a/data/tilesets/secondary/mauville/metatiles.bin b/data/tilesets/secondary/mauville/metatiles.bin index a71ead8e57b2e0e512ce2057d3a92e1d0fc62122..d1384046582c50a3fe9fc009d6dbbfce980deb88 100644 GIT binary patch delta 28 ecmaE0|G<7jp(KCu>*P1dZ-FF)-rOLWzy<)^#}35+ delta 28 ecmaE0|G<7jp(KCt>*6=XZ-FF)-rOLWzy<*0M-N2+ diff --git a/data/tilesets/secondary/mauville/palettes/07.pal b/data/tilesets/secondary/mauville/palettes/07.pal index fa1dbd2962..b74a8c0097 100644 --- a/data/tilesets/secondary/mauville/palettes/07.pal +++ b/data/tilesets/secondary/mauville/palettes/07.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -123 180 189 +16 64 0 255 255 180 238 238 90 213 213 65 @@ -9,11 +9,11 @@ JASC-PAL 131 131 139 98 98 123 65 74 106 -41 49 90 +168 200 224 213 213 213 164 164 172 230 197 246 213 139 222 197 115 164 148 98 106 -172 205 230 +40 48 88 diff --git a/data/tilesets/secondary/mauville/palettes/08.pal b/data/tilesets/secondary/mauville/palettes/08.pal index bc7cb5c883..3742cfd9ba 100644 --- a/data/tilesets/secondary/mauville/palettes/08.pal +++ b/data/tilesets/secondary/mauville/palettes/08.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 123 180 189 -115 189 246 +0 248 0 131 197 98 57 139 49 57 82 0 255 255 98 255 255 255 222 230 238 -189 205 230 +0 248 0 255 172 222 230 131 180 213 90 139 -164 213 197 +0 248 0 115 197 164 -65 180 131 -24 164 106 +0 248 0 +0 248 0 diff --git a/data/tilesets/secondary/mauville/palettes/09.pal b/data/tilesets/secondary/mauville/palettes/09.pal index 9c37027c3d..312bb1aac7 100644 --- a/data/tilesets/secondary/mauville/palettes/09.pal +++ b/data/tilesets/secondary/mauville/palettes/09.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 123 180 189 -255 255 255 +248 0 248 131 197 98 57 139 49 57 82 0 255 255 98 172 197 230 -139 164 222 -106 131 213 +248 0 248 +248 0 248 255 230 148 238 197 115 -230 172 82 +248 0 248 164 213 197 115 197 164 -65 180 131 -24 164 106 +248 0 248 +248 0 248 diff --git a/data/tilesets/secondary/mauville/palettes/10.pal b/data/tilesets/secondary/mauville/palettes/10.pal index a2e1cdc176..5b3c5e6ef2 100644 --- a/data/tilesets/secondary/mauville/palettes/10.pal +++ b/data/tilesets/secondary/mauville/palettes/10.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -123 180 189 +16 128 8 255 255 255 148 222 205 123 180 172 @@ -9,9 +9,9 @@ JASC-PAL 131 131 139 98 98 123 65 74 106 -41 49 90 +144 216 248 246 197 98 -148 222 255 +144 216 248 230 172 238 213 139 222 197 115 164 diff --git a/data/tilesets/secondary/mauville/tiles.png b/data/tilesets/secondary/mauville/tiles.png index 208a052c538867a6cc6837f5ce270b8d959dee6f..68e2f49dcd230ab4f02a0750dca913f8ed2bedf0 100644 GIT binary patch delta 6026 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 HNDlu$H%7Fc From b7d9b77e4697b84ccefe33056c5bece0c94cf557 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Tue, 16 Mar 2021 01:00:14 -0400 Subject: [PATCH 008/145] Added Fortree/weather institute lights. --- data/tilesets/headers.inc | 4 ++-- data/tilesets/secondary/fortree/metatiles.bin | Bin 4480 -> 4480 bytes .../secondary/fortree/palettes/08.pal | 4 ++-- data/tilesets/secondary/fortree/tiles.png | Bin 4414 -> 4433 bytes .../tilesets/secondary/mauville/metatiles.bin | Bin 8160 -> 8160 bytes .../secondary/mauville/palettes/07.pal | 6 +++--- .../secondary/mauville/palettes/10.pal | 2 +- .../secondary/mauville/palettes/11.pal | 2 +- data/tilesets/secondary/mauville/tiles.png | Bin 6068 -> 6069 bytes .../secondary/petalburg/palettes/06.pal | 2 +- .../secondary/petalburg/palettes/07.pal | 2 +- .../secondary/rustboro/palettes/06.pal | 2 +- .../secondary/slateport/palettes/06.pal | 2 +- .../secondary/slateport/palettes/12.pal | 2 +- src/palette.c | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index f495aae2c0..c652587a0e 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -57,7 +57,7 @@ gTileset_Slateport:: @ 83DF764 gTileset_Mauville:: @ 83DF77C .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0x12 @ lightPalettes 7,10 + .2byte 0x32 @ lightPalettes 7,10,11 .4byte gTilesetTiles_Mauville .4byte gTilesetPalettes_Mauville .4byte gMetatiles_Mauville @@ -90,7 +90,7 @@ gTileset_Fallarbor:: @ 83DF7AC gTileset_Fortree:: @ 83DF7C4 .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0 @ padding + .2byte 0x0404 @ lightPalettes 8, customLights 8 .4byte gTilesetTiles_Fortree .4byte gTilesetPalettes_Fortree .4byte gMetatiles_Fortree diff --git a/data/tilesets/secondary/fortree/metatiles.bin b/data/tilesets/secondary/fortree/metatiles.bin index ecc00d7e7092a272c134c4a9fdcaae507c44c11e..1b0958cbd1e07e44e47a8dc2a7f6e04356798110 100644 GIT binary patch delta 56 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 H!ZYrFhG_0n delta 4358 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 delta 28 ecmaE0|G<7jp(KCu>*P1dZ-FF)-rOLWzy<)^#}35+ diff --git a/data/tilesets/secondary/mauville/palettes/07.pal b/data/tilesets/secondary/mauville/palettes/07.pal index b74a8c0097..6f43490ad6 100644 --- a/data/tilesets/secondary/mauville/palettes/07.pal +++ b/data/tilesets/secondary/mauville/palettes/07.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -16 64 0 +8 0 128 255 255 180 238 238 90 213 213 65 @@ -9,11 +9,11 @@ JASC-PAL 131 131 139 98 98 123 65 74 106 -168 200 224 +40 48 88 213 213 213 164 164 172 230 197 246 213 139 222 197 115 164 148 98 106 -40 48 88 +168 200 224 diff --git a/data/tilesets/secondary/mauville/palettes/10.pal b/data/tilesets/secondary/mauville/palettes/10.pal index 5b3c5e6ef2..b87549f6d1 100644 --- a/data/tilesets/secondary/mauville/palettes/10.pal +++ b/data/tilesets/secondary/mauville/palettes/10.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -16 128 8 +8 192 0 255 255 255 148 222 205 123 180 172 diff --git a/data/tilesets/secondary/mauville/palettes/11.pal b/data/tilesets/secondary/mauville/palettes/11.pal index c73ec2fe82..48166182ae 100644 --- a/data/tilesets/secondary/mauville/palettes/11.pal +++ b/data/tilesets/secondary/mauville/palettes/11.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -172 180 139 +0 48 0 255 255 255 222 230 238 164 180 197 diff --git a/data/tilesets/secondary/mauville/tiles.png b/data/tilesets/secondary/mauville/tiles.png index 68e2f49dcd230ab4f02a0750dca913f8ed2bedf0..20da7198e89bf0890f4ec48261c9372907c2c4c6 100644 GIT binary patch delta 6027 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 Kv1K}x=>G%p*Srz{ delta 6026 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 { // Color 0 is a bitmask for which colors to blend; color 15 is the alt blend color gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; - altBlendIndices = gPlttBufferUnfaded[index] & 0x7FFF; // Note that color 15 will never be light-blended + altBlendIndices = gPlttBufferUnfaded[index] << 1; // bit 0 species color 1, etc. data3 = (struct PlttData *)&gPlttBufferUnfaded[index+15]; if (!data3->unused_15) // use default blend color instead data3 = (struct PlttData *)&defaultBlendColor; From 806b4acda2cba48bf5c3c30a27fc37a7cd3001a7 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Tue, 16 Mar 2021 21:13:57 -0400 Subject: [PATCH 009/145] Added Lilycove light palettes. --- data/tilesets/headers.inc | 2 +- .../tilesets/secondary/lilycove/metatiles.bin | Bin 5616 -> 5616 bytes .../secondary/lilycove/palettes/06.pal | 24 +++++++++--------- data/tilesets/secondary/lilycove/tiles.png | Bin 3652 -> 3666 bytes 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index c652587a0e..949799ef4c 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -101,7 +101,7 @@ gTileset_Fortree:: @ 83DF7C4 gTileset_Lilycove:: @ 83DF7DC .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0 @ padding + .2byte 0x01 @ lightPalettes 6 .4byte gTilesetTiles_Lilycove .4byte gTilesetPalettes_Lilycove .4byte gMetatiles_Lilycove diff --git a/data/tilesets/secondary/lilycove/metatiles.bin b/data/tilesets/secondary/lilycove/metatiles.bin index 6018ac8ec361c2dd067a8a420e7cf0e6ae7b0925..80561055b38b18a57c4251a8eb97c0bb8b30a1f3 100644 GIT binary patch delta 183 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%0Dm3|)TIc1<~F39 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 From 68068981a4f16a183dd7b329b02777d0de865178 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Wed, 17 Mar 2021 01:52:07 -0400 Subject: [PATCH 010/145] Fixed TOD & weather fadeout. --- src/field_weather.c | 8 ++++---- src/field_weather_effect.c | 13 +++++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/field_weather.c b/src/field_weather.c index bfd7f2afa2..0b8427c293 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -110,8 +110,8 @@ void (*const gWeatherPalStateFuncs[])(void) = { [WEATHER_PAL_STATE_CHANGING_WEATHER] = UpdateWeatherGammaShift, [WEATHER_PAL_STATE_SCREEN_FADING_IN] = FadeInScreenWithWeather, - [WEATHER_PAL_STATE_SCREEN_FADING_OUT] = DoNothing, - [WEATHER_PAL_STATE_IDLE] = DoNothing, + [WEATHER_PAL_STATE_SCREEN_FADING_OUT] = DoNothing, + [WEATHER_PAL_STATE_IDLE] = DoNothing, }; // This table specifies which of the gamma shift tables should be @@ -779,7 +779,7 @@ void FadeScreen(u8 mode, s8 delay) if (fadeOut) { - if (useWeatherPal) + if (TRUE || useWeatherPal) // TODO: Can copying Faded to Unfaded before fadeout cause problems ? CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); BeginNormalPaletteFade(PALETTES_ALL, delay, 0, 16, fadeColor); @@ -789,7 +789,7 @@ void FadeScreen(u8 mode, s8 delay) { gWeatherPtr->fadeDestColor = fadeColor; if (useWeatherPal) - gWeatherPtr->fadeScreenCounter = 0; + gWeatherPtr->fadeScreenCounter = 0; else BeginNormalPaletteFade(PALETTES_ALL, delay, 16, 0, fadeColor); diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index db480772c6..d8eff78b7b 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -481,6 +481,7 @@ void Rain_InitVars(void) gWeatherPtr->gammaTargetIndex = gTimeOfDay == TIME_OF_DAY_DAY ? 3 : 0; gWeatherPtr->gammaStepDelay = 20; SetRainStrengthFromSoundEffect(SE_RAIN); + Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness } void Rain_InitAll(void) @@ -774,6 +775,7 @@ void Snow_InitVars(void) gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->targetSnowflakeSpriteCount = 16; gWeatherPtr->snowflakeVisibleCounter = 0; + Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness } void Snow_InitAll(void) @@ -1049,6 +1051,7 @@ void Thunderstorm_InitVars(void) gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment gWeatherPtr->thunderTriggered = FALSE; SetRainStrengthFromSoundEffect(SE_THUNDERSTORM); + Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness } void Thunderstorm_InitAll(void) @@ -1077,6 +1080,7 @@ void Downpour_InitVars(void) gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment SetRainStrengthFromSoundEffect(SE_DOWNPOUR); + Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness } void Downpour_InitAll(void) @@ -1525,8 +1529,8 @@ void Ash_InitVars(void) gWeatherPtr->ashUnused = 20; // Never read if (!gWeatherPtr->ashSpritesCreated) { - Weather_SetBlendCoeffs(0, 16); - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(64, 63)); // These aren't valid blend coefficients! + Weather_SetBlendCoeffs(0, 12); + // SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(64, 63)); // These aren't valid blend coefficients! } } @@ -1553,7 +1557,7 @@ void Ash_Main(void) if (!gWeatherPtr->ashSpritesCreated) CreateAshSprites(); - Weather_SetTargetBlendCoeffs(16, 0, 1); + Weather_SetTargetBlendCoeffs(10, 12, 1); gWeatherPtr->initStep++; break; case 2: @@ -1574,7 +1578,7 @@ bool8 Ash_Finish(void) switch (gWeatherPtr->finishStep) { case 0: - Weather_SetTargetBlendCoeffs(0, 16, 1); + Weather_SetTargetBlendCoeffs(0, 12, 1); gWeatherPtr->finishStep++; break; case 1: @@ -2243,6 +2247,7 @@ void Shade_InitVars(void) gWeatherPtr->initStep = 0; gWeatherPtr->gammaTargetIndex = 3; gWeatherPtr->gammaStepDelay = 20; + Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness } void Shade_InitAll(void) From cd9276c569f10c4d209967b2e13cb5d1db4b7664 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Wed, 24 Mar 2021 00:34:42 -0400 Subject: [PATCH 011/145] Refactored light metatile caching. --- include/fieldmap.h | 1 + include/overworld.h | 1 - src/fieldmap.c | 21 +++++++++++++++++++++ src/overworld.c | 21 --------------------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/include/fieldmap.h b/include/fieldmap.h index 5bcbe20ea6..d148fa5824 100644 --- a/include/fieldmap.h +++ b/include/fieldmap.h @@ -12,6 +12,7 @@ #include "main.h" extern struct BackupMapLayout gBackupMapLayout; +extern struct Coords16 gLightMetatiles[32]; u32 MapGridGetMetatileIdAt(int, int); u32 MapGridGetMetatileBehaviorAt(int, int); diff --git a/include/overworld.h b/include/overworld.h index 918a5dcce9..be7c33ff03 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -47,7 +47,6 @@ struct LinkPlayerObjectEvent // Exported RAM declarations extern struct WarpData gLastUsedWarp; extern struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4]; -extern struct Coords16 gLightMetatiles[32]; extern u16 *gBGTilemapBuffers1; extern u16 *gBGTilemapBuffers2; diff --git a/src/fieldmap.c b/src/fieldmap.c index b3b35a7b08..dfa6173176 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -30,6 +30,7 @@ EWRAM_DATA struct MapHeader gMapHeader = {0}; EWRAM_DATA struct Camera gCamera = {0}; EWRAM_DATA static struct ConnectionFlags gMapConnectionFlags = {0}; EWRAM_DATA static u32 sFiller = 0; // without this, the next file won't align properly +EWRAM_DATA struct Coords16 gLightMetatiles[32] = {0}; struct BackupMapLayout gBackupMapLayout; @@ -62,6 +63,7 @@ static bool8 IsCoordInIncomingConnectingMap(int coord, int srcMax, int destMax, #define AreCoordsWithinMapGridBounds(x, y) (x >= 0 && x < gBackupMapLayout.width && y >= 0 && y < gBackupMapLayout.height) #define MapGridGetTileAt(x, y) (AreCoordsWithinMapGridBounds(x, y) ? gBackupMapLayout.map[x + gBackupMapLayout.width * y] : MapGridGetBorderTileAt(x, y)) +static void CacheLightMetatiles(void); struct MapHeader const *const GetMapHeaderFromConnection(struct MapConnection *connection) { @@ -73,6 +75,7 @@ void InitMap(void) InitMapLayoutData(&gMapHeader); SetOccupiedSecretBaseEntranceMetatiles(gMapHeader.events); RunOnLoadMapScript(); + CacheLightMetatiles(); } void InitMapFromSavedGame(void) @@ -82,6 +85,7 @@ void InitMapFromSavedGame(void) SetOccupiedSecretBaseEntranceMetatiles(gMapHeader.events); LoadSavedMapView(); RunOnLoadMapScript(); + CacheLightMetatiles(); UpdateTVScreensOnMap(gBackupMapLayout.width, gBackupMapLayout.height); } @@ -378,6 +382,23 @@ u32 MapGridGetMetatileBehaviorAt(int x, int y) return GetBehaviorByMetatileId(metatile) & METATILE_BEHAVIOR_MASK; } +// Caches light metatile coordinates +static void CacheLightMetatiles(void) { // TODO: Better way to dynamically generate lights + u8 i = 0; + s16 x, y; + for (x = 0; x < gBackupMapLayout.width; x++) { + for (y = 0; y < gBackupMapLayout.height; y++) { + if (MapGridGetMetatileBehaviorAt(x, y) == 0x04) { + gLightMetatiles[i].x = x; + gLightMetatiles[i].y = y; + i++; + } + } + } + gLightMetatiles[i].x = -1; + gLightMetatiles[i].y = -1; +} + u8 MapGridGetMetatileLayerTypeAt(int x, int y) { u16 metatile = MapGridGetMetatileIdAt(x, y); diff --git a/src/overworld.c b/src/overworld.c index 5a7ace7b8d..6e7542109f 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -211,7 +211,6 @@ EWRAM_DATA static struct InitialPlayerAvatarState sInitialPlayerAvatarState = {0 EWRAM_DATA static u16 sAmbientCrySpecies = 0; EWRAM_DATA static bool8 sIsAmbientCryWaterMon = FALSE; EWRAM_DATA struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4] = {0}; -EWRAM_DATA struct Coords16 gLightMetatiles[32] = {0}; // const rom data @@ -601,23 +600,6 @@ struct MapHeader const *const GetDestinationWarpMapHeader(void) return Overworld_GetMapHeaderByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum); } -// Caches light metatile coordinates -static void CacheLightMetatiles(void) { // TODO: Better way to dynamically generate lights - u8 i = 0; - s16 x, y; - for (x = 0; x < gBackupMapLayout.width; x++) { - for (y = 0; y < gBackupMapLayout.height; y++) { - if (MapGridGetMetatileBehaviorAt(x, y) == 0x04) { - gLightMetatiles[i].x = x; - gLightMetatiles[i].y = y; - i++; - } - } - } - gLightMetatiles[i].x = -1; - gLightMetatiles[i].y = -1; -} - static void LoadCurrentMapData(void) { sLastMapSectionId = gMapHeader.regionMapSectionId; @@ -834,7 +816,6 @@ void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum) Overworld_ClearSavedMusic(); RunOnTransitionMapScript(); InitMap(); - CacheLightMetatiles(); CopySecondaryTilesetToVramUsingHeap(gMapHeader.mapLayout); LoadSecondaryTilesetPalette(gMapHeader.mapLayout); @@ -1823,7 +1804,6 @@ void CB2_ContinueSavedGame(void) } else { - CacheLightMetatiles(); TryPutTodaysRivalTrainerOnAir(); gFieldCallback = FieldCB_FadeTryShowMapPopup; SetMainCallback1(CB1_Overworld); @@ -1983,7 +1963,6 @@ static bool32 LoadMapInStepsLocal(u8 *state, bool32 a2) (*state)++; break; case 3: - CacheLightMetatiles(); InitObjectEventsLocal(); SetCameraToTrackPlayer(); (*state)++; From 1ebf94af90881d66329cb1d3d1a0eeddbba38557 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Mon, 5 Apr 2021 18:22:28 -0400 Subject: [PATCH 012/145] Added more Lilycove window lights. --- .../tilesets/secondary/lilycove/metatiles.bin | Bin 5616 -> 5616 bytes .../secondary/lilycove/palettes/06.pal | 4 ++-- data/tilesets/secondary/lilycove/tiles.png | Bin 3666 -> 3674 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/tilesets/secondary/lilycove/metatiles.bin b/data/tilesets/secondary/lilycove/metatiles.bin index 80561055b38b18a57c4251a8eb97c0bb8b30a1f3..15b22292776bcba749ccf955107603eb5fec08fa 100644 GIT binary patch delta 56 zcmeyM{Xu(!0K3ezrfF@=3d}0glcuLFYg*REq%f_CS%FDmM$`19$vW&;xFFI@3e(dz Jb8$T51prRp6IB2J delta 56 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 V8u_TAr5N}R+hb0amFCoh{{yKYP{05H delta 3605 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 Date: Mon, 5 Apr 2021 20:21:56 -0400 Subject: [PATCH 013/145] Added Dewford window lights. --- data/tilesets/headers.inc | 2 +- data/tilesets/secondary/dewford/metatiles.bin | Bin 6064 -> 6064 bytes .../secondary/dewford/palettes/12.pal | 26 +++++++++--------- data/tilesets/secondary/dewford/tiles.png | Bin 3810 -> 12295 bytes 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index 949799ef4c..b9a97c9e4e 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -35,7 +35,7 @@ gTileset_Rustboro:: @ 83DF734 gTileset_Dewford:: @ 83DF74C .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0 @ padding + .2byte 64 @ lightPalettes 12 .4byte gTilesetTiles_Dewford .4byte gTilesetPalettes_Dewford .4byte gMetatiles_Dewford diff --git a/data/tilesets/secondary/dewford/metatiles.bin b/data/tilesets/secondary/dewford/metatiles.bin index 728d5b6325cf60c959b13ab469249f2c6f39ba6e..d99fd8a3a80be7defee72bc7f5d4d2d9f3f208ea 100644 GIT binary patch delta 24 gcmdm>zd?V)Q%2@P$;T$YV60?5lzMD)3X_j00FD6)q5uE@ delta 24 gcmdm>zd?V)Q%2^X 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 delta 3755 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 DIY5C@ From 5e3fcaae15c7432b7b3e698b8dc3c95cdf257936 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Mon, 5 Apr 2021 20:39:37 -0400 Subject: [PATCH 014/145] Added Fallarbor window lights. --- data/tilesets/headers.inc | 2 +- .../secondary/fallarbor/palettes/07.pal | 6 +++--- data/tilesets/secondary/fallarbor/tiles.png | Bin 4653 -> 15247 bytes 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index b9a97c9e4e..5977020be6 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -79,7 +79,7 @@ gTileset_Lavaridge:: @ 83DF794 gTileset_Fallarbor:: @ 83DF7AC .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0 @ padding + .2byte 2 @ lightPalettes 7 .4byte gTilesetTiles_Fallarbor .4byte gTilesetPalettes_Fallarbor .4byte gMetatiles_Fallarbor diff --git a/data/tilesets/secondary/fallarbor/palettes/07.pal b/data/tilesets/secondary/fallarbor/palettes/07.pal index 724a8f09db..f3a7020731 100644 --- a/data/tilesets/secondary/fallarbor/palettes/07.pal +++ b/data/tilesets/secondary/fallarbor/palettes/07.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -24 41 82 +0 192 0 222 230 164 180 197 115 148 156 82 @@ -9,11 +9,11 @@ JASC-PAL 131 131 139 98 98 123 65 74 106 -41 49 90 +88 168 168 90 172 172 131 197 222 255 205 82 230 156 49 222 123 32 156 98 41 -115 197 164 +128 192 216 diff --git a/data/tilesets/secondary/fallarbor/tiles.png b/data/tilesets/secondary/fallarbor/tiles.png index 3582d1d030d978025a2de580831db536aa401cf9..06b86ff956176ba4e616b0abb47c930de7c3aee5 100644 GIT binary patch literal 15247 zcmV;AJ8;B_P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3>vl3clNh5vIEUIHg@SPsVs@4(CVcbF-)q<;Mz zc35hus#2MEAb>M~xb4n={pWT6!LROHYlM z>+bychsaBbuj%t+`Tj!~yl#Jepyu!E^Y_4`f~w)e)q@v`5#x7{#p+AS=sL!${*|WeLdJ8ucx1(=#6YjLRAY~eFEpy`rho7HAObdVIR(f$x-W+eu{!=fZ?(YFuBF=4GOh`n) zmyj%!;A@OE1lF+;pTU*Kl;b1mw!cN~&&d7zsD*FT;tQ1CSO1C{FW36x z5J7NaiWw1$IS}!x2$0ZGG4n0t92GgmjD$-rfm>XqDL6YQVni^X5bcJavHL4>{}?yN z>i%!z7XMY`oI>~i5jm&O{Svvq$L(K4ZI1`H=>C^z|+CQ zGMf`u$78du+;<&u`%-80`*4srdk7ouynV%f=DH=O&ZXqhYd$-V&@Zq%=1OiJu>KIP z+D`2ycV8^*HvOr)&lc9_gC{m2PwZ1H?72LMp+*+*78W%ecZr#eGjDEl^qm$z^*tv` zwWcSv-l~Qq4j66KT{-w$Z(HEl39SF-P3}~#d#`bFU|r{&H%w}CC*sG^CYUe@d?VlQ zCc$#tFbQ|ea^70^s&mjb9PPK##WQ-#R7svACIt+ybpm0~pRT*(^Q=VOpJxduYkHu>6 zac-wqa%UlHGCzd7%FNd-u7v>1<87lPQW!>c)Ti-UD&^c{95AuKb1k4S*0i|?R;*B@ zqxp0I^yuc|GClR#0j~?aZmxBXc?O9@$pq?Zl~}06S;61b?&6kbHbFowt}$ae>Nrl4uaCK|@{ZT7wBE`~ZN+>z3~BoRa0aOHg*5 z-dt3WWXU2-q+#wQ`O|xtM)I7fTPJSW;2}gLsfCa-$nKpXEy}50$C7Sh!Vxm7NWD=I zZ8!LX`$CbyNfZEZaT`+A&#}p?d|11i`KBPK+DH+_#wSk&&XK;#z5PxT`{0_%84o5w zl`C-9yav`RDq$WHHWBT>LMK3KUl%e(6{ts`PODI2E89S_R^TBNdLsn++?#=Guc)1t z!BNO+aZ?oa=1`sk6%+EY-kDnxERVA%N}#8-5M!(rcNEUppv{q6XI>2P)sDpY%SJZ&T>#u%t$Z_C4;!V`7AQVU`?u88Qno&f*&3% zN}X{(naeBS)D(iK*5Ne(PMV^&PW`YnI2UCAx{G^GD617w6${BlC9Fw?B+k3`rO44h z2iX)TRVU@xF7#W@iEv5m*#8@M_J|=!9@>Qsi_mjs=-A2um>VF*ZEfUF1HF(3uEUj6 zpw`g}lMeEr6 zh(vG|p#v{egj)wgQ0g#KIh%DtRG-_Cguou3c|i?-eFZvD1uh`1=R|#^F$QZ>h$%M( z6eeBNLJ{=6l`t!TCI>F`8K{BeQQBx^fQ+bLTM&*P^g5B z`Um}htxk$n-8&0HD6bsprz{L&{UlI)Gb$n0KZUEROKQDrygLW)3vbD91R=EWy zx#lDrc`wLDyhzB*TA`cZ=TN!eWZ)h=O4%b9Hi@M8P)_#u)%o?S`=@{S`IYNMfE7t# zFp?x8Go-In9|$agA-3+gX^6i9(SWl^$l*~4TwFwQwI$Jxkn53%pG}UVu1|teHuv?i z%wD=sQf`teusllU1U`nYY_cT8L7@jW4meEFRjw?Pvk5x8)MaJa5T*H%6xz!55zxzg z28!XcxN>8Ol<8ga>k>b8zwF)VuV2B}f^dQ;mvk65D{sk7G~DVFlmg`$}xIrLs#SM*R>7)=1%Q=ULLYmKf@8qAhP7YJ@J+EBW1KibZdV%)zZEd>OY0+jOXwIm5nl=HvI z*B@UUfg#gcsJd4isrnPSa6b*vLSdu34hO^`->4#N109X&x(9z52r!Nuf81PFyK~h% z8lI+f?gxuF^XfUtPi!DybYPaOUS}+DzHu_B23ynH^EN)gBu*JV)F?##kTgIxYkk4D zT>t<%E@($4ZL!XKHKkbvGeaev20WHW<*KNDbbW(yE^bdH`T~j^Z3Lf;N7mpZ40G1N z(n_%@P{3;lB5-1u5xzMMhoMHGP$OVYmmEc(At99zSQ-!da7NUE)D-Co(ya|?UVXeH z)#mFTpYAvW8g++G(h^OU6Y<8Uca~+g6^Jg0i8{h##40(JF_h2{%)$?`3E%E;4Rplk zPkbN>o8lf*ZY1_cHs0gpQQ~E)<$%9G>cea4VNi&G&rC}jwMEnv6GD#?*ZRchW%!6y zd-XiHS{ZlBT({yMFQp5(b8>WhODG}>Fs*Eo^mKd6Or?#+r(YFS$yM0CNkbvK3_Fen zxd~X?5$TE$Uy>jk)U5@meLl7tY8YPww1QM+U=)Wm6BiN5Uv4MNl0BCL>BtssgcC4J zTFv7UpI|kLY$gJhQd8Tbyyih9O+hJBi8gLfH4KSmOiwX&fM({7N%T{i8_2iCG6BeB zPf+DioB%?XWq2QxEFL`zg{N=Q-)gqy`QQ(HMw+gI6(xL8eh8hP&^Ji^6e$Ok6e44^ z&!Iszlr_Q#1&M~kdn1EpY~cl`_Ttd$ZSD8&f?>vMLLAg*;;cXq+DzwFvFIzRu>)!a z)qcj%Mr4+bvqBoT;m36E7m-aX0%1e6AhEKY-pTM#24((!?a6o;|H>1`1bOO0(u z(U{a83t`+mUM8qlKOn2m@=n3O?m``nlfzKQ3v-O$Luq675*Lmr88YZMb-Wf16+I5@ zQ7#xal$YOx1vy=dPsI-@xs3p6_roH@({RIRQ=J@7P9O|Bwt%iirrv$!N8WOSW0-!> zZE#m%1Z&IIIMv17*L^raQj;77>Yk(q`U7h$X>?-55Mtc%*2p+=JFtqklWJdyN>N?yJqOgHvcP1iUeYLViQz z0P2MKf;*`!PL~iqh%o3~y)Kvv^Lx1KNG)QxCM9)N)sBiRB?Lxg1ek7xGUsAf)_VwTyK(@PuKG=2m7l&3UaU^(VTJ!lS!QmOeflClw^?) z1h3XS^u8t3u|;aM!EfuydAZYr6(&l+YithRnoq_N!;Ld67_Y(m>Q4ZY#4aHUmsRj# zoRGQHeR~z~<$V^}zNiX}Zgbp?%07W1B83t~4>e04Er3OymT0tBWI=DG=nU>g(^3*t zS4C+0YVN1-HdgHg7FPnFg#c@xqb)yf8+mj;%}BTqPrfq|0^G47s<`aSdSQg|=KdBhqr{SUJ9t>M7a=8(aOwsSU}Xd+ls7$Iq~W^T zZVNfn&lTg_%&`qswDMR$PtT zykV+8ILT%>VqmAMcC_(fC8)>b9|MY+%@LT$vh`uA`;9y7V!p{_8kKCc7#0N5qjTl*>$kySO`fl0)%O|C--7xrJ7Kn|HAp8!JRonJrtyJWN z0U6MO^>?T{py`&dVeuoNrz~)bx!{hpBMW77JAWDQ@hiB1AyyP;ljtE(C0j&YrSX0Ut zprgQ8zzL48`7{9_4t5a^k3ns3EA{JN0(QNdn(|OolgSW6UTRVap2%EvD*&`C9Wwa< zGQOabwCRD1158zl=|VGZUe=uYU~%VG5Bp-X)vJi|5eoqTps3rr)nVNA!em8tRgq8j z5%H93<3L`*JkP_@tHYyv23Bz$LA(;$)W%WU+JC{zckQNloHHy8S?G=6Y3Q!xg~W@L zNIYbwHt9vF@k&ir&3g5NEL7iTiyPgz}F2%t1Bjh0eW}> zaFd+el=*pe`MoWv8uDe{RU79J|O;T z?{l94j@Wn^Rsl~wpl1YomkPOL6xTe#0q*ndJ#pKhD>9D@;d-gJW7_nY9SsHM<*QDP zY4(AW<_H~OVT$N?FKqvwS?U?vkfBhBpTc0-l=^W+4T{-O2Y1Q$XQUn6h0v+PVL+fP z$_52JC*op22XcT(X-RtCrfov)MMYF{c&!G|)U>?|F^dojltR>4)k)?dUGg9!ruG$( zZxYj_3We3ShpdryOkpHsRgPd|H;L_XJk}6}z6CxK9DoUUP-lB~}ybmFB9b zWq2O=ueknvUDJ;x0)hKj&p?$nvb2db{nHW@Qq@KQsworteP9&7wdaCdz;422X!VUd z!s!rzs_m_$o}8L;N!09>S22hsusG1ilo5wU!~ND1kq{yyYA*5fT7*Ts7bol+&cB@rK(HkeR*4dIz+(506u z1>gmTu!t6XqD&>h1_Be5krc}-9mEay57le167{6OYaXQ_Ht<1k8j7c6pc3V^)k*-? zSqO4kqFc=)D@_v=kt(?oO)hGL$S6qzXS}Q>b%E*SMmxgs5*d`TJ~1#_+PN@I2rN=W zIy%AW$RqFw*6p~}ihDF|g^Wtxn1*MtAyHe;IBktMYbUsaqoX1YG2^Fcqqm)+X-N=r zUKqD%%<6kM?PlPd^VY=W)}BY|WXd`af@C5KqBarKE)j%(%ZTO6>X8cklVJwrF$n;< zLYy&%-hiVO0!_o%eo2|a;DjBtr&WaTHc6#VzR${tRw ze%=Obs5ex#pGjr-i-G3YG9S3m;+NW3Asp?6;XWO)oiq(|re2}_){diK83T&1Y zARoONkfY&O%-R*m9+U_X3ThuxiDd__6NlF~)vHbYdn%5Mo5f=wKzn*XRqIm&y?I0vAsF z$Zcv^LQ_z;YkRn82$S%hIbxDfP=hOQxj8%;-M?-@Gf$hkS}<*t3n0%xMUpqjT~pf0 zBeUny;8T|y(JUa+2MyET{3%Ky!>ow_49&78SKv;~14W^<2NSw5q^;K!vg@_Wh{A8$ zrL!6uP{e{0kh~LKn2gw_&WGb28N!s;9g+Y`vs@i%&1J~ueQp6msoBDT;h{#Po+Rkd zPaGaf=8vlzJ+ITZ&({2ufoK|Xfd@xTz={TADON2Jh-i{xWM8>3C z!1f>_jAR!Grjiq&ERbpKZMyLN2$Zzi#~4X92kdGmumS6}UX7+gJ4mSnWg`uaHSkH@ zLMdI%>nl4pmv3+44&8X)uDQ@1Epd>C0XF~^phnf%D3r(xJD-NK0kdOUQ_mWr-P*rD znuikZ1 zmQYf_!5dg63%yWvaUhMz_9=4I?oyX<<%^i@?N^}#!q{(Ix-AVtqS%x47Ywir>& z$eOE;?-kb!b?fkuntRvmgn3F9bXXL$yf@1{(|e2#OMIUv7#auPS6hc92vC-IbwISj zV9ab<%9N!TX&j?#o45`^V54wQVmL~w4_%$=o2JU{wJh=NRSio#532_mQW7WOP1Mi{ z+Gkb|#v?-s4Ok2@YhSOvnUb#Uf`K^(IZzGSWG|YHSsJ%cYVY)1G>CUd5Q7c^t9Zyp z)HhI~sk4}7X;Iw-5;ENC#qwiz|8PVPlcn(yyZ2Pfa+{NY-pUsuU=qW}#TXN`{qFwYW9=5mi8_?NweL%^~@Mi@hE; zZ89?j??)68=WGz=s%pw0x4a&M(Znty7cL-rK?6_L++Kz2puXQ!ckaF~7FrK2=n*;L z0ns@{>NRSv7zwSG6y&|)Cxt~<;~=y&eubSSaUpT!Mb&f(30R>^J+v3!h^ZI)tN5i^ z2+sKIlW3d(mk(uE3>~ne(Wf;vaTySjYBghttA^v(Yat!YGm!L2^XZ*jz+M}NlFQ~} zTbQkVCKeRqwNA;<#slLj-5mu*Q z0PCi7N6{`dc1Uw@M{vqDgMHaFTi1)jcxk-Ir#Dl;zsn%tm6Ko(qlEl1^(6z|R9hr? zawwlmc>755n*bz9?o1NAYXCXQ-IC(-brHvw@4=s9`4FcO7G~wi9z>X)Muc>AUkE#l zABxvqjl8PenRI1%k4~`x16Mn|rU?$H+Y`6mo(8)~yJ_j(MPAdb)i z%2>P0YD6bJ`gS!c1sF-^cePm4vk#4$$56)ITVv z=cr1MNz?VQR#fei*?~3U>LPW6W0md)G-Dmw1>;=jl4w)gn~VD_RFF1b^xOz}ZCXlJ z&)!U2)JENsaAciGRk_;TVHG`HL}jk}Oe_u!4NfHkuSl7w$+L#+)wCMAtf0H`Yh3K8 z=sBz2YcFOL)7BhO7c*-DgvA`323{0JAo+6DJojF>vX5MwD7FhuF zp0?lE9qS946jcKnP0hceXP&g%Vw4VYY^CAs_2RW1t47@hOUC9{#_sjCYc#F)4kHg-bHa1s$meT@X}YI`SguS(AwCJpSd6dX-#aQPUDd?zn?V zJ|ZzlZ#@nf@JpoA8|f`U?Q!tCVZY%>K|3~0J=6g~<9Efq0nO}PL6&MjDE=rNJs5z` zSlX-=x$T_aBM(?f31n7&YcgAVP*CnAQz(-i+~f)i(liupJPy?}vRUJQ0l9`y=t)ly zC2F7Z@0slF*!*o~+G#D12;!2Kw^HnSsu2CDvA8>NM@g;Hx-|2lntcP}X6)j4YjOZx;tv(*8crN?=e=D0K-j-}NjCnlm4%d!+5W*<&k97IwR zlPE*JU3bT#)gUZ>?IFbEOIl+mgpam0AyIe!HrFwQNDWaP7NAK>jM-ow zdCgfgIj6Zch*B*kuq!#WuHkC!O~gjtZn<#&)*}xjGwKCv+tm5j|39I;QCic!VS=xe zv>+p{<~TLTqh=ToXcnqIz)^7}I1%7jQ;zD1r~Mvnq%!6!mY#tpwUlbskz&Ww200Er zm;sk(Y_$Hr1A3;_K2rgj@yk%5My)v}YXb7uiag_Pi=LH($?*LhPS>uwM#-h+IKZcs zp}zK^9ETO0zW3@Tzk(FB|Wk1o{8ET z(H`1ZMC54;61!A!F(1f=d9)`)`bnH4f~A{^Cg-v`EhwaXUmtSa{5p6Pn0o&B7K{c4 zPIi$p1Go`NLU=3*=0IKZtf!j09%4aH9Bo5^kZoc=Wt#M$s&)fT)Bh!*dZboC@&hv( z)+97=3jxh~v^r>BrNXUA^TnW_)1C)ZxwU^KYQG`rc{=UQvHWUfpc?oH=tluhjg4wr zYpCg<$B?>|5GcfA&t6f#NN?$;kjfho*0Ywln?IGtKrIYYB z%_IGgt2iCJ6TH(ls;EdWB43Z!w%nUPxSzfWhUfPBMlW${;p#!z*){okuTwXT)R|Jp z`ySNf0}PUIYM@N}BC6pM|A*{we@hoX*JB7I0m>BFS9Djn-L&MquVs9fo~&!nDTfPL zBDUPtFr!T5mO)^#KqE~SpNAq&*uALy2QhB=sE?blVY?X(9T(4bKj=yA#o47e{f_TMaOAygqAS3}Ou6 za;Pxb((~`3>KRCN?UC5_o^E`*f^hZG;DCQmHUdyBc9bfnG@bxarv)s@9Ir`*+!2pjyJjXQMB;FvN z*)%oI`@~^Z7G>gd;t8EDNc_lk$>BH7C7ZoGGpuLR^Tc6dq144v7qhai5Kj|FWJRTX zZ_Z(v^A=~NT4(Kh@)w2*>Pm*|G)IuY5|T(kfP^|KsKP{)R+SV3Y1)sw_=jzOid+)8 zDq!STKn)5++YkN+zq>VxQU%+?kxZS05DKYR7L;)|L*SY-rnBL&CR{Ny{xRP zoSdACi;Ht}b7Ep*Qc_YuK|wJwF(4oy5D*Xm002Yu;rajo00Cl4M??UK1szBL000Sa zNLh0L04^f{04^f|c%?sf00007bV*G`2jv6?052?ha*YE301>xIL_t(&-tC%QXj@mF zz%SH|4gCNm?GBjP0ZVBYW?^V_Mg1@^ld&~%A(Ww=bxmOlZD{3?ZIex$SV?M|Jaz9j zR>MB*7^&HT>_fXcQXsSSuvF*Do<3|Q_B~hAg-N4Y_o$s|lMI{a4$OlIcv{W>e?BB# zTk?m(zAQcATC$__)BpSY&$-tyU{JS0i zIx8!#W7Zd=(K`DRWz1>LTp^d&0e`9t0FJMb9f#oj<#4YxPCuP)Z!5QXquVkBtf?d6x%77zz&sRanZE zxaWT8)%j<1jkEcc9IHG66a}D+2LV6YyUvJi{=@uTuW&ie>vZj_-~1R=fO#%w>|^6R zwcT}q`2H3*Qd*#w{Y(`;?EHk*>x*^zJfqa9;5-iieO8JCz=xsd=y;KU0(A=B<^Q#P zkFHU=wn%B1(jovDd@%stCf7LsgAo9zcoDzkz+?-hyI$_jWv5=OFVZ@n7b@7GIRJJM z;-=oooeKa|yeJiD&R)5AdD+RW9CSZhT>FYw@*sbO3Bb8sB*(2j8UW~ck$@ZsoXuC4 z-4*^rkA4M+UviI94>jP|j9s+I&-GaW6?D8vfK3aGyX>y#vV)X<#wm@X3Vi|qA2`qX zIe2LW=y(yoIABF^fKzms6I=U$Ru0Y&SHKAd+P(}Q=(8+i9YDv6j6(Rff(<{xn33=h zOn)LOLK!An=bFB61?YG&HXj@7fF3$twg7Cb1A6Fq*?c}^VZMV1I$pK{P_F|($IIq` z3I;&?|I+cYIlyDQoOrpt1S(!O2h6(sZSr2*|I+cYIiQc1mkDVrf{vFh0M;xem&-=i z<86|HgzO#wb>KfBpY8{ce(*lx;L4Tx`S~mN z5eK@nrT3Xk-;8g@H{<{3pla}SV+R1+ahPql1@y#WYz44g&*QGE=6U*um_IbMd-w4E zEdY8duQdQ_zh(^Y9T*7jjcrb_)wC-7!_6{ttAc<6gd^eIaK*Nez>@;_)w{L_dpG8~ zOiIu*5Edi0wFD@F$2_N4^?lehYe0BA09UFE+hpeAeBZCx$_72=HUV-lyIAtYs4&Ns zfGA8iIr#>Mx8KW$I}6Jc*$ z1rq?!BjLzk2MIjx`^6f^?{^je;QPkV9UHa<9bE{Xm5x=hs{Vm5-RQ zcou0SI|Npn^_k7b3w!0s{pc zw}#ma3M5az^SM%C7)E3S0Ragbr$(5D5YS+T8Y_ux1nd1%GI>~@Kb?%mVC)_22ym-V zj=&jJ-vdcRMe_Z7;~;@AL^wHw?$|3Nm`pUrc=ODKi(F(ZT7)%_;04|H#nEqZA0g~%>SX70patMI6HnSxMh4A{sS(2 z9{|XFNA+a(J%B$<%%n(w5PRAjjvtU^JtzT$d~676_wbMeL`+%5%y1+Kh?yENWkVjw z>$ZXUj*AEM0Z1^T5m|oCs2Kp52V&-{j38P zfsq3T@O{$@paSH3&puWBG5@28kk>jDOfxZ_NNlhHq^qi4;TYz>P+<>V(WlniKrd}U z090_Z0T@Yw5tRr*fC&JMgAD-4_b+Ani;Mh6FGxfX&^p$s;C~*+@`ruEGvfjvMd%Ee zqToV#fdrWEjXuCazyQo2FgF3r6qOf>kP9;3bszA|>FubHOinQ-uiFOXdutzX0lc8% zAn3+`1g+^@|N6_;KA_%=12fWDg61&3{xZ-9)WuX02b}@E&H0mtAM6ACsM!#qBfyx% zm`o(_rBMfTUD(z*VGhDlIWl36Bn({#bY0jnK-U3L7lwy+cbt@HIjL_2s5&6}fZ^D{ zK*wX^Q0TAP15_Olbzx7qqXe&vjy?w>?Ai!WbwJmJj(`^u&vyifK0wulj)3vxp-lkL z2dKKx(T3shle!)R01;IOWL=1cxks_}$F`5*YNY{(U~&isygV5In4%6$CS_eP!_eV4 z>f*H7bQ^~v(I*jruf{}tWFj6PKN*Kely%^6Qr87MsUsvu3xtwF%c&hs#DLiV&~-r9 zg+hVokwws!09^-kT_|KSnYpIQ(W1G+90vgC{$larI#Y_0_mMlXaB z0BMK-k&U_z=(<2MbK@}P#_{DyhO`1+8y$T?0LGyZK%;>_4P6IxUC6#S*)p;Xz%H0L z3Ijkd8@m#Tq+mc?NPB^~3)yrAUx@HRVO$MefUv`WltDFuH?MFm_NUCj=}_vy`S3f@ zGQdZUqmYTj>M8<`9aGWRxL07SO#<}l%+*^Cccm#o?_(INw^k+K@Ug@11UFrBj%%F< zKsklYE^c2|CMVA*34{RQW2>w6L#Fwpb?oq4L4fMEtyI~v$|=2(UIs@9PZ+(sg#^b| z>&I3TiNkMQ*Z{D^wvD*}a6NIm+x3>g1~L|m;{$O8SiNUi*5Uek0DQMlVi|3~r3v!O z1cG2L3lb;+;)hr3_t0(DdVnhc@U@gVgqBejwwy-^AQd1cPD%mdhpl5MfMu;(>i}h| zENsB7S%3)(Eaw?YKuBhMya{*<8{hiIoog9Q=P?C9H9SHX+8}c#Ac2)=RHT3n%3yx6 zSHnn=GdG5}nZU=qC`0EZ&+*G3bV3ZokU zc`m)LRDiee^@NjgnUhk2=K=6S{k6`3GKek!y%HtDv-%L0FWY_fYl%U z9|ZJHgVo&|C`4WW`1!0TKxe>$pg^(mA*A^^35X1B1WXIB*&OtMKyod{%UXi`QikQ+ z3Z>v){OBoIG&ZQvTTxDTITjSxf@QoZ0hrOPkQ~1ztZ?FaXu#G1PQAn$af8XkunJ)A zL-1#ymOx4`ivo0klVC1eLAjPv;B>@5$%QgTY0=~cdgD=#> zWl4~~NkD*C1~r-zAO$*%jXxm({`Y?GH|Dnx5P-?-H6^gQQ&0e~!r0Xl;*lBu zKmXQmwcjUi0KtXa06;kfW|UsYKnOr|_Edk|@y-c+PsdL~yanPbtxfiA) zqv{_Yt@@+;Lb4{7xufGC$7$Z7T)1)eTFL^z)fT`sEqO4%==;Y*W2g3oG$5sHFqbLV z%Xz2B8;!+S$!0kDjax@Q!4omtmjc{A{`iYOg|^RNI2~LmoPZM8%eM1xD;mJZN=^%) zw^FJ(0xHi*7 zfFs##8i#?)V#?zzn^qO+a)o6x5@0Q5NV4>kRiArb%s1V|MMv_mA`#mA@t zke(Z?Kq3eLmjHJ=r+@-*gOGH30s*0aZvn9F0A`p1%!LM%$4NgKXsE!w9Rgqg;1Wt8 zoKQ|}2QY=3Yyo&2s$_qNgu)?la|Slg+X75C09a-rjJ``Coy7@;yDb%_aTU9PPC&qO zSiB!MT)B1F9)Pz3Mni;zMjMZjY!6VAfV4c74u#s>i{BnVoUYHb-H7f0(Ee$FZ2%w= zXRyh_Y8i4n@0E_?u0kv)caUdXocMTXGOwQoF$r&)`&$?pwKQO-Zz8DNIr!lR(10Nez?|NQm8>>!QUEdXqZMihXb8Ql#uV)ba-MJ3!ymvRS9?Rzu{sJoS Vu)Xnzs15)C002ovPDHLkV1n?oOm+YO delta 4604 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 d|EGB0c-z?>U2!hH?=i;0niVYxmf@_&Y9Oh^C# From dbd86a3cc328c40c9c6e46450782e706f54c29c7 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Mon, 5 Apr 2021 21:05:39 -0400 Subject: [PATCH 015/145] Added Mossdeep window lights. --- data/tilesets/headers.inc | 2 +- .../secondary/mossdeep/palettes/08.pal | 2 +- .../secondary/mossdeep/palettes/09.pal | 8 ++++---- data/tilesets/secondary/mossdeep/tiles.png | Bin 4111 -> 4115 bytes 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index 5977020be6..dfa58de30a 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -112,7 +112,7 @@ gTileset_Lilycove:: @ 83DF7DC gTileset_Mossdeep:: @ 83DF7F4 .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0 @ padding + .2byte 0 @ lightPalettes 8,9 .4byte gTilesetTiles_Mossdeep .4byte gTilesetPalettes_Mossdeep .4byte gMetatiles_Mossdeep diff --git a/data/tilesets/secondary/mossdeep/palettes/08.pal b/data/tilesets/secondary/mossdeep/palettes/08.pal index 07d79210a7..34e9db9806 100644 --- a/data/tilesets/secondary/mossdeep/palettes/08.pal +++ b/data/tilesets/secondary/mossdeep/palettes/08.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -131 197 98 +0 192 0 255 255 255 205 205 197 180 180 164 diff --git a/data/tilesets/secondary/mossdeep/palettes/09.pal b/data/tilesets/secondary/mossdeep/palettes/09.pal index cee575bae6..818ed6aa0e 100644 --- a/data/tilesets/secondary/mossdeep/palettes/09.pal +++ b/data/tilesets/secondary/mossdeep/palettes/09.pal @@ -1,15 +1,15 @@ JASC-PAL 0100 16 -131 197 98 +0 32 0 255 255 255 -139 205 123 -98 172 98 +248 0 248 +248 0 248 65 131 98 123 123 148 98 98 123 65 74 106 -41 49 90 +64 72 104 189 189 197 164 164 156 246 222 156 diff --git a/data/tilesets/secondary/mossdeep/tiles.png b/data/tilesets/secondary/mossdeep/tiles.png index cc4591f8804be4f05f7d9e3de1ef91d110a41c43..3bd134f1a4578eb3aa39f07aa40d661c158a30ae 100644 GIT binary patch delta 3965 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 NhUR3>3Ioc6{{y4s3{U_7 From 898a09ff34436579171a44da55170acb4909e180 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Mon, 5 Apr 2021 21:25:36 -0400 Subject: [PATCH 016/145] Added Sootopolis lights. --- data/tilesets/headers.inc | 2 +- .../secondary/sootopolis/palettes/06.pal | 8 ++++---- data/tilesets/secondary/sootopolis/tiles.png | Bin 2695 -> 13423 bytes 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index dfa58de30a..9ba29a2f46 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -145,7 +145,7 @@ gTileset_Pacifidlog:: @ 83DF824 gTileset_Sootopolis:: @ 83DF83C .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0 @ padding + .2byte 0x101 @ lightPalettes 6, customLights 6 .4byte gTilesetTiles_Sootopolis .4byte gTilesetPalettes_Sootopolis .4byte gMetatiles_Sootopolis diff --git a/data/tilesets/secondary/sootopolis/palettes/06.pal b/data/tilesets/secondary/sootopolis/palettes/06.pal index b9e93fa5f0..6bb529da6b 100644 --- a/data/tilesets/secondary/sootopolis/palettes/06.pal +++ b/data/tilesets/secondary/sootopolis/palettes/06.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -115 197 164 +0 192 0 255 255 255 238 238 213 222 222 180 @@ -10,10 +10,10 @@ JASC-PAL 98 98 123 65 74 106 41 49 90 -0 0 0 -0 0 0 +64 72 104 +80 88 80 156 164 156 123 131 123 98 106 98 82 90 82 -0 0 0 +248 240 176 diff --git a/data/tilesets/secondary/sootopolis/tiles.png b/data/tilesets/secondary/sootopolis/tiles.png index d27c817f005a35cbf3850b42bc10d5a612b3d1eb..f9a6be2154a278142a6091b064c224a6cb95d9cc 100644 GIT binary patch literal 13423 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 From 2f488d685be3ddaad963110e777e3251951700ae Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Mon, 5 Apr 2021 21:41:57 -0400 Subject: [PATCH 017/145] Added Pacifidlog window lights. --- data/tilesets/headers.inc | 2 +- .../secondary/pacifidlog/palettes/09.pal | 4 ++-- data/tilesets/secondary/pacifidlog/tiles.png | Bin 4718 -> 12672 bytes 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index 9ba29a2f46..dae108b59a 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -134,7 +134,7 @@ gTileset_EverGrande:: @ 83DF80C gTileset_Pacifidlog:: @ 83DF824 .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0 @ padding + .2byte 8 @ lightPalettes 9 .4byte gTilesetTiles_Pacifidlog .4byte gTilesetPalettes_Pacifidlog .4byte gMetatiles_Pacifidlog diff --git a/data/tilesets/secondary/pacifidlog/palettes/09.pal b/data/tilesets/secondary/pacifidlog/palettes/09.pal index 780f5b0ab6..4f27efece1 100644 --- a/data/tilesets/secondary/pacifidlog/palettes/09.pal +++ b/data/tilesets/secondary/pacifidlog/palettes/09.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 0 0 +0 0 128 222 230 164 180 189 123 156 164 98 @@ -16,4 +16,4 @@ JASC-PAL 164 123 24 131 82 49 131 131 139 -82 106 213 +64 72 104 diff --git a/data/tilesets/secondary/pacifidlog/tiles.png b/data/tilesets/secondary/pacifidlog/tiles.png index 9fe620e1efc7e2ae908f7e145b15500e0048d378..31f78891d4898aabd5c2912e963d9bf1c56d19c1 100644 GIT binary patch literal 12672 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 AYybcN From 3c52e9b7ca466456eb1f71322f8aeac70c556e2d Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Mon, 5 Apr 2021 22:52:47 -0400 Subject: [PATCH 018/145] Experimental TOD tint. --- include/palette.h | 1 + src/palette.c | 56 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/include/palette.h b/include/palette.h index f9bd20560d..0be99d3c64 100644 --- a/include/palette.h +++ b/include/palette.h @@ -77,6 +77,7 @@ void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color); void BlendPalettesUnfaded(u32, u8, u16); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); void TimeBlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor); +void TintPalette_RGB_Copy(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor); void TimeBlendPalettes(u32 palettes, u8 coeff, u16 color); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); diff --git a/src/palette.c b/src/palette.c index 3d57136f88..34cf0286da 100644 --- a/src/palette.c +++ b/src/palette.c @@ -978,10 +978,12 @@ void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) } } +#define DEFAULT_LIGHT_COLOR 0x3f9f + // Like BlendPalette, but ignores blendColor if the transparency high bit is set void TimeBlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { u16 i; - u16 defaultBlendColor = 0x3f9f; + u16 defaultBlendColor = DEFAULT_LIGHT_COLOR; s8 r, g, b; struct PlttData *data2 = (struct PlttData *)&blendColor; struct PlttData *data3; @@ -993,7 +995,7 @@ void TimeBlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { if (i == 0) { if (data1->unused_15) { // Color 0 is a bitmask for which colors to blend; color 15 is the alt blend color gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; - altBlendIndices = gPlttBufferUnfaded[index] << 1; // bit 0 species color 1, etc. + altBlendIndices = gPlttBufferUnfaded[index] << 1; // bit 0 specifies color 1, etc. data3 = (struct PlttData *)&gPlttBufferUnfaded[index+15]; if (!data3->unused_15) // use default blend color instead data3 = (struct PlttData *)&defaultBlendColor; @@ -1119,6 +1121,56 @@ void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 b } } +// Tints from Unfaded to Faded, using a 15-bit GBA color +void TintPalette_RGB_Copy(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { + u16 rTone, gTone, bTone; + u16 defaultBlendColor = DEFAULT_LIGHT_COLOR; + s32 r, g, b, i; + u32 gray; + struct PlttData *data2 = (struct PlttData *)&blendColor; + struct PlttData *data3; + struct PlttData *blendData; + u16 altBlendIndices = 0; + u16* palette = &gPlttBufferUnfaded[palOffset]; + for (i = 0; i < numEntries; i++) { + u16 index = i + palOffset; + struct PlttData *data1 = (struct PlttData *)palette; + if (i == 0) { + if (data1->unused_15) { // Color 0 is a bitmask for which colors to blend; color 15 is the alt blend color + gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; + altBlendIndices = gPlttBufferUnfaded[index] << 1; // bit 0 specifies color 1, etc. + data3 = (struct PlttData *)&gPlttBufferUnfaded[index+15]; + if (!data3->unused_15) // use default blend color instead + data3 = (struct PlttData *)&defaultBlendColor; + } + palette++; + continue; + } + blendData = (altBlendIndices && altBlendIndices & (1 << i)) ? data3 : data2; + rTone = blendData->r << 3; + gTone = blendData->g << 3; + bTone = blendData->b << 3; + + r = GET_R(*palette); + g = GET_G(*palette); + b = GET_B(*palette); + gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; + r = (u16)((rTone * gray)) >> 8; + g = (u16)((gTone * gray)) >> 8; + b = (u16)((bTone * gray)) >> 8; + + if (r > 31) + r = 31; + if (g > 31) + g = 31; + if (b > 31) + b = 31; + + gPlttBufferFaded[index] = RGB2(r, g, b); + palette++; + } +} + #define tCoeff data[0] #define tCoeffTarget data[1] #define tCoeffDelta data[2] From e11d050423d13abe773d38716c69628e582b38fd Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Tue, 6 Apr 2021 01:02:37 -0400 Subject: [PATCH 019/145] Added weighted palette average. --- include/palette.h | 1 + src/overworld.c | 13 +++++++++++-- src/palette.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/include/palette.h b/include/palette.h index 0be99d3c64..406f56b84a 100644 --- a/include/palette.h +++ b/include/palette.h @@ -76,6 +76,7 @@ void BeginHardwarePaletteFade(u8, u8, u8, u8, u8); void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color); void BlendPalettesUnfaded(u32, u8, u16); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); +void AveragePalettes(u16 *palette0, u16* palette1, u16* dest, u16 weight); void TimeBlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor); void TintPalette_RGB_Copy(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor); void TimeBlendPalettes(u32 palettes, u8 coeff, u16 color); diff --git a/src/overworld.c b/src/overworld.c index 6e7542109f..cd1a1df966 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1496,7 +1496,8 @@ static bool8 FadePalettesWithTime(void) { void UpdatePalettesWithTime(u32 palettes) { // Only blend if not transitioning between times and the map type allows if (gTimeOfDayState == 0 && MapHasNaturalLight(gMapHeader.mapType)) { - u8 i; + u8 i, j; + u16 tempPaletteBuffer[16]; for (i = 0; i < 16; i++) { if (GetSpritePaletteTagByPaletteNum(i) & 0x8000) // Don't blend special sprite palette tags palettes &= ~(1 << (i + 16)); @@ -1505,7 +1506,15 @@ void UpdatePalettesWithTime(u32 palettes) { gTimeOfDay = min(TIME_OF_DAY_MAX, gTimeOfDay); if (!palettes) return; - TimeBlendPalettes(palettes, sTimeOfDayBlendVars[gTimeOfDay].coeff, sTimeOfDayBlendVars[gTimeOfDay].blendColor); + for (i = 0; palettes; i++) { + if (palettes & 1) { + TimeBlendPalette(i*16, 16, sTimeOfDayBlendVars[gTimeOfDay].coeff, sTimeOfDayBlendVars[gTimeOfDay].blendColor); + CpuFastCopy(&gPlttBufferFaded[i*16], tempPaletteBuffer, 32); + TimeBlendPalette(i*16, 16, sTimeOfDayBlendVars[TIME_OF_DAY_TWILIGHT].coeff, sTimeOfDayBlendVars[TIME_OF_DAY_TWILIGHT].blendColor); + AveragePalettes(tempPaletteBuffer, &gPlttBufferFaded[i*16], &gPlttBufferFaded[i*16], 256); + } + palettes >>= 1; + } } } diff --git a/src/palette.c b/src/palette.c index 34cf0286da..a285a48257 100644 --- a/src/palette.c +++ b/src/palette.c @@ -978,6 +978,35 @@ void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) } } +// Computes a weighted average of two palettes, as (p0*weight + (256-weight)*p1)/256 +void AveragePalettes(u16 *palette0, u16* palette1, u16* dest, u16 weight) { + u8 i; + u32 tempColor; + u16 r0, g0, b0, r1, g1, b1, r, g, b; + u16 color0, color1, destColor; + *dest++ = *palette0++; // Copy palette0's transparency color as is + palette1++; + for (i = 1; i < 16; i++) { // Skip transparent color + color0 = *palette0++; + color1 = *palette1++; + r0 = color0 & 0x1F; + g0 = (color0 >> 5) & 0x1F; + b0 = (color0 >> 10) & 0x1F; + r1 = color1 & 0x1F; + g1 = (color1 >> 5) & 0x1F; + b1 = (color1 >> 10) & 0x1F; + r = (weight*r0 + (256-weight)*r1) >> 8; + g = (weight*g0 + (256-weight)*g1) >> 8; + b = (weight*b0 + (256-weight)*b1) >> 8; + r = r > 31 ? 31 : r; + g = g > 31 ? 31 : g; + b = b > 31 ? 31 : b; + destColor = (color0 | color1) & 0x8000; + destColor += r + (g << 5) + (b << 10); + *dest++ = destColor; + } +} + #define DEFAULT_LIGHT_COLOR 0x3f9f // Like BlendPalette, but ignores blendColor if the transparency high bit is set From 3bd46b5b7aa4ee0add0f2d1e145e91c9087befb3 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sun, 18 Apr 2021 01:40:14 -0400 Subject: [PATCH 020/145] Fixed bug in MapHasNaturalLight for ocean routes. --- src/overworld.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/overworld.c b/src/overworld.c index cd1a1df966..0ac310e653 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1481,7 +1481,8 @@ u8 UpdateTimeOfDay(void) { } static bool8 MapHasNaturalLight(u8 mapType) { // Weather a map type is naturally lit/outside - return mapType == MAP_TYPE_TOWN || mapType == MAP_TYPE_CITY || mapType == MAP_TYPE_ROUTE; + return mapType == MAP_TYPE_TOWN || mapType == MAP_TYPE_CITY || mapType == MAP_TYPE_ROUTE + || mapType == MAP_TYPE_OCEAN_ROUTE; } static bool8 FadePalettesWithTime(void) { From 22c429d0d6dc5c823b55e88c764be71b51d0db76 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Mon, 19 Apr 2021 00:07:42 -0400 Subject: [PATCH 021/145] Added inter-time-of-day blending. --- include/overworld.h | 6 ++ include/palette.h | 4 +- src/overworld.c | 69 ++++++++++++++++---- src/palette.c | 154 +++++++++++++++++++++++++++++++++----------- 4 files changed, 181 insertions(+), 52 deletions(-) diff --git a/include/overworld.h b/include/overworld.h index be7c33ff03..2180a87a9b 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -44,6 +44,12 @@ struct LinkPlayerObjectEvent u8 movementMode; }; +struct __attribute__((packed)) TimeBlendSettings { + u16 weight:9; + u16 time1:3; + u16 time0:3; +}; + // Exported RAM declarations extern struct WarpData gLastUsedWarp; extern struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4]; diff --git a/include/palette.h b/include/palette.h index 406f56b84a..a9e6cd7671 100644 --- a/include/palette.h +++ b/include/palette.h @@ -77,9 +77,9 @@ void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color); void BlendPalettesUnfaded(u32, u8, u16); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); void AveragePalettes(u16 *palette0, u16* palette1, u16* dest, u16 weight); -void TimeBlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor); +void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor); void TintPalette_RGB_Copy(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor); -void TimeBlendPalettes(u32 palettes, u8 coeff, u16 color); +void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); void TintPalette_SepiaTone(u16 *palette, u16 count); diff --git a/src/overworld.c b/src/overworld.c index 0ac310e653..6c7196a515 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -186,7 +186,9 @@ static u16 (*sPlayerKeyInterceptCallback)(u32); static bool8 sReceivingFromLink; static u8 sRfuKeepAliveTimer; -u8 static gTimeOfDayState; +static u8 gTimeOfDayState; +static u8 timeCounter; +static struct TimeBlendSettings currentTimeBlend; // IWRAM common u16 *gBGTilemapBuffers1; @@ -1472,12 +1474,39 @@ static const struct TimeOfDayBlend sTimeOfDayBlendVars[] = }; u8 UpdateTimeOfDay(void) { + s8 hours, minutes; RtcCalcLocalTime(); - if (gLocalTime.hours >= 20 || gLocalTime.hours < 4) - return gTimeOfDay = TIME_OF_DAY_NIGHT; - else if (gLocalTime.hours >= 10 && gLocalTime.hours < 20) + hours = gLocalTime.hours; + minutes = gLocalTime.minutes; + if (hours >= 22 || hours < 4) { + currentTimeBlend.weight = 256; + return gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; + } else if (hours >= 4 && hours < 7) { // night->twilight + currentTimeBlend.time0 = TIME_OF_DAY_NIGHT; + currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; + currentTimeBlend.weight = 256 - 256 * ((hours - 4) * 60 + minutes) / ((7-4)*60); return gTimeOfDay = TIME_OF_DAY_DAY; - return gTimeOfDay = TIME_OF_DAY_TWILIGHT; + } else if (hours >= 7 && hours < 10) { // twilight->day + currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; + currentTimeBlend.time1 = TIME_OF_DAY_DAY; + currentTimeBlend.weight = 256 - 256 * ((hours - 7) * 60 + minutes) / ((10-7)*60); + return gTimeOfDay = TIME_OF_DAY_DAY; + } else if (hours >= 10 && hours < 18) { // day + currentTimeBlend.weight = 256; + return gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_DAY; + } else if (hours >= 18 && hours < 20) { // day->twilight + currentTimeBlend.time0 = TIME_OF_DAY_DAY; + currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; + currentTimeBlend.weight = 256 - 256 * ((hours - 18) * 60 + minutes) / ((20-18)*60); + return gTimeOfDay = TIME_OF_DAY_TWILIGHT; + } else if (hours >= 20 && hours < 22) { // twilight->night + currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; + currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; + currentTimeBlend.weight = 256 - 256 * ((hours - 20) * 60 + minutes) / ((22-20)*60); + return gTimeOfDay = TIME_OF_DAY_NIGHT; + } else { // This should never occur + return TIME_OF_DAY_MAX; + } } static bool8 MapHasNaturalLight(u8 mapType) { // Weather a map type is naturally lit/outside @@ -1485,7 +1514,7 @@ static bool8 MapHasNaturalLight(u8 mapType) { // Weather a map type is naturally || mapType == MAP_TYPE_OCEAN_ROUTE; } -static bool8 FadePalettesWithTime(void) { +static bool8 FadePalettesWithTime(void) { // Only used to fade back in gTimeOfDayState = 0; gTimeOfDay = UpdateTimeOfDay(); if (MapHasNaturalLight(gMapHeader.mapType)) { @@ -1495,8 +1524,7 @@ static bool8 FadePalettesWithTime(void) { } void UpdatePalettesWithTime(u32 palettes) { - // Only blend if not transitioning between times and the map type allows - if (gTimeOfDayState == 0 && MapHasNaturalLight(gMapHeader.mapType)) { + if (MapHasNaturalLight(gMapHeader.mapType)) { u8 i, j; u16 tempPaletteBuffer[16]; for (i = 0; i < 16; i++) { @@ -1509,10 +1537,14 @@ void UpdatePalettesWithTime(u32 palettes) { return; for (i = 0; palettes; i++) { if (palettes & 1) { - TimeBlendPalette(i*16, 16, sTimeOfDayBlendVars[gTimeOfDay].coeff, sTimeOfDayBlendVars[gTimeOfDay].blendColor); + TimeBlendPalette(i*16, sTimeOfDayBlendVars[currentTimeBlend.time0].coeff, sTimeOfDayBlendVars[currentTimeBlend.time0].blendColor); + if (currentTimeBlend.weight == 256) { + palettes >>= 1; + continue; + } CpuFastCopy(&gPlttBufferFaded[i*16], tempPaletteBuffer, 32); - TimeBlendPalette(i*16, 16, sTimeOfDayBlendVars[TIME_OF_DAY_TWILIGHT].coeff, sTimeOfDayBlendVars[TIME_OF_DAY_TWILIGHT].blendColor); - AveragePalettes(tempPaletteBuffer, &gPlttBufferFaded[i*16], &gPlttBufferFaded[i*16], 256); + TimeBlendPalette(i*16, sTimeOfDayBlendVars[currentTimeBlend.time1].coeff, sTimeOfDayBlendVars[currentTimeBlend.time1].blendColor); + AveragePalettes(tempPaletteBuffer, &gPlttBufferFaded[i*16], &gPlttBufferFaded[i*16], currentTimeBlend.weight); } palettes >>= 1; } @@ -1535,6 +1567,19 @@ static void OverworldBasic(void) UpdatePaletteFade(); UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); + if (!(gPaletteFade.active || (timeCounter++ % 60))) { + struct TimeBlendSettings cachedBlend = { + .time0 = currentTimeBlend.time0, + .time1 = currentTimeBlend.time1, + .weight = currentTimeBlend.weight, + }; + timeCounter = 0; + UpdateTimeOfDay(); + if (cachedBlend.time0 != currentTimeBlend.time0 + || cachedBlend.time1 != currentTimeBlend.time1 + || cachedBlend.weight != currentTimeBlend.weight) + UpdatePalettesWithTime(0xFFFFFFFF); + } } // This CB2 is used when starting @@ -1545,9 +1590,7 @@ void CB2_OverworldBasic(void) void CB2_Overworld(void) { - u32 *debugPtr = (u32*) 0x0203de00; bool32 fading = (gPaletteFade.active != 0); - *debugPtr = (u32) &gTimeOfDay; if (fading) SetVBlankCallback(NULL); OverworldBasic(); diff --git a/src/palette.c b/src/palette.c index a285a48257..ff5f210606 100644 --- a/src/palette.c +++ b/src/palette.c @@ -496,13 +496,13 @@ static u8 UpdateTimeOfDayPaletteFade(void) if (gPaletteFade.yDec) { if (gPaletteFade.objPaletteToggle) { // sprite palettes if (gPaletteFade.y >= gPaletteFade.targetY || GetSpritePaletteTagByPaletteNum(paletteNum) & 0x8000) - TimeBlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + TimeBlendPalette(paletteOffset, gPaletteFade.y, gPaletteFade.blendColor); // tile palettes } else if (gPaletteFade.y >= gPaletteFade.targetY || (paletteNum >= 13 && paletteNum <= 15)) { - TimeBlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + TimeBlendPalette(paletteOffset, gPaletteFade.y, gPaletteFade.blendColor); } } else { - TimeBlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + TimeBlendPalette(paletteOffset, gPaletteFade.y, gPaletteFade.blendColor); } } } @@ -1010,45 +1010,125 @@ void AveragePalettes(u16 *palette0, u16* palette1, u16* dest, u16 weight) { #define DEFAULT_LIGHT_COLOR 0x3f9f // Like BlendPalette, but ignores blendColor if the transparency high bit is set -void TimeBlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { - u16 i; - u16 defaultBlendColor = DEFAULT_LIGHT_COLOR; - s8 r, g, b; - struct PlttData *data2 = (struct PlttData *)&blendColor; - struct PlttData *data3; - struct PlttData *blendData; - u16 altBlendIndices = 0; - for (i = 0; i < numEntries; i++) { - u16 index = i + palOffset; - struct PlttData *data1 = (struct PlttData *)&gPlttBufferUnfaded[index]; - if (i == 0) { - if (data1->unused_15) { // Color 0 is a bitmask for which colors to blend; color 15 is the alt blend color - gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; - altBlendIndices = gPlttBufferUnfaded[index] << 1; // bit 0 specifies color 1, etc. - data3 = (struct PlttData *)&gPlttBufferUnfaded[index+15]; - if (!data3->unused_15) // use default blend color instead - data3 = (struct PlttData *)&defaultBlendColor; - } - continue; +// Optimization help by lucktyphlosion +void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor) { + s32 newR, newG, newB, defR, defG, defB; + u16 * palDataSrc = gPlttBufferUnfaded + palOffset; + u16 * palDataDst = gPlttBufferFaded + palOffset; + u32 defaultBlendColor = DEFAULT_LIGHT_COLOR; + u16 *palDataSrcEnd = palDataSrc + 16; + u16 altBlendIndices = *palDataDst++ = *palDataSrc++; // color 0 is copied through unchanged + u32 altBlendColor; + + coeff *= 2; + newR = (blendColor << 27) >> 27; + newG = (blendColor << 22) >> 27; + newB = (blendColor << 17) >> 27; + + if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend + // Note that bit 0 of altBlendIndices specifies color 1 + altBlendColor = palDataSrc[14]; // color 15 + if (altBlendColor >> 15) { // Set alternate blend color + defR = (altBlendColor << 27) >> 27; + defG = (altBlendColor << 22) >> 27; + defB = (altBlendColor << 17) >> 27; + } else { // Set default blend color + defR = (defaultBlendColor << 27) >> 27; + defG = (defaultBlendColor << 22) >> 27; + defB = (defaultBlendColor << 17) >> 27; } - r = data1->r; - g = data1->g; - b = data1->b; - blendData = (altBlendIndices && altBlendIndices & (1 << i)) ? data3 : data2; - gPlttBufferFaded[index] = RGB(r + (((blendData->r - r) * coeff) >> 4), - g + (((blendData->g - g) * coeff) >> 4), - b + (((blendData->b - b) * coeff) >> 4)); + } else { + altBlendIndices = 0; + } + while (palDataSrc != palDataSrcEnd) { + u32 palDataSrcColor = *palDataSrc; + s32 r = (palDataSrcColor << 27) >> 27; + s32 g = (palDataSrcColor << 22) >> 27; + s32 b = (palDataSrcColor << 17) >> 27; + + if (altBlendIndices & 1) { + *palDataDst = ((r + (((defR - r) * coeff) >> 5)) << 0) + | ((g + (((defG - g) * coeff) >> 5)) << 5) + | ((b + (((defB - b) * coeff) >> 5)) << 10); + } else { // Use provided blend color + *palDataDst = ((r + (((newR - r) * coeff) >> 5)) << 0) + | ((g + (((newG - g) * coeff) >> 5)) << 5) + | ((b + (((newB - b) * coeff) >> 5)) << 10); + } + palDataSrc++; + palDataDst++; + altBlendIndices >>= 1; } } -// Apply time effect to a series of palettes -void TimeBlendPalettes(u32 palettes, u8 coeff, u16 color) { - u16 paletteOffset; - for (paletteOffset = 0; palettes; paletteOffset += 16) { - if (palettes & 1) - TimeBlendPalette(paletteOffset, 16, coeff, color); +void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor) { + s32 newR, newG, newB, defR, defG, defB, altR, altG, altB; + u16 * palDataSrc; + u16 * palDataDst; + u32 defaultBlendColor = DEFAULT_LIGHT_COLOR; + + if (!palettes) + return; + + coeff *= 2; + newR = (blendColor << 27) >> 27; + newG = (blendColor << 22) >> 27; + newB = (blendColor << 17) >> 27; + defR = (defaultBlendColor << 27) >> 27; + defG = (defaultBlendColor << 22) >> 27; + defB = (defaultBlendColor << 17) >> 27; + palDataSrc = gPlttBufferUnfaded; + palDataDst = gPlttBufferFaded; + + do { + if (palettes & 1) { + u16 *palDataSrcEnd = palDataSrc + 16; + u16 altBlendIndices = *palDataDst++ = *palDataSrc++; // color 0 is copied through + u32 altBlendColor; + if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend + // Note that bit 0 of altBlendIndices specifies color 1 + altBlendColor = palDataSrc[14]; // color 15 + if (altBlendColor >> 15) { // Set alternate blend color + altR = (altBlendColor << 27) >> 27; + altG = (altBlendColor << 22) >> 27; + altB = (altBlendColor << 17) >> 27; + } else { + altBlendColor = 0; + } + } else { + altBlendIndices = 0; + } + while (palDataSrc != palDataSrcEnd) { + u32 palDataSrcColor = *palDataSrc; + s32 r = (palDataSrcColor << 27) >> 27; + s32 g = (palDataSrcColor << 22) >> 27; + s32 b = (palDataSrcColor << 17) >> 27; + + if (altBlendIndices & 1) { + if (altBlendColor) { // Use alternate blend color + *palDataDst = ((r + (((altR - r) * coeff) >> 5)) << 0) + | ((g + (((altG - g) * coeff) >> 5)) << 5) + | ((b + (((altB - b) * coeff) >> 5)) << 10); + } else { // Use default blend color + *palDataDst = ((r + (((defR - r) * coeff) >> 5)) << 0) + | ((g + (((defG - g) * coeff) >> 5)) << 5) + | ((b + (((defB - b) * coeff) >> 5)) << 10); + } + } else { // Use provided blend color + *palDataDst = ((r + (((newR - r) * coeff) >> 5)) << 0) + | ((g + (((newG - g) * coeff) >> 5)) << 5) + | ((b + (((newB - b) * coeff) >> 5)) << 10); + } + palDataSrc++; + palDataDst++; + altBlendIndices >>= 1; + } + } else { + palDataSrc += 16; + palDataDst += 16; + } palettes >>= 1; - } + } while (palettes); } void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) From def9d39fbb7a62e0d6cd7501aa07964e212f1c6f Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Mon, 19 Apr 2021 19:59:26 -0400 Subject: [PATCH 022/145] Testing evening tint. --- include/palette.h | 2 +- src/overworld.c | 17 +++++++--- src/palette.c | 82 +++++++++++++++++++++++++---------------------- 3 files changed, 57 insertions(+), 44 deletions(-) diff --git a/include/palette.h b/include/palette.h index a9e6cd7671..071af1c12c 100644 --- a/include/palette.h +++ b/include/palette.h @@ -78,7 +78,7 @@ void BlendPalettesUnfaded(u32, u8, u16); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); void AveragePalettes(u16 *palette0, u16* palette1, u16* dest, u16 weight); void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor); -void TintPalette_RGB_Copy(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor); +void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor); void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); diff --git a/src/overworld.c b/src/overworld.c index 6c7196a515..8b07124366 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1462,14 +1462,15 @@ void CB1_Overworld(void) } struct TimeOfDayBlend { - u8 coeff:4; - u16 blendColor; + u8 coeff:5; + u16 blendColor:15; + u16 isTint:1; }; static const struct TimeOfDayBlend sTimeOfDayBlendVars[] = { [TIME_OF_DAY_NIGHT] = {.coeff = 10, .blendColor = 0x1400}, - [TIME_OF_DAY_TWILIGHT] = {.coeff = 4, .blendColor = 0x155D}, + [TIME_OF_DAY_TWILIGHT] = {.coeff = 4, .blendColor = 0x56dc, .isTint = TRUE}, [TIME_OF_DAY_DAY] = {.coeff = 0, .blendColor = 0}, }; @@ -1537,13 +1538,19 @@ void UpdatePalettesWithTime(u32 palettes) { return; for (i = 0; palettes; i++) { if (palettes & 1) { - TimeBlendPalette(i*16, sTimeOfDayBlendVars[currentTimeBlend.time0].coeff, sTimeOfDayBlendVars[currentTimeBlend.time0].blendColor); + if (sTimeOfDayBlendVars[currentTimeBlend.time0].isTint) + TintPalette_RGB_Copy(i*16, sTimeOfDayBlendVars[currentTimeBlend.time0].blendColor); + else + TimeBlendPalette(i*16, sTimeOfDayBlendVars[currentTimeBlend.time0].coeff, sTimeOfDayBlendVars[currentTimeBlend.time0].blendColor); if (currentTimeBlend.weight == 256) { palettes >>= 1; continue; } CpuFastCopy(&gPlttBufferFaded[i*16], tempPaletteBuffer, 32); - TimeBlendPalette(i*16, sTimeOfDayBlendVars[currentTimeBlend.time1].coeff, sTimeOfDayBlendVars[currentTimeBlend.time1].blendColor); + if (sTimeOfDayBlendVars[currentTimeBlend.time1].isTint) + TintPalette_RGB_Copy(i*16, sTimeOfDayBlendVars[currentTimeBlend.time1].blendColor); + else + TimeBlendPalette(i*16, sTimeOfDayBlendVars[currentTimeBlend.time1].coeff, sTimeOfDayBlendVars[currentTimeBlend.time1].blendColor); AveragePalettes(tempPaletteBuffer, &gPlttBufferFaded[i*16], &gPlttBufferFaded[i*16], currentTimeBlend.weight); } palettes >>= 1; diff --git a/src/palette.c b/src/palette.c index ff5f210606..36dfdfffa3 100644 --- a/src/palette.c +++ b/src/palette.c @@ -1231,52 +1231,58 @@ void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 b } // Tints from Unfaded to Faded, using a 15-bit GBA color -void TintPalette_RGB_Copy(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { - u16 rTone, gTone, bTone; - u16 defaultBlendColor = DEFAULT_LIGHT_COLOR; - s32 r, g, b, i; - u32 gray; - struct PlttData *data2 = (struct PlttData *)&blendColor; - struct PlttData *data3; - struct PlttData *blendData; - u16 altBlendIndices = 0; - u16* palette = &gPlttBufferUnfaded[palOffset]; - for (i = 0; i < numEntries; i++) { - u16 index = i + palOffset; - struct PlttData *data1 = (struct PlttData *)palette; - if (i == 0) { - if (data1->unused_15) { // Color 0 is a bitmask for which colors to blend; color 15 is the alt blend color - gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; - altBlendIndices = gPlttBufferUnfaded[index] << 1; // bit 0 specifies color 1, etc. - data3 = (struct PlttData *)&gPlttBufferUnfaded[index+15]; - if (!data3->unused_15) // use default blend color instead - data3 = (struct PlttData *)&defaultBlendColor; - } - palette++; - continue; +void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor) { + s32 newR, newG, newB, rTone, gTone, bTone; + u16 * palDataSrc = gPlttBufferUnfaded + palOffset; + u16 * palDataDst = gPlttBufferFaded + palOffset; + u32 defaultBlendColor = DEFAULT_LIGHT_COLOR; + u16 *palDataSrcEnd = palDataSrc + 16; + u16 altBlendIndices = *palDataDst++ = *palDataSrc++; // color 0 is copied through unchanged + u32 altBlendColor; + + newR = ((blendColor << 27) >> 27) << 3; + newG = ((blendColor << 22) >> 27) << 3; + newB = ((blendColor << 17) >> 27) << 3; + + if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend + // Note that bit 0 of altBlendIndices specifies color 1 + altBlendColor = palDataSrc[14]; // color 15 + if (altBlendColor >> 15) { // Set alternate blend color + rTone = ((altBlendColor << 27) >> 27) << 3; + gTone = ((altBlendColor << 22) >> 27) << 3; + bTone = ((altBlendColor << 17) >> 27) << 3; + } else { // Set default blend color + rTone = ((defaultBlendColor << 27) >> 27) << 3; + gTone = ((defaultBlendColor << 22) >> 27) << 3; + bTone = ((defaultBlendColor << 17) >> 27) << 3; } - blendData = (altBlendIndices && altBlendIndices & (1 << i)) ? data3 : data2; - rTone = blendData->r << 3; - gTone = blendData->g << 3; - bTone = blendData->b << 3; - - r = GET_R(*palette); - g = GET_G(*palette); - b = GET_B(*palette); - gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; - r = (u16)((rTone * gray)) >> 8; - g = (u16)((gTone * gray)) >> 8; - b = (u16)((bTone * gray)) >> 8; + } else { + altBlendIndices = 0; + } + while (palDataSrc != palDataSrcEnd) { + u32 palDataSrcColor = *palDataSrc; + s32 r = (palDataSrcColor << 27) >> 27; + s32 g = (palDataSrcColor << 22) >> 27; + s32 b = (palDataSrcColor << 17) >> 27; + if (altBlendIndices & 1) { + r = (u16)((rTone * r)) >> 8; + g = (u16)((gTone * g)) >> 8; + b = (u16)((bTone * b)) >> 8; + } else { // Use provided blend color + r = (u16)((newR * r)) >> 8; + g = (u16)((newG * g)) >> 8; + b = (u16)((newB * b)) >> 8; + } if (r > 31) r = 31; if (g > 31) g = 31; if (b > 31) b = 31; - - gPlttBufferFaded[index] = RGB2(r, g, b); - palette++; + palDataSrc++; + *palDataDst++ = RGB2(r, g, b); + altBlendIndices >>= 1; } } From a80de91463743c030585fd1584a303d9b8b80de6 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Mon, 19 Apr 2021 22:07:47 -0400 Subject: [PATCH 023/145] Fixed bugged interaction between reflections & light sprites. --- src/event_object_movement.c | 1 + src/field_effect_helpers.c | 28 +++++++++++++++------------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index fc99a172aa..62c64718f0 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1943,6 +1943,7 @@ void UpdateLightSprite(struct Sprite *sprite) { DestroySprite(sprite); FieldEffectFreeTilesIfUnused(sheetTileStart); FieldEffectFreePaletteIfUnused(paletteNum); + Weather_SetBlendCoeffs(7, 12); // TODO: Restore original blend coeffs at dawn return; } diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index db58cb9a77..f3d4d71491 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -97,39 +97,41 @@ static void LoadObjectReflectionPalette(struct ObjectEvent *objectEvent, struct // Apply a blue tint effect to a palette static void ApplyPondFilter(u8 paletteNum, u16 *dest) { - u8 i, val, r, g, b; - // CpuCopy16(gPlttBufferUnfaded + 0x100 + paletteNum * 16, dest, 32); + u8 i; + s32 r, g, b; u16 *src = gPlttBufferUnfaded + 0x100 + paletteNum * 16; for (i = 0; i < 16; i++) { - r = src[i] & 0x1F; - g = (src[i] >> 5) & 0x1F; - b = (src[i] >> 10) & 0x1F; + u32 color = *src++; + r = (color << 27) >> 27; + g = (color << 22) >> 27; + b = (color << 17) >> 27; b += 10; if (b > 31) b = 31; - *dest++ = (b << 10) | (g << 5) | r; + *dest++ = r | (g << 5) | (b << 10); } } // Apply a ice tint effect to a palette static void ApplyIceFilter(u8 paletteNum, u16 *dest) { - u8 i, val, r, g, b; - // CpuCopy16(gPlttBufferUnfaded + 0x100 + paletteNum * 16, dest, 32); + u8 i; + s32 r, g, b; u16 *src = gPlttBufferUnfaded + 0x100 + paletteNum * 16; for (i = 0; i < 16; i++) { - r = src[i] & 0x1F; + u32 color = *src++; + r = (color << 27) >> 27; + g = (color << 22) >> 27; + b = (color << 17) >> 27; r -= 5; - if (r > 31) + if (r < 0) r = 0; - g = (src[i] >> 5) & 0x1F; g += 3; if (g > 31) g = 31; - b = (src[i] >> 10) & 0x1F; b += 16; if (b > 31) b = 31; - *dest++ = (b << 10) | (g << 5) | r; + *dest++ = r | (g << 5) | (b << 10); } } From 0d8467c2a922d3df0256a9019b4f7ff531e46716 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Mon, 19 Apr 2021 23:17:13 -0400 Subject: [PATCH 024/145] Slight palette update optimization. --- src/overworld.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/overworld.c b/src/overworld.c index 8b07124366..aa66280fc2 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1526,32 +1526,31 @@ static bool8 FadePalettesWithTime(void) { // Only used to fade back in void UpdatePalettesWithTime(u32 palettes) { if (MapHasNaturalLight(gMapHeader.mapType)) { - u8 i, j; + u16 i; u16 tempPaletteBuffer[16]; for (i = 0; i < 16; i++) { - if (GetSpritePaletteTagByPaletteNum(i) & 0x8000) // Don't blend special sprite palette tags + if (GetSpritePaletteTagByPaletteNum(i) >> 15) // Don't blend special sprite palette tags palettes &= ~(1 << (i + 16)); } palettes &= ~0xE000; // Don't blend tile palettes [13,15] - gTimeOfDay = min(TIME_OF_DAY_MAX, gTimeOfDay); if (!palettes) return; - for (i = 0; palettes; i++) { + for (i = 0; palettes; i+=16) { if (palettes & 1) { if (sTimeOfDayBlendVars[currentTimeBlend.time0].isTint) - TintPalette_RGB_Copy(i*16, sTimeOfDayBlendVars[currentTimeBlend.time0].blendColor); + TintPalette_RGB_Copy(i, sTimeOfDayBlendVars[currentTimeBlend.time0].blendColor); else - TimeBlendPalette(i*16, sTimeOfDayBlendVars[currentTimeBlend.time0].coeff, sTimeOfDayBlendVars[currentTimeBlend.time0].blendColor); + TimeBlendPalette(i, sTimeOfDayBlendVars[currentTimeBlend.time0].coeff, sTimeOfDayBlendVars[currentTimeBlend.time0].blendColor); if (currentTimeBlend.weight == 256) { palettes >>= 1; continue; } - CpuFastCopy(&gPlttBufferFaded[i*16], tempPaletteBuffer, 32); + CpuFastCopy(&gPlttBufferFaded[i], tempPaletteBuffer, 32); if (sTimeOfDayBlendVars[currentTimeBlend.time1].isTint) - TintPalette_RGB_Copy(i*16, sTimeOfDayBlendVars[currentTimeBlend.time1].blendColor); + TintPalette_RGB_Copy(i, sTimeOfDayBlendVars[currentTimeBlend.time1].blendColor); else - TimeBlendPalette(i*16, sTimeOfDayBlendVars[currentTimeBlend.time1].coeff, sTimeOfDayBlendVars[currentTimeBlend.time1].blendColor); - AveragePalettes(tempPaletteBuffer, &gPlttBufferFaded[i*16], &gPlttBufferFaded[i*16], currentTimeBlend.weight); + TimeBlendPalette(i, sTimeOfDayBlendVars[currentTimeBlend.time1].coeff, sTimeOfDayBlendVars[currentTimeBlend.time1].blendColor); + AveragePalettes(tempPaletteBuffer, &gPlttBufferFaded[i], &gPlttBufferFaded[i], currentTimeBlend.weight); } palettes >>= 1; } From 93ab4451fc155bc1e841d3daafc4c85099dfb292 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Mon, 19 Apr 2021 23:50:50 -0400 Subject: [PATCH 025/145] Testing combined averaging function. --- include/palette.h | 1 + src/overworld.c | 25 ++++----------- src/palette.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 19 deletions(-) diff --git a/include/palette.h b/include/palette.h index 071af1c12c..346091c64a 100644 --- a/include/palette.h +++ b/include/palette.h @@ -80,6 +80,7 @@ void AveragePalettes(u16 *palette0, u16* palette1, u16* dest, u16 weight); void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor); void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor); void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor); +void TimeMixPalettes(u32 palettes, u32 coeff0, u32 color0, u32 coeff1, u32 color1, u16 weight); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); void TintPalette_SepiaTone(u16 *palette, u16 count); diff --git a/src/overworld.c b/src/overworld.c index aa66280fc2..8ccdf412bb 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1535,25 +1535,12 @@ void UpdatePalettesWithTime(u32 palettes) { palettes &= ~0xE000; // Don't blend tile palettes [13,15] if (!palettes) return; - for (i = 0; palettes; i+=16) { - if (palettes & 1) { - if (sTimeOfDayBlendVars[currentTimeBlend.time0].isTint) - TintPalette_RGB_Copy(i, sTimeOfDayBlendVars[currentTimeBlend.time0].blendColor); - else - TimeBlendPalette(i, sTimeOfDayBlendVars[currentTimeBlend.time0].coeff, sTimeOfDayBlendVars[currentTimeBlend.time0].blendColor); - if (currentTimeBlend.weight == 256) { - palettes >>= 1; - continue; - } - CpuFastCopy(&gPlttBufferFaded[i], tempPaletteBuffer, 32); - if (sTimeOfDayBlendVars[currentTimeBlend.time1].isTint) - TintPalette_RGB_Copy(i, sTimeOfDayBlendVars[currentTimeBlend.time1].blendColor); - else - TimeBlendPalette(i, sTimeOfDayBlendVars[currentTimeBlend.time1].coeff, sTimeOfDayBlendVars[currentTimeBlend.time1].blendColor); - AveragePalettes(tempPaletteBuffer, &gPlttBufferFaded[i], &gPlttBufferFaded[i], currentTimeBlend.weight); - } - palettes >>= 1; - } + TimeMixPalettes(palettes, + sTimeOfDayBlendVars[currentTimeBlend.time0].coeff, + sTimeOfDayBlendVars[currentTimeBlend.time0].blendColor, + sTimeOfDayBlendVars[currentTimeBlend.time1].coeff, + sTimeOfDayBlendVars[currentTimeBlend.time1].blendColor, + currentTimeBlend.weight); } } diff --git a/src/palette.c b/src/palette.c index 36dfdfffa3..c2029adf01 100644 --- a/src/palette.c +++ b/src/palette.c @@ -1131,6 +1131,83 @@ void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor) { } while (palettes); } +// Blends a weighted average of two blend parameters +void TimeMixPalettes(u32 palettes, u32 coeff0, u32 color0, u32 coeff1, u32 color1, u16 weight) { + s32 r0, g0, b0, r1, g1, b1, defR, defG, defB, altR, altG, altB; + u16 * palDataSrc; + u16 * palDataDst; + u32 defaultColor = DEFAULT_LIGHT_COLOR; + + if (!palettes) + return; + + // TODO: Check coeff for tint + coeff0 *= 2; + coeff1 *= 2; + r0 = (color0 << 27) >> 27; + g0 = (color0 << 22) >> 27; + b0 = (color0 << 17) >> 27; + r1 = (color1 << 27) >> 27; + g1 = (color1 << 22) >> 27; + b1 = (color1 << 17) >> 27; + defR = (defaultColor << 27) >> 27; + defG = (defaultColor << 22) >> 27; + defB = (defaultColor << 17) >> 27; + palDataSrc = gPlttBufferUnfaded; + palDataDst = gPlttBufferFaded; + + do { + if (palettes & 1) { + u16 *palDataSrcEnd = palDataSrc + 16; + u16 altBlendIndices = *palDataDst++ = *palDataSrc++; // color 0 is copied through + u32 altBlendColor; + if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend + // Note that bit 0 of altBlendIndices specifies color 1 + altBlendColor = palDataSrc[14]; // color 15 + if (altBlendColor >> 15) { // Set alternate blend color + altR = (altBlendColor << 27) >> 27; + altG = (altBlendColor << 22) >> 27; + altB = (altBlendColor << 17) >> 27; + } else { + altBlendColor = 0; + } + } else { + altBlendIndices = 0; + } + while (palDataSrc != palDataSrcEnd) { + u32 palDataSrcColor = *palDataSrc; + s32 r = (palDataSrcColor << 27) >> 27; + s32 g = (palDataSrcColor << 22) >> 27; + s32 b = (palDataSrcColor << 17) >> 27; + + if (altBlendIndices & 1) { // No need to average; colors will be the same + if (altBlendColor) { // Use alternate blend color + *palDataDst = ((r + (((altR - r) * coeff0) >> 5)) << 0) + | ((g + (((altG - g) * coeff0) >> 5)) << 5) + | ((b + (((altB - b) * coeff0) >> 5)) << 10); + } else { // Use default blend color + *palDataDst = ((r + (((defR - r) * coeff0) >> 5)) << 0) + | ((g + (((defG - g) * coeff0) >> 5)) << 5) + | ((b + (((defB - b) * coeff0) >> 5)) << 10); + } + } else { // Use provided blend colors + r = (weight*(r + (((r0 - r) * coeff0) >> 5)) + (256-weight)*(r + (((r1 - r) * coeff1) >> 5))) >> 8; + g = (weight*(g + (((g0 - g) * coeff0) >> 5)) + (256-weight)*(g + (((g1 - g) * coeff1) >> 5))) >> 8; + b = (weight*(b + (((b0 - b) * coeff0) >> 5)) + (256-weight)*(b + (((b1 - b) * coeff1) >> 5))) >> 8; + *palDataDst = RGB2(r, g, b); + } + palDataSrc++; + palDataDst++; + altBlendIndices >>= 1; + } + } else { + palDataSrc += 16; + palDataDst += 16; + } + palettes >>= 1; + } while (palettes); +} + void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) { void *src = gPlttBufferUnfaded; From ae4f59688556375142c3b4d1931fff6e699f9544 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Tue, 20 Apr 2021 00:19:07 -0400 Subject: [PATCH 026/145] Averaging function can now tint. --- include/palette.h | 2 +- src/overworld.c | 4 ++- src/palette.c | 63 ++++++++++++++++++++++++++++++++++++----------- 3 files changed, 53 insertions(+), 16 deletions(-) diff --git a/include/palette.h b/include/palette.h index 346091c64a..d0a8e67a8c 100644 --- a/include/palette.h +++ b/include/palette.h @@ -80,7 +80,7 @@ void AveragePalettes(u16 *palette0, u16* palette1, u16* dest, u16 weight); void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor); void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor); void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor); -void TimeMixPalettes(u32 palettes, u32 coeff0, u32 color0, u32 coeff1, u32 color1, u16 weight); +void TimeMixPalettes(u32 palettes, u32 coeff0, u32 color0, u32 coeff1, u32 color1, u16 weight, bool8 tint0, bool8 tint1); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); void TintPalette_SepiaTone(u16 *palette, u16 count); diff --git a/src/overworld.c b/src/overworld.c index 8ccdf412bb..5bf44433f7 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1540,7 +1540,9 @@ void UpdatePalettesWithTime(u32 palettes) { sTimeOfDayBlendVars[currentTimeBlend.time0].blendColor, sTimeOfDayBlendVars[currentTimeBlend.time1].coeff, sTimeOfDayBlendVars[currentTimeBlend.time1].blendColor, - currentTimeBlend.weight); + currentTimeBlend.weight, + sTimeOfDayBlendVars[currentTimeBlend.time0].isTint, + sTimeOfDayBlendVars[currentTimeBlend.time1].isTint); } } diff --git a/src/palette.c b/src/palette.c index c2029adf01..c4e12cd8be 100644 --- a/src/palette.c +++ b/src/palette.c @@ -1132,7 +1132,7 @@ void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor) { } // Blends a weighted average of two blend parameters -void TimeMixPalettes(u32 palettes, u32 coeff0, u32 color0, u32 coeff1, u32 color1, u16 weight) { +void TimeMixPalettes(u32 palettes, u32 coeff0, u32 color0, u32 coeff1, u32 color1, u16 weight, bool8 tint0, bool8 tint1) { s32 r0, g0, b0, r1, g1, b1, defR, defG, defB, altR, altG, altB; u16 * palDataSrc; u16 * palDataDst; @@ -1141,9 +1141,8 @@ void TimeMixPalettes(u32 palettes, u32 coeff0, u32 color0, u32 coeff1, u32 color if (!palettes) return; - // TODO: Check coeff for tint - coeff0 *= 2; - coeff1 *= 2; + coeff0 = tint0 ? 8*2 : coeff0 * 2; + coeff1 = tint1 ? 8*2 : coeff1 * 2; r0 = (color0 << 27) >> 27; g0 = (color0 << 22) >> 27; b0 = (color0 << 17) >> 27; @@ -1180,20 +1179,56 @@ void TimeMixPalettes(u32 palettes, u32 coeff0, u32 color0, u32 coeff1, u32 color s32 g = (palDataSrcColor << 22) >> 27; s32 b = (palDataSrcColor << 17) >> 27; - if (altBlendIndices & 1) { // No need to average; colors will be the same + if (altBlendIndices & 1) { if (altBlendColor) { // Use alternate blend color - *palDataDst = ((r + (((altR - r) * coeff0) >> 5)) << 0) - | ((g + (((altG - g) * coeff0) >> 5)) << 5) - | ((b + (((altB - b) * coeff0) >> 5)) << 10); + r = (weight*(r + (((altR - r) * coeff0) >> 5)) + (256-weight)*(r + (((altR - r) * coeff1) >> 5))) >> 8; + g = (weight*(g + (((altG - g) * coeff0) >> 5)) + (256-weight)*(g + (((altG - g) * coeff1) >> 5))) >> 8; + b = (weight*(b + (((altB - b) * coeff0) >> 5)) + (256-weight)*(b + (((altB - b) * coeff1) >> 5))) >> 8; + *palDataDst = RGB2(r, g, b); } else { // Use default blend color - *palDataDst = ((r + (((defR - r) * coeff0) >> 5)) << 0) - | ((g + (((defG - g) * coeff0) >> 5)) << 5) - | ((b + (((defB - b) * coeff0) >> 5)) << 10); + r = (weight*(r + (((defR - r) * coeff0) >> 5)) + (256-weight)*(r + (((defR - r) * coeff1) >> 5))) >> 8; + g = (weight*(g + (((defG - g) * coeff0) >> 5)) + (256-weight)*(g + (((defG - g) * coeff1) >> 5))) >> 8; + b = (weight*(b + (((defB - b) * coeff0) >> 5)) + (256-weight)*(b + (((defB - b) * coeff1) >> 5))) >> 8; + *palDataDst = RGB2(r, g, b); } } else { // Use provided blend colors - r = (weight*(r + (((r0 - r) * coeff0) >> 5)) + (256-weight)*(r + (((r1 - r) * coeff1) >> 5))) >> 8; - g = (weight*(g + (((g0 - g) * coeff0) >> 5)) + (256-weight)*(g + (((g1 - g) * coeff1) >> 5))) >> 8; - b = (weight*(b + (((b0 - b) * coeff0) >> 5)) + (256-weight)*(b + (((b1 - b) * coeff1) >> 5))) >> 8; + s32 r2, g2, b2, r3, g3, b3; + if (!tint0) { // blend-based + r2 = (r + (((r0 - r) * coeff0) >> 5)); + g2 = (g + (((g0 - g) * coeff0) >> 5)); + b2 = (b + (((b0 - b) * coeff0) >> 5)); + } else { // tint-based + r2 = (u16)(((r0 << 3) * r)) >> 8; + g2 = (u16)(((g0 << 3) * g)) >> 8; + b2 = (u16)(((b0 << 3) * b)) >> 8; + if (r2 > 31) + r2 = 31; + if (g2 > 31) + g2 = 31; + if (b2 > 31) + b2 = 31; + } + if (!tint1) { // blend-based + r3 = (r + (((r1 - r) * coeff1) >> 5)); + g3 = (g + (((g1 - g) * coeff1) >> 5)); + b3 = (b + (((b1 - b) * coeff1) >> 5)); + } else { // tint-based + r3 = (u16)(((r1 << 3) * r)) >> 8; + g3 = (u16)(((g1 << 3) * g)) >> 8; + b3 = (u16)(((b1 << 3) * b)) >> 8; + if (r3 > 31) + r3 = 31; + if (g3 > 31) + g3 = 31; + if (b3 > 31) + b3 = 31; + } + r = (weight*r2 + (256-weight)*r3) >> 8; + g = (weight*g2 + (256-weight)*g3) >> 8; + b = (weight*b2 + (256-weight)*b3) >> 8; + // r = (weight*(r + (((r0 - r) * coeff0) >> 5)) + (256-weight)*(r + (((r1 - r) * coeff1) >> 5))) >> 8; + // g = (weight*(g + (((g0 - g) * coeff0) >> 5)) + (256-weight)*(g + (((g1 - g) * coeff1) >> 5))) >> 8; + // b = (weight*(b + (((b0 - b) * coeff0) >> 5)) + (256-weight)*(b + (((b1 - b) * coeff1) >> 5))) >> 8; *palDataDst = RGB2(r, g, b); } palDataSrc++; From 73d060b3b61a49b47990813cac5afbbef1e30c2b Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Tue, 20 Apr 2021 01:49:02 -0400 Subject: [PATCH 027/145] Added glowing colors for some follower pokemon (Ampharos). --- .../object_events/pics/pokemon/ampharos.png | Bin 703 -> 5069 bytes graphics/pokemon/ampharos/normal.pal | 6 +++--- graphics/pokemon/ampharos/shiny.pal | 6 +++--- src/event_object_movement.c | 12 ++++++++++++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/graphics/object_events/pics/pokemon/ampharos.png b/graphics/object_events/pics/pokemon/ampharos.png index 076d853d035d00096907463e52259562df05647b..2386f6d45263ab682cff969859bd8c75e2a23ea0 100644 GIT binary patch delta 5039 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 FV1g;Or11a% delta 640 zcmV-`0)PF@C%*-dBa;CU7z6(R|C1aM7=Ql&|KrMtUH||BN=ZaPRCt{2m9dH&F%X7T zTqA*>W(;8$0tZ$R?dx1+Lb@wl8Z0pDO0X)tI+q85BYuITIk>`vaPJan*DKA)k*^3T z0ymBMMyr2DqZyg8cYC-0!h|!dZHJ#fa5-pU+qM55)K{e~K#Ggmld zTx1S+P@$6N99&_;y39jPti%HRoqt!X$iYHaTw^Zfy2wMp&~na$Z-Fat=2yg;P7>uF zfRsFPQs7Fj@%RUxeNHSCot%tY?S_meg)<|C8?A2H>BumPA4!92h0gq%aTxAlD5Ap1 zNI@&D*x`v0o*KdDWmOt0Hv9TaI7rFi&ZEMaV=M86l=HPPl&9riU-%qg5r0z_-+IEq zWrw0ig)_%t6R=%^NdX3SQ;rYcIqeI_^F9$E!`Ivp<}R&=05%IS#TO=<3wJRm8wh>N zqr%92ETitW%UY%38#$)qG)O#Iou%wOm6T1N1V>JdVAXc1n{;g>#{+fF0-iikQ}$=l zQp#2}g!`mmOpEGqm~rfeLW1Jnk$)t=ZWZOe#q7^a9nL!#HCKc&rYV!ReM6b&j=!~wh!>83 aWxoOMtag) == 0xFF) { // Load compressed palette LoadCompressedSpritePalette(spritePalette); sprite->oam.paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present + if (species == SPECIES_AMPHAROS) { // palette should be light-blended TODO: Add more glowing pokemon + // CHARIZARD_LINE ? + // CHINCHOU & LANTERN + // FLAAFY, MAREEP + // UMBREON + // VOLBEAT ? + // REGIS ? + u16 * palette = &gPlttBufferUnfaded[(sprite->oam.paletteNum+16)*16]; + palette[0] |= 0x8000; + if (palette[0] & 0x4000) // If color 15 is blended, use it as the alternate color + palette[15] |= 0x8000; + } UpdateSpritePaletteWithTime(sprite->oam.paletteNum); } else sprite->oam.paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present From da345c1eeb94dfd9d329efe5ce8270d3c13ddc52 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Tue, 20 Apr 2021 03:34:14 -0400 Subject: [PATCH 028/145] Optimized time-of-day & native palette blending. --- include/palette.h | 9 +- src/overworld.c | 22 ++--- src/palette.c | 229 +++++++++++++++++++++++----------------------- 3 files changed, 129 insertions(+), 131 deletions(-) diff --git a/include/palette.h b/include/palette.h index d0a8e67a8c..4fbde048aa 100644 --- a/include/palette.h +++ b/include/palette.h @@ -46,6 +46,12 @@ struct PaletteFadeControl u8 deltaY:4; // rate of change of blend coefficient }; +struct BlendSettings { + u16 blendColor:15; + u16 isTint:1; + u8 coeff:5; +}; + extern struct PaletteFadeControl gPaletteFade; extern u32 gPlttBufferTransferPending; extern u8 gPaletteDecompressionBuffer[]; @@ -76,11 +82,10 @@ void BeginHardwarePaletteFade(u8, u8, u8, u8, u8); void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color); void BlendPalettesUnfaded(u32, u8, u16); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); -void AveragePalettes(u16 *palette0, u16* palette1, u16* dest, u16 weight); void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor); void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor); void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor); -void TimeMixPalettes(u32 palettes, u32 coeff0, u32 color0, u32 coeff1, u32 color1, u16 weight, bool8 tint0, bool8 tint1); +void TimeMixPalettes(u32, u16 *, u16 *, struct BlendSettings *, struct BlendSettings *, u16); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); void TintPalette_SepiaTone(u16 *palette, u16 count); diff --git a/src/overworld.c b/src/overworld.c index 5bf44433f7..0028d976f4 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -186,7 +186,6 @@ static u16 (*sPlayerKeyInterceptCallback)(u32); static bool8 sReceivingFromLink; static u8 sRfuKeepAliveTimer; -static u8 gTimeOfDayState; static u8 timeCounter; static struct TimeBlendSettings currentTimeBlend; @@ -1461,13 +1460,9 @@ void CB1_Overworld(void) DoCB1_Overworld(gMain.newKeys, gMain.heldKeys); } -struct TimeOfDayBlend { - u8 coeff:5; - u16 blendColor:15; - u16 isTint:1; -}; -static const struct TimeOfDayBlend sTimeOfDayBlendVars[] = + +static const struct BlendSettings sTimeOfDayBlendVars[] = { [TIME_OF_DAY_NIGHT] = {.coeff = 10, .blendColor = 0x1400}, [TIME_OF_DAY_TWILIGHT] = {.coeff = 4, .blendColor = 0x56dc, .isTint = TRUE}, @@ -1516,7 +1511,6 @@ static bool8 MapHasNaturalLight(u8 mapType) { // Weather a map type is naturally } static bool8 FadePalettesWithTime(void) { // Only used to fade back in - gTimeOfDayState = 0; gTimeOfDay = UpdateTimeOfDay(); if (MapHasNaturalLight(gMapHeader.mapType)) { ResetPaletteFade(); @@ -1536,13 +1530,11 @@ void UpdatePalettesWithTime(u32 palettes) { if (!palettes) return; TimeMixPalettes(palettes, - sTimeOfDayBlendVars[currentTimeBlend.time0].coeff, - sTimeOfDayBlendVars[currentTimeBlend.time0].blendColor, - sTimeOfDayBlendVars[currentTimeBlend.time1].coeff, - sTimeOfDayBlendVars[currentTimeBlend.time1].blendColor, - currentTimeBlend.weight, - sTimeOfDayBlendVars[currentTimeBlend.time0].isTint, - sTimeOfDayBlendVars[currentTimeBlend.time1].isTint); + gPlttBufferUnfaded, + gPlttBufferFaded, + (struct BlendSettings *)&sTimeOfDayBlendVars[currentTimeBlend.time0], + (struct BlendSettings *)&sTimeOfDayBlendVars[currentTimeBlend.time1], + currentTimeBlend.weight); } } diff --git a/src/palette.c b/src/palette.c index c4e12cd8be..e1c9628aa2 100644 --- a/src/palette.c +++ b/src/palette.c @@ -966,45 +966,43 @@ static bool8 IsSoftwarePaletteFadeFinishing(void) } } -void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) -{ - u16 paletteOffset; +// optimized based on lucktyphlosion's BlendPalettesFine +static void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color) { + s32 newR, newG, newB; - for (paletteOffset = 0; selectedPalettes; paletteOffset += 16) - { - if (selectedPalettes & 1) - BlendPalette(paletteOffset, 16, coeff, color); - selectedPalettes >>= 1; + if (!palettes) + return; + + coeff *= 2; + newR = (color << 27) >> 27; + newG = (color << 22) >> 27; + newB = (color << 17) >> 27; + + do { + if (palettes & 1) { + u16 *srcEnd = src + 16; + *dst++ = *src++; // transparency is copied-through + while (src != srcEnd) { + u32 srcColor = *src; + s32 r = (srcColor << 27) >> 27; + s32 g = (srcColor << 22) >> 27; + s32 b = (srcColor << 17) >> 27; + + *dst++ = ((r + (((newR - r) * coeff) >> 5)) << 0) + | ((g + (((newG - g) * coeff) >> 5)) << 5) + | ((b + (((newB - b) * coeff) >> 5)) << 10); + src++; + } + } else { + src += 16; + dst + 16; } + palettes >>= 1; + } while (palettes); } -// Computes a weighted average of two palettes, as (p0*weight + (256-weight)*p1)/256 -void AveragePalettes(u16 *palette0, u16* palette1, u16* dest, u16 weight) { - u8 i; - u32 tempColor; - u16 r0, g0, b0, r1, g1, b1, r, g, b; - u16 color0, color1, destColor; - *dest++ = *palette0++; // Copy palette0's transparency color as is - palette1++; - for (i = 1; i < 16; i++) { // Skip transparent color - color0 = *palette0++; - color1 = *palette1++; - r0 = color0 & 0x1F; - g0 = (color0 >> 5) & 0x1F; - b0 = (color0 >> 10) & 0x1F; - r1 = color1 & 0x1F; - g1 = (color1 >> 5) & 0x1F; - b1 = (color1 >> 10) & 0x1F; - r = (weight*r0 + (256-weight)*r1) >> 8; - g = (weight*g0 + (256-weight)*g1) >> 8; - b = (weight*b0 + (256-weight)*b1) >> 8; - r = r > 31 ? 31 : r; - g = g > 31 ? 31 : g; - b = b > 31 ? 31 : b; - destColor = (color0 | color1) & 0x8000; - destColor += r + (g << 5) + (b << 10); - *dest++ = destColor; - } +void BlendPalettes(u32 palettes, u8 coeff, u16 color) { + BlendPalettesFine(palettes, gPlttBufferUnfaded, gPlttBufferFaded, coeff, color); } #define DEFAULT_LIGHT_COLOR 0x3f9f @@ -1013,11 +1011,11 @@ void AveragePalettes(u16 *palette0, u16* palette1, u16* dest, u16 weight) { // Optimization help by lucktyphlosion void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor) { s32 newR, newG, newB, defR, defG, defB; - u16 * palDataSrc = gPlttBufferUnfaded + palOffset; - u16 * palDataDst = gPlttBufferFaded + palOffset; + u16 * src = gPlttBufferUnfaded + palOffset; + u16 * dst = gPlttBufferFaded + palOffset; u32 defaultBlendColor = DEFAULT_LIGHT_COLOR; - u16 *palDataSrcEnd = palDataSrc + 16; - u16 altBlendIndices = *palDataDst++ = *palDataSrc++; // color 0 is copied through unchanged + u16 *srcEnd = src + 16; + u16 altBlendIndices = *dst++ = *src++; // color 0 is copied through unchanged u32 altBlendColor; coeff *= 2; @@ -1027,7 +1025,7 @@ void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor) { if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend // Note that bit 0 of altBlendIndices specifies color 1 - altBlendColor = palDataSrc[14]; // color 15 + altBlendColor = src[14]; // color 15 if (altBlendColor >> 15) { // Set alternate blend color defR = (altBlendColor << 27) >> 27; defG = (altBlendColor << 22) >> 27; @@ -1040,31 +1038,31 @@ void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor) { } else { altBlendIndices = 0; } - while (palDataSrc != palDataSrcEnd) { - u32 palDataSrcColor = *palDataSrc; - s32 r = (palDataSrcColor << 27) >> 27; - s32 g = (palDataSrcColor << 22) >> 27; - s32 b = (palDataSrcColor << 17) >> 27; + while (src != srcEnd) { + u32 srcColor = *src; + s32 r = (srcColor << 27) >> 27; + s32 g = (srcColor << 22) >> 27; + s32 b = (srcColor << 17) >> 27; if (altBlendIndices & 1) { - *palDataDst = ((r + (((defR - r) * coeff) >> 5)) << 0) + *dst = ((r + (((defR - r) * coeff) >> 5)) << 0) | ((g + (((defG - g) * coeff) >> 5)) << 5) | ((b + (((defB - b) * coeff) >> 5)) << 10); } else { // Use provided blend color - *palDataDst = ((r + (((newR - r) * coeff) >> 5)) << 0) + *dst = ((r + (((newR - r) * coeff) >> 5)) << 0) | ((g + (((newG - g) * coeff) >> 5)) << 5) | ((b + (((newB - b) * coeff) >> 5)) << 10); } - palDataSrc++; - palDataDst++; + src++; + dst++; altBlendIndices >>= 1; } } void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor) { s32 newR, newG, newB, defR, defG, defB, altR, altG, altB; - u16 * palDataSrc; - u16 * palDataDst; + u16 * src; + u16 * dst; u32 defaultBlendColor = DEFAULT_LIGHT_COLOR; if (!palettes) @@ -1077,17 +1075,17 @@ void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor) { defR = (defaultBlendColor << 27) >> 27; defG = (defaultBlendColor << 22) >> 27; defB = (defaultBlendColor << 17) >> 27; - palDataSrc = gPlttBufferUnfaded; - palDataDst = gPlttBufferFaded; + src = gPlttBufferUnfaded; + dst = gPlttBufferFaded; do { if (palettes & 1) { - u16 *palDataSrcEnd = palDataSrc + 16; - u16 altBlendIndices = *palDataDst++ = *palDataSrc++; // color 0 is copied through + u16 *srcEnd = src + 16; + u16 altBlendIndices = *dst++ = *src++; // color 0 is copied through u32 altBlendColor; if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend // Note that bit 0 of altBlendIndices specifies color 1 - altBlendColor = palDataSrc[14]; // color 15 + altBlendColor = src[14]; // color 15 if (altBlendColor >> 15) { // Set alternate blend color altR = (altBlendColor << 27) >> 27; altG = (altBlendColor << 22) >> 27; @@ -1098,51 +1096,58 @@ void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor) { } else { altBlendIndices = 0; } - while (palDataSrc != palDataSrcEnd) { - u32 palDataSrcColor = *palDataSrc; - s32 r = (palDataSrcColor << 27) >> 27; - s32 g = (palDataSrcColor << 22) >> 27; - s32 b = (palDataSrcColor << 17) >> 27; + while (src != srcEnd) { + u32 srcColor = *src; + s32 r = (srcColor << 27) >> 27; + s32 g = (srcColor << 22) >> 27; + s32 b = (srcColor << 17) >> 27; if (altBlendIndices & 1) { if (altBlendColor) { // Use alternate blend color - *palDataDst = ((r + (((altR - r) * coeff) >> 5)) << 0) + *dst = ((r + (((altR - r) * coeff) >> 5)) << 0) | ((g + (((altG - g) * coeff) >> 5)) << 5) | ((b + (((altB - b) * coeff) >> 5)) << 10); } else { // Use default blend color - *palDataDst = ((r + (((defR - r) * coeff) >> 5)) << 0) + *dst = ((r + (((defR - r) * coeff) >> 5)) << 0) | ((g + (((defG - g) * coeff) >> 5)) << 5) | ((b + (((defB - b) * coeff) >> 5)) << 10); } } else { // Use provided blend color - *palDataDst = ((r + (((newR - r) * coeff) >> 5)) << 0) + *dst = ((r + (((newR - r) * coeff) >> 5)) << 0) | ((g + (((newG - g) * coeff) >> 5)) << 5) | ((b + (((newB - b) * coeff) >> 5)) << 10); } - palDataSrc++; - palDataDst++; + src++; + dst++; altBlendIndices >>= 1; } } else { - palDataSrc += 16; - palDataDst += 16; + src += 16; + dst += 16; } palettes >>= 1; } while (palettes); } // Blends a weighted average of two blend parameters -void TimeMixPalettes(u32 palettes, u32 coeff0, u32 color0, u32 coeff1, u32 color1, u16 weight, bool8 tint0, bool8 tint1) { +// TODO: Should pointers be marked as const? +void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *blend0, struct BlendSettings *blend1, u16 weight0) { s32 r0, g0, b0, r1, g1, b1, defR, defG, defB, altR, altG, altB; - u16 * palDataSrc; - u16 * palDataDst; + u32 color0, coeff0, color1, coeff1; + bool8 tint0, tint1; + u16 weight1; u32 defaultColor = DEFAULT_LIGHT_COLOR; if (!palettes) return; - coeff0 = tint0 ? 8*2 : coeff0 * 2; - coeff1 = tint1 ? 8*2 : coeff1 * 2; + color0 = blend0->blendColor; + tint0 = blend0->isTint; + coeff0 = tint0 ? 8*2 : blend0->coeff*2; + color1 = blend1->blendColor; + tint1 = blend1->isTint; + coeff1 = tint1 ? 8*2 : blend1->coeff*2; + r0 = (color0 << 27) >> 27; g0 = (color0 << 22) >> 27; b0 = (color0 << 17) >> 27; @@ -1152,17 +1157,16 @@ void TimeMixPalettes(u32 palettes, u32 coeff0, u32 color0, u32 coeff1, u32 color defR = (defaultColor << 27) >> 27; defG = (defaultColor << 22) >> 27; defB = (defaultColor << 17) >> 27; - palDataSrc = gPlttBufferUnfaded; - palDataDst = gPlttBufferFaded; + weight1 = 256 - weight0; do { if (palettes & 1) { - u16 *palDataSrcEnd = palDataSrc + 16; - u16 altBlendIndices = *palDataDst++ = *palDataSrc++; // color 0 is copied through + u16 *srcEnd = src + 16; + u16 altBlendIndices = *dst++ = *src++; // color 0 is copied through u32 altBlendColor; if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend // Note that bit 0 of altBlendIndices specifies color 1 - altBlendColor = palDataSrc[14]; // color 15 + altBlendColor = src[14]; // color 15 if (altBlendColor >> 15) { // Set alternate blend color altR = (altBlendColor << 27) >> 27; altG = (altBlendColor << 22) >> 27; @@ -1173,23 +1177,23 @@ void TimeMixPalettes(u32 palettes, u32 coeff0, u32 color0, u32 coeff1, u32 color } else { altBlendIndices = 0; } - while (palDataSrc != palDataSrcEnd) { - u32 palDataSrcColor = *palDataSrc; - s32 r = (palDataSrcColor << 27) >> 27; - s32 g = (palDataSrcColor << 22) >> 27; - s32 b = (palDataSrcColor << 17) >> 27; + while (src != srcEnd) { + u32 srcColor = *src; + s32 r = (srcColor << 27) >> 27; + s32 g = (srcColor << 22) >> 27; + s32 b = (srcColor << 17) >> 27; if (altBlendIndices & 1) { if (altBlendColor) { // Use alternate blend color - r = (weight*(r + (((altR - r) * coeff0) >> 5)) + (256-weight)*(r + (((altR - r) * coeff1) >> 5))) >> 8; - g = (weight*(g + (((altG - g) * coeff0) >> 5)) + (256-weight)*(g + (((altG - g) * coeff1) >> 5))) >> 8; - b = (weight*(b + (((altB - b) * coeff0) >> 5)) + (256-weight)*(b + (((altB - b) * coeff1) >> 5))) >> 8; - *palDataDst = RGB2(r, g, b); + r = (weight0*(r + (((altR - r) * coeff0) >> 5)) + weight1*(r + (((altR - r) * coeff1) >> 5))) >> 8; + g = (weight0*(g + (((altG - g) * coeff0) >> 5)) + weight1*(g + (((altG - g) * coeff1) >> 5))) >> 8; + b = (weight0*(b + (((altB - b) * coeff0) >> 5)) + weight1*(b + (((altB - b) * coeff1) >> 5))) >> 8; + *dst = RGB2(r, g, b); } else { // Use default blend color - r = (weight*(r + (((defR - r) * coeff0) >> 5)) + (256-weight)*(r + (((defR - r) * coeff1) >> 5))) >> 8; - g = (weight*(g + (((defG - g) * coeff0) >> 5)) + (256-weight)*(g + (((defG - g) * coeff1) >> 5))) >> 8; - b = (weight*(b + (((defB - b) * coeff0) >> 5)) + (256-weight)*(b + (((defB - b) * coeff1) >> 5))) >> 8; - *palDataDst = RGB2(r, g, b); + r = (weight0*(r + (((defR - r) * coeff0) >> 5)) + weight1*(r + (((defR - r) * coeff1) >> 5))) >> 8; + g = (weight0*(g + (((defG - g) * coeff0) >> 5)) + weight1*(g + (((defG - g) * coeff1) >> 5))) >> 8; + b = (weight0*(b + (((defB - b) * coeff0) >> 5)) + weight1*(b + (((defB - b) * coeff1) >> 5))) >> 8; + *dst = RGB2(r, g, b); } } else { // Use provided blend colors s32 r2, g2, b2, r3, g3, b3; @@ -1223,21 +1227,18 @@ void TimeMixPalettes(u32 palettes, u32 coeff0, u32 color0, u32 coeff1, u32 color if (b3 > 31) b3 = 31; } - r = (weight*r2 + (256-weight)*r3) >> 8; - g = (weight*g2 + (256-weight)*g3) >> 8; - b = (weight*b2 + (256-weight)*b3) >> 8; - // r = (weight*(r + (((r0 - r) * coeff0) >> 5)) + (256-weight)*(r + (((r1 - r) * coeff1) >> 5))) >> 8; - // g = (weight*(g + (((g0 - g) * coeff0) >> 5)) + (256-weight)*(g + (((g1 - g) * coeff1) >> 5))) >> 8; - // b = (weight*(b + (((b0 - b) * coeff0) >> 5)) + (256-weight)*(b + (((b1 - b) * coeff1) >> 5))) >> 8; - *palDataDst = RGB2(r, g, b); + r = (weight0*r2 + weight1*r3) >> 8; + g = (weight0*g2 + weight1*g3) >> 8; + b = (weight0*b2 + weight1*b3) >> 8; + *dst = RGB2(r, g, b); } - palDataSrc++; - palDataDst++; + src++; + dst++; altBlendIndices >>= 1; } } else { - palDataSrc += 16; - palDataDst += 16; + src += 16; + dst += 16; } palettes >>= 1; } while (palettes); @@ -1345,11 +1346,11 @@ void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 b // Tints from Unfaded to Faded, using a 15-bit GBA color void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor) { s32 newR, newG, newB, rTone, gTone, bTone; - u16 * palDataSrc = gPlttBufferUnfaded + palOffset; - u16 * palDataDst = gPlttBufferFaded + palOffset; + u16 * src = gPlttBufferUnfaded + palOffset; + u16 * dst = gPlttBufferFaded + palOffset; u32 defaultBlendColor = DEFAULT_LIGHT_COLOR; - u16 *palDataSrcEnd = palDataSrc + 16; - u16 altBlendIndices = *palDataDst++ = *palDataSrc++; // color 0 is copied through unchanged + u16 *srcEnd = src + 16; + u16 altBlendIndices = *dst++ = *src++; // color 0 is copied through unchanged u32 altBlendColor; newR = ((blendColor << 27) >> 27) << 3; @@ -1358,7 +1359,7 @@ void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor) { if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend // Note that bit 0 of altBlendIndices specifies color 1 - altBlendColor = palDataSrc[14]; // color 15 + altBlendColor = src[14]; // color 15 if (altBlendColor >> 15) { // Set alternate blend color rTone = ((altBlendColor << 27) >> 27) << 3; gTone = ((altBlendColor << 22) >> 27) << 3; @@ -1371,11 +1372,11 @@ void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor) { } else { altBlendIndices = 0; } - while (palDataSrc != palDataSrcEnd) { - u32 palDataSrcColor = *palDataSrc; - s32 r = (palDataSrcColor << 27) >> 27; - s32 g = (palDataSrcColor << 22) >> 27; - s32 b = (palDataSrcColor << 17) >> 27; + while (src != srcEnd) { + u32 srcColor = *src; + s32 r = (srcColor << 27) >> 27; + s32 g = (srcColor << 22) >> 27; + s32 b = (srcColor << 17) >> 27; if (altBlendIndices & 1) { r = (u16)((rTone * r)) >> 8; @@ -1392,8 +1393,8 @@ void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor) { g = 31; if (b > 31) b = 31; - palDataSrc++; - *palDataDst++ = RGB2(r, g, b); + src++; + *dst++ = RGB2(r, g, b); altBlendIndices >>= 1; } } From 4bb7abb520dabd862cc0be3e85fd6e8f5f9b8878 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Wed, 21 Apr 2021 02:53:24 -0400 Subject: [PATCH 029/145] Fixed palette fades during intermediate times of day. --- include/palette.h | 10 +++++-- src/overworld.c | 5 +++- src/palette.c | 74 +++++++++++++++++++++++++++++++++++------------ 3 files changed, 68 insertions(+), 21 deletions(-) diff --git a/include/palette.h b/include/palette.h index 4fbde048aa..4b7abd865c 100644 --- a/include/palette.h +++ b/include/palette.h @@ -28,7 +28,13 @@ enum struct PaletteFadeControl { - u32 multipurpose1; + u32 multipurpose1; // This field needs to exist or errors will occur + u16 blendColor1:15; + u16 tint1:1; + u32 tint0:1; + u32 coeff0:5; + u32 coeff1:5; + u32 weight:9; u8 delayCounter:6; u16 y:5; // blend coefficient u16 targetY:5; // target blend coefficient @@ -66,7 +72,7 @@ u8 UpdatePaletteFade(void); void ResetPaletteFade(void); void ReadPlttIntoBuffers(void); bool8 BeginNormalPaletteFade(u32, s8, u8, u8, u16); -bool8 BeginTimeOfDayPaletteFade(u32, s8, u8, u8, u16); +bool8 BeginTimeOfDayPaletteFade(u32, s8, u8, u8, struct BlendSettings *, struct BlendSettings *, u16); bool8 unref_sub_8073D3C(u32, u8, u8, u8, u16); void unref_sub_8073D84(u8, u32 *); void ResetPaletteStructByUid(u16); diff --git a/src/overworld.c b/src/overworld.c index 0028d976f4..53b693a834 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1514,7 +1514,10 @@ static bool8 FadePalettesWithTime(void) { // Only used to fade back in gTimeOfDay = UpdateTimeOfDay(); if (MapHasNaturalLight(gMapHeader.mapType)) { ResetPaletteFade(); - BeginTimeOfDayPaletteFade(0xFFFFFFFF, 0, 16, sTimeOfDayBlendVars[gTimeOfDay].coeff, sTimeOfDayBlendVars[gTimeOfDay].blendColor); + BeginTimeOfDayPaletteFade(0xFFFFFFFF, 0, 16, 0, + (struct BlendSettings *)&sTimeOfDayBlendVars[currentTimeBlend.time0], + (struct BlendSettings *)&sTimeOfDayBlendVars[currentTimeBlend.time1], + currentTimeBlend.weight); } } diff --git a/src/palette.c b/src/palette.c index e1c9628aa2..9015a42ee8 100644 --- a/src/palette.c +++ b/src/palette.c @@ -55,6 +55,7 @@ static u8 UpdateTimeOfDayPaletteFade(void); static void UpdateBlendRegisters(void); static bool8 IsSoftwarePaletteFadeFinishing(void); static void Task_BlendPalettesGradually(u8 taskId); +static void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color); // palette buffers require alignment with agbcc because // unaligned word reads are issued in BlendPalette otherwise @@ -204,10 +205,10 @@ bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targe } // Like normal palette fade but respects sprite/tile palettes immune to time of day fading -bool8 BeginTimeOfDayPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u16 blendColor) +// Blend color here is always assumed to be 0 (black). +bool8 BeginTimeOfDayPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, struct BlendSettings *bld0, struct BlendSettings *bld1, u16 weight) { u8 temp; - u16 color = blendColor; if (gPaletteFade.active) { @@ -228,10 +229,17 @@ bool8 BeginTimeOfDayPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 ta gPaletteFade_delay = delay; gPaletteFade.y = startY; gPaletteFade.targetY = targetY; - gPaletteFade.blendColor = color; gPaletteFade.active = 1; gPaletteFade.mode = TIME_OF_DAY_FADE; + gPaletteFade.blendColor = bld0->blendColor; + gPaletteFade.coeff0 = bld0->coeff; + gPaletteFade.tint0 = bld0->isTint; + gPaletteFade.blendColor1 = bld1->blendColor; + gPaletteFade.coeff1 = bld1->coeff; + gPaletteFade.tint1 = bld1->isTint; + gPaletteFade.weight = weight; + if (startY < targetY) gPaletteFade.yDec = 0; else @@ -462,6 +470,12 @@ static u8 UpdateTimeOfDayPaletteFade(void) u8 paletteNum; u16 paletteOffset; u16 selectedPalettes; + u16 timePalettes = 0; // palettes passed to the time-blender + u16 copyPalettes; + u16 * src; + u16 * dst; + struct BlendSettings bld0; + struct BlendSettings bld1; if (!gPaletteFade.active) return PALETTE_FADE_STATUS_DONE; @@ -491,22 +505,47 @@ static u8 UpdateTimeOfDayPaletteFade(void) paletteOffset = 256; } - for (paletteNum = 0; paletteNum < 16; paletteNum++, selectedPalettes >>= 1, paletteOffset += 16) { - if (selectedPalettes & 1) { - if (gPaletteFade.yDec) { - if (gPaletteFade.objPaletteToggle) { // sprite palettes - if (gPaletteFade.y >= gPaletteFade.targetY || GetSpritePaletteTagByPaletteNum(paletteNum) & 0x8000) - TimeBlendPalette(paletteOffset, gPaletteFade.y, gPaletteFade.blendColor); - // tile palettes - } else if (gPaletteFade.y >= gPaletteFade.targetY || (paletteNum >= 13 && paletteNum <= 15)) { - TimeBlendPalette(paletteOffset, gPaletteFade.y, gPaletteFade.blendColor); - } - } else { - TimeBlendPalette(paletteOffset, gPaletteFade.y, gPaletteFade.blendColor); - } + // Extract blend settings from palette fade struct TODO: Embed struct within gPaletteFade + bld0.blendColor = gPaletteFade.blendColor; + bld0.coeff = gPaletteFade.coeff0; + bld0.isTint = gPaletteFade.tint0; + bld1.blendColor = gPaletteFade.blendColor1; + bld1.coeff = gPaletteFade.coeff1; + bld1.isTint = gPaletteFade.tint1; + + src = gPlttBufferUnfaded + paletteOffset; + dst = gPlttBufferFaded + paletteOffset; + + // First pply TOD blend to relevant subset of palettes + if (gPaletteFade.objPaletteToggle) { // Sprite palettes, don't blend those with tags + u8 i; + u16 j = 1; + for (i = 0; i < 16; i++, j <<= 1) { // Mask out palettes that should not be light blended + if ((selectedPalettes & j) && !(GetSpritePaletteTagByPaletteNum(i) >> 15)) + timePalettes |= j; + } + + } else { // tile palettes, don't blend [13, 15] + timePalettes = selectedPalettes &= ~0xE000; + } + TimeMixPalettes(timePalettes, src, dst, &bld0, &bld1, gPaletteFade.weight); + + // palettes that were not blended above must be copied through + if ((copyPalettes = ~timePalettes)) { + u16 * src1 = src; + u16 * dst1 = dst; + while (copyPalettes) { + if (copyPalettes & 1) + CpuFastCopy(src1, dst1, 64); + copyPalettes >>= 1; + src1 += 16; + dst1 += 16; } } + // Then, blend from faded->faded with native BlendPalettes + BlendPalettesFine(selectedPalettes, dst, dst, gPaletteFade.y, 0); + gPaletteFade.objPaletteToggle ^= 1; if (!gPaletteFade.objPaletteToggle) @@ -981,8 +1020,7 @@ static void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 c do { if (palettes & 1) { u16 *srcEnd = src + 16; - *dst++ = *src++; // transparency is copied-through - while (src != srcEnd) { + while (src != srcEnd) { // Transparency is blended because it can matter for tile palettes u32 srcColor = *src; s32 r = (srcColor << 27) >> 27; s32 g = (srcColor << 22) >> 27; From 96d0f7ed7d78eb18fb618a7a04f6766bbf34caa8 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Thu, 22 Apr 2021 03:54:42 -0400 Subject: [PATCH 030/145] Fixed bug in TOD blending. --- src/overworld.c | 2 +- src/palette.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/overworld.c b/src/overworld.c index 53b693a834..8bcbc17aaa 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1529,7 +1529,7 @@ void UpdatePalettesWithTime(u32 palettes) { if (GetSpritePaletteTagByPaletteNum(i) >> 15) // Don't blend special sprite palette tags palettes &= ~(1 << (i + 16)); } - palettes &= ~0xE000; // Don't blend tile palettes [13,15] + palettes &= 0xFFFF1FFF; // Don't blend tile palettes [13,15] if (!palettes) return; TimeMixPalettes(palettes, diff --git a/src/palette.c b/src/palette.c index 9015a42ee8..704740a067 100644 --- a/src/palette.c +++ b/src/palette.c @@ -526,7 +526,7 @@ static u8 UpdateTimeOfDayPaletteFade(void) } } else { // tile palettes, don't blend [13, 15] - timePalettes = selectedPalettes &= ~0xE000; + timePalettes = selectedPalettes & 0x1FFF; } TimeMixPalettes(timePalettes, src, dst, &bld0, &bld1, gPaletteFade.weight); From 741e880c245bbeaff47599ae120a8d3a2d3cbd2a Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sat, 24 Apr 2021 00:43:53 -0400 Subject: [PATCH 031/145] Increased TOD update interval. --- src/overworld.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/overworld.c b/src/overworld.c index 8bcbc17aaa..ce68cfbd89 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1557,7 +1557,7 @@ static void OverworldBasic(void) UpdatePaletteFade(); UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); - if (!(gPaletteFade.active || (timeCounter++ % 60))) { + if (!(gPaletteFade.active || (timeCounter++ % 3600))) { struct TimeBlendSettings cachedBlend = { .time0 = currentTimeBlend.time0, .time1 = currentTimeBlend.time1, From a4680ed572c831138450a673677c5cb439db53a2 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sat, 24 Apr 2021 00:57:11 -0400 Subject: [PATCH 032/145] Minor TOD documentation. --- src/overworld.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/overworld.c b/src/overworld.c index ce68cfbd89..659d8bec92 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1474,7 +1474,7 @@ u8 UpdateTimeOfDay(void) { RtcCalcLocalTime(); hours = gLocalTime.hours; minutes = gLocalTime.minutes; - if (hours >= 22 || hours < 4) { + if (hours >= 22 || hours < 4) { // night currentTimeBlend.weight = 256; return gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; } else if (hours >= 4 && hours < 7) { // night->twilight @@ -1501,7 +1501,8 @@ u8 UpdateTimeOfDay(void) { currentTimeBlend.weight = 256 - 256 * ((hours - 20) * 60 + minutes) / ((22-20)*60); return gTimeOfDay = TIME_OF_DAY_NIGHT; } else { // This should never occur - return TIME_OF_DAY_MAX; + currentTimeBlend.weight = 256; + return gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_DAY; } } @@ -1557,6 +1558,7 @@ static void OverworldBasic(void) UpdatePaletteFade(); UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); + // Every minute if no palette fade is active, update TOD blending as needed if (!(gPaletteFade.active || (timeCounter++ % 3600))) { struct TimeBlendSettings cachedBlend = { .time0 = currentTimeBlend.time0, From dbc4cb82932414cee4ef00f4d2d61e5f2a6f1001 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sat, 24 Apr 2021 01:12:04 -0400 Subject: [PATCH 033/145] Refactored BlendSettings storage inside gPaletteFade. --- include/palette.h | 22 ++++++++++------------ src/overworld.c | 2 +- src/palette.c | 21 ++++----------------- 3 files changed, 15 insertions(+), 30 deletions(-) diff --git a/include/palette.h b/include/palette.h index 4b7abd865c..886c05c386 100644 --- a/include/palette.h +++ b/include/palette.h @@ -26,15 +26,19 @@ enum FAST_FADE_OUT_TO_BLACK, }; +struct BlendSettings { + u16 blendColor:15; + u16 isTint:1; + u8 coeff:5; +}; + struct PaletteFadeControl { u32 multipurpose1; // This field needs to exist or errors will occur - u16 blendColor1:15; - u16 tint1:1; - u32 tint0:1; - u32 coeff0:5; - u32 coeff1:5; - u32 weight:9; + // These three are only used for TOD blending + struct BlendSettings *bld0; + struct BlendSettings *bld1; + u16 weight:9; // [0, 256], so must be 9 bits u8 delayCounter:6; u16 y:5; // blend coefficient u16 targetY:5; // target blend coefficient @@ -52,12 +56,6 @@ struct PaletteFadeControl u8 deltaY:4; // rate of change of blend coefficient }; -struct BlendSettings { - u16 blendColor:15; - u16 isTint:1; - u8 coeff:5; -}; - extern struct PaletteFadeControl gPaletteFade; extern u32 gPlttBufferTransferPending; extern u8 gPaletteDecompressionBuffer[]; diff --git a/src/overworld.c b/src/overworld.c index 659d8bec92..a3b3649fa8 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1506,7 +1506,7 @@ u8 UpdateTimeOfDay(void) { } } -static bool8 MapHasNaturalLight(u8 mapType) { // Weather a map type is naturally lit/outside +static bool8 MapHasNaturalLight(u8 mapType) { // Whether a map type is naturally lit/outside return mapType == MAP_TYPE_TOWN || mapType == MAP_TYPE_CITY || mapType == MAP_TYPE_ROUTE || mapType == MAP_TYPE_OCEAN_ROUTE; } diff --git a/src/palette.c b/src/palette.c index 704740a067..d7974779ca 100644 --- a/src/palette.c +++ b/src/palette.c @@ -232,12 +232,9 @@ bool8 BeginTimeOfDayPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 ta gPaletteFade.active = 1; gPaletteFade.mode = TIME_OF_DAY_FADE; - gPaletteFade.blendColor = bld0->blendColor; - gPaletteFade.coeff0 = bld0->coeff; - gPaletteFade.tint0 = bld0->isTint; - gPaletteFade.blendColor1 = bld1->blendColor; - gPaletteFade.coeff1 = bld1->coeff; - gPaletteFade.tint1 = bld1->isTint; + gPaletteFade.blendColor = 0; + gPaletteFade.bld0 = bld0; + gPaletteFade.bld1 = bld1; gPaletteFade.weight = weight; if (startY < targetY) @@ -474,8 +471,6 @@ static u8 UpdateTimeOfDayPaletteFade(void) u16 copyPalettes; u16 * src; u16 * dst; - struct BlendSettings bld0; - struct BlendSettings bld1; if (!gPaletteFade.active) return PALETTE_FADE_STATUS_DONE; @@ -505,14 +500,6 @@ static u8 UpdateTimeOfDayPaletteFade(void) paletteOffset = 256; } - // Extract blend settings from palette fade struct TODO: Embed struct within gPaletteFade - bld0.blendColor = gPaletteFade.blendColor; - bld0.coeff = gPaletteFade.coeff0; - bld0.isTint = gPaletteFade.tint0; - bld1.blendColor = gPaletteFade.blendColor1; - bld1.coeff = gPaletteFade.coeff1; - bld1.isTint = gPaletteFade.tint1; - src = gPlttBufferUnfaded + paletteOffset; dst = gPlttBufferFaded + paletteOffset; @@ -528,7 +515,7 @@ static u8 UpdateTimeOfDayPaletteFade(void) } else { // tile palettes, don't blend [13, 15] timePalettes = selectedPalettes & 0x1FFF; } - TimeMixPalettes(timePalettes, src, dst, &bld0, &bld1, gPaletteFade.weight); + TimeMixPalettes(timePalettes, src, dst, gPaletteFade.bld0, gPaletteFade.bld1, gPaletteFade.weight); // palettes that were not blended above must be copied through if ((copyPalettes = ~timePalettes)) { From 4454a6397b3c0006916ad071f788781ffa61e2ef Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sat, 24 Apr 2021 01:17:39 -0400 Subject: [PATCH 034/145] Fixed bug where TOD was updated too frequently. --- include/overworld.h | 1 + include/palette.h | 1 - src/overworld.c | 8 ++--- src/palette.c | 72 +-------------------------------------------- 4 files changed, 6 insertions(+), 76 deletions(-) diff --git a/include/overworld.h b/include/overworld.h index 2180a87a9b..58cf5b16af 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -141,6 +141,7 @@ void CleanupOverworldWindowsAndTilemaps(void); bool32 IsUpdateLinkStateCBActive(void); void CB1_Overworld(void); void CB2_OverworldBasic(void); +u8 UpdateTimeOfDay(void); void UpdatePalettesWithTime(u32); void CB2_Overworld(void); void SetMainCallback1(void (*cb)(void)); diff --git a/include/palette.h b/include/palette.h index 886c05c386..89de237c23 100644 --- a/include/palette.h +++ b/include/palette.h @@ -88,7 +88,6 @@ void BlendPalettesUnfaded(u32, u8, u16); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor); void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor); -void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor); void TimeMixPalettes(u32, u16 *, u16 *, struct BlendSettings *, struct BlendSettings *, u16); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); diff --git a/src/overworld.c b/src/overworld.c index a3b3649fa8..51e4279fb8 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -186,7 +186,7 @@ static u16 (*sPlayerKeyInterceptCallback)(u32); static bool8 sReceivingFromLink; static u8 sRfuKeepAliveTimer; -static u8 timeCounter; +static u16 sTimeUpdateCounter; // playTimeVBlanks will eventually overflow, so this is used to update TOD static struct TimeBlendSettings currentTimeBlend; // IWRAM common @@ -1542,7 +1542,7 @@ void UpdatePalettesWithTime(u32 palettes) { } } -u8 UpdateSpritePaletteWithTime(u8 paletteNum) { // TODO: Optimize this +u8 UpdateSpritePaletteWithTime(u8 paletteNum) { UpdatePalettesWithTime(1 << (paletteNum + 16)); return paletteNum; } @@ -1559,13 +1559,13 @@ static void OverworldBasic(void) UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); // Every minute if no palette fade is active, update TOD blending as needed - if (!(gPaletteFade.active || (timeCounter++ % 3600))) { + if (!(gPaletteFade.active || (++sTimeUpdateCounter % 3600))) { struct TimeBlendSettings cachedBlend = { .time0 = currentTimeBlend.time0, .time1 = currentTimeBlend.time1, .weight = currentTimeBlend.weight, }; - timeCounter = 0; + sTimeUpdateCounter = 0; UpdateTimeOfDay(); if (cachedBlend.time0 != currentTimeBlend.time0 || cachedBlend.time1 != currentTimeBlend.time1 diff --git a/src/palette.c b/src/palette.c index d7974779ca..37b30d0c38 100644 --- a/src/palette.c +++ b/src/palette.c @@ -1084,78 +1084,8 @@ void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor) { } } -void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor) { - s32 newR, newG, newB, defR, defG, defB, altR, altG, altB; - u16 * src; - u16 * dst; - u32 defaultBlendColor = DEFAULT_LIGHT_COLOR; - - if (!palettes) - return; - - coeff *= 2; - newR = (blendColor << 27) >> 27; - newG = (blendColor << 22) >> 27; - newB = (blendColor << 17) >> 27; - defR = (defaultBlendColor << 27) >> 27; - defG = (defaultBlendColor << 22) >> 27; - defB = (defaultBlendColor << 17) >> 27; - src = gPlttBufferUnfaded; - dst = gPlttBufferFaded; - - do { - if (palettes & 1) { - u16 *srcEnd = src + 16; - u16 altBlendIndices = *dst++ = *src++; // color 0 is copied through - u32 altBlendColor; - if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend - // Note that bit 0 of altBlendIndices specifies color 1 - altBlendColor = src[14]; // color 15 - if (altBlendColor >> 15) { // Set alternate blend color - altR = (altBlendColor << 27) >> 27; - altG = (altBlendColor << 22) >> 27; - altB = (altBlendColor << 17) >> 27; - } else { - altBlendColor = 0; - } - } else { - altBlendIndices = 0; - } - while (src != srcEnd) { - u32 srcColor = *src; - s32 r = (srcColor << 27) >> 27; - s32 g = (srcColor << 22) >> 27; - s32 b = (srcColor << 17) >> 27; - - if (altBlendIndices & 1) { - if (altBlendColor) { // Use alternate blend color - *dst = ((r + (((altR - r) * coeff) >> 5)) << 0) - | ((g + (((altG - g) * coeff) >> 5)) << 5) - | ((b + (((altB - b) * coeff) >> 5)) << 10); - } else { // Use default blend color - *dst = ((r + (((defR - r) * coeff) >> 5)) << 0) - | ((g + (((defG - g) * coeff) >> 5)) << 5) - | ((b + (((defB - b) * coeff) >> 5)) << 10); - } - } else { // Use provided blend color - *dst = ((r + (((newR - r) * coeff) >> 5)) << 0) - | ((g + (((newG - g) * coeff) >> 5)) << 5) - | ((b + (((newB - b) * coeff) >> 5)) << 10); - } - src++; - dst++; - altBlendIndices >>= 1; - } - } else { - src += 16; - dst += 16; - } - palettes >>= 1; - } while (palettes); -} - // Blends a weighted average of two blend parameters -// TODO: Should pointers be marked as const? +// Parameters can be either blended (as in BlendPalettes) or tinted (as in TintPaletteRGB_Copy) void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *blend0, struct BlendSettings *blend1, u16 weight0) { s32 r0, g0, b0, r1, g1, b1, defR, defG, defB, altR, altG, altB; u32 color0, coeff0, color1, coeff1; From 68e43a8f0453d44077cbf992f780cad17ada8483 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sat, 24 Apr 2021 01:35:19 -0400 Subject: [PATCH 035/145] Updated time-of-day-based evolution methods. --- src/pokemon.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 0b50a72f3a..21daf2ec61 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4878,7 +4878,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov temp2 = itemEffect[itemEffectParam]; dataSigned = GetMonData(mon, sGetMonDataEVConstants[temp1], NULL); evChange = temp2; - + if (evChange > 0) // Increasing EV (HP or Atk) { // Has EV increase limit already been reached? @@ -4976,7 +4976,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov { if (!usedByAI) { - // Restore HP + // Restore HP dataUnsigned = GetMonData(mon, MON_DATA_HP, NULL) + dataUnsigned; if (dataUnsigned > GetMonData(mon, MON_DATA_MAX_HP, NULL)) dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL); @@ -5055,7 +5055,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov dataUnsigned = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); } SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned); - + // Heal battler PP too (if applicable) if (gMain.inBattle && battlerId != MAX_BATTLERS_COUNT && !(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED) @@ -5092,7 +5092,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov case 5: effectFlags = itemEffect[i]; temp1 = 0; - + // Loop through and try each of the ITEM5 effects while (effectFlags != 0) { @@ -5437,13 +5437,13 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 mode, u16 evolutionItem) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_FRIENDSHIP_DAY: - RtcCalcLocalTime(); - if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && friendship >= 220) + UpdateTimeOfDay(); + if (gTimeOfDay != TIME_OF_DAY_NIGHT && friendship >= 220) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_FRIENDSHIP_NIGHT: - RtcCalcLocalTime(); - if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && friendship >= 220) + UpdateTimeOfDay(); + if (gTimeOfDay == TIME_OF_DAY_NIGHT && friendship >= 220) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL: From a160012dbfd6eebbec05fd2442154055c3da8419 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sat, 24 Apr 2021 02:18:41 -0400 Subject: [PATCH 036/145] Added shadow toggle to weather structure. --- include/field_weather.h | 3 ++- src/event_object_movement.c | 4 ++-- src/field_effect_helpers.c | 1 + src/field_weather.c | 1 + src/field_weather_effect.c | 13 +++++++++++++ 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/include/field_weather.h b/include/field_weather.h index 9c6a4ab7ad..c462707f9d 100644 --- a/include/field_weather.h +++ b/include/field_weather.h @@ -45,7 +45,8 @@ struct Weather s8 gammaTargetIndex; u8 gammaStepDelay; u8 gammaStepFrameCounter; - u16 fadeDestColor; + u16 fadeDestColor:15; + u16 noShadows:1; // Certain weathers require blend coeffs that do not work nice with shadows u8 palProcessingState; u8 fadeScreenCounter; bool8 readyForInit; diff --git a/src/event_object_movement.c b/src/event_object_movement.c index ce94116aa0..939ff3ca6d 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -8856,14 +8856,14 @@ static void GroundEffect_Shadow(struct ObjectEvent *objEvent, struct Sprite *spr static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *sprite, u32 flags) { u8 i; - if (ObjectEventIsFarawayIslandMew(objEvent) == TRUE && !ShouldMewShakeGrass(objEvent)) return; for (i = 0; i < ARRAY_COUNT(sGroundEffectFuncs); i++, flags >>= 1) if (flags & 1) sGroundEffectFuncs[i](objEvent, sprite); - GroundEffect_Shadow(objEvent, sprite); + if (!gWeatherPtr->noShadows) + GroundEffect_Shadow(objEvent, sprite); } void filters_out_some_ground_effects(struct ObjectEvent *objEvent, u32 *flags) diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index f3d4d71491..ed5ffecd62 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -349,6 +349,7 @@ void UpdateShadowFieldEffect(struct Sprite *sprite) sprite->invisible = linkedSprite->invisible; if (!objectEvent->active || objectEvent->noShadow + || gWeatherPtr->noShadows || MetatileBehavior_IsPokeGrass(objectEvent->currentMetatileBehavior) || MetatileBehavior_IsSurfableWaterOrUnderwater(objectEvent->currentMetatileBehavior) || MetatileBehavior_IsSurfableWaterOrUnderwater(objectEvent->previousMetatileBehavior)) diff --git a/src/field_weather.c b/src/field_weather.c index 0b8427c293..e94d6f254e 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -255,6 +255,7 @@ static void Task_WeatherMain(u8 taskId) static void None_Init(void) { Weather_SetBlendCoeffs(8, 12); // Indoor shadows + gWeatherPtr->noShadows = FALSE; gWeatherPtr->gammaTargetIndex = 0; gWeatherPtr->gammaStepDelay = 0; } diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index d8eff78b7b..36ca937b6a 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -95,6 +95,7 @@ static const struct SpriteTemplate sCloudSpriteTemplate = void Clouds_InitVars(void) { + gWeatherPtr->noShadows = FALSE; gWeatherPtr->gammaTargetIndex = 0; gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; @@ -156,6 +157,7 @@ void Sunny_InitVars(void) gWeatherPtr->gammaTargetIndex = 0; gWeatherPtr->gammaStepDelay = 20; Weather_SetBlendCoeffs(8, 12); + gWeatherPtr->noShadows = FALSE; } void Sunny_InitAll(void) @@ -239,6 +241,7 @@ void Drought_InitVars(void) gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->gammaTargetIndex = 0; gWeatherPtr->gammaStepDelay = 0; + gWeatherPtr->noShadows = FALSE; } void Drought_InitAll(void) @@ -482,6 +485,7 @@ void Rain_InitVars(void) gWeatherPtr->gammaStepDelay = 20; SetRainStrengthFromSoundEffect(SE_RAIN); Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness + gWeatherPtr->noShadows = FALSE; } void Rain_InitAll(void) @@ -776,6 +780,7 @@ void Snow_InitVars(void) gWeatherPtr->targetSnowflakeSpriteCount = 16; gWeatherPtr->snowflakeVisibleCounter = 0; Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness + gWeatherPtr->noShadows = FALSE; } void Snow_InitAll(void) @@ -1052,6 +1057,7 @@ void Thunderstorm_InitVars(void) gWeatherPtr->thunderTriggered = FALSE; SetRainStrengthFromSoundEffect(SE_THUNDERSTORM); Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness + gWeatherPtr->noShadows = FALSE; } void Thunderstorm_InitAll(void) @@ -1081,6 +1087,7 @@ void Downpour_InitVars(void) gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment SetRainStrengthFromSoundEffect(SE_DOWNPOUR); Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness + gWeatherPtr->noShadows = FALSE; } void Downpour_InitAll(void) @@ -1378,6 +1385,7 @@ void FogHorizontal_InitVars(void) gWeatherPtr->fogHScrollPosX = 0; Weather_SetBlendCoeffs(0, 16); } + gWeatherPtr->noShadows = TRUE; // TODO: Can fog be made compatible with shadows? } void FogHorizontal_InitAll(void) @@ -1532,6 +1540,7 @@ void Ash_InitVars(void) Weather_SetBlendCoeffs(0, 12); // SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(64, 63)); // These aren't valid blend coefficients! } + gWeatherPtr->noShadows = FALSE; } void Ash_InitAll(void) @@ -1748,6 +1757,7 @@ void FogDiagonal_InitVars(void) gWeatherPtr->fogDPosY = 0; Weather_SetBlendCoeffs(0, 16); } + gWeatherPtr->noShadows = TRUE; } void FogDiagonal_InitAll(void) @@ -1961,6 +1971,7 @@ void Sandstorm_InitVars(void) Weather_SetBlendCoeffs(0, 16); } + gWeatherPtr->noShadows = TRUE; // TODO: Can sandstorm be compatible with shadows? } void Sandstorm_InitAll(void) @@ -2248,6 +2259,7 @@ void Shade_InitVars(void) gWeatherPtr->gammaTargetIndex = 3; gWeatherPtr->gammaStepDelay = 20; Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness + gWeatherPtr->noShadows = FALSE; } void Shade_InitAll(void) @@ -2309,6 +2321,7 @@ void Bubbles_InitVars(void) gWeatherPtr->bubblesCoordsIndex = 0; gWeatherPtr->bubblesSpriteCount = 0; } + gWeatherPtr->noShadows = TRUE; } void Bubbles_InitAll(void) From 0cc6c7b111e60ee941a5b858a9ce54e19a5d83a3 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sat, 24 Apr 2021 02:56:16 -0400 Subject: [PATCH 037/145] Made BlendPalettesFine global. --- include/palette.h | 1 + src/palette.c | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/palette.h b/include/palette.h index 89de237c23..3b0368aca4 100644 --- a/include/palette.h +++ b/include/palette.h @@ -84,6 +84,7 @@ void UnfadePlttBuffer(u32); void BeginFastPaletteFade(u8); void BeginHardwarePaletteFade(u8, u8, u8, u8, u8); void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color); +void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color); void BlendPalettesUnfaded(u32, u8, u16); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor); diff --git a/src/palette.c b/src/palette.c index 37b30d0c38..8b08eb9e48 100644 --- a/src/palette.c +++ b/src/palette.c @@ -55,7 +55,6 @@ static u8 UpdateTimeOfDayPaletteFade(void); static void UpdateBlendRegisters(void); static bool8 IsSoftwarePaletteFadeFinishing(void); static void Task_BlendPalettesGradually(u8 taskId); -static void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color); // palette buffers require alignment with agbcc because // unaligned word reads are issued in BlendPalette otherwise @@ -993,7 +992,7 @@ static bool8 IsSoftwarePaletteFadeFinishing(void) } // optimized based on lucktyphlosion's BlendPalettesFine -static void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color) { +void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color) { s32 newR, newG, newB; if (!palettes) From c0d6692ce8a43abb1968eb779a3273351da7911a Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sat, 24 Apr 2021 02:56:33 -0400 Subject: [PATCH 038/145] Fixed weather gamma blending. --- src/field_weather.c | 12 ++++++++---- src/overworld.c | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/field_weather.c b/src/field_weather.c index e94d6f254e..089fcf9894 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -16,6 +16,7 @@ #include "task.h" #include "trig.h" #include "gpu_regs.h" +#include "overworld.h" #define DROUGHT_COLOR_INDEX(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00)) @@ -473,10 +474,12 @@ static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) // Loop through the speficied palette range and apply necessary gamma shifts to the colors. while (curPalIndex < numPalettes) { + CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); + UpdatePalettesWithTime(1 << (palOffset >> 4)); if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { // No palette change. - CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); + // CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); palOffset += 16; } else @@ -491,7 +494,7 @@ static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) for (i = 0; i < 16; i++) { // Apply gamma shift to the original color. - struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferFaded[palOffset]; r = gammaTable[baseColor.r]; g = gammaTable[baseColor.g]; b = gammaTable[baseColor.b]; @@ -554,10 +557,11 @@ static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaI while (curPalIndex < numPalettes) { + UpdatePalettesWithTime(1 << (palOffset >> 4)); // Apply TOD blend if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { // No gamma shift. Simply blend the colors. - BlendPalette(palOffset, 16, blendCoeff, blendColor); + BlendPalettesFine(1 << (palOffset >> 4), gPlttBufferFaded, gPlttBufferFaded, blendCoeff, blendColor); palOffset += 16; } else @@ -571,7 +575,7 @@ static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaI for (i = 0; i < 16; i++) { - struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferFaded[palOffset]; u8 r = gammaTable[baseColor.r]; u8 g = gammaTable[baseColor.g]; u8 b = gammaTable[baseColor.b]; diff --git a/src/overworld.c b/src/overworld.c index 51e4279fb8..99d8294947 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1511,6 +1511,7 @@ static bool8 MapHasNaturalLight(u8 mapType) { // Whether a map type is naturally || mapType == MAP_TYPE_OCEAN_ROUTE; } +// TODO: Rewrite palette fading to work with FadeScreen static bool8 FadePalettesWithTime(void) { // Only used to fade back in gTimeOfDay = UpdateTimeOfDay(); if (MapHasNaturalLight(gMapHeader.mapType)) { From 65e616342b8ea414dd175e0fee116f7aaf7105eb Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sat, 24 Apr 2021 03:24:14 -0400 Subject: [PATCH 039/145] Changed time blending to work with FadeScreen. --- common_syms/overworld.txt | 1 + include/overworld.h | 5 +++++ include/palette.h | 2 +- src/field_weather.c | 16 +++++++++++++--- src/overworld.c | 30 ++++++++++++++++-------------- src/palette.c | 9 ++++----- 6 files changed, 40 insertions(+), 23 deletions(-) diff --git a/common_syms/overworld.txt b/common_syms/overworld.txt index 4833362098..cc92cee1e2 100644 --- a/common_syms/overworld.txt +++ b/common_syms/overworld.txt @@ -7,3 +7,4 @@ gFieldCallback2 gLocalLinkPlayerId gFieldLinkPlayerCount gTimeOfDay +currentTimeBlend diff --git a/include/overworld.h b/include/overworld.h index 58cf5b16af..2a1353b7bc 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -62,11 +62,15 @@ extern void (*gFieldCallback)(void); extern bool8 (*gFieldCallback2)(void); extern u8 gLocalLinkPlayerId; extern u8 gFieldLinkPlayerCount; + extern u8 gTimeOfDay; +extern struct TimeBlendSettings currentTimeBlend; // Exported ROM declarations extern const struct UCoords32 gDirectionToVectors[]; +extern const struct BlendSettings gTimeOfDayBlend[]; + void DoWhiteOut(void); void Overworld_ResetStateAfterFly(void); void Overworld_ResetStateAfterTeleport(void); @@ -142,6 +146,7 @@ bool32 IsUpdateLinkStateCBActive(void); void CB1_Overworld(void); void CB2_OverworldBasic(void); u8 UpdateTimeOfDay(void); +bool8 MapHasNaturalLight(u8 mapType); void UpdatePalettesWithTime(u32); void CB2_Overworld(void); void SetMainCallback1(void (*cb)(void)); diff --git a/include/palette.h b/include/palette.h index 3b0368aca4..201e853800 100644 --- a/include/palette.h +++ b/include/palette.h @@ -70,7 +70,7 @@ u8 UpdatePaletteFade(void); void ResetPaletteFade(void); void ReadPlttIntoBuffers(void); bool8 BeginNormalPaletteFade(u32, s8, u8, u8, u16); -bool8 BeginTimeOfDayPaletteFade(u32, s8, u8, u8, struct BlendSettings *, struct BlendSettings *, u16); +bool8 BeginTimeOfDayPaletteFade(u32, s8, u8, u8, struct BlendSettings *, struct BlendSettings *, u16, u16); bool8 unref_sub_8073D3C(u32, u8, u8, u8, u16); void unref_sub_8073D84(u8, u32 *); void ResetPaletteStructByUid(u16); diff --git a/src/field_weather.c b/src/field_weather.c index 089fcf9894..bbc7506e32 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -472,6 +472,7 @@ static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) curPalIndex = startPalIndex; // Loop through the speficied palette range and apply necessary gamma shifts to the colors. + // TODO: Optimize this to work with time blending while (curPalIndex < numPalettes) { CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); @@ -647,7 +648,7 @@ static void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 bl } } -static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) +static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) // TODO: How does this interact with time { struct RGBColor color; u8 rBlend; @@ -794,9 +795,18 @@ void FadeScreen(u8 mode, s8 delay) { gWeatherPtr->fadeDestColor = fadeColor; if (useWeatherPal) - gWeatherPtr->fadeScreenCounter = 0; - else + gWeatherPtr->fadeScreenCounter = 0; // Triggers gamma-shift-based fade-in + else { + UpdateTimeOfDay(); + if (MapHasNaturalLight(gMapHeader.mapType)) { + BeginTimeOfDayPaletteFade(PALETTES_ALL, delay, 16, 0, + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], + currentTimeBlend.weight, fadeColor); + } else { BeginNormalPaletteFade(PALETTES_ALL, delay, 16, 0, fadeColor); + } + } gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN; gWeatherPtr->fadeInFirstFrame = TRUE; diff --git a/src/overworld.c b/src/overworld.c index 99d8294947..5e4aa1a32f 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -187,7 +187,7 @@ static bool8 sReceivingFromLink; static u8 sRfuKeepAliveTimer; static u16 sTimeUpdateCounter; // playTimeVBlanks will eventually overflow, so this is used to update TOD -static struct TimeBlendSettings currentTimeBlend; + // IWRAM common u16 *gBGTilemapBuffers1; @@ -200,6 +200,7 @@ u8 gLocalLinkPlayerId; // This is our player id in a multiplayer mode. u8 gFieldLinkPlayerCount; u8 gTimeOfDay; +struct TimeBlendSettings currentTimeBlend; // EWRAM vars EWRAM_DATA static u8 sObjectEventLoadFlag = 0; @@ -828,7 +829,7 @@ void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum) RoamerMove(); DoCurrentWeather(); ResetFieldTasksArgs(); - UpdatePalettesWithTime(0xFFFFFFFF); + UpdatePalettesWithTime(PALETTES_ALL); RunOnResumeMapScript(); if (gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER @@ -1462,7 +1463,7 @@ void CB1_Overworld(void) -static const struct BlendSettings sTimeOfDayBlendVars[] = +const struct BlendSettings gTimeOfDayBlend[] = { [TIME_OF_DAY_NIGHT] = {.coeff = 10, .blendColor = 0x1400}, [TIME_OF_DAY_TWILIGHT] = {.coeff = 4, .blendColor = 0x56dc, .isTint = TRUE}, @@ -1506,20 +1507,21 @@ u8 UpdateTimeOfDay(void) { } } -static bool8 MapHasNaturalLight(u8 mapType) { // Whether a map type is naturally lit/outside +bool8 MapHasNaturalLight(u8 mapType) { // Whether a map type is naturally lit/outside return mapType == MAP_TYPE_TOWN || mapType == MAP_TYPE_CITY || mapType == MAP_TYPE_ROUTE || mapType == MAP_TYPE_OCEAN_ROUTE; } // TODO: Rewrite palette fading to work with FadeScreen +// Currently, this cancels the "Normal" palette fade started by FadeScreen static bool8 FadePalettesWithTime(void) { // Only used to fade back in - gTimeOfDay = UpdateTimeOfDay(); + UpdateTimeOfDay(); if (MapHasNaturalLight(gMapHeader.mapType)) { ResetPaletteFade(); - BeginTimeOfDayPaletteFade(0xFFFFFFFF, 0, 16, 0, - (struct BlendSettings *)&sTimeOfDayBlendVars[currentTimeBlend.time0], - (struct BlendSettings *)&sTimeOfDayBlendVars[currentTimeBlend.time1], - currentTimeBlend.weight); + BeginTimeOfDayPaletteFade(PALETTES_ALL, 0, 16, 0, + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], + currentTimeBlend.weight, 0); } } @@ -1537,8 +1539,8 @@ void UpdatePalettesWithTime(u32 palettes) { TimeMixPalettes(palettes, gPlttBufferUnfaded, gPlttBufferFaded, - (struct BlendSettings *)&sTimeOfDayBlendVars[currentTimeBlend.time0], - (struct BlendSettings *)&sTimeOfDayBlendVars[currentTimeBlend.time1], + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], currentTimeBlend.weight); } } @@ -1571,7 +1573,7 @@ static void OverworldBasic(void) if (cachedBlend.time0 != currentTimeBlend.time0 || cachedBlend.time1 != currentTimeBlend.time1 || cachedBlend.weight != currentTimeBlend.weight) - UpdatePalettesWithTime(0xFFFFFFFF); + UpdatePalettesWithTime(PALETTES_ALL); } } @@ -1686,7 +1688,7 @@ static void CB2_LoadMap2(void) DoMapLoadLoop(&gMain.state); SetFieldVBlankCallback(); SetMainCallback1(CB1_Overworld); - FadePalettesWithTime(); + // FadePalettesWithTime(); SetMainCallback2(CB2_Overworld); } @@ -1743,7 +1745,7 @@ static void CB2_ReturnToFieldLocal(void) if (ReturnToFieldLocal(&gMain.state)) { SetFieldVBlankCallback(); - FadePalettesWithTime(); + // FadePalettesWithTime(); SetMainCallback2(CB2_Overworld); } } diff --git a/src/palette.c b/src/palette.c index 8b08eb9e48..b947f464c3 100644 --- a/src/palette.c +++ b/src/palette.c @@ -204,8 +204,7 @@ bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targe } // Like normal palette fade but respects sprite/tile palettes immune to time of day fading -// Blend color here is always assumed to be 0 (black). -bool8 BeginTimeOfDayPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, struct BlendSettings *bld0, struct BlendSettings *bld1, u16 weight) +bool8 BeginTimeOfDayPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, struct BlendSettings *bld0, struct BlendSettings *bld1, u16 weight, u16 color) { u8 temp; @@ -231,7 +230,7 @@ bool8 BeginTimeOfDayPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 ta gPaletteFade.active = 1; gPaletteFade.mode = TIME_OF_DAY_FADE; - gPaletteFade.blendColor = 0; + gPaletteFade.blendColor = color; gPaletteFade.bld0 = bld0; gPaletteFade.bld1 = bld1; gPaletteFade.weight = weight; @@ -522,7 +521,7 @@ static u8 UpdateTimeOfDayPaletteFade(void) u16 * dst1 = dst; while (copyPalettes) { if (copyPalettes & 1) - CpuFastCopy(src1, dst1, 64); + CpuFastCopy(src1, dst1, 32); copyPalettes >>= 1; src1 += 16; dst1 += 16; @@ -530,7 +529,7 @@ static u8 UpdateTimeOfDayPaletteFade(void) } // Then, blend from faded->faded with native BlendPalettes - BlendPalettesFine(selectedPalettes, dst, dst, gPaletteFade.y, 0); + BlendPalettesFine(selectedPalettes, dst, dst, gPaletteFade.y, gPaletteFade.blendColor); gPaletteFade.objPaletteToggle ^= 1; From 7b59eabbcff3c07bebd31e97a264d172f2bb23c9 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sat, 24 Apr 2021 17:23:35 -0400 Subject: [PATCH 040/145] Changed fog to be compatible with transparent shadows. --- .../field_effects/pics/shadow_extra_large.png | Bin 152 -> 5188 bytes graphics/field_effects/pics/shadow_large.png | Bin 144 -> 4911 bytes graphics/field_effects/pics/shadow_medium.png | Bin 143 -> 4767 bytes graphics/field_effects/pics/shadow_small.png | Bin 143 -> 4807 bytes graphics/weather/fog.pal | 2 +- src/data/field_effects/field_effect_objects.h | 8 +++--- src/field_weather_effect.c | 23 +++++++++++++++--- 7 files changed, 24 insertions(+), 9 deletions(-) diff --git a/graphics/field_effects/pics/shadow_extra_large.png b/graphics/field_effects/pics/shadow_extra_large.png index 765a5291a8d9eb0f6508e5d9e223c421112ca56b..eb334a976c597db39f56470dcb6e90b9123a3dd4 100644 GIT binary patch literal 5188 zcmeHKX;@Ro8V*~56p&RAgM?regzO1fWDyCF2%#822#9c!oP+>bOacV#?R5i-OGO0{ z1r)HBi()Gvf-5MC3aGe%Wzn{X;tFU*tWfSr!0oyHDOh1N2xeK8d9#13B}1EQk5E zgu&E3Pa|WFI=h-oifpR&lW|#tBe_Du>IqubGU?9V&Kmk8kz)%tw;gPy-S)44ef4hJ zWabuD)s|9PUasfSDBf?ISz`|>PAzmyJNJ{i|NPX#`hi~4ESGqb2eOdvKlc?rgI@{7 z?=tkSkE8Uw*rq7BKT$eVg=lx)w>@Ziy|sZiWr!2{b(DABk?l@3=`E|b%-_Gi8gpNC z;@o890g8UA?h6xZ&kVCss`-;ZOn5LVqpx8p{N#g;-dPG)J*3b1OFrtsRowcktD-K+ zn8pu}$jv=B6g(T4H8>ypJgB7C+$YLxa_?w$;lA!}x%AxefYhW8tJrPEIfvZJW4>FH zm1&x@X)n>&2=T5U{ieaM_FL*Of`T#Mp(QU7p)%%&2IDZbdyZs<1N zyxUrSVNdnE!%K`Rd%bs>j#Qpm)sh6;Pz78u`uWe)a8gN<>=$qNzM-|5>qqa|KdiHc zp>EHn`stXAGkjfkL<+ys{eI3wxXb0;b4{&tjAp4X;Wz3l2>T?SWi{PZBNk=Cbw$%U_j@m0h}TZwUYTqhH3^Tj!Wt?L@8*2t51?A+y8r*GLlPRT!e?{2JOf0@#AHB>Zcij|tCw&s5FYA4O3|G^LTt6kz`ZHGT_qHo!c@--MOa79EMOiI5Ae z*@aOq@Mdq*bhl%F0ji(Y$2r8=u$z_)>dFIwh@O$f%ZE(QIb>CoR9%oqTwFS(E0r~2 z`+A(EPc2S3C3;}{`tYv}5W&w)DMWSawy^!j2E3MsHP%}s8K(Bzk6Wfq=~_Mx8P1uV zsPq^o>M~Sn%k_-T{OFKso1UN zQM}@zElJGetV9@euixOfCBo2F6zj0kz;{HisiT9{>A!3uj+0<9(74*?PXC&|GkT{x z7KNEi=^rRRR2a_*6!fzkX_6rKI4uP&$?Vf*mPDS_1X&_*RgC#yln#6{qdXIRnZIA z4$rCMEdDFnYR}~SGo78KflCtR*3~^rxIRx_ug54REw`0i3cL~Ht~)IHgPk5fGJ7aS znUOR+@Q2PtPGlRUq0tGqqV!2he%hRY)Ev5=*^M!>7)nkYa%sDw52`vE_bXf|!}10K+mu z!uc6Ve3}5|;|=#z(;)&0r~;5`NwQQ)S9_tfymY9pF=J6kEku>%g^FT_BK>3v5J|$2 zFgUcoTAWHidBc&O3W1Q$VFb)jKrJs+f=VT)W3g#zX_z!3My3#9@iZC@iz8qO1T=&| zE7PSaK#i6voi!BG91Kv&SBT{*u}q58Z~{D8ipmRxg8Gqf=O>Y~+3)D3${7_PJ+Nv( zj>TheScwGtp@&lCp9+!8Oz3Ytl;P0TjOBnzS&D)W`lo_YmGg%b0{%OHd5R)g8;*dF z1(QJu1XV(#;y)TPki`yt=b@26B$mjvUXa)yAys1Gd$B&6o2Ew_&W96$+~4tjgnk>l z77U@-Y&t{6Pti<|#qdID#-|Hpe6fJ8tgm?>CP)@*yO2n2;?e>B^dL$g z6%=R(g8Zht_z8ei1VTG}CZ*om#ecJ0Gzv(@Qw1JqGQjgdllYLvfDjO(J@_~h$wTNt zgQWkMT`3c)(f|eMD}o}0qJdIK8x7KBMoia_@o5R5MkyQtkH(SE1X4JjLMPzqBpM1k z6D(G6jcUaBnrIGL-{LQSxKR5zJ{dtg2()Y7m zpXK@_1wIMFyvoZ7~Zw=*b< tw>B~QwJ_T-7>S(4!S8}0lXaaaFqnH=^e+*NQ;rZC#_|tg99Xg3j9Hh@&EqUA5s%2VrH0YF+Fpl-(pRmat2RVKbLh*2~7Zaj3H$J diff --git a/graphics/field_effects/pics/shadow_large.png b/graphics/field_effects/pics/shadow_large.png index e917823b05cd96f64884877479f9c8df82d73483..1695208af543eee620304317dd419295cbe6d44a 100644 GIT binary patch literal 4911 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 delta 86 zcmbQQ+Rr#adGbF&MenHYy#j_oTb3kM7du*7O8o!-pMilvHh11}ASLDL;uyj)GdbY^ p^N;_`2iY}vlm50dwQ%_GG92cTe|U0_SQ$_igQu&X%Q~loCID}b9-#mL diff --git a/graphics/field_effects/pics/shadow_small.png b/graphics/field_effects/pics/shadow_small.png index f5feada2b96633ca74e5281fa01fa7fd59aff536..6cd37c5f23a54d2ea919da42888fa1bb2f98384a 100644 GIT binary patch literal 4807 zcmeHKX;c&05)P{fxFX8{Y7C+%c9ITFAQ5B3%M9uqL`6XuKv@Ps!Id+D3o0VwL!TS(CZNKZ`Qtfn{+V++-CeiptE#W+R&p~# z<_3;1wKXM?NF%sGetd8@(O!lI;F~$=U=fLAz)1=XSMgCbS)r7RaS29NB`Pp7roqJ| zlIB+Dj>XCuQ_a&`Bm8%yP4*VBkex@Lk+0T|O0AB3*0$V(#?3usi~7v=-5dSv?a~z^ zUk{tmE1~+G$)5jG<2!PfneoHdhmYl@gn#&$L#R%wn+-XRTa?G=ykz$9%?Web?zo0WIPPrTkK^<+ii>O-;L;Vouy2 z-?HXr?61K)rWlJYHAag{1p6Pj(bU_`H`$?%78}NtM7y0+pPn~jBRo5=>h^Z$@`|1i z@&>M~H{6Jf)UmUiOJkB#riAI07G0CHM0eko3D&EcZX9!n*k@$s(Eh`XpxY>E+N!Q~ z(IFixQz)6)RnDizPTFid%P3uvw{e7tQ-EyUw$(xU_H7+@txm_!*e8ay)#S^1-T;W>(pS-BT8~+~2{xE4jM(h|^x%Wyg*za}6V)jeC$g7Lcp- zhSE8g9egBXLh_Sa#~&>*4whD#IBY^xEma32o2oj)_uhKi^f>>I^-Yll)~+c>lXmY* z%q_1rFLxik?&;*TRS&Cc?ABhA9oSQoBF@RGTF02{zHtgX+C0~NWO2&}&ht%s%>D|z z^Jem+DaGn7gvH&d?RjTYy^q%}-SeaZ^6jyy%TFrpe(D&3a?Zw&IG^70sMD-tNz|L$ zf66(1aU6rNGF#cTTABFnhr*X9>uzR0AKx&i82k#IxRbv+-_=aC|3Isdk=Q` z_q5-+aM->tIeke@eO&cN=9%W{?!F*94oUp>6 z@?d3qTPk%8iKMp%=Ws%}9L}fh1U6Al>Q>L7%ii`COTF?b+gB}gy1!*VJ7Tou^6cqW zrM|fH=_k?34r>Gt;z!yWHLqGdas7f})-h4zBaM7s7?ju6avS`E-!J9Ij%h1h?se~O z@|_C?=WD0WH}5mtS8ynAZu#2C9~PLLFWYRAKDsQe${gAiQBxM5a`*D(=5sdnO0Ul{TyB(SxGg{quN_t<`{F=wBx5&s` z%eS5#Rdc1-*Mn!j-E#ZO3#<&RZgI}`Ww~d%s+Zc#C~*GnM5Dcr{_G%%k>1!R1^Y}b z;6)4g=J~kS^ZOHj|1eF-Z9kf}RjB9cG+OHQX5#zjH=O43*xXY0KYIib6AyYvTgST2 zc>1oTaM9GXuJ4NYGe0h}`02ys3k?ki0=;AHii)1cUYnpeYv7lMd~YqS4s2XJL%%EL z6)!RRh1KK5L{eN=+bg{)e%MvFOQnH6`@Vd8aSHcRfh&E+z2``EY#-0rh z##=aV4qGUfQc;myfKfG41sH!Ml82W@fePa=6-ykuLO;c5%PGY5c5yKWGaWj5F+7cdquob zqDx04q+t?F3RDT;6&~U;kjo4CY@wwf2A3*yR)FjwnkroUg{&d5X;*aV3=RaCf5si6 z{V8{yGSK4j*nVv z5>JXYD6-a4*WhH2{;~w&1kgy-_WVHC&&QVczx8hd39efrlXZ>DMuq)O2s8l`=^O#O z{v}~7DvQCu4j*W#PjdVp$^}X+bY(EzAQ6U%AViG8kUJs}K$x40J1PVTqPqw5=8U&X*zDSzv( zZ*+YX17D^5t-JnjbeVoR?qD+T4@eCTGl>DswcsE`51A9{PgLahT|eDdk$o?lNcQpR z%Rha6S@L=xes)DKP#F#LPv;Ag2_F{ArmwFLNDfT0eg$rNg4uz7q;*E)gTTvhMNkAm zBAHoeFFn%k92+1UrsDGahdnT~u^eZ{{cA@I5ZQA5d_ql{h0)#yITmS}hc&~^T~?CH b^fUEHVTHpW%-ixOphe>P&-FXu8@=j(7?>nJ delta 86 zcmX@E+Rr#ad9s?2qIXpHUID|PElZNBiybX3CI0{a&%nSSn>+6~kdpFraSY*@nVjIj p{71gw$N&HQJpUUR4l#8yGECy*{>oQV+zwR5;OXk;vd$@?2>?w89&P{t diff --git a/graphics/weather/fog.pal b/graphics/weather/fog.pal index 6191b66928..1f40dd4e74 100644 --- a/graphics/weather/fog.pal +++ b/graphics/weather/fog.pal @@ -10,7 +10,7 @@ JASC-PAL 213 213 213 222 222 222 164 164 164 -255 0 255 +0 0 0 255 0 255 255 0 255 180 180 180 diff --git a/src/data/field_effects/field_effect_objects.h b/src/data/field_effects/field_effect_objects.h index 516ade7cbe..2fd33a4cb1 100755 --- a/src/data/field_effects/field_effect_objects.h +++ b/src/data/field_effects/field_effect_objects.h @@ -32,13 +32,13 @@ const struct SpriteFrameImage gFieldEffectObjectPicTable_BallLight[] = { obj_frame_tiles(gFieldEffectObjectPic_BallLight), }; -const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, &gObjectEventBaseOam_8x8, sAnimTable_Shadow, sPicTable_ShadowSmall, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall = {0xFFFF, TAG_WEATHER_START, &gObjectEventBaseOam_8x8, sAnimTable_Shadow, sPicTable_ShadowSmall, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; -const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, &gObjectEventBaseOam_16x8, sAnimTable_Shadow, sPicTable_ShadowMedium, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium = {0xFFFF, TAG_WEATHER_START, &gObjectEventBaseOam_16x8, sAnimTable_Shadow, sPicTable_ShadowMedium, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; -const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, &gObjectEventBaseOam_32x8, sAnimTable_Shadow, sPicTable_ShadowLarge, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge = {0xFFFF, TAG_WEATHER_START, &gObjectEventBaseOam_32x8, sAnimTable_Shadow, sPicTable_ShadowLarge, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; -const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, &gObjectEventBaseOam_64x32, sAnimTable_Shadow, sPicTable_ShadowExtraLarge, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge = {0xFFFF, TAG_WEATHER_START, &gObjectEventBaseOam_64x32, sAnimTable_Shadow, sPicTable_ShadowExtraLarge, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; const struct SpriteTemplate gFieldEffectObjectTemplate_BallLight = {0xFFFF, OBJ_EVENT_PAL_TAG_LIGHT, &gObjectEventBaseOam_32x32, sAnimTable_Inanimate, gFieldEffectObjectPicTable_BallLight, gDummySpriteAffineAnimTable, UpdateLightSprite}; diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index 36ca937b6a..da6c9601f2 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -7,11 +7,13 @@ #include "script.h" #include "constants/weather.h" #include "constants/songs.h" +#include "constants/rgb.h" #include "sound.h" #include "sprite.h" #include "task.h" #include "trig.h" #include "gpu_regs.h" +#include "palette.h" // EWRAM EWRAM_DATA static u8 gCurrentAbnormalWeather = 0; @@ -1372,6 +1374,9 @@ void FogHorizontal_Main(void); static void CreateFogHorizontalSprites(void); static void DestroyFogHorizontalSprites(void); +// Within the weather palette, shadow sprites' color index +#define SHADOW_COLOR_INDEX 9 + void FogHorizontal_InitVars(void) { gWeatherPtr->initStep = 0; @@ -1385,7 +1390,7 @@ void FogHorizontal_InitVars(void) gWeatherPtr->fogHScrollPosX = 0; Weather_SetBlendCoeffs(0, 16); } - gWeatherPtr->noShadows = TRUE; // TODO: Can fog be made compatible with shadows? + gWeatherPtr->noShadows = FALSE; } void FogHorizontal_InitAll(void) @@ -1407,9 +1412,14 @@ void FogHorizontal_Main(void) { case 0: CreateFogHorizontalSprites(); - if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) - Weather_SetTargetBlendCoeffs(12, 8, 3); - else + if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) { + u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); + Weather_SetTargetBlendCoeffs(12, 8, 3); + if (paletteNum != 0xFF) { // Lighten shadow color to match + u16 index = (paletteNum+16)*16+SHADOW_COLOR_INDEX; // Shadow color index + gPlttBufferUnfaded[index] = gPlttBufferFaded[index] = 0x3DEF; // Gray + } + } else Weather_SetTargetBlendCoeffs(4, 16, 0); gWeatherPtr->initStep++; break; @@ -1425,6 +1435,7 @@ void FogHorizontal_Main(void) bool8 FogHorizontal_Finish(void) { + u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); gWeatherPtr->fogHScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->fogHScrollOffset) & 0xFF; if (++gWeatherPtr->fogHScrollCounter > 3) { @@ -1447,6 +1458,10 @@ bool8 FogHorizontal_Finish(void) gWeatherPtr->finishStep++; break; default: + if (paletteNum != 0xFF) { // Change shadow color back to black + u16 index = (paletteNum+16)*16+SHADOW_COLOR_INDEX; + gPlttBufferUnfaded[index] = gPlttBufferFaded[index] = RGB_BLACK; + } return FALSE; } return TRUE; From c3fdaca8e262a83b1238f6931b737d4c7201bf2d Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sat, 24 Apr 2021 18:10:37 -0400 Subject: [PATCH 041/145] Fixed sandstorm shadow color. --- src/field_weather_effect.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index da6c9601f2..bda62fcf06 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -1377,6 +1377,17 @@ static void DestroyFogHorizontalSprites(void); // Within the weather palette, shadow sprites' color index #define SHADOW_COLOR_INDEX 9 +// Updates just the color of shadows to match special weather blending +static u8 UpdateShadowColor(u16 color) { + u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); + if (paletteNum != 0xFF) { + u16 index = (paletteNum+16)*16+SHADOW_COLOR_INDEX; + gPlttBufferUnfaded[index] = gPlttBufferFaded[index] = color; + UpdateSpritePaletteWithTime(paletteNum); + } + return paletteNum; +} + void FogHorizontal_InitVars(void) { gWeatherPtr->initStep = 0; @@ -1415,10 +1426,7 @@ void FogHorizontal_Main(void) if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) { u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); Weather_SetTargetBlendCoeffs(12, 8, 3); - if (paletteNum != 0xFF) { // Lighten shadow color to match - u16 index = (paletteNum+16)*16+SHADOW_COLOR_INDEX; // Shadow color index - gPlttBufferUnfaded[index] = gPlttBufferFaded[index] = 0x3DEF; // Gray - } + UpdateShadowColor(0x3DEF); // Gray } else Weather_SetTargetBlendCoeffs(4, 16, 0); gWeatherPtr->initStep++; @@ -1435,7 +1443,6 @@ void FogHorizontal_Main(void) bool8 FogHorizontal_Finish(void) { - u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); gWeatherPtr->fogHScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->fogHScrollOffset) & 0xFF; if (++gWeatherPtr->fogHScrollCounter > 3) { @@ -1458,10 +1465,7 @@ bool8 FogHorizontal_Finish(void) gWeatherPtr->finishStep++; break; default: - if (paletteNum != 0xFF) { // Change shadow color back to black - u16 index = (paletteNum+16)*16+SHADOW_COLOR_INDEX; - gPlttBufferUnfaded[index] = gPlttBufferFaded[index] = RGB_BLACK; - } + UpdateShadowColor(RGB_BLACK); return FALSE; } return TRUE; @@ -1986,7 +1990,7 @@ void Sandstorm_InitVars(void) Weather_SetBlendCoeffs(0, 16); } - gWeatherPtr->noShadows = TRUE; // TODO: Can sandstorm be compatible with shadows? + gWeatherPtr->noShadows = FALSE; } void Sandstorm_InitAll(void) @@ -2011,7 +2015,8 @@ void Sandstorm_Main(void) gWeatherPtr->initStep++; break; case 1: - Weather_SetTargetBlendCoeffs(16, 0, 0); + Weather_SetTargetBlendCoeffs(16, 2, 0); + UpdateShadowColor(0x3DEF); gWeatherPtr->initStep++; break; case 2: @@ -2037,9 +2042,12 @@ bool8 Sandstorm_Finish(void) case 1: if (Weather_UpdateBlend()) gWeatherPtr->finishStep++; + if (gWeatherPtr->currBlendEVB == 12) + UpdateShadowColor(RGB_BLACK); break; case 2: DestroySandstormSprites(); + UpdateShadowColor(RGB_BLACK); gWeatherPtr->finishStep++; break; default: From 37d0e17be491625384ba738acaa135b9e9f71a60 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sat, 24 Apr 2021 21:21:01 -0400 Subject: [PATCH 042/145] Fixed shadow hot springs bug. --- data/layouts/LavaridgeTown/map.bin | Bin 800 -> 800 bytes data/maps/LavaridgeTown/map.json | 2 +- src/event_object_movement.c | 2 +- src/field_effect_helpers.c | 1 + 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/data/layouts/LavaridgeTown/map.bin b/data/layouts/LavaridgeTown/map.bin index 604ad5f3f8edd6f7246a0ca3d812c03b7b29d586..a001f8cd388fcc5955ce09b8526760cb100b9c5d 100644 GIT binary patch delta 15 XcmZ3$wt#KI3YNu2i;Xs}DPaNtFarh# delta 15 WcmZ3$wt#KI3Km&oS>ugsN|*pBy9E3I diff --git a/data/maps/LavaridgeTown/map.json b/data/maps/LavaridgeTown/map.json index 54bda6ca32..29b1d2d33f 100644 --- a/data/maps/LavaridgeTown/map.json +++ b/data/maps/LavaridgeTown/map.json @@ -77,7 +77,7 @@ "x": 4, "y": 4, "elevation": 3, - "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT", + "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 939ff3ca6d..635659fb03 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -8862,7 +8862,7 @@ static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite * for (i = 0; i < ARRAY_COUNT(sGroundEffectFuncs); i++, flags >>= 1) if (flags & 1) sGroundEffectFuncs[i](objEvent, sprite); - if (!gWeatherPtr->noShadows) + if (!(gWeatherPtr->noShadows || objEvent->inHotSprings)) GroundEffect_Shadow(objEvent, sprite); } diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index ed5ffecd62..4304230391 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -349,6 +349,7 @@ void UpdateShadowFieldEffect(struct Sprite *sprite) sprite->invisible = linkedSprite->invisible; if (!objectEvent->active || objectEvent->noShadow + || objectEvent->inHotSprings || gWeatherPtr->noShadows || MetatileBehavior_IsPokeGrass(objectEvent->currentMetatileBehavior) || MetatileBehavior_IsSurfableWaterOrUnderwater(objectEvent->currentMetatileBehavior) From 4a5dbcb52ba695376986363a03808f4b42a6c8d2 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sun, 25 Apr 2021 00:56:23 -0400 Subject: [PATCH 043/145] Testing updating sprite palettes with weather + time. --- src/field_effect.c | 2 +- src/field_effect_helpers.c | 2 -- src/field_weather.c | 15 +++++++++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/field_effect.c b/src/field_effect.c index 967e3d2398..ad6bdd747a 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -770,8 +770,8 @@ void FieldEffectScript_LoadFadedPalette(u8 **script) { struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); LoadSpritePalette(palette); - UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag)); UpdateSpritePaletteWithTime(IndexOfSpritePaletteTag(palette->tag)); // Ensure field effects are blended + UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag)); (*script) += 4; } diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 4304230391..8c3cf5bb1c 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -152,7 +152,6 @@ static void LoadObjectRegularReflectionPalette(struct ObjectEvent *objectEvent, } paletteNum = LoadSpritePalette(&filteredPalette); UpdateSpritePaletteWithWeather(paletteNum); - UpdateSpritePaletteWithTime(paletteNum); } sprite->oam.paletteNum = paletteNum; sprite->oam.objMode = 1; // Alpha blending @@ -205,7 +204,6 @@ static void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite) } paletteNum = LoadSpritePalette(&filteredPalette); UpdateSpritePaletteWithWeather(paletteNum); - UpdateSpritePaletteWithTime(paletteNum); } reflectionSprite->oam.paletteNum = paletteNum; } diff --git a/src/field_weather.c b/src/field_weather.c index bbc7506e32..d4444a098d 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -536,8 +536,13 @@ static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) } else { - // No palette blending. + u32 palettes = 0; + u32 mask = 1 << startPalIndex; + u8 i; CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16)); + for (i = 0; i < numPalettes; i++, mask <<= 1) + palettes |= mask; + UpdatePalettesWithTime(palettes); } } @@ -825,7 +830,6 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) { u16 paletteIndex = 16 + spritePaletteIndex; u16 i; - switch (gWeatherPtr->palProcessingState) { case WEATHER_PAL_STATE_SCREEN_FADING_IN: @@ -853,7 +857,10 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) else { paletteIndex *= 16; - BlendPalette(paletteIndex, 16, 12, RGB(28, 31, 28)); + // First blend with time + CpuFastCopy(gPlttBufferUnfaded + paletteIndex, gPlttBufferFaded + paletteIndex, 32); + UpdateSpritePaletteWithTime(spritePaletteIndex); + BlendPalettesFine(1 << (spritePaletteIndex + 16), gPlttBufferFaded + paletteIndex, gPlttBufferFaded + paletteIndex, 12, RGB(28, 31, 28)); } break; } @@ -876,8 +883,8 @@ static bool8 IsFirstFrameOfWeatherFadeIn(void) void LoadCustomWeatherSpritePalette(const u16 *palette) { LoadPalette(palette, 0x100 + gWeatherPtr->weatherPicSpritePalIndex * 16, 32); - UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex); UpdateSpritePaletteWithTime(gWeatherPtr->weatherPicSpritePalIndex); + UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex); } static void LoadDroughtWeatherPalette(u8 *gammaIndexPtr, u8 *a1) From 147e101df516cb9eeee81bbbe5e763bbd8e2637b Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sun, 25 Apr 2021 17:00:07 -0400 Subject: [PATCH 044/145] More testing of fog blending. --- include/field_weather.h | 2 +- src/event_object_movement.c | 6 ++--- src/faraway_island.c | 2 +- src/field_effect.c | 3 +-- src/field_effect_helpers.c | 6 ++--- src/field_weather.c | 53 ++++++++++++++++++++++--------------- src/field_weather_effect.c | 7 +++++ src/overworld.c | 31 +++++++++------------- 8 files changed, 61 insertions(+), 49 deletions(-) diff --git a/include/field_weather.h b/include/field_weather.h index c462707f9d..ce1a91c4c7 100644 --- a/include/field_weather.h +++ b/include/field_weather.h @@ -151,7 +151,7 @@ void ApplyWeatherGammaShiftIfIdle(s8 gammaIndex); void sub_80ABC7C(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay); void FadeScreen(u8 mode, s8 delay); bool8 IsWeatherNotFadingIn(void); -void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex); +void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog); void ApplyWeatherGammaShiftToPal(u8 paletteIndex); void LoadCustomWeatherSpritePalette(const u16 *palette); void ResetDroughtWeatherPaletteLoading(void); diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 635659fb03..76fc26d055 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1684,7 +1684,7 @@ static void FollowerSetGraphics(struct ObjectEvent *objectEvent, u16 species, u8 if (palette[0] & 0x4000) // If color 15 is blended, use it as the alternate color palette[15] |= 0x8000; } - UpdateSpritePaletteWithTime(sprite->oam.paletteNum); + UpdateSpritePaletteWithWeather(sprite->oam.paletteNum, FALSE); } else sprite->oam.paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present } @@ -2186,7 +2186,7 @@ static u8 UpdateSpritePalette(const struct SpritePalette * spritePalette, struct sprite->inUse = TRUE; if (IndexOfSpritePaletteTag(spritePalette->tag) == 0xFF) { sprite->oam.paletteNum = LoadSpritePalette(spritePalette); - UpdateSpritePaletteWithTime(sprite->oam.paletteNum); + UpdateSpritePaletteWithWeather(sprite->oam.paletteNum, FALSE); } else { sprite->oam.paletteNum = LoadSpritePalette(spritePalette); } @@ -2443,7 +2443,7 @@ static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *spritePalette if (IndexOfSpritePaletteTag(spritePalette->tag) != 0xFF) return 0xFF; paletteNum = LoadSpritePalette(spritePalette); - UpdateSpritePaletteWithTime(paletteNum); + UpdateSpritePaletteWithWeather(paletteNum, FALSE); return paletteNum; } diff --git a/src/faraway_island.c b/src/faraway_island.c index bc08146523..28c5bcf787 100755 --- a/src/faraway_island.c +++ b/src/faraway_island.c @@ -393,7 +393,7 @@ void SetMewAboveGrass(void) gSprites[mew->spriteId].subpriority = 1; LoadSpritePalette(&gSpritePalette_GeneralFieldEffect1); - UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(gSpritePalette_GeneralFieldEffect1.tag)); + UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(gSpritePalette_GeneralFieldEffect1.tag), FALSE); x = mew->currentCoords.x; y = mew->currentCoords.y; diff --git a/src/field_effect.c b/src/field_effect.c index ad6bdd747a..4ef5ea4970 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -770,8 +770,7 @@ void FieldEffectScript_LoadFadedPalette(u8 **script) { struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); LoadSpritePalette(palette); - UpdateSpritePaletteWithTime(IndexOfSpritePaletteTag(palette->tag)); // Ensure field effects are blended - UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag)); + UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag), FALSE); (*script) += 4; } diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 8c3cf5bb1c..389a3dce63 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -151,7 +151,7 @@ static void LoadObjectRegularReflectionPalette(struct ObjectEvent *objectEvent, ApplyIceFilter(mainSprite->oam.paletteNum, filteredData); } paletteNum = LoadSpritePalette(&filteredPalette); - UpdateSpritePaletteWithWeather(paletteNum); + UpdateSpritePaletteWithWeather(paletteNum, TRUE); } sprite->oam.paletteNum = paletteNum; sprite->oam.objMode = 1; // Alpha blending @@ -170,7 +170,7 @@ static void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent *objectEven blueData[i] = 0x55c9; } sprite->oam.paletteNum = LoadSpritePalette(&bluePalette); - UpdateSpritePaletteWithWeather(sprite->oam.paletteNum); + UpdateSpritePaletteWithWeather(sprite->oam.paletteNum, TRUE); } static void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite) @@ -203,7 +203,7 @@ static void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite) ApplyIceFilter(mainSprite->oam.paletteNum, filteredData); } paletteNum = LoadSpritePalette(&filteredPalette); - UpdateSpritePaletteWithWeather(paletteNum); + UpdateSpritePaletteWithWeather(paletteNum, TRUE); } reflectionSprite->oam.paletteNum = paletteNum; } diff --git a/src/field_weather.c b/src/field_weather.c index d4444a098d..aad85dfc61 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -536,13 +536,16 @@ static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) } else { - u32 palettes = 0; - u32 mask = 1 << startPalIndex; - u8 i; - CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16)); - for (i = 0; i < numPalettes; i++, mask <<= 1) - palettes |= mask; - UpdatePalettesWithTime(palettes); + if (MapHasNaturalLight(gMapHeader.mapType)) { // Time-blend + u32 palettes = 0; + u32 mask = 1 << startPalIndex; + u8 i; + for (i = 0; i < numPalettes; i++, mask <<= 1) + palettes |= mask; + UpdatePalettesWithTime(palettes); + } else { // copy + CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16)); + } } } @@ -653,7 +656,7 @@ static void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 bl } } -static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) // TODO: How does this interact with time +static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) // TODO: Optimize this with time blending { struct RGBColor color; u8 rBlend; @@ -661,7 +664,11 @@ static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) // TODO: How does this u8 bBlend; u16 curPalIndex; - BlendPalette(0, 256, blendCoeff, blendColor); + // First blend all palettes with time + CpuFastCopy(gPlttBufferUnfaded, gPlttBufferFaded, 0x400); + UpdatePalettesWithTime(PALETTES_ALL); + // Then blend tile palettes [0, 12] faded->faded + BlendPalettesFine(0x1FFF, gPlttBufferFaded, gPlttBufferFaded, blendCoeff, blendColor); color = *(struct RGBColor *)&blendColor; rBlend = color.r; gBlend = color.g; @@ -676,7 +683,7 @@ static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) // TODO: How does this while (palOffset < palEnd) { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + struct RGBColor color = *(struct RGBColor *)&gPlttBufferFaded[palOffset]; u8 r = color.r; u8 g = color.g; u8 b = color.b; @@ -695,7 +702,7 @@ static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) // TODO: How does this } else { - BlendPalette(curPalIndex * 16, 16, blendCoeff, blendColor); + BlendPalettesFine(1, gPlttBufferFaded + curPalIndex * 16, gPlttBufferFaded + curPalIndex * 16, blendCoeff, blendColor); } } } @@ -799,10 +806,10 @@ void FadeScreen(u8 mode, s8 delay) else { gWeatherPtr->fadeDestColor = fadeColor; + UpdateTimeOfDay(); if (useWeatherPal) gWeatherPtr->fadeScreenCounter = 0; // Triggers gamma-shift-based fade-in else { - UpdateTimeOfDay(); if (MapHasNaturalLight(gMapHeader.mapType)) { BeginTimeOfDayPaletteFade(PALETTES_ALL, delay, 16, 0, (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], @@ -826,7 +833,7 @@ bool8 IsWeatherNotFadingIn(void) return (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_IN); } -void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) +void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog) { u16 paletteIndex = 16 + spritePaletteIndex; u16 i; @@ -850,17 +857,22 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) // WEATHER_PAL_STATE_CHANGING_WEATHER // WEATHER_PAL_STATE_CHANGING_IDLE default: - if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) - { - ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); - } - else - { + if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) { + if (gWeatherPtr->gammaIndex) + ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); + else + UpdateSpritePaletteWithTime(spritePaletteIndex); + } else { // In horizontal fog, only specific palettes should be fog-blended + if (allowFog) { paletteIndex *= 16; // First blend with time CpuFastCopy(gPlttBufferUnfaded + paletteIndex, gPlttBufferFaded + paletteIndex, 32); UpdateSpritePaletteWithTime(spritePaletteIndex); + // Then blend faded->faded BlendPalettesFine(1 << (spritePaletteIndex + 16), gPlttBufferFaded + paletteIndex, gPlttBufferFaded + paletteIndex, 12, RGB(28, 31, 28)); + } else { // Otherwise, just time-blend the palette + UpdateSpritePaletteWithTime(spritePaletteIndex); + } } break; } @@ -883,8 +895,7 @@ static bool8 IsFirstFrameOfWeatherFadeIn(void) void LoadCustomWeatherSpritePalette(const u16 *palette) { LoadPalette(palette, 0x100 + gWeatherPtr->weatherPicSpritePalIndex * 16, 32); - UpdateSpritePaletteWithTime(gWeatherPtr->weatherPicSpritePalIndex); - UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex); + UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex, TRUE); } static void LoadDroughtWeatherPalette(u8 *gammaIndexPtr, u8 *a1) diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index bda62fcf06..e22f04b741 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -1380,10 +1380,17 @@ static void DestroyFogHorizontalSprites(void); // Updates just the color of shadows to match special weather blending static u8 UpdateShadowColor(u16 color) { u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); + u16 tempBuffer[16]; + u16 blendedColor; if (paletteNum != 0xFF) { u16 index = (paletteNum+16)*16+SHADOW_COLOR_INDEX; gPlttBufferUnfaded[index] = gPlttBufferFaded[index] = color; + // Copy to temporary buffer, blend, and keep just the shadow color index + CpuFastCopy(&gPlttBufferFaded[index-SHADOW_COLOR_INDEX], tempBuffer, 32); UpdateSpritePaletteWithTime(paletteNum); + blendedColor = gPlttBufferFaded[index]; + CpuFastCopy(tempBuffer, &gPlttBufferFaded[index-SHADOW_COLOR_INDEX], 32); + gPlttBufferFaded[index] = blendedColor; } return paletteNum; } diff --git a/src/overworld.c b/src/overworld.c index 5e4aa1a32f..a36e2ed551 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -821,7 +821,7 @@ void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum) CopySecondaryTilesetToVramUsingHeap(gMapHeader.mapLayout); LoadSecondaryTilesetPalette(gMapHeader.mapLayout); - for (paletteIndex = 6; paletteIndex < 13; paletteIndex++) + for (paletteIndex = 6; paletteIndex < 13; paletteIndex++) // TODO: Optimize gamma shifts ApplyWeatherGammaShiftToPal(paletteIndex); InitSecondaryTilesetAnimation(); @@ -829,7 +829,6 @@ void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum) RoamerMove(); DoCurrentWeather(); ResetFieldTasksArgs(); - UpdatePalettesWithTime(PALETTES_ALL); RunOnResumeMapScript(); if (gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER @@ -1512,19 +1511,6 @@ bool8 MapHasNaturalLight(u8 mapType) { // Whether a map type is naturally lit/ou || mapType == MAP_TYPE_OCEAN_ROUTE; } -// TODO: Rewrite palette fading to work with FadeScreen -// Currently, this cancels the "Normal" palette fade started by FadeScreen -static bool8 FadePalettesWithTime(void) { // Only used to fade back in - UpdateTimeOfDay(); - if (MapHasNaturalLight(gMapHeader.mapType)) { - ResetPaletteFade(); - BeginTimeOfDayPaletteFade(PALETTES_ALL, 0, 16, 0, - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], - currentTimeBlend.weight, 0); - } -} - void UpdatePalettesWithTime(u32 palettes) { if (MapHasNaturalLight(gMapHeader.mapType)) { u16 i; @@ -1546,7 +1532,18 @@ void UpdatePalettesWithTime(u32 palettes) { } u8 UpdateSpritePaletteWithTime(u8 paletteNum) { - UpdatePalettesWithTime(1 << (paletteNum + 16)); + if (MapHasNaturalLight(gMapHeader.mapType)) { + u16 offset; + if (GetSpritePaletteTagByPaletteNum(paletteNum) >> 15) + return paletteNum; + offset = (paletteNum + 16) * 16; + TimeMixPalettes(1, + gPlttBufferUnfaded + offset, + gPlttBufferFaded + offset, + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], + currentTimeBlend.weight); + } return paletteNum; } @@ -1688,7 +1685,6 @@ static void CB2_LoadMap2(void) DoMapLoadLoop(&gMain.state); SetFieldVBlankCallback(); SetMainCallback1(CB1_Overworld); - // FadePalettesWithTime(); SetMainCallback2(CB2_Overworld); } @@ -1745,7 +1741,6 @@ static void CB2_ReturnToFieldLocal(void) if (ReturnToFieldLocal(&gMain.state)) { SetFieldVBlankCallback(); - // FadePalettesWithTime(); SetMainCallback2(CB2_Overworld); } } From 39ba328afbef5f21a622dca0c3fc30f4247b07af Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sun, 25 Apr 2021 20:13:56 -0400 Subject: [PATCH 045/145] Optimized follower palette loading. --- .../object_event_graphics_info.h | 2 +- src/event_object_movement.c | 50 +++++++++---------- src/overworld.c | 7 +-- 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/data/object_events/object_event_graphics_info.h b/src/data/object_events/object_event_graphics_info.h index dc96762604..9dad1424fb 100755 --- a/src/data/object_events/object_event_graphics_info.h +++ b/src/data/object_events/object_event_graphics_info.h @@ -244,7 +244,7 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RubySapphireMay = const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lugia = {0xFFFF, OBJ_EVENT_PAL_TAG_LUGIA, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_LugiaOld, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HoOh = {0xFFFF, OBJ_EVENT_PAL_TAG_HO_OH, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_HoOh, sPicTable_HoOhOld, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_AnimatedBall = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Following, sPicTable_AnimatedBall, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Follower = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Togetic, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Follower = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Togetic, gDummySpriteAffineAnimTable}; // Species-indexed pokemon object event table const struct ObjectEventGraphicsInfo gPokemonObjectGraphics[] = { diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 76fc26d055..299425562d 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -152,7 +152,7 @@ static bool8 AnimateSpriteInFigure8(struct Sprite *sprite); static void UpdateObjectEventSprite(struct Sprite *); u8 GetDirectionToFace(s16 x1, s16 y1, s16 x2, s16 y2); -static void FollowerSetGraphics(struct ObjectEvent *, u16, u8, bool8); +static void FollowerSetGraphics(struct ObjectEvent *, u16, u8, bool8, bool8); static void ObjectEventSetGraphics(struct ObjectEvent *, const struct ObjectEventGraphicsInfo *); static void DoShadowFieldEffect(struct ObjectEvent *); static void SetJumpSpriteData(struct Sprite *, u8, u8, u8); @@ -1477,7 +1477,7 @@ TrySpawnObjectEventTemplate(struct ObjectEventTemplate *objectEventTemplate, species = gObjectEvents[objectEventId].extra.mon.species; form = gObjectEvents[objectEventId].extra.mon.form; shiny = gObjectEvents[objectEventId].extra.mon.shiny; - FollowerSetGraphics(&gObjectEvents[objectEventId], species, form, shiny); + FollowerSetGraphics(&gObjectEvents[objectEventId], species, form, shiny, TRUE); } } @@ -1652,16 +1652,17 @@ static const struct ObjectEventGraphicsInfo * SpeciesToGraphicsInfo(u16 species, } // Set graphics & sprite for a follower object event by species & shininess. -static void FollowerSetGraphics(struct ObjectEvent *objectEvent, u16 species, u8 form, bool8 shiny) { +static void FollowerSetGraphics(struct ObjectEvent *objEvent, u16 species, u8 form, bool8 shiny, bool8 doPalette) { const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, form); - objectEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; - ObjectEventSetGraphics(objectEvent, graphicsInfo); - objectEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; - objectEvent->extra.mon.species = species; - objectEvent->extra.mon.form = form; - objectEvent->extra.mon.shiny = shiny; - if (graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) { // Use palette from species palette table - struct Sprite *sprite = &gSprites[objectEvent->spriteId]; + objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; + ObjectEventSetGraphics(objEvent, graphicsInfo); + objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; + objEvent->extra.mon.species = species; + objEvent->extra.mon.form = form; + objEvent->extra.mon.shiny = shiny; + if (graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC && doPalette) { // Use palette from species palette table + u8 paletteNum; + struct Sprite *sprite = &gSprites[objEvent->spriteId]; // Note that the shiny palette tag is `species + SPECIES_SHINY_TAG`, which must be increased with more pokemon // so that palette tags do not overlap const struct CompressedSpritePalette *spritePalette = &(shiny ? gMonShinyPaletteTable : gMonPaletteTable)[species]; @@ -1669,24 +1670,19 @@ static void FollowerSetGraphics(struct ObjectEvent *objectEvent, u16 species, u8 sprite->inUse = FALSE; FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); sprite->inUse = TRUE; - if (IndexOfSpritePaletteTag(spritePalette->tag) == 0xFF) { // Load compressed palette + if ((paletteNum = IndexOfSpritePaletteTag(spritePalette->tag)) == 0xFF) { // Load compressed palette LoadCompressedSpritePalette(spritePalette); - sprite->oam.paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present + sprite->oam.paletteNum = paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present if (species == SPECIES_AMPHAROS) { // palette should be light-blended TODO: Add more glowing pokemon - // CHARIZARD_LINE ? - // CHINCHOU & LANTERN - // FLAAFY, MAREEP - // UMBREON - // VOLBEAT ? - // REGIS ? - u16 * palette = &gPlttBufferUnfaded[(sprite->oam.paletteNum+16)*16]; + // CHARIZARD LINE ? CHINCHOU LANTERN FLAAFY MAREEP UMBREON VOLBEAT ? + u16 * palette = &gPlttBufferUnfaded[(paletteNum+16)*16]; palette[0] |= 0x8000; if (palette[0] & 0x4000) // If color 15 is blended, use it as the alternate color palette[15] |= 0x8000; } - UpdateSpritePaletteWithWeather(sprite->oam.paletteNum, FALSE); + UpdateSpritePaletteWithWeather(paletteNum, FALSE); } else - sprite->oam.paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present + sprite->oam.paletteNum = paletteNum; } } @@ -1717,7 +1713,7 @@ void UpdateFollowingPokemon(void) { // Update following pokemon if any MoveObjectEventToMapCoords(objEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); objEvent->invisible = TRUE; } - FollowerSetGraphics(objEvent, species, 0, shiny); + FollowerSetGraphics(objEvent, species, 0, shiny, TRUE); sprite->data[6] = 0; // set animation data objEvent->extra.mon.species = species; objEvent->extra.mon.shiny = shiny; @@ -2147,7 +2143,7 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) sprite->sObjEventId = objectEventId; objectEvent->spriteId = i; if (objectEvent->graphicsId == OBJ_EVENT_GFX_OW_MON) { // Set pokemon graphics - FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny); + FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny, TRUE); } if (!objectEvent->inanimate && objectEvent->movementType != MOVEMENT_TYPE_PLAYER) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection)); @@ -6494,11 +6490,11 @@ bool8 MovementAction_ExitPokeball_Step1(struct ObjectEvent *objectEvent, struct return TRUE; // Restore graphicsId and set palette to white } else if ((duration == 0 && sprite->data[3] == 3) || (duration == 1 && sprite->data[3] == 7)) { - FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny); + FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny, FALSE); LoadWhiteFlashPalette(objectEvent, sprite); // Restore original palette } else if ((duration == 0 && sprite->data[3] == 1) || (duration == 1 && sprite->data[3] == 3)) { - FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny); + FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny, TRUE); } return FALSE; } @@ -6526,7 +6522,7 @@ bool8 MovementAction_EnterPokeball_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_EnterPokeball_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny); + FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny, FALSE); objectEvent->invisible = TRUE; sprite->data[1] = 0; sprite->data[6] = 0; diff --git a/src/overworld.c b/src/overworld.c index a36e2ed551..c667026676 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1515,9 +1515,10 @@ void UpdatePalettesWithTime(u32 palettes) { if (MapHasNaturalLight(gMapHeader.mapType)) { u16 i; u16 tempPaletteBuffer[16]; - for (i = 0; i < 16; i++) { + u32 mask = 1 << 16; + for (i = 0; i < 16; i++, mask <<= 1) { if (GetSpritePaletteTagByPaletteNum(i) >> 15) // Don't blend special sprite palette tags - palettes &= ~(1 << (i + 16)); + palettes &= ~(mask); } palettes &= 0xFFFF1FFF; // Don't blend tile palettes [13,15] if (!palettes) @@ -1536,7 +1537,7 @@ u8 UpdateSpritePaletteWithTime(u8 paletteNum) { u16 offset; if (GetSpritePaletteTagByPaletteNum(paletteNum) >> 15) return paletteNum; - offset = (paletteNum + 16) * 16; + offset = (paletteNum + 16) << 4; TimeMixPalettes(1, gPlttBufferUnfaded + offset, gPlttBufferFaded + offset, From 74a90889ace827e1f33769a32176f381e8eaf771 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sun, 25 Apr 2021 22:38:31 -0400 Subject: [PATCH 046/145] Fixed rain fade-in. --- src/field_weather.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/field_weather.c b/src/field_weather.c index aad85dfc61..1f275a3df6 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -566,11 +566,12 @@ static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaI while (curPalIndex < numPalettes) { + CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); UpdatePalettesWithTime(1 << (palOffset >> 4)); // Apply TOD blend if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { // No gamma shift. Simply blend the colors. - BlendPalettesFine(1 << (palOffset >> 4), gPlttBufferFaded, gPlttBufferFaded, blendCoeff, blendColor); + BlendPalettesFine(1, gPlttBufferFaded + palOffset, gPlttBufferFaded + palOffset, blendCoeff, blendColor); palOffset += 16; } else From 7d8e63a44b8a7654055cf564971fd744b5e87d7d Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sun, 25 Apr 2021 23:50:29 -0400 Subject: [PATCH 047/145] Reverted 42d5fe07f and fixed rain/thunder gamma. --- src/field_weather.c | 24 ++++++++++++++---------- src/field_weather_effect.c | 8 +++----- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/field_weather.c b/src/field_weather.c index 1f275a3df6..205b4f7f22 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -468,19 +468,23 @@ static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) { gammaIndex--; palOffset = startPalIndex * 16; + CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 32 * numPalettes); numPalettes += startPalIndex; + // Thunder gamma-shift looks bad on night-blended palettes, so ignore time blending in some situations + if (!(gammaIndex > 3 && gWeatherPtr->currWeather == WEATHER_RAIN_THUNDERSTORM)) { + // Create the palette mask + u32 palettes = PALETTES_ALL; + palettes = (palettes >> startPalIndex) << startPalIndex; + palettes = (palettes << (32-numPalettes)) >> (32-numPalettes); + UpdatePalettesWithTime(palettes); + } curPalIndex = startPalIndex; - // Loop through the speficied palette range and apply necessary gamma shifts to the colors. - // TODO: Optimize this to work with time blending while (curPalIndex < numPalettes) { - CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); - UpdatePalettesWithTime(1 << (palOffset >> 4)); if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { // No palette change. - // CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); palOffset += 16; } else @@ -537,11 +541,11 @@ static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) else { if (MapHasNaturalLight(gMapHeader.mapType)) { // Time-blend - u32 palettes = 0; - u32 mask = 1 << startPalIndex; - u8 i; - for (i = 0; i < numPalettes; i++, mask <<= 1) - palettes |= mask; + // Create the palette mask + u32 palettes = PALETTES_ALL; + numPalettes += startPalIndex; + palettes = (palettes >> startPalIndex) << startPalIndex; + palettes = (palettes << (32-numPalettes)) >> (32-numPalettes); UpdatePalettesWithTime(palettes); } else { // copy CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16)); diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index e22f04b741..dad6490317 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -483,7 +483,7 @@ void Rain_InitVars(void) gWeatherPtr->rainSpriteVisibleDelay = 8; gWeatherPtr->isDownpour = FALSE; gWeatherPtr->targetRainSpriteCount = 10; - gWeatherPtr->gammaTargetIndex = gTimeOfDay == TIME_OF_DAY_DAY ? 3 : 0; + gWeatherPtr->gammaTargetIndex = 3; gWeatherPtr->gammaStepDelay = 20; SetRainStrengthFromSoundEffect(SE_RAIN); Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness @@ -1053,7 +1053,7 @@ void Thunderstorm_InitVars(void) gWeatherPtr->rainSpriteVisibleDelay = 4; gWeatherPtr->isDownpour = FALSE; gWeatherPtr->targetRainSpriteCount = 16; - gWeatherPtr->gammaTargetIndex = gTimeOfDay == TIME_OF_DAY_DAY ? 3 : 0; + gWeatherPtr->gammaTargetIndex = 3; gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment gWeatherPtr->thunderTriggered = FALSE; @@ -1154,8 +1154,6 @@ void Thunderstorm_Main(void) if (--gWeatherPtr->thunderDelay == 0) { ApplyWeatherGammaShiftIfIdle(3); - if (gTimeOfDay != TIME_OF_DAY_DAY) - UpdatePalettesWithTime(0xFFFFFFFF); gWeatherPtr->thunderAllowEnd = TRUE; if (--gWeatherPtr->thunderShortRetries != 0) { @@ -1196,7 +1194,7 @@ void Thunderstorm_Main(void) case TSTORM_STATE_FADE_THUNDER_LONG: if (--gWeatherPtr->thunderDelay == 0) { - gTimeOfDay == TIME_OF_DAY_DAY ? sub_80ABC7C(19, 3, 5) : UpdatePalettesWithTime(0xFFFFFFFF); + sub_80ABC7C(19, 3, 5); gWeatherPtr->initStep++; } break; From c9845c66eed49ae307658ae8c4364a285370f4f3 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sun, 2 May 2021 03:23:38 -0400 Subject: [PATCH 048/145] Fixed mirage tower time blending. --- src/palette_util.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/palette_util.c b/src/palette_util.c index 5364ff6d98..4f6416ea01 100755 --- a/src/palette_util.c +++ b/src/palette_util.c @@ -2,6 +2,7 @@ #include "palette.h" #include "palette_util.h" #include "util.h" +#include "overworld.h" // "RouletteFlash" is more accurately a general flashing/fading util // this file handles fading the palettes for the color/icon selections on the Roulette wheel @@ -247,7 +248,7 @@ int InitPulseBlendPaletteSettings(struct PulseBlend *pulseBlend, const struct Pu if (pulseBlendPalette == NULL) return 0xFF; - + pulseBlendPalette->blendCoeff = 0; pulseBlendPalette->fadeDirection = 0; pulseBlendPalette->available = 1; @@ -322,7 +323,7 @@ void MarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPal pulseBlend->usedPulseBlendPalettes |= 1 << i; } } - } + } } void UnmarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection) @@ -385,7 +386,12 @@ void UpdatePulseBlend(struct PulseBlend *pulseBlend) if (--pulseBlendPalette->delayCounter == 0xFF) { pulseBlendPalette->delayCounter = pulseBlendPalette->pulseBlendSettings.delay; - BlendPalette(pulseBlendPalette->pulseBlendSettings.paletteOffset, pulseBlendPalette->pulseBlendSettings.numColors, pulseBlendPalette->blendCoeff, pulseBlendPalette->pulseBlendSettings.blendColor); + // TODO: Optimize pulse blending + CpuFastCopy(gPlttBufferUnfaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, gPlttBufferFaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, 32); + UpdatePalettesWithTime(1 << (pulseBlendPalette->pulseBlendSettings.paletteOffset >> 4)); + // pulseBlendSettings has a numColors field, but it is only ever set to 16 (for mirage tower) + // So, it's ok to use the fine blending here which blends the entire palette + BlendPalettesFine(1, gPlttBufferFaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, gPlttBufferFaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, pulseBlendPalette->blendCoeff, pulseBlendPalette->pulseBlendSettings.blendColor); switch (pulseBlendPalette->pulseBlendSettings.fadeType) { case 0: // Fade all the way to the max blend amount, then wrap around @@ -423,7 +429,7 @@ void UpdatePulseBlend(struct PulseBlend *pulseBlend) pulseBlendPalette->blendCoeff = 0; else pulseBlendPalette->blendCoeff = pulseBlendPalette->pulseBlendSettings.maxBlendCoeff & 0xF; - + pulseBlendPalette->fadeDirection ^= 1; pulseBlendPalette->fadeCycleCounter++; break; From c20db9475d63509d96ac6214d2db94599ec90185 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Tue, 4 May 2021 00:49:51 -0400 Subject: [PATCH 049/145] Fixed BlendPalettes not incrementing the destination buffer. --- src/palette.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/palette.c b/src/palette.c index b947f464c3..052b8a5568 100644 --- a/src/palette.c +++ b/src/palette.c @@ -1018,7 +1018,7 @@ void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color) { } } else { src += 16; - dst + 16; + dst += 16; } palettes >>= 1; } while (palettes); From b64eb7ea142d91603a213099e8f6d7fcead16277 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sat, 28 Aug 2021 03:46:30 -0400 Subject: [PATCH 050/145] Modified palette tint behavior. --- include/palette.h | 6 +++--- src/overworld.c | 4 ++-- src/palette.c | 36 ++++++++++++++++++++++++------------ 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/include/palette.h b/include/palette.h index 201e853800..39219f40a7 100644 --- a/include/palette.h +++ b/include/palette.h @@ -27,9 +27,9 @@ enum }; struct BlendSettings { - u16 blendColor:15; - u16 isTint:1; - u8 coeff:5; + u32 blendColor:24; + u32 isTint:1; + u32 coeff:5; }; struct PaletteFadeControl diff --git a/src/overworld.c b/src/overworld.c index c667026676..cfb819426c 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1460,11 +1460,11 @@ void CB1_Overworld(void) DoCB1_Overworld(gMain.newKeys, gMain.heldKeys); } - +#define TINT_NIGHT Q_8_8(0.456) | Q_8_8(0.456) << 8 | Q_8_8(0.615) << 16 const struct BlendSettings gTimeOfDayBlend[] = { - [TIME_OF_DAY_NIGHT] = {.coeff = 10, .blendColor = 0x1400}, + [TIME_OF_DAY_NIGHT] = {.coeff = 10, .blendColor = TINT_NIGHT, .isTint = TRUE}, [TIME_OF_DAY_TWILIGHT] = {.coeff = 4, .blendColor = 0x56dc, .isTint = TRUE}, [TIME_OF_DAY_DAY] = {.coeff = 0, .blendColor = 0}, }; diff --git a/src/palette.c b/src/palette.c index 052b8a5568..697a762a62 100644 --- a/src/palette.c +++ b/src/palette.c @@ -1101,12 +1101,24 @@ void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *ble tint1 = blend1->isTint; coeff1 = tint1 ? 8*2 : blend1->coeff*2; - r0 = (color0 << 27) >> 27; - g0 = (color0 << 22) >> 27; - b0 = (color0 << 17) >> 27; - r1 = (color1 << 27) >> 27; - g1 = (color1 << 22) >> 27; - b1 = (color1 << 17) >> 27; + if (tint0) { + r0 = (color0 << 24) >> 24; + g0 = (color0 << 16) >> 24; + b0 = (color0 << 8) >> 24; + } else { + r0 = (color0 << 27) >> 27; + g0 = (color0 << 22) >> 27; + b0 = (color0 << 17) >> 27; + } + if (tint1) { + r1 = (color1 << 24) >> 24; + g1 = (color1 << 16) >> 24; + b1 = (color1 << 8) >> 24; + } else { + r1 = (color1 << 27) >> 27; + g1 = (color1 << 22) >> 27; + b1 = (color1 << 17) >> 27; + } defR = (defaultColor << 27) >> 27; defG = (defaultColor << 22) >> 27; defB = (defaultColor << 17) >> 27; @@ -1155,9 +1167,9 @@ void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *ble g2 = (g + (((g0 - g) * coeff0) >> 5)); b2 = (b + (((b0 - b) * coeff0) >> 5)); } else { // tint-based - r2 = (u16)(((r0 << 3) * r)) >> 8; - g2 = (u16)(((g0 << 3) * g)) >> 8; - b2 = (u16)(((b0 << 3) * b)) >> 8; + r2 = (u16)((r0 * r)) >> 8; + g2 = (u16)((g0 * g)) >> 8; + b2 = (u16)((b0 * b)) >> 8; if (r2 > 31) r2 = 31; if (g2 > 31) @@ -1170,9 +1182,9 @@ void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *ble g3 = (g + (((g1 - g) * coeff1) >> 5)); b3 = (b + (((b1 - b) * coeff1) >> 5)); } else { // tint-based - r3 = (u16)(((r1 << 3) * r)) >> 8; - g3 = (u16)(((g1 << 3) * g)) >> 8; - b3 = (u16)(((b1 << 3) * b)) >> 8; + r3 = (u16)((r1 * r)) >> 8; + g3 = (u16)((g1 * g)) >> 8; + b3 = (u16)((b1 * b)) >> 8; if (r3 > 31) r3 = 31; if (g3 > 31) From cbb417a5304c3f8a229a378878f15a6bbfca05bc Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Wed, 22 Sep 2021 22:00:33 -0400 Subject: [PATCH 051/145] Fixed morning/evening tint. --- src/overworld.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/overworld.c b/src/overworld.c index 0948f67d66..c06513e623 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1465,7 +1465,7 @@ void CB1_Overworld(void) const struct BlendSettings gTimeOfDayBlend[] = { [TIME_OF_DAY_NIGHT] = {.coeff = 10, .blendColor = TINT_NIGHT, .isTint = TRUE}, - [TIME_OF_DAY_TWILIGHT] = {.coeff = 4, .blendColor = 0x56dc, .isTint = TRUE}, + [TIME_OF_DAY_TWILIGHT] = {.coeff = 4, .blendColor = 0xA8B0E0, .isTint = TRUE}, [TIME_OF_DAY_DAY] = {.coeff = 0, .blendColor = 0}, }; From bd3c9ed3b90d7be39d724d60406f8d47e93e0fca Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Fri, 26 Nov 2021 03:58:06 -0500 Subject: [PATCH 052/145] Fixed warp arrow palette bug. Optimized weather palette loading. --- include/event_object_movement.h | 1 + src/event_object_movement.c | 19 ++++++++++--------- src/field_effect_helpers.c | 4 +++- src/field_weather.c | 5 ++++- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 7d66072a76..701a47f409 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -106,6 +106,7 @@ u8 SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 l u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *); void SetSpritePosToMapCoords(s16, s16, s16 *, s16 *); void CameraObjectReset1(void); +u8 LoadObjectEventPalette(u16); u8 UpdateSpritePaletteByTemplate(const struct SpriteTemplate *, struct Sprite *); void ObjectEventSetGraphicsId(struct ObjectEvent *, u8 graphicsId); void ObjectEventTurn(struct ObjectEvent *, u8); diff --git a/src/event_object_movement.c b/src/event_object_movement.c index b8494bfa02..c2056d1b3e 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -130,7 +130,6 @@ static void UpdateObjectEventVisibility(struct ObjectEvent *, struct Sprite *); static void MakeObjectTemplateFromObjectEventTemplate(struct ObjectEventTemplate *, struct SpriteTemplate *, const struct SubspriteTable **); static void GetObjectEventMovingCameraOffset(s16 *, s16 *); static struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8, u8, u8); -static void LoadObjectEventPalette(u16); static void RemoveObjectEventIfOutsideView(struct ObjectEvent *); static void SpawnObjectEventOnReturnToField(u8, s16, s16); static void SetPlayerAvatarObjectEventIdAndObjectId(u8, u8); @@ -2431,12 +2430,12 @@ void FreeAndReserveObjectSpritePalettes(void) gReservedSpritePaletteCount = 12; } -static void LoadObjectEventPalette(u16 paletteTag) +u8 LoadObjectEventPalette(u16 paletteTag) { u16 i = FindObjectEventPaletteIndexByTag(paletteTag); - - if (i != OBJ_EVENT_PAL_TAG_NONE) // always true - LoadSpritePaletteIfTagExists(&sObjectEventSpritePalettes[i]); + if (i == 0xFF) + return i; + return LoadSpritePaletteIfTagExists(&sObjectEventSpritePalettes[i]); } // Unused @@ -2448,13 +2447,15 @@ static void LoadObjectEventPaletteSet(u16 *paletteTags) LoadObjectEventPalette(paletteTags[i]); } +// Really just loads the palette and applies weather fade static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *spritePalette) { - u8 paletteNum; - if (IndexOfSpritePaletteTag(spritePalette->tag) != 0xFF) - return 0xFF; + u8 paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); + if (paletteNum != 0xFF) // don't load twice; return + return paletteNum; paletteNum = LoadSpritePalette(spritePalette); - UpdateSpritePaletteWithWeather(paletteNum, FALSE); + if (paletteNum != 0xFF) + UpdateSpritePaletteWithWeather(paletteNum, FALSE); return paletteNum; } diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 14330bd661..e263ebe23e 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -255,6 +255,8 @@ u8 CreateWarpArrowSprite(void) if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; + // OBJ_EVENT_PAL_TAG_MAY : OBJ_EVENT_PAL_TAG_BRENDAN + sprite->oam.paletteNum = LoadObjectEventPalette(gSaveBlock2Ptr->playerGender ? 0x1110 : 0x1100); sprite->oam.priority = 1; sprite->coordOffsetEnabled = TRUE; sprite->invisible = TRUE; @@ -1421,7 +1423,7 @@ static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 fldEffObj, u8 paletteNum) if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; - UpdateSpritePaletteByTemplate(gFieldEffectObjectTemplatePointers[fldEffObj], sprite); + sprite->oam.paletteNum = LoadObjectEventPalette(gFieldEffectObjectTemplatePointers[fldEffObj]->paletteTag); sprite->coordOffsetEnabled ++; sprite->sFldEff = fldEff; sprite->sLocalId = gFieldEffectArguments[0]; diff --git a/src/field_weather.c b/src/field_weather.c index 205b4f7f22..137a167a4e 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -165,7 +165,7 @@ void StartWeather(void) CpuCopy32(gFogPalette, &gPlttBufferUnfaded[0x100 + index * 16], 32); BuildGammaShiftTables(); gWeatherPtr->altGammaSpritePalIndex = index; - gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(PALTAG_WEATHER_2); + gWeatherPtr->weatherPicSpritePalIndex = 0xFF; // defer allocation until needed gWeatherPtr->rainSpriteCount = 0; gWeatherPtr->curRainSpriteIndex = 0; gWeatherPtr->cloudSpritesCreated = 0; @@ -899,6 +899,9 @@ static bool8 IsFirstFrameOfWeatherFadeIn(void) void LoadCustomWeatherSpritePalette(const u16 *palette) { + if (gWeatherPtr->weatherPicSpritePalIndex > 16) // haven't allocated palette yet + if ((gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(PALTAG_WEATHER_2)) > 16) + return; LoadPalette(palette, 0x100 + gWeatherPtr->weatherPicSpritePalIndex * 16, 32); UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex, TRUE); } From e7cbec7eda4532dfe284ad1b246036a286f3ecb2 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Tue, 7 Dec 2021 01:04:17 -0500 Subject: [PATCH 053/145] Implemented light colors/palettes for primary tilesets. --- src/fieldmap.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/fieldmap.c b/src/fieldmap.c index dfa6173176..35e8bc5290 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -894,6 +894,8 @@ static void FieldmapUnkDummy(void) void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size) { u16 black = RGB_BLACK; + u32 low = 0; + u32 high = 0; if (tileset) { @@ -902,25 +904,31 @@ void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size) LoadPalette(&black, destOffset, 2); LoadPalette(((u16*)tileset->palettes) + 1, destOffset + 1, size - 2); FieldmapPaletteDummy(destOffset + 1, (size - 2) >> 1); + low = 0; + high = NUM_PALS_IN_PRIMARY; } else if (tileset->isSecondary == TRUE) { - u8 i; LoadPalette(((u16*)tileset->palettes) + (NUM_PALS_IN_PRIMARY * 16), destOffset, size); - for (i = NUM_PALS_IN_PRIMARY; i < NUM_PALS_TOTAL; i++) { - if (tileset->lightPalettes & (1 << (i - NUM_PALS_IN_PRIMARY))) { // Mark as light palette - u16 index = i * 16; - gPlttBufferFaded[index] = gPlttBufferUnfaded[index] |= 0x8000; - if (tileset->customLightColor & (1 << (i - NUM_PALS_IN_PRIMARY))) // Mark as custom light color - gPlttBufferFaded[index+15] = gPlttBufferUnfaded[index+15] |= 0x8000; - } - } + low = NUM_PALS_IN_PRIMARY; + high = NUM_PALS_TOTAL; } else { LoadCompressedPalette((u32*)tileset->palettes, destOffset, size); FieldmapPaletteDummy(destOffset, size >> 1); } + if (tileset->isSecondary == FALSE || tileset->isSecondary == TRUE) { + u32 i; + for (i = low; i < high; i++) { + if (tileset->lightPalettes & (1 << (i - low))) { // Mark as light palette + u32 index = i * 16; + gPlttBufferFaded[index] = gPlttBufferUnfaded[index] |= 0x8000; + if (tileset->customLightColor & (1 << (i - low))) // Mark as custom light color + gPlttBufferFaded[index+15] = gPlttBufferUnfaded[index+15] |= 0x8000; + } + } + } } } From 11c7eee285a6b0699681a0b3cfd9061e875d9090 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Wed, 22 Dec 2021 23:12:20 -0500 Subject: [PATCH 054/145] Restored lighting & shadows code removed from follower branch. --- common_syms/overworld.txt | 1 + include/event_object_movement.h | 1 + include/global.fieldmap.h | 2 +- include/global.h | 3 +- include/overworld.h | 1 + include/palette.h | 1 + .../field_effect_object_template_pointers.h | 1 + src/data/field_effects/field_effect_objects.h | 6 ++ .../object_events/object_event_graphics.h | 2 + src/event_object_movement.c | 66 ++++++++++--------- src/field_effect.c | 3 +- 11 files changed, 53 insertions(+), 34 deletions(-) diff --git a/common_syms/overworld.txt b/common_syms/overworld.txt index 3cea73ccd3..cc92cee1e2 100644 --- a/common_syms/overworld.txt +++ b/common_syms/overworld.txt @@ -6,4 +6,5 @@ gFieldCallback gFieldCallback2 gLocalLinkPlayerId gFieldLinkPlayerCount +gTimeOfDay currentTimeBlend diff --git a/include/event_object_movement.h b/include/event_object_movement.h index a59203f84b..98e5fd784e 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -100,6 +100,7 @@ void UpdateFollowingPokemon(void); void RemoveFollowingPokemon(void); struct ObjectEvent * GetFollowerObject(void); u8 GetDirectionToFace(s16, s16, s16, s16); +void UpdateLightSprite(struct Sprite *); void TrySpawnObjectEvents(s16, s16); u8 CreateObjectGraphicsSprite(u16, void (*)(struct Sprite *), s16 x, s16 y, u8 subpriority); u8 TrySpawnObjectEvent(u8, u8, u8); diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 424fd46d57..24e9e9ea53 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -183,7 +183,7 @@ struct ObjectEvent u32 inShallowFlowingWater:1; u32 inSandPile:1; u32 inHotSprings:1; - u32 hasShadow:1; + u32 noShadow:1; u32 spriteAnimPausedBackup:1; /*0x03*/ u32 spriteAffineAnimPausedBackup:1; u32 disableJumpLandingGroundEffect:1; diff --git a/include/global.h b/include/global.h index 13bdf02823..c4094ffc25 100644 --- a/include/global.h +++ b/include/global.h @@ -497,6 +497,7 @@ struct SaveBlock2 extern struct SaveBlock2 *gSaveBlock2Ptr; +extern u8 UpdateSpritePaletteWithTime(u8); extern bool8 IsAccurateGBA(void); struct SecretBaseParty @@ -871,7 +872,7 @@ struct MysteryGiftSave struct WonderCardMetadata cardMetadata; u16 questionnaireWords[NUM_QUESTIONNAIRE_WORDS]; struct WonderNewsMetadata newsMetadata; - u32 trainerIds[2][5]; // Saved ids for 10 trainers, 5 each for battles and trades + u32 trainerIds[2][5]; // Saved ids for 10 trainers, 5 each for battles and trades }; // 0x36C 0x3598 // For external event data storage. The majority of these may have never been used. diff --git a/include/overworld.h b/include/overworld.h index 246d63e29f..0469c8b9ed 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -62,6 +62,7 @@ extern void (*gFieldCallback)(void); extern bool8 (*gFieldCallback2)(void); extern u8 gLocalLinkPlayerId; extern u8 gFieldLinkPlayerCount; +extern u8 gTimeOfDay; extern struct TimeBlendSettings currentTimeBlend; diff --git a/include/palette.h b/include/palette.h index f9f42990e0..7e9ed0cae0 100644 --- a/include/palette.h +++ b/include/palette.h @@ -69,6 +69,7 @@ void TransferPlttBuffer(void); u8 UpdatePaletteFade(void); void ResetPaletteFade(void); bool8 BeginNormalPaletteFade(u32, s8, u8, u8, u16); +bool8 BeginTimeOfDayPaletteFade(u32, s8, u8, u8, struct BlendSettings *, struct BlendSettings *, u16, u16); void PaletteStruct_ResetById(u16); void ResetPaletteFadeControl(void); void InvertPlttBuffer(u32); diff --git a/src/data/field_effects/field_effect_object_template_pointers.h b/src/data/field_effects/field_effect_object_template_pointers.h index 41d6271bf2..eb8e52029d 100755 --- a/src/data/field_effects/field_effect_object_template_pointers.h +++ b/src/data/field_effects/field_effect_object_template_pointers.h @@ -35,6 +35,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_AshLaunch; const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles; const struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle; const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza; +const struct SpriteTemplate gFieldEffectObjectTemplate_BallLight; const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = { [FLDEFFOBJ_SHADOW_S] = &gFieldEffectObjectTemplate_ShadowSmall, diff --git a/src/data/field_effects/field_effect_objects.h b/src/data/field_effects/field_effect_objects.h index da688f2cfa..aa4bc624d2 100755 --- a/src/data/field_effects/field_effect_objects.h +++ b/src/data/field_effects/field_effect_objects.h @@ -28,6 +28,12 @@ static const struct SpriteFrameImage sPicTable_ShadowExtraLarge[] = { obj_frame_tiles(gFieldEffectObjectPic_ShadowExtraLarge), }; +const struct SpriteFrameImage gFieldEffectObjectPicTable_BallLight[] = { + obj_frame_tiles(gFieldEffectObjectPic_BallLight), +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_BallLight = {TAG_NONE, OBJ_EVENT_PAL_TAG_LIGHT, &gObjectEventBaseOam_32x32, sAnimTable_Inanimate, gFieldEffectObjectPicTable_BallLight, gDummySpriteAffineAnimTable, UpdateLightSprite}; + const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall = { .tileTag = TAG_NONE, .paletteTag = TAG_WEATHER_START, diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h index 43ccdcff77..51ad7d3937 100755 --- a/src/data/object_events/object_event_graphics.h +++ b/src/data/object_events/object_event_graphics.h @@ -281,6 +281,7 @@ const u32 gFieldEffectObjectPic_ShadowSmall[] = INCBIN_U32("graphics/field_effec const u32 gFieldEffectObjectPic_ShadowMedium[] = INCBIN_U32("graphics/field_effects/pics/shadow_medium.4bpp"); const u32 gFieldEffectObjectPic_ShadowLarge[] = INCBIN_U32("graphics/field_effects/pics/shadow_large.4bpp"); const u32 gFieldEffectObjectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/field_effects/pics/shadow_extra_large.4bpp"); +const u32 gFieldEffectObjectPic_BallLight[] = INCBIN_U32("graphics/object_events/pics/misc/light.4bpp"); static const u32 sFiller[0x48] = {}; const u8 gFieldEffectPic_CutGrass[] = INCBIN_U8("graphics/field_effects/pics/cut_grass.4bpp"); const u32 gFieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/field_effects/pics/cut_grass.4bpp"); @@ -778,4 +779,5 @@ const u32 gObjectEventPic_RayquazaCutscene[] = INCBIN_U32("graphics/object_event const u16 gObjectEventPal_HoOh[] = INCBIN_U16("graphics/object_events/palettes/ho_oh.gbapal"); const u16 gObjectEventPal_Lugia[] = INCBIN_U16("graphics/object_events/palettes/lugia.gbapal"); +const u16 gObjectEventPaletteLight[] = INCBIN_U16("graphics/object_events/palettes/light.gbapal"); const u16 gObjectEventPaletteEmotes[] = INCBIN_U16("graphics/misc/emotes.gbapal"); diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 6ef1bd15e1..f9ec12b8df 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -448,6 +448,7 @@ const u8 gInitialMovementTypeFacingDirections[] = { #define OBJ_EVENT_PAL_TAG_RS_BRENDAN 0x1122 #define OBJ_EVENT_PAL_TAG_RS_MAY 0x1123 #define OBJ_EVENT_PAL_TAG_DYNAMIC 0x1124 +#define OBJ_EVENT_PAL_TAG_LIGHT 0x8001 #define OBJ_EVENT_PAL_TAG_EMOTES 0x8002 #define OBJ_EVENT_PAL_TAG_NONE 0x11FF @@ -497,6 +498,7 @@ static const struct SpritePalette sObjectEventSpritePalettes[] = { {gObjectEventPal_RubySapphireBrendan, OBJ_EVENT_PAL_TAG_RS_BRENDAN}, {gObjectEventPal_RubySapphireMay, OBJ_EVENT_PAL_TAG_RS_MAY}, {gObjectEventPal_Npc1, OBJ_EVENT_PAL_TAG_DYNAMIC}, + {gObjectEventPaletteLight, OBJ_EVENT_PAL_TAG_LIGHT}, {gObjectEventPaletteEmotes, OBJ_EVENT_PAL_TAG_EMOTES}, {NULL, 0x0000}, }; @@ -2054,6 +2056,7 @@ void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) TrySpawnObjectEventTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); } } + TrySpawnLightSprites(cameraX, cameraY); } void RemoveObjectEventsOutsideView(void) @@ -2107,6 +2110,7 @@ void SpawnObjectEventsOnReturnToField(s16 x, s16 y) SpawnObjectEventOnReturnToField(i, x, y); } CreateReflectionEffectSprites(); + TrySpawnLightSprites(x, y); } static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) @@ -2170,7 +2174,7 @@ static void ResetObjectEventFldEffData(struct ObjectEvent *objectEvent) { objectEvent->singleMovementActive = FALSE; objectEvent->triggerGroundEffectsOnMove = TRUE; - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; objectEvent->hasReflection = FALSE; objectEvent->inShortGrass = FALSE; objectEvent->inShallowFlowingWater = FALSE; @@ -6160,7 +6164,7 @@ bool8 MovementAction_Jump2Down_Step1(struct ObjectEvent *objectEvent, struct Spr { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -6177,7 +6181,7 @@ bool8 MovementAction_Jump2Up_Step1(struct ObjectEvent *objectEvent, struct Sprit { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -6194,7 +6198,7 @@ bool8 MovementAction_Jump2Left_Step1(struct ObjectEvent *objectEvent, struct Spr { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -6211,7 +6215,7 @@ bool8 MovementAction_Jump2Right_Step1(struct ObjectEvent *objectEvent, struct Sp { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -6982,7 +6986,7 @@ bool8 MovementAction_JumpDown_Step1(struct ObjectEvent *objectEvent, struct Spri { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -6999,7 +7003,7 @@ bool8 MovementAction_JumpUp_Step1(struct ObjectEvent *objectEvent, struct Sprite { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -7016,7 +7020,7 @@ bool8 MovementAction_JumpLeft_Step1(struct ObjectEvent *objectEvent, struct Spri { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -7033,7 +7037,7 @@ bool8 MovementAction_JumpRight_Step1(struct ObjectEvent *objectEvent, struct Spr { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -7050,7 +7054,7 @@ bool8 MovementAction_JumpInPlaceDown_Step1(struct ObjectEvent *objectEvent, stru { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -7067,7 +7071,7 @@ bool8 MovementAction_JumpInPlaceUp_Step1(struct ObjectEvent *objectEvent, struct { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -7084,7 +7088,7 @@ bool8 MovementAction_JumpInPlaceLeft_Step1(struct ObjectEvent *objectEvent, stru { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -7101,7 +7105,7 @@ bool8 MovementAction_JumpInPlaceRight_Step1(struct ObjectEvent *objectEvent, str { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -7118,7 +7122,7 @@ bool8 MovementAction_JumpInPlaceDownUp_Step1(struct ObjectEvent *objectEvent, st { if (DoJumpInPlaceAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -7135,7 +7139,7 @@ bool8 MovementAction_JumpInPlaceUpDown_Step1(struct ObjectEvent *objectEvent, st { if (DoJumpInPlaceAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -7152,7 +7156,7 @@ bool8 MovementAction_JumpInPlaceLeftRight_Step1(struct ObjectEvent *objectEvent, { if (DoJumpInPlaceAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -7169,7 +7173,7 @@ bool8 MovementAction_JumpInPlaceRightLeft_Step1(struct ObjectEvent *objectEvent, { if (DoJumpInPlaceAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -7614,7 +7618,7 @@ bool8 MovementAction_AcroWheelieHopFaceDown_Step1(struct ObjectEvent *objectEven { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7631,7 +7635,7 @@ bool8 MovementAction_AcroWheelieHopFaceUp_Step1(struct ObjectEvent *objectEvent, { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7648,7 +7652,7 @@ bool8 MovementAction_AcroWheelieHopFaceLeft_Step1(struct ObjectEvent *objectEven { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7665,7 +7669,7 @@ bool8 MovementAction_AcroWheelieHopFaceRight_Step1(struct ObjectEvent *objectEve { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7682,7 +7686,7 @@ bool8 MovementAction_AcroWheelieHopDown_Step1(struct ObjectEvent *objectEvent, s { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7699,7 +7703,7 @@ bool8 MovementAction_AcroWheelieHopUp_Step1(struct ObjectEvent *objectEvent, str { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7716,7 +7720,7 @@ bool8 MovementAction_AcroWheelieHopLeft_Step1(struct ObjectEvent *objectEvent, s { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7733,7 +7737,7 @@ bool8 MovementAction_AcroWheelieHopRight_Step1(struct ObjectEvent *objectEvent, { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7750,7 +7754,7 @@ bool8 MovementAction_AcroWheelieJumpDown_Step1(struct ObjectEvent *objectEvent, { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7767,7 +7771,7 @@ bool8 MovementAction_AcroWheelieJumpUp_Step1(struct ObjectEvent *objectEvent, st { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7784,7 +7788,7 @@ bool8 MovementAction_AcroWheelieJumpLeft_Step1(struct ObjectEvent *objectEvent, { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7801,7 +7805,7 @@ bool8 MovementAction_AcroWheelieJumpRight_Step1(struct ObjectEvent *objectEvent, { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -9518,9 +9522,9 @@ u32 StartFieldEffectForObjectEvent(u8 fieldEffectId, struct ObjectEvent *objectE static void DoShadowFieldEffect(struct ObjectEvent *objectEvent) { - if (!objectEvent->hasShadow) + if (objectEvent->noShadow) { - objectEvent->hasShadow = 1; + objectEvent->noShadow = FALSE; StartFieldEffectForObjectEvent(FLDEFF_SHADOW, objectEvent); } } diff --git a/src/field_effect.c b/src/field_effect.c index d97d86cd82..afc25f757c 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -3270,7 +3270,7 @@ static void FlyOutFieldEffect_FlyOffWithBird(struct Task *task) struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; ObjectEventClearHeldMovementIfActive(objectEvent); objectEvent->inanimate = FALSE; - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = TRUE; // TODO: Make shadow smaller instead of disappearing completely ? SetFlyBirdPlayerSpriteId(task->tBirdSpriteId, objectEvent->spriteId); CameraObjectReset2(); task->tState++; @@ -3490,6 +3490,7 @@ static void FlyInFieldEffect_BirdSwoopDown(struct Task *task) ObjectEventTurn(objectEvent, DIR_WEST); StartSpriteAnim(&gSprites[objectEvent->spriteId], ANIM_GET_ON_OFF_POKEMON_WEST); objectEvent->invisible = FALSE; + objectEvent->noShadow = TRUE; task->tBirdSpriteId = CreateFlyBirdSprite(); StartFlyBirdSwoopDown(task->tBirdSpriteId); SetFlyBirdPlayerSpriteId(task->tBirdSpriteId, objectEvent->spriteId); From 5e3c48acfc7faf0bc24b4cfc1cf7f159c06bb087 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 16 Jan 2022 17:08:09 -0500 Subject: [PATCH 055/145] Fixed bug where `lighting` branch wouldn't build on modern. Credit: Jaizu --- include/overworld.h | 2 -- include/palette.h | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/overworld.h b/include/overworld.h index 0469c8b9ed..5061bb304d 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -69,8 +69,6 @@ extern struct TimeBlendSettings currentTimeBlend; // Exported ROM declarations extern const struct UCoords32 gDirectionToVectors[]; -extern const struct BlendSettings gTimeOfDayBlend[]; - void DoWhiteOut(void); void Overworld_ResetStateAfterFly(void); void Overworld_ResetStateAfterTeleport(void); diff --git a/include/palette.h b/include/palette.h index 7e9ed0cae0..abb00be6ca 100644 --- a/include/palette.h +++ b/include/palette.h @@ -56,6 +56,8 @@ struct PaletteFadeControl u8 deltaY:4; // rate of change of blend coefficient }; +extern const struct BlendSettings gTimeOfDayBlend[]; + extern struct PaletteFadeControl gPaletteFade; extern u32 gPlttBufferTransferPending; extern u8 gPaletteDecompressionBuffer[]; From 6e621d80a10f015e00ae017342cfb71284f51503 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Fri, 15 Apr 2022 22:38:56 -0400 Subject: [PATCH 056/145] Added day/night palette swapping. Updated lighting for lava, Petalburg, Slateport, Dewford, Verdanturf, Oldale, Mossdeep, Lilycove, Fallarbor. Improved lantern appearance & added neon signs on PokeCenter & Mart. Optimized gamma shift code. Removed obselete CacheLightMetatiles. --- common_syms/overworld.txt | 1 + data/maps/DewfordTown/map.json | 13 ++ data/maps/EverGrandeCity/map.json | 16 +- data/maps/LilycoveCity/map.json | 13 ++ data/maps/MauvilleCity/map.json | 26 +++ data/maps/MossdeepCity/map.json | 26 +++ data/maps/PacifidlogTown/map.json | 17 +- data/maps/PetalburgCity/map.json | 26 +++ data/maps/RustboroCity/map.json | 221 ++++++++++++++++++ data/maps/SlateportCity/map.json | 26 +++ data/maps/VerdanturfTown/map.json | 26 +++ data/tilesets/headers.inc | 30 +-- .../primary/general/metatile_attributes.bin | Bin 1024 -> 1024 bytes data/tilesets/primary/general/metatiles.bin | Bin 8192 -> 8192 bytes data/tilesets/primary/general/palettes/04.pal | 12 +- data/tilesets/primary/general/palettes/13.pal | 32 +-- data/tilesets/primary/general/tiles.png | Bin 7622 -> 7658 bytes .../secondary/dewford/metatile_attributes.bin | Bin 758 -> 758 bytes data/tilesets/secondary/dewford/metatiles.bin | Bin 6064 -> 6064 bytes .../secondary/dewford/palettes/12.pal | 26 +-- data/tilesets/secondary/dewford/tiles.png | Bin 12295 -> 3818 bytes .../secondary/fallarbor/palettes/00.pal | 26 +-- .../secondary/lavaridge/metatiles.bin | Bin 7056 -> 7056 bytes .../secondary/lavaridge/palettes/06.pal | 32 +-- data/tilesets/secondary/lavaridge/tiles.png | Bin 4087 -> 4087 bytes .../lilycove/metatile_attributes.bin | Bin 702 -> 702 bytes .../tilesets/secondary/lilycove/metatiles.bin | Bin 5616 -> 5616 bytes .../secondary/lilycove/palettes/15.pal | 30 +-- data/tilesets/secondary/lilycove/tiles.png | Bin 3674 -> 3728 bytes .../tilesets/secondary/mauville/metatiles.bin | Bin 8160 -> 8192 bytes data/tilesets/secondary/mauville/tiles.png | Bin 6069 -> 6079 bytes .../tilesets/secondary/mossdeep/metatiles.bin | Bin 7264 -> 7264 bytes .../secondary/mossdeep/palettes/01.pal | 24 +- .../secondary/mossdeep/palettes/02.pal | 32 +-- .../secondary/mossdeep/palettes/09.pal | 26 +-- data/tilesets/secondary/mossdeep/tiles.png | Bin 4115 -> 4129 bytes .../secondary/pacifidlog/palettes/02.pal | 32 +-- .../secondary/petalburg/palettes/02.pal | 32 +-- .../secondary/petalburg/palettes/09.pal | 32 +-- .../tilesets/secondary/rustboro/metatiles.bin | Bin 5600 -> 5616 bytes data/tilesets/secondary/rustboro/tiles.png | Bin 12786 -> 4057 bytes .../slateport/metatile_attributes.bin | Bin 812 -> 812 bytes .../secondary/slateport/metatiles.bin | Bin 6496 -> 6496 bytes .../secondary/slateport/palettes/12.pal | 10 +- .../secondary/slateport/palettes/15.pal | 30 +-- data/tilesets/secondary/slateport/tiles.png | Bin 6558 -> 6587 bytes .../secondary/sootopolis/palettes/15.pal | 30 +-- gflib/sprite.c | 22 ++ gflib/sprite.h | 2 + graphics/object_events/palettes/light.pal | 30 +-- graphics/object_events/palettes/light2.pal | 19 ++ .../object_events/palettes/neon_light.pal | 19 ++ graphics/object_events/pics/misc/light.png | Bin 3064 -> 6205 bytes .../object_events/pics/misc/mart_light.png | Bin 0 -> 5395 bytes .../pics/misc/poke_center_light.png | Bin 0 -> 5378 bytes include/constants/event_objects.h | 1 + include/field_weather.h | 1 + include/fieldmap.h | 1 - include/global.fieldmap.h | 3 +- include/overworld.h | 4 + include/palette.h | 1 + src/data/field_effects/field_effect_objects.h | 36 ++- .../object_events/object_event_graphics.h | 4 + .../object_event_graphics_info.h | 2 + .../object_event_graphics_info_pointers.h | 4 +- .../object_events/object_event_pic_tables.h | 2 + src/event_object_movement.c | 196 ++++++++++------ src/field_weather.c | 29 ++- src/fieldmap.c | 21 -- src/overworld.c | 61 +++-- src/palette.c | 25 ++ src/trainer_see.c | 2 +- 72 files changed, 972 insertions(+), 360 deletions(-) create mode 100644 graphics/object_events/palettes/light2.pal create mode 100644 graphics/object_events/palettes/neon_light.pal create mode 100644 graphics/object_events/pics/misc/mart_light.png create mode 100644 graphics/object_events/pics/misc/poke_center_light.png diff --git a/common_syms/overworld.txt b/common_syms/overworld.txt index cc92cee1e2..9aff4e77a1 100644 --- a/common_syms/overworld.txt +++ b/common_syms/overworld.txt @@ -8,3 +8,4 @@ gLocalLinkPlayerId gFieldLinkPlayerCount gTimeOfDay currentTimeBlend +gTimeUpdateCounter diff --git a/data/maps/DewfordTown/map.json b/data/maps/DewfordTown/map.json index 8beb5add70..c59e668444 100644 --- a/data/maps/DewfordTown/map.json +++ b/data/maps/DewfordTown/map.json @@ -89,6 +89,19 @@ "trainer_sight_or_berry_tree_id": "0", "script": "DewfordTown_EventScript_TrendyPhraseBoy", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 4, + "y": 10, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/EverGrandeCity/map.json b/data/maps/EverGrandeCity/map.json index 9db9c8febb..311cf4c2c4 100644 --- a/data/maps/EverGrandeCity/map.json +++ b/data/maps/EverGrandeCity/map.json @@ -19,7 +19,21 @@ "map": "MAP_ROUTE128" } ], - "object_events": [], + "object_events": [ + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 29, + "y": 48, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + } + ], "warp_events": [ { "x": 18, diff --git a/data/maps/LilycoveCity/map.json b/data/maps/LilycoveCity/map.json index a13904ca9a..d4a2b6ee47 100644 --- a/data/maps/LilycoveCity/map.json +++ b/data/maps/LilycoveCity/map.json @@ -310,6 +310,19 @@ "trainer_sight_or_berry_tree_id": "0", "script": "LilycoveCity_EventScript_FatMan", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 26, + "y": 14, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/MauvilleCity/map.json b/data/maps/MauvilleCity/map.json index cf3d5f8a1c..bd7426404f 100644 --- a/data/maps/MauvilleCity/map.json +++ b/data/maps/MauvilleCity/map.json @@ -177,6 +177,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_MAUVILLE_CITY_SCOTT" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 24, + "y": 5, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 25, + "y": 14, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/MossdeepCity/map.json b/data/maps/MossdeepCity/map.json index ff8ae1b616..309a22f424 100644 --- a/data/maps/MossdeepCity/map.json +++ b/data/maps/MossdeepCity/map.json @@ -250,6 +250,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "MossdeepCity_EventScript_BlackBelt", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 30, + "y": 16, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 39, + "y": 18, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/PacifidlogTown/map.json b/data/maps/PacifidlogTown/map.json index 51fc772a92..ec1bb1b226 100644 --- a/data/maps/PacifidlogTown/map.json +++ b/data/maps/PacifidlogTown/map.json @@ -63,6 +63,19 @@ "trainer_sight_or_berry_tree_id": "0", "script": "PacifidlogTown_EventScript_NinjaBoy", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 10, + "y": 15, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" } ], "warp_events": [ @@ -109,7 +122,9 @@ "dest_warp_id": 0 } ], - "coord_events": [], + "coord_events": [ + + ], "bg_events": [ { "type": "sign", diff --git a/data/maps/PetalburgCity/map.json b/data/maps/PetalburgCity/map.json index d9587cdbb9..c36d36fafb 100644 --- a/data/maps/PetalburgCity/map.json +++ b/data/maps/PetalburgCity/map.json @@ -141,6 +141,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_PETALBURG_CITY_SCOTT" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 22, + "y": 16, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 27, + "y": 12, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/RustboroCity/map.json b/data/maps/RustboroCity/map.json index 445bc51899..979d61e0b6 100644 --- a/data/maps/RustboroCity/map.json +++ b/data/maps/RustboroCity/map.json @@ -237,6 +237,227 @@ "trainer_sight_or_berry_tree_id": "0", "script": "RustboroCity_EventScript_Boy1", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 19, + "y": 37, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 22, + "y": 37, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 19, + "y": 30, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 22, + "y": 30, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 19, + "y": 23, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 22, + "y": 23, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 22, + "y": 44, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 19, + "y": 44, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 29, + "y": 48, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 14, + "y": 19, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 15, + "y": 17, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 9, + "y": 19, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 8, + "y": 17, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 19, + "y": 15, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 22, + "y": 15, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 14, + "y": 54, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 17, + "y": 54, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/SlateportCity/map.json b/data/maps/SlateportCity/map.json index 6ffed4b454..9141e5ab69 100644 --- a/data/maps/SlateportCity/map.json +++ b/data/maps/SlateportCity/map.json @@ -484,6 +484,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_SLATEPORT_CITY_SCOTT" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 21, + "y": 19, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 15, + "y": 26, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/VerdanturfTown/map.json b/data/maps/VerdanturfTown/map.json index 94d140c05e..df419ce905 100644 --- a/data/maps/VerdanturfTown/map.json +++ b/data/maps/VerdanturfTown/map.json @@ -76,6 +76,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "VerdanturfTown_EventScript_Camper", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 18, + "y": 3, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 14, + "y": 3, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index 3f1945af4b..8a1e8f444b 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -1,8 +1,8 @@ .align 2 gTileset_General:: - .byte TRUE @ is compressed + .byte 0x41 @ is compressed, swapPalettes 4 .byte FALSE @ is secondary tileset - .2byte 0 @ padding + .2byte 0x10 @ lightPalettes 4 .4byte gTilesetTiles_General .4byte gTilesetPalettes_General .4byte gMetatiles_General @@ -11,9 +11,9 @@ gTileset_General:: .align 2 gTileset_Petalburg:: - .byte TRUE @ is compressed + .byte 0x21 @ is compressed, swapPalettes 9 .byte TRUE @ is secondary tileset - .2byte 3 @ lightPalettes 6,7 + .2byte 0x00B @ lightPalettes 6,7,9, custom 9 .4byte gTilesetTiles_Petalburg .4byte gTilesetPalettes_Petalburg .4byte gMetatiles_Petalburg @@ -35,7 +35,7 @@ gTileset_Rustboro:: gTileset_Dewford:: .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 64 @ lightPalettes 12 + .2byte 0 @ padding .4byte gTilesetTiles_Dewford .4byte gTilesetPalettes_Dewford .4byte gMetatiles_Dewford @@ -44,9 +44,9 @@ gTileset_Dewford:: .align 2 gTileset_Slateport:: - .byte TRUE @ is compressed + .byte 5 @ is compressed, swapPalettes 6 .byte TRUE @ is secondary tileset - .2byte 0x41 @ lightPalettes 6,12 + .2byte 0x1 @ lightPalettes 6 .4byte gTilesetTiles_Slateport .4byte gTilesetPalettes_Slateport .4byte gMetatiles_Slateport @@ -68,7 +68,7 @@ gTileset_Mauville:: gTileset_Lavaridge:: .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0 @ padding + .2byte 0x0101 @ lightPalettes 6, customLights 6 .4byte gTilesetTiles_Lavaridge .4byte gTilesetPalettes_Lavaridge .4byte gMetatiles_Lavaridge @@ -77,7 +77,7 @@ gTileset_Lavaridge:: .align 2 gTileset_Fallarbor:: - .byte TRUE @ is compressed + .byte 9 @ is compressed, swapPalettes 7 .byte TRUE @ is secondary tileset .2byte 2 @ lightPalettes 7 .4byte gTilesetTiles_Fallarbor @@ -99,7 +99,7 @@ gTileset_Fortree:: .align 2 gTileset_Lilycove:: - .byte TRUE @ is compressed + .byte 5 @ is compressed, swapPalettes 6 .byte TRUE @ is secondary tileset .2byte 0x01 @ lightPalettes 6 .4byte gTilesetTiles_Lilycove @@ -107,12 +107,13 @@ gTileset_Lilycove:: .4byte gMetatiles_Lilycove .4byte gMetatileAttributes_Lilycove .4byte InitTilesetAnim_Lilycove + .2byte 0 .align 2 gTileset_Mossdeep:: - .byte TRUE @ is compressed + .byte 0x11 @ is compressed, swapPalettes 8 .byte TRUE @ is secondary tileset - .2byte 0 @ lightPalettes 8,9 + .2byte 0x4 @ lightPalettes 8 .4byte gTilesetTiles_Mossdeep .4byte gTilesetPalettes_Mossdeep .4byte gMetatiles_Mossdeep @@ -129,10 +130,11 @@ gTileset_EverGrande:: .4byte gMetatiles_EverGrande .4byte gMetatileAttributes_EverGrande .4byte InitTilesetAnim_EverGrande + .2byte 0 .align 2 gTileset_Pacifidlog:: - .byte TRUE @ is compressed + .byte 0x21 @ is compressed, swapPalettes 9 .byte TRUE @ is secondary tileset .2byte 8 @ lightPalettes 9 .4byte gTilesetTiles_Pacifidlog @@ -143,7 +145,7 @@ gTileset_Pacifidlog:: .align 2 gTileset_Sootopolis:: - .byte TRUE @ is compressed + .byte 5 @ is compressed, swapPalettes 6 .byte TRUE @ is secondary tileset .2byte 0x101 @ lightPalettes 6, customLights 6 .4byte gTilesetTiles_Sootopolis diff --git a/data/tilesets/primary/general/metatile_attributes.bin b/data/tilesets/primary/general/metatile_attributes.bin index d9cd29016d792fb568494dbf2f820100081a14f8..552dafb603a737f14fa19094994e2dfb92163764 100644 GIT binary patch delta 56 ocmZqRXyBM2t}DR6z{G$6i~@`d%m^+615h3c1TqCSy6j;F0Cb=PSpWb4 delta 56 ncmZqRXyBM2uFJr{zy!oFz{tSJzzpMnXaP7!Ad_LE%N}L`Z!iQY diff --git a/data/tilesets/primary/general/metatiles.bin b/data/tilesets/primary/general/metatiles.bin index af899bcc5efa4bdd3ab1f418b371a866441207c9..813543f580749b6863bb474c80764044624545a6 100644 GIT binary patch delta 111 zcmZp0XmFUYhh@3La+iq*Dp_Fh6|<%P6x_@S6Mmy=1mA0{~x$BLV;b delta 111 zcmZp0XmFUYhlPQGfo0->3NSs{hVc%F!LV6|>6xSlvjVdMlR|Ugw7}-Tus|jt55%7i fbK0veuN&RLonQhDfrW6@% diff --git a/data/tilesets/primary/general/palettes/04.pal b/data/tilesets/primary/general/palettes/04.pal index 11ebd16a64..57d4faa34d 100644 --- a/data/tilesets/primary/general/palettes/04.pal +++ b/data/tilesets/primary/general/palettes/04.pal @@ -1,12 +1,12 @@ JASC-PAL 0100 16 -24 41 82 -248 0 248 +232 0 128 +216 224 232 222 230 238 -255 0 255 -255 0 255 -255 0 255 +184 200 224 +152 176 216 +112 184 240 156 164 189 80 104 208 65 90 189 @@ -16,4 +16,4 @@ JASC-PAL 139 164 222 106 131 213 82 106 213 -248 0 248 +96 168 232 diff --git a/data/tilesets/primary/general/palettes/13.pal b/data/tilesets/primary/general/palettes/13.pal index 4b0812f094..73fec5261a 100644 --- a/data/tilesets/primary/general/palettes/13.pal +++ b/data/tilesets/primary/general/palettes/13.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +232 0 128 +232 228 216 +222 230 238 +224 214 184 +216 200 152 +244 226 171 +156 164 189 +80 104 208 +65 90 189 +57 82 156 +41 65 139 +172 197 230 +139 164 222 +106 131 213 +82 106 213 +221 205 143 diff --git a/data/tilesets/primary/general/tiles.png b/data/tilesets/primary/general/tiles.png index 17426ab80e8fe2434bc9ecefbc8e063fd4e6d09a..b22b3f1fcbf3dc7f0fd63f893ee07326fd965f1f 100644 GIT binary patch literal 7658 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 Y2juoiOYAb5z5oCK07*qoM6N<$f{x@yJpcdz literal 7622 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 diff --git a/data/tilesets/secondary/dewford/metatile_attributes.bin b/data/tilesets/secondary/dewford/metatile_attributes.bin index 67ee25d405026191260b7a7cfc078b007db4af1d..158238664fe74c5543b5e0374f4996b1eb3c441c 100644 GIT binary patch delta 28 dcmeyy`i*sht)Kt{1A_n%fdzd?V)Q%3Hf_Fh6|<%P6x_@+kxr>L|cIBVe*@+n9W2097!ft delta 117 zcmdm>zd?V)Q%3GX$;TKVfMxOr#zO8xsmF?gii3bcER%DXj(JD~N(6EQHU~}v;xHf! i!k-T0hYO|&BKU2A>45=oemhV;K(qx({pKoWGZ6qYsUj-? diff --git a/data/tilesets/secondary/dewford/palettes/12.pal b/data/tilesets/secondary/dewford/palettes/12.pal index cf04ad17c0..4b0812f094 100644 --- a/data/tilesets/secondary/dewford/palettes/12.pal +++ b/data/tilesets/secondary/dewford/palettes/12.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -0 224 0 -0 0 0 -222 230 238 -189 205 230 -156 180 222 -131 131 139 -98 98 123 -65 74 106 -152 176 216 -115 189 246 -98 172 238 0 0 0 0 0 0 -213 180 106 -205 156 82 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 0 0 0 diff --git a/data/tilesets/secondary/dewford/tiles.png b/data/tilesets/secondary/dewford/tiles.png index 522864a973349519bbe3f1e52a202d929fe7d71c..2af1303c274bf1662d41d0b37c8b49772697f4c1 100644 GIT binary patch delta 3804 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 diff --git a/data/tilesets/secondary/fallarbor/palettes/00.pal b/data/tilesets/secondary/fallarbor/palettes/00.pal index ede0c60a19..87f9999aef 100644 --- a/data/tilesets/secondary/fallarbor/palettes/00.pal +++ b/data/tilesets/secondary/fallarbor/palettes/00.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -115 197 164 -255 255 255 -222 230 238 -189 205 230 -156 180 222 +0 192 0 +222 230 164 +180 197 115 +148 156 82 +123 131 65 131 131 139 98 98 123 65 74 106 -189 189 131 -115 189 246 -98 172 238 -115 189 246 -98 164 222 -82 139 197 -74 115 172 -115 197 164 +88 168 168 +221 205 143 +244 226 171 +255 205 82 +230 156 49 +222 123 32 +156 98 41 +128 192 216 diff --git a/data/tilesets/secondary/lavaridge/metatiles.bin b/data/tilesets/secondary/lavaridge/metatiles.bin index fd0314ed78ce4aad760ba39a6e6522e5f27bfdd9..c9bc71442ad26a06aab12352b676b63098f74c93 100644 GIT binary patch delta 15 XcmbPWKEZs$4^F1#j+=jRP7?$GHQWY= delta 15 XcmbPWKEZs$4^AcqhRwe?rwIZ8FU19) diff --git a/data/tilesets/secondary/lavaridge/palettes/06.pal b/data/tilesets/secondary/lavaridge/palettes/06.pal index 00e1478a73..a858e623d1 100644 --- a/data/tilesets/secondary/lavaridge/palettes/06.pal +++ b/data/tilesets/secondary/lavaridge/palettes/06.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -0 0 0 -65 74 106 -197 205 0 -230 238 238 -255 255 255 -255 115 65 -230 115 65 -180 98 90 -164 82 82 -205 49 0 -148 49 0 -246 24 24 -246 148 0 -148 164 65 -106 123 139 -222 222 0 +0 192 24 +64 72 104 +192 200 0 +224 232 232 +248 248 248 +248 112 64 +224 112 64 +176 96 88 +160 80 80 +200 48 0 +144 48 0 +240 24 24 +240 144 0 +144 160 64 +104 120 136 +224 40 0 diff --git a/data/tilesets/secondary/lavaridge/tiles.png b/data/tilesets/secondary/lavaridge/tiles.png index 2f6898a0f7ca21efb0dfc0c1d608d8bae6931a27..03c832c37a14b993e7096921d0f27f8647945916 100644 GIT binary patch delta 30 kcmew^|6P7UDpSRrjp+^i0w#wmdKI;Vst0J-l9+yDRo delta 30 kcmew^|6P7UDpN+|#`Fe$fosPnZ(;xfPgg&ebxsLQ0K`@cm;e9( diff --git a/data/tilesets/secondary/lilycove/metatile_attributes.bin b/data/tilesets/secondary/lilycove/metatile_attributes.bin index 0f4e01b923280efa5742e9a869e9d172da7fb119..f31cc9a047db711eaaa07a556400e4425abe0ad0 100644 GIT binary patch delta 35 icmdnTx{q~(H>02c0|NsHg8-O4IfijIqrl`JjK=_MNe03I delta 26 icmdnTx{q~(H{-;QB9r48XH3>-WSe}Ok!vzL({=!cBMCVG diff --git a/data/tilesets/secondary/lilycove/metatiles.bin b/data/tilesets/secondary/lilycove/metatiles.bin index 15b22292776bcba749ccf955107603eb5fec08fa..f82bdff5c618f60de442abefd7d77737975195dc 100644 GIT binary patch delta 171 zcmeyM{Xu&}3>VXDr^#_#QcQ20CRcIA0jbTmxH_05)P{qb>vzU{+9b0}ABu<%xtk`2?jpc?U5oL<4ackeB8(`5oUWl~AWJr&OmjCy-_a qAn*zD36c;J2kM7dpys6JHu(;J8`M5upnb7$`+ycWZLSh1V+8=6J1Q9f delta 171 zcmeyM{Xu&}3>Omv!{j(FDG*h~6$hj?-{R_El3-w9Qeal_2~rn|35p2<@jy^RXmSdgfHZ?>pCF$g2_bPI5F2EI chLF0@@ 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 delta 3668 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 b8!#B01mc?pEe72NvkYb%oHSuDxe3GoKrbzT delta 100 zcmZp0cwoO_iv*9aQmm43l5vtlkVDwy0}=&1u}Z#R7!VW?HrYlpOTrf{?-=9|1X2r< hHcm200;=98nIZuZa106v3JeN{D+mbNY$dgf6#xJq9c%yq diff --git a/data/tilesets/secondary/mauville/tiles.png b/data/tilesets/secondary/mauville/tiles.png index 20da7198e89bf0890f4ec48261c9372907c2c4c6..09bab365772533a3970d7f4a44cb72d806e02b38 100644 GIT binary patch literal 6079 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 diff --git a/data/tilesets/secondary/mossdeep/metatiles.bin b/data/tilesets/secondary/mossdeep/metatiles.bin index 5fc527d0ff3080888be2712495687578893e0d5b..1fe4faf9c560e696faa866bee59490b27545cb12 100644 GIT binary patch delta 42 zcmV+_0M-BCIN&(2lnD&86SNbtld+Sxlem+Upb2mc!xO|410Vt*$CJpDvm6RU5}^MP A!TZLU;AFhZO2G$~m>9+BPUrSV?o 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 Qe>XokW^PNXJ;I3nKPyfrPXGV_ literal 4115 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 Ca4E_F diff --git a/data/tilesets/secondary/pacifidlog/palettes/02.pal b/data/tilesets/secondary/pacifidlog/palettes/02.pal index 4c41030f66..9ea109ce00 100644 --- a/data/tilesets/secondary/pacifidlog/palettes/02.pal +++ b/data/tilesets/secondary/pacifidlog/palettes/02.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -24 41 82 -180 255 131 -131 197 98 -57 139 49 -57 82 0 -222 148 115 -106 90 90 -164 98 90 -65 57 49 -255 197 148 -222 106 98 -205 65 82 -164 213 197 -115 197 164 -65 180 131 -24 164 106 +0 0 128 +222 230 164 +180 189 123 +156 164 98 +131 139 74 +90 98 41 +98 98 123 +65 74 106 +32 32 82 +238 230 164 +238 197 98 +205 156 57 +164 123 24 +131 82 49 +131 131 139 +244 226 171 diff --git a/data/tilesets/secondary/petalburg/palettes/02.pal b/data/tilesets/secondary/petalburg/palettes/02.pal index 4c41030f66..4897614451 100644 --- a/data/tilesets/secondary/petalburg/palettes/02.pal +++ b/data/tilesets/secondary/petalburg/palettes/02.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -24 41 82 -180 255 131 -131 197 98 -57 139 49 -57 82 0 -222 148 115 -106 90 90 -164 98 90 -65 57 49 -255 197 148 -222 106 98 -205 65 82 -164 213 197 -115 197 164 -65 180 131 -24 164 106 +0 192 0 +232 224 200 +208 200 144 +200 176 120 +168 136 120 +128 128 136 +96 96 120 +64 72 104 +40 48 88 +244 226 171 +221 205 143 +248 224 176 +248 184 168 +240 160 128 +200 136 104 +248 192 32 diff --git a/data/tilesets/secondary/petalburg/palettes/09.pal b/data/tilesets/secondary/petalburg/palettes/09.pal index c4a6e250af..1a6a5c7713 100644 --- a/data/tilesets/secondary/petalburg/palettes/09.pal +++ b/data/tilesets/secondary/petalburg/palettes/09.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -24 41 82 -238 230 205 -213 205 148 -205 180 123 -172 139 123 -131 131 139 -98 98 123 -65 74 106 -41 49 90 -156 205 246 -98 156 238 -255 230 180 -255 189 172 -246 164 131 -205 139 106 -115 197 164 +0 192 0 +232 224 200 +208 200 144 +200 176 120 +168 136 120 +128 128 136 +96 96 120 +64 72 104 +40 48 88 +152 200 240 +120 152 232 +248 224 176 +248 184 168 +240 160 128 +200 136 104 +248 192 32 diff --git a/data/tilesets/secondary/rustboro/metatiles.bin b/data/tilesets/secondary/rustboro/metatiles.bin index 63ecf0306eed55fba51975805e7469fdd82f728a..649b09fac9aa91854c7410881856a96aee8e5aca 100644 GIT binary patch delta 177 zcmaE${Xu&}8!Ok0WD6lnA+NTX&66jvnn=w^_H42Q3e0Q<(aZ`nlJ^T(3Rwa9lkc%A z$uTgjNM-;6ueO!VQEib;o=qp3BAaeB?J(MD#K16Fj!i-(vT3K$E+7Y{l!0L-(5y%x zglGlvH%GCpV3U{@_^9bYQ*+=l$L7GW!0CYxnn3*Jj+>=;k8ubvDKG;elfpd1`G)HZ H*Bb%=xS>1? delta 160 zcmeyM{Xly|8!OkzCJP}32Cudm$&)9rnn;~&@@!%Nf*HvS43=*EATag^q770{*0?5D7w8LnpQDoC(IW`HE{Q^6Ub{R1+L^j<7N`n-y v0Gbuq1mc5uApYhkwiRp=51Jk|J!onUoEF#|7#8>t$OiGJ2X2<)J;nh5UMxSF diff --git a/data/tilesets/secondary/rustboro/tiles.png b/data/tilesets/secondary/rustboro/tiles.png index 3c71f263bbc5270db2f12d5b74d3c5c35d19e7e0..1cf8473a20fa80111fa74681b1f66eebe1b5ef79 100644 GIT binary patch delta 4004 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 Eg77eZ)&Kwi diff --git a/data/tilesets/secondary/slateport/metatile_attributes.bin b/data/tilesets/secondary/slateport/metatile_attributes.bin index d4894828bb7bc86e7d87bb144ca87610ca9b6bee..0f311a694f316031fc8829b1d3c72ae7fa4d39be 100644 GIT binary patch delta 36 kcmZ3(wuWtkJR_sPWCg}%K>-E^1_2-h0Wf>>7RCxj0C?;LzW@LL delta 36 jcmZ3(wuWtkJR>8+WCg}%K?WcY073{2BsXtitY8EHb!-KX diff --git a/data/tilesets/secondary/slateport/metatiles.bin b/data/tilesets/secondary/slateport/metatiles.bin index 0cb7f64acaf96c38d35e004426fe9fc0bfca9d57..3ba541bfbd4a2a77a00b1a692ed22bf48377f019 100644 GIT binary patch delta 241 zcmaE0^uTDt2Mz(bB-tdsB;F*IBGn?3BGaNxoFXhd%L0~#Tu!*0u-sv}%VY)K5>$Z& zyc#SqjLr>t9}}F# F4gkZUMKu5b delta 241 zcmaE0^uTDt2Mz%SG_Z+NgoTG$fm!8p!sUcz0n0)rEAW=^NCYAYEa25(0qNR&hW7;{ z7l@_NtkEpdJb52~5ts`S0&=YcPB;KfQeaXL2g<4g)i42hAU;SnNDqP!F#*Ph$b#f2 jI|;ftFe!jEs{=K`6o8b23_C6i1h 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 KZdk5Qi25H3171e} delta 6326 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 R`0sT9MitileTag == TAG_NONE || !template->images) + return 0xFFFF; + if ((tileStart = GetSpriteTileStartByTag(template->tileTag)) != 0xFFFF) // return if already loaded + return tileStart; + tempSheet.data = template->images[frame].data; + tempSheet.size = template->images[frame].size; + tempSheet.tag = template->tileTag; + return LoadSpriteSheet(&tempSheet); +} + void LoadSpriteSheets(const struct SpriteSheet *sheets) { u8 i; @@ -1621,6 +1636,13 @@ void LoadSpritePalettes(const struct SpritePalette *palettes) break; } +u8 LoadSpritePaletteInSlot(const struct SpritePalette *palette, u8 paletteNum) { + paletteNum = min(15, paletteNum); + sSpritePaletteTags[paletteNum] = palette->tag; + DoLoadSpritePalette(palette->data, paletteNum * 16); + return paletteNum; +} + void DoLoadSpritePalette(const u16 *src, u16 paletteOffset) { LoadPalette(src, paletteOffset + 0x100, 32); diff --git a/gflib/sprite.h b/gflib/sprite.h index e53737981b..6b952ab4ee 100644 --- a/gflib/sprite.h +++ b/gflib/sprite.h @@ -296,6 +296,7 @@ void FreeOamMatrix(u8 matrixNum); void InitSpriteAffineAnim(struct Sprite *sprite); void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotation); u16 LoadSpriteSheet(const struct SpriteSheet *sheet); +u16 LoadSpriteSheetByTemplate(const struct SpriteTemplate *template, u8 frame); void LoadSpriteSheets(const struct SpriteSheet *sheets); u16 AllocTilesForSpriteSheet(struct SpriteSheet *sheet); void AllocTilesForSpriteSheets(struct SpriteSheet *sheets); @@ -309,6 +310,7 @@ void RequestSpriteSheetCopy(const struct SpriteSheet *sheet); u16 LoadSpriteSheetDeferred(const struct SpriteSheet *sheet); void FreeAllSpritePalettes(void); u8 LoadSpritePalette(const struct SpritePalette *palette); +u8 LoadSpritePaletteInSlot(const struct SpritePalette *palette, u8 paletteNum); void LoadSpritePalettes(const struct SpritePalette *palettes); u8 AllocSpritePalette(u16 tag); u8 IndexOfSpritePaletteTag(u16 tag); diff --git a/graphics/object_events/palettes/light.pal b/graphics/object_events/palettes/light.pal index 3beca89bdf..92a4477f76 100644 --- a/graphics/object_events/palettes/light.pal +++ b/graphics/object_events/palettes/light.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 110 198 165 -255 213 18 -255 214 38 -254 217 39 -254 218 53 -255 220 65 -255 221 76 -255 223 86 -254 225 95 -254 228 104 -254 229 112 -254 230 120 -255 232 132 -255 235 148 -255 237 162 -255 240 176 +64 61 42 +77 73 50 +85 81 58 +100 94 66 +111 105 75 +119 112 77 +140 131 92 +154 145 103 +171 159 111 +186 174 123 +197 183 128 +209 195 139 +224 209 146 +234 219 155 +249 232 161 diff --git a/graphics/object_events/palettes/light2.pal b/graphics/object_events/palettes/light2.pal new file mode 100644 index 0000000000..3d61a3020d --- /dev/null +++ b/graphics/object_events/palettes/light2.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +106 202 166 +58 54 31 +67 62 33 +96 89 53 +110 102 57 +121 111 67 +128 119 66 +156 143 82 +166 155 96 +185 169 100 +199 183 112 +211 192 113 +223 203 123 +237 218 129 +247 227 137 +255 237 147 diff --git a/graphics/object_events/palettes/neon_light.pal b/graphics/object_events/palettes/neon_light.pal new file mode 100644 index 0000000000..dd287fc645 --- /dev/null +++ b/graphics/object_events/palettes/neon_light.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +104 203 168 +19 48 64 +35 87 115 +58 132 140 +69 156 166 +77 193 254 +106 239 254 +27 68 89 +64 22 19 +115 39 34 +166 57 49 +191 66 57 +222 77 67 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/object_events/pics/misc/light.png b/graphics/object_events/pics/misc/light.png index d1a0402d102cf52e47a584f2feb56230d5b7debf..22687a7c0067cff356a2cd6a1ebef4e6d1115a9d 100644 GIT binary patch literal 6205 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 N6CBAt7?}Lse*nyl2|xe< literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/poke_center_light.png b/graphics/object_events/pics/misc/poke_center_light.png new file mode 100644 index 0000000000000000000000000000000000000000..42d19f51c6eb9cc16d70ae9e9d4b06063494da62 GIT binary patch literal 5378 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.x - 2; - s16 right = gSaveBlock1Ptr->pos.x + 17; - s16 top = gSaveBlock1Ptr->pos.y; - s16 bottom = gSaveBlock1Ptr->pos.y + 15; - s16 x = sprite->data[6]; - s16 y = sprite->data[7]; - u16 sheetTileStart; - u32 paletteNum; - bool8 finished = TRUE; - // Ripped from RemoveObjectEventIfOutsideView - if (x >= left && x <= right - && y >= top && y <= bottom) - finished = FALSE; - finished = finished ? finished : gTimeOfDay != TIME_OF_DAY_NIGHT; - if (finished) { - sheetTileStart = sprite->sheetTileStart; - paletteNum = sprite->oam.paletteNum; - DestroySprite(sprite); - FieldEffectFreeTilesIfUnused(sheetTileStart); - FieldEffectFreePaletteIfUnused(paletteNum); - Weather_SetBlendCoeffs(7, 12); // TODO: Restore original blend coeffs at dawn - return; - } + s16 left = gSaveBlock1Ptr->pos.x - 2; + s16 right = gSaveBlock1Ptr->pos.x + 17; + s16 top = gSaveBlock1Ptr->pos.y; + s16 bottom = gSaveBlock1Ptr->pos.y + 15; + s16 x = sprite->data[6]; + s16 y = sprite->data[7]; + u16 sheetTileStart; + u32 paletteNum; + // Ripped from RemoveObjectEventIfOutsideView + if (!(x >= left && x <= right && y >= top && y <= bottom)) { + sheetTileStart = sprite->sheetTileStart; + paletteNum = sprite->oam.paletteNum; + DestroySprite(sprite); + FieldEffectFreeTilesIfUnused(sheetTileStart); + FieldEffectFreePaletteIfUnused(paletteNum); + Weather_SetBlendCoeffs(7, 12); // TODO: Restore original blend coeffs at dawn + return; + } - if (gPlayerAvatar.tileTransitionState) { // As long as the second coefficient stays 12, shadows will not change - Weather_SetBlendCoeffs(7, 12); - sprite->invisible = FALSE; - } else { - Weather_SetBlendCoeffs(12, 12); - sprite->invisible = gSaveBlock2Ptr->playTimeVBlanks & 1; - } + if (gTimeOfDay != TIME_OF_DAY_NIGHT) { + sprite->invisible = TRUE; + return; + } + + switch (sprite->data[5]) { // lightType + case 0: + if (gPaletteFade.active) { // if palette fade is active, don't flicker since the timer won't be updated + Weather_SetBlendCoeffs(7, 12); + sprite->invisible = FALSE; + } else if (gPlayerAvatar.tileTransitionState) { + Weather_SetBlendCoeffs(7, 12); // As long as the second coefficient stays 12, shadows will not change + sprite->invisible = FALSE; + if (GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum) == OBJ_EVENT_PAL_TAG_LIGHT_2) + LoadSpritePaletteInSlot(&sObjectEventSpritePalettes[FindObjectEventPaletteIndexByTag(OBJ_EVENT_PAL_TAG_LIGHT)], sprite->oam.paletteNum); + } else if ((sprite->invisible = gTimeUpdateCounter & 1)) { + Weather_SetBlendCoeffs(12, 12); + if (GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum) == OBJ_EVENT_PAL_TAG_LIGHT) + LoadSpritePaletteInSlot(&sObjectEventSpritePalettes[FindObjectEventPaletteIndexByTag(OBJ_EVENT_PAL_TAG_LIGHT_2)], sprite->oam.paletteNum); + } + break; + case 1 ... 2: + Weather_SetBlendCoeffs(12, 12); + sprite->invisible = FALSE; + break; + } } -// Spawn a light at a map coordinate based on metatile behavior -static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 behavior) { - struct Sprite *sprite; - u8 i; - for (i = 0; i < MAX_SPRITES; i++) { - sprite = &gSprites[i]; - if (sprite->inUse && sprite->callback == UpdateLightSprite && sprite->data[6] == x && sprite->data[7] == y) - return; - } - sprite = &gSprites[CreateSprite(&gFieldEffectObjectTemplate_BallLight, 0, 0, 0)]; - UpdateSpritePaletteByTemplate(&gFieldEffectObjectTemplate_BallLight, sprite); - GetMapCoordsFromSpritePos(x + camX, y + camY, &sprite->x, &sprite->y); - sprite->data[6] = x; - sprite->data[7] = y; - sprite->affineAnims = gDummySpriteAffineAnimTable; - sprite->affineAnimBeginning = TRUE; - sprite->centerToCornerVecX = -(32 >> 1); - sprite->centerToCornerVecY = -(32 >> 1); - sprite->oam.priority = 1; - sprite->oam.objMode = 1; // BLEND - sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; - sprite->coordOffsetEnabled = TRUE; - sprite->x += 8; - sprite->y += 22 + sprite->centerToCornerVecY; +// Spawn a light at a map coordinate +static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) { + struct Sprite *sprite; + const struct SpriteTemplate *template; + u8 i; + for (i = 0; i < MAX_SPRITES; i++) { + sprite = &gSprites[i]; + if (sprite->inUse && sprite->callback == UpdateLightSprite && sprite->data[6] == x && sprite->data[7] == y) + return; + } + lightType = min(lightType, ARRAY_COUNT(gFieldEffectLightTemplates) - 1); // bounds checking + template = gFieldEffectLightTemplates[lightType]; + LoadSpriteSheetByTemplate(template, 0); + sprite = &gSprites[CreateSprite(template, 0, 0, 0)]; + if (lightType == 0 && (i = IndexOfSpritePaletteTag(template->paletteTag + 1)) < 16) + sprite->oam.paletteNum = i; + else + UpdateSpritePaletteByTemplate(template, sprite); + GetMapCoordsFromSpritePos(x + camX, y + camY, &sprite->x, &sprite->y); + sprite->data[5] = lightType; + sprite->data[6] = x; + sprite->data[7] = y; + sprite->affineAnims = gDummySpriteAffineAnimTable; + sprite->affineAnimBeginning = TRUE; + sprite->coordOffsetEnabled = TRUE; + switch (lightType) { + case 0: // Rustboro lanterns + sprite->centerToCornerVecX = -(32 >> 1); + sprite->centerToCornerVecY = -(32 >> 1); + sprite->oam.priority = 1; + sprite->oam.objMode = 1; // BLEND + sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; + sprite->x += 8; + sprite->y += 22 + sprite->centerToCornerVecY; + break; + case 1 ... 2: // Pokemon Center & mart + sprite->centerToCornerVecX = -(16 >> 1); + sprite->centerToCornerVecY = -(16 >> 1); + sprite->oam.priority = 2; + sprite->subpriority = 0xFF; + sprite->oam.objMode = 1; // BLEND + } } void TrySpawnLightSprites(s16 camX, s16 camY) { - s16 left = gSaveBlock1Ptr->pos.x - 2; - s16 right = gSaveBlock1Ptr->pos.x + 17; - s16 top = gSaveBlock1Ptr->pos.y; - s16 bottom = gSaveBlock1Ptr->pos.y + 16; - u8 i = 0; - s16 x, y; - u32 behavior; - if (gTimeOfDay != TIME_OF_DAY_NIGHT) - return; - for (i = 0; gLightMetatiles[i].x > 0; i++) { - x = gLightMetatiles[i].x; - y = gLightMetatiles[i].y; - if (x >= left && x <= right && y >= top && y <= bottom) { - behavior = MapGridGetMetatileBehaviorAt(x, y); - if (behavior == 0x04) // TODO: Use an actual constant for light metatiles - SpawnLightSprite(x, y, camX, camY, behavior); + u8 i; + u8 objectCount; + s16 left = gSaveBlock1Ptr->pos.x - 2; + s16 right = gSaveBlock1Ptr->pos.x + MAP_OFFSET_W + 2; + s16 top = gSaveBlock1Ptr->pos.y; + s16 bottom = gSaveBlock1Ptr->pos.y + MAP_OFFSET_H + 2; + if (gMapHeader.events == NULL) + return; + + if (InBattlePyramid()) + objectCount = GetNumBattlePyramidObjectEvents(); + else if (InTrainerHill()) + objectCount = 2; + else + objectCount = gMapHeader.events->objectEventCount; + + for (i = 0; i < objectCount; i++) { + struct ObjectEventTemplate *template = &gSaveBlock1Ptr->objectEventTemplates[i]; + s16 npcX = template->x + MAP_OFFSET; + s16 npcY = template->y + MAP_OFFSET; + if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX && !FlagGet(template->flagId)) + if (template->graphicsId == OBJ_EVENT_GFX_LIGHT_SPRITE) // event is light sprite instead + SpawnLightSprite(npcX, npcY, camX, camY, template->trainerRange_berryTreeId); } - } } void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) @@ -2080,12 +2122,14 @@ void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) s16 npcX = template->x + MAP_OFFSET; s16 npcY = template->y + MAP_OFFSET; - if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX - && !FlagGet(template->flagId)) - TrySpawnObjectEventTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); + if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX && !FlagGet(template->flagId)) { + if (template->graphicsId == OBJ_EVENT_GFX_LIGHT_SPRITE) { // light sprite instead + SpawnLightSprite(npcX, npcY, cameraX, cameraY, template->trainerRange_berryTreeId); + } else + TrySpawnObjectEventTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); + } } } - TrySpawnLightSprites(cameraX, cameraY); } void RemoveObjectEventsOutsideView(void) diff --git a/src/field_weather.c b/src/field_weather.c index 2c0fc5ca8c..fb07ec41f2 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -466,18 +466,21 @@ static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) if (gammaIndex > 0) { + // Create the palette mask + u32 palettes = PALETTES_ALL; + numPalettes += startPalIndex; + palettes = (palettes >> startPalIndex) << startPalIndex; + palettes = (palettes << (32-numPalettes)) >> (32-numPalettes); + numPalettes -= startPalIndex; gammaIndex--; palOffset = startPalIndex * 16; - CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 32 * numPalettes); - numPalettes += startPalIndex; + UpdateAltBgPalettes(palettes & PALETTES_BG); // Thunder gamma-shift looks bad on night-blended palettes, so ignore time blending in some situations - if (!(gammaIndex > 3 && gWeatherPtr->currWeather == WEATHER_RAIN_THUNDERSTORM)) { - // Create the palette mask - u32 palettes = PALETTES_ALL; - palettes = (palettes >> startPalIndex) << startPalIndex; - palettes = (palettes << (32-numPalettes)) >> (32-numPalettes); + if (!(gammaIndex > 3 && gWeatherPtr->currWeather == WEATHER_RAIN_THUNDERSTORM) && MapHasNaturalLight(gMapHeader.mapType)) UpdatePalettesWithTime(palettes); - } + else + CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 32 * numPalettes); + numPalettes += startPalIndex; curPalIndex = startPalIndex; // Loop through the speficied palette range and apply necessary gamma shifts to the colors. while (curPalIndex < numPalettes) @@ -546,6 +549,7 @@ static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) numPalettes += startPalIndex; palettes = (palettes >> startPalIndex) << startPalIndex; palettes = (palettes << (32-numPalettes)) >> (32-numPalettes); + UpdateAltBgPalettes(palettes & PALETTES_BG); UpdatePalettesWithTime(palettes); } else { // copy CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16)); @@ -570,6 +574,7 @@ static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaI while (curPalIndex < numPalettes) { + UpdateAltBgPalettes((1 << (palOffset >> 4)) & PALETTES_BG); CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); UpdatePalettesWithTime(1 << (palOffset >> 4)); // Apply TOD blend if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) @@ -670,6 +675,7 @@ static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) // TODO: Optimize this u16 curPalIndex; // First blend all palettes with time + UpdateAltBgPalettes(PALETTES_BG); CpuFastCopy(gPlttBufferUnfaded, gPlttBufferFaded, 0x400); UpdatePalettesWithTime(PALETTES_ALL); // Then blend tile palettes [0, 12] faded->faded @@ -816,6 +822,7 @@ void FadeScreen(u8 mode, s8 delay) gWeatherPtr->fadeScreenCounter = 0; // Triggers gamma-shift-based fade-in else { if (MapHasNaturalLight(gMapHeader.mapType)) { + UpdateAltBgPalettes(PALETTES_BG); BeginTimeOfDayPaletteFade(PALETTES_ALL, delay, 16, 0, (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], @@ -883,11 +890,15 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog) } } -void ApplyWeatherGammaShiftToPal(u8 paletteIndex) +void ApplyWeatherGammaShiftToPal(u8 paletteIndex) // now unused / obselete { ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); } +void ApplyWeatherGammaShiftToPals(u8 startPalIndex, u8 numPalettes) { + ApplyGammaShift(startPalIndex, numPalettes, gWeatherPtr->gammaIndex); +} + // Unused static bool8 IsFirstFrameOfWeatherFadeIn(void) { diff --git a/src/fieldmap.c b/src/fieldmap.c index 245562c93f..7fb479ae26 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -30,7 +30,6 @@ EWRAM_DATA struct MapHeader gMapHeader = {0}; EWRAM_DATA struct Camera gCamera = {0}; EWRAM_DATA static struct ConnectionFlags gMapConnectionFlags = {0}; EWRAM_DATA static u32 sFiller = 0; // without this, the next file won't align properly -EWRAM_DATA struct Coords16 gLightMetatiles[32] = {0}; struct BackupMapLayout gBackupMapLayout; @@ -63,7 +62,6 @@ static bool8 IsCoordInIncomingConnectingMap(int coord, int srcMax, int destMax, #define AreCoordsWithinMapGridBounds(x, y) (x >= 0 && x < gBackupMapLayout.width && y >= 0 && y < gBackupMapLayout.height) #define MapGridGetTileAt(x, y) (AreCoordsWithinMapGridBounds(x, y) ? gBackupMapLayout.map[x + gBackupMapLayout.width * y] : MapGridGetBorderTileAt(x, y)) -static void CacheLightMetatiles(void); struct MapHeader const *const GetMapHeaderFromConnection(struct MapConnection *connection) { @@ -75,7 +73,6 @@ void InitMap(void) InitMapLayoutData(&gMapHeader); SetOccupiedSecretBaseEntranceMetatiles(gMapHeader.events); RunOnLoadMapScript(); - CacheLightMetatiles(); } void InitMapFromSavedGame(void) @@ -85,7 +82,6 @@ void InitMapFromSavedGame(void) SetOccupiedSecretBaseEntranceMetatiles(gMapHeader.events); LoadSavedMapView(); RunOnLoadMapScript(); - CacheLightMetatiles(); UpdateTVScreensOnMap(gBackupMapLayout.width, gBackupMapLayout.height); } @@ -382,23 +378,6 @@ u32 MapGridGetMetatileBehaviorAt(int x, int y) return GetBehaviorByMetatileId(metatile) & METATILE_BEHAVIOR_MASK; } -// Caches light metatile coordinates -static void CacheLightMetatiles(void) { // TODO: Better way to dynamically generate lights - u8 i = 0; - s16 x, y; - for (x = 0; x < gBackupMapLayout.width; x++) { - for (y = 0; y < gBackupMapLayout.height; y++) { - if (MapGridGetMetatileBehaviorAt(x, y) == 0x04) { - gLightMetatiles[i].x = x; - gLightMetatiles[i].y = y; - i++; - } - } - } - gLightMetatiles[i].x = -1; - gLightMetatiles[i].y = -1; -} - u8 MapGridGetMetatileLayerTypeAt(int x, int y) { u16 metatile = MapGridGetMetatileIdAt(x, y); diff --git a/src/overworld.c b/src/overworld.c index b9b69acffd..332fa6d8c7 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -184,7 +184,6 @@ static u16 (*sPlayerKeyInterceptCallback)(u32); static bool8 sReceivingFromLink; static u8 sRfuKeepAliveTimer; -static u16 sTimeUpdateCounter; // playTimeVBlanks will eventually overflow, so this is used to update TOD // IWRAM common @@ -199,6 +198,7 @@ u8 gFieldLinkPlayerCount; u8 gTimeOfDay; struct TimeBlendSettings currentTimeBlend; +u16 gTimeUpdateCounter; // playTimeVBlanks will eventually overflow, so this is used to update TOD // EWRAM vars EWRAM_DATA static u8 sObjectEventLoadFlag = 0; @@ -822,8 +822,7 @@ void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum) CopySecondaryTilesetToVramUsingHeap(gMapHeader.mapLayout); LoadSecondaryTilesetPalette(gMapHeader.mapLayout); - for (paletteIndex = 6; paletteIndex < 13; paletteIndex++) // TODO: Optimize gamma shifts - ApplyWeatherGammaShiftToPal(paletteIndex); + ApplyWeatherGammaShiftToPals(6, 6); // palettes [6,12] InitSecondaryTilesetAnimation(); UpdateLocationHistoryForRoamer(); @@ -1481,29 +1480,34 @@ u8 UpdateTimeOfDay(void) { minutes = gLocalTime.minutes; if (hours >= 22 || hours < 4) { // night currentTimeBlend.weight = 256; + currentTimeBlend.altWeight = 0; return gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; } else if (hours >= 4 && hours < 7) { // night->twilight currentTimeBlend.time0 = TIME_OF_DAY_NIGHT; currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; currentTimeBlend.weight = 256 - 256 * ((hours - 4) * 60 + minutes) / ((7-4)*60); + currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2; return gTimeOfDay = TIME_OF_DAY_DAY; } else if (hours >= 7 && hours < 10) { // twilight->day currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; currentTimeBlend.time1 = TIME_OF_DAY_DAY; currentTimeBlend.weight = 256 - 256 * ((hours - 7) * 60 + minutes) / ((10-7)*60); + currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2 + 128; return gTimeOfDay = TIME_OF_DAY_DAY; } else if (hours >= 10 && hours < 18) { // day - currentTimeBlend.weight = 256; + currentTimeBlend.weight = currentTimeBlend.altWeight = 256; return gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_DAY; } else if (hours >= 18 && hours < 20) { // day->twilight currentTimeBlend.time0 = TIME_OF_DAY_DAY; currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; currentTimeBlend.weight = 256 - 256 * ((hours - 18) * 60 + minutes) / ((20-18)*60); + currentTimeBlend.altWeight = currentTimeBlend.weight / 2 + 128; return gTimeOfDay = TIME_OF_DAY_TWILIGHT; } else if (hours >= 20 && hours < 22) { // twilight->night currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; currentTimeBlend.weight = 256 - 256 * ((hours - 20) * 60 + minutes) / ((22-20)*60); + currentTimeBlend.altWeight = currentTimeBlend.weight / 2; return gTimeOfDay = TIME_OF_DAY_NIGHT; } else { // This should never occur currentTimeBlend.weight = 256; @@ -1516,16 +1520,41 @@ bool8 MapHasNaturalLight(u8 mapType) { // Whether a map type is naturally lit/ou || mapType == MAP_TYPE_OCEAN_ROUTE; } +// Update & mix day / night bg palettes (into unfaded) +void UpdateAltBgPalettes(u16 palettes) { + struct Tileset *primary = gMapHeader.mapLayout->primaryTileset; + struct Tileset *secondary = gMapHeader.mapLayout->secondaryTileset; + u32 i = 1; + if (!MapHasNaturalLight(gMapHeader.mapType)) + return; + palettes &= ~((1 << NUM_PALS_IN_PRIMARY) - 1) | primary->swapPalettes; + palettes &= ((1 << NUM_PALS_IN_PRIMARY) - 1) | (secondary->swapPalettes << NUM_PALS_IN_PRIMARY); + palettes &= 0x1FFE; // don't blend palette 0, [13,15] + palettes >>= 1; // start at palette 1 + if (!palettes) + return; + while (palettes) { + if (palettes & 1) { + if (i < NUM_PALS_IN_PRIMARY) + AvgPaletteWeighted(&((u16*)primary->palettes)[i*16], &((u16*)primary->palettes)[((i+9)%16)*16], gPlttBufferUnfaded + i * 16, currentTimeBlend.altWeight); + else + AvgPaletteWeighted(&((u16*)secondary->palettes)[i*16], &((u16*)secondary->palettes)[((i+9)%16)*16], gPlttBufferUnfaded + i * 16, currentTimeBlend.altWeight); + } + i++; + palettes >>= 1; + } +} + void UpdatePalettesWithTime(u32 palettes) { if (MapHasNaturalLight(gMapHeader.mapType)) { - u16 i; - u16 tempPaletteBuffer[16]; + u32 i; u32 mask = 1 << 16; - for (i = 0; i < 16; i++, mask <<= 1) { - if (GetSpritePaletteTagByPaletteNum(i) >> 15) // Don't blend special sprite palette tags - palettes &= ~(mask); - } - palettes &= 0xFFFF1FFF; // Don't blend tile palettes [13,15] + if (palettes >= 0x10000) + for (i = 0; i < 16; i++, mask <<= 1) + if (GetSpritePaletteTagByPaletteNum(i) >> 15) // Don't blend special sprite palette tags + palettes &= ~(mask); + + palettes &= 0xFFFF1FFF; // Don't blend UI BG palettes [13,15] if (!palettes) return; TimeMixPalettes(palettes, @@ -1565,18 +1594,20 @@ static void OverworldBasic(void) UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); // Every minute if no palette fade is active, update TOD blending as needed - if (!(gPaletteFade.active || (++sTimeUpdateCounter % 3600))) { + if (!(gPaletteFade.active || (++gTimeUpdateCounter % 3600))) { struct TimeBlendSettings cachedBlend = { .time0 = currentTimeBlend.time0, .time1 = currentTimeBlend.time1, .weight = currentTimeBlend.weight, }; - sTimeUpdateCounter = 0; + gTimeUpdateCounter = 0; UpdateTimeOfDay(); if (cachedBlend.time0 != currentTimeBlend.time0 || cachedBlend.time1 != currentTimeBlend.time1 - || cachedBlend.weight != currentTimeBlend.weight) - UpdatePalettesWithTime(PALETTES_ALL); + || cachedBlend.weight != currentTimeBlend.weight) { + UpdateAltBgPalettes(PALETTES_BG); + UpdatePalettesWithTime(PALETTES_ALL); + } } } diff --git a/src/palette.c b/src/palette.c index 9ea27d0f25..2c9db82e25 100644 --- a/src/palette.c +++ b/src/palette.c @@ -1211,6 +1211,31 @@ void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *ble } while (palettes); } +// Apply weighted average to palettes, preserving high bits of dst throughout +void AvgPaletteWeighted(u16 *src0, u16 *src1, u16 *dst, u16 weight0) { + u16 *srcEnd = src0 + 16; + u16 weight1 = 256 - weight0; + src0++; + src1++; + dst++; // leave dst transparency unchanged + while (src0 != srcEnd) { + u32 src0Color = *src0++; + s32 r0 = (src0Color << 27) >> 27; + s32 g0 = (src0Color << 22) >> 27; + s32 b0 = (src0Color << 17) >> 27; + u32 src1Color = *src1++; + s32 r1 = (src1Color << 27) >> 27; + s32 g1 = (src1Color << 22) >> 27; + s32 b1 = (src1Color << 17) >> 27; + + // Average and bitwise-OR + r0 = (weight0*r0 + weight1*r1) >> 8; + g0 = (weight0*g0 + weight1*g1) >> 8; + b0 = (weight0*b0 + weight1*b1) >> 8; + *dst++ = (*dst & 0x8000) | RGB2(r0, g0, b0); // preserve high bit of dst + } +} + void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) { void *src = gPlttBufferUnfaded; diff --git a/src/trainer_see.c b/src/trainer_see.c index 3bf4e0c2fd..0e478c9415 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -287,7 +287,7 @@ static const union AnimCmd *const sSpriteAnimTable_Emotes[] = { // TODO: Move these declarations into even_object_movement.h #define OBJ_EVENT_PAL_TAG_MAY 0x1110 -#define OBJ_EVENT_PAL_TAG_EMOTES 0x8002 +#define OBJ_EVENT_PAL_TAG_EMOTES 0x8003 static const struct SpriteTemplate sSpriteTemplate_ExclamationQuestionMark = { From ea6c1a9e40afb2414c9d692b91e4047d8dc634cf Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sat, 16 Apr 2022 17:33:36 -0400 Subject: [PATCH 057/145] Optimized UpdateTimeOfDay. --- src/overworld.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/overworld.c b/src/overworld.c index 332fa6d8c7..9d929a2448 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1474,44 +1474,45 @@ const struct BlendSettings gTimeOfDayBlend[] = }; u8 UpdateTimeOfDay(void) { - s8 hours, minutes; + s32 hours, minutes; RtcCalcLocalTime(); hours = gLocalTime.hours; minutes = gLocalTime.minutes; - if (hours >= 22 || hours < 4) { // night + if (hours < 4) { // night currentTimeBlend.weight = 256; currentTimeBlend.altWeight = 0; return gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; - } else if (hours >= 4 && hours < 7) { // night->twilight + } else if (hours < 7) { // night->twilight currentTimeBlend.time0 = TIME_OF_DAY_NIGHT; currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; currentTimeBlend.weight = 256 - 256 * ((hours - 4) * 60 + minutes) / ((7-4)*60); currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2; return gTimeOfDay = TIME_OF_DAY_DAY; - } else if (hours >= 7 && hours < 10) { // twilight->day + } else if (hours < 10) { // twilight->day currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; currentTimeBlend.time1 = TIME_OF_DAY_DAY; currentTimeBlend.weight = 256 - 256 * ((hours - 7) * 60 + minutes) / ((10-7)*60); currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2 + 128; return gTimeOfDay = TIME_OF_DAY_DAY; - } else if (hours >= 10 && hours < 18) { // day + } else if (hours < 18) { // day currentTimeBlend.weight = currentTimeBlend.altWeight = 256; return gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_DAY; - } else if (hours >= 18 && hours < 20) { // day->twilight + } else if (hours < 20) { // day->twilight currentTimeBlend.time0 = TIME_OF_DAY_DAY; currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; currentTimeBlend.weight = 256 - 256 * ((hours - 18) * 60 + minutes) / ((20-18)*60); currentTimeBlend.altWeight = currentTimeBlend.weight / 2 + 128; return gTimeOfDay = TIME_OF_DAY_TWILIGHT; - } else if (hours >= 20 && hours < 22) { // twilight->night + } else if (hours < 22) { // twilight->night currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; currentTimeBlend.weight = 256 - 256 * ((hours - 20) * 60 + minutes) / ((22-20)*60); currentTimeBlend.altWeight = currentTimeBlend.weight / 2; return gTimeOfDay = TIME_OF_DAY_NIGHT; - } else { // This should never occur + } else { // 22-24, night currentTimeBlend.weight = 256; - return gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_DAY; + currentTimeBlend.altWeight = 0; + return gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; } } From bc2b50cd2ea4cce1835f924390072fc0740c343b Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sat, 16 Apr 2022 17:57:20 -0400 Subject: [PATCH 058/145] Added LoadPaletteFast function. --- gflib/sprite.c | 2 +- include/fieldmap.h | 2 +- include/palette.h | 1 + src/fieldmap.c | 24 +++++++++++++++--------- src/overworld.c | 2 +- src/palette.c | 7 +++++++ 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/gflib/sprite.c b/gflib/sprite.c index 7c2b759b23..de7c4c307c 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -1645,7 +1645,7 @@ u8 LoadSpritePaletteInSlot(const struct SpritePalette *palette, u8 paletteNum) { void DoLoadSpritePalette(const u16 *src, u16 paletteOffset) { - LoadPalette(src, paletteOffset + 0x100, 32); + LoadPaletteFast(src, paletteOffset + 0x100, 32); } u8 AllocSpritePalette(u16 tag) diff --git a/include/fieldmap.h b/include/fieldmap.h index 28da8da2a3..9962c2cca7 100644 --- a/include/fieldmap.h +++ b/include/fieldmap.h @@ -42,7 +42,7 @@ void InitTrainerHillMap(void); void InitBattlePyramidMap(bool8 setPlayerPosition); void CopyMapTilesetsToVram(struct MapLayout const *mapLayout); void LoadMapTilesetPalettes(struct MapLayout const *mapLayout); -void LoadSecondaryTilesetPalette(struct MapLayout const *mapLayout); +void LoadSecondaryTilesetPalette(struct MapLayout const *mapLayout, bool8 skipFaded); void CopySecondaryTilesetToVramUsingHeap(struct MapLayout const *mapLayout); void CopyPrimaryTilesetToVram(const struct MapLayout *); void CopySecondaryTilesetToVram(const struct MapLayout *); diff --git a/include/palette.h b/include/palette.h index c1b7dff550..d59ccbd902 100644 --- a/include/palette.h +++ b/include/palette.h @@ -66,6 +66,7 @@ extern u16 gPlttBufferFaded[PLTT_BUFFER_SIZE]; void LoadCompressedPalette(const u32 *, u16, u16); void LoadPalette(const void *, u16, u16); +void LoadPaletteFast(const void *src, u16 offset, u16 size); void FillPalette(u16, u16, u16); void TransferPlttBuffer(void); u8 UpdatePaletteFade(void); diff --git a/src/fieldmap.c b/src/fieldmap.c index 7fb479ae26..bc494b5994 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -870,9 +870,8 @@ static void FieldmapUnkDummy(void) } -void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size) +void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size, bool8 skipFaded) { - u16 black = RGB_BLACK; u32 low = 0; u32 high = 0; @@ -880,15 +879,22 @@ void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size) { if (tileset->isSecondary == FALSE) { - LoadPalette(&black, destOffset, 2); - LoadPalette(((u16*)tileset->palettes) + 1, destOffset + 1, size - 2); + // LoadPalette(&black, destOffset, 2); + if (skipFaded) + CpuFastCopy(tileset->palettes, &gPlttBufferUnfaded[destOffset], size); + else + LoadPaletteFast(((u16*)tileset->palettes), destOffset, size); + gPlttBufferFaded[destOffset] = gPlttBufferUnfaded[destOffset] = RGB_BLACK; // why does it have to be black? FieldmapPaletteDummy(destOffset + 1, (size - 2) >> 1); low = 0; high = NUM_PALS_IN_PRIMARY; } else if (tileset->isSecondary == TRUE) { - LoadPalette(((u16*)tileset->palettes) + (NUM_PALS_IN_PRIMARY * 16), destOffset, size); + if (skipFaded) + CpuFastCopy(((u16*)tileset->palettes) + (NUM_PALS_IN_PRIMARY * 16), &gPlttBufferUnfaded[destOffset], size); + else + LoadPaletteFast(((u16*)tileset->palettes) + (NUM_PALS_IN_PRIMARY * 16), destOffset, size); low = NUM_PALS_IN_PRIMARY; high = NUM_PALS_TOTAL; } @@ -928,12 +934,12 @@ void CopySecondaryTilesetToVramUsingHeap(struct MapLayout const *mapLayout) static void LoadPrimaryTilesetPalette(struct MapLayout const *mapLayout) { - LoadTilesetPalette(mapLayout->primaryTileset, 0, NUM_PALS_IN_PRIMARY * 16 * 2); + LoadTilesetPalette(mapLayout->primaryTileset, 0, NUM_PALS_IN_PRIMARY * 16 * 2, FALSE); } -void LoadSecondaryTilesetPalette(struct MapLayout const *mapLayout) +void LoadSecondaryTilesetPalette(struct MapLayout const *mapLayout, bool8 skipFaded) { - LoadTilesetPalette(mapLayout->secondaryTileset, NUM_PALS_IN_PRIMARY * 16, (NUM_PALS_TOTAL - NUM_PALS_IN_PRIMARY) * 16 * 2); + LoadTilesetPalette(mapLayout->secondaryTileset, NUM_PALS_IN_PRIMARY * 16, (NUM_PALS_TOTAL - NUM_PALS_IN_PRIMARY) * 16 * 2, skipFaded); } void CopyMapTilesetsToVram(struct MapLayout const *mapLayout) @@ -950,6 +956,6 @@ void LoadMapTilesetPalettes(struct MapLayout const *mapLayout) if (mapLayout) { LoadPrimaryTilesetPalette(mapLayout); - LoadSecondaryTilesetPalette(mapLayout); + LoadSecondaryTilesetPalette(mapLayout, FALSE); } } diff --git a/src/overworld.c b/src/overworld.c index 9d929a2448..c78a409c2c 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -820,7 +820,7 @@ void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum) RunOnTransitionMapScript(); InitMap(); CopySecondaryTilesetToVramUsingHeap(gMapHeader.mapLayout); - LoadSecondaryTilesetPalette(gMapHeader.mapLayout); + LoadSecondaryTilesetPalette(gMapHeader.mapLayout, TRUE); // skip copying to Faded, gamma shift will take care of it ApplyWeatherGammaShiftToPals(6, 6); // palettes [6,12] diff --git a/src/palette.c b/src/palette.c index 2c9db82e25..6cb4f77df9 100644 --- a/src/palette.c +++ b/src/palette.c @@ -96,6 +96,13 @@ void LoadPalette(const void *src, u16 offset, u16 size) CpuCopy16(src, &gPlttBufferFaded[offset], size); } +// Drop in replacement for LoadPalette, uses CpuFastCopy, size must be 0 % 32 +void LoadPaletteFast(const void *src, u16 offset, u16 size) { + CpuFastCopy(src, &gPlttBufferUnfaded[offset], size); + // Copying from EWRAM->EWRAM is faster than ROM->EWRAM + CpuFastCopy(&gPlttBufferUnfaded[offset], &gPlttBufferFaded[offset], size); +} + void FillPalette(u16 value, u16 offset, u16 size) { CpuFill16(value, &gPlttBufferUnfaded[offset], size); From 2d376d83178e0f05761181146e413a18daa1ee68 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Mon, 18 Apr 2022 00:37:15 -0400 Subject: [PATCH 059/145] Removed shadows in puddles or sand piles. Optimized shadow tile loading. --- include/constants/field_effects.h | 6 ++++++ src/data/field_effects/field_effect_objects.h | 8 ++++---- src/event_object_movement.c | 2 +- src/field_effect_helpers.c | 7 +++++-- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index 65ccc3ec7e..0f00ac6533 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -128,4 +128,10 @@ #define FLDEFF_PAL_TAG_HOF_MONITOR 0x1010 #define FLDEFF_PAL_TAG_UNKNOWN 0x1011 +// tile tags, for field effects that may have many copies on screen at once +#define FLDEFF_TILE_TAG_SHADOW_SMALL 0x1300 +#define FLDEFF_TILE_TAG_SHADOW_MEDIUM 0x1301 +#define FLDEFF_TILE_TAG_SHADOW_LARGE 0x1302 +#define FLDEFF_TILE_TAG_SHADOW_EXTRA_LARGE 0x1303 + #endif // GUARD_FIELD_EFFECT_CONSTANTS_H diff --git a/src/data/field_effects/field_effect_objects.h b/src/data/field_effects/field_effect_objects.h index 219700cdd8..a61bcb0364 100755 --- a/src/data/field_effects/field_effect_objects.h +++ b/src/data/field_effects/field_effect_objects.h @@ -69,7 +69,7 @@ const struct SpriteTemplate *const gFieldEffectLightTemplates[] = { }; const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall = { - .tileTag = TAG_NONE, + .tileTag = FLDEFF_TILE_TAG_SHADOW_SMALL, .paletteTag = TAG_WEATHER_START, .oam = &gObjectEventBaseOam_8x8, .anims = sAnimTable_Shadow, @@ -79,7 +79,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall = { }; const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium = { - .tileTag = TAG_NONE, + .tileTag = FLDEFF_TILE_TAG_SHADOW_MEDIUM, .paletteTag = TAG_WEATHER_START, .oam = &gObjectEventBaseOam_16x8, .anims = sAnimTable_Shadow, @@ -89,7 +89,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium = { }; const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge = { - .tileTag = TAG_NONE, + .tileTag = FLDEFF_TILE_TAG_SHADOW_LARGE, .paletteTag = TAG_WEATHER_START, .oam = &gObjectEventBaseOam_32x8, .anims = sAnimTable_Shadow, @@ -99,7 +99,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge = { }; const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge = { - .tileTag = TAG_NONE, + .tileTag = FLDEFF_TILE_TAG_SHADOW_EXTRA_LARGE, .paletteTag = TAG_WEATHER_START, .oam = &gObjectEventBaseOam_64x32, .anims = sAnimTable_Shadow, diff --git a/src/event_object_movement.c b/src/event_object_movement.c index c3eb81622a..fb9ca34d9b 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -8996,7 +8996,7 @@ static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite * for (i = 0; i < ARRAY_COUNT(sGroundEffectFuncs); i++, flags >>= 1) if (flags & 1) sGroundEffectFuncs[i](objEvent, sprite); - if (!(gWeatherPtr->noShadows || objEvent->inHotSprings)) + if (!(gWeatherPtr->noShadows || objEvent->inHotSprings || objEvent->inSandPile || MetatileBehavior_IsPuddle(objEvent->currentMetatileBehavior))) GroundEffect_Shadow(objEvent, sprite); } diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 0418a1ef13..91efae9e1a 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -314,8 +314,8 @@ u32 FldEff_Shadow(void) u8 objectEventId; const struct ObjectEventGraphicsInfo *graphicsInfo; u8 spriteId; - u8 i; - for (i = 0; i < MAX_SPRITES; i++) { + s32 i; + for (i = MAX_SPRITES - 1; i > -1; i--) { // Search backwards, because of CreateSpriteAtEnd // Return early if a shadow sprite already exists if (gSprites[i].data[0] == gFieldEffectArguments[0] && gSprites[i].callback == UpdateShadowFieldEffect) return 0; @@ -324,6 +324,7 @@ u32 FldEff_Shadow(void) graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); if (graphicsInfo->shadowSize == SHADOW_SIZE_NONE) // don't create a shadow at all return 0; + LoadSpriteSheetByTemplate(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 0x94); if (spriteId != MAX_SPRITES) { @@ -359,8 +360,10 @@ void UpdateShadowFieldEffect(struct Sprite *sprite) if (!objectEvent->active || objectEvent->noShadow || objectEvent->inHotSprings + || objectEvent->inSandPile || gWeatherPtr->noShadows || MetatileBehavior_IsPokeGrass(objectEvent->currentMetatileBehavior) + || MetatileBehavior_IsPuddle(objectEvent->currentMetatileBehavior) || MetatileBehavior_IsSurfableWaterOrUnderwater(objectEvent->currentMetatileBehavior) || MetatileBehavior_IsSurfableWaterOrUnderwater(objectEvent->previousMetatileBehavior)) { From f94a92fe1f7687115e7da8fe35cb6480f8f2f7f2 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Mon, 18 Apr 2022 23:17:41 -0400 Subject: [PATCH 060/145] Fixed shadow brightness during battle transition. --- include/field_weather.h | 1 + src/battle_transition.c | 47 ++++++++++++++++++++++++++++---------- src/field_weather_effect.c | 2 +- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/include/field_weather.h b/include/field_weather.h index 091080f549..677155c953 100644 --- a/include/field_weather.h +++ b/include/field_weather.h @@ -193,6 +193,7 @@ void Thunderstorm_Main(void); void Thunderstorm_InitAll(void); bool8 Thunderstorm_Finish(void); void FogHorizontal_InitVars(void); +u8 UpdateShadowColor(u16 color); void FogHorizontal_Main(void); void FogHorizontal_InitAll(void); bool8 FogHorizontal_Finish(void); diff --git a/src/battle_transition.c b/src/battle_transition.c index 1e421b5e47..b940eb39f8 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -1390,6 +1390,7 @@ static void InitPatternWeaveTransition(struct Task *task) sTransitionData->WIN0V = DISPLAY_HEIGHT; sTransitionData->BLDCNT = BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL; sTransitionData->BLDALPHA = BLDALPHA_BLEND(task->tBlendTarget2, task->tBlendTarget1); + UpdateShadowColor(0x3DEF); // force shadows to gray for (i = 0; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[1][i] = DISPLAY_WIDTH; @@ -2434,7 +2435,7 @@ static bool8 Mugshot_WaitStartPlayerSlide(struct Task *task) { sTransitionData->BG0HOFS_Lower -= 8; sTransitionData->BG0HOFS_Upper += 8; - + // Start player's slide in once the opponent is finished if (IsTrainerPicSlideDone(task->tOpponentSpriteId)) { @@ -2770,7 +2771,7 @@ static bool8 Slice_Main(struct Task *task) { u16 *storeLoc1 = &gScanlineEffectRegBuffers[0][i]; u16 *storeLoc2 = &gScanlineEffectRegBuffers[0][i + DISPLAY_HEIGHT]; - + // Alternate rows if (i % 2) { @@ -3251,7 +3252,7 @@ static bool8 RectangularSpiral_Main(struct Task *task) // The line moved to a new position, draw the tile. done = FALSE; position = sRectangularSpiralLines[j].position; - + // Invert position for the two lines that start at the bottom. if ((j % 2) == 1) position = 637 - position; @@ -3281,7 +3282,7 @@ static bool8 RectangularSpiral_End(struct Task *task) static bool16 UpdateRectangularSpiralLine(const s16 * const *moveDataTable, struct RectangularSpiralLine *line) { const s16 *moveData = moveDataTable[line->state]; - + // Has spiral finished? // Note that most move data arrays endsin SPIRAL_END but it is // only ever reached on the final array of spiraling outward. @@ -3294,9 +3295,9 @@ static bool16 UpdateRectangularSpiralLine(const s16 * const *moveDataTable, stru sDebug_RectangularSpiralData = moveData[2]; sDebug_RectangularSpiralData = moveData[3]; - // Note that for the two lines originating at the bottom the + // Note that for the two lines originating at the bottom the // position is inverted, so the directions are flipped. - // i.e. position += 1 is right for the top lines and left + // i.e. position += 1 is right for the top lines and left // for their inverted partners on the bottom. switch (moveData[0]) { @@ -3961,6 +3962,8 @@ static void VBlankCB_AngledWipes(void) #define tFadeFromGrayIncrement data[5] #define tDelayTimer data[6] #define tBlend data[7] +#define tBldCntSaved data[8] +#define tShadowColor data[9] static void CreateIntroTask(s16 fadeToGrayDelay, s16 fadeFromGrayDelay, s16 numFades, s16 fadeToGrayIncrement, s16 fadeFromGrayIncrement) { @@ -3988,17 +3991,29 @@ void Task_BattleTransition_Intro(u8 taskId) static bool8 TransitionIntro_FadeToGray(struct Task *task) { + u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); + u16 index = (paletteNum+16)*16+9; // SHADOW_COLOR_INDEX if (task->tDelayTimer == 0 || --task->tDelayTimer == 0) { + task->tDelayTimer = task->tFadeToGrayDelay; task->tBlend += task->tFadeToGrayIncrement; if (task->tBlend > 16) task->tBlend = 16; + if (paletteNum < 16) + task->tShadowColor = gPlttBufferFaded[index]; BlendPalettes(PALETTES_ALL, task->tBlend, RGB(11, 11, 11)); + if (paletteNum < 16) + gPlttBufferFaded[index] = task->tShadowColor; } if (task->tBlend >= 16) { // Fade to gray complete, start fade back + // Save BLDCNT and turn off targets temporarily + task->tBldCntSaved = GetGpuReg(REG_OFFSET_BLDCNT); + SetGpuReg(REG_OFFSET_BLDCNT, task->tBldCntSaved & ~BLDCNT_TGT2_BG_ALL); + if (paletteNum < 16) + gPlttBufferFaded[index] = RGB(11, 11, 11); task->tState++; task->tDelayTimer = task->tFadeFromGrayDelay; } @@ -4009,11 +4024,18 @@ static bool8 TransitionIntro_FadeFromGray(struct Task *task) { if (task->tDelayTimer == 0 || --task->tDelayTimer == 0) { + u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); task->tDelayTimer = task->tFadeFromGrayDelay; task->tBlend -= task->tFadeFromGrayIncrement; if (task->tBlend < 0) task->tBlend = 0; BlendPalettes(PALETTES_ALL, task->tBlend, RGB(11, 11, 11)); + // Restore BLDCNT + SetGpuReg(REG_OFFSET_BLDCNT, task->tBldCntSaved); + if (paletteNum < 16) { + u16 index = (paletteNum+16)*16+9; // SHADOW_COLOR_INDEX + gPlttBufferFaded[index] = task->tShadowColor; + } } if (task->tBlend == 0) { @@ -4170,13 +4192,13 @@ static void InitBlackWipe(s16 *data, s16 startX, s16 startY, s16 endX, s16 endY, static bool8 UpdateBlackWipe(s16 *data, bool8 xExact, bool8 yExact) { u8 numFinished; - + if (tWipeXDist > tWipeYDist) { // X has further to move, move it first tWipeCurrX += tWipeXMove; - // If it has been far enough since Y's + // If it has been far enough since Y's // last move then move it too tWipeTemp += tWipeYDist; if (tWipeTemp > tWipeXDist) @@ -4190,7 +4212,7 @@ static bool8 UpdateBlackWipe(s16 *data, bool8 xExact, bool8 yExact) // Y has further to move, move it first tWipeCurrY += tWipeYMove; - // If it has been far enough since X's + // If it has been far enough since X's // last move then move it too tWipeTemp += tWipeXDist; if (tWipeTemp > tWipeYDist) @@ -4201,9 +4223,9 @@ static bool8 UpdateBlackWipe(s16 *data, bool8 xExact, bool8 yExact) } numFinished = 0; - + // Has X coord reached end? - if ((tWipeXMove > 0 && tWipeCurrX >= tWipeEndX) + if ((tWipeXMove > 0 && tWipeCurrX >= tWipeEndX) || (tWipeXMove < 0 && tWipeCurrX <= tWipeEndX)) { numFinished++; @@ -4212,7 +4234,7 @@ static bool8 UpdateBlackWipe(s16 *data, bool8 xExact, bool8 yExact) } // Has Y coord reached end? - if ((tWipeYMove > 0 && tWipeCurrY >= tWipeEndY) + if ((tWipeYMove > 0 && tWipeCurrY >= tWipeEndY) || (tWipeYMove < 0 && tWipeCurrY <= tWipeEndY)) { numFinished++; @@ -4306,6 +4328,7 @@ static bool8 FrontierLogoWave_Init(struct Task *task) LZ77UnCompVram(sFrontierLogo_Tileset, tileset); LoadPalette(sFrontierLogo_Palette, 0xF0, sizeof(sFrontierLogo_Palette)); sTransitionData->cameraY = 0; + UpdateShadowColor(0x3DEF); // force shadows to gray task->tState++; return FALSE; diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index eafb682397..5889dd79fb 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -1377,7 +1377,7 @@ static void DestroyFogHorizontalSprites(void); #define SHADOW_COLOR_INDEX 9 // Updates just the color of shadows to match special weather blending -static u8 UpdateShadowColor(u16 color) { +u8 UpdateShadowColor(u16 color) { u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); u16 tempBuffer[16]; u16 blendedColor; From b46a8b16cabff0d0f44e026879b31592100147fc Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Tue, 3 May 2022 23:14:00 -0400 Subject: [PATCH 061/145] Added time-of-day related follower messages. --- emotions.txt | 5 ----- follower_emotions.py | 2 +- src/event_object_movement.c | 7 +++---- src/follower_helper.c | 23 ++++++++++++++++++++++- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/emotions.txt b/emotions.txt index 590be93530..39857a7cda 100644 --- a/emotions.txt +++ b/emotions.txt @@ -81,9 +81,7 @@ Your pokemon turned to face the other way, showing a defiant expression. Music (Special): Map feature: {STR_VAR_1} is pulling out the grass. -{STR_VAR_1} is happy to see what's out doors! {STR_VAR_1} is listening intently to the sound of the waves. -Your pokemon is staring spellbound at the night sky! Your pokemon seems to be enjoying sliding around! {STR_VAR_1} is steadily observing the flow of the river. {STR_VAR_1} is noticing the scent of the grass. @@ -95,7 +93,6 @@ Misc: {STR_VAR_1} is playing around in the fallen leaves. {STR_VAR_1} is playing around with a leaf. {STR_VAR_1} is playing around, touching the leaves. -Your pokemon is happily gazing at the beautiful, starry sky! {STR_VAR_1} is rolling around in the grass. {STR_VAR_1} seems to want to return to the lab (after you receive the Mystery egg). Your pokemon is staring at the various items. @@ -106,10 +103,8 @@ Your pokemon is staring at the various items. {STR_VAR_1} swayed around, dancing in a strange manner.(Seems to occur more for Bellsprout)(sprout tower). {STR_VAR_1} swayed and danced around as it pleased (Seems to occur more for Bellsprout)(sprout tower). Your Pokemon is playing around and splashing in the water! (Water's edge). -{STR_VAR_1} is looking up at the sky. {STR_VAR_1} is poking at garbage (Goldenrods underground path). Your pokemon is rolling a screw from a bicycle around. -{STR_VAR_1} is looking up at the sky. {STR_VAR_1} is clawing the grass! {STR_VAR_1} is looking around restlessly at the Forest. {STR_VAR_1} is playfully nibbling at the ground. diff --git a/follower_emotions.py b/follower_emotions.py index 5226348031..ff04b048a0 100644 --- a/follower_emotions.py +++ b/follower_emotions.py @@ -47,4 +47,4 @@ def export_messages(infile, outfile, n=None, indent=0, start=0): if __name__ == '__main__': - export_messages('emotions.txt', 'emotions.h', n=1, start=7) + export_messages('emotions.txt', 'emotions.h', n=4, start=42) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 0750e20e51..b48835117f 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1944,9 +1944,6 @@ bool8 ScrFunc_getfolloweraction(struct ScriptContext *ctx) // Essentially a big emotion_weight[FOLLOWER_EMOTION_LOVE] = 30; } // Conditional messages follow - // Weather-related - if (GetCurrentWeather() == WEATHER_SUNNY_CLOUDS) - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_HAPPY, .index=31}; // Health & status-related multi = mon->hp * 100 / mon->maxHP; if (multi < 20) { @@ -2027,7 +2024,7 @@ bool8 ScrFunc_getfolloweraction(struct ScriptContext *ctx) // Essentially a big } // Match scripted conditional messages // With 50% chance, try to match scripted conditional messages - for (i = (Random() & 1) ? 28 : 0, j = 1; i < 28; i++) { + for (i = (Random() & 1) ? 30 : 0, j = 1; i < 30; i++) { const struct FollowerMsgInfoExtended *info = &gFollowerConditionalMessages[i]; if (info->stFlags == 1 && species != info->st.species) continue; @@ -2045,6 +2042,8 @@ bool8 ScrFunc_getfolloweraction(struct ScriptContext *ctx) // Essentially a big continue; if (info->wtFlags == 2 && GetCurrentMapMusic() != info->wt.song) continue; + if (info->wtFlags == 3 && (!MapHasNaturalLight(gMapHeader.mapType) || gTimeOfDay != info->wt.timeOfDay || GetCurrentWeather() >= WEATHER_RAIN)) + continue; if (info->nearFlags == 1) { if ((multi2 = FindMetatileBehaviorWithinRange(objEvent->currentCoords.x, objEvent->currentCoords.y, info->near.mb.behavior, info->near.mb.distance))) gSpecialVar_Result = multi2; diff --git a/src/follower_helper.c b/src/follower_helper.c index b477f1d1e9..9b0350e0c8 100644 --- a/src/follower_helper.c +++ b/src/follower_helper.c @@ -2,6 +2,7 @@ #include "data.h" #include "event_scripts.h" #include "follower_helper.h" +#include "overworld.h" #include "constants/battle.h" #include "constants/metatile_behaviors.h" #include "constants/pokemon.h" @@ -65,9 +66,15 @@ static const u8 sCondMsg40[] = _("{STR_VAR_1} is gnawing at the ice."); static const u8 sCondMsg41[] = _("{STR_VAR_1} is touching the ice."); static const u8* const sIceTexts[] = {sCondMsg26, sCondMsg40, sCondMsg41, NULL}; static const u8 sCondMsg42[] = _("{STR_VAR_1}'s burn looks painful!"); +static const u8 sCondMsg43[] = _("{STR_VAR_1} is happy to see what's\noutdoors!"); +static const u8 sCondMsg44[] = _("{STR_VAR_1} is looking up at the\nsky."); +static const u8* const sDayTexts[] = {sCondMsg43, sCondMsg44, NULL}; +static const u8 sCondMsg45[] = _("Your POKéMON is staring spellbound\nat the night sky!"); +static const u8 sCondMsg46[] = _("Your POKéMON is happily gazing at\nthe beautiful, starry sky!"); +static const u8* const sNightTexts[] = {sCondMsg45, sCondMsg46, NULL}; // Note that the size of this array must also be correct in event_object_movement -const struct FollowerMsgInfoExtended gFollowerConditionalMessages[28] = { +const struct FollowerMsgInfoExtended gFollowerConditionalMessages[30] = { { .text = (u8*)sCelebiTexts, .textSpread = 1, @@ -266,4 +273,18 @@ const struct FollowerMsgInfoExtended gFollowerConditionalMessages[28] = { .stFlags 3, // STATUS .emotion = FOLLOWER_EMOTION_SAD, }, + { + .text = (u8*)sDayTexts, + .textSpread = 1, + .wt = {.timeOfDay = TIME_OF_DAY_DAY}, + .wtFlags = 3, // time + .emotion = FOLLOWER_EMOTION_MUSIC, + }, + { + .text = (u8*)sNightTexts, + .textSpread = 1, + .wt = {.timeOfDay = TIME_OF_DAY_NIGHT}, + .wtFlags = 3, // time + .emotion = FOLLOWER_EMOTION_MUSIC, + }, }; From c82510e22bffb98fd9c63dc246c332dd1da602cd Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Tue, 3 May 2022 23:46:07 -0400 Subject: [PATCH 062/145] Gamma shift now ignores special sprite palette tags (lights, emotes). --- src/field_weather.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/field_weather.c b/src/field_weather.c index 7a45e4ebc6..721660adde 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -494,7 +494,10 @@ static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) { u8 r, g, b; - if (sPaletteGammaTypes[curPalIndex] == GAMMA_ALT || curPalIndex - 16 == gWeatherPtr->altGammaSpritePalIndex) + // don't blend special sprite palette tags + if (sPaletteGammaTypes[curPalIndex] == GAMMA_ALT || + (curPalIndex >= 16 && (curPalIndex - 16 == gWeatherPtr->altGammaSpritePalIndex || + GetSpritePaletteTagByPaletteNum(curPalIndex - 16) >> 15))) gammaTable = gWeatherPtr->altGammaShifts[gammaIndex]; else gammaTable = gWeatherPtr->gammaShifts[gammaIndex]; From b5cf90a931e8ba282d6311a56df3480f54cac683 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 8 May 2022 00:14:15 -0400 Subject: [PATCH 063/145] Fixed shadow brightness during orb effect. --- src/field_screen_effect.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index 676bebf0df..c5714cbf56 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -1144,6 +1144,7 @@ static void Task_OrbEffect(u8 taskId) ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON); SetGpuRegBits(REG_OFFSET_BLDCNT, gOrbEffectBackgroundLayerFlags[0]); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 7)); + UpdateShadowColor(0x2109); // force shadows to gray SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ); SetBgTilemapPalette(0, 0, 0, 0x1E, 0x14, 0xF); @@ -1208,6 +1209,7 @@ static void Task_OrbEffect(u8 taskId) SetGpuReg(REG_OFFSET_DISPCNT, tDispCnt); SetGpuReg(REG_OFFSET_BLDCNT, tBldCnt); SetGpuReg(REG_OFFSET_BLDALPHA, tBldAlpha); + UpdateShadowColor(RGB_BLACK); // force shadows to gray SetGpuReg(REG_OFFSET_WININ, tWinIn); SetGpuReg(REG_OFFSET_WINOUT, tWinOut); EnableBothScriptContexts(); From d731485a1f0e06fc3e57d048dd75ec43ccef213d Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 29 May 2022 01:16:19 -0400 Subject: [PATCH 064/145] Fixed shadows appearing above freshly spawned object events. Removed shadows from cuttable trees. --- src/data/object_events/object_event_graphics_info.h | 2 +- src/field_effect_helpers.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/object_events/object_event_graphics_info.h b/src/data/object_events/object_event_graphics_info.h index 16677f9bba..71d98268bb 100755 --- a/src/data/object_events/object_event_graphics_info.h +++ b/src/data/object_events/object_event_graphics_info.h @@ -80,7 +80,7 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedSquirtleDoll const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedWooperDoll = {TAG_NONE, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_UnusedWooperDoll, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedPikachuDoll = {TAG_NONE, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_UnusedPikachuDoll, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedPorygon2Doll = {TAG_NONE, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_UnusedPorygon2Doll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CuttableTree = {TAG_NONE, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_CuttableTree, sPicTable_CuttableTree, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CuttableTree = {TAG_NONE, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_NONE, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_CuttableTree, sPicTable_CuttableTree, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MartEmployee = {TAG_NONE, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_MartEmployee, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RooftopSaleWoman = {TAG_NONE, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_RooftopSaleWoman, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Teala = {TAG_NONE, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Teala, gDummySpriteAffineAnimTable}; diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 5fe15936ee..f3d434b115 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -325,7 +325,7 @@ u32 FldEff_Shadow(void) if (graphicsInfo->shadowSize == SHADOW_SIZE_NONE) // don't create a shadow at all return 0; LoadSpriteSheetByTemplate(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 0x94); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 0x94 + 1); // higher = farther back; shadows should be behind object events if (spriteId != MAX_SPRITES) { // SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 12)); From 9fe3a50f2a03fb4781039fbe7947f3bdba65eb25 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sat, 4 Jun 2022 17:50:29 -0400 Subject: [PATCH 065/145] Optimized time of day update. --- src/overworld.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/overworld.c b/src/overworld.c index c78a409c2c..5177fab193 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1595,7 +1595,7 @@ static void OverworldBasic(void) UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); // Every minute if no palette fade is active, update TOD blending as needed - if (!(gPaletteFade.active || (++gTimeUpdateCounter % 3600))) { + if (!(gPaletteFade.active || (++gTimeUpdateCounter >= 3600))) { struct TimeBlendSettings cachedBlend = { .time0 = currentTimeBlend.time0, .time1 = currentTimeBlend.time1, From 7fca787f1dfdf1c00e8a039d06e25c06b9b75a2d Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Tue, 28 Jun 2022 18:57:27 -0400 Subject: [PATCH 066/145] Fixed time of day optimization. --- src/overworld.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/overworld.c b/src/overworld.c index 5177fab193..8cfeab4b63 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1595,7 +1595,7 @@ static void OverworldBasic(void) UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); // Every minute if no palette fade is active, update TOD blending as needed - if (!(gPaletteFade.active || (++gTimeUpdateCounter >= 3600))) { + if (!gPaletteFade.active && ++gTimeUpdateCounter >= 3600) { struct TimeBlendSettings cachedBlend = { .time0 = currentTimeBlend.time0, .time1 = currentTimeBlend.time1, From 8e436e3add955164fd1a739332986e21bfd1227d Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Mon, 4 Jul 2022 03:56:02 -0400 Subject: [PATCH 067/145] Fixed fadescreen interaction with weather on outdoor maps. --- asm/macros/event.inc | 12 +++++++----- data/event_scripts.s | 6 ++++-- data/maps/MtChimney/scripts.inc | 4 ++-- data/maps/MtPyre_Summit/scripts.inc | 5 ++--- src/field_weather.c | 6 ++++-- src/scrcmd.c | 9 +++++++++ 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 643d785618..046fa17658 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -276,7 +276,7 @@ .2byte SPECIAL_\function .endm - @ Blocks script execution until a command or C code manually unblocks it. Generally used with specific + @ Blocks script execution until a command or C code manually unblocks it. Generally used with specific @ commands and specials. Calling EnableBothScriptContexts for instance will allow execution to continue. .macro waitstate .byte 0x27 @@ -998,7 +998,7 @@ .endm @ Gives the player an Egg of the specified species. - @ VAR_RESULT will be set to MON_GIVEN_TO_PARTY, MON_GIVEN_TO_PC, or MON_CANT_GIVE depending on the outcome. + @ VAR_RESULT will be set to MON_GIVEN_TO_PARTY, MON_GIVEN_TO_PC, or MON_CANT_GIVE depending on the outcome. .macro giveegg species:req .byte 0x7a .2byte \species @@ -1416,7 +1416,7 @@ .2byte \out .endm - @ Gives 'count' coins to the player, up to a total of MAX_COINS. + @ Gives 'count' coins to the player, up to a total of MAX_COINS. @ If the player already has MAX_COINS then VAR_RESULT is set to TRUE, otherwise it is set to FALSE. .macro addcoins count:req .byte 0xb4 @@ -1677,9 +1677,11 @@ @ Equivalent to fadescreen but copies gPlttBufferUnfaded to gPaletteDecompressionBuffer on the fade out @ and the reverse on the fade in, in effect saving gPlttBufferUnfaded to restore it. - .macro fadescreenswapbuffers mode:req + @ If nowait set, does not wait for the fade to complete + .macro fadescreenswapbuffers mode:req, nowait=0 .byte 0xdc .byte \mode + .byte \nowait .endm @ Buffers the specified trainer's class name to the given string var. @@ -1893,7 +1895,7 @@ @ Gives 'amount' of the specified 'item' to the player and prints a message with fanfare. @ If the player doesn't have space for all the items then as many are added as possible, the - @ message indicates there is no room, and VAR_RESULT is set to FALSE. + @ message indicates there is no room, and VAR_RESULT is set to FALSE. @ Otherwise VAR_RESULT is set to TRUE, and the message indicates they have received the item(s). .macro giveitem item:req, amount=1 setorcopyvar VAR_0x8000, \item diff --git a/data/event_scripts.s b/data/event_scripts.s index 4318ca2eb0..19e1876847 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -716,12 +716,14 @@ Common_EventScript_PlayGymBadgeFanfare:: return Common_EventScript_OutOfCenterPartyHeal:: - fadescreen FADE_TO_BLACK + fadescreenswapbuffers FADE_TO_BLACK playfanfare MUS_HEAL waitfanfare special HealPlayerParty + @ start fade then immediately load following pokemon, and wait for fade + fadescreenswapbuffers FADE_FROM_BLACK, 1 callnative UpdateFollowingPokemon - fadescreen FADE_FROM_BLACK + callfunc ScrFunc_WaitPaletteNotActive return EventScript_RegionMap:: diff --git a/data/maps/MtChimney/scripts.inc b/data/maps/MtChimney/scripts.inc index 1931633258..6e8df88827 100644 --- a/data/maps/MtChimney/scripts.inc +++ b/data/maps/MtChimney/scripts.inc @@ -54,13 +54,13 @@ MtChimney_EventScript_Maxie:: msgbox MtChimney_Text_MaxieYouHaventSeenLastOfMagma, MSGBOX_DEFAULT closemessage delay 30 - fadescreen FADE_TO_BLACK + fadescreenswapbuffers FADE_TO_BLACK removeobject LOCALID_MAXIE removeobject LOCALID_MAGMA_GRUNT_1 removeobject LOCALID_TABITHA removeobject LOCALID_MAGMA_GRUNT_2 setflag FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA - fadescreen FADE_FROM_BLACK + fadescreenswapbuffers FADE_FROM_BLACK setobjectxyperm LOCALID_ARCHIE, 10, 12 addobject LOCALID_ARCHIE call_if_eq VAR_FACING, DIR_EAST, MtChimney_EventScript_ArchieApproachPlayerEast diff --git a/data/maps/MtPyre_Summit/scripts.inc b/data/maps/MtPyre_Summit/scripts.inc index 3de60df3f2..5a6d23797a 100644 --- a/data/maps/MtPyre_Summit/scripts.inc +++ b/data/maps/MtPyre_Summit/scripts.inc @@ -49,7 +49,7 @@ MtPyre_Summit_EventScript_TeamAquaExits:: call_if_eq VAR_0x8008, 2, MtPyre_Summit_EventScript_ArchieFacePlayer2 msgbox MtPyre_Summit_Text_ArchieWeGotTheOrbLetsGo, MSGBOX_DEFAULT closemessage - fadescreen FADE_TO_BLACK + fadescreenswapbuffers FADE_TO_BLACK removeobject LOCALID_ARCHIE removeobject LOCALID_GRUNT_1 removeobject LOCALID_GRUNT_2 @@ -58,7 +58,7 @@ MtPyre_Summit_EventScript_TeamAquaExits:: setflag FLAG_HIDE_MT_PYRE_SUMMIT_ARCHIE setflag FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA fadedefaultbgm - fadescreen FADE_FROM_BLACK + fadescreenswapbuffers FADE_FROM_BLACK delay 20 setvar VAR_MT_PYRE_STATE, 1 call_if_eq VAR_0x8008, 0, MtPyre_Summit_EventScript_OldLadyApproachPlayer0 @@ -622,4 +622,3 @@ MtPyre_Summit_Text_HoennTrioTale: .string "becalmed the two enraged POKéMON.\p" .string "Then, its duty done, the green POKéMON\n" .string "flew off into the wild blue yonder…$" - diff --git a/src/field_weather.c b/src/field_weather.c index 721660adde..2d1f2a8096 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -811,8 +811,10 @@ void FadeScreen(u8 mode, s8 delay) if (fadeOut) { - if (TRUE || useWeatherPal) // TODO: Can copying Faded to Unfaded before fadeout cause problems ? - CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2); + // Note: Copying faded -> unfaded like this works fine, except if the screen is faded back in + // without transitioning to a different screen + // For cases like that, use fadescreenswapbuffers + CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2); BeginNormalPaletteFade(PALETTES_ALL, delay, 0, 16, fadeColor); gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; diff --git a/src/scrcmd.c b/src/scrcmd.c index 58be7085f5..1cef351d83 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -632,6 +632,12 @@ static bool8 IsPaletteNotActive(void) return FALSE; } +// pauses script until palette fade inactive +bool8 ScrFunc_WaitPaletteNotActive(struct ScriptContext *ctx) { + SetupNativeScript(ctx, IsPaletteNotActive); + return TRUE; +} + bool8 ScrCmd_fadescreen(struct ScriptContext *ctx) { FadeScreen(ScriptReadByte(ctx), 0); @@ -652,6 +658,7 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx) bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx) { u8 mode = ScriptReadByte(ctx); + u8 nowait = ScriptReadByte(ctx); switch (mode) { @@ -668,6 +675,8 @@ bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx) break; } + if (nowait) + return FALSE; SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } From b4cc3ca7b72f42fd54e4eaea67489dd2c510ef7c Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Fri, 15 Jul 2022 19:02:34 -0400 Subject: [PATCH 068/145] Tileset swapPalettes can now use palette 12 for swapping. Fixed Slateport Fan Club lights. --- data/tilesets/headers.inc | 18 +++++++++--------- include/global.fieldmap.h | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index 8a1e8f444b..8be4c79652 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -1,6 +1,6 @@ .align 2 gTileset_General:: - .byte 0x41 @ is compressed, swapPalettes 4 + .byte 0x21 @ is compressed, swapPalettes 4 .byte FALSE @ is secondary tileset .2byte 0x10 @ lightPalettes 4 .4byte gTilesetTiles_General @@ -11,7 +11,7 @@ gTileset_General:: .align 2 gTileset_Petalburg:: - .byte 0x21 @ is compressed, swapPalettes 9 + .byte 0x11 @ is compressed, swapPalettes 9 .byte TRUE @ is secondary tileset .2byte 0x00B @ lightPalettes 6,7,9, custom 9 .4byte gTilesetTiles_Petalburg @@ -44,9 +44,9 @@ gTileset_Dewford:: .align 2 gTileset_Slateport:: - .byte 5 @ is compressed, swapPalettes 6 + .byte 3 @ is compressed, swapPalettes 6 .byte TRUE @ is secondary tileset - .2byte 0x1 @ lightPalettes 6 + .2byte 0x41 @ lightPalettes 6,12 .4byte gTilesetTiles_Slateport .4byte gTilesetPalettes_Slateport .4byte gMetatiles_Slateport @@ -77,7 +77,7 @@ gTileset_Lavaridge:: .align 2 gTileset_Fallarbor:: - .byte 9 @ is compressed, swapPalettes 7 + .byte 5 @ is compressed, swapPalettes 7 .byte TRUE @ is secondary tileset .2byte 2 @ lightPalettes 7 .4byte gTilesetTiles_Fallarbor @@ -99,7 +99,7 @@ gTileset_Fortree:: .align 2 gTileset_Lilycove:: - .byte 5 @ is compressed, swapPalettes 6 + .byte 3 @ is compressed, swapPalettes 6 .byte TRUE @ is secondary tileset .2byte 0x01 @ lightPalettes 6 .4byte gTilesetTiles_Lilycove @@ -111,7 +111,7 @@ gTileset_Lilycove:: .align 2 gTileset_Mossdeep:: - .byte 0x11 @ is compressed, swapPalettes 8 + .byte 0x09 @ is compressed, swapPalettes 8 .byte TRUE @ is secondary tileset .2byte 0x4 @ lightPalettes 8 .4byte gTilesetTiles_Mossdeep @@ -134,7 +134,7 @@ gTileset_EverGrande:: .align 2 gTileset_Pacifidlog:: - .byte 0x21 @ is compressed, swapPalettes 9 + .byte 0x11 @ is compressed, swapPalettes 9 .byte TRUE @ is secondary tileset .2byte 8 @ lightPalettes 9 .4byte gTilesetTiles_Pacifidlog @@ -145,7 +145,7 @@ gTileset_Pacifidlog:: .align 2 gTileset_Sootopolis:: - .byte 5 @ is compressed, swapPalettes 6 + .byte 3 @ is compressed, swapPalettes 6 .byte TRUE @ is secondary tileset .2byte 0x101 @ lightPalettes 6, customLights 6 .4byte gTilesetTiles_Sootopolis diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 9882428ce1..ac8c6e3e64 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -32,8 +32,8 @@ typedef void (*TilesetCB)(void); struct Tileset { - /*0x00*/ u8 isCompressed:2; - /*0x00*/ u8 swapPalettes:6; // bitmask determining whether palette has an alternate, night-time palette + /*0x00*/ u8 isCompressed:1; + /*0x00*/ u8 swapPalettes:7; // bitmask determining whether palette has an alternate, night-time palette /*0x01*/ bool8 isSecondary; /*0x02*/ u8 lightPalettes; // Bitmask determining whether a palette should be time-blended as a light /*0x03*/ u8 customLightColor; // Bitmask determining which light palettes have custom light colors (color 15) From 8aef50c7977b0daf79c7045de5876beefcfd7d73 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Thu, 21 Jul 2022 21:36:40 -0400 Subject: [PATCH 069/145] Fixed leftover Slateport light metatiles. --- .../secondary/slateport/metatiles.bin | Bin 6496 -> 6496 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/tilesets/secondary/slateport/metatiles.bin b/data/tilesets/secondary/slateport/metatiles.bin index 3ba541bfbd4a2a77a00b1a692ed22bf48377f019..81c28bc3c6104e5a8da3344bce8e14b65db96f88 100644 GIT binary patch delta 22 ccmaE0^uTDt9)2c?=E?i`tANyID*-i50Bb7;-~a#s delta 22 ccmaE0^uTDt9)2dt!;|;%R{^QbRsw3A0B`^ZVgLXD From 891b43266965081a92e423111ca9aeb898663f8a Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Mon, 15 Aug 2022 23:18:11 -0400 Subject: [PATCH 070/145] Fixed shadow tile tag. --- include/constants/field_effects.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index a29fd4e60c..05d8d777db 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -129,10 +129,10 @@ #define FLDEFF_PAL_TAG_UNKNOWN 0x1011 // tile tags, for field effects that may have many copies on screen at once -#define FLDEFF_TILE_TAG_SHADOW_SMALL 0x1300 -#define FLDEFF_TILE_TAG_SHADOW_MEDIUM 0x1301 -#define FLDEFF_TILE_TAG_SHADOW_LARGE 0x1302 -#define FLDEFF_TILE_TAG_SHADOW_EXTRA_LARGE 0x1303 +#define FLDEFF_TILE_TAG_SHADOW_SMALL 0x1400 +#define FLDEFF_TILE_TAG_SHADOW_MEDIUM 0x1401 +#define FLDEFF_TILE_TAG_SHADOW_LARGE 0x1402 +#define FLDEFF_TILE_TAG_SHADOW_EXTRA_LARGE 0x1403 // Duplicates of event_object_movement tags #define FLDEFF_PAL_TAG_MAY 0x1110 // OBJ_EVENT_PAL_TAG_MAY From 4654913cb694843b38800aa31b9d7a55a823a92d Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 21 Aug 2022 16:44:17 -0400 Subject: [PATCH 071/145] Fixed gamma shift not blending the right palettes. Refactored/improved some lighting code. --- src/field_weather.c | 12 +++---- src/overworld.c | 83 +++++++++++++++++++++++---------------------- 2 files changed, 46 insertions(+), 49 deletions(-) diff --git a/src/field_weather.c b/src/field_weather.c index 3c8d82f816..1a337f52e2 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -547,15 +547,11 @@ static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) else { if (MapHasNaturalLight(gMapHeader.mapType)) { // Time-blend - // Create the palette mask - u32 palettes = PALETTES_ALL; - numPalettes += startPalIndex; - palettes = (palettes >> startPalIndex) << startPalIndex; - palettes = (palettes << (32-numPalettes)) >> (32-numPalettes); - UpdateAltBgPalettes(palettes & PALETTES_BG); - UpdatePalettesWithTime(palettes); + u32 palettes = ((1 << numPalettes) - 1) << startPalIndex; + UpdateAltBgPalettes(palettes & PALETTES_BG); + UpdatePalettesWithTime(palettes); } else { // copy - CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16)); + CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16)); } } } diff --git a/src/overworld.c b/src/overworld.c index 8a3d2c57da..889b2e9f92 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -819,7 +819,7 @@ void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum) CopySecondaryTilesetToVramUsingHeap(gMapHeader.mapLayout); LoadSecondaryTilesetPalette(gMapHeader.mapLayout, TRUE); // skip copying to Faded, gamma shift will take care of it - ApplyWeatherGammaShiftToPals(6, 6); // palettes [6,12] + ApplyWeatherGammaShiftToPals(NUM_PALS_IN_PRIMARY, NUM_PALS_TOTAL - NUM_PALS_IN_PRIMARY); // palettes [6,12] InitSecondaryTilesetAnimation(); UpdateLocationHistoryForRoamer(); @@ -1468,46 +1468,47 @@ const struct BlendSettings gTimeOfDayBlend[] = }; u8 UpdateTimeOfDay(void) { - s32 hours, minutes; - RtcCalcLocalTime(); - hours = gLocalTime.hours; - minutes = gLocalTime.minutes; - if (hours < 4) { // night - currentTimeBlend.weight = 256; - currentTimeBlend.altWeight = 0; - return gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; - } else if (hours < 7) { // night->twilight - currentTimeBlend.time0 = TIME_OF_DAY_NIGHT; - currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; - currentTimeBlend.weight = 256 - 256 * ((hours - 4) * 60 + minutes) / ((7-4)*60); - currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2; - return gTimeOfDay = TIME_OF_DAY_DAY; - } else if (hours < 10) { // twilight->day - currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; - currentTimeBlend.time1 = TIME_OF_DAY_DAY; - currentTimeBlend.weight = 256 - 256 * ((hours - 7) * 60 + minutes) / ((10-7)*60); - currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2 + 128; - return gTimeOfDay = TIME_OF_DAY_DAY; - } else if (hours < 18) { // day - currentTimeBlend.weight = currentTimeBlend.altWeight = 256; - return gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_DAY; - } else if (hours < 20) { // day->twilight - currentTimeBlend.time0 = TIME_OF_DAY_DAY; - currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; - currentTimeBlend.weight = 256 - 256 * ((hours - 18) * 60 + minutes) / ((20-18)*60); - currentTimeBlend.altWeight = currentTimeBlend.weight / 2 + 128; - return gTimeOfDay = TIME_OF_DAY_TWILIGHT; - } else if (hours < 22) { // twilight->night - currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; - currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; - currentTimeBlend.weight = 256 - 256 * ((hours - 20) * 60 + minutes) / ((22-20)*60); - currentTimeBlend.altWeight = currentTimeBlend.weight / 2; - return gTimeOfDay = TIME_OF_DAY_NIGHT; - } else { // 22-24, night - currentTimeBlend.weight = 256; - currentTimeBlend.altWeight = 0; - return gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; - } + s32 hours, minutes; + RtcCalcLocalTime(); + hours = gLocalTime.hours; + minutes = gLocalTime.minutes; + if (hours < 4) { // night + currentTimeBlend.weight = 256; + currentTimeBlend.altWeight = 0; + gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; + } else if (hours < 7) { // night->twilight + currentTimeBlend.time0 = TIME_OF_DAY_NIGHT; + currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; + currentTimeBlend.weight = 256 - 256 * ((hours - 4) * 60 + minutes) / ((7-4)*60); + currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2; + gTimeOfDay = TIME_OF_DAY_DAY; + } else if (hours < 10) { // twilight->day + currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; + currentTimeBlend.time1 = TIME_OF_DAY_DAY; + currentTimeBlend.weight = 256 - 256 * ((hours - 7) * 60 + minutes) / ((10-7)*60); + currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2 + 128; + gTimeOfDay = TIME_OF_DAY_DAY; + } else if (hours < 18) { // day + currentTimeBlend.weight = currentTimeBlend.altWeight = 256; + gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_DAY; + } else if (hours < 20) { // day->twilight + currentTimeBlend.time0 = TIME_OF_DAY_DAY; + currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; + currentTimeBlend.weight = 256 - 256 * ((hours - 18) * 60 + minutes) / ((20-18)*60); + currentTimeBlend.altWeight = currentTimeBlend.weight / 2 + 128; + gTimeOfDay = TIME_OF_DAY_TWILIGHT; + } else if (hours < 22) { // twilight->night + currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; + currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; + currentTimeBlend.weight = 256 - 256 * ((hours - 20) * 60 + minutes) / ((22-20)*60); + currentTimeBlend.altWeight = currentTimeBlend.weight / 2; + gTimeOfDay = TIME_OF_DAY_NIGHT; + } else { // 22-24, night + currentTimeBlend.weight = 256; + currentTimeBlend.altWeight = 0; + gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; + } + return gTimeOfDay; } bool8 MapHasNaturalLight(u8 mapType) { // Whether a map type is naturally lit/outside From c704591c8c769373f58736361c6f85f5e7b18c6a Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Mon, 29 Aug 2022 01:04:26 -0400 Subject: [PATCH 072/145] Fixed field move mon palette at night. --- include/constants/field_effects.h | 1 + src/field_effect.c | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index 05d8d777db..25edea1af9 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -127,6 +127,7 @@ #define FLDEFF_PAL_TAG_SMALL_SPARKLE 0x100F #define FLDEFF_PAL_TAG_HOF_MONITOR 0x1010 #define FLDEFF_PAL_TAG_UNKNOWN 0x1011 +#define FLDEFF_PAL_TAG_FIELD_MOVE_MON 0x8400 // tile tags, for field effects that may have many copies on screen at once #define FLDEFF_TILE_TAG_SHADOW_SMALL 0x1400 diff --git a/src/field_effect.c b/src/field_effect.c index cbf1be0bbc..6165d515ee 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -914,8 +914,10 @@ u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) u8 CreateMonSprite_FieldMove(u16 species, u32 otId, u32 personality, s16 x, s16 y, u8 subpriority) { const struct CompressedSpritePalette *spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); - u16 spriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, 1, x, y, 0, spritePalette->tag); - PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); + // force load unique tag here to avoid collision with follower pokemon + u8 paletteSlot = AllocSpritePalette(FLDEFF_PAL_TAG_FIELD_MOVE_MON); + u16 spriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, 1, x, y, paletteSlot, TAG_NONE); + PreservePaletteInWeather(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_FIELD_MOVE_MON) + 0x10); if (spriteId == 0xFFFF) return MAX_SPRITES; else From f7759760e0f319757d2e92aadb429c170fee205e Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 28 Aug 2022 01:39:53 -0400 Subject: [PATCH 073/145] Improved shadows for Lavaridge, escalator, Escape warps. --- src/field_effect.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/field_effect.c b/src/field_effect.c index 6165d515ee..bebf8e4051 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1587,6 +1587,7 @@ static bool8 EscalatorWarpOut_WaitForPlayer(struct Task *task) if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent)) { ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(GetPlayerFacingDirection())); + objectEvent->noShadow = TRUE; // hide shadow for cleaner movement task->tState++; task->data[2] = 0; task->data[3] = 0; @@ -1708,6 +1709,7 @@ static bool8 EscalatorWarpIn_Init(struct Task *task) u8 behavior; CameraObjectReset2(); objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + objectEvent->noShadow = TRUE; ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(DIR_EAST)); PlayerGetDestCoords(&x, &y); behavior = MapGridGetMetatileBehaviorAt(x, y); @@ -1804,6 +1806,7 @@ static bool8 EscalatorWarpIn_End(struct Task *task) { struct ObjectEvent *objectEvent; objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + objectEvent->noShadow = FALSE; if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { CameraObjectReset1(); @@ -1956,6 +1959,7 @@ static bool8 LavaridgeGymB1FWarpEffect_Init(struct Task *task, struct ObjectEven SetCameraPanningCallback(NULL); gPlayerAvatar.preventStep = TRUE; objectEvent->fixedPriority = 1; + objectEvent->noShadow = TRUE; task->data[1] = 1; task->data[0]++; return TRUE; @@ -2148,6 +2152,7 @@ static bool8 LavaridgeGym1FWarpEffect_Init(struct Task *task, struct ObjectEvent CameraObjectReset2(); gPlayerAvatar.preventStep = TRUE; objectEvent->fixedPriority = 1; + objectEvent->noShadow = TRUE; task->data[0]++; return FALSE; } From d6bac9895d4681c0916541e1aac27c2dba955a53 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sat, 3 Sep 2022 15:23:49 -0400 Subject: [PATCH 074/145] Fixed shadow palette during contests. --- src/contest_util.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/contest_util.c b/src/contest_util.c index d8726d860f..6289f2cdc5 100644 --- a/src/contest_util.c +++ b/src/contest_util.c @@ -2505,6 +2505,12 @@ void SetLinkContestPlayerGfx(void) } } +// copied from event_object_movement +#define OBJ_EVENT_PAL_TAG_BRENDAN 0x1100 +#define OBJ_EVENT_PAL_TAG_MAY 0x1110 +#define OBJ_EVENT_PAL_TAG_RS_BRENDAN 0x1122 +#define OBJ_EVENT_PAL_TAG_RS_MAY 0x1123 + void LoadLinkContestPlayerPalettes(void) { int i; @@ -2513,28 +2519,28 @@ void LoadLinkContestPlayerPalettes(void) struct Sprite *sprite; static const u8 sContestantLocalIds[CONTESTANT_COUNT] = { 3, 4, 5, 14 }; - gReservedSpritePaletteCount = 12; + // gReservedSpritePaletteCount = 12; + // TODO: Does dynamically allocating link player palettes break link contests? if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) { for (i = 0; i < gNumLinkContestPlayers; i++) { objectEventId = GetObjectEventIdByLocalIdAndMap(sContestantLocalIds[i], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); sprite = &gSprites[gObjectEvents[objectEventId].spriteId]; - sprite->oam.paletteNum = 6 + i; version = (u8)gLinkPlayers[i].version; if (version == VERSION_RUBY || version == VERSION_SAPPHIRE) { if (gLinkPlayers[i].gender == MALE) - LoadPalette(gObjectEventPal_RubySapphireBrendan, 0x160 + i * 0x10, 0x20); + sprite->oam.paletteNum = LoadObjectEventPalette(OBJ_EVENT_PAL_TAG_RS_BRENDAN); else - LoadPalette(gObjectEventPal_RubySapphireMay, 0x160 + i * 0x10, 0x20); + sprite->oam.paletteNum = LoadObjectEventPalette(OBJ_EVENT_PAL_TAG_RS_MAY); } else { if (gLinkPlayers[i].gender == MALE) - LoadPalette(gObjectEventPal_Brendan, 0x160 + i * 0x10, 0x20); + sprite->oam.paletteNum = LoadObjectEventPalette(OBJ_EVENT_PAL_TAG_BRENDAN); else - LoadPalette(gObjectEventPal_May, 0x160 + i * 0x10, 0x20); + sprite->oam.paletteNum = LoadObjectEventPalette(OBJ_EVENT_PAL_TAG_MAY); } } } From 782889d5334b4a7bf78449ce903fbb1f8c9ba2f7 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Fri, 25 Nov 2022 15:02:07 -0500 Subject: [PATCH 075/145] Fixed potentially unaligned tileset palettes. Credit to SBird --- src/data/tilesets/graphics.h | 148 +++++++++++++++++------------------ src/graphics.c | 2 +- src/palette.c | 2 + 3 files changed, 77 insertions(+), 75 deletions(-) diff --git a/src/data/tilesets/graphics.h b/src/data/tilesets/graphics.h index 2fdc28d213..a6ca2746bf 100644 --- a/src/data/tilesets/graphics.h +++ b/src/data/tilesets/graphics.h @@ -1,6 +1,6 @@ const u32 gTilesetTiles_Petalburg[] = INCBIN_U32("data/tilesets/secondary/petalburg/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Petalburg[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Petalburg[][16] = { INCBIN_U16("data/tilesets/secondary/petalburg/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/petalburg/palettes/01.gbapal"), @@ -22,7 +22,7 @@ const u16 gTilesetPalettes_Petalburg[][16] = const u32 gTilesetTiles_Rustboro[] = INCBIN_U32("data/tilesets/secondary/rustboro/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Rustboro[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Rustboro[][16] = { INCBIN_U16("data/tilesets/secondary/rustboro/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/rustboro/palettes/01.gbapal"), @@ -44,7 +44,7 @@ const u16 gTilesetPalettes_Rustboro[][16] = const u32 gTilesetTiles_Dewford[] = INCBIN_U32("data/tilesets/secondary/dewford/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Dewford[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Dewford[][16] = { INCBIN_U16("data/tilesets/secondary/dewford/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/dewford/palettes/01.gbapal"), @@ -66,7 +66,7 @@ const u16 gTilesetPalettes_Dewford[][16] = const u32 gTilesetTiles_Slateport[] = INCBIN_U32("data/tilesets/secondary/slateport/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Slateport[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Slateport[][16] = { INCBIN_U16("data/tilesets/secondary/slateport/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/slateport/palettes/01.gbapal"), @@ -88,7 +88,7 @@ const u16 gTilesetPalettes_Slateport[][16] = const u32 gTilesetTiles_Mauville[] = INCBIN_U32("data/tilesets/secondary/mauville/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Mauville[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Mauville[][16] = { INCBIN_U16("data/tilesets/secondary/mauville/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mauville/palettes/01.gbapal"), @@ -110,7 +110,7 @@ const u16 gTilesetPalettes_Mauville[][16] = const u32 gTilesetTiles_Lavaridge[] = INCBIN_U32("data/tilesets/secondary/lavaridge/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Lavaridge[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Lavaridge[][16] = { INCBIN_U16("data/tilesets/secondary/lavaridge/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lavaridge/palettes/01.gbapal"), @@ -132,7 +132,7 @@ const u16 gTilesetPalettes_Lavaridge[][16] = const u32 gTilesetTiles_Fallarbor[] = INCBIN_U32("data/tilesets/secondary/fallarbor/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Fallarbor[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Fallarbor[][16] = { INCBIN_U16("data/tilesets/secondary/fallarbor/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/fallarbor/palettes/01.gbapal"), @@ -154,7 +154,7 @@ const u16 gTilesetPalettes_Fallarbor[][16] = const u32 gTilesetTiles_Fortree[] = INCBIN_U32("data/tilesets/secondary/fortree/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Fortree[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Fortree[][16] = { INCBIN_U16("data/tilesets/secondary/fortree/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/fortree/palettes/01.gbapal"), @@ -176,7 +176,7 @@ const u16 gTilesetPalettes_Fortree[][16] = const u32 gTilesetTiles_Lilycove[] = INCBIN_U32("data/tilesets/secondary/lilycove/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Lilycove[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Lilycove[][16] = { INCBIN_U16("data/tilesets/secondary/lilycove/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lilycove/palettes/01.gbapal"), @@ -198,7 +198,7 @@ const u16 gTilesetPalettes_Lilycove[][16] = const u32 gTilesetTiles_Mossdeep[] = INCBIN_U32("data/tilesets/secondary/mossdeep/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Mossdeep[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Mossdeep[][16] = { INCBIN_U16("data/tilesets/secondary/mossdeep/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mossdeep/palettes/01.gbapal"), @@ -220,7 +220,7 @@ const u16 gTilesetPalettes_Mossdeep[][16] = const u32 gTilesetTiles_EverGrande[] = INCBIN_U32("data/tilesets/secondary/ever_grande/tiles.4bpp.lz"); -const u16 gTilesetPalettes_EverGrande[][16] = +const u16 ALIGNED(4) gTilesetPalettes_EverGrande[][16] = { INCBIN_U16("data/tilesets/secondary/ever_grande/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/ever_grande/palettes/01.gbapal"), @@ -242,7 +242,7 @@ const u16 gTilesetPalettes_EverGrande[][16] = const u32 gTilesetTiles_Pacifidlog[] = INCBIN_U32("data/tilesets/secondary/pacifidlog/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Pacifidlog[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Pacifidlog[][16] = { INCBIN_U16("data/tilesets/secondary/pacifidlog/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pacifidlog/palettes/01.gbapal"), @@ -264,7 +264,7 @@ const u16 gTilesetPalettes_Pacifidlog[][16] = const u32 gTilesetTiles_Sootopolis[] = INCBIN_U32("data/tilesets/secondary/sootopolis/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Sootopolis[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Sootopolis[][16] = { INCBIN_U16("data/tilesets/secondary/sootopolis/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/sootopolis/palettes/01.gbapal"), @@ -286,7 +286,7 @@ const u16 gTilesetPalettes_Sootopolis[][16] = const u32 gTilesetTiles_BattleFrontierOutsideWest[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_outside_west/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleFrontierOutsideWest[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleFrontierOutsideWest[][16] = { INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/palettes/01.gbapal"), @@ -308,7 +308,7 @@ const u16 gTilesetPalettes_BattleFrontierOutsideWest[][16] = const u32 gTilesetTiles_BattleFrontierOutsideEast[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_outside_east/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleFrontierOutsideEast[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleFrontierOutsideEast[][16] = { INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/palettes/01.gbapal"), @@ -330,7 +330,7 @@ const u16 gTilesetPalettes_BattleFrontierOutsideEast[][16] = const u32 gTilesetTiles_InsideBuilding[] = INCBIN_U32("data/tilesets/primary/building/tiles.4bpp.lz"); -const u16 gTilesetPalettes_InsideBuilding[][16] = +const u16 ALIGNED(4) gTilesetPalettes_InsideBuilding[][16] = { INCBIN_U16("data/tilesets/primary/building/palettes/00.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/01.gbapal"), @@ -352,7 +352,7 @@ const u16 gTilesetPalettes_InsideBuilding[][16] = const u32 gTilesetTiles_Shop[] = INCBIN_U32("data/tilesets/secondary/shop/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Shop[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Shop[][16] = { INCBIN_U16("data/tilesets/secondary/shop/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/shop/palettes/01.gbapal"), @@ -374,7 +374,7 @@ const u16 gTilesetPalettes_Shop[][16] = const u32 gTilesetTiles_PokemonCenter[] = INCBIN_U32("data/tilesets/secondary/pokemon_center/tiles.4bpp.lz"); -const u16 gTilesetPalettes_PokemonCenter[][16] = +const u16 ALIGNED(4) gTilesetPalettes_PokemonCenter[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/01.gbapal"), @@ -396,7 +396,7 @@ const u16 gTilesetPalettes_PokemonCenter[][16] = const u32 gTilesetTiles_Cave[] = INCBIN_U32("data/tilesets/secondary/cave/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Cave[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Cave[][16] = { INCBIN_U16("data/tilesets/secondary/cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/01.gbapal"), @@ -418,7 +418,7 @@ const u16 gTilesetPalettes_Cave[][16] = const u32 gTilesetTiles_PokemonSchool[] = INCBIN_U32("data/tilesets/secondary/pokemon_school/tiles.4bpp.lz"); -const u16 gTilesetPalettes_PokemonSchool[][16] = +const u16 ALIGNED(4) gTilesetPalettes_PokemonSchool[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_school/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_school/palettes/01.gbapal"), @@ -440,7 +440,7 @@ const u16 gTilesetPalettes_PokemonSchool[][16] = const u32 gTilesetTiles_PokemonFanClub[] = INCBIN_U32("data/tilesets/secondary/pokemon_fan_club/tiles.4bpp.lz"); -const u16 gTilesetPalettes_PokemonFanClub[][16] = +const u16 ALIGNED(4) gTilesetPalettes_PokemonFanClub[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_fan_club/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_fan_club/palettes/01.gbapal"), @@ -462,7 +462,7 @@ const u16 gTilesetPalettes_PokemonFanClub[][16] = const u32 gTilesetTiles_Unused1[] = INCBIN_U32("data/tilesets/secondary/unused_1/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Unused1[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Unused1[][16] = { INCBIN_U16("data/tilesets/secondary/unused_1/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_1/palettes/01.gbapal"), @@ -484,7 +484,7 @@ const u16 gTilesetPalettes_Unused1[][16] = const u32 gTilesetTiles_MeteorFalls[] = INCBIN_U32("data/tilesets/secondary/meteor_falls/tiles.4bpp.lz"); -const u16 gTilesetPalettes_MeteorFalls[][16] = +const u16 ALIGNED(4) gTilesetPalettes_MeteorFalls[][16] = { INCBIN_U16("data/tilesets/secondary/meteor_falls/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/meteor_falls/palettes/01.gbapal"), @@ -506,7 +506,7 @@ const u16 gTilesetPalettes_MeteorFalls[][16] = const u32 gTilesetTiles_OceanicMuseum[] = INCBIN_U32("data/tilesets/secondary/oceanic_museum/tiles.4bpp.lz"); -const u16 gTilesetPalettes_OceanicMuseum[][16] = +const u16 ALIGNED(4) gTilesetPalettes_OceanicMuseum[][16] = { INCBIN_U16("data/tilesets/secondary/oceanic_museum/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/oceanic_museum/palettes/01.gbapal"), @@ -529,7 +529,7 @@ const u16 gTilesetPalettes_OceanicMuseum[][16] = const u32 gTilesetTiles_CableClub[] = INCBIN_U32("data/tilesets/secondary/cable_club/tiles.4bpp"); const u32 gTilesetTiles_UnknownCableClub[] = INCBIN_U32("data/tilesets/secondary/cable_club/unknown_tiles.4bpp"); -const u16 gTilesetPalettes_CableClub[][16] = +const u16 ALIGNED(4) gTilesetPalettes_CableClub[][16] = { INCBIN_U16("data/tilesets/secondary/cable_club/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/01.gbapal"), @@ -551,7 +551,7 @@ const u16 gTilesetPalettes_CableClub[][16] = const u32 gTilesetTiles_SeashoreHouse[] = INCBIN_U32("data/tilesets/secondary/seashore_house/tiles.4bpp.lz"); -const u16 gTilesetPalettes_SeashoreHouse[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SeashoreHouse[][16] = { INCBIN_U16("data/tilesets/secondary/seashore_house/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/seashore_house/palettes/01.gbapal"), @@ -573,7 +573,7 @@ const u16 gTilesetPalettes_SeashoreHouse[][16] = const u32 gTilesetTiles_PrettyPetalFlowerShop[] = INCBIN_U32("data/tilesets/secondary/pretty_petal_flower_shop/tiles.4bpp.lz"); -const u16 gTilesetPalettes_PrettyPetalFlowerShop[][16] = +const u16 ALIGNED(4) gTilesetPalettes_PrettyPetalFlowerShop[][16] = { INCBIN_U16("data/tilesets/secondary/pretty_petal_flower_shop/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pretty_petal_flower_shop/palettes/01.gbapal"), @@ -595,7 +595,7 @@ const u16 gTilesetPalettes_PrettyPetalFlowerShop[][16] = const u32 gTilesetTiles_PokemonDayCare[] = INCBIN_U32("data/tilesets/secondary/pokemon_day_care/tiles.4bpp.lz"); -const u16 gTilesetPalettes_PokemonDayCare[][16] = +const u16 ALIGNED(4) gTilesetPalettes_PokemonDayCare[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_day_care/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_day_care/palettes/01.gbapal"), @@ -617,7 +617,7 @@ const u16 gTilesetPalettes_PokemonDayCare[][16] = const u32 gTilesetTiles_Facility[] = INCBIN_U32("data/tilesets/secondary/facility/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Facility[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Facility[][16] = { INCBIN_U16("data/tilesets/secondary/facility/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/facility/palettes/01.gbapal"), @@ -639,7 +639,7 @@ const u16 gTilesetPalettes_Facility[][16] = const u32 gTilesetTiles_BikeShop[] = INCBIN_U32("data/tilesets/secondary/bike_shop/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BikeShop[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BikeShop[][16] = { INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/01.gbapal"), @@ -661,7 +661,7 @@ const u16 gTilesetPalettes_BikeShop[][16] = const u32 gTilesetTiles_RusturfTunnel[] = INCBIN_U32("data/tilesets/secondary/rusturf_tunnel/tiles.4bpp.lz"); -const u16 gTilesetPalettes_RusturfTunnel[][16] = +const u16 ALIGNED(4) gTilesetPalettes_RusturfTunnel[][16] = { INCBIN_U16("data/tilesets/secondary/rusturf_tunnel/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/rusturf_tunnel/palettes/01.gbapal"), @@ -683,7 +683,7 @@ const u16 gTilesetPalettes_RusturfTunnel[][16] = const u32 gTilesetTiles_SecretBaseBrownCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/brown_cave/unused_tiles.4bpp.lz"); -const u16 gTilesetPalettes_SecretBaseBrownCave[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SecretBaseBrownCave[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/brown_cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/brown_cave/palettes/01.gbapal"), @@ -705,7 +705,7 @@ const u16 gTilesetPalettes_SecretBaseBrownCave[][16] = const u32 gTilesetTiles_SecretBaseTreeCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/tree/unused_tiles.4bpp.lz"); -const u16 gTilesetPalettes_SecretBaseTree[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SecretBaseTree[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/tree/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/tree/palettes/01.gbapal"), @@ -727,7 +727,7 @@ const u16 gTilesetPalettes_SecretBaseTree[][16] = const u32 gTilesetTiles_SecretBaseShrubCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/shrub/unused_tiles.4bpp.lz"); -const u16 gTilesetPalettes_SecretBaseShrub[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SecretBaseShrub[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/shrub/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/shrub/palettes/01.gbapal"), @@ -749,7 +749,7 @@ const u16 gTilesetPalettes_SecretBaseShrub[][16] = const u32 gTilesetTiles_SecretBaseBlueCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/blue_cave/unused_tiles.4bpp.lz"); -const u16 gTilesetPalettes_SecretBaseBlueCave[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SecretBaseBlueCave[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/blue_cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/blue_cave/palettes/01.gbapal"), @@ -771,7 +771,7 @@ const u16 gTilesetPalettes_SecretBaseBlueCave[][16] = const u32 gTilesetTiles_SecretBaseYellowCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/yellow_cave/unused_tiles.4bpp.lz"); -const u16 gTilesetPalettes_SecretBaseYellowCave[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SecretBaseYellowCave[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/yellow_cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/yellow_cave/palettes/01.gbapal"), @@ -793,7 +793,7 @@ const u16 gTilesetPalettes_SecretBaseYellowCave[][16] = const u32 gTilesetTiles_SecretBaseRedCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/red_cave/unused_tiles.4bpp.lz"); -const u16 gTilesetPalettes_SecretBaseRedCave[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SecretBaseRedCave[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/red_cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/red_cave/palettes/01.gbapal"), @@ -822,7 +822,7 @@ const u32 gTilesetTiles_SecretBaseRedCave[] = INCBIN_U32("data/tilesets/secondar const u32 gTilesetTiles_InsideOfTruck[] = INCBIN_U32("data/tilesets/secondary/inside_of_truck/tiles.4bpp.lz"); -const u16 gTilesetPalettes_InsideOfTruck[][16] = +const u16 ALIGNED(4) gTilesetPalettes_InsideOfTruck[][16] = { INCBIN_U16("data/tilesets/secondary/inside_of_truck/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/inside_of_truck/palettes/01.gbapal"), @@ -844,7 +844,7 @@ const u16 gTilesetPalettes_InsideOfTruck[][16] = const u32 gTilesetTiles_Contest[] = INCBIN_U32("data/tilesets/secondary/contest/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Contest[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Contest[][16] = { INCBIN_U16("data/tilesets/secondary/contest/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/contest/palettes/01.gbapal"), @@ -866,7 +866,7 @@ const u16 gTilesetPalettes_Contest[][16] = const u32 gTilesetTiles_LilycoveMuseum[] = INCBIN_U32("data/tilesets/secondary/lilycove_museum/tiles.4bpp.lz"); -const u16 gTilesetPalettes_LilycoveMuseum[][16] = +const u16 ALIGNED(4) gTilesetPalettes_LilycoveMuseum[][16] = { INCBIN_U16("data/tilesets/secondary/lilycove_museum/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lilycove_museum/palettes/01.gbapal"), @@ -888,7 +888,7 @@ const u16 gTilesetPalettes_LilycoveMuseum[][16] = const u32 gTilesetTiles_BrendansMaysHouse[] = INCBIN_U32("data/tilesets/secondary/brendans_mays_house/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BrendansMaysHouse[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BrendansMaysHouse[][16] = { INCBIN_U16("data/tilesets/secondary/brendans_mays_house/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/brendans_mays_house/palettes/01.gbapal"), @@ -910,7 +910,7 @@ const u16 gTilesetPalettes_BrendansMaysHouse[][16] = const u32 gTilesetTiles_Lab[] = INCBIN_U32("data/tilesets/secondary/lab/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Lab[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Lab[][16] = { INCBIN_U16("data/tilesets/secondary/lab/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/01.gbapal"), @@ -932,7 +932,7 @@ const u16 gTilesetPalettes_Lab[][16] = const u32 gTilesetTiles_Underwater[] = INCBIN_U32("data/tilesets/secondary/underwater/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Underwater[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Underwater[][16] = { INCBIN_U16("data/tilesets/secondary/underwater/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/01.gbapal"), @@ -954,7 +954,7 @@ const u16 gTilesetPalettes_Underwater[][16] = const u32 gTilesetTiles_GenericBuilding[] = INCBIN_U32("data/tilesets/secondary/generic_building/tiles.4bpp.lz"); -const u16 gTilesetPalettes_GenericBuilding[][16] = +const u16 ALIGNED(4) gTilesetPalettes_GenericBuilding[][16] = { INCBIN_U16("data/tilesets/secondary/generic_building/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building/palettes/01.gbapal"), @@ -976,7 +976,7 @@ const u16 gTilesetPalettes_GenericBuilding[][16] = const u32 gTilesetTiles_MauvilleGameCorner[] = INCBIN_U32("data/tilesets/secondary/mauville_game_corner/tiles.4bpp.lz"); -const u16 gTilesetPalettes_MauvilleGameCorner[][16] = +const u16 ALIGNED(4) gTilesetPalettes_MauvilleGameCorner[][16] = { INCBIN_U16("data/tilesets/secondary/mauville_game_corner/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mauville_game_corner/palettes/01.gbapal"), @@ -998,7 +998,7 @@ const u16 gTilesetPalettes_MauvilleGameCorner[][16] = const u32 gTilesetTiles_Unused2[] = INCBIN_U32("data/tilesets/secondary/unused_2/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Unused2[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Unused2[][16] = { INCBIN_U16("data/tilesets/secondary/unused_2/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_2/palettes/01.gbapal"), @@ -1020,7 +1020,7 @@ const u16 gTilesetPalettes_Unused2[][16] = const u32 gTilesetTiles_RustboroGym[] = INCBIN_U32("data/tilesets/secondary/rustboro_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_RustboroGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_RustboroGym[][16] = { INCBIN_U16("data/tilesets/secondary/rustboro_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/rustboro_gym/palettes/01.gbapal"), @@ -1042,7 +1042,7 @@ const u16 gTilesetPalettes_RustboroGym[][16] = const u32 gTilesetTiles_DewfordGym[] = INCBIN_U32("data/tilesets/secondary/dewford_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_DewfordGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_DewfordGym[][16] = { INCBIN_U16("data/tilesets/secondary/dewford_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/dewford_gym/palettes/01.gbapal"), @@ -1064,7 +1064,7 @@ const u16 gTilesetPalettes_DewfordGym[][16] = const u32 gTilesetTiles_MauvilleGym[] = INCBIN_U32("data/tilesets/secondary/mauville_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_MauvilleGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_MauvilleGym[][16] = { INCBIN_U16("data/tilesets/secondary/mauville_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mauville_gym/palettes/01.gbapal"), @@ -1086,7 +1086,7 @@ const u16 gTilesetPalettes_MauvilleGym[][16] = const u32 gTilesetTiles_LavaridgeGym[] = INCBIN_U32("data/tilesets/secondary/lavaridge_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_LavaridgeGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_LavaridgeGym[][16] = { INCBIN_U16("data/tilesets/secondary/lavaridge_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lavaridge_gym/palettes/01.gbapal"), @@ -1108,7 +1108,7 @@ const u16 gTilesetPalettes_LavaridgeGym[][16] = const u32 gTilesetTiles_PetalburgGym[] = INCBIN_U32("data/tilesets/secondary/petalburg_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_PetalburgGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_PetalburgGym[][16] = { INCBIN_U16("data/tilesets/secondary/petalburg_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/petalburg_gym/palettes/01.gbapal"), @@ -1130,7 +1130,7 @@ const u16 gTilesetPalettes_PetalburgGym[][16] = const u32 gTilesetTiles_FortreeGym[] = INCBIN_U32("data/tilesets/secondary/fortree_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_FortreeGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_FortreeGym[][16] = { INCBIN_U16("data/tilesets/secondary/fortree_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/fortree_gym/palettes/01.gbapal"), @@ -1152,7 +1152,7 @@ const u16 gTilesetPalettes_FortreeGym[][16] = const u32 gTilesetTiles_MossdeepGym[] = INCBIN_U32("data/tilesets/secondary/mossdeep_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_MossdeepGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_MossdeepGym[][16] = { INCBIN_U16("data/tilesets/secondary/mossdeep_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mossdeep_gym/palettes/01.gbapal"), @@ -1174,7 +1174,7 @@ const u16 gTilesetPalettes_MossdeepGym[][16] = const u32 gTilesetTiles_SootopolisGym[] = INCBIN_U32("data/tilesets/secondary/sootopolis_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_SootopolisGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SootopolisGym[][16] = { INCBIN_U16("data/tilesets/secondary/sootopolis_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/sootopolis_gym/palettes/01.gbapal"), @@ -1196,7 +1196,7 @@ const u16 gTilesetPalettes_SootopolisGym[][16] = const u32 gTilesetTiles_TrickHousePuzzle[] = INCBIN_U32("data/tilesets/secondary/trick_house_puzzle/tiles.4bpp.lz"); -const u16 gTilesetPalettes_TrickHousePuzzle[][16] = +const u16 ALIGNED(4) gTilesetPalettes_TrickHousePuzzle[][16] = { INCBIN_U16("data/tilesets/secondary/trick_house_puzzle/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/trick_house_puzzle/palettes/01.gbapal"), @@ -1218,7 +1218,7 @@ const u16 gTilesetPalettes_TrickHousePuzzle[][16] = const u32 gTilesetTiles_InsideShip[] = INCBIN_U32("data/tilesets/secondary/inside_ship/tiles.4bpp.lz"); -const u16 gTilesetPalettes_InsideShip[][16] = +const u16 ALIGNED(4) gTilesetPalettes_InsideShip[][16] = { INCBIN_U16("data/tilesets/secondary/inside_ship/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/inside_ship/palettes/01.gbapal"), @@ -1241,7 +1241,7 @@ const u16 gTilesetPalettes_InsideShip[][16] = const u32 gTilesetTiles_SecretBase[] = INCBIN_U32("data/tilesets/primary/secret_base/tiles.4bpp"); const u32 gTilesetTiles_UnknownSecretBase[] = INCBIN_U32("data/tilesets/primary/secret_base/unknown_tiles.4bpp"); -const u16 gTilesetPalettes_SecretBase[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SecretBase[][16] = { INCBIN_U16("data/tilesets/primary/secret_base/palettes/00.gbapal"), INCBIN_U16("data/tilesets/primary/secret_base/palettes/01.gbapal"), @@ -1263,7 +1263,7 @@ const u16 gTilesetPalettes_SecretBase[][16] = const u32 gTilesetTiles_EliteFour[] = INCBIN_U32("data/tilesets/secondary/elite_four/tiles.4bpp.lz"); -const u16 gTilesetPalettes_EliteFour[][16] = +const u16 ALIGNED(4) gTilesetPalettes_EliteFour[][16] = { INCBIN_U16("data/tilesets/secondary/elite_four/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/elite_four/palettes/01.gbapal"), @@ -1285,7 +1285,7 @@ const u16 gTilesetPalettes_EliteFour[][16] = const u32 gTilesetTiles_BattleFrontier[] = INCBIN_U32("data/tilesets/secondary/battle_frontier/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleFrontier[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleFrontier[][16] = { INCBIN_U16("data/tilesets/secondary/battle_frontier/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_frontier/palettes/01.gbapal"), @@ -1307,7 +1307,7 @@ const u16 gTilesetPalettes_BattleFrontier[][16] = const u32 gTilesetTiles_BattlePalace[] = INCBIN_U32("data/tilesets/secondary/battle_palace/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattlePalace[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattlePalace[][16] = { INCBIN_U16("data/tilesets/secondary/battle_palace/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_palace/palettes/01.gbapal"), @@ -1329,7 +1329,7 @@ const u16 gTilesetPalettes_BattlePalace[][16] = const u32 gTilesetTiles_BattleDome[] = INCBIN_U32("data/tilesets/secondary/battle_dome/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleDome[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleDome[][16] = { INCBIN_U16("data/tilesets/secondary/battle_dome/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_dome/palettes/01.gbapal"), @@ -1351,7 +1351,7 @@ const u16 gTilesetPalettes_BattleDome[][16] = const u32 gTilesetTiles_BattleFactory[] = INCBIN_U32("data/tilesets/secondary/battle_factory/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleFactory[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleFactory[][16] = { INCBIN_U16("data/tilesets/secondary/battle_factory/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_factory/palettes/01.gbapal"), @@ -1373,7 +1373,7 @@ const u16 gTilesetPalettes_BattleFactory[][16] = const u32 gTilesetTiles_BattlePike[] = INCBIN_U32("data/tilesets/secondary/battle_pike/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattlePike[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattlePike[][16] = { INCBIN_U16("data/tilesets/secondary/battle_pike/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_pike/palettes/01.gbapal"), @@ -1395,7 +1395,7 @@ const u16 gTilesetPalettes_BattlePike[][16] = const u32 gTilesetTiles_BattleArena[] = INCBIN_U32("data/tilesets/secondary/battle_arena/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleArena[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleArena[][16] = { INCBIN_U16("data/tilesets/secondary/battle_arena/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_arena/palettes/01.gbapal"), @@ -1417,7 +1417,7 @@ const u16 gTilesetPalettes_BattleArena[][16] = const u32 gTilesetTiles_BattlePyramid[] = INCBIN_U32("data/tilesets/secondary/battle_pyramid/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattlePyramid[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattlePyramid[][16] = { INCBIN_U16("data/tilesets/secondary/battle_pyramid/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_pyramid/palettes/01.gbapal"), @@ -1439,7 +1439,7 @@ const u16 gTilesetPalettes_BattlePyramid[][16] = const u32 gTilesetTiles_MirageTower[] = INCBIN_U32("data/tilesets/secondary/mirage_tower/tiles.4bpp.lz"); -const u16 gTilesetPalettes_MirageTower[][16] = +const u16 ALIGNED(4) gTilesetPalettes_MirageTower[][16] = { INCBIN_U16("data/tilesets/secondary/mirage_tower/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mirage_tower/palettes/01.gbapal"), @@ -1461,7 +1461,7 @@ const u16 gTilesetPalettes_MirageTower[][16] = const u32 gTilesetTiles_MossdeepGameCorner[] = INCBIN_U32("data/tilesets/secondary/mossdeep_game_corner/tiles.4bpp.lz"); -const u16 gTilesetPalettes_MossdeepGameCorner[][16] = +const u16 ALIGNED(4) gTilesetPalettes_MossdeepGameCorner[][16] = { INCBIN_U16("data/tilesets/secondary/mossdeep_game_corner/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mossdeep_game_corner/palettes/01.gbapal"), @@ -1483,7 +1483,7 @@ const u16 gTilesetPalettes_MossdeepGameCorner[][16] = const u32 gTilesetTiles_IslandHarbor[] = INCBIN_U32("data/tilesets/secondary/island_harbor/tiles.4bpp.lz"); -const u16 gTilesetPalettes_IslandHarbor[][16] = +const u16 ALIGNED(4) gTilesetPalettes_IslandHarbor[][16] = { INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/01.gbapal"), @@ -1505,7 +1505,7 @@ const u16 gTilesetPalettes_IslandHarbor[][16] = const u32 gTilesetTiles_TrainerHill[] = INCBIN_U32("data/tilesets/secondary/trainer_hill/tiles.4bpp.lz"); -const u16 gTilesetPalettes_TrainerHill[][16] = +const u16 ALIGNED(4) gTilesetPalettes_TrainerHill[][16] = { INCBIN_U16("data/tilesets/secondary/trainer_hill/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_hill/palettes/01.gbapal"), @@ -1527,7 +1527,7 @@ const u16 gTilesetPalettes_TrainerHill[][16] = const u32 gTilesetTiles_NavelRock[] = INCBIN_U32("data/tilesets/secondary/navel_rock/tiles.4bpp.lz"); -const u16 gTilesetPalettes_NavelRock[][16] = +const u16 ALIGNED(4) gTilesetPalettes_NavelRock[][16] = { INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/01.gbapal"), @@ -1549,7 +1549,7 @@ const u16 gTilesetPalettes_NavelRock[][16] = const u32 gTilesetTiles_BattleFrontierRankingHall[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_ranking_hall/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleFrontierRankingHall[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleFrontierRankingHall[][16] = { INCBIN_U16("data/tilesets/secondary/battle_frontier_ranking_hall/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_frontier_ranking_hall/palettes/01.gbapal"), @@ -1571,7 +1571,7 @@ const u16 gTilesetPalettes_BattleFrontierRankingHall[][16] = const u32 gTilesetTiles_BattleTent[] = INCBIN_U32("data/tilesets/secondary/battle_tent/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleTent[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleTent[][16] = { INCBIN_U16("data/tilesets/secondary/battle_tent/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_tent/palettes/01.gbapal"), @@ -1593,7 +1593,7 @@ const u16 gTilesetPalettes_BattleTent[][16] = const u32 gTilesetTiles_MysteryEventsHouse[] = INCBIN_U32("data/tilesets/secondary/mystery_events_house/tiles.4bpp.lz"); -const u16 gTilesetPalettes_MysteryEventsHouse[][16] = +const u16 ALIGNED(4) gTilesetPalettes_MysteryEventsHouse[][16] = { INCBIN_U16("data/tilesets/secondary/mystery_events_house/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mystery_events_house/palettes/01.gbapal"), @@ -1613,7 +1613,7 @@ const u16 gTilesetPalettes_MysteryEventsHouse[][16] = INCBIN_U16("data/tilesets/secondary/mystery_events_house/palettes/15.gbapal"), }; -const u16 gTilesetPalettes_UnionRoom[][16] = +const u16 ALIGNED(4) gTilesetPalettes_UnionRoom[][16] = { INCBIN_U16("data/tilesets/secondary/union_room/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/union_room/palettes/01.gbapal"), diff --git a/src/graphics.c b/src/graphics.c index 8a6bbc88a6..0913aeece0 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1437,7 +1437,7 @@ const u32 gUnionRoomChat_Border_Gfx[] = INCBIN_U32("graphics/union_room_chat/bor const u32 gUnionRoomChat_Border_Tilemap[] = INCBIN_U32("graphics/union_room_chat/border.bin.lz"); const u32 gUnionRoomChat_RButtonLabels[] = INCBIN_U32("graphics/union_room_chat/r_button_labels.4bpp.lz"); -const u16 gTilesetPalettes_General[][16] = +const u16 ALIGNED(4) gTilesetPalettes_General[][16] = { INCBIN_U16("data/tilesets/primary/general/palettes/00.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/01.gbapal"), diff --git a/src/palette.c b/src/palette.c index 60635a5d53..d2a8476dde 100644 --- a/src/palette.c +++ b/src/palette.c @@ -98,6 +98,8 @@ void LoadPalette(const void *src, u16 offset, u16 size) // Drop in replacement for LoadPalette, uses CpuFastCopy, size must be 0 % 32 void LoadPaletteFast(const void *src, u16 offset, u16 size) { + if ((u32)src & 3) // In case palette is not 4 byte aligned + return LoadPalette(src, offset, size); CpuFastCopy(src, &gPlttBufferUnfaded[offset], size); // Copying from EWRAM->EWRAM is faster than ROM->EWRAM CpuFastCopy(&gPlttBufferUnfaded[offset], &gPlttBufferFaded[offset], size); From 6fe4ce05e15a6a30618fd9a9aa06ce1ec53c6055 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sat, 4 Feb 2023 19:25:49 -0500 Subject: [PATCH 076/145] Added lighting to Sootopolis lava. --- data/tilesets/secondary/sootopolis/palettes/10.pal | 4 ++-- src/data/tilesets/headers.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/tilesets/secondary/sootopolis/palettes/10.pal b/data/tilesets/secondary/sootopolis/palettes/10.pal index 6ca963250f..46457797ed 100644 --- a/data/tilesets/secondary/sootopolis/palettes/10.pal +++ b/data/tilesets/secondary/sootopolis/palettes/10.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -115 197 164 +0 230 25 139 115 106 115 90 82 90 65 65 @@ -16,4 +16,4 @@ JASC-PAL 148 74 41 82 139 197 74 115 172 -0 0 0 +246 74 65 diff --git a/src/data/tilesets/headers.h b/src/data/tilesets/headers.h index 0e8d4dca90..d204bb45cf 100644 --- a/src/data/tilesets/headers.h +++ b/src/data/tilesets/headers.h @@ -174,8 +174,8 @@ const struct Tileset gTileset_Sootopolis = .isCompressed = TRUE, .swapPalettes = SWAP_PAL(6), .isSecondary = TRUE, - .lightPalettes = LIGHT_PAL(6), - .customLightColor = LIGHT_PAL(6), + .lightPalettes = LIGHT_PAL(6) | LIGHT_PAL(10), + .customLightColor = LIGHT_PAL(6) | LIGHT_PAL(10), .tiles = gTilesetTiles_Sootopolis, .palettes = gTilesetPalettes_Sootopolis, .metatiles = gMetatiles_Sootopolis, From 9fd7542629e0ae8f8a7426298608ffcf95600fea Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Thu, 9 Feb 2023 00:15:18 -0500 Subject: [PATCH 077/145] Fixed nighttime WEATHER_DOWNPOUR gamma shift. --- src/field_weather.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field_weather.c b/src/field_weather.c index 4f9b72ea75..a875b7ec39 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -483,7 +483,7 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) palOffset = startPalIndex * 16; UpdateAltBgPalettes(palettes & PALETTES_BG); // Thunder gamma-shift looks bad on night-blended palettes, so ignore time blending in some situations - if (!(colorMapIndex > 3 && gWeatherPtr->currWeather == WEATHER_RAIN_THUNDERSTORM) && MapHasNaturalLight(gMapHeader.mapType)) + if (!(colorMapIndex > 3) && MapHasNaturalLight(gMapHeader.mapType)) UpdatePalettesWithTime(palettes); else CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 32 * numPalettes); From 3b3e45cff7f666f44fa06279b13fb26fadcf1217 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Fri, 10 Feb 2023 21:31:10 -0500 Subject: [PATCH 078/145] Fixed shadow positioning bug in some battle facilities. --- data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc | 1 + data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc index 31314b5982..cdd08fc777 100644 --- a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc @@ -476,6 +476,7 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_SetUpObjects:: call BattleFrontier_EventScript_SetBrainObjectGfx setobjectxyperm LOCALID_OPPONENT, 13, 9 removeobject LOCALID_OPPONENT + delay 1 addobject LOCALID_OPPONENT applymovement LOCALID_OPPONENT, BattleFrontier_BattleDomeBattleRoom_Movement_SetInvisibleFacingUp BattleFrontier_BattleDomeBattleRoom_EventScript_EndSetUpObjects:: diff --git a/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc b/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc index 53514bb5e9..fd6567cb65 100644 --- a/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc +++ b/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc @@ -48,6 +48,7 @@ SlateportCity_BattleTentBattleRoom_EventScript_EnterRoom:: factory_setopponentgfx setobjectxyperm LOCALID_OPPONENT, 5, 1 removeobject LOCALID_OPPONENT + delay 1 addobject LOCALID_OPPONENT applymovement LOCALID_OPPONENT, SlateportCity_BattleTentBattleRoom_Movement_OpponentEnter waitmovement 0 @@ -102,4 +103,3 @@ SlateportCity_BattleTentBattleRoom_Movement_OpponentEnter: walk_down walk_in_place_faster_left step_end - From 07995f8925f2c81522b390b5e86228d1e4f73b51 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Tue, 7 Mar 2023 20:39:41 -0500 Subject: [PATCH 079/145] Fixed some decoration icons being darkened at night in outdoor shops. --- include/event_object_movement.h | 1 + src/decoration.c | 2 +- src/event_object_movement.c | 28 +++++++++++++++++++++++++--- src/shop.c | 2 +- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 4a4904f626..683160820a 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -131,6 +131,7 @@ struct ObjectEvent * GetFollowerObject(void); u8 GetDirectionToFace(s16, s16, s16, s16); void UpdateLightSprite(struct Sprite *); void TrySpawnObjectEvents(s16 cameraX, s16 cameraY); +u8 CreateObjectGraphicsSpriteWithTag(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u16 paletteTag); u8 CreateObjectGraphicsSprite(u16, void (*)(struct Sprite *), s16 x, s16 y, u8 subpriority); u8 TrySpawnObjectEvent(u8 localId, u8 mapNum, u8 mapGroup); u8 SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 elevation); diff --git a/src/decoration.c b/src/decoration.c index 6d95cfbdc3..d33ded155f 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -2110,7 +2110,7 @@ static u8 AddDecorationIconObjectFromObjectEvent(u16 tilesTag, u16 paletteTag, u } else { - spriteId = CreateObjectGraphicsSprite(sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1); + spriteId = CreateObjectGraphicsSpriteWithTag(sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1, paletteTag); } return spriteId; } diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 49523559dd..6d956d1da5 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1607,8 +1607,20 @@ static void MakeSpriteTemplateFromObjectEventTemplate(struct ObjectEventTemplate CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(objectEventTemplate->graphicsId, objectEventTemplate->movementType, spriteTemplate, subspriteTables); } +// Like LoadObjectEventPalette, but overwrites the palette tag that is loaded +static u8 LoadObjectEventPaletteWithTag(u16 paletteTag, u16 overTag) { + u32 i = FindObjectEventPaletteIndexByTag(paletteTag); + struct SpritePalette spritePalette; + if (i == 0xFF) + return i; + spritePalette = sObjectEventSpritePalettes[i]; + if (overTag != TAG_NONE) + spritePalette.tag = overTag; // overwrite palette tag + return LoadSpritePaletteIfTagExists(&spritePalette); +} + // Used to create a sprite using a graphicsId associated with object events. -u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) +u8 CreateObjectGraphicsSpriteWithTag(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u16 paletteTag) { struct SpriteTemplate *spriteTemplate; const struct SubspriteTable *subspriteTables; @@ -1637,8 +1649,14 @@ u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), const struct CompressedSpritePalette *spritePalette = &(shiny ? gMonShinyPaletteTable : gMonPaletteTable)[species]; paletteNum = LoadDynamicFollowerPalette(species, form, shiny); spriteTemplate->paletteTag = spritePalette->tag; - } else if (spriteTemplate->paletteTag != TAG_NONE) - LoadObjectEventPalette(spriteTemplate->paletteTag); + } else if (spriteTemplate->paletteTag != TAG_NONE) { + if (paletteTag == TAG_NONE) + LoadObjectEventPalette(spriteTemplate->paletteTag); + else { + LoadObjectEventPaletteWithTag(spriteTemplate->paletteTag, paletteTag); + spriteTemplate->paletteTag = paletteTag; + } + } spriteId = CreateSprite(spriteTemplate, x, y, subpriority); Free(spriteTemplate); @@ -1652,6 +1670,10 @@ u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), return spriteId; } +u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) { + return CreateObjectGraphicsSpriteWithTag(graphicsId, callback, x, y, subpriority, TAG_NONE); +} + #define sVirtualObjId data[0] #define sVirtualObjElev data[1] diff --git a/src/shop.c b/src/shop.c index 222ee181b7..23699f07ba 100644 --- a/src/shop.c +++ b/src/shop.c @@ -41,7 +41,7 @@ #include "constants/songs.h" #define TAG_SCROLL_ARROW 2100 -#define TAG_ITEM_ICON_BASE 2110 +#define TAG_ITEM_ICON_BASE 9110 // immune to time blending #define MAX_ITEMS_SHOWN 8 From 6b2e49ffbc2a5c8b0edfdb5983ad1365c6b54d5b Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sat, 11 Mar 2023 16:16:51 -0500 Subject: [PATCH 080/145] Updated Ever Grande window lights. --- .../secondary/ever_grande/palettes/01.pal | 24 +++++++++---------- .../secondary/ever_grande/palettes/08.pal | 2 +- src/data/tilesets/headers.h | 2 ++ 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/data/tilesets/secondary/ever_grande/palettes/01.pal b/data/tilesets/secondary/ever_grande/palettes/01.pal index 3c6e40c2e9..2c02767613 100644 --- a/data/tilesets/secondary/ever_grande/palettes/01.pal +++ b/data/tilesets/secondary/ever_grande/palettes/01.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -24 41 82 -255 255 255 -222 230 238 -189 205 230 -156 180 222 +0 197 0 +246 197 123 +238 156 90 +205 115 41 +164 90 49 131 131 139 98 98 123 65 74 106 41 49 90 -115 189 246 -98 172 238 -255 189 131 -238 148 115 -222 106 98 -205 65 82 -115 197 164 +224 226 171 +216 200 152 +255 255 238 +222 222 197 +197 197 164 +164 172 123 +255 255 115 diff --git a/data/tilesets/secondary/ever_grande/palettes/08.pal b/data/tilesets/secondary/ever_grande/palettes/08.pal index 083dd5080a..67b9146fd0 100644 --- a/data/tilesets/secondary/ever_grande/palettes/08.pal +++ b/data/tilesets/secondary/ever_grande/palettes/08.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -24 41 82 +0 197 0 246 197 123 238 156 90 205 115 41 diff --git a/src/data/tilesets/headers.h b/src/data/tilesets/headers.h index d204bb45cf..8a7907c6c8 100644 --- a/src/data/tilesets/headers.h +++ b/src/data/tilesets/headers.h @@ -154,6 +154,8 @@ const struct Tileset gTileset_EverGrande = .metatiles = gMetatiles_EverGrande, .metatileAttributes = gMetatileAttributes_EverGrande, .callback = InitTilesetAnim_EverGrande, + .lightPalettes = LIGHT_PAL(8), + .swapPalettes = SWAP_PAL(8), }; const struct Tileset gTileset_Pacifidlog = From 095994dc96666f3d9d6866339c6fcef191d35ea2 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 16 Apr 2023 20:07:41 -0400 Subject: [PATCH 081/145] Fixed gamma shift for special sprite palette tags (lights, emotes). Supersedes c82510e22bffb98fd9c63dc246c332dd1da602cd --- src/field_weather.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/field_weather.c b/src/field_weather.c index a875b7ec39..92673a35bb 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -493,7 +493,9 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) // Loop through the specified palette range and apply necessary color maps. while (curPalIndex < numPalettes) { - if (sPaletteColorMapTypes[curPalIndex] == COLOR_MAP_NONE) + // don't blend special palettes immune to blending + if (sPaletteColorMapTypes[curPalIndex] == COLOR_MAP_NONE || + (curPalIndex >= 16 && GetSpritePaletteTagByPaletteNum(curPalIndex - 16) >> 15)) { // No palette change. palOffset += 16; @@ -502,10 +504,7 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) { u8 r, g, b; - // don't blend special sprite palette tags - if (sPaletteColorMapTypes[curPalIndex] == COLOR_MAP_CONTRAST || - (curPalIndex >= 16 && (curPalIndex - 16 == gWeatherPtr->contrastColorMapSpritePalIndex || - GetSpritePaletteTagByPaletteNum(curPalIndex - 16) >> 15))) + if (sPaletteColorMapTypes[curPalIndex] == COLOR_MAP_CONTRAST || curPalIndex - 16 == gWeatherPtr->contrastColorMapSpritePalIndex) colorMap = gWeatherPtr->contrastColorMaps[colorMapIndex]; else colorMap = gWeatherPtr->darkenedContrastColorMaps[colorMapIndex]; From 159faf8ff424941f70de810b621accb11bb5fefc Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 23 Apr 2023 00:35:52 -0400 Subject: [PATCH 082/145] Fixed tall grass field effect discoloration in fog. Improved/optimized fog blending during fades. --- src/field_effect.c | 2 +- src/field_weather.c | 81 ++++++++++++++++----------------------------- 2 files changed, 29 insertions(+), 54 deletions(-) diff --git a/src/field_effect.c b/src/field_effect.c index 6fd17aa73d..b120449ec6 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -782,7 +782,7 @@ void FieldEffectScript_LoadFadedPalette(u8 **script) { struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); LoadSpritePalette(palette); - UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag), FALSE); + UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag), TRUE); (*script) += 4; } diff --git a/src/field_weather.c b/src/field_weather.c index 92673a35bb..9ed5c0c746 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -672,56 +672,27 @@ static void ApplyDroughtColorMapWithBlend(s8 colorMapIndex, u8 blendCoeff, u16 b } } -static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) // TODO: Optimize this with time blending +// This is only called during fade-in/fade-out in fog +// blendCoeff & blendColor are the *fade* colors, not fog colors +static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) { - struct RGBColor color; - u8 rBlend; - u8 gBlend; - u8 bBlend; - u16 curPalIndex; + u32 curPalIndex; + u16 fogCoeff = min((gTimeOfDay + 1) * 4, 12); // First blend all palettes with time UpdateAltBgPalettes(PALETTES_BG); - CpuFastCopy(gPlttBufferUnfaded, gPlttBufferFaded, 0x400); + CpuFastCopy(gPlttBufferUnfaded, gPlttBufferFaded, PLTT_BUFFER_SIZE * 2); UpdatePalettesWithTime(PALETTES_ALL); - // Then blend tile palettes [0, 12] faded->faded + // Then blend tile palettes [0, 12] faded->faded with fadeIn color BlendPalettesFine(0x1FFF, gPlttBufferFaded, gPlttBufferFaded, blendCoeff, blendColor); - color = *(struct RGBColor *)&blendColor; - rBlend = color.r; - gBlend = color.g; - bBlend = color.b; - for (curPalIndex = 16; curPalIndex < 32; curPalIndex++) - { + // Do fog blending on marked sprite palettes + 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 *)&gPlttBufferFaded[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] = RGB2(r, g, b); - palOffset++; - } - } - else - { - BlendPalettesFine(1, gPlttBufferFaded + curPalIndex * 16, gPlttBufferFaded + curPalIndex * 16, blendCoeff, blendColor); - } + BlendPalettesFine(1, gPlttBufferFaded + PLTT_ID(curPalIndex), gPlttBufferFaded + PLTT_ID(curPalIndex), fogCoeff, RGB(28, 31, 28)); } + // Finally blend all sprite palettes faded->faded with fadeIn color + BlendPalettesFine(PALETTES_OBJECTS, gPlttBufferFaded, gPlttBufferFaded, blendCoeff, blendColor); } static void MarkFogSpritePalToLighten(u8 paletteIndex) @@ -737,6 +708,9 @@ static bool8 LightenSpritePaletteInFog(u8 paletteIndex) { u16 i; + if (paletteIndex >= 16 && (GetSpritePaletteTagByPaletteNum(i - 16) >> 15)) // don't blend specialpalette tags + return FALSE; + for (i = 0; i < gWeatherPtr->lightenedFogSpritePalsCount; i++) { if (gWeatherPtr->lightenedFogSpritePals[i] == paletteIndex) @@ -879,20 +853,21 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog) default: if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) { if (gWeatherPtr->colorMapIndex) - ApplyColorMap(paletteIndex, 1, gWeatherPtr->colorMapIndex); + ApplyColorMap(paletteIndex, 1, gWeatherPtr->colorMapIndex); else - UpdateSpritePaletteWithTime(spritePaletteIndex); + UpdateSpritePaletteWithTime(spritePaletteIndex); } else { // In horizontal fog, only specific palettes should be fog-blended - if (allowFog) { - paletteIndex = PLTT_ID(paletteIndex); - // First blend with time - CpuFastCopy(gPlttBufferUnfaded + paletteIndex, gPlttBufferFaded + paletteIndex, 32); - UpdateSpritePaletteWithTime(spritePaletteIndex); - // Then blend faded->faded - BlendPalettesFine(1 << (spritePaletteIndex + 16), gPlttBufferFaded + paletteIndex, gPlttBufferFaded + paletteIndex, 12, RGB(28, 31, 28)); - } else { // Otherwise, just time-blend the palette - UpdateSpritePaletteWithTime(spritePaletteIndex); - } + if (allowFog) { + i = min((gTimeOfDay + 1) * 4, 12); // fog coeff, highest in day and lowest at night + paletteIndex = PLTT_ID(paletteIndex); + // First blend with time + CpuFastCopy(gPlttBufferUnfaded + paletteIndex, gPlttBufferFaded + paletteIndex, PLTT_SIZE_4BPP); + UpdateSpritePaletteWithTime(spritePaletteIndex); + // Then blend faded->faded with fog coeff + BlendPalettesFine(1, gPlttBufferFaded + paletteIndex, gPlttBufferFaded + paletteIndex, i, RGB(28, 31, 28)); + } else { // Otherwise, just time-blend the palette + UpdateSpritePaletteWithTime(spritePaletteIndex); + } } break; } From 91794286b51c7ae3dfe8e8c453a25cc008055b6b Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Thu, 8 Jun 2023 20:49:18 -0400 Subject: [PATCH 083/145] Improved light color blending logic. Added auxiliary .pla files to gbafx, to support setting color high bits. Updated light palettes to new system. --- README.md | 17 + data/tilesets/primary/general/palettes/04.pal | 2 +- data/tilesets/primary/general/palettes/04.pla | 6 + .../secondary/ever_grande/palettes/08.pal | 2 +- .../secondary/ever_grande/palettes/08.pla | 3 + .../secondary/fallarbor/palettes/07.pal | 2 +- .../secondary/fallarbor/palettes/07.pla | 3 + .../secondary/fortree/palettes/08.pal | 2 +- .../secondary/fortree/palettes/08.pla | 6 + .../secondary/lavaridge/palettes/06.pal | 2 +- .../secondary/lavaridge/palettes/06.pla | 7 + .../secondary/lilycove/palettes/06.pal | 2 +- .../secondary/lilycove/palettes/06.pla | 6 + .../secondary/mauville/palettes/07.pal | 2 +- .../secondary/mauville/palettes/07.pla | 3 + .../secondary/mauville/palettes/10.pal | 2 +- .../secondary/mauville/palettes/10.pla | 4 + .../secondary/mauville/palettes/11.pal | 2 +- .../secondary/mauville/palettes/11.pla | 3 + .../secondary/mossdeep/palettes/08.pal | 2 +- .../secondary/mossdeep/palettes/08.pla | 3 + .../secondary/pacifidlog/palettes/09.pal | 2 +- .../secondary/pacifidlog/palettes/09.pla | 2 + .../secondary/petalburg/palettes/06.pal | 2 +- .../secondary/petalburg/palettes/06.pla | 3 + .../secondary/petalburg/palettes/07.pal | 2 +- .../secondary/petalburg/palettes/07.pla | 3 + .../secondary/petalburg/palettes/09.pal | 2 +- .../secondary/petalburg/palettes/09.pla | 3 + .../secondary/rustboro/palettes/06.pal | 2 +- .../secondary/rustboro/palettes/06.pla | 7 + .../secondary/slateport/palettes/06.pal | 2 +- .../secondary/slateport/palettes/06.pla | 2 + .../secondary/slateport/palettes/12.pal | 2 +- .../secondary/slateport/palettes/12.pla | 6 + .../secondary/sootopolis/palettes/06.pal | 2 +- .../secondary/sootopolis/palettes/06.pla | 5 + .../secondary/sootopolis/palettes/10.pal | 2 +- .../secondary/sootopolis/palettes/10.pla | 8 + graphics/pokemon/ampharos/normal.pal | 4 +- graphics/pokemon/ampharos/normal.pla | 7 + graphics/pokemon/ampharos/shiny.pal | 4 +- graphics/pokemon/ampharos/shiny.pla | 7 + src/data/tilesets/headers.h | 23 +- src/event_object_movement.c | 13 +- src/fieldmap.c | 17 +- src/palette.c | 366 +++++++++--------- tools/gbagfx/gfx.c | 4 +- tools/gbagfx/gfx.h | 1 + tools/gbagfx/jasc_pal.c | 39 +- tools/gbagfx/main.c | 8 +- 51 files changed, 380 insertions(+), 251 deletions(-) create mode 100644 data/tilesets/primary/general/palettes/04.pla create mode 100644 data/tilesets/secondary/ever_grande/palettes/08.pla create mode 100644 data/tilesets/secondary/fallarbor/palettes/07.pla create mode 100644 data/tilesets/secondary/fortree/palettes/08.pla create mode 100644 data/tilesets/secondary/lavaridge/palettes/06.pla create mode 100644 data/tilesets/secondary/lilycove/palettes/06.pla create mode 100644 data/tilesets/secondary/mauville/palettes/07.pla create mode 100644 data/tilesets/secondary/mauville/palettes/10.pla create mode 100644 data/tilesets/secondary/mauville/palettes/11.pla create mode 100644 data/tilesets/secondary/mossdeep/palettes/08.pla create mode 100644 data/tilesets/secondary/pacifidlog/palettes/09.pla create mode 100644 data/tilesets/secondary/petalburg/palettes/06.pla create mode 100644 data/tilesets/secondary/petalburg/palettes/07.pla create mode 100644 data/tilesets/secondary/petalburg/palettes/09.pla create mode 100644 data/tilesets/secondary/rustboro/palettes/06.pla create mode 100644 data/tilesets/secondary/slateport/palettes/06.pla create mode 100644 data/tilesets/secondary/slateport/palettes/12.pla create mode 100644 data/tilesets/secondary/sootopolis/palettes/06.pla create mode 100644 data/tilesets/secondary/sootopolis/palettes/10.pla create mode 100644 graphics/pokemon/ampharos/normal.pla create mode 100644 graphics/pokemon/ampharos/shiny.pla diff --git a/README.md b/README.md index 893678a2dc..00cdde2992 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,23 @@ Additional branches to mention: To set up the repository, see [INSTALL.md](INSTALL.md). +## FAQ +### Q: How do I mark certain colors in a palette as light-blended? +A: Create a `.pla` file in the same folder as the `.pal` with the same name. + +In this file you can enter color indices [0,15] +on separate lines to mark those colors as being light-blended, i.e: + +`06.pla:` +``` +# A comment +0 # if color 0 is listed, uses it to blend with instead of the default! +1 +9 +10 +``` + +You might have to `make mostlyclean` or change the `.pal` file to pick up the changes. ## See also Other disassembly and/or decompilation projects: diff --git a/data/tilesets/primary/general/palettes/04.pal b/data/tilesets/primary/general/palettes/04.pal index 57d4faa34d..313337d6da 100644 --- a/data/tilesets/primary/general/palettes/04.pal +++ b/data/tilesets/primary/general/palettes/04.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -232 0 128 +0 0 0 216 224 232 222 230 238 184 200 224 diff --git a/data/tilesets/primary/general/palettes/04.pla b/data/tilesets/primary/general/palettes/04.pla new file mode 100644 index 0000000000..5f08f88f35 --- /dev/null +++ b/data/tilesets/primary/general/palettes/04.pla @@ -0,0 +1,6 @@ +# Color indices to set high bit +1 +3 +4 +5 +15 \ No newline at end of file diff --git a/data/tilesets/secondary/ever_grande/palettes/08.pal b/data/tilesets/secondary/ever_grande/palettes/08.pal index 67b9146fd0..fcd13d7723 100644 --- a/data/tilesets/secondary/ever_grande/palettes/08.pal +++ b/data/tilesets/secondary/ever_grande/palettes/08.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 197 0 +0 0 0 246 197 123 238 156 90 205 115 41 diff --git a/data/tilesets/secondary/ever_grande/palettes/08.pla b/data/tilesets/secondary/ever_grande/palettes/08.pla new file mode 100644 index 0000000000..5eb702de80 --- /dev/null +++ b/data/tilesets/secondary/ever_grande/palettes/08.pla @@ -0,0 +1,3 @@ +# Color indices to set high bit +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/fallarbor/palettes/07.pal b/data/tilesets/secondary/fallarbor/palettes/07.pal index f3a7020731..6cb1ea50e7 100644 --- a/data/tilesets/secondary/fallarbor/palettes/07.pal +++ b/data/tilesets/secondary/fallarbor/palettes/07.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 192 0 +0 0 0 222 230 164 180 197 115 148 156 82 diff --git a/data/tilesets/secondary/fallarbor/palettes/07.pla b/data/tilesets/secondary/fallarbor/palettes/07.pla new file mode 100644 index 0000000000..5eb702de80 --- /dev/null +++ b/data/tilesets/secondary/fallarbor/palettes/07.pla @@ -0,0 +1,3 @@ +# Color indices to set high bit +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/fortree/palettes/08.pal b/data/tilesets/secondary/fortree/palettes/08.pal index 11b51b1071..1d8a56f8e7 100644 --- a/data/tilesets/secondary/fortree/palettes/08.pal +++ b/data/tilesets/secondary/fortree/palettes/08.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 96 8 +176 184 200 255 255 255 246 238 189 230 213 172 diff --git a/data/tilesets/secondary/fortree/palettes/08.pla b/data/tilesets/secondary/fortree/palettes/08.pla new file mode 100644 index 0000000000..69488b50cb --- /dev/null +++ b/data/tilesets/secondary/fortree/palettes/08.pla @@ -0,0 +1,6 @@ +# Color indices to set high bit +0 +8 +9 +11 +15 \ No newline at end of file diff --git a/data/tilesets/secondary/lavaridge/palettes/06.pal b/data/tilesets/secondary/lavaridge/palettes/06.pal index a858e623d1..3ea0c42542 100644 --- a/data/tilesets/secondary/lavaridge/palettes/06.pal +++ b/data/tilesets/secondary/lavaridge/palettes/06.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 192 24 +224 40 0 64 72 104 192 200 0 224 232 232 diff --git a/data/tilesets/secondary/lavaridge/palettes/06.pla b/data/tilesets/secondary/lavaridge/palettes/06.pla new file mode 100644 index 0000000000..26f59249a8 --- /dev/null +++ b/data/tilesets/secondary/lavaridge/palettes/06.pla @@ -0,0 +1,7 @@ +# Color indices to set high bit +0 +9 +10 +11 +12 +15 \ No newline at end of file diff --git a/data/tilesets/secondary/lilycove/palettes/06.pal b/data/tilesets/secondary/lilycove/palettes/06.pal index b612065ed9..a40ff7909c 100644 --- a/data/tilesets/secondary/lilycove/palettes/06.pal +++ b/data/tilesets/secondary/lilycove/palettes/06.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -24 200 0 +0 0 0 168 184 240 112 144 208 115 148 213 diff --git a/data/tilesets/secondary/lilycove/palettes/06.pla b/data/tilesets/secondary/lilycove/palettes/06.pla new file mode 100644 index 0000000000..77b77f073c --- /dev/null +++ b/data/tilesets/secondary/lilycove/palettes/06.pla @@ -0,0 +1,6 @@ +# Color indices to set high bit +1 +2 +6 +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/mauville/palettes/07.pal b/data/tilesets/secondary/mauville/palettes/07.pal index 6f43490ad6..f3618ff714 100644 --- a/data/tilesets/secondary/mauville/palettes/07.pal +++ b/data/tilesets/secondary/mauville/palettes/07.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -8 0 128 +123 180 189 255 255 180 238 238 90 213 213 65 diff --git a/data/tilesets/secondary/mauville/palettes/07.pla b/data/tilesets/secondary/mauville/palettes/07.pla new file mode 100644 index 0000000000..5e51fe661a --- /dev/null +++ b/data/tilesets/secondary/mauville/palettes/07.pla @@ -0,0 +1,3 @@ +# Color indices to set high bit +1 +15 \ No newline at end of file diff --git a/data/tilesets/secondary/mauville/palettes/10.pal b/data/tilesets/secondary/mauville/palettes/10.pal index b87549f6d1..b0d6736e5e 100644 --- a/data/tilesets/secondary/mauville/palettes/10.pal +++ b/data/tilesets/secondary/mauville/palettes/10.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -8 192 0 +123 180 189 255 255 255 148 222 205 123 180 172 diff --git a/data/tilesets/secondary/mauville/palettes/10.pla b/data/tilesets/secondary/mauville/palettes/10.pla new file mode 100644 index 0000000000..24701d55f5 --- /dev/null +++ b/data/tilesets/secondary/mauville/palettes/10.pla @@ -0,0 +1,4 @@ +# Color indices to set high bit +1 +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/mauville/palettes/11.pal b/data/tilesets/secondary/mauville/palettes/11.pal index 48166182ae..a48424b133 100644 --- a/data/tilesets/secondary/mauville/palettes/11.pal +++ b/data/tilesets/secondary/mauville/palettes/11.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 48 0 +123 180 189 255 255 255 222 230 238 164 180 197 diff --git a/data/tilesets/secondary/mauville/palettes/11.pla b/data/tilesets/secondary/mauville/palettes/11.pla new file mode 100644 index 0000000000..0dcbee2087 --- /dev/null +++ b/data/tilesets/secondary/mauville/palettes/11.pla @@ -0,0 +1,3 @@ +# Color indices to set high bit +7 +8 \ No newline at end of file diff --git a/data/tilesets/secondary/mossdeep/palettes/08.pal b/data/tilesets/secondary/mossdeep/palettes/08.pal index 34e9db9806..5b086f0511 100644 --- a/data/tilesets/secondary/mossdeep/palettes/08.pal +++ b/data/tilesets/secondary/mossdeep/palettes/08.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 192 0 +0 0 0 255 255 255 205 205 197 180 180 164 diff --git a/data/tilesets/secondary/mossdeep/palettes/08.pla b/data/tilesets/secondary/mossdeep/palettes/08.pla new file mode 100644 index 0000000000..5eb702de80 --- /dev/null +++ b/data/tilesets/secondary/mossdeep/palettes/08.pla @@ -0,0 +1,3 @@ +# Color indices to set high bit +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/pacifidlog/palettes/09.pal b/data/tilesets/secondary/pacifidlog/palettes/09.pal index 4f27efece1..653ffdfb3e 100644 --- a/data/tilesets/secondary/pacifidlog/palettes/09.pal +++ b/data/tilesets/secondary/pacifidlog/palettes/09.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 0 128 +0 0 0 222 230 164 180 189 123 156 164 98 diff --git a/data/tilesets/secondary/pacifidlog/palettes/09.pla b/data/tilesets/secondary/pacifidlog/palettes/09.pla new file mode 100644 index 0000000000..321117092b --- /dev/null +++ b/data/tilesets/secondary/pacifidlog/palettes/09.pla @@ -0,0 +1,2 @@ +# Color indices to set high bit +15 \ No newline at end of file diff --git a/data/tilesets/secondary/petalburg/palettes/06.pal b/data/tilesets/secondary/petalburg/palettes/06.pal index 0d0fbb48ca..f4190e865c 100644 --- a/data/tilesets/secondary/petalburg/palettes/06.pal +++ b/data/tilesets/secondary/petalburg/palettes/06.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 192 0 +0 0 0 255 255 255 230 222 222 213 213 197 diff --git a/data/tilesets/secondary/petalburg/palettes/06.pla b/data/tilesets/secondary/petalburg/palettes/06.pla new file mode 100644 index 0000000000..5eb702de80 --- /dev/null +++ b/data/tilesets/secondary/petalburg/palettes/06.pla @@ -0,0 +1,3 @@ +# Color indices to set high bit +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/petalburg/palettes/07.pal b/data/tilesets/secondary/petalburg/palettes/07.pal index 75b06af26e..41d1339942 100644 --- a/data/tilesets/secondary/petalburg/palettes/07.pal +++ b/data/tilesets/secondary/petalburg/palettes/07.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 192 0 +0 0 0 213 222 172 0 0 0 189 189 131 diff --git a/data/tilesets/secondary/petalburg/palettes/07.pla b/data/tilesets/secondary/petalburg/palettes/07.pla new file mode 100644 index 0000000000..5eb702de80 --- /dev/null +++ b/data/tilesets/secondary/petalburg/palettes/07.pla @@ -0,0 +1,3 @@ +# Color indices to set high bit +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/petalburg/palettes/09.pal b/data/tilesets/secondary/petalburg/palettes/09.pal index 1a6a5c7713..4d052b9c30 100644 --- a/data/tilesets/secondary/petalburg/palettes/09.pal +++ b/data/tilesets/secondary/petalburg/palettes/09.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 192 0 +0 0 0 232 224 200 208 200 144 200 176 120 diff --git a/data/tilesets/secondary/petalburg/palettes/09.pla b/data/tilesets/secondary/petalburg/palettes/09.pla new file mode 100644 index 0000000000..5eb702de80 --- /dev/null +++ b/data/tilesets/secondary/petalburg/palettes/09.pla @@ -0,0 +1,3 @@ +# Color indices to set high bit +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/rustboro/palettes/06.pal b/data/tilesets/secondary/rustboro/palettes/06.pal index be88a09cf9..1a3e98a28e 100644 --- a/data/tilesets/secondary/rustboro/palettes/06.pal +++ b/data/tilesets/secondary/rustboro/palettes/06.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -240 192 0 +115 197 164 255 255 255 216 224 232 184 200 224 diff --git a/data/tilesets/secondary/rustboro/palettes/06.pla b/data/tilesets/secondary/rustboro/palettes/06.pla new file mode 100644 index 0000000000..7fe6c388e7 --- /dev/null +++ b/data/tilesets/secondary/rustboro/palettes/06.pla @@ -0,0 +1,7 @@ +# Colors in palette to set high (alpha) bit +2 +3 +4 +5 +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/slateport/palettes/06.pal b/data/tilesets/secondary/slateport/palettes/06.pal index 2c624776cf..1e7d9a8220 100644 --- a/data/tilesets/secondary/slateport/palettes/06.pal +++ b/data/tilesets/secondary/slateport/palettes/06.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 32 0 +0 0 0 255 255 255 230 230 238 205 205 222 diff --git a/data/tilesets/secondary/slateport/palettes/06.pla b/data/tilesets/secondary/slateport/palettes/06.pla new file mode 100644 index 0000000000..07f021d4b4 --- /dev/null +++ b/data/tilesets/secondary/slateport/palettes/06.pla @@ -0,0 +1,2 @@ +# Color indices to set high bit +8 \ No newline at end of file diff --git a/data/tilesets/secondary/slateport/palettes/12.pal b/data/tilesets/secondary/slateport/palettes/12.pal index 589258c21f..7ef1f4f2db 100644 --- a/data/tilesets/secondary/slateport/palettes/12.pal +++ b/data/tilesets/secondary/slateport/palettes/12.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -96 160 72 +0 0 0 222 205 148 184 168 80 168 224 200 diff --git a/data/tilesets/secondary/slateport/palettes/12.pla b/data/tilesets/secondary/slateport/palettes/12.pla new file mode 100644 index 0000000000..27f716b90d --- /dev/null +++ b/data/tilesets/secondary/slateport/palettes/12.pla @@ -0,0 +1,6 @@ +# Color indices to set high bit +3 +4 +8 +10 +11 \ No newline at end of file diff --git a/data/tilesets/secondary/sootopolis/palettes/06.pal b/data/tilesets/secondary/sootopolis/palettes/06.pal index 6bb529da6b..44cd60931b 100644 --- a/data/tilesets/secondary/sootopolis/palettes/06.pal +++ b/data/tilesets/secondary/sootopolis/palettes/06.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 192 0 +248 240 176 255 255 255 238 238 213 222 222 180 diff --git a/data/tilesets/secondary/sootopolis/palettes/06.pla b/data/tilesets/secondary/sootopolis/palettes/06.pla new file mode 100644 index 0000000000..82b8d1306f --- /dev/null +++ b/data/tilesets/secondary/sootopolis/palettes/06.pla @@ -0,0 +1,5 @@ +# Color indices to set high bit +0 +9 +10 +15 \ No newline at end of file diff --git a/data/tilesets/secondary/sootopolis/palettes/10.pal b/data/tilesets/secondary/sootopolis/palettes/10.pal index 46457797ed..01d065e528 100644 --- a/data/tilesets/secondary/sootopolis/palettes/10.pal +++ b/data/tilesets/secondary/sootopolis/palettes/10.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 230 25 +246 74 65 139 115 106 115 90 82 90 65 65 diff --git a/data/tilesets/secondary/sootopolis/palettes/10.pla b/data/tilesets/secondary/sootopolis/palettes/10.pla new file mode 100644 index 0000000000..2b4c8a150e --- /dev/null +++ b/data/tilesets/secondary/sootopolis/palettes/10.pla @@ -0,0 +1,8 @@ +# Color indices to set high bit +0 +8 +9 +10 +11 +12 +15 \ No newline at end of file diff --git a/graphics/pokemon/ampharos/normal.pal b/graphics/pokemon/ampharos/normal.pal index f26721738f..78e36ba3a2 100644 --- a/graphics/pokemon/ampharos/normal.pal +++ b/graphics/pokemon/ampharos/normal.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 8 248 +197 65 0 255 255 255 255 238 74 255 197 16 @@ -16,4 +16,4 @@ JASC-PAL 197 65 0 139 32 0 90 0 0 -197 65 0 +255 0 255 diff --git a/graphics/pokemon/ampharos/normal.pla b/graphics/pokemon/ampharos/normal.pla new file mode 100644 index 0000000000..88043ac888 --- /dev/null +++ b/graphics/pokemon/ampharos/normal.pla @@ -0,0 +1,7 @@ +# Color indices to set high bit +0 +6 +11 +12 +13 +14 \ No newline at end of file diff --git a/graphics/pokemon/ampharos/shiny.pal b/graphics/pokemon/ampharos/shiny.pal index 719c6b87f0..a1b88cfd3c 100644 --- a/graphics/pokemon/ampharos/shiny.pal +++ b/graphics/pokemon/ampharos/shiny.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 8 248 +65 106 205 255 255 255 246 180 213 213 148 180 @@ -16,4 +16,4 @@ JASC-PAL 65 106 205 32 65 156 49 74 139 -65 106 205 +255 0 255 diff --git a/graphics/pokemon/ampharos/shiny.pla b/graphics/pokemon/ampharos/shiny.pla new file mode 100644 index 0000000000..88043ac888 --- /dev/null +++ b/graphics/pokemon/ampharos/shiny.pla @@ -0,0 +1,7 @@ +# Color indices to set high bit +0 +6 +11 +12 +13 +14 \ No newline at end of file diff --git a/src/data/tilesets/headers.h b/src/data/tilesets/headers.h index 8a7907c6c8..4144369af8 100644 --- a/src/data/tilesets/headers.h +++ b/src/data/tilesets/headers.h @@ -2,6 +2,13 @@ // Whether a palette has a night version, located at ((x + 9) % 16).pal #define SWAP_PAL(x) ((x) < NUM_PALS_IN_PRIMARY ? 1 << (x) : 1 << ((x) - NUM_PALS_IN_PRIMARY)) + +// NOTE: Instead of using LIGHT_PAL, +// consider taking a look at the .pla files +// to mark colors as lights, instead. +// The old method *should* still work, however. +// See the README for details. + // Whether a palette has lights // the color indices to blend are stored in the palette's color 0 #define LIGHT_PAL(x) ((x) < NUM_PALS_IN_PRIMARY ? 1 << (x) : 1 << ((x) - NUM_PALS_IN_PRIMARY)) @@ -11,7 +18,6 @@ const struct Tileset gTileset_General = .isCompressed = TRUE, .swapPalettes = SWAP_PAL(4), .isSecondary = FALSE, - .lightPalettes = LIGHT_PAL(4), .tiles = gTilesetTiles_General, .palettes = gTilesetPalettes_General, .metatiles = gMetatiles_General, @@ -24,7 +30,6 @@ const struct Tileset gTileset_Petalburg = .isCompressed = TRUE, .swapPalettes = SWAP_PAL(9), .isSecondary = TRUE, - .lightPalettes = LIGHT_PAL(6) | LIGHT_PAL(7) | LIGHT_PAL(9), .tiles = gTilesetTiles_Petalburg, .palettes = gTilesetPalettes_Petalburg, .metatiles = gMetatiles_Petalburg, @@ -36,7 +41,6 @@ const struct Tileset gTileset_Rustboro = { .isCompressed = TRUE, .isSecondary = TRUE, - .lightPalettes = LIGHT_PAL(6), .tiles = gTilesetTiles_Rustboro, .palettes = gTilesetPalettes_Rustboro, .metatiles = gMetatiles_Rustboro, @@ -60,7 +64,6 @@ const struct Tileset gTileset_Slateport = .isCompressed = TRUE, .swapPalettes = SWAP_PAL(6), .isSecondary = TRUE, - .lightPalettes = LIGHT_PAL(6) | LIGHT_PAL(12), .tiles = gTilesetTiles_Slateport, .palettes = gTilesetPalettes_Slateport, .metatiles = gMetatiles_Slateport, @@ -72,7 +75,6 @@ const struct Tileset gTileset_Mauville = { .isCompressed = TRUE, .isSecondary = TRUE, - .lightPalettes = LIGHT_PAL(7) | LIGHT_PAL(10) | LIGHT_PAL(11), .tiles = gTilesetTiles_Mauville, .palettes = gTilesetPalettes_Mauville, .metatiles = gMetatiles_Mauville, @@ -84,8 +86,6 @@ const struct Tileset gTileset_Lavaridge = { .isCompressed = TRUE, .isSecondary = TRUE, - .lightPalettes = LIGHT_PAL(6), - .customLightColor = LIGHT_PAL(6), .tiles = gTilesetTiles_Lavaridge, .palettes = gTilesetPalettes_Lavaridge, .metatiles = gMetatiles_Lavaridge, @@ -98,7 +98,6 @@ const struct Tileset gTileset_Fallarbor = .isCompressed = TRUE, .swapPalettes = SWAP_PAL(7), .isSecondary = TRUE, - .lightPalettes = LIGHT_PAL(7), .tiles = gTilesetTiles_Fallarbor, .palettes = gTilesetPalettes_Fallarbor, .metatiles = gMetatiles_Fallarbor, @@ -110,8 +109,6 @@ const struct Tileset gTileset_Fortree = { .isCompressed = TRUE, .isSecondary = TRUE, - .lightPalettes = LIGHT_PAL(8), - .customLightColor = LIGHT_PAL(8), .tiles = gTilesetTiles_Fortree, .palettes = gTilesetPalettes_Fortree, .metatiles = gMetatiles_Fortree, @@ -124,7 +121,6 @@ const struct Tileset gTileset_Lilycove = .isCompressed = TRUE, .swapPalettes = SWAP_PAL(6), .isSecondary = TRUE, - .lightPalettes = LIGHT_PAL(6), .tiles = gTilesetTiles_Lilycove, .palettes = gTilesetPalettes_Lilycove, .metatiles = gMetatiles_Lilycove, @@ -137,7 +133,6 @@ const struct Tileset gTileset_Mossdeep = .isCompressed = TRUE, .swapPalettes = SWAP_PAL(8), .isSecondary = TRUE, - .lightPalettes = LIGHT_PAL(8), .tiles = gTilesetTiles_Mossdeep, .palettes = gTilesetPalettes_Mossdeep, .metatiles = gMetatiles_Mossdeep, @@ -154,7 +149,6 @@ const struct Tileset gTileset_EverGrande = .metatiles = gMetatiles_EverGrande, .metatileAttributes = gMetatileAttributes_EverGrande, .callback = InitTilesetAnim_EverGrande, - .lightPalettes = LIGHT_PAL(8), .swapPalettes = SWAP_PAL(8), }; @@ -163,7 +157,6 @@ const struct Tileset gTileset_Pacifidlog = .isCompressed = TRUE, .swapPalettes = SWAP_PAL(9), .isSecondary = TRUE, - .lightPalettes = LIGHT_PAL(9), .tiles = gTilesetTiles_Pacifidlog, .palettes = gTilesetPalettes_Pacifidlog, .metatiles = gMetatiles_Pacifidlog, @@ -176,8 +169,6 @@ const struct Tileset gTileset_Sootopolis = .isCompressed = TRUE, .swapPalettes = SWAP_PAL(6), .isSecondary = TRUE, - .lightPalettes = LIGHT_PAL(6) | LIGHT_PAL(10), - .customLightColor = LIGHT_PAL(6) | LIGHT_PAL(10), .tiles = gTilesetTiles_Sootopolis, .palettes = gTilesetPalettes_Sootopolis, .metatiles = gMetatiles_Sootopolis, diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 8d96a70fa7..e29e4450ac 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1765,16 +1765,11 @@ static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool8 shiny) { // so that palette tags do not overlap const struct CompressedSpritePalette *spritePalette = &(shiny ? gMonShinyPaletteTable : gMonPaletteTable)[species]; if ((paletteNum = IndexOfSpritePaletteTag(spritePalette->tag)) == 0xFF) { // Load compressed palette - LoadCompressedSpritePalette(spritePalette); - paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present - if (species == SPECIES_AMPHAROS) { // palette should be light-blended TODO: Add more glowing pokemon + LoadCompressedSpritePalette(spritePalette); + paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present + // TODO: Add more glowing pokemon besides Ampharos // CHARIZARD LINE ? CHINCHOU LANTERN FLAAFY MAREEP UMBREON VOLBEAT ? - u16 * palette = &gPlttBufferUnfaded[(paletteNum+16)*16]; - palette[0] |= 0x8000; - if (palette[0] & 0x4000) // If color 15 is blended, use it as the alternate color - palette[15] |= 0x8000; - } - UpdateSpritePaletteWithWeather(paletteNum, FALSE); + UpdateSpritePaletteWithWeather(paletteNum, FALSE); } return paletteNum; } diff --git a/src/fieldmap.c b/src/fieldmap.c index 83d1697adb..f4411038fa 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -904,14 +904,17 @@ void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size, LoadCompressedPalette((const u32 *)tileset->palettes, destOffset, size); ApplyGlobalTintToPaletteEntries(destOffset, size >> 1); } - if (tileset->isSecondary == FALSE || tileset->isSecondary == TRUE) { - u32 i; + // convert legacy light palette system to current + if (tileset->lightPalettes) { + u32 i, j, color; for (i = low; i < high; i++) { - if (tileset->lightPalettes & (1 << (i - low))) { // Mark as light palette - u32 index = i * 16; - gPlttBufferFaded[index] = gPlttBufferUnfaded[index] |= 0x8000; - if (tileset->customLightColor & (1 << (i - low))) // Mark as custom light color - gPlttBufferFaded[index+15] = gPlttBufferUnfaded[index+15] |= 0x8000; + if (tileset->lightPalettes & (1 << (i - low))) { // Mark light colors + for (j = 1, color = gPlttBufferUnfaded[PLTT_ID(i)]; j < 16 && color; j++, color >>= 1) { + if (color & 1) + gPlttBufferFaded[PLTT_ID(i)+j] = gPlttBufferUnfaded[PLTT_ID(i)+j] |= RGB_ALPHA; + } + if (tileset->customLightColor & (1 << (i - low))) // Copy old custom light color to index 0 + gPlttBufferFaded[PLTT_ID(i)] = gPlttBufferUnfaded[PLTT_ID(i)] = gPlttBufferUnfaded[PLTT_ID(i)+15] | RGB_ALPHA; } } } diff --git a/src/palette.c b/src/palette.c index d2a8476dde..b17ba8214d 100644 --- a/src/palette.c +++ b/src/palette.c @@ -1003,40 +1003,40 @@ static bool8 IsSoftwarePaletteFadeFinishing(void) // optimized based on lucktyphlosion's BlendPalettesFine void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color) { - s32 newR, newG, newB; + s32 newR, newG, newB; - if (!palettes) - return; + if (!palettes) + return; - coeff *= 2; - newR = (color << 27) >> 27; - newG = (color << 22) >> 27; - newB = (color << 17) >> 27; + coeff *= 2; + newR = (color << 27) >> 27; + newG = (color << 22) >> 27; + newB = (color << 17) >> 27; - do { - if (palettes & 1) { - u16 *srcEnd = src + 16; - while (src != srcEnd) { // Transparency is blended because it can matter for tile palettes - u32 srcColor = *src; - s32 r = (srcColor << 27) >> 27; - s32 g = (srcColor << 22) >> 27; - s32 b = (srcColor << 17) >> 27; + do { + if (palettes & 1) { + u16 *srcEnd = src + 16; + while (src != srcEnd) { // Transparency is blended (for backdrop reasons) + u32 srcColor = *src; + s32 r = (srcColor << 27) >> 27; + s32 g = (srcColor << 22) >> 27; + s32 b = (srcColor << 16) >> 26; - *dst++ = ((r + (((newR - r) * coeff) >> 5)) << 0) - | ((g + (((newG - g) * coeff) >> 5)) << 5) - | ((b + (((newB - b) * coeff) >> 5)) << 10); - src++; - } - } else { - src += 16; - dst += 16; - } - palettes >>= 1; - } while (palettes); + *dst++ = ((r + (((newR - r) * (s32)coeff) >> 5)) << 0) + | ((g + (((newG - g) * (s32)coeff) >> 5)) << 5) + | ((b + (((newB - (b & 31)) * (s32)coeff) >> 5)) << 10); + src++; + } + } else { + src += 16; + dst += 16; + } + palettes >>= 1; + } while (palettes); } void BlendPalettes(u32 palettes, u8 coeff, u16 color) { - BlendPalettesFine(palettes, gPlttBufferUnfaded, gPlttBufferFaded, coeff, color); + BlendPalettesFine(palettes, gPlttBufferUnfaded, gPlttBufferFaded, coeff, color); } #define DEFAULT_LIGHT_COLOR 0x3f9f @@ -1044,186 +1044,172 @@ void BlendPalettes(u32 palettes, u8 coeff, u16 color) { // Like BlendPalette, but ignores blendColor if the transparency high bit is set // Optimization help by lucktyphlosion void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor) { - s32 newR, newG, newB, defR, defG, defB; - u16 * src = gPlttBufferUnfaded + palOffset; - u16 * dst = gPlttBufferFaded + palOffset; - u32 defaultBlendColor = DEFAULT_LIGHT_COLOR; - u16 *srcEnd = src + 16; - u16 altBlendIndices = *dst++ = *src++; // color 0 is copied through unchanged - u32 altBlendColor; + s32 newR, newG, newB, defR, defG, defB; + u16 * src = gPlttBufferUnfaded + palOffset; + u16 * dst = gPlttBufferFaded + palOffset; + u32 defaultBlendColor = DEFAULT_LIGHT_COLOR; + u16 *srcEnd = src + 16; + u32 altBlendColor = *dst++ = *src++; // color 0 is copied through unchanged - coeff *= 2; - newR = (blendColor << 27) >> 27; - newG = (blendColor << 22) >> 27; - newB = (blendColor << 17) >> 27; + coeff *= 2; + newR = (blendColor << 27) >> 27; + newG = (blendColor << 22) >> 27; + newB = (blendColor << 17) >> 27; - if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend - // Note that bit 0 of altBlendIndices specifies color 1 - altBlendColor = src[14]; // color 15 - if (altBlendColor >> 15) { // Set alternate blend color - defR = (altBlendColor << 27) >> 27; - defG = (altBlendColor << 22) >> 27; - defB = (altBlendColor << 17) >> 27; - } else { // Set default blend color - defR = (defaultBlendColor << 27) >> 27; - defG = (defaultBlendColor << 22) >> 27; - defB = (defaultBlendColor << 17) >> 27; + if (altBlendColor >> 15) { // Transparency high bit set; alt blend color + defR = (altBlendColor << 27) >> 27; + defG = (altBlendColor << 22) >> 27; + defB = (altBlendColor << 17) >> 27; + } else { + defR = (defaultBlendColor << 27) >> 27; + defG = (defaultBlendColor << 22) >> 27; + defB = (defaultBlendColor << 17) >> 27; + altBlendColor = 0; } - } else { - altBlendIndices = 0; - } - while (src != srcEnd) { - u32 srcColor = *src; - s32 r = (srcColor << 27) >> 27; - s32 g = (srcColor << 22) >> 27; - s32 b = (srcColor << 17) >> 27; + while (src != srcEnd) { + u32 srcColor = *src; + s32 r = (srcColor << 27) >> 27; + s32 g = (srcColor << 22) >> 27; + s32 b = (srcColor << 16) >> 26; - if (altBlendIndices & 1) { - *dst = ((r + (((defR - r) * coeff) >> 5)) << 0) - | ((g + (((defG - g) * coeff) >> 5)) << 5) - | ((b + (((defB - b) * coeff) >> 5)) << 10); - } else { // Use provided blend color - *dst = ((r + (((newR - r) * coeff) >> 5)) << 0) - | ((g + (((newG - g) * coeff) >> 5)) << 5) - | ((b + (((newB - b) * coeff) >> 5)) << 10); + if (srcColor >> 15) { + *dst = ((r + (((defR - r) * (s32)coeff) >> 5)) << 0) + | ((g + (((defG - g) * (s32)coeff) >> 5)) << 5) + | ((b + (((defB - (b & 31)) * (s32)coeff) >> 5)) << 10); + } else { // Use provided blend color + *dst = ((r + (((newR - r) * (s32)coeff) >> 5)) << 0) + | ((g + (((newG - g) * (s32)coeff) >> 5)) << 5) + | ((b + (((newB - (b & 31)) * (s32)coeff) >> 5)) << 10); + } + src++; + dst++; } - src++; - dst++; - altBlendIndices >>= 1; - } } // Blends a weighted average of two blend parameters // Parameters can be either blended (as in BlendPalettes) or tinted (as in TintPaletteRGB_Copy) void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *blend0, struct BlendSettings *blend1, u16 weight0) { - s32 r0, g0, b0, r1, g1, b1, defR, defG, defB, altR, altG, altB; - u32 color0, coeff0, color1, coeff1; - bool8 tint0, tint1; - u16 weight1; - u32 defaultColor = DEFAULT_LIGHT_COLOR; + s32 r0, g0, b0, r1, g1, b1, defR, defG, defB, altR, altG, altB; + u32 color0, coeff0, color1, coeff1; + bool8 tint0, tint1; + u32 defaultColor = DEFAULT_LIGHT_COLOR; - if (!palettes) + if (!palettes) return; - color0 = blend0->blendColor; - tint0 = blend0->isTint; - coeff0 = tint0 ? 8*2 : blend0->coeff*2; - color1 = blend1->blendColor; - tint1 = blend1->isTint; - coeff1 = tint1 ? 8*2 : blend1->coeff*2; + color0 = blend0->blendColor; + tint0 = blend0->isTint; + coeff0 = tint0 ? 8*2 : blend0->coeff*2; + color1 = blend1->blendColor; + tint1 = blend1->isTint; + coeff1 = tint1 ? 8*2 : blend1->coeff*2; - if (tint0) { - r0 = (color0 << 24) >> 24; - g0 = (color0 << 16) >> 24; - b0 = (color0 << 8) >> 24; - } else { - r0 = (color0 << 27) >> 27; - g0 = (color0 << 22) >> 27; - b0 = (color0 << 17) >> 27; - } - if (tint1) { - r1 = (color1 << 24) >> 24; - g1 = (color1 << 16) >> 24; - b1 = (color1 << 8) >> 24; - } else { - r1 = (color1 << 27) >> 27; - g1 = (color1 << 22) >> 27; - b1 = (color1 << 17) >> 27; - } - defR = (defaultColor << 27) >> 27; - defG = (defaultColor << 22) >> 27; - defB = (defaultColor << 17) >> 27; - weight1 = 256 - weight0; - - do { - if (palettes & 1) { - u16 *srcEnd = src + 16; - u16 altBlendIndices = *dst++ = *src++; // color 0 is copied through - u32 altBlendColor; - if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend - // Note that bit 0 of altBlendIndices specifies color 1 - altBlendColor = src[14]; // color 15 - if (altBlendColor >> 15) { // Set alternate blend color - altR = (altBlendColor << 27) >> 27; - altG = (altBlendColor << 22) >> 27; - altB = (altBlendColor << 17) >> 27; - } else { - altBlendColor = 0; - } - } else { - altBlendIndices = 0; - } - while (src != srcEnd) { - u32 srcColor = *src; - s32 r = (srcColor << 27) >> 27; - s32 g = (srcColor << 22) >> 27; - s32 b = (srcColor << 17) >> 27; - - if (altBlendIndices & 1) { - if (altBlendColor) { // Use alternate blend color - r = (weight0*(r + (((altR - r) * coeff0) >> 5)) + weight1*(r + (((altR - r) * coeff1) >> 5))) >> 8; - g = (weight0*(g + (((altG - g) * coeff0) >> 5)) + weight1*(g + (((altG - g) * coeff1) >> 5))) >> 8; - b = (weight0*(b + (((altB - b) * coeff0) >> 5)) + weight1*(b + (((altB - b) * coeff1) >> 5))) >> 8; - *dst = RGB2(r, g, b); - } else { // Use default blend color - r = (weight0*(r + (((defR - r) * coeff0) >> 5)) + weight1*(r + (((defR - r) * coeff1) >> 5))) >> 8; - g = (weight0*(g + (((defG - g) * coeff0) >> 5)) + weight1*(g + (((defG - g) * coeff1) >> 5))) >> 8; - b = (weight0*(b + (((defB - b) * coeff0) >> 5)) + weight1*(b + (((defB - b) * coeff1) >> 5))) >> 8; - *dst = RGB2(r, g, b); - } - } else { // Use provided blend colors - s32 r2, g2, b2, r3, g3, b3; - if (!tint0) { // blend-based - r2 = (r + (((r0 - r) * coeff0) >> 5)); - g2 = (g + (((g0 - g) * coeff0) >> 5)); - b2 = (b + (((b0 - b) * coeff0) >> 5)); - } else { // tint-based - r2 = (u16)((r0 * r)) >> 8; - g2 = (u16)((g0 * g)) >> 8; - b2 = (u16)((b0 * b)) >> 8; - if (r2 > 31) - r2 = 31; - if (g2 > 31) - g2 = 31; - if (b2 > 31) - b2 = 31; - } - if (!tint1) { // blend-based - r3 = (r + (((r1 - r) * coeff1) >> 5)); - g3 = (g + (((g1 - g) * coeff1) >> 5)); - b3 = (b + (((b1 - b) * coeff1) >> 5)); - } else { // tint-based - r3 = (u16)((r1 * r)) >> 8; - g3 = (u16)((g1 * g)) >> 8; - b3 = (u16)((b1 * b)) >> 8; - if (r3 > 31) - r3 = 31; - if (g3 > 31) - g3 = 31; - if (b3 > 31) - b3 = 31; - } - r = (weight0*r2 + weight1*r3) >> 8; - g = (weight0*g2 + weight1*g3) >> 8; - b = (weight0*b2 + weight1*b3) >> 8; - *dst = RGB2(r, g, b); - } - src++; - dst++; - altBlendIndices >>= 1; - } + if (tint0) { + r0 = (color0 << 24) >> 24; + g0 = (color0 << 16) >> 24; + b0 = (color0 << 8) >> 24; } else { - src += 16; - dst += 16; + r0 = (color0 << 27) >> 27; + g0 = (color0 << 22) >> 27; + b0 = (color0 << 17) >> 27; } - palettes >>= 1; - } while (palettes); + if (tint1) { + r1 = (color1 << 24) >> 24; + g1 = (color1 << 16) >> 24; + b1 = (color1 << 8) >> 24; + } else { + r1 = (color1 << 27) >> 27; + g1 = (color1 << 22) >> 27; + b1 = (color1 << 17) >> 27; + } + defR = (defaultColor << 27) >> 27; + defG = (defaultColor << 22) >> 27; + defB = (defaultColor << 17) >> 27; + + do { + if (palettes & 1) { + u16 *srcEnd = src + 16; + u32 altBlendColor = *dst++ = *src++; // color 0 is copied through + if (altBlendColor >> 15) { // Transparency high bit set; alt blend color + altR = (altBlendColor << 27) >> 27; + altG = (altBlendColor << 22) >> 27; + altB = (altBlendColor << 17) >> 27; + } else { + altBlendColor = 0; + } + while (src != srcEnd) { + u32 srcColor = *src; + s32 r = (srcColor << 27) >> 27; + s32 g = (srcColor << 22) >> 27; + s32 b = (srcColor << 17) >> 27; + s32 r2, g2, b2; + + if (srcColor >> 15) { + if (altBlendColor) { // Use alternate blend color + r2 = r + (((altR - r) * (s32)coeff1) >> 5); + g2 = g + (((altG - g) * (s32)coeff1) >> 5); + b2 = b + (((altB - b) * (s32)coeff1) >> 5); + r = r + (((altR - r) * (s32)coeff0) >> 5); + g = g + (((altG - g) * (s32)coeff0) >> 5); + b = b + (((altB - b) * (s32)coeff0) >> 5); + } else { // Use default blend color + r2 = r + (((defR - r) * (s32)coeff1) >> 5); + g2 = g + (((defG - g) * (s32)coeff1) >> 5); + b2 = b + (((defB - b) * (s32)coeff1) >> 5); + r = r + (((defR - r) * (s32)coeff0) >> 5); + g = g + (((defG - g) * (s32)coeff0) >> 5); + b = b + (((defB - b) * (s32)coeff0) >> 5); + } + } else { // Use provided blend colors + if (!tint1) { // blend-based + r2 = (r + (((r1 - r) * (s32)coeff1) >> 5)); + g2 = (g + (((g1 - g) * (s32)coeff1) >> 5)); + b2 = (b + (((b1 - b) * (s32)coeff1) >> 5)); + } else { // tint-based + r2 = (u16)((r1 * r)) >> 8; + g2 = (u16)((g1 * g)) >> 8; + b2 = (u16)((b1 * b)) >> 8; + if (r2 > 31) + r2 = 31; + if (g2 > 31) + g2 = 31; + if (b2 > 31) + b2 = 31; + } + if (!tint0) { // blend-based + r = (r + (((r0 - r) * (s32)coeff0) >> 5)); + g = (g + (((g0 - g) * (s32)coeff0) >> 5)); + b = (b + (((b0 - b) * (s32)coeff0) >> 5)); + } else { // tint-based + r = (u16)((r0 * r)) >> 8; + g = (u16)((g0 * g)) >> 8; + b = (u16)((b0 * b)) >> 8; + if (r > 31) + r = 31; + if (g > 31) + g = 31; + if (b > 31) + b = 31; + } + } + r = r2 + (((r - r2) * (s32)weight0) >> 8); + g = g2 + (((g - g2) * (s32)weight0) >> 8); + b = b2 + (((b - b2) * (s32)weight0) >> 8); + *dst++ = RGB2(r, g, b); + // *dst++ = RGB2(r, g, b) | (srcColor >> 15) << 15; + src++; + } + } else { + src += 16; + dst += 16; + } + palettes >>= 1; + } while (palettes); } // Apply weighted average to palettes, preserving high bits of dst throughout void AvgPaletteWeighted(u16 *src0, u16 *src1, u16 *dst, u16 weight0) { u16 *srcEnd = src0 + 16; - u16 weight1 = 256 - weight0; src0++; src1++; dst++; // leave dst transparency unchanged @@ -1238,10 +1224,10 @@ void AvgPaletteWeighted(u16 *src0, u16 *src1, u16 *dst, u16 weight0) { s32 b1 = (src1Color << 17) >> 27; // Average and bitwise-OR - r0 = (weight0*r0 + weight1*r1) >> 8; - g0 = (weight0*g0 + weight1*g1) >> 8; - b0 = (weight0*b0 + weight1*b1) >> 8; - *dst++ = (*dst & 0x8000) | RGB2(r0, g0, b0); // preserve high bit of dst + r0 = r1 + (((r0 - r1) * weight0) >> 8); + g0 = g1 + (((g0 - g1) * weight0) >> 8); + b0 = b1 + (((b0 - b1) * weight0) >> 8); + *dst++ = (*dst & RGB_ALPHA) | RGB2(r0, g0, b0); // preserve high bit of dst } } diff --git a/tools/gbagfx/gfx.c b/tools/gbagfx/gfx.c index 832e9bb397..a751a366ff 100644 --- a/tools/gbagfx/gfx.c +++ b/tools/gbagfx/gfx.c @@ -14,6 +14,7 @@ #define GET_GBA_PAL_BLUE(x) (((x) >> 10) & 0x1F) #define SET_GBA_PAL(r, g, b) (((b) << 10) | ((g) << 5) | (r)) +#define SET_GBA_PAL_RGBA(r, g, b, a) (((a) << 15) | ((b) << 10) | ((g) << 5) | (r)) #define UPCONVERT_BIT_DEPTH(x) (((x) * 255) / 31) @@ -516,8 +517,9 @@ void WriteGbaPalette(char *path, struct Palette *palette) unsigned char red = DOWNCONVERT_BIT_DEPTH(palette->colors[i].red); unsigned char green = DOWNCONVERT_BIT_DEPTH(palette->colors[i].green); unsigned char blue = DOWNCONVERT_BIT_DEPTH(palette->colors[i].blue); + bool alpha = palette->colors[i].alpha; - uint16_t paletteEntry = SET_GBA_PAL(red, green, blue); + uint16_t paletteEntry = SET_GBA_PAL_RGBA(red, green, blue, alpha); fputc(paletteEntry & 0xFF, fp); fputc(paletteEntry >> 8, fp); diff --git a/tools/gbagfx/gfx.h b/tools/gbagfx/gfx.h index f1dbfcf4f7..33b27ac4c0 100644 --- a/tools/gbagfx/gfx.h +++ b/tools/gbagfx/gfx.h @@ -10,6 +10,7 @@ struct Color { unsigned char red; unsigned char green; unsigned char blue; + bool alpha; }; struct Palette { diff --git a/tools/gbagfx/jasc_pal.c b/tools/gbagfx/jasc_pal.c index e5ba9c3c2f..0bf2b52ad0 100644 --- a/tools/gbagfx/jasc_pal.c +++ b/tools/gbagfx/jasc_pal.c @@ -22,7 +22,7 @@ // Blue - "0 0 255\r\n" // Brown - "150 75 0\r\n" -#define MAX_LINE_LENGTH 11 +#define MAX_LINE_LENGTH 64 void ReadJascPaletteLine(FILE *fp, char *line) { @@ -152,6 +152,43 @@ void ReadJascPalette(char *path, struct Palette *palette) FATAL_ERROR("Garbage after color data.\n"); fclose(fp); + + // Try to parse alpha/high bit info for colors from auxiliary .pla file + char *dot = strrchr(path, '.'); + if (strcmp(dot, ".pal") != 0) + return; + strcpy(dot, ".pla"); // replace .pal with .pla + fp = fopen(path, "rb"); + + if (fp == NULL) + return; + // fprintf(stderr, "Opened auxiliary .pla file for reading: %s\n", path); + + int i = 0; + // Keep reading lines until number of colors is reached or we run out + while (i < palette->numColors && fgets(line, MAX_LINE_LENGTH, fp) != NULL) + { + if (line[0] == '#') // comment line; ignore + continue; + + char *s = line; + char *end; + int colorIndex; + + if (!ParseNumber(s, &end, 10, &colorIndex)) + FATAL_ERROR("Failed to parse aux color index.\n"); + + s = end; + + if (colorIndex >= palette->numColors) + FATAL_ERROR("Aux color index %d out of bounds.\n", colorIndex); + + palette->colors[colorIndex].alpha = 1; // set alpha color + // fprintf(stderr, "Color index: %d\n", colorIndex); + i++; + } + + fclose(fp); } void WriteJascPalette(char *path, struct Palette *palette) diff --git a/tools/gbagfx/main.c b/tools/gbagfx/main.c index 5d4faacab0..0c4c4ab1b9 100644 --- a/tools/gbagfx/main.c +++ b/tools/gbagfx/main.c @@ -247,7 +247,7 @@ void HandlePngToGbaCommand(char *inputPath, char *outputPath, int argc, char **a void HandlePngToJascPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { - struct Palette palette = {}; + struct Palette palette = {0}; ReadPngPalette(inputPath, &palette); WriteJascPalette(outputPath, &palette); @@ -255,7 +255,7 @@ void HandlePngToJascPaletteCommand(char *inputPath, char *outputPath, int argc U void HandlePngToGbaPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { - struct Palette palette = {}; + struct Palette palette = {0}; ReadPngPalette(inputPath, &palette); WriteGbaPalette(outputPath, &palette); @@ -263,7 +263,7 @@ void HandlePngToGbaPaletteCommand(char *inputPath, char *outputPath, int argc UN void HandleGbaToJascPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { - struct Palette palette = {}; + struct Palette palette = {0}; ReadGbaPalette(inputPath, &palette); WriteJascPalette(outputPath, &palette); @@ -296,7 +296,7 @@ void HandleJascToGbaPaletteCommand(char *inputPath, char *outputPath, int argc, } } - struct Palette palette = {}; + struct Palette palette = {0}; ReadJascPalette(inputPath, &palette); From c1953e5d4bb3130e53c38a9d578000c7359d8cef Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Fri, 23 Jun 2023 11:32:55 +0100 Subject: [PATCH 084/145] Improved OutOfCenterPartyHeal interaction with followers. --- data/event_scripts.s | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/data/event_scripts.s b/data/event_scripts.s index 05f550358f..db57f26625 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -719,10 +719,8 @@ Common_EventScript_OutOfCenterPartyHeal:: playfanfare MUS_HEAL waitfanfare special HealPlayerParty - @ start fade then immediately load following pokemon, and wait for fade - fadescreenswapbuffers FADE_FROM_BLACK, 1 - callnative UpdateFollowingPokemon - callfunc ScrFunc_WaitPaletteNotActive + callnative UpdateFollowingPokemon + fadescreenswapbuffers FADE_FROM_BLACK return EventScript_RegionMap:: From 4689f0b0d012c715e9106b3216bd9308de8abfec Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 15 Oct 2023 00:52:34 -0400 Subject: [PATCH 085/145] Fixes for `make modern`. --- src/field_weather_effect.c | 2 +- src/fieldmap.c | 4 +++- src/follower_helper.c | 2 +- src/palette.c | 3 ++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index f0c1c4eeba..94ae288d60 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -1387,7 +1387,7 @@ static void DestroyFogHorizontalSprites(void); // Updates just the color of shadows to match special weather blending u8 UpdateShadowColor(u16 color) { u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); - u16 tempBuffer[16]; + u16 ALIGNED(4) tempBuffer[16]; u16 blendedColor; if (paletteNum != 0xFF) { u16 index = (paletteNum+16)*16+SHADOW_COLOR_INDEX; diff --git a/src/fieldmap.c b/src/fieldmap.c index c41a3b616b..0e48065a21 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -892,8 +892,10 @@ static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u1 } else if (tileset->isSecondary == TRUE) { + // (void*) is to silence 'source potentially unaligned' error + // All 'gTilesetPalettes_' arrays should have ALIGNED(4) in them if (skipFaded) - CpuFastCopy(tileset->palettes[NUM_PALS_IN_PRIMARY], &gPlttBufferUnfaded[destOffset], size); + CpuFastCopy((void*)tileset->palettes[NUM_PALS_IN_PRIMARY], &gPlttBufferUnfaded[destOffset], size); else LoadPaletteFast(tileset->palettes[NUM_PALS_IN_PRIMARY], destOffset, size); low = NUM_PALS_IN_PRIMARY; diff --git a/src/follower_helper.c b/src/follower_helper.c index f146db6a74..af45565848 100644 --- a/src/follower_helper.c +++ b/src/follower_helper.c @@ -297,7 +297,7 @@ const struct FollowerMsgInfoExtended gFollowerConditionalMessages[COND_MSG_COUNT [COND_MSG_BURN] = { .text = sCondMsg42, - .st = {.status STATUS1_BURN}, + .st = {.status = STATUS1_BURN}, .stFlags = ST_FLAGS_STATUS, .emotion = FOLLOWER_EMOTION_SAD, }, diff --git a/src/palette.c b/src/palette.c index bda52a457a..f7584cd28f 100644 --- a/src/palette.c +++ b/src/palette.c @@ -1227,7 +1227,8 @@ void AvgPaletteWeighted(u16 *src0, u16 *src1, u16 *dst, u16 weight0) { r0 = r1 + (((r0 - r1) * weight0) >> 8); g0 = g1 + (((g0 - g1) * weight0) >> 8); b0 = b1 + (((b0 - b1) * weight0) >> 8); - *dst++ = (*dst & RGB_ALPHA) | RGB2(r0, g0, b0); // preserve high bit of dst + *dst = (*dst & RGB_ALPHA) | RGB2(r0, g0, b0); // preserve high bit of dst + dst++; } } From b1bdd3e0b7e3a0eeea46de74d749aa06fef5c67b Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Thu, 12 Oct 2023 00:34:38 -0400 Subject: [PATCH 086/145] Fixed Deoxys rock palette with lighting. --- src/field_specials.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/field_specials.c b/src/field_specials.c index 87674d8ce7..7e76556d27 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -3343,6 +3343,7 @@ static void ChangeDeoxysRockLevel(u8 rockLevel) { u8 paletteNum = IndexOfSpritePaletteTag(OBJ_EVENT_PAL_TAG_BIRTH_ISLAND_STONE); LoadPalette(&sDeoxysRockPalettes[rockLevel], OBJ_PLTT_ID(paletteNum), PLTT_SIZEOF(4)); + UpdateSpritePaletteWithWeather(paletteNum, FALSE); if (rockLevel == 0) PlaySE(SE_M_CONFUSE_RAY); // Failure sound From 05a6147e5c623bd0560170222ab00865a83c19ca Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Tue, 12 Dec 2023 22:41:10 -0500 Subject: [PATCH 087/145] Fixed `showmonpic` palette being affected by time of day and weather. Fixed #8. --- src/field_effect.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/field_effect.c b/src/field_effect.c index 89934be499..74bb101b18 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -913,27 +913,23 @@ u8 AddNewGameBirchObject(s16 x, s16 y, u8 subpriority) return CreateSprite(&sSpriteTemplate_NewGameBirch, x, y, subpriority); } -u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) + +u8 CreateMonSprite_FieldMove(u16 species, u32 otId, u32 personality, s16 x, s16 y, u8 subpriority) { - s32 spriteId = CreateMonPicSprite_HandleDeoxys(species, 0, 0x8000, TRUE, x, y, 0, gMonPaletteTable[species].tag); - PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[species].tag) + 0x10); + // force load unique tag here to avoid collision with follower pokemon + u32 paletteSlot = AllocSpritePalette(FLDEFF_PAL_TAG_FIELD_MOVE_MON); + u16 spriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, x, y, paletteSlot, TAG_NONE); + PreservePaletteInWeather(paletteSlot + 0x10); if (spriteId == 0xFFFF) return MAX_SPRITES; else return spriteId; } -u8 CreateMonSprite_FieldMove(u16 species, u32 otId, u32 personality, s16 x, s16 y, u8 subpriority) +u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) { - const struct CompressedSpritePalette *spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); - // force load unique tag here to avoid collision with follower pokemon - u8 paletteSlot = AllocSpritePalette(FLDEFF_PAL_TAG_FIELD_MOVE_MON); - u16 spriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, x, y, paletteSlot, TAG_NONE); - PreservePaletteInWeather(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_FIELD_MOVE_MON) + 0x10); - if (spriteId == 0xFFFF) - return MAX_SPRITES; - else - return spriteId; + // Reuse logic; (otId ^ pid) >= SHINY_ODDS ensures non-shiny + return CreateMonSprite_FieldMove(species, 0, SHINY_ODDS, x, y, subpriority); } void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId) From 7939894b183d6fa0741ae4bebead5a94324b0ff9 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sat, 27 Apr 2024 23:31:37 -0400 Subject: [PATCH 088/145] fix: object event palettes can be loaded during fadeout --- src/field_weather.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/field_weather.c b/src/field_weather.c index e859cf856a..bd15ad0742 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -871,6 +871,15 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog) } break; } + // If faded out, i.e due to fadescreenswapbuffers, + // Copy unfaded palette to pal decomp buffer + // so it will be restored on fade-in + if (gPaletteFade.y == 16) + CpuFastCopy( + gPlttBufferUnfaded + OBJ_PLTT_ID(spritePaletteIndex), + gPaletteDecompressionBuffer + 2*OBJ_PLTT_ID(spritePaletteIndex), + PLTT_SIZE_4BPP + ); } void ApplyWeatherColorMapToPal(u8 paletteIndex) // now unused / obselete From 9b6843442ac56062630511d497774af9f8231f98 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Tue, 21 May 2024 22:10:53 -0400 Subject: [PATCH 089/145] fix: add mart light sprite to Route102 --- data/maps/Route102/map.json | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/data/maps/Route102/map.json b/data/maps/Route102/map.json index 68e3549dbb..f129a2a795 100644 --- a/data/maps/Route102/map.json +++ b/data/maps/Route102/map.json @@ -141,10 +141,27 @@ "trainer_sight_or_berry_tree_id": "3", "script": "Route102_EventScript_Allen", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": -3, + "y": 2, + "elevation": 3, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], - "warp_events": [], - "coord_events": [], + "warp_events": [ + + ], + "coord_events": [ + + ], "bg_events": [ { "type": "sign", From ed98b0b8ba3ff93a4192ee17ac2960caf0d38bd0 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Tue, 21 May 2024 22:12:03 -0400 Subject: [PATCH 090/145] fix: added shadows on direct corner map Fixed #18 --- include/constants/event_objects.h | 3 +++ src/event_object_movement.c | 2 +- src/overworld.c | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 2d911538bc..b7dea260a7 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -312,6 +312,9 @@ #define OBJ_KIND_CLONE 255 // Exclusive to FRLG // Special object event local ids +// Used for link player OWs in CreateLinkPlayerSprite +#define OBJ_EVENT_ID_DYNAMIC_BASE 0xF0 + #define OBJ_EVENT_ID_PLAYER 0xFF #define OBJ_EVENT_ID_CAMERA 0x7F #define OBJ_EVENT_ID_FOLLOWER 0xFE diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 3db73d88a1..fe9304e0cc 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1345,7 +1345,7 @@ u8 GetFirstInactiveObjectEventId(void) u8 GetObjectEventIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId) { - if (localId < OBJ_EVENT_ID_FOLLOWER) + if (localId < OBJ_EVENT_ID_DYNAMIC_BASE) return GetObjectEventIdByLocalIdAndMapInternal(localId, mapNum, mapGroupId); return GetObjectEventIdByLocalId(localId); diff --git a/src/overworld.c b/src/overworld.c index 507caad778..7a39a2a6ba 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -12,6 +12,7 @@ #include "field_camera.h" #include "field_control_avatar.h" #include "field_effect.h" +#include "field_effect_helpers.h" #include "field_message_box.h" #include "field_player_avatar.h" #include "field_screen_effect.h" @@ -61,6 +62,7 @@ #include "wild_encounter.h" #include "frontier_util.h" #include "constants/abilities.h" +#include "constants/event_objects.h" #include "constants/layouts.h" #include "constants/map_types.h" #include "constants/region_map_sections.h" @@ -3345,6 +3347,8 @@ static void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion) sprite->coordOffsetEnabled = TRUE; sprite->data[0] = linkPlayerId; objEvent->triggerGroundEffectsOnMove = 0; + objEvent->localId = OBJ_EVENT_ID_DYNAMIC_BASE + linkPlayerId; + SetUpShadow(objEvent, sprite); } } From e899218dfb0be7168f1d3ca31bddea3af5d5384f Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Tue, 25 Jun 2024 01:38:52 -0400 Subject: [PATCH 091/145] fix: MSG_COND_TIME_OF_DAY now checks whether map is outdoors and not raining --- src/event_object_movement.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 39f81f4681..878aeac807 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2158,7 +2158,9 @@ bool32 CheckMsgCondition(const struct MsgCondition *cond, struct Pokemon *mon, u case MSG_COND_MUSIC: return (cond->data.raw == GetCurrentMapMusic()); case MSG_COND_TIME_OF_DAY: - return (cond->data.raw == gTimeOfDay); + // Must match time of day, have natural light on the map, + // and not have weather that obscures the sky + return (cond->data.raw == gTimeOfDay && MapHasNaturalLight(gMapHeader.mapType) && GetCurrentWeather() < WEATHER_RAIN); case MSG_COND_NEAR_MB: multi = FindMetatileBehaviorWithinRange( obj->currentCoords.x, obj->currentCoords.y, From 0745eaf2e07873639778fb29258fefe157070980 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Mon, 12 Aug 2024 22:42:31 -0400 Subject: [PATCH 092/145] fix: Uninitialized value used in `LightenSpritePaletteInFog` --- include/palette.h | 7 +++++++ src/field_weather.c | 6 +++--- src/overworld.c | 14 ++++++-------- src/palette.c | 6 +++--- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/include/palette.h b/include/palette.h index fa41b2d0db..930499b877 100644 --- a/include/palette.h +++ b/include/palette.h @@ -14,6 +14,8 @@ #define PALETTE_FADE_STATUS_LOADING 0xFF #define PALETTES_BG 0x0000FFFF +// like PALETTES_BG but excludes UI pals [13, 15] +#define PALETTES_MAP 0x00001FFF #define PALETTES_OBJECTS 0xFFFF0000 #define PALETTES_ALL (PALETTES_BG | PALETTES_OBJECTS) @@ -24,6 +26,11 @@ #define OBJ_PLTT_ID(n) (OBJ_PLTT_OFFSET + PLTT_ID(n)) #define OBJ_PLTT_ID2(n) (PLTT_ID((n) + 16)) +// Used to determine whether a sprite palette tag +// should be excluded from time (and weather) blending +#define BLEND_IMMUNE_FLAG (1 << 15) +#define IS_BLEND_IMMUNE_TAG(tag) ((tag) & BLEND_IMMUNE_FLAG) + enum { FAST_FADE_IN_FROM_WHITE, diff --git a/src/field_weather.c b/src/field_weather.c index bd15ad0742..1a3a150c4c 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -495,7 +495,7 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) { // don't blend special palettes immune to blending if (sPaletteColorMapTypes[curPalIndex] == COLOR_MAP_NONE || - (curPalIndex >= 16 && GetSpritePaletteTagByPaletteNum(curPalIndex - 16) >> 15)) + (curPalIndex >= 16 && IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(curPalIndex - 16)))) { // No palette change. palOffset += 16; @@ -684,7 +684,7 @@ static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) CpuFastCopy(gPlttBufferUnfaded, gPlttBufferFaded, PLTT_BUFFER_SIZE * 2); UpdatePalettesWithTime(PALETTES_ALL); // Then blend tile palettes [0, 12] faded->faded with fadeIn color - BlendPalettesFine(0x1FFF, gPlttBufferFaded, gPlttBufferFaded, blendCoeff, blendColor); + BlendPalettesFine(PALETTES_MAP, gPlttBufferFaded, gPlttBufferFaded, blendCoeff, blendColor); // Do fog blending on marked sprite palettes for (curPalIndex = 16; curPalIndex < 32; curPalIndex++) { @@ -708,7 +708,7 @@ static bool8 LightenSpritePaletteInFog(u8 paletteIndex) { u16 i; - if (paletteIndex >= 16 && (GetSpritePaletteTagByPaletteNum(i - 16) >> 15)) // don't blend specialpalette tags + if (paletteIndex >= 16 && IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(paletteIndex - 16))) return FALSE; for (i = 0; i < gWeatherPtr->lightenedFogSpritePalsCount; i++) diff --git a/src/overworld.c b/src/overworld.c index 7a39a2a6ba..9c4bd0cdfb 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1536,7 +1536,7 @@ void UpdateAltBgPalettes(u16 palettes) { return; palettes &= ~((1 << NUM_PALS_IN_PRIMARY) - 1) | primary->swapPalettes; palettes &= ((1 << NUM_PALS_IN_PRIMARY) - 1) | (secondary->swapPalettes << NUM_PALS_IN_PRIMARY); - palettes &= 0x1FFE; // don't blend palette 0, [13,15] + palettes &= PALETTES_MAP ^ (1 << 0); // don't blend palette 0, [13,15] palettes >>= 1; // start at palette 1 if (!palettes) return; @@ -1558,10 +1558,10 @@ void UpdatePalettesWithTime(u32 palettes) { u32 mask = 1 << 16; if (palettes >= 0x10000) for (i = 0; i < 16; i++, mask <<= 1) - if (GetSpritePaletteTagByPaletteNum(i) >> 15) // Don't blend special sprite palette tags + if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(i))) palettes &= ~(mask); - palettes &= 0xFFFF1FFF; // Don't blend UI BG palettes [13,15] + palettes &= PALETTES_MAP | PALETTES_OBJECTS; // Don't blend UI pals if (!palettes) return; TimeMixPalettes(palettes, @@ -1575,13 +1575,11 @@ void UpdatePalettesWithTime(u32 palettes) { u8 UpdateSpritePaletteWithTime(u8 paletteNum) { if (MapHasNaturalLight(gMapHeader.mapType)) { - u16 offset; - if (GetSpritePaletteTagByPaletteNum(paletteNum) >> 15) + if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(paletteNum))) return paletteNum; - offset = (paletteNum + 16) << 4; TimeMixPalettes(1, - gPlttBufferUnfaded + offset, - gPlttBufferFaded + offset, + &gPlttBufferUnfaded[OBJ_PLTT_ID(paletteNum)], + &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], currentTimeBlend.weight); diff --git a/src/palette.c b/src/palette.c index 0093a4bf69..a8be1867a7 100644 --- a/src/palette.c +++ b/src/palette.c @@ -515,11 +515,11 @@ static u8 UpdateTimeOfDayPaletteFade(void) u32 i; u32 j = 1; for (i = 0; i < 16; i++, j <<= 1) { // Mask out palettes that should not be light blended - if ((selectedPalettes & j) && !(GetSpritePaletteTagByPaletteNum(i) >> 15)) - timePalettes |= j; + if ((selectedPalettes & j) && !IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(i))) + timePalettes |= j; } } else { // tile palettes, don't blend [13, 15] - timePalettes = selectedPalettes & 0x1FFF; + timePalettes = selectedPalettes & PALETTES_MAP; } TimeMixPalettes(timePalettes, src, dst, gPaletteFade.bld0, gPaletteFade.bld1, gPaletteFade.weight); From 0ae5cb1e39f64955107707bbacd1d6dfc117fc01 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Mon, 12 Aug 2024 23:04:41 -0400 Subject: [PATCH 093/145] meta: cleaned up spacing of lighting code --- src/field_specials.c | 3 +- src/field_weather_effect.c | 28 ++++----- src/overworld.c | 93 ++++++++++++++++------------- src/palette.c | 117 +++++++++++++++++++------------------ src/palette_util.c | 3 +- 5 files changed, 127 insertions(+), 117 deletions(-) diff --git a/src/field_specials.c b/src/field_specials.c index 1c5cfa987b..33ed031918 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -64,6 +64,7 @@ #include "constants/battle_frontier.h" #include "constants/weather.h" #include "constants/metatile_labels.h" +#include "constants/rgb.h" #include "palette.h" #define TAG_ITEM_ICON 5500 @@ -3395,7 +3396,7 @@ void SetDeoxysRockPalette(void) u32 paletteNum = IndexOfSpritePaletteTag(OBJ_EVENT_PAL_TAG_BIRTH_ISLAND_STONE); LoadPalette(&sDeoxysRockPalettes[(u8)VarGet(VAR_DEOXYS_ROCK_LEVEL)], OBJ_PLTT_ID(paletteNum), PLTT_SIZEOF(4)); // Set faded to all black, weather blending handled during fade-in - CpuFill16(0, &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], 32); + CpuFill16(RGB_BLACK, &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], PLTT_SIZE_4BPP); } void SetPCBoxToSendMon(u8 boxId) diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index 1d24927859..f8d8fa0ac4 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -1386,20 +1386,20 @@ static void DestroyFogHorizontalSprites(void); // Updates just the color of shadows to match special weather blending u8 UpdateShadowColor(u16 color) { - u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); - u16 ALIGNED(4) tempBuffer[16]; - u16 blendedColor; - if (paletteNum != 0xFF) { - u16 index = (paletteNum+16)*16+SHADOW_COLOR_INDEX; - gPlttBufferUnfaded[index] = gPlttBufferFaded[index] = color; - // Copy to temporary buffer, blend, and keep just the shadow color index - CpuFastCopy(&gPlttBufferFaded[index-SHADOW_COLOR_INDEX], tempBuffer, 32); - UpdateSpritePaletteWithTime(paletteNum); - blendedColor = gPlttBufferFaded[index]; - CpuFastCopy(tempBuffer, &gPlttBufferFaded[index-SHADOW_COLOR_INDEX], 32); - gPlttBufferFaded[index] = blendedColor; - } - return paletteNum; + u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); + u16 ALIGNED(4) tempBuffer[16]; + u16 blendedColor; + if (paletteNum < 16) { + u16 index = OBJ_PLTT_ID(paletteNum)+SHADOW_COLOR_INDEX; + gPlttBufferUnfaded[index] = gPlttBufferFaded[index] = color; + // Copy to temporary buffer, blend, and keep just the shadow color index + CpuFastCopy(&gPlttBufferFaded[index-SHADOW_COLOR_INDEX], tempBuffer, PLTT_SIZE_4BPP); + UpdateSpritePaletteWithTime(paletteNum); + blendedColor = gPlttBufferFaded[index]; + CpuFastCopy(tempBuffer, &gPlttBufferFaded[index-SHADOW_COLOR_INDEX], PLTT_SIZE_4BPP); + gPlttBufferFaded[index] = blendedColor; + } + return paletteNum; } void FogHorizontal_InitVars(void) diff --git a/src/overworld.c b/src/overworld.c index 9c4bd0cdfb..cbe0347768 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1473,9 +1473,9 @@ void CB1_Overworld(void) const struct BlendSettings gTimeOfDayBlend[] = { - [TIME_OF_DAY_NIGHT] = {.coeff = 10, .blendColor = TINT_NIGHT, .isTint = TRUE}, - [TIME_OF_DAY_TWILIGHT] = {.coeff = 4, .blendColor = 0xA8B0E0, .isTint = TRUE}, - [TIME_OF_DAY_DAY] = {.coeff = 0, .blendColor = 0}, + [TIME_OF_DAY_NIGHT] = {.coeff = 10, .blendColor = TINT_NIGHT, .isTint = TRUE}, + [TIME_OF_DAY_TWILIGHT] = {.coeff = 4, .blendColor = 0xA8B0E0, .isTint = TRUE}, + [TIME_OF_DAY_DAY] = {.coeff = 0, .blendColor = 0}, }; u8 UpdateTimeOfDay(void) { @@ -1523,8 +1523,12 @@ u8 UpdateTimeOfDay(void) { } bool8 MapHasNaturalLight(u8 mapType) { // Whether a map type is naturally lit/outside - return mapType == MAP_TYPE_TOWN || mapType == MAP_TYPE_CITY || mapType == MAP_TYPE_ROUTE - || mapType == MAP_TYPE_OCEAN_ROUTE; + return ( + mapType == MAP_TYPE_TOWN + || mapType == MAP_TYPE_CITY + || mapType == MAP_TYPE_ROUTE + || mapType == MAP_TYPE_OCEAN_ROUTE + ); } // Update & mix day / night bg palettes (into unfaded) @@ -1553,38 +1557,42 @@ void UpdateAltBgPalettes(u16 palettes) { } void UpdatePalettesWithTime(u32 palettes) { - if (MapHasNaturalLight(gMapHeader.mapType)) { - u32 i; - u32 mask = 1 << 16; - if (palettes >= 0x10000) - for (i = 0; i < 16; i++, mask <<= 1) - if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(i))) - palettes &= ~(mask); + if (MapHasNaturalLight(gMapHeader.mapType)) { + u32 i; + u32 mask = 1 << 16; + if (palettes >= (1 << 16)) + for (i = 0; i < 16; i++, mask <<= 1) + if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(i))) + palettes &= ~(mask); palettes &= PALETTES_MAP | PALETTES_OBJECTS; // Don't blend UI pals if (!palettes) - return; - TimeMixPalettes(palettes, - gPlttBufferUnfaded, - gPlttBufferFaded, - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], - currentTimeBlend.weight); - } + return; + TimeMixPalettes( + palettes, + gPlttBufferUnfaded, + gPlttBufferFaded, + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], + currentTimeBlend.weight + ); + } } u8 UpdateSpritePaletteWithTime(u8 paletteNum) { - if (MapHasNaturalLight(gMapHeader.mapType)) { - if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(paletteNum))) - return paletteNum; - TimeMixPalettes(1, - &gPlttBufferUnfaded[OBJ_PLTT_ID(paletteNum)], - &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], - currentTimeBlend.weight); - } - return paletteNum; + if (MapHasNaturalLight(gMapHeader.mapType)) { + if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(paletteNum))) + return paletteNum; + TimeMixPalettes( + 1, + &gPlttBufferUnfaded[OBJ_PLTT_ID(paletteNum)], + &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], + currentTimeBlend.weight + ); + } + return paletteNum; } static void OverworldBasic(void) @@ -1600,19 +1608,20 @@ static void OverworldBasic(void) DoScheduledBgTilemapCopiesToVram(); // Every minute if no palette fade is active, update TOD blending as needed if (!gPaletteFade.active && ++gTimeUpdateCounter >= 3600) { - struct TimeBlendSettings cachedBlend = { - .time0 = currentTimeBlend.time0, - .time1 = currentTimeBlend.time1, - .weight = currentTimeBlend.weight, - }; - gTimeUpdateCounter = 0; - UpdateTimeOfDay(); - if (cachedBlend.time0 != currentTimeBlend.time0 - || cachedBlend.time1 != currentTimeBlend.time1 - || cachedBlend.weight != currentTimeBlend.weight) { + struct TimeBlendSettings cachedBlend = { + .time0 = currentTimeBlend.time0, + .time1 = currentTimeBlend.time1, + .weight = currentTimeBlend.weight, + }; + gTimeUpdateCounter = 0; + UpdateTimeOfDay(); + if (cachedBlend.time0 != currentTimeBlend.time0 + || cachedBlend.time1 != currentTimeBlend.time1 + || cachedBlend.weight != currentTimeBlend.weight) + { UpdateAltBgPalettes(PALETTES_BG); UpdatePalettesWithTime(PALETTES_ALL); - } + } } } diff --git a/src/palette.c b/src/palette.c index a8be1867a7..ddc0688209 100644 --- a/src/palette.c +++ b/src/palette.c @@ -525,15 +525,15 @@ static u8 UpdateTimeOfDayPaletteFade(void) // palettes that were not blended above must be copied through if ((copyPalettes = ~timePalettes)) { - u16 * src1 = src; - u16 * dst1 = dst; - while (copyPalettes) { - if (copyPalettes & 1) - CpuFastCopy(src1, dst1, 32); - copyPalettes >>= 1; - src1 += 16; - dst1 += 16; - } + u16 * src1 = src; + u16 * dst1 = dst; + while (copyPalettes) { + if (copyPalettes & 1) + CpuFastCopy(src1, dst1, 32); + copyPalettes >>= 1; + src1 += 16; + dst1 += 16; + } } // Then, blend from faded->faded with native BlendPalettes @@ -1330,58 +1330,59 @@ void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 b // Tints from Unfaded to Faded, using a 15-bit GBA color void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor) { - s32 newR, newG, newB, rTone, gTone, bTone; - u16 * src = gPlttBufferUnfaded + palOffset; - u16 * dst = gPlttBufferFaded + palOffset; - u32 defaultBlendColor = DEFAULT_LIGHT_COLOR; - u16 *srcEnd = src + 16; - u16 altBlendIndices = *dst++ = *src++; // color 0 is copied through unchanged - u32 altBlendColor; - - newR = ((blendColor << 27) >> 27) << 3; - newG = ((blendColor << 22) >> 27) << 3; - newB = ((blendColor << 17) >> 27) << 3; - - if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend - // Note that bit 0 of altBlendIndices specifies color 1 - altBlendColor = src[14]; // color 15 - if (altBlendColor >> 15) { // Set alternate blend color - rTone = ((altBlendColor << 27) >> 27) << 3; - gTone = ((altBlendColor << 22) >> 27) << 3; - bTone = ((altBlendColor << 17) >> 27) << 3; - } else { // Set default blend color - rTone = ((defaultBlendColor << 27) >> 27) << 3; - gTone = ((defaultBlendColor << 22) >> 27) << 3; - bTone = ((defaultBlendColor << 17) >> 27) << 3; + s32 newR, newG, newB, rTone, gTone, bTone; + u16 * src = gPlttBufferUnfaded + palOffset; + u16 * dst = gPlttBufferFaded + palOffset; + u32 defaultBlendColor = DEFAULT_LIGHT_COLOR; + u16 *srcEnd = src + 16; + u16 altBlendIndices = *dst++ = *src++; // color 0 is copied through unchanged + u32 altBlendColor; + + newR = ((blendColor << 27) >> 27) << 3; + newG = ((blendColor << 22) >> 27) << 3; + newB = ((blendColor << 17) >> 27) << 3; + + if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend + // Note that bit 0 of altBlendIndices specifies color 1 + altBlendColor = src[14]; // color 15 + if (altBlendColor >> 15) { // Set alternate blend color + rTone = ((altBlendColor << 27) >> 27) << 3; + gTone = ((altBlendColor << 22) >> 27) << 3; + bTone = ((altBlendColor << 17) >> 27) << 3; + } else { // Set default blend color + rTone = ((defaultBlendColor << 27) >> 27) << 3; + gTone = ((defaultBlendColor << 22) >> 27) << 3; + bTone = ((defaultBlendColor << 17) >> 27) << 3; + } + } else { + altBlendIndices = 0; } - } else { - altBlendIndices = 0; - } - while (src != srcEnd) { - u32 srcColor = *src; - s32 r = (srcColor << 27) >> 27; - s32 g = (srcColor << 22) >> 27; - s32 b = (srcColor << 17) >> 27; - if (altBlendIndices & 1) { - r = (u16)((rTone * r)) >> 8; - g = (u16)((gTone * g)) >> 8; - b = (u16)((bTone * b)) >> 8; - } else { // Use provided blend color - r = (u16)((newR * r)) >> 8; - g = (u16)((newG * g)) >> 8; - b = (u16)((newB * b)) >> 8; + while (src != srcEnd) { + u32 srcColor = *src; + s32 r = (srcColor << 27) >> 27; + s32 g = (srcColor << 22) >> 27; + s32 b = (srcColor << 17) >> 27; + + if (altBlendIndices & 1) { + r = (u16)((rTone * r)) >> 8; + g = (u16)((gTone * g)) >> 8; + b = (u16)((bTone * b)) >> 8; + } else { // Use provided blend color + r = (u16)((newR * r)) >> 8; + g = (u16)((newG * g)) >> 8; + b = (u16)((newB * b)) >> 8; + } + if (r > 31) + r = 31; + if (g > 31) + g = 31; + if (b > 31) + b = 31; + src++; + *dst++ = RGB2(r, g, b); + altBlendIndices >>= 1; } - if (r > 31) - r = 31; - if (g > 31) - g = 31; - if (b > 31) - b = 31; - src++; - *dst++ = RGB2(r, g, b); - altBlendIndices >>= 1; - } } #define tCoeff data[0] diff --git a/src/palette_util.c b/src/palette_util.c index bcf8c34819..54549ffcce 100755 --- a/src/palette_util.c +++ b/src/palette_util.c @@ -385,8 +385,7 @@ void UpdatePulseBlend(struct PulseBlend *pulseBlend) if (--pulseBlendPalette->delayCounter == 0xFF) { pulseBlendPalette->delayCounter = pulseBlendPalette->pulseBlendSettings.delay; - // TODO: Optimize pulse blending - CpuFastCopy(gPlttBufferUnfaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, gPlttBufferFaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, 32); + CpuFastCopy(gPlttBufferUnfaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, gPlttBufferFaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, PLTT_SIZE_4BPP); UpdatePalettesWithTime(1 << (pulseBlendPalette->pulseBlendSettings.paletteOffset >> 4)); // pulseBlendSettings has a numColors field, but it is only ever set to 16 (for mirage tower) // So, it's ok to use the fine blending here which blends the entire palette From ca755420edfa15ce273b2aab471464850953eb2c Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Mon, 12 Aug 2024 23:06:30 -0400 Subject: [PATCH 094/145] meta: ignored refactoring change --- .git-blame-ignore-revs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 54f7faa471..09a56f5261 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -1,4 +1,7 @@ 725252905baf28dbb9298dd5fa0daaf0e804a455 afbb88d77ada8a636a318ec32b61b4ea849d85ab f861504cfc50941768286c0703d24ab0aaceb88e -ebbcb7d025cff716eec5008b5dd2b7d55aa8c3f3 \ No newline at end of file +ebbcb7d025cff716eec5008b5dd2b7d55aa8c3f3 +# 24759293+aarant@users.noreply.github.com +# meta: cleaned up spacing of lighting code +0ae5cb1e39f64955107707bbacd1d6dfc117fc01 From fc3a700357cfca61a452fbf21ba7a04d3ceddd14 Mon Sep 17 00:00:00 2001 From: Greenphx9 <55181320+Greenphx9@users.noreply.github.com> Date: Sun, 25 Aug 2024 18:01:23 +1000 Subject: [PATCH 095/145] Fix up some auto merge stuff --- include/global.h | 2 ++ include/overworld.h | 4 ++++ src/decompress.c | 4 ++-- src/field_weather_effect.c | 1 - 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/include/global.h b/include/global.h index 88892bd60e..c09f8af779 100644 --- a/include/global.h +++ b/include/global.h @@ -536,6 +536,8 @@ struct SaveBlock2 extern struct SaveBlock2 *gSaveBlock2Ptr; +extern u8 UpdateSpritePaletteWithTime(u8); + struct SecretBaseParty { u32 personality[PARTY_SIZE]; diff --git a/include/overworld.h b/include/overworld.h index 0cc0ab5dce..06b8cf1ee8 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -25,6 +25,10 @@ #define MOVEMENT_MODE_SCRIPTED 2 #define SKIP_OBJECT_EVENT_LOAD 1 +#define TIME_OF_DAY_NIGHT 0 +#define TIME_OF_DAY_TWILIGHT 1 +#define TIME_OF_DAY_DAY 2 +#define TIME_OF_DAY_MAX TIME_OF_DAY_DAY struct InitialPlayerAvatarState { diff --git a/src/decompress.c b/src/decompress.c index 30337f5a8d..d9ad044ebb 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -60,7 +60,7 @@ u16 LoadCompressedSpriteSheetByTemplate(const struct SpriteTemplate *template, s // Check for LZ77 header and read uncompressed size, or fallback if not compressed (zero size) if ((size = IsLZ77Data(template->images->data, TILE_SIZE_4BPP, sizeof(gDecompressionBuffer))) == 0) - return LoadSpriteSheetByTemplate(template, 0, offset); + return LoadSpriteSheetByTemplateWithOffset(template, 0, offset); LZ77UnCompWram(template->images->data, gDecompressionBuffer); myImage.data = gDecompressionBuffer; @@ -68,7 +68,7 @@ u16 LoadCompressedSpriteSheetByTemplate(const struct SpriteTemplate *template, s myTemplate.images = &myImage; myTemplate.tileTag = template->tileTag; - return LoadSpriteSheetByTemplate(&myTemplate, 0, offset); + return LoadSpriteSheetByTemplateWithOffset(&myTemplate, 0, offset); } void LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer) diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index efd80a7178..9810cdfcaa 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -1410,7 +1410,6 @@ void FogHorizontal_Main(void) case 0: CreateFogHorizontalSprites(); if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) { - u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); Weather_SetTargetBlendCoeffs(12, 8, 3); UpdateShadowColor(0x3DEF); // Gray } else From d80bf06daabdacd6911471983d52306d46ae0147 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 29 Aug 2024 20:38:22 -0400 Subject: [PATCH 096/145] Removed unused fields --- src/overworld.c | 2 -- src/palette.c | 1 - 2 files changed, 3 deletions(-) diff --git a/src/overworld.c b/src/overworld.c index 371c1797cc..10ba8f7368 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -827,8 +827,6 @@ bool8 SetDiveWarpDive(u16 x, u16 y) void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum) { - s32 paletteIndex; - SetWarpDestination(mapGroup, mapNum, WARP_ID_NONE, -1, -1); // Dont transition map music between BF Outside West/East diff --git a/src/palette.c b/src/palette.c index 867b96ddfb..ee03b5d6a9 100644 --- a/src/palette.c +++ b/src/palette.c @@ -226,7 +226,6 @@ void ResetPaletteFadeControl(void) // Like normal palette fade, but respects sprite/tile palettes immune to time of day fading static u8 UpdateTimeOfDayPaletteFade(void) { - u8 paletteNum; u16 paletteOffset; u16 selectedPalettes; u16 timePalettes = 0; // palettes passed to the time-blender From aa6d540b7520b1a2c0489a9fb263412f1798d019 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 30 Aug 2024 12:17:31 -0400 Subject: [PATCH 097/145] Code style adjustments --- asm/macros/event.inc | 4 +- gflib/sprite.c | 8 +- include/global.h | 2 +- src/battle_transition.c | 5 +- src/contest_effect.c | 37 ++++---- src/event_object_movement.c | 78 ++++++++++------ src/field_effect.c | 15 ++- src/field_effect_helpers.c | 15 ++- src/field_weather.c | 50 ++++++---- src/field_weather_effect.c | 14 ++- src/fieldmap.c | 14 ++- src/heal_location.c | 8 +- src/overworld.c | 84 ++++++++++------- src/palette.c | 171 +++++++++++++++++++++++++---------- src/pokemon_summary_screen.c | 6 +- src/scrcmd.c | 3 +- src/tv.c | 3 +- 17 files changed, 339 insertions(+), 178 deletions(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 559573f544..17420538cd 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -1800,11 +1800,11 @@ @ Equivalent to fadescreen but copies gPlttBufferUnfaded to gDecompressionBuffer on the fade out @ and the reverse on the fade in, in effect saving gPlttBufferUnfaded to restore it. - @ If nowait set, does not wait for the fade to complete + @ If nowait set, does not wait for the fade to complete .macro fadescreenswapbuffers mode:req, nowait=0 .byte 0xdc .byte \mode - .byte \nowait + .byte \nowait .endm @ Buffers the specified trainer's class name to the given string var. diff --git a/gflib/sprite.c b/gflib/sprite.c index 7e0d61a7f0..67192aabab 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -1478,7 +1478,8 @@ u16 LoadSpriteSheetByTemplateWithOffset(const struct SpriteTemplate *template, u return LoadSpriteSheetWithOffset(&sheet, offset); } // Like LoadSpriteSheet, but checks if already, and uses template image frames -u16 LoadSpriteSheetByTemplate(const struct SpriteTemplate *template, u8 frame) { +u16 LoadSpriteSheetByTemplate(const struct SpriteTemplate *template, u8 frame) +{ u16 tileStart; struct SpriteSheet tempSheet; // error if template is null or tile tag or images not set @@ -1608,7 +1609,8 @@ void LoadSpritePalettes(const struct SpritePalette *palettes) break; } -u8 LoadSpritePaletteInSlot(const struct SpritePalette *palette, u8 paletteNum) { +u8 LoadSpritePaletteInSlot(const struct SpritePalette *palette, u8 paletteNum) +{ paletteNum = min(15, paletteNum); sSpritePaletteTags[paletteNum] = palette->tag; DoLoadSpritePalette(palette->data, paletteNum * 16); @@ -1617,7 +1619,7 @@ u8 LoadSpritePaletteInSlot(const struct SpritePalette *palette, u8 paletteNum) { void DoLoadSpritePalette(const u16 *src, u16 paletteOffset) { - LoadPaletteFast(src, paletteOffset + OBJ_PLTT_OFFSET, PLTT_SIZE_4BPP); + LoadPaletteFast(src, OBJ_PLTT_OFFSET + paletteOffset, PLTT_SIZE_4BPP); } u8 AllocSpritePalette(u16 tag) diff --git a/include/global.h b/include/global.h index 634ce6e5ec..ada0bbb2f3 100644 --- a/include/global.h +++ b/include/global.h @@ -954,7 +954,7 @@ struct MysteryGiftSave struct WonderCardMetadata cardMetadata; u16 questionnaireWords[NUM_QUESTIONNAIRE_WORDS]; struct WonderNewsMetadata newsMetadata; - u32 trainerIds[2][5]; // Saved ids for 10 trainers, 5 each for battles and trades + u32 trainerIds[2][5]; // Saved ids for 10 trainers, 5 each for battles and trades }; // 0x36C 0x3598 // For external event data storage. The majority of these may have never been used. diff --git a/src/battle_transition.c b/src/battle_transition.c index d2177070f2..6fc7d1ea47 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -3952,8 +3952,9 @@ static bool8 TransitionIntro_FadeFromGray(struct Task *task) BlendPalettes(PALETTES_ALL, task->tBlend, RGB(11, 11, 11)); // Restore BLDCNT SetGpuReg(REG_OFFSET_BLDCNT, task->tBldCntSaved); - if (paletteNum < 16) { - u16 index = (paletteNum+16)*16+9; // SHADOW_COLOR_INDEX + if (paletteNum < 16) + { + u16 index = ((paletteNum + 16) * 16) + 9; // SHADOW_COLOR_INDEX gPlttBufferFaded[index] = task->tShadowColor; } } diff --git a/src/contest_effect.c b/src/contest_effect.c index aa22f1d13d..e6735a8698 100644 --- a/src/contest_effect.c +++ b/src/contest_effect.c @@ -132,7 +132,7 @@ static void ContestEffect_UserLessEasilyStartled(void) SetContestantEffectStringID(eContestAppealResults.contestant,CONTEST_STRING_STOPPED_CARING); } -// Slightly startles the POKéMON in front. +// Slightly startles the POK�MON in front. static void ContestEffect_StartleFrontMon(void) { u8 idx = 0; @@ -180,7 +180,7 @@ static void ContestEffect_StartlePrevMons(void) SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Startles the POKéMON that appealed before the user. +// Startles the POK�MON that appealed before the user. static void ContestEffect_StartlePrevMon2(void) { u8 rval = Random() % 10; @@ -197,7 +197,7 @@ static void ContestEffect_StartlePrevMon2(void) ContestEffect_StartleFrontMon(); } -// Startles all POKéMON that appealed before the user. +// Startles all POK�MON that appealed before the user. static void ContestEffect_StartlePrevMons2(void) { u8 numStartled = 0; @@ -273,7 +273,7 @@ static void ContestEffect_ShiftJudgeAttention(void) } } -// Startles the POKéMON that has the JUDGE's attention. +// Startles the POK�MON that has the JUDGE's attention. static void ContestEffect_StartleMonWithJudgesAttention(void) { u8 numStartled = 0; @@ -311,7 +311,7 @@ static void ContestEffect_JamsOthersButMissOneTurn(void) SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Startles POKéMON that made a same-type appeal. +// Startles POK�MON that made a same-type appeal. static void ContestEffect_StartleMonsSameTypeAppeal(void) { u16 move = eContestantStatus[eContestAppealResults.contestant].currMove; @@ -319,42 +319,42 @@ static void ContestEffect_StartleMonsSameTypeAppeal(void) SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made COOL appeals. +// Badly startles POK�MON that made COOL appeals. static void ContestEffect_StartleMonsCoolAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_COOL); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made BEAUTY appeals. +// Badly startles POK�MON that made BEAUTY appeals. static void ContestEffect_StartleMonsBeautyAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_BEAUTY); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made CUTE appeals. +// Badly startles POK�MON that made CUTE appeals. static void ContestEffect_StartleMonsCuteAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_CUTE); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made SMART appeals. +// Badly startles POK�MON that made SMART appeals. static void ContestEffect_StartleMonsSmartAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_SMART); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made TOUGH appeals. +// Badly startles POK�MON that made TOUGH appeals. static void ContestEffect_StartleMonsToughAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_TOUGH); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Makes one POKéMON after the user nervous. +// Makes one POK�MON after the user nervous. static void ContestEffect_MakeFollowingMonNervous(void) { bool32 hitAny = FALSE; @@ -386,7 +386,7 @@ static void ContestEffect_MakeFollowingMonNervous(void) SetContestantEffectStringID2(eContestAppealResults.contestant, CONTEST_STRING_MESSED_UP2); } -// Makes all POKéMON after the user nervous. +// Makes all POK�MON after the user nervous. static void ContestEffect_MakeFollowingMonsNervous(void) { u8 numUnnerved = 0; @@ -493,7 +493,7 @@ static void ContestEffect_WorsenConditionOfPrevMons(void) SetContestantEffectStringID2(eContestAppealResults.contestant, CONTEST_STRING_IGNORED); } -// Badly startles POKéMON in good condition. +// Badly startles POK�MON in good condition. static void ContestEffect_BadlyStartlesMonsInGoodCondition(void) { u8 numHit = 0; @@ -619,15 +619,18 @@ static void ContestEffect_QualityDependsOnTiming(void) { appeal = 10; SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_APPEAL_NOT_VERY_WELL); - } else if (rval < 6) + } + else if (rval < 6) { appeal = 20; SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_APPEAL_SLIGHTLY_WELL2); - } else if (rval < 8) + } + else if (rval < 8) { appeal = 40; SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_APPEAL_PRETTY_WELL2); - } else if (rval < 9) + } + else if (rval < 9) { appeal = 60; SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_APPEAL_VERY_WELL); @@ -892,7 +895,7 @@ static void ContestEffect_ExciteAudienceInAnyContest(void) } } -// Badly startles all POKéMON that made good appeals. +// Badly startles all POK�MON that made good appeals. static void ContestEffect_BadlyStartleMonsWithGoodAppeals(void) { int i; diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 075664a31e..42f68473a1 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1534,11 +1534,13 @@ u16 LoadSheetGraphicsInfo(const struct ObjectEventGraphicsInfo *info, u16 uuid, // Load, then free, in order to avoid displaying garbage data // before sprite's `sheetTileStart` is repointed tileStart = LoadCompressedSpriteSheetByTemplate(&template, TILE_SIZE_4BPP << sheetSpan); - if (oldTiles) { + if (oldTiles) + { FieldEffectFreeTilesIfUnused(oldTiles); // We weren't able to load the sheet; // retry (after having freed), and set sprite to invisible until done - if (tileStart <= 0) { + if (tileStart <= 0) + { if (sprite) sprite->invisible = TRUE; tileStart = LoadCompressedSpriteSheetByTemplate(&template, TILE_SIZE_4BPP << sheetSpan); @@ -1764,7 +1766,8 @@ static u8 LoadDynamicFollowerPaletteFromGraphicsId(u16 graphicsId, bool8 shiny, } // Like LoadObjectEventPalette, but overwrites the palette tag that is loaded -static u8 LoadObjectEventPaletteWithTag(u16 paletteTag, u16 overTag) { +static u8 LoadObjectEventPaletteWithTag(u16 paletteTag, u16 overTag) +{ u32 i = FindObjectEventPaletteIndexByTag(paletteTag); struct SpritePalette spritePalette; if (i == 0xFF) @@ -1795,17 +1798,17 @@ u8 CreateObjectGraphicsSpriteWithTag(u16 graphicsId, void (*callback)(struct Spr { u32 paletteNum = LoadDynamicFollowerPaletteFromGraphicsId(graphicsId, isShiny, spriteTemplate); spriteTemplate->paletteTag = GetSpritePaletteTagByPaletteNum(paletteNum); - } - else if (spriteTemplate->paletteTag != TAG_NONE) + } + else if (spriteTemplate->paletteTag != TAG_NONE) { if (paletteTag == TAG_NONE) LoadObjectEventPalette(spriteTemplate->paletteTag); - else + else { LoadObjectEventPaletteWithTag(spriteTemplate->paletteTag, paletteTag); spriteTemplate->paletteTag = paletteTag; } - } + } if (OW_GFX_COMPRESS) { @@ -1829,7 +1832,8 @@ u8 CreateObjectGraphicsSpriteWithTag(u16 graphicsId, void (*callback)(struct Spr return spriteId; } -u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) { +u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) +{ return CreateObjectGraphicsSpriteWithTag(graphicsId, callback, x, y, subpriority, TAG_NONE); } @@ -1977,7 +1981,7 @@ static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny) if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog UpdateSpritePaletteWithWeather(paletteNum, FALSE); - + return paletteNum; } @@ -2479,7 +2483,8 @@ void GetFollowerAction(struct ScriptContext *ctx) // Essentially a big switch fo } // Sprite callback for light sprites -void UpdateLightSprite(struct Sprite *sprite) { +void UpdateLightSprite(struct Sprite *sprite) +{ s16 left = gSaveBlock1Ptr->pos.x - 2; s16 right = gSaveBlock1Ptr->pos.x + 17; s16 top = gSaveBlock1Ptr->pos.y; @@ -2489,7 +2494,8 @@ void UpdateLightSprite(struct Sprite *sprite) { u16 sheetTileStart; u32 paletteNum; // Ripped from RemoveObjectEventIfOutsideView - if (!(x >= left && x <= right && y >= top && y <= bottom)) { + if (!(x >= left && x <= right && y >= top && y <= bottom)) + { sheetTileStart = sprite->sheetTileStart; paletteNum = sprite->oam.paletteNum; DestroySprite(sprite); @@ -2499,22 +2505,29 @@ void UpdateLightSprite(struct Sprite *sprite) { return; } - if (gTimeOfDay != TIME_OF_DAY_NIGHT) { + if (gTimeOfDay != TIME_OF_DAY_NIGHT) + { sprite->invisible = TRUE; return; } - switch (sprite->data[5]) { // lightType + switch (sprite->data[5]) // lightType + { case 0: - if (gPaletteFade.active) { // if palette fade is active, don't flicker since the timer won't be updated + if (gPaletteFade.active) // if palette fade is active, don't flicker since the timer won't be updated + { Weather_SetBlendCoeffs(7, 12); sprite->invisible = FALSE; - } else if (gPlayerAvatar.tileTransitionState) { + } + else if (gPlayerAvatar.tileTransitionState) + { Weather_SetBlendCoeffs(7, 12); // As long as the second coefficient stays 12, shadows will not change sprite->invisible = FALSE; if (GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum) == OBJ_EVENT_PAL_TAG_LIGHT_2) LoadSpritePaletteInSlot(&sObjectEventSpritePalettes[FindObjectEventPaletteIndexByTag(OBJ_EVENT_PAL_TAG_LIGHT)], sprite->oam.paletteNum); - } else if ((sprite->invisible = gTimeUpdateCounter & 1)) { + } + else if ((sprite->invisible = gTimeUpdateCounter & 1)) + { Weather_SetBlendCoeffs(12, 12); if (GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum) == OBJ_EVENT_PAL_TAG_LIGHT) LoadSpritePaletteInSlot(&sObjectEventSpritePalettes[FindObjectEventPaletteIndexByTag(OBJ_EVENT_PAL_TAG_LIGHT_2)], sprite->oam.paletteNum); @@ -2528,11 +2541,13 @@ void UpdateLightSprite(struct Sprite *sprite) { } // Spawn a light at a map coordinate -static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) { +static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) +{ struct Sprite *sprite; const struct SpriteTemplate *template; u8 i; - for (i = 0; i < MAX_SPRITES; i++) { + for (i = 0; i < MAX_SPRITES; i++) + { sprite = &gSprites[i]; if (sprite->inUse && sprite->callback == UpdateLightSprite && sprite->data[6] == x && sprite->data[7] == y) return; @@ -2552,7 +2567,8 @@ static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) { sprite->affineAnims = gDummySpriteAffineAnimTable; sprite->affineAnimBeginning = TRUE; sprite->coordOffsetEnabled = TRUE; - switch (lightType) { + switch (lightType) + { case 0: // Rustboro lanterns sprite->centerToCornerVecX = -(32 >> 1); sprite->centerToCornerVecY = -(32 >> 1); @@ -2571,7 +2587,8 @@ static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) { } } -void TrySpawnLightSprites(s16 camX, s16 camY) { +void TrySpawnLightSprites(s16 camX, s16 camY) +{ u8 i; u8 objectCount; s16 left = gSaveBlock1Ptr->pos.x - 2; @@ -2588,7 +2605,8 @@ void TrySpawnLightSprites(s16 camX, s16 camY) { else objectCount = gMapHeader.events->objectEventCount; - for (i = 0; i < objectCount; i++) { + for (i = 0; i < objectCount; i++) + { struct ObjectEventTemplate *template = &gSaveBlock1Ptr->objectEventTemplates[i]; s16 npcX = template->x + MAP_OFFSET; s16 npcY = template->y + MAP_OFFSET; @@ -2623,10 +2641,11 @@ void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) s16 npcX = template->x + MAP_OFFSET; s16 npcY = template->y + MAP_OFFSET; - if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX && !FlagGet(template->flagId)) { - if (template->graphicsId == OBJ_EVENT_GFX_LIGHT_SPRITE) { // light sprite instead - SpawnLightSprite(npcX, npcY, cameraX, cameraY, template->trainerRange_berryTreeId); - } else + if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX && !FlagGet(template->flagId)) + { + if (template->graphicsId == OBJ_EVENT_GFX_LIGHT_SPRITE) + SpawnLightSprite(npcX, npcY, cameraX, cameraY, template->trainerRange_berryTreeId); // light sprite instead + else TrySpawnObjectEventTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); } } @@ -2776,10 +2795,13 @@ static u8 UpdateSpritePalette(const struct SpritePalette *spritePalette, struct sprite->inUse = FALSE; FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); sprite->inUse = TRUE; - if (IndexOfSpritePaletteTag(spritePalette->tag) == 0xFF) { + if (IndexOfSpritePaletteTag(spritePalette->tag) == 0xFF) + { sprite->oam.paletteNum = LoadSpritePalette(spritePalette); UpdateSpritePaletteWithWeather(sprite->oam.paletteNum, FALSE); - } else { + } + else + { sprite->oam.paletteNum = LoadSpritePalette(spritePalette); } @@ -9795,7 +9817,7 @@ static void (*const sGroundEffectFuncs[])(struct ObjectEvent *objEvent, struct S GroundEffect_Seaweed // GROUND_EFFECT_FLAG_SEAWEED }; -static void GroundEffect_Shadow(struct ObjectEvent *objEvent, struct Sprite *sprite) +static void GroundEffect_Shadow(struct ObjectEvent *objEvent, struct Sprite *sprite) { SetUpShadow(objEvent, sprite); } diff --git a/src/field_effect.c b/src/field_effect.c index ed5286218f..9c85771397 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1301,7 +1301,8 @@ static void CreateHofMonitorSprite(s16 taskId, s16 x, s16 y, bool8 isSmallMonito { spriteId = CreateSpriteAtEnd(&sSpriteTemplate_HofMonitorBig, x, y, 0); SetSubspriteTables(&gSprites[spriteId], &sSubspriteTable_HofMonitorBig); - } else + } + else { spriteId = CreateSpriteAtEnd(&sSpriteTemplate_HofMonitorSmall, x, y, 0); } @@ -2027,7 +2028,8 @@ static bool8 LavaridgeGymB1FWarpEffect_Rise(struct Task *task, struct ObjectEven { task->data[1] <<= 1; } - } else if (!(task->data[2] & 4) && (task->data[1] > 0)) + } + else if (!(task->data[2] & 4) && (task->data[1] > 0)) { task->data[1] >>= 1; } @@ -2041,7 +2043,8 @@ static bool8 LavaridgeGymB1FWarpEffect_Rise(struct Task *task, struct ObjectEven { task->data[3]++; } - } else + } + else { task->data[4] = 1; } @@ -2196,7 +2199,8 @@ static bool8 LavaridgeGym1FWarpEffect_AshPuff(struct Task *task, struct ObjectEv gFieldEffectArguments[3] = sprite->oam.priority; task->data[1] = FieldEffectStart(FLDEFF_ASH_PUFF); task->data[0]++; - } else + } + else { task->data[1]++; ObjectEventSetHeldMovement(objectEvent, GetWalkInPlaceFasterMovementAction(objectEvent->facingDirection)); @@ -2527,7 +2531,8 @@ static void TeleportWarpInFieldEffect_SpinEnter(struct Task *task) objectEvent->triggerGroundEffectsOnMove = TRUE; sprite->subspriteMode = task->data[14]; } - } else + } + else { sprite->oam.priority = 1; if (sprite->subspriteMode != SUBSPRITES_OFF) diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index df676bb540..cd23ea5bac 100644 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -112,12 +112,14 @@ static void LoadObjectReflectionPalette(struct ObjectEvent *objectEvent, struct } // Apply a blue tint effect to a palette -static void ApplyPondFilter(u8 paletteNum, u16 *dest) { +static void ApplyPondFilter(u8 paletteNum, u16 *dest) +{ u32 i; s32 r, g, b; u16 *src = gPlttBufferUnfaded + OBJ_PLTT_ID(paletteNum); *dest++ = *src++; // copy transparency - for (i = 0; i < 16 - 1; i++) { + for (i = 0; i < 16 - 1; i++) + { u32 color = *src++; r = (color << 27) >> 27; g = (color << 22) >> 27; @@ -130,12 +132,14 @@ static void ApplyPondFilter(u8 paletteNum, u16 *dest) { } // Apply a ice tint effect to a palette -static void ApplyIceFilter(u8 paletteNum, u16 *dest) { +static void ApplyIceFilter(u8 paletteNum, u16 *dest) +{ u32 i; s32 r, g, b; u16 *src = gPlttBufferUnfaded + OBJ_PLTT_ID(paletteNum); *dest++ = *src++; // copy transparency - for (i = 0; i < 16 - 1; i++) { + for (i = 0; i < 16 - 1; i++) + { u32 color = *src++; r = (color << 27) >> 27; g = (color << 22) >> 27; @@ -332,7 +336,8 @@ u32 FldEff_Shadow(void) const struct ObjectEventGraphicsInfo *graphicsInfo; u8 spriteId; s32 i; - for (i = MAX_SPRITES - 1; i > -1; i--) { // Search backwards, because of CreateSpriteAtEnd + for (i = MAX_SPRITES - 1; i > -1; i--) // Search backwards, because of CreateSpriteAtEnd + { // Return early if a shadow sprite already exists if (gSprites[i].data[0] == gFieldEffectArguments[0] && gSprites[i].callback == UpdateShadowFieldEffect) return 0; diff --git a/src/field_weather.c b/src/field_weather.c index 73e83bcc98..b7a640642f 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -551,11 +551,16 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) } else { - if (MapHasNaturalLight(gMapHeader.mapType)) { // Time-blend + if (MapHasNaturalLight(gMapHeader.mapType)) + { + // Time-blend u32 palettes = ((1 << numPalettes) - 1) << startPalIndex; UpdateAltBgPalettes(palettes & PALETTES_BG); UpdatePalettesWithTime(palettes); - } else { // copy + } + else + { + // copy CpuFastCopy(&gPlttBufferUnfaded[PLTT_ID(startPalIndex)], &gPlttBufferFaded[PLTT_ID(startPalIndex)], numPalettes * PLTT_SIZE_4BPP); } } @@ -685,7 +690,8 @@ static void ApplyFogBlend(u8 blendCoeff, u32 blendColor) BlendPalettesFine(PALETTES_MAP, gPlttBufferFaded, gPlttBufferFaded, blendCoeff, blendColor); // Do fog blending on marked sprite palettes - for (curPalIndex = 16; curPalIndex < 32; curPalIndex++) { + for (curPalIndex = 16; curPalIndex < 32; curPalIndex++) + { if (LightenSpritePaletteInFog(curPalIndex)) BlendPalettesFine(1, gPlttBufferFaded + PLTT_ID(curPalIndex), gPlttBufferFaded + PLTT_ID(curPalIndex), fogCoeff, RGB(28, 31, 28)); } @@ -798,17 +804,20 @@ void FadeScreen(u8 mode, s8 delay) gWeatherPtr->fadeDestColor = fadeColor; UpdateTimeOfDay(); if (useWeatherPal) - gWeatherPtr->fadeScreenCounter = 0; // Triggers gamma-shift-based fade-in - else { - if (MapHasNaturalLight(gMapHeader.mapType)) { + { + gWeatherPtr->fadeScreenCounter = 0; // Triggers gamma-shift-based fade-in + } + else if (MapHasNaturalLight(gMapHeader.mapType)) + { UpdateAltBgPalettes(PALETTES_BG); BeginTimeOfDayPaletteFade(PALETTES_ALL, delay, 16, 0, - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], - currentTimeBlend.weight, fadeColor); - } else { + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], + currentTimeBlend.weight, fadeColor); + } + else + { BeginNormalPaletteFade(PALETTES_ALL, delay, 16, 0, fadeColor); - } } gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN; @@ -848,13 +857,18 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog) // WEATHER_PAL_STATE_CHANGING_WEATHER // WEATHER_PAL_STATE_CHANGING_IDLE default: - if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) { + if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) + { if (gWeatherPtr->colorMapIndex) ApplyColorMap(paletteIndex, 1, gWeatherPtr->colorMapIndex); else UpdateSpritePaletteWithTime(spritePaletteIndex); - } else { // In horizontal fog, only specific palettes should be fog-blended - if (allowFog) { + } + else + { + // In horizontal fog, only specific palettes should be fog-blended + if (allowFog) + { i = min((gTimeOfDay + 1) * 4, 12); // fog coeff, highest in day and lowest at night paletteIndex = PLTT_ID(paletteIndex); // First blend with time @@ -862,7 +876,10 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog) UpdateSpritePaletteWithTime(spritePaletteIndex); // Then blend faded->faded with fog coeff BlendPalettesFine(1, gPlttBufferFaded + paletteIndex, gPlttBufferFaded + paletteIndex, i, RGB(28, 31, 28)); - } else { // Otherwise, just time-blend the palette + } + else + { + // Otherwise, just time-blend the palette UpdateSpritePaletteWithTime(spritePaletteIndex); } } @@ -884,7 +901,8 @@ void ApplyWeatherColorMapToPal(u8 paletteIndex) // now unused / obselete ApplyColorMap(paletteIndex, 1, gWeatherPtr->colorMapIndex); } -void ApplyWeatherColorMapToPals(u8 startPalIndex, u8 numPalettes) { +void ApplyWeatherColorMapToPals(u8 startPalIndex, u8 numPalettes) +{ ApplyColorMap(startPalIndex, numPalettes, gWeatherPtr->colorMapIndex); } diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index 9810cdfcaa..724ad76ae8 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -1357,11 +1357,13 @@ static void DestroyFogHorizontalSprites(void); #define SHADOW_COLOR_INDEX 9 // Updates just the color of shadows to match special weather blending -u8 UpdateShadowColor(u16 color) { +u8 UpdateShadowColor(u16 color) +{ u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); u16 ALIGNED(4) tempBuffer[16]; u16 blendedColor; - if (paletteNum < 16) { + if (paletteNum < 16) + { u16 index = OBJ_PLTT_ID(paletteNum)+SHADOW_COLOR_INDEX; gPlttBufferUnfaded[index] = gPlttBufferFaded[index] = color; // Copy to temporary buffer, blend, and keep just the shadow color index @@ -1409,11 +1411,15 @@ void FogHorizontal_Main(void) { case 0: CreateFogHorizontalSprites(); - if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) { + if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) + { Weather_SetTargetBlendCoeffs(12, 8, 3); UpdateShadowColor(0x3DEF); // Gray - } else + } + else + { Weather_SetTargetBlendCoeffs(4, 16, 0); + } gWeatherPtr->initStep++; break; case 1: diff --git a/src/fieldmap.c b/src/fieldmap.c index 17e3f2843f..0fa60b964f 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -914,16 +914,20 @@ static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u1 ApplyGlobalTintToPaletteEntries(destOffset, size >> 1); } // convert legacy light palette system to current - if (tileset->lightPalettes) { + if (tileset->lightPalettes) + { u32 i, j, color; - for (i = low; i < high; i++) { - if (tileset->lightPalettes & (1 << (i - low))) { // Mark light colors - for (j = 1, color = gPlttBufferUnfaded[PLTT_ID(i)]; j < 16 && color; j++, color >>= 1) { + for (i = low; i < high; i++) + { + if (tileset->lightPalettes & (1 << (i - low))) // Mark light colors + { + for (j = 1, color = gPlttBufferUnfaded[PLTT_ID(i)]; j < 16 && color; j++, color >>= 1) + { if (color & 1) gPlttBufferFaded[PLTT_ID(i)+j] = gPlttBufferUnfaded[PLTT_ID(i)+j] |= RGB_ALPHA; } if (tileset->customLightColor & (1 << (i - low))) // Copy old custom light color to index 0 - gPlttBufferFaded[PLTT_ID(i)] = gPlttBufferUnfaded[PLTT_ID(i)] = gPlttBufferUnfaded[PLTT_ID(i)+15] | RGB_ALPHA; + gPlttBufferFaded[PLTT_ID(i)] = gPlttBufferUnfaded[PLTT_ID(i)] = gPlttBufferUnfaded[PLTT_ID(i) + 15] | RGB_ALPHA; } } } diff --git a/src/heal_location.c b/src/heal_location.c index 7193ea338e..1743925885 100644 --- a/src/heal_location.c +++ b/src/heal_location.c @@ -34,9 +34,9 @@ u32 GetHealLocationIndexByWarpData(struct WarpData *warp) u32 i; for (i = 0; i < ARRAY_COUNT(sHealLocations); i++) { - if (sHealLocations[i].group == warp->mapGroup - && sHealLocations[i].map == warp->mapNum - && sHealLocations[i].x == warp->x + if (sHealLocations[i].group == warp->mapGroup + && sHealLocations[i].map == warp->mapNum + && sHealLocations[i].x == warp->x && sHealLocations[i].y == warp->y) return i + 1; } @@ -89,7 +89,7 @@ void SetWhiteoutRespawnWarpAndHealerNPC(struct WarpData *warp) u32 healLocationId = GetHealLocationIndexByWarpData(&gSaveBlock1Ptr->lastHealLocation); u32 healNpcLocalId = GetHealNpcLocalId(healLocationId); struct HealLocation pkmCenterHealLocation; - + if (!healNpcLocalId) { *(warp) = gSaveBlock1Ptr->lastHealLocation; diff --git a/src/overworld.c b/src/overworld.c index 10ba8f7368..0a788dcd3f 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1533,43 +1533,57 @@ const struct BlendSettings gTimeOfDayBlend[] = [TIME_OF_DAY_DAY] = {.coeff = 0, .blendColor = 0}, }; -u8 UpdateTimeOfDay(void) { +u8 UpdateTimeOfDay(void) +{ s32 hours, minutes; RtcCalcLocalTime(); hours = gLocalTime.hours; minutes = gLocalTime.minutes; - if (hours < 4) { // night + if (hours < 4) // night + { currentTimeBlend.weight = 256; currentTimeBlend.altWeight = 0; gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; - } else if (hours < 7) { // night->twilight + } + else if (hours < 7) // night->twilight + { currentTimeBlend.time0 = TIME_OF_DAY_NIGHT; currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; currentTimeBlend.weight = 256 - 256 * ((hours - 4) * 60 + minutes) / ((7-4)*60); currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2; gTimeOfDay = TIME_OF_DAY_DAY; - } else if (hours < 10) { // twilight->day + } + else if (hours < 10) // twilight->day + { currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; currentTimeBlend.time1 = TIME_OF_DAY_DAY; currentTimeBlend.weight = 256 - 256 * ((hours - 7) * 60 + minutes) / ((10-7)*60); currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2 + 128; gTimeOfDay = TIME_OF_DAY_DAY; - } else if (hours < 18) { // day + } + else if (hours < 18) // day + { currentTimeBlend.weight = currentTimeBlend.altWeight = 256; gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_DAY; - } else if (hours < 20) { // day->twilight + } + else if (hours < 20) + { currentTimeBlend.time0 = TIME_OF_DAY_DAY; currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; currentTimeBlend.weight = 256 - 256 * ((hours - 18) * 60 + minutes) / ((20-18)*60); currentTimeBlend.altWeight = currentTimeBlend.weight / 2 + 128; gTimeOfDay = TIME_OF_DAY_TWILIGHT; - } else if (hours < 22) { // twilight->night + } + else if (hours < 22) // twilight->night + { currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; currentTimeBlend.weight = 256 - 256 * ((hours - 20) * 60 + minutes) / ((22-20)*60); currentTimeBlend.altWeight = currentTimeBlend.weight / 2; gTimeOfDay = TIME_OF_DAY_NIGHT; - } else { // 22-24, night + } + else // 22-24, night + { currentTimeBlend.weight = 256; currentTimeBlend.altWeight = 0; gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; @@ -1577,17 +1591,19 @@ u8 UpdateTimeOfDay(void) { return gTimeOfDay; } -bool8 MapHasNaturalLight(u8 mapType) { // Whether a map type is naturally lit/outside - return ( - mapType == MAP_TYPE_TOWN - || mapType == MAP_TYPE_CITY - || mapType == MAP_TYPE_ROUTE - || mapType == MAP_TYPE_OCEAN_ROUTE +// Whether a map type is naturally lit/outside +bool8 MapHasNaturalLight(u8 mapType) +{ + return (mapType == MAP_TYPE_TOWN + || mapType == MAP_TYPE_CITY + || mapType == MAP_TYPE_ROUTE + || mapType == MAP_TYPE_OCEAN_ROUTE ); } // Update & mix day / night bg palettes (into unfaded) -void UpdateAltBgPalettes(u16 palettes) { +void UpdateAltBgPalettes(u16 palettes) +{ const struct Tileset *primary = gMapHeader.mapLayout->primaryTileset; const struct Tileset *secondary = gMapHeader.mapLayout->secondaryTileset; u32 i = 1; @@ -1599,8 +1615,10 @@ void UpdateAltBgPalettes(u16 palettes) { palettes >>= 1; // start at palette 1 if (!palettes) return; - while (palettes) { - if (palettes & 1) { + while (palettes) + { + if (palettes & 1) + { if (i < NUM_PALS_IN_PRIMARY) AvgPaletteWeighted(&((u16*)primary->palettes)[i*16], &((u16*)primary->palettes)[((i+9)%16)*16], gPlttBufferUnfaded + i * 16, currentTimeBlend.altWeight); else @@ -1611,8 +1629,10 @@ void UpdateAltBgPalettes(u16 palettes) { } } -void UpdatePalettesWithTime(u32 palettes) { - if (MapHasNaturalLight(gMapHeader.mapType)) { +void UpdatePalettesWithTime(u32 palettes) +{ + if (MapHasNaturalLight(gMapHeader.mapType)) + { u32 i; u32 mask = 1 << 16; if (palettes >= (1 << 16)) @@ -1634,18 +1654,19 @@ void UpdatePalettesWithTime(u32 palettes) { } } -u8 UpdateSpritePaletteWithTime(u8 paletteNum) { - if (MapHasNaturalLight(gMapHeader.mapType)) { +u8 UpdateSpritePaletteWithTime(u8 paletteNum) +{ + if (MapHasNaturalLight(gMapHeader.mapType)) + { if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(paletteNum))) - return paletteNum; - TimeMixPalettes( - 1, - &gPlttBufferUnfaded[OBJ_PLTT_ID(paletteNum)], - &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], - currentTimeBlend.weight - ); + return paletteNum; + TimeMixPalettes(1, + &gPlttBufferUnfaded[OBJ_PLTT_ID(paletteNum)], + &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], + currentTimeBlend.weight + ); } return paletteNum; } @@ -1662,7 +1683,8 @@ static void OverworldBasic(void) UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); // Every minute if no palette fade is active, update TOD blending as needed - if (!gPaletteFade.active && ++gTimeUpdateCounter >= 3600) { + if (!gPaletteFade.active && ++gTimeUpdateCounter >= 3600) + { struct TimeBlendSettings cachedBlend = { .time0 = currentTimeBlend.time0, .time1 = currentTimeBlend.time1, diff --git a/src/palette.c b/src/palette.c index ee03b5d6a9..f2fdac9fdc 100644 --- a/src/palette.c +++ b/src/palette.c @@ -54,7 +54,7 @@ void LoadPalette(const void *src, u32 offset, u32 size) } // Drop in replacement for LoadPalette, uses CpuFastCopy, size must be 0 % 32 -void LoadPaletteFast(const void *src, u32 offset, u32 size) +void LoadPaletteFast(const void *src, u32 offset, u32 size) { if ((u32)src & 3) // In case palette is not 4 byte aligned return LoadPalette(src, offset, size); @@ -265,23 +265,29 @@ static u8 UpdateTimeOfDayPaletteFade(void) dst = gPlttBufferFaded + paletteOffset; // First pply TOD blend to relevant subset of palettes - if (gPaletteFade.objPaletteToggle) { // Sprite palettes, don't blend those with tags + if (gPaletteFade.objPaletteToggle) // Sprite palettes, don't blend those with tags + { u32 i; u32 j = 1; - for (i = 0; i < 16; i++, j <<= 1) { // Mask out palettes that should not be light blended + for (i = 0; i < 16; i++, j <<= 1) // Mask out palettes that should not be light blended + { if ((selectedPalettes & j) && !IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(i))) timePalettes |= j; } - } else { // tile palettes, don't blend [13, 15] + } + else // tile palettes, don't blend [13, 15] + { timePalettes = selectedPalettes & PALETTES_MAP; } TimeMixPalettes(timePalettes, src, dst, gPaletteFade.bld0, gPaletteFade.bld1, gPaletteFade.weight); // palettes that were not blended above must be copied through - if ((copyPalettes = ~timePalettes)) { + if ((copyPalettes = ~timePalettes)) + { u16 * src1 = src; u16 * dst1 = dst; - while (copyPalettes) { + while (copyPalettes) + { if (copyPalettes & 1) CpuFastCopy(src1, dst1, 32); copyPalettes >>= 1; @@ -755,7 +761,8 @@ static bool32 IsSoftwarePaletteFadeFinishing(void) } // optimized based on lucktyphlosion's BlendPalettesFine -void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color) { +void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color) +{ s32 newR, newG, newB; if (!palettes) @@ -766,10 +773,13 @@ void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color) { newG = (color << 22) >> 27; newB = (color << 17) >> 27; - do { - if (palettes & 1) { + do + { + if (palettes & 1) + { u16 *srcEnd = src + 16; - while (src != srcEnd) { // Transparency is blended (for backdrop reasons) + while (src != srcEnd) // Transparency is blended (for backdrop reasons) + { u32 srcColor = *src; s32 r = (srcColor << 27) >> 27; s32 g = (srcColor << 22) >> 27; @@ -780,7 +790,9 @@ void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color) { | ((b + (((newB - (b & 31)) * (s32)coeff) >> 5)) << 10); src++; } - } else { + } + else + { src += 16; dst += 16; } @@ -788,7 +800,8 @@ void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color) { } while (palettes); } -void BlendPalettes(u32 selectedPalettes, u8 coeff, u32 color) { +void BlendPalettes(u32 selectedPalettes, u8 coeff, u32 color) +{ BlendPalettesFine(selectedPalettes, gPlttBufferUnfaded, gPlttBufferFaded, coeff, color); } @@ -796,7 +809,8 @@ void BlendPalettes(u32 selectedPalettes, u8 coeff, u32 color) { // Like BlendPalette, but ignores blendColor if the transparency high bit is set // Optimization help by lucktyphlosion -void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor) { +void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor) +{ s32 newR, newG, newB, defR, defG, defB; u16 * src = gPlttBufferUnfaded + palOffset; u16 * dst = gPlttBufferFaded + palOffset; @@ -809,27 +823,34 @@ void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor) { newG = (blendColor << 22) >> 27; newB = (blendColor << 17) >> 27; - if (altBlendColor >> 15) { // Transparency high bit set; alt blend color + if (altBlendColor >> 15) // Transparency high bit set; alt blend color + { defR = (altBlendColor << 27) >> 27; defG = (altBlendColor << 22) >> 27; defB = (altBlendColor << 17) >> 27; - } else { + } + else + { defR = (defaultBlendColor << 27) >> 27; defG = (defaultBlendColor << 22) >> 27; defB = (defaultBlendColor << 17) >> 27; altBlendColor = 0; } - while (src != srcEnd) { + while (src != srcEnd) + { u32 srcColor = *src; s32 r = (srcColor << 27) >> 27; s32 g = (srcColor << 22) >> 27; s32 b = (srcColor << 16) >> 26; - if (srcColor >> 15) { + if (srcColor >> 15) + { *dst = ((r + (((defR - r) * (s32)coeff) >> 5)) << 0) | ((g + (((defG - g) * (s32)coeff) >> 5)) << 5) | ((b + (((defB - (b & 31)) * (s32)coeff) >> 5)) << 10); - } else { // Use provided blend color + } + else // Use provided blend color + { *dst = ((r + (((newR - r) * (s32)coeff) >> 5)) << 0) | ((g + (((newG - g) * (s32)coeff) >> 5)) << 5) | ((b + (((newB - (b & 31)) * (s32)coeff) >> 5)) << 10); @@ -841,7 +862,8 @@ void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor) { // Blends a weighted average of two blend parameters // Parameters can be either blended (as in BlendPalettes) or tinted (as in TintPaletteRGB_Copy) -void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *blend0, struct BlendSettings *blend1, u16 weight0) { +void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *blend0, struct BlendSettings *blend1, u16 weight0) +{ s32 r0, g0, b0, r1, g1, b1, defR, defG, defB, altR, altG, altB; u32 color0, coeff0, color1, coeff1; bool8 tint0, tint1; @@ -857,20 +879,26 @@ void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *ble tint1 = blend1->isTint; coeff1 = tint1 ? 8*2 : blend1->coeff*2; - if (tint0) { + if (tint0) + { r0 = (color0 << 24) >> 24; g0 = (color0 << 16) >> 24; b0 = (color0 << 8) >> 24; - } else { + } + else + { r0 = (color0 << 27) >> 27; g0 = (color0 << 22) >> 27; b0 = (color0 << 17) >> 27; } - if (tint1) { + if (tint1) + { r1 = (color1 << 24) >> 24; g1 = (color1 << 16) >> 24; b1 = (color1 << 8) >> 24; - } else { + } + else + { r1 = (color1 << 27) >> 27; g1 = (color1 << 22) >> 27; b1 = (color1 << 17) >> 27; @@ -879,33 +907,45 @@ void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *ble defG = (defaultColor << 22) >> 27; defB = (defaultColor << 17) >> 27; - do { - if (palettes & 1) { + do + { + if (palettes & 1) + { u16 *srcEnd = src + 16; u32 altBlendColor = *dst++ = *src++; // color 0 is copied through - if (altBlendColor >> 15) { // Transparency high bit set; alt blend color + if (altBlendColor >> 15) // Transparency high bit set; alt blend color + { altR = (altBlendColor << 27) >> 27; altG = (altBlendColor << 22) >> 27; altB = (altBlendColor << 17) >> 27; - } else { + } + else + { altBlendColor = 0; } - while (src != srcEnd) { + while (src != srcEnd) + { u32 srcColor = *src; s32 r = (srcColor << 27) >> 27; s32 g = (srcColor << 22) >> 27; s32 b = (srcColor << 17) >> 27; s32 r2, g2, b2; - if (srcColor >> 15) { - if (altBlendColor) { // Use alternate blend color + if (srcColor >> 15) + { + if (altBlendColor) + { + // Use alternate blend color r2 = r + (((altR - r) * (s32)coeff1) >> 5); g2 = g + (((altG - g) * (s32)coeff1) >> 5); b2 = b + (((altB - b) * (s32)coeff1) >> 5); r = r + (((altR - r) * (s32)coeff0) >> 5); g = g + (((altG - g) * (s32)coeff0) >> 5); b = b + (((altB - b) * (s32)coeff0) >> 5); - } else { // Use default blend color + } + else + { + // Use default blend color r2 = r + (((defR - r) * (s32)coeff1) >> 5); g2 = g + (((defG - g) * (s32)coeff1) >> 5); b2 = b + (((defB - b) * (s32)coeff1) >> 5); @@ -913,12 +953,20 @@ void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *ble g = g + (((defG - g) * (s32)coeff0) >> 5); b = b + (((defB - b) * (s32)coeff0) >> 5); } - } else { // Use provided blend colors - if (!tint1) { // blend-based + } + else + { + // Use provided blend colors + if (!tint1) + { + // blend-based r2 = (r + (((r1 - r) * (s32)coeff1) >> 5)); g2 = (g + (((g1 - g) * (s32)coeff1) >> 5)); b2 = (b + (((b1 - b) * (s32)coeff1) >> 5)); - } else { // tint-based + } + else + { + // tint-based r2 = (u16)((r1 * r)) >> 8; g2 = (u16)((g1 * g)) >> 8; b2 = (u16)((b1 * b)) >> 8; @@ -929,11 +977,16 @@ void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *ble if (b2 > 31) b2 = 31; } - if (!tint0) { // blend-based + if (!tint0) + { + // blend-based r = (r + (((r0 - r) * (s32)coeff0) >> 5)); g = (g + (((g0 - g) * (s32)coeff0) >> 5)); b = (b + (((b0 - b) * (s32)coeff0) >> 5)); - } else { // tint-based + } + else + { + // tint-based r = (u16)((r0 * r)) >> 8; g = (u16)((g0 * g)) >> 8; b = (u16)((b0 * b)) >> 8; @@ -943,7 +996,7 @@ void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *ble g = 31; if (b > 31) b = 31; - } + } } r = r2 + (((r - r2) * (s32)weight0) >> 8); g = g2 + (((g - g2) * (s32)weight0) >> 8); @@ -952,7 +1005,9 @@ void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *ble // *dst++ = RGB2(r, g, b) | (srcColor >> 15) << 15; src++; } - } else { + } + else + { src += 16; dst += 16; } @@ -961,12 +1016,14 @@ void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *ble } // Apply weighted average to palettes, preserving high bits of dst throughout -void AvgPaletteWeighted(u16 *src0, u16 *src1, u16 *dst, u16 weight0) { +void AvgPaletteWeighted(u16 *src0, u16 *src1, u16 *dst, u16 weight0) +{ u16 *srcEnd = src0 + 16; src0++; src1++; dst++; // leave dst transparency unchanged - while (src0 != srcEnd) { + while (src0 != srcEnd) + { u32 src0Color = *src0++; s32 r0 = (src0Color << 27) >> 27; s32 g0 = (src0Color << 22) >> 27; @@ -1085,7 +1142,8 @@ void TintPalette_CustomTone(u16 *palette, u32 count, u16 rTone, u16 gTone, u16 b } // Tints from Unfaded to Faded, using a 15-bit GBA color -void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor) { +void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor) +{ s32 newR, newG, newB, rTone = 0, gTone = 0, bTone = 0; u16 * src = gPlttBufferUnfaded + palOffset; u16 * dst = gPlttBufferFaded + palOffset; @@ -1093,38 +1151,51 @@ void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor) { u16 *srcEnd = src + 16; u16 altBlendIndices = *dst++ = *src++; // color 0 is copied through unchanged u32 altBlendColor; - + newR = ((blendColor << 27) >> 27) << 3; newG = ((blendColor << 22) >> 27) << 3; newB = ((blendColor << 17) >> 27) << 3; - - if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend + + if (altBlendIndices >> 15) // High bit set; bitmask of which colors to alt-blend + { // Note that bit 0 of altBlendIndices specifies color 1 altBlendColor = src[14]; // color 15 - if (altBlendColor >> 15) { // Set alternate blend color + if (altBlendColor >> 15) + { + // Set alternate blend color rTone = ((altBlendColor << 27) >> 27) << 3; gTone = ((altBlendColor << 22) >> 27) << 3; bTone = ((altBlendColor << 17) >> 27) << 3; - } else { // Set default blend color + } + else + { + // Set default blend color rTone = ((defaultBlendColor << 27) >> 27) << 3; gTone = ((defaultBlendColor << 22) >> 27) << 3; bTone = ((defaultBlendColor << 17) >> 27) << 3; } - } else { + } + else + { altBlendIndices = 0; } - while (src != srcEnd) { + while (src != srcEnd) + { u32 srcColor = *src; s32 r = (srcColor << 27) >> 27; s32 g = (srcColor << 22) >> 27; s32 b = (srcColor << 17) >> 27; - if (altBlendIndices & 1) { + if (altBlendIndices & 1) + { r = (u16)((rTone * r)) >> 8; g = (u16)((gTone * g)) >> 8; b = (u16)((bTone * b)) >> 8; - } else { // Use provided blend color + } + else + { + // Use provided blend color r = (u16)((newR * r)) >> 8; g = (u16)((newG * g)) >> 8; b = (u16)((newB * b)) >> 8; diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index a1ebc2b188..9552055373 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -3969,17 +3969,17 @@ static void SetMoveTypeIcons(void) if (P_SHOW_DYNAMIC_TYPES) { type = CheckDynamicMoveType(mon, summary->moves[i], 0); - SetTypeSpritePosAndPal(type, 85, 32 + (i * 16), i + SPRITE_ARR_ID_TYPE); + SetTypeSpritePosAndPal(type, 85, 32 + (i * 16), i + SPRITE_ARR_ID_TYPE); } else { - SetTypeSpritePosAndPal(gMovesInfo[summary->moves[i]].type, 85, 32 + (i * 16), i + SPRITE_ARR_ID_TYPE); + SetTypeSpritePosAndPal(gMovesInfo[summary->moves[i]].type, 85, 32 + (i * 16), i + SPRITE_ARR_ID_TYPE); } } else { SetSpriteInvisibility(i + SPRITE_ARR_ID_TYPE, TRUE); - } + } } } diff --git a/src/scrcmd.c b/src/scrcmd.c index d8b2643f43..f2660be65b 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -632,7 +632,8 @@ static bool8 IsPaletteNotActive(void) } // pauses script until palette fade inactive -bool8 ScrFunc_WaitPaletteNotActive(struct ScriptContext *ctx) { +bool8 ScrFunc_WaitPaletteNotActive(struct ScriptContext *ctx) +{ SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } diff --git a/src/tv.c b/src/tv.c index c0e207ce8a..8fc8bb684b 100644 --- a/src/tv.c +++ b/src/tv.c @@ -5334,7 +5334,8 @@ static void DoTVShow3CheersForPokeblocks(void) if (show->threeCheers.sheen > 24) { StringCopy(gStringVar2, gText_Excellent); - } else if (show->threeCheers.sheen > 22) + } + else if (show->threeCheers.sheen > 22) { StringCopy(gStringVar2, gText_VeryGood); } From 8795c15ab9d2fb255ee2c11db436ff0c1ebe5c70 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 1 Sep 2024 16:17:51 -0400 Subject: [PATCH 098/145] feat: Allowed custom `COLOR_MAP_*` in `field_effect_scripts`. Credit: SDH --- asm/macros/field_effect_script.inc | 12 +++++++++--- include/field_weather.h | 2 ++ src/field_effect.c | 7 +++++-- src/field_weather.c | 22 +++++++++++++++++++--- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/asm/macros/field_effect_script.inc b/asm/macros/field_effect_script.inc index 38f7e31750..3e00bc734d 100644 --- a/asm/macros/field_effect_script.inc +++ b/asm/macros/field_effect_script.inc @@ -5,9 +5,11 @@ .4byte \address .endm - .macro field_eff_loadfadedpal address:req + @ 1 = COLOR_MAP_DARK_CONTRAST + .macro field_eff_loadfadedpal address:req, color_map_type=1 .byte 1 .4byte \address + .byte \color_map_type .endm .macro field_eff_loadpal address:req @@ -24,10 +26,12 @@ .byte 4 .endm - .macro field_eff_loadgfx_callnative tiles_address:req, palette_address:req, function_address:req + @ 1 = COLOR_MAP_DARK_CONTRAST + .macro field_eff_loadgfx_callnative tiles_address:req, palette_address:req, function_address:req, color_map_type=1 .byte 5 .4byte \tiles_address .4byte \palette_address + .byte \color_map_type .4byte \function_address .endm @@ -37,8 +41,10 @@ .4byte \function_address .endm - .macro field_eff_loadfadedpal_callnative palette_address:req, function_address:req + @ 1 = COLOR_MAP_DARK_CONTRAST + .macro field_eff_loadfadedpal_callnative palette_address:req, function_address:req, color_map_type=1 .byte 7 .4byte \palette_address + .byte \color_map_type .4byte \function_address .endm diff --git a/include/field_weather.h b/include/field_weather.h index fbd90f2405..d741bdd2b0 100644 --- a/include/field_weather.h +++ b/include/field_weather.h @@ -170,7 +170,9 @@ void PlayRainStoppingSoundEffect(void); u8 IsWeatherChangeComplete(void); void SetWeatherScreenFadeOut(void); void SetWeatherPalStateIdle(void); +const u8* SetPaletteColorMapType(u8 paletteIndex, u8 colorMapType); void PreservePaletteInWeather(u8 preservedPalIndex); +void ResetPaletteColorMapType(u8 paletteIndex); void ResetPreservedPalettesInWeather(void); // field_weather_effect.c diff --git a/src/field_effect.c b/src/field_effect.c index 6ae2d509a4..5df664908d 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -781,9 +781,11 @@ void FieldEffectScript_LoadTiles(u8 **script) void FieldEffectScript_LoadFadedPalette(u8 **script) { struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); - LoadSpritePalette(palette); - UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag), TRUE); + u32 paletteSlot = LoadSpritePalette(palette); (*script) += 4; + SetPaletteColorMapType(paletteSlot + 16, T1_READ_8(*script)); + UpdateSpritePaletteWithWeather(paletteSlot, TRUE); + (*script)++; } void FieldEffectScript_LoadPalette(u8 **script) @@ -839,6 +841,7 @@ void FieldEffectFreePaletteIfUnused(u8 paletteNum) for (i = 0; i < MAX_SPRITES; i++) if (gSprites[i].inUse && gSprites[i].oam.paletteNum == paletteNum) return; + ResetPaletteColorMapType(paletteNum + 16); FreeSpritePaletteByTag(tag); } } diff --git a/src/field_weather.c b/src/field_weather.c index 1a3a150c4c..e2fb1e77e6 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -1136,11 +1136,27 @@ void SetWeatherPalStateIdle(void) gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } +const u8* SetPaletteColorMapType(u8 paletteIndex, u8 colorMapType) { + if (sPaletteColorMapTypes[paletteIndex] == colorMapType) + return sPaletteColorMapTypes; + // setup field effect color map + if (sPaletteColorMapTypes != sFieldEffectPaletteColorMapTypes) { + CpuFastCopy(sBasePaletteColorMapTypes, sFieldEffectPaletteColorMapTypes, 32); + sPaletteColorMapTypes = sFieldEffectPaletteColorMapTypes; + } + sFieldEffectPaletteColorMapTypes[paletteIndex] = colorMapType; + return sPaletteColorMapTypes; +} + void PreservePaletteInWeather(u8 preservedPalIndex) { - CpuCopy16(sBasePaletteColorMapTypes, sFieldEffectPaletteColorMapTypes, 32); - sFieldEffectPaletteColorMapTypes[preservedPalIndex] = COLOR_MAP_NONE; - sPaletteColorMapTypes = sFieldEffectPaletteColorMapTypes; + SetPaletteColorMapType(preservedPalIndex, COLOR_MAP_NONE); +} + +void ResetPaletteColorMapType(u8 paletteIndex) { + if (sPaletteColorMapTypes == sBasePaletteColorMapTypes) + return; + sFieldEffectPaletteColorMapTypes[paletteIndex] = sBasePaletteColorMapTypes[paletteIndex]; } void ResetPreservedPalettesInWeather(void) From d3a48398084612f40bc2d05b7bca3e2ae3cf4f83 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 8 Sep 2024 16:02:51 -0400 Subject: [PATCH 099/145] meta: included `COLOR_MAP` constants in `field_effect_script`. Credit: SDH --- asm/macros/field_effect_script.inc | 10 ++++------ include/constants/field_weather.h | 5 +++++ src/field_weather.c | 7 ------- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/asm/macros/field_effect_script.inc b/asm/macros/field_effect_script.inc index 3e00bc734d..68d8502a9d 100644 --- a/asm/macros/field_effect_script.inc +++ b/asm/macros/field_effect_script.inc @@ -1,3 +1,4 @@ +#include "constants/field_weather.h" @ The first .byte argument of each macro below is an index into gFieldEffectScriptFuncs .macro field_eff_loadtiles address:req @@ -5,8 +6,7 @@ .4byte \address .endm - @ 1 = COLOR_MAP_DARK_CONTRAST - .macro field_eff_loadfadedpal address:req, color_map_type=1 + .macro field_eff_loadfadedpal address:req, color_map_type=COLOR_MAP_DARK_CONTRAST .byte 1 .4byte \address .byte \color_map_type @@ -26,8 +26,7 @@ .byte 4 .endm - @ 1 = COLOR_MAP_DARK_CONTRAST - .macro field_eff_loadgfx_callnative tiles_address:req, palette_address:req, function_address:req, color_map_type=1 + .macro field_eff_loadgfx_callnative tiles_address:req, palette_address:req, function_address:req, color_map_type=COLOR_MAP_DARK_CONTRAST .byte 5 .4byte \tiles_address .4byte \palette_address @@ -41,8 +40,7 @@ .4byte \function_address .endm - @ 1 = COLOR_MAP_DARK_CONTRAST - .macro field_eff_loadfadedpal_callnative palette_address:req, function_address:req, color_map_type=1 + .macro field_eff_loadfadedpal_callnative palette_address:req, function_address:req, color_map_type=COLOR_MAP_DARK_CONTRAST .byte 7 .4byte \palette_address .byte \color_map_type diff --git a/include/constants/field_weather.h b/include/constants/field_weather.h index e84dbc48c4..dedd1a3c0a 100644 --- a/include/constants/field_weather.h +++ b/include/constants/field_weather.h @@ -1,6 +1,11 @@ #ifndef GUARD_CONSTANTS_FIELD_WEATHER_H #define GUARD_CONSTANTS_FIELD_WEATHER_H +// sPaletteColorMapTypes & field_effect_scripts +#define COLOR_MAP_NONE 0 +#define COLOR_MAP_DARK_CONTRAST 1 +#define COLOR_MAP_CONTRAST 2 + #define MAX_RAIN_SPRITES 24 #define NUM_CLOUD_SPRITES 3 #define NUM_FOG_HORIZONTAL_SPRITES 20 diff --git a/src/field_weather.c b/src/field_weather.c index e2fb1e77e6..eaa25078b6 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -20,13 +20,6 @@ #define DROUGHT_COLOR_INDEX(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00)) -enum -{ - COLOR_MAP_NONE, - COLOR_MAP_DARK_CONTRAST, - COLOR_MAP_CONTRAST, -}; - struct RGBColor { u16 r:5; From 3e3229190728b2d7ac502d3851b9c9bb5d36e4bb Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 8 Sep 2024 17:05:17 -0400 Subject: [PATCH 100/145] fix: fixed shadows not spawning across maps for OWs with the same `localId` --- src/event_object_movement.c | 4 ++-- src/field_effect_helpers.c | 12 ++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 878aeac807..f8dd625410 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2441,7 +2441,7 @@ static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) { sprite->centerToCornerVecX = -(32 >> 1); sprite->centerToCornerVecY = -(32 >> 1); sprite->oam.priority = 1; - sprite->oam.objMode = 1; // BLEND + sprite->oam.objMode = ST_OAM_OBJ_BLEND; sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; sprite->x += 8; sprite->y += 22 + sprite->centerToCornerVecY; @@ -2451,7 +2451,7 @@ static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) { sprite->centerToCornerVecY = -(16 >> 1); sprite->oam.priority = 2; sprite->subpriority = 0xFF; - sprite->oam.objMode = 1; // BLEND + sprite->oam.objMode = ST_OAM_OBJ_BLEND; } } diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 70f0db7f1b..606f3b1f1a 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -56,8 +56,8 @@ u32 FldEff_Shadow(void); void SetUpShadow(struct ObjectEvent *objectEvent, struct Sprite *sprite) { gFieldEffectArguments[0] = objectEvent->localId; - gFieldEffectArguments[1] = gSaveBlock1Ptr->location.mapNum; - gFieldEffectArguments[2] = gSaveBlock1Ptr->location.mapGroup; + gFieldEffectArguments[1] = objectEvent->mapNum; + gFieldEffectArguments[2] = objectEvent->mapGroup; FldEff_Shadow(); } @@ -329,7 +329,11 @@ u32 FldEff_Shadow(void) s32 i; for (i = MAX_SPRITES - 1; i > -1; i--) { // Search backwards, because of CreateSpriteAtEnd // Return early if a shadow sprite already exists - if (gSprites[i].data[0] == gFieldEffectArguments[0] && gSprites[i].callback == UpdateShadowFieldEffect) + if (gSprites[i].callback == UpdateShadowFieldEffect && + gSprites[i].sLocalId == gFieldEffectArguments[0] && + gSprites[i].sMapNum == gFieldEffectArguments[1] && + gSprites[i].sMapGroup == gFieldEffectArguments[2] + ) return 0; } objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); @@ -341,7 +345,7 @@ u32 FldEff_Shadow(void) if (spriteId != MAX_SPRITES) { // SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 12)); - gSprites[spriteId].oam.objMode = 1; // BLEND + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; gSprites[spriteId].coordOffsetEnabled = TRUE; gSprites[spriteId].sLocalId = gFieldEffectArguments[0]; gSprites[spriteId].sMapNum = gFieldEffectArguments[1]; From 0e312fe57510d8539c6c070724679b7a76a924f0 Mon Sep 17 00:00:00 2001 From: Jack Wellman Date: Mon, 9 Sep 2024 18:39:23 -0400 Subject: [PATCH 101/145] Fix Blinking Lights in Rustboro --- src/event_object_movement.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index f8dd625410..2f9d384691 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2399,9 +2399,10 @@ void UpdateLightSprite(struct Sprite *sprite) { if (GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum) == OBJ_EVENT_PAL_TAG_LIGHT_2) LoadSpritePaletteInSlot(&sObjectEventSpritePalettes[FindObjectEventPaletteIndexByTag(OBJ_EVENT_PAL_TAG_LIGHT)], sprite->oam.paletteNum); } else if ((sprite->invisible = gTimeUpdateCounter & 1)) { - Weather_SetBlendCoeffs(12, 12); - if (GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum) == OBJ_EVENT_PAL_TAG_LIGHT) - LoadSpritePaletteInSlot(&sObjectEventSpritePalettes[FindObjectEventPaletteIndexByTag(OBJ_EVENT_PAL_TAG_LIGHT_2)], sprite->oam.paletteNum); + Weather_SetBlendCoeffs(7, 12); // As long as the second coefficient stays 12, shadows will not change + sprite->invisible = FALSE; + if (GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum) == OBJ_EVENT_PAL_TAG_LIGHT_2) + LoadSpritePaletteInSlot(&sObjectEventSpritePalettes[FindObjectEventPaletteIndexByTag(OBJ_EVENT_PAL_TAG_LIGHT)], sprite->oam.paletteNum); } break; case 1 ... 2: From fb360b1e418e517f224bc6f9576d636a68587724 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 11 Sep 2024 09:33:34 -0300 Subject: [PATCH 102/145] DNS tinting uses fake RTC's rate --- src/overworld.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/overworld.c b/src/overworld.c index df44574d0f..c7f3e15d7a 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -9,6 +9,7 @@ #include "event_data.h" #include "event_object_movement.h" #include "event_scripts.h" +#include "fake_rtc.h" #include "field_camera.h" #include "field_control_avatar.h" #include "field_effect.h" @@ -1686,7 +1687,7 @@ static void OverworldBasic(void) UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); // Every minute if no palette fade is active, update TOD blending as needed - if (!gPaletteFade.active && ++gTimeUpdateCounter >= 3600) + if (!gPaletteFade.active && ++gTimeUpdateCounter >= (SECONDS_PER_MINUTE * 60 / FakeRtc_GetSecondsRatio())) { struct TimeBlendSettings cachedBlend = { .time0 = currentTimeBlend.time0, From 757ed7054d5773d8007c8eb38ce7c3e2f8d8d401 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 11 Sep 2024 11:17:09 -0300 Subject: [PATCH 103/145] Secondary map popup window updates time while active --- src/map_name_popup.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/map_name_popup.c b/src/map_name_popup.c index 5cc1f3cfd5..3af55ee4cd 100644 --- a/src/map_name_popup.c +++ b/src/map_name_popup.c @@ -41,6 +41,7 @@ enum MapPopUp_Themes_BW // static functions static void Task_MapNamePopUpWindow(u8 taskId); +static void UpdateSecondaryPopUpWindow(u8 secondaryPopUpWindowId); static void ShowMapNamePopUpWindow(void); static void LoadMapNamePopUpWindowBg(void); @@ -423,6 +424,7 @@ static void Task_MapNamePopUpWindow(u8 taskId) break; case STATE_WAIT: // Wait while the window is fully onscreen. + UpdateSecondaryPopUpWindow(GetSecondaryPopUpWindowId()); if (++task->tOnscreenTimer > 120) { task->tOnscreenTimer = 0; @@ -500,6 +502,20 @@ void HideMapNamePopUpWindow(void) } } +static void UpdateSecondaryPopUpWindow(u8 secondaryPopUpWindowId) +{ + u8 mapDisplayHeader[24]; + u8 *withoutPrefixPtr = &(mapDisplayHeader[0]); + + if (OW_POPUP_BW_TIME_MODE != OW_POPUP_BW_TIME_NONE) + { + RtcCalcLocalTime(); + FormatDecimalTimeWithoutSeconds(withoutPrefixPtr, gLocalTime.hours, gLocalTime.minutes, OW_POPUP_BW_TIME_MODE == OW_POPUP_BW_TIME_24_HR); + AddTextPrinterParameterized(secondaryPopUpWindowId, FONT_SMALL, mapDisplayHeader, GetStringRightAlignXOffset(FONT_SMALL, mapDisplayHeader, DISPLAY_WIDTH) - 5, 8, TEXT_SKIP_DRAW, NULL); + } + CopyWindowToVram(secondaryPopUpWindowId, COPYWIN_FULL); +} + static void ShowMapNamePopUpWindow(void) { u8 mapDisplayHeader[24]; @@ -550,16 +566,8 @@ static void ShowMapNamePopUpWindow(void) if (OW_POPUP_GENERATION == GEN_5) { AddTextPrinterParameterized(mapNamePopUpWindowId, FONT_SHORT, mapDisplayHeader, 8, 2, TEXT_SKIP_DRAW, NULL); - - if (OW_POPUP_BW_TIME_MODE != OW_POPUP_BW_TIME_NONE) - { - RtcCalcLocalTime(); - FormatDecimalTimeWithoutSeconds(withoutPrefixPtr, gLocalTime.hours, gLocalTime.minutes, OW_POPUP_BW_TIME_MODE == OW_POPUP_BW_TIME_24_HR); - AddTextPrinterParameterized(secondaryPopUpWindowId, FONT_SMALL, mapDisplayHeader, GetStringRightAlignXOffset(FONT_SMALL, mapDisplayHeader, DISPLAY_WIDTH) - 5, 8, TEXT_SKIP_DRAW, NULL); - } - CopyWindowToVram(mapNamePopUpWindowId, COPYWIN_FULL); - CopyWindowToVram(secondaryPopUpWindowId, COPYWIN_FULL); + UpdateSecondaryPopUpWindow(secondaryPopUpWindowId); } else { From 56859e35e0d779ce06d899be142a189a1024e336 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 12 Sep 2024 10:26:58 -0300 Subject: [PATCH 104/145] Using TIME instead of TIME_OF_DAY --- include/overworld.h | 4 ---- src/event_object_movement.c | 3 ++- src/follower_helper.c | 5 +++-- src/overworld.c | 45 +++++++++++++++++++------------------ 4 files changed, 28 insertions(+), 29 deletions(-) diff --git a/include/overworld.h b/include/overworld.h index 62761ecdb0..5805bb8d6b 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -25,10 +25,6 @@ #define MOVEMENT_MODE_SCRIPTED 2 #define SKIP_OBJECT_EVENT_LOAD 1 -#define TIME_OF_DAY_NIGHT 0 -#define TIME_OF_DAY_TWILIGHT 1 -#define TIME_OF_DAY_DAY 2 -#define TIME_OF_DAY_MAX TIME_OF_DAY_DAY struct InitialPlayerAvatarState { diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 42f68473a1..122f774ebf 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -29,6 +29,7 @@ #include "pokeball.h" #include "random.h" #include "region_map.h" +#include "rtc.h" #include "script.h" #include "sound.h" #include "sprite.h" @@ -2505,7 +2506,7 @@ void UpdateLightSprite(struct Sprite *sprite) return; } - if (gTimeOfDay != TIME_OF_DAY_NIGHT) + if (gTimeOfDay != TIME_NIGHT) { sprite->invisible = TRUE; return; diff --git a/src/follower_helper.c b/src/follower_helper.c index f1a365532f..26e9f25fab 100644 --- a/src/follower_helper.c +++ b/src/follower_helper.c @@ -3,6 +3,7 @@ #include "event_scripts.h" #include "follower_helper.h" #include "overworld.h" +#include "rtc.h" #include "constants/battle.h" #include "constants/followers.h" #include "constants/metatile_behaviors.h" @@ -362,14 +363,14 @@ const struct FollowerMsgInfoExtended gFollowerConditionalMessages[COND_MSG_COUNT .text = (u8*)sDayTexts, .textSpread = 1, .emotion = FOLLOWER_EMOTION_MUSIC, - .conditions = {MATCH_TIME_OF_DAY(TIME_OF_DAY_DAY)}, + .conditions = {MATCH_TIME_OF_DAY(TIME_DAY)}, }, [COND_MSG_NIGHT] = { .text = (u8*)sNightTexts, .textSpread = 1, .emotion = FOLLOWER_EMOTION_MUSIC, - .conditions = {MATCH_TIME_OF_DAY(TIME_OF_DAY_NIGHT)}, + .conditions = {MATCH_TIME_OF_DAY(TIME_NIGHT)}, }, }; diff --git a/src/overworld.c b/src/overworld.c index c7f3e15d7a..889b35effc 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1532,9 +1532,10 @@ void CB1_Overworld(void) const struct BlendSettings gTimeOfDayBlend[] = { - [TIME_OF_DAY_NIGHT] = {.coeff = 10, .blendColor = TINT_NIGHT, .isTint = TRUE}, - [TIME_OF_DAY_TWILIGHT] = {.coeff = 4, .blendColor = 0xA8B0E0, .isTint = TRUE}, - [TIME_OF_DAY_DAY] = {.coeff = 0, .blendColor = 0}, + [TIME_MORNING] = {.coeff = 4, .blendColor = 0xA8B0E0, .isTint = TRUE}, // Originally TIME_OF_DAY_TWILIGHT + [TIME_DAY] = {.coeff = 0, .blendColor = 0, .isTint = FALSE}, + [TIME_EVENING] = {.coeff = 4, .blendColor = 0xA8B0E0, .isTint = TRUE}, // Originally TIME_OF_DAY_TWILIGHT + [TIME_NIGHT] = {.coeff = 10, .blendColor = TINT_NIGHT, .isTint = TRUE}, }; u8 UpdateTimeOfDay(void) @@ -1547,50 +1548,50 @@ u8 UpdateTimeOfDay(void) { currentTimeBlend.weight = 256; currentTimeBlend.altWeight = 0; - gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; + gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_NIGHT; } - else if (hours < 7) // night->twilight + else if (hours < 7) // night->morning { - currentTimeBlend.time0 = TIME_OF_DAY_NIGHT; - currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; + currentTimeBlend.time0 = TIME_NIGHT; + currentTimeBlend.time1 = TIME_MORNING; currentTimeBlend.weight = 256 - 256 * ((hours - 4) * 60 + minutes) / ((7-4)*60); currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2; - gTimeOfDay = TIME_OF_DAY_DAY; + gTimeOfDay = TIME_MORNING; } - else if (hours < 10) // twilight->day + else if (hours < 10) // morning->day { - currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; - currentTimeBlend.time1 = TIME_OF_DAY_DAY; + currentTimeBlend.time0 = TIME_MORNING; + currentTimeBlend.time1 = TIME_DAY; currentTimeBlend.weight = 256 - 256 * ((hours - 7) * 60 + minutes) / ((10-7)*60); currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2 + 128; - gTimeOfDay = TIME_OF_DAY_DAY; + gTimeOfDay = TIME_DAY; } else if (hours < 18) // day { currentTimeBlend.weight = currentTimeBlend.altWeight = 256; - gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_DAY; + gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_DAY; } - else if (hours < 20) + else if (hours < 20) // evening { - currentTimeBlend.time0 = TIME_OF_DAY_DAY; - currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; + currentTimeBlend.time0 = TIME_DAY; + currentTimeBlend.time1 = TIME_EVENING; currentTimeBlend.weight = 256 - 256 * ((hours - 18) * 60 + minutes) / ((20-18)*60); currentTimeBlend.altWeight = currentTimeBlend.weight / 2 + 128; - gTimeOfDay = TIME_OF_DAY_TWILIGHT; + gTimeOfDay = TIME_EVENING; } - else if (hours < 22) // twilight->night + else if (hours < 22) // evening->night { - currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; - currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; + currentTimeBlend.time0 = TIME_EVENING; + currentTimeBlend.time1 = TIME_NIGHT; currentTimeBlend.weight = 256 - 256 * ((hours - 20) * 60 + minutes) / ((22-20)*60); currentTimeBlend.altWeight = currentTimeBlend.weight / 2; - gTimeOfDay = TIME_OF_DAY_NIGHT; + gTimeOfDay = TIME_NIGHT; } else // 22-24, night { currentTimeBlend.weight = 256; currentTimeBlend.altWeight = 0; - gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; + gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_NIGHT; } return gTimeOfDay; } From 53414cb8bbf4e9b78ceba93ebd3682a86bae5bb5 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 16 Sep 2024 16:15:30 -0300 Subject: [PATCH 105/145] Form changes and evolutions happen based on fake RTC --- include/clock.h | 1 + include/overworld.h | 2 +- include/rtc.h | 2 +- src/clock.c | 5 ++--- src/overworld.c | 3 ++- src/rtc.c | 10 ++-------- 6 files changed, 9 insertions(+), 14 deletions(-) diff --git a/include/clock.h b/include/clock.h index 0cfd3db9ed..95d0929950 100644 --- a/include/clock.h +++ b/include/clock.h @@ -5,5 +5,6 @@ void InitTimeBasedEvents(void); void DoTimeBasedEvents(void); +void FormChangeTimeUpdate(); #endif // GUARD_CLOCK_H diff --git a/include/overworld.h b/include/overworld.h index 5805bb8d6b..2e6bb8a922 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -141,7 +141,7 @@ void CleanupOverworldWindowsAndTilemaps(void); bool32 IsOverworldLinkActive(void); void CB1_Overworld(void); void CB2_OverworldBasic(void); -u8 UpdateTimeOfDay(void); +void UpdateTimeOfDay(void); bool8 MapHasNaturalLight(u8 mapType); void UpdateAltBgPalettes(u16 palettes); void UpdatePalettesWithTime(u32); diff --git a/include/rtc.h b/include/rtc.h index bf8ff9aa93..c60e63deb1 100644 --- a/include/rtc.h +++ b/include/rtc.h @@ -18,7 +18,7 @@ #define RTC_ERR_FLAG_MASK 0x0FF0 //Morning and evening don't exist in Gen 3 -#if OW_TIMES_OF_DAY == GEN_3 +#if OW_TIMES_OF_DAY <= GEN_3 #define MORNING_HOUR_BEGIN 0 #define MORNING_HOUR_END 0 diff --git a/src/clock.c b/src/clock.c index 54c9422bbe..f9cfee4ad4 100644 --- a/src/clock.c +++ b/src/clock.c @@ -1,4 +1,5 @@ #include "global.h" +#include "clock.h" #include "event_data.h" #include "rtc.h" #include "time_events.h" @@ -15,7 +16,6 @@ static void UpdatePerDay(struct Time *localTime); static void UpdatePerMinute(struct Time *localTime); -static void FormChangeTimeUpdate(); void InitTimeBasedEvents(void) { @@ -72,12 +72,11 @@ static void UpdatePerMinute(struct Time *localTime) { BerryTreeTimeUpdate(minutes); gSaveBlock2Ptr->lastBerryTreeUpdate = *localTime; - FormChangeTimeUpdate(); } } } -static void FormChangeTimeUpdate() +void FormChangeTimeUpdate() { s32 i; for (i = 0; i < PARTY_SIZE; i++) diff --git a/src/overworld.c b/src/overworld.c index 889b35effc..de3bc00ff2 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1538,7 +1538,7 @@ const struct BlendSettings gTimeOfDayBlend[] = [TIME_NIGHT] = {.coeff = 10, .blendColor = TINT_NIGHT, .isTint = TRUE}, }; -u8 UpdateTimeOfDay(void) +void UpdateTimeOfDay(void) { s32 hours, minutes; RtcCalcLocalTime(); @@ -1697,6 +1697,7 @@ static void OverworldBasic(void) }; gTimeUpdateCounter = 0; UpdateTimeOfDay(); + FormChangeTimeUpdate(); if (cachedBlend.time0 != currentTimeBlend.time0 || cachedBlend.time1 != currentTimeBlend.time1 || cachedBlend.weight != currentTimeBlend.weight) diff --git a/src/rtc.c b/src/rtc.c index 5ccafec621..9ec96350c8 100644 --- a/src/rtc.c +++ b/src/rtc.c @@ -4,6 +4,7 @@ #include "strings.h" #include "text.h" #include "fake_rtc.h" +#include "overworld.h" // iwram bss static u16 sErrorStatus; @@ -327,14 +328,7 @@ bool8 IsBetweenHours(s32 hours, s32 begin, s32 end) u8 GetTimeOfDay(void) { - RtcCalcLocalTime(); - if (IsBetweenHours(gLocalTime.hours, MORNING_HOUR_BEGIN, MORNING_HOUR_END)) - return TIME_MORNING; - else if (IsBetweenHours(gLocalTime.hours, EVENING_HOUR_BEGIN, EVENING_HOUR_END)) - return TIME_EVENING; - else if (IsBetweenHours(gLocalTime.hours, NIGHT_HOUR_BEGIN, NIGHT_HOUR_END)) - return TIME_NIGHT; - return TIME_DAY; + return gTimeOfDay; } void RtcInitLocalTimeOffset(s32 hour, s32 minute) From 18485ca4cf80a55dcacb80bda99fdd6e5b6686a8 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 30 Sep 2024 15:19:54 -0300 Subject: [PATCH 106/145] Time blending uses OW_TIMES_OF_DAY --- src/overworld.c | 53 +++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/src/overworld.c b/src/overworld.c index de3bc00ff2..dc802c95bc 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1538,64 +1538,65 @@ const struct BlendSettings gTimeOfDayBlend[] = [TIME_NIGHT] = {.coeff = 10, .blendColor = TINT_NIGHT, .isTint = TRUE}, }; +#define DEFAULT_WEIGHT 256 +#define TIME_BLEND_WEIGHT(begin, end) (DEFAULT_WEIGHT - (DEFAULT_WEIGHT * ((hours - begin) * MINUTES_PER_HOUR + minutes) / ((end - begin) * MINUTES_PER_HOUR))) + +#define MORNING_HOUR_MIDDLE (MORNING_HOUR_BEGIN + ((MORNING_HOUR_END - MORNING_HOUR_BEGIN) / 2)) + void UpdateTimeOfDay(void) { s32 hours, minutes; RtcCalcLocalTime(); hours = gLocalTime.hours; minutes = gLocalTime.minutes; - if (hours < 4) // night - { - currentTimeBlend.weight = 256; - currentTimeBlend.altWeight = 0; - gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_NIGHT; - } - else if (hours < 7) // night->morning + + if (IsBetweenHours(hours, MORNING_HOUR_BEGIN, MORNING_HOUR_MIDDLE)) // night->morning { currentTimeBlend.time0 = TIME_NIGHT; currentTimeBlend.time1 = TIME_MORNING; - currentTimeBlend.weight = 256 - 256 * ((hours - 4) * 60 + minutes) / ((7-4)*60); - currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2; + currentTimeBlend.weight = TIME_BLEND_WEIGHT(MORNING_HOUR_BEGIN, MORNING_HOUR_MIDDLE); + currentTimeBlend.altWeight = (DEFAULT_WEIGHT - currentTimeBlend.weight) / 2; gTimeOfDay = TIME_MORNING; } - else if (hours < 10) // morning->day + else if (IsBetweenHours(hours, MORNING_HOUR_MIDDLE, MORNING_HOUR_END)) // morning->day { currentTimeBlend.time0 = TIME_MORNING; currentTimeBlend.time1 = TIME_DAY; - currentTimeBlend.weight = 256 - 256 * ((hours - 7) * 60 + minutes) / ((10-7)*60); - currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2 + 128; - gTimeOfDay = TIME_DAY; + currentTimeBlend.weight = TIME_BLEND_WEIGHT(MORNING_HOUR_MIDDLE, MORNING_HOUR_END); + currentTimeBlend.altWeight = (DEFAULT_WEIGHT - currentTimeBlend.weight) / 2 + (DEFAULT_WEIGHT / 2); + gTimeOfDay = TIME_MORNING; } - else if (hours < 18) // day - { - currentTimeBlend.weight = currentTimeBlend.altWeight = 256; - gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_DAY; - } - else if (hours < 20) // evening + else if (IsBetweenHours(hours, EVENING_HOUR_BEGIN, EVENING_HOUR_END)) // evening { currentTimeBlend.time0 = TIME_DAY; currentTimeBlend.time1 = TIME_EVENING; - currentTimeBlend.weight = 256 - 256 * ((hours - 18) * 60 + minutes) / ((20-18)*60); - currentTimeBlend.altWeight = currentTimeBlend.weight / 2 + 128; + currentTimeBlend.weight = TIME_BLEND_WEIGHT(EVENING_HOUR_BEGIN, EVENING_HOUR_END); + currentTimeBlend.altWeight = currentTimeBlend.weight / 2 + (DEFAULT_WEIGHT / 2); gTimeOfDay = TIME_EVENING; } - else if (hours < 22) // evening->night + else if (IsBetweenHours(hours, NIGHT_HOUR_BEGIN, NIGHT_HOUR_BEGIN + 1)) // evening->night { currentTimeBlend.time0 = TIME_EVENING; currentTimeBlend.time1 = TIME_NIGHT; - currentTimeBlend.weight = 256 - 256 * ((hours - 20) * 60 + minutes) / ((22-20)*60); + currentTimeBlend.weight = TIME_BLEND_WEIGHT(NIGHT_HOUR_BEGIN, NIGHT_HOUR_BEGIN + 1); currentTimeBlend.altWeight = currentTimeBlend.weight / 2; gTimeOfDay = TIME_NIGHT; } - else // 22-24, night + else if (IsBetweenHours(hours, NIGHT_HOUR_BEGIN, NIGHT_HOUR_END)) // night { - currentTimeBlend.weight = 256; + currentTimeBlend.weight = DEFAULT_WEIGHT; currentTimeBlend.altWeight = 0; gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_NIGHT; } - return gTimeOfDay; + else // day + { + currentTimeBlend.weight = currentTimeBlend.altWeight = DEFAULT_WEIGHT; + gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_DAY; + } } +#undef TIME_BLEND_WEIGHT + // Whether a map type is naturally lit/outside bool8 MapHasNaturalLight(u8 mapType) { From f913f2884bd0905729bd8f6d905018e6debb63d6 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 8 Oct 2024 12:21:06 -0300 Subject: [PATCH 107/145] Add config for shadow intensity --- include/config/overworld.h | 5 ++++- include/constants/field_weather.h | 4 ++++ src/field_weather.c | 2 +- src/field_weather_effect.c | 14 ++++++++------ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/include/config/overworld.h b/include/config/overworld.h index 3298a03209..0762197c7b 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -72,11 +72,14 @@ // These generational defines only make a distinction for OW_ALTERED_TIME_RATIO #define GEN_8_PLA GEN_LATEST + 2 -//Time +// Time #define OW_TIMES_OF_DAY GEN_LATEST // Different generations have the times of day change at different times. #define OW_USE_FAKE_RTC FALSE // When TRUE, seconds on the in-game clock will only advance once every 60 playTimeVBlanks (every 60 frames). #define OW_ALTERED_TIME_RATIO GEN_LATEST // In GEN_8_PLA, the time in game moves forward 60 seconds for every second in the RTC. In GEN_9, it is 20 seconds. This has no effect if OW_USE_FAKE_RTC is FALSE. +// Lighting +#define OW_SHADOW_INTENSITY 4 // Ranges from 0 to 16, where 0 is fully transparent and 16 is black. + // Overworld flags // To use the following features in scripting, replace the 0s with the flag ID you're assigning it to. // Eg: Replace with FLAG_UNUSED_0x264 so you can use that flag to toggle the feature. diff --git a/include/constants/field_weather.h b/include/constants/field_weather.h index fe7eb6a1ae..bc4826ee36 100644 --- a/include/constants/field_weather.h +++ b/include/constants/field_weather.h @@ -1,6 +1,8 @@ #ifndef GUARD_CONSTANTS_FIELD_WEATHER_H #define GUARD_CONSTANTS_FIELD_WEATHER_H +#include "config/overworld.h" + #define MAX_RAIN_SPRITES 24 #define NUM_CLOUD_SPRITES 3 #define NUM_FOG_HORIZONTAL_SPRITES 20 @@ -22,4 +24,6 @@ #define FADE_FROM_WHITE 2 #define FADE_TO_WHITE 3 +#define BASE_SHADOW_INTENSITY (16 - OW_SHADOW_INTENSITY) + #endif // GUARD_CONSTANTS_FIELD_WEATHER_H diff --git a/src/field_weather.c b/src/field_weather.c index 2322550780..d3ca7ee052 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -301,7 +301,7 @@ static void Task_WeatherMain(u8 taskId) static void None_Init(void) { - Weather_SetBlendCoeffs(8, 12); // Indoor shadows + Weather_SetBlendCoeffs(8, BASE_SHADOW_INTENSITY); // Indoor shadows gWeatherPtr->noShadows = FALSE; gWeatherPtr->targetColorMapIndex = 0; gWeatherPtr->colorMapStepDelay = 0; diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index 724ad76ae8..f7203ab445 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -153,11 +153,13 @@ bool8 Clouds_Finish(void) return FALSE; } +STATIC_ASSERT(OW_SHADOW_INTENSITY >= 0 && OW_SHADOW_INTENSITY <= 16, ObjEventShadowTransparencyNotInRange) + void Sunny_InitVars(void) { gWeatherPtr->targetColorMapIndex = 0; gWeatherPtr->colorMapStepDelay = 20; - Weather_SetBlendCoeffs(8, 12); + Weather_SetBlendCoeffs(8, BASE_SHADOW_INTENSITY); // preserve shadow darkness gWeatherPtr->noShadows = FALSE; } @@ -485,7 +487,7 @@ void Rain_InitVars(void) gWeatherPtr->targetColorMapIndex = 3; gWeatherPtr->colorMapStepDelay = 20; SetRainStrengthFromSoundEffect(SE_RAIN); - Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness + Weather_SetBlendCoeffs(8, BASE_SHADOW_INTENSITY); // preserve shadow darkness gWeatherPtr->noShadows = FALSE; } @@ -780,7 +782,7 @@ void Snow_InitVars(void) gWeatherPtr->colorMapStepDelay = 20; gWeatherPtr->targetSnowflakeSpriteCount = NUM_SNOWFLAKE_SPRITES; gWeatherPtr->snowflakeVisibleCounter = 0; - Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness + Weather_SetBlendCoeffs(8, BASE_SHADOW_INTENSITY); // preserve shadow darkness gWeatherPtr->noShadows = FALSE; } @@ -1029,7 +1031,7 @@ void Thunderstorm_InitVars(void) gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment gWeatherPtr->thunderEnqueued = FALSE; SetRainStrengthFromSoundEffect(SE_THUNDERSTORM); - Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness + Weather_SetBlendCoeffs(8, BASE_SHADOW_INTENSITY); // preserve shadow darkness gWeatherPtr->noShadows = FALSE; } @@ -1059,7 +1061,7 @@ void Downpour_InitVars(void) gWeatherPtr->colorMapStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment SetRainStrengthFromSoundEffect(SE_DOWNPOUR); - Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness + Weather_SetBlendCoeffs(8, BASE_SHADOW_INTENSITY); // preserve shadow darkness gWeatherPtr->noShadows = FALSE; } @@ -2272,7 +2274,7 @@ void Shade_InitVars(void) gWeatherPtr->initStep = 0; gWeatherPtr->targetColorMapIndex = 3; gWeatherPtr->colorMapStepDelay = 20; - Weather_SetBlendCoeffs(8, 12); // preserve shadow darkness + Weather_SetBlendCoeffs(8, BASE_SHADOW_INTENSITY); // preserve shadow darkness gWeatherPtr->noShadows = FALSE; } From e68cdfeb3c50ac6c635a2f7f5b1d384d4edc0b48 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 8 Oct 2024 16:35:33 -0300 Subject: [PATCH 108/145] Fixed missing call to UpdateTimeOfDay in GetTimeOfDay for inside buildings check --- src/rtc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/rtc.c b/src/rtc.c index 9ec96350c8..ae5b3f9e8f 100644 --- a/src/rtc.c +++ b/src/rtc.c @@ -328,6 +328,7 @@ bool8 IsBetweenHours(s32 hours, s32 begin, s32 end) u8 GetTimeOfDay(void) { + UpdateTimeOfDay(); return gTimeOfDay; } From 458bd5ad4d450835692bba56178bffff9dbeac65 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 5 Dec 2024 07:56:49 -0300 Subject: [PATCH 109/145] Review changes pt 1 --- dev_scripts/followers/follower_emotions.py | 2 +- include/constants/event_objects.h | 4 +-- include/field_weather.h | 1 - include/overworld.h | 14 +++++----- include/palette.h | 15 +++++----- src/battle_transition.c | 9 +++--- src/contest_effect.c | 28 +++++++++---------- .../object_event_graphics_info_pointers.h | 2 +- src/data/tilesets/headers.h | 3 +- src/event_object_movement.c | 10 +++---- src/field_effect.c | 1 - src/field_screen_effect.c | 2 +- src/field_weather.c | 16 ++++------- src/field_weather_effect.c | 13 ++++----- src/follower_helper.c | 22 +++++++++------ src/overworld.c | 8 +++--- src/pokemon_summary_screen.c | 2 +- src/trainer_see.c | 4 --- 18 files changed, 75 insertions(+), 81 deletions(-) diff --git a/dev_scripts/followers/follower_emotions.py b/dev_scripts/followers/follower_emotions.py index ff04b048a0..5226348031 100644 --- a/dev_scripts/followers/follower_emotions.py +++ b/dev_scripts/followers/follower_emotions.py @@ -47,4 +47,4 @@ def export_messages(infile, outfile, n=None, indent=0, start=0): if __name__ == '__main__': - export_messages('emotions.txt', 'emotions.h', n=4, start=42) + export_messages('emotions.txt', 'emotions.h', n=1, start=7) diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 4c71eff6d2..4005a253b1 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -242,12 +242,12 @@ #define OBJ_EVENT_GFX_HOOH 238 #define OBJ_EVENT_GFX_POKE_BALL 239 #define OBJ_EVENT_GFX_OW_MON 240 -#define OBJ_EVENT_GFX_LIGHT_SPRITE OBJ_EVENT_GFX_QUINTY_PLUMP +#define OBJ_EVENT_GFX_LIGHT_SPRITE 241 // NOTE: The maximum amount of object events has been expanded from 255 to 65535. // Since dynamic graphics ids still require at least 16 free values, the actual limit // is 65519, but even considering follower Pokémon, this should be more than enough :) -#define NUM_OBJ_EVENT_GFX 241 +#define NUM_OBJ_EVENT_GFX 242 // These are dynamic object gfx ids. diff --git a/include/field_weather.h b/include/field_weather.h index 6b08fd418c..104ac6ea4b 100644 --- a/include/field_weather.h +++ b/include/field_weather.h @@ -152,7 +152,6 @@ void ApplyWeatherColorMapIfIdle_Gradual(u8 colorMapIndex, u8 targetColorMapIndex void FadeScreen(u8 mode, s8 delay); bool8 IsWeatherNotFadingIn(void); void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog); -void ApplyWeatherColorMapToPal(u8 paletteIndex); void ApplyWeatherColorMapToPals(u8 startPalIndex, u8 numPalettes); void LoadCustomWeatherSpritePalette(const u16 *palette); void ResetDroughtWeatherPaletteLoading(void); diff --git a/include/overworld.h b/include/overworld.h index 49f75e64ec..328655ecda 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -40,15 +40,15 @@ struct LinkPlayerObjectEvent u8 movementMode; }; -struct __attribute__((packed)) TimeBlendSettings { - u16 weight:9; - u16 time1:3; - u16 time0:3; - u16 unused:1; - u16 altWeight; +struct __attribute__((packed)) TimeBlendSettings +{ + u16 weight:9; + u16 time1:3; + u16 time0:3; + u16 unused:1; + u16 altWeight; }; -// Exported RAM declarations extern struct WarpData gLastUsedWarp; extern struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4]; diff --git a/include/palette.h b/include/palette.h index 92735dff12..ba32c30344 100644 --- a/include/palette.h +++ b/include/palette.h @@ -26,8 +26,7 @@ #define OBJ_PLTT_ID(n) (OBJ_PLTT_OFFSET + PLTT_ID(n)) #define OBJ_PLTT_ID2(n) (PLTT_ID((n) + 16)) -// Used to determine whether a sprite palette tag -// should be excluded from time (and weather) blending +// Used to determine whether a sprite palette tag should be excluded from time (and weather) blending #define BLEND_IMMUNE_FLAG (1 << 15) #define IS_BLEND_IMMUNE_TAG(tag) ((tag) & BLEND_IMMUNE_FLAG) @@ -39,10 +38,12 @@ enum FAST_FADE_OUT_TO_BLACK, }; -struct BlendSettings { - u32 blendColor:24; - u32 isTint:1; - u32 coeff:5; +struct BlendSettings +{ + u32 blendColor:24; + u32 isTint:1; + u32 coeff:5; + u32 unused:2; }; struct PaletteFadeControl @@ -84,7 +85,7 @@ void TransferPlttBuffer(void); u32 UpdatePaletteFade(void); void ResetPaletteFade(void); bool32 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u32 blendColor); -bool32 BeginTimeOfDayPaletteFade(u32, s8, u8, u8, struct BlendSettings *, struct BlendSettings *, u32, u32); +bool32 BeginTimeOfDayPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, struct BlendSettings *bld0, struct BlendSettings *bld1, u32 weight, u32 color); void PaletteStruct_ResetById(u32 id); void ResetPaletteFadeControl(void); void InvertPlttBuffer(u32 selectedPalettes); diff --git a/src/battle_transition.c b/src/battle_transition.c index 297bb54491..422257433c 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -1355,7 +1355,7 @@ static void InitPatternWeaveTransition(struct Task *task) sTransitionData->WIN0V = DISPLAY_HEIGHT; sTransitionData->BLDCNT = BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL; sTransitionData->BLDALPHA = BLDALPHA_BLEND(task->tBlendTarget2, task->tBlendTarget1); - UpdateShadowColor(0x3DEF); // force shadows to gray + UpdateShadowColor(RGB(15, 15, 15)); // force shadows to gray for (i = 0; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[1][i] = DISPLAY_WIDTH; @@ -3916,10 +3916,9 @@ void Task_BattleTransition_Intro(u8 taskId) static bool8 TransitionIntro_FadeToGray(struct Task *task) { u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); - u16 index = (paletteNum+16)*16+9; // SHADOW_COLOR_INDEX + u16 index = OBJ_PLTT_ID(paletteNum) + 9; // SHADOW_COLOR_INDEX if (task->tDelayTimer == 0 || --task->tDelayTimer == 0) { - task->tDelayTimer = task->tFadeToGrayDelay; task->tBlend += task->tFadeToGrayIncrement; if (task->tBlend > 16) @@ -3958,7 +3957,7 @@ static bool8 TransitionIntro_FadeFromGray(struct Task *task) SetGpuReg(REG_OFFSET_BLDCNT, task->tBldCntSaved); if (paletteNum < 16) { - u16 index = ((paletteNum + 16) * 16) + 9; // SHADOW_COLOR_INDEX + u16 index = OBJ_PLTT_ID(paletteNum) + 9; // SHADOW_COLOR_INDEX gPlttBufferFaded[index] = task->tShadowColor; } } @@ -4253,7 +4252,7 @@ static bool8 FrontierLogoWave_Init(struct Task *task) LZ77UnCompVram(sFrontierLogo_Tileset, tileset); LoadPalette(sFrontierLogo_Palette, BG_PLTT_ID(15), sizeof(sFrontierLogo_Palette)); sTransitionData->cameraY = 0; - UpdateShadowColor(0x3DEF); // force shadows to gray + UpdateShadowColor(RGB(15, 15, 15)); // force shadows to gray task->tState++; return FALSE; diff --git a/src/contest_effect.c b/src/contest_effect.c index e6735a8698..4d58170d0d 100644 --- a/src/contest_effect.c +++ b/src/contest_effect.c @@ -132,7 +132,7 @@ static void ContestEffect_UserLessEasilyStartled(void) SetContestantEffectStringID(eContestAppealResults.contestant,CONTEST_STRING_STOPPED_CARING); } -// Slightly startles the POK�MON in front. +// Slightly startles the POKéMON in front. static void ContestEffect_StartleFrontMon(void) { u8 idx = 0; @@ -180,7 +180,7 @@ static void ContestEffect_StartlePrevMons(void) SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Startles the POK�MON that appealed before the user. +// Startles the POKéMON that appealed before the user. static void ContestEffect_StartlePrevMon2(void) { u8 rval = Random() % 10; @@ -197,7 +197,7 @@ static void ContestEffect_StartlePrevMon2(void) ContestEffect_StartleFrontMon(); } -// Startles all POK�MON that appealed before the user. +// Startles all POKéMON that appealed before the user. static void ContestEffect_StartlePrevMons2(void) { u8 numStartled = 0; @@ -273,7 +273,7 @@ static void ContestEffect_ShiftJudgeAttention(void) } } -// Startles the POK�MON that has the JUDGE's attention. +// Startles the POKéMON that has the JUDGE's attention. static void ContestEffect_StartleMonWithJudgesAttention(void) { u8 numStartled = 0; @@ -311,7 +311,7 @@ static void ContestEffect_JamsOthersButMissOneTurn(void) SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Startles POK�MON that made a same-type appeal. +// Startles POKéMON that made a same-type appeal. static void ContestEffect_StartleMonsSameTypeAppeal(void) { u16 move = eContestantStatus[eContestAppealResults.contestant].currMove; @@ -319,42 +319,42 @@ static void ContestEffect_StartleMonsSameTypeAppeal(void) SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POK�MON that made COOL appeals. +// Badly startles POKéMON that made COOL appeals. static void ContestEffect_StartleMonsCoolAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_COOL); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POK�MON that made BEAUTY appeals. +// Badly startles POKéMON that made BEAUTY appeals. static void ContestEffect_StartleMonsBeautyAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_BEAUTY); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POK�MON that made CUTE appeals. +// Badly startles POKéMON that made CUTE appeals. static void ContestEffect_StartleMonsCuteAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_CUTE); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POK�MON that made SMART appeals. +// Badly startles POKéMON that made SMART appeals. static void ContestEffect_StartleMonsSmartAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_SMART); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POK�MON that made TOUGH appeals. +// Badly startles POKéMON that made TOUGH appeals. static void ContestEffect_StartleMonsToughAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_TOUGH); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Makes one POK�MON after the user nervous. +// Makes one POKéMON after the user nervous. static void ContestEffect_MakeFollowingMonNervous(void) { bool32 hitAny = FALSE; @@ -386,7 +386,7 @@ static void ContestEffect_MakeFollowingMonNervous(void) SetContestantEffectStringID2(eContestAppealResults.contestant, CONTEST_STRING_MESSED_UP2); } -// Makes all POK�MON after the user nervous. +// Makes all POKéMON after the user nervous. static void ContestEffect_MakeFollowingMonsNervous(void) { u8 numUnnerved = 0; @@ -493,7 +493,7 @@ static void ContestEffect_WorsenConditionOfPrevMons(void) SetContestantEffectStringID2(eContestAppealResults.contestant, CONTEST_STRING_IGNORED); } -// Badly startles POK�MON in good condition. +// Badly startles POKéMON in good condition. static void ContestEffect_BadlyStartlesMonsInGoodCondition(void) { u8 numHit = 0; @@ -895,7 +895,7 @@ static void ContestEffect_ExciteAudienceInAnyContest(void) } } -// Badly startles all POK�MON that made good appeals. +// Badly startles all POKéMON that made good appeals. static void ContestEffect_BadlyStartleMonsWithGoodAppeals(void) { int i; diff --git a/src/data/object_events/object_event_graphics_info_pointers.h b/src/data/object_events/object_event_graphics_info_pointers.h index 02ea26e402..117187739b 100644 --- a/src/data/object_events/object_event_graphics_info_pointers.h +++ b/src/data/object_events/object_event_graphics_info_pointers.h @@ -254,7 +254,7 @@ const struct ObjectEventGraphicsInfo *const gObjectEventGraphicsInfoPointers[NUM [OBJ_EVENT_GFX_BRENDAN_MACH_BIKE] = &gObjectEventGraphicsInfo_BrendanMachBike, [OBJ_EVENT_GFX_BRENDAN_SURFING] = &gObjectEventGraphicsInfo_BrendanSurfing, [OBJ_EVENT_GFX_BRENDAN_FIELD_MOVE] = &gObjectEventGraphicsInfo_BrendanFieldMove, - // [OBJ_EVENT_GFX_QUINTY_PLUMP] = &gObjectEventGraphicsInfo_QuintyPlump, + [OBJ_EVENT_GFX_QUINTY_PLUMP] = &gObjectEventGraphicsInfo_QuintyPlump, [OBJ_EVENT_GFX_NINJA_BOY] = &gObjectEventGraphicsInfo_NinjaBoy, [OBJ_EVENT_GFX_TWIN] = &gObjectEventGraphicsInfo_Twin, [OBJ_EVENT_GFX_BOY_1] = &gObjectEventGraphicsInfo_Boy1, diff --git a/src/data/tilesets/headers.h b/src/data/tilesets/headers.h index 4144369af8..f72eeebc42 100644 --- a/src/data/tilesets/headers.h +++ b/src/data/tilesets/headers.h @@ -9,8 +9,7 @@ // The old method *should* still work, however. // See the README for details. -// Whether a palette has lights -// the color indices to blend are stored in the palette's color 0 +// Whether a palette has lights the color indices to blend are stored in the palette's color 0 #define LIGHT_PAL(x) ((x) < NUM_PALS_IN_PRIMARY ? 1 << (x) : 1 << ((x) - NUM_PALS_IN_PRIMARY)) const struct Tileset gTileset_General = diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 68e4288ee0..8c6856fcfa 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2632,7 +2632,7 @@ void UpdateLightSprite(struct Sprite *sprite) DestroySprite(sprite); FieldEffectFreeTilesIfUnused(sheetTileStart); FieldEffectFreePaletteIfUnused(paletteNum); - Weather_SetBlendCoeffs(7, 12); // TODO: Restore original blend coeffs at dawn + Weather_SetBlendCoeffs(7, BASE_SHADOW_INTENSITY); // TODO: Restore original blend coeffs at dawn return; } @@ -2647,25 +2647,25 @@ void UpdateLightSprite(struct Sprite *sprite) case 0: if (gPaletteFade.active) // if palette fade is active, don't flicker since the timer won't be updated { - Weather_SetBlendCoeffs(7, 12); + Weather_SetBlendCoeffs(7, BASE_SHADOW_INTENSITY); sprite->invisible = FALSE; } else if (gPlayerAvatar.tileTransitionState) { - Weather_SetBlendCoeffs(7, 12); // As long as the second coefficient stays 12, shadows will not change + Weather_SetBlendCoeffs(7, BASE_SHADOW_INTENSITY); // As long as the second coefficient stays 12, shadows will not change sprite->invisible = FALSE; if (GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum) == OBJ_EVENT_PAL_TAG_LIGHT_2) LoadSpritePaletteInSlot(&sObjectEventSpritePalettes[FindObjectEventPaletteIndexByTag(OBJ_EVENT_PAL_TAG_LIGHT)], sprite->oam.paletteNum); } else if ((sprite->invisible = gTimeUpdateCounter & 1)) { - Weather_SetBlendCoeffs(12, 12); + Weather_SetBlendCoeffs(12, BASE_SHADOW_INTENSITY); if (GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum) == OBJ_EVENT_PAL_TAG_LIGHT) LoadSpritePaletteInSlot(&sObjectEventSpritePalettes[FindObjectEventPaletteIndexByTag(OBJ_EVENT_PAL_TAG_LIGHT_2)], sprite->oam.paletteNum); } break; case 1 ... 2: - Weather_SetBlendCoeffs(12, 12); + Weather_SetBlendCoeffs(12, BASE_SHADOW_INTENSITY); sprite->invisible = FALSE; break; } diff --git a/src/field_effect.c b/src/field_effect.c index 9c85771397..dbec7df119 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -918,7 +918,6 @@ u8 AddNewGameBirchObject(s16 x, s16 y, u8 subpriority) return CreateSprite(&sSpriteTemplate_NewGameBirch, x, y, subpriority); } - u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) { s32 spriteId = CreateMonPicSprite(species, FALSE, 0x8000, TRUE, x, y, 0, species); diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index 6642e474e0..553f68c874 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -1156,7 +1156,7 @@ static void Task_OrbEffect(u8 taskId) ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON); SetGpuRegBits(REG_OFFSET_BLDCNT, gOrbEffectBackgroundLayerFlags[0]); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 7)); - UpdateShadowColor(0x2109); // force shadows to gray + UpdateShadowColor(RGB(9, 8, 8)); // force shadows to gray SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ); SetBgTilemapPalette(0, 0, 0, DISPLAY_TILE_WIDTH, DISPLAY_TILE_HEIGHT, 0xF); diff --git a/src/field_weather.c b/src/field_weather.c index d3ca7ee052..485f63c0f0 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -446,16 +446,16 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) u32 palettes = PALETTES_ALL; numPalettes += startPalIndex; palettes = (palettes >> startPalIndex) << startPalIndex; - palettes = (palettes << (32-numPalettes)) >> (32-numPalettes); + palettes = (palettes << (32 - numPalettes)) >> (32 - numPalettes); numPalettes -= startPalIndex; colorMapIndex--; palOffset = PLTT_ID(startPalIndex); UpdateAltBgPalettes(palettes & PALETTES_BG); // Thunder gamma-shift looks bad on night-blended palettes, so ignore time blending in some situations - if (!(colorMapIndex > 3) && MapHasNaturalLight(gMapHeader.mapType)) - UpdatePalettesWithTime(palettes); + if (colorMapIndex <= 3 && MapHasNaturalLight(gMapHeader.mapType)) + UpdatePalettesWithTime(palettes); else - CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, PLTT_SIZE_4BPP * numPalettes); + CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, PLTT_SIZE_4BPP * numPalettes); numPalettes += startPalIndex; curPalIndex = startPalIndex; @@ -808,6 +808,7 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog) { u16 paletteIndex = 16 + spritePaletteIndex; u16 i; + switch (gWeatherPtr->palProcessingState) { case WEATHER_PAL_STATE_SCREEN_FADING_IN: @@ -862,16 +863,11 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog) if (gPaletteFade.y == 16) CpuFastCopy( gPlttBufferUnfaded + OBJ_PLTT_ID(spritePaletteIndex), - gDecompressionBuffer + 2*OBJ_PLTT_ID(spritePaletteIndex), + gDecompressionBuffer + 2 * OBJ_PLTT_ID(spritePaletteIndex), PLTT_SIZE_4BPP ); } -void ApplyWeatherColorMapToPal(u8 paletteIndex) // now unused / obselete -{ - ApplyColorMap(paletteIndex, 1, gWeatherPtr->colorMapIndex); -} - void ApplyWeatherColorMapToPals(u8 startPalIndex, u8 numPalettes) { ApplyColorMap(startPalIndex, numPalettes, gWeatherPtr->colorMapIndex); diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index f7203ab445..2ac3a2f52a 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -1366,13 +1366,13 @@ u8 UpdateShadowColor(u16 color) u16 blendedColor; if (paletteNum < 16) { - u16 index = OBJ_PLTT_ID(paletteNum)+SHADOW_COLOR_INDEX; + u16 index = OBJ_PLTT_ID(paletteNum) + SHADOW_COLOR_INDEX; gPlttBufferUnfaded[index] = gPlttBufferFaded[index] = color; // Copy to temporary buffer, blend, and keep just the shadow color index - CpuFastCopy(&gPlttBufferFaded[index-SHADOW_COLOR_INDEX], tempBuffer, PLTT_SIZE_4BPP); + CpuFastCopy(&gPlttBufferFaded[index - SHADOW_COLOR_INDEX], tempBuffer, PLTT_SIZE_4BPP); UpdateSpritePaletteWithTime(paletteNum); blendedColor = gPlttBufferFaded[index]; - CpuFastCopy(tempBuffer, &gPlttBufferFaded[index-SHADOW_COLOR_INDEX], PLTT_SIZE_4BPP); + CpuFastCopy(tempBuffer, &gPlttBufferFaded[index - SHADOW_COLOR_INDEX], PLTT_SIZE_4BPP); gPlttBufferFaded[index] = blendedColor; } return paletteNum; @@ -1416,7 +1416,7 @@ void FogHorizontal_Main(void) if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) { Weather_SetTargetBlendCoeffs(12, 8, 3); - UpdateShadowColor(0x3DEF); // Gray + UpdateShadowColor(RGB(15, 15, 15)); // Gray } else { @@ -1549,8 +1549,7 @@ void Ash_InitVars(void) gWeatherPtr->ashUnused = 20; // Never read if (!gWeatherPtr->ashSpritesCreated) { - Weather_SetBlendCoeffs(0, 12); - // SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(64, 63)); // These aren't valid blend coefficients! + Weather_SetBlendCoeffs(0, BASE_SHADOW_INTENSITY); } gWeatherPtr->noShadows = FALSE; } @@ -2009,7 +2008,7 @@ void Sandstorm_Main(void) break; case 1: Weather_SetTargetBlendCoeffs(16, 2, 0); - UpdateShadowColor(0x3DEF); + UpdateShadowColor(RGB(15, 15, 15)); gWeatherPtr->initStep++; break; case 2: diff --git a/src/follower_helper.c b/src/follower_helper.c index 26e9f25fab..76481bb75f 100644 --- a/src/follower_helper.c +++ b/src/follower_helper.c @@ -360,17 +360,23 @@ const struct FollowerMsgInfoExtended gFollowerConditionalMessages[COND_MSG_COUNT }, [COND_MSG_DAY] = { - .text = (u8*)sDayTexts, - .textSpread = 1, - .emotion = FOLLOWER_EMOTION_MUSIC, - .conditions = {MATCH_TIME_OF_DAY(TIME_DAY)}, + .text = (u8*)sDayTexts, + .textSpread = 1, + .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = + { + MATCH_TIME_OF_DAY(TIME_DAY), + }, }, [COND_MSG_NIGHT] = { - .text = (u8*)sNightTexts, - .textSpread = 1, - .emotion = FOLLOWER_EMOTION_MUSIC, - .conditions = {MATCH_TIME_OF_DAY(TIME_NIGHT)}, + .text = (u8*)sNightTexts, + .textSpread = 1, + .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = + { + MATCH_TIME_OF_DAY(TIME_NIGHT), + }, }, }; diff --git a/src/overworld.c b/src/overworld.c index f516ebdccd..c2eaa27003 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1539,9 +1539,9 @@ void CB1_Overworld(void) const struct BlendSettings gTimeOfDayBlend[] = { - [TIME_MORNING] = {.coeff = 4, .blendColor = 0xA8B0E0, .isTint = TRUE}, // Originally TIME_OF_DAY_TWILIGHT + [TIME_MORNING] = {.coeff = 4, .blendColor = 0xA8B0E0, .isTint = TRUE}, [TIME_DAY] = {.coeff = 0, .blendColor = 0, .isTint = FALSE}, - [TIME_EVENING] = {.coeff = 4, .blendColor = 0xA8B0E0, .isTint = TRUE}, // Originally TIME_OF_DAY_TWILIGHT + [TIME_EVENING] = {.coeff = 4, .blendColor = 0xA8B0E0, .isTint = TRUE}, [TIME_NIGHT] = {.coeff = 10, .blendColor = TINT_NIGHT, .isTint = TRUE}, }; @@ -1707,8 +1707,8 @@ static void OverworldBasic(void) UpdateTimeOfDay(); FormChangeTimeUpdate(); if (cachedBlend.time0 != currentTimeBlend.time0 - || cachedBlend.time1 != currentTimeBlend.time1 - || cachedBlend.weight != currentTimeBlend.weight) + || cachedBlend.time1 != currentTimeBlend.time1 + || cachedBlend.weight != currentTimeBlend.weight) { UpdateAltBgPalettes(PALETTES_BG); UpdatePalettesWithTime(PALETTES_ALL); diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 4cfc17c707..735bc84850 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -3959,7 +3959,7 @@ static void SetSpriteInvisibility(u8 spriteArrayId, bool8 invisible) static void HidePageSpecificSprites(void) { - // Keeps Pok�mon, caught ball and status sprites visible. + // Keeps POKéMON, caught ball and status sprites visible. u8 i; for (i = SPRITE_ARR_ID_TYPE; i < ARRAY_COUNT(sMonSummaryScreen->spriteIds); i++) diff --git a/src/trainer_see.c b/src/trainer_see.c index e7030bbc26..2582637aa1 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -321,10 +321,6 @@ static const union AnimCmd *const sSpriteAnimTable_Emotes[] = sSpriteAnim_Emotes10, }; -// TODO: Move these declarations into even_object_movement.h -#define OBJ_EVENT_PAL_TAG_MAY 0x1110 -#define OBJ_EVENT_PAL_TAG_EMOTES 0x8003 - static const struct SpriteTemplate sSpriteTemplate_ExclamationQuestionMark = { .tileTag = TAG_NONE, From 1e6628b78dbd87a5b0507ea4d656181f238ec755 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 21 Dec 2024 10:49:59 -0300 Subject: [PATCH 110/145] Address Review comments Pt2 --- data/maps/DewfordTown/map.json | 2 +- data/maps/EverGrandeCity/map.json | 2 +- data/maps/LilycoveCity/map.json | 2 +- data/maps/MauvilleCity/map.json | 4 ++-- data/maps/MossdeepCity/map.json | 4 ++-- data/maps/PacifidlogTown/map.json | 2 +- data/maps/PetalburgCity/map.json | 4 ++-- data/maps/Route102/map.json | 2 +- data/maps/RustboroCity/map.json | 34 +++++++++++++++---------------- data/maps/SlateportCity/map.json | 4 ++-- data/maps/VerdanturfTown/map.json | 4 ++-- include/constants/event_objects.h | 4 ++++ include/palette.h | 34 ++++++++++++++++--------------- include/rtc.h | 2 +- src/event_object_movement.c | 34 ++++++++++++++++++------------- src/field_effect.c | 2 +- 16 files changed, 76 insertions(+), 64 deletions(-) diff --git a/data/maps/DewfordTown/map.json b/data/maps/DewfordTown/map.json index 114dc72995..4ad6364593 100644 --- a/data/maps/DewfordTown/map.json +++ b/data/maps/DewfordTown/map.json @@ -99,7 +99,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "1", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", "script": "NULL", "flag": "0" } diff --git a/data/maps/EverGrandeCity/map.json b/data/maps/EverGrandeCity/map.json index 80b681021e..86ad3a91b3 100644 --- a/data/maps/EverGrandeCity/map.json +++ b/data/maps/EverGrandeCity/map.json @@ -29,7 +29,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "1", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", "script": "NULL", "flag": "0" } diff --git a/data/maps/LilycoveCity/map.json b/data/maps/LilycoveCity/map.json index 72cbce4553..1b9004eaa5 100644 --- a/data/maps/LilycoveCity/map.json +++ b/data/maps/LilycoveCity/map.json @@ -320,7 +320,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "1", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", "script": "NULL", "flag": "0" } diff --git a/data/maps/MauvilleCity/map.json b/data/maps/MauvilleCity/map.json index b2a3238d1b..1ebe629476 100644 --- a/data/maps/MauvilleCity/map.json +++ b/data/maps/MauvilleCity/map.json @@ -187,7 +187,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "1", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", "script": "NULL", "flag": "0" }, @@ -200,7 +200,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "2", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_POKE_MART_SIGN", "script": "NULL", "flag": "0" } diff --git a/data/maps/MossdeepCity/map.json b/data/maps/MossdeepCity/map.json index 9574ab4398..4891f9968a 100644 --- a/data/maps/MossdeepCity/map.json +++ b/data/maps/MossdeepCity/map.json @@ -260,7 +260,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "1", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", "script": "NULL", "flag": "0" }, @@ -273,7 +273,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "2", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_POKE_MART_SIGN", "script": "NULL", "flag": "0" } diff --git a/data/maps/PacifidlogTown/map.json b/data/maps/PacifidlogTown/map.json index e6a1d06c73..2a06e4aca7 100644 --- a/data/maps/PacifidlogTown/map.json +++ b/data/maps/PacifidlogTown/map.json @@ -73,7 +73,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "1", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", "script": "NULL", "flag": "0" } diff --git a/data/maps/PetalburgCity/map.json b/data/maps/PetalburgCity/map.json index 902f53bce4..54bae3539c 100644 --- a/data/maps/PetalburgCity/map.json +++ b/data/maps/PetalburgCity/map.json @@ -151,7 +151,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "1", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", "script": "NULL", "flag": "0" }, @@ -164,7 +164,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "2", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_POKE_MART_SIGN", "script": "NULL", "flag": "0" } diff --git a/data/maps/Route102/map.json b/data/maps/Route102/map.json index 8e3d206c76..3a1726751b 100644 --- a/data/maps/Route102/map.json +++ b/data/maps/Route102/map.json @@ -151,7 +151,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "2", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_POKE_MART_SIGN", "script": "NULL", "flag": "0" } diff --git a/data/maps/RustboroCity/map.json b/data/maps/RustboroCity/map.json index 40d4f6f8fa..a32ce7d610 100644 --- a/data/maps/RustboroCity/map.json +++ b/data/maps/RustboroCity/map.json @@ -247,7 +247,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -260,7 +260,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -273,7 +273,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -286,7 +286,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -299,7 +299,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -312,7 +312,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -325,7 +325,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -338,7 +338,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -351,7 +351,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -364,7 +364,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -377,7 +377,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -390,7 +390,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -403,7 +403,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -416,7 +416,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -429,7 +429,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -442,7 +442,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" }, @@ -455,7 +455,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "0", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", "script": "NULL", "flag": "0" } diff --git a/data/maps/SlateportCity/map.json b/data/maps/SlateportCity/map.json index 7b002d2d9e..e2b6d47c67 100644 --- a/data/maps/SlateportCity/map.json +++ b/data/maps/SlateportCity/map.json @@ -494,7 +494,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "1", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", "script": "NULL", "flag": "0" }, @@ -507,7 +507,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "2", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_POKE_MART_SIGN", "script": "NULL", "flag": "0" } diff --git a/data/maps/VerdanturfTown/map.json b/data/maps/VerdanturfTown/map.json index 6e0b81cd7a..d2522517ab 100644 --- a/data/maps/VerdanturfTown/map.json +++ b/data/maps/VerdanturfTown/map.json @@ -86,7 +86,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "1", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", "script": "NULL", "flag": "0" }, @@ -99,7 +99,7 @@ "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "2", + "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_POKE_MART_SIGN", "script": "NULL", "flag": "0" } diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 4005a253b1..7f2adbaae6 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -302,6 +302,10 @@ #define TRACKS_SPOT 4 #define TRACKS_BUG 5 +#define LIGHT_TYPE_BALL 0 +#define LIGHT_TYPE_PKMN_CENTER_SIGN 1 +#define LIGHT_TYPE_POKE_MART_SIGN 2 + #define FIRST_DECORATION_SPRITE_GFX OBJ_EVENT_GFX_PICHU_DOLL #define OBJ_KIND_NORMAL 0 diff --git a/include/palette.h b/include/palette.h index ba32c30344..e127d7fe65 100644 --- a/include/palette.h +++ b/include/palette.h @@ -52,22 +52,24 @@ struct PaletteFadeControl // These three are only used for TOD blending struct BlendSettings *bld0; struct BlendSettings *bld1; - u16 weight:9; // [0, 256], so must be 9 bits - u8 delayCounter:6; - u16 y:5; // blend coefficient - u16 targetY:5; // target blend coefficient - u16 blendColor:15; - bool16 active:1; - u16 multipurpose2:6; - bool16 yDec:1; // whether blend coefficient is decreasing - bool16 bufferTransferDisabled:1; - u16 mode:2; - bool16 shouldResetBlendRegisters:1; - bool16 hardwareFadeFinishing:1; - u16 softwareFadeFinishingCounter:5; - bool16 softwareFadeFinishing:1; - bool16 objPaletteToggle:1; - u8 deltaY:4; // rate of change of blend coefficient + u32 weight:9; // [0, 256], so must be 9 bits + u32 delayCounter:6; + u32 y:5; // blend coefficient + u32 targetY:5; // target blend coefficient + u32 multipurpose2:6; + bool32 active:1; + u32 blendColor:15; + // end of word + bool32 yDec:1; // whether blend coefficient is decreasing + bool32 bufferTransferDisabled:1; + u32 mode:2; + bool32 shouldResetBlendRegisters:1; + bool32 hardwareFadeFinishing:1; + u32 softwareFadeFinishingCounter:5; + bool32 softwareFadeFinishing:1; + bool32 objPaletteToggle:1; + u32 deltaY:4; // rate of change of blend coefficient + u32 padding:15; }; extern const struct BlendSettings gTimeOfDayBlend[]; diff --git a/include/rtc.h b/include/rtc.h index c60e63deb1..bf8ff9aa93 100644 --- a/include/rtc.h +++ b/include/rtc.h @@ -18,7 +18,7 @@ #define RTC_ERR_FLAG_MASK 0x0FF0 //Morning and evening don't exist in Gen 3 -#if OW_TIMES_OF_DAY <= GEN_3 +#if OW_TIMES_OF_DAY == GEN_3 #define MORNING_HOUR_BEGIN 0 #define MORNING_HOUR_END 0 diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 8c6856fcfa..01b393aa76 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1870,7 +1870,9 @@ u8 CreateObjectGraphicsSpriteWithTag(u16 graphicsId, void (*callback)(struct Spr else if (spriteTemplate->paletteTag != TAG_NONE) { if (paletteTag == TAG_NONE) + { LoadObjectEventPalette(spriteTemplate->paletteTag); + } else { LoadObjectEventPaletteWithTag(spriteTemplate->paletteTag, paletteTag); @@ -2111,7 +2113,6 @@ static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny) if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog UpdateSpritePaletteWithWeather(paletteNum, FALSE); - return paletteNum; } @@ -2624,7 +2625,6 @@ void UpdateLightSprite(struct Sprite *sprite) s16 y = sprite->data[7]; u16 sheetTileStart; u32 paletteNum; - // Ripped from RemoveObjectEventIfOutsideView if (!(x >= left && x <= right && y >= top && y <= bottom)) { sheetTileStart = sprite->sheetTileStart; @@ -2644,7 +2644,8 @@ void UpdateLightSprite(struct Sprite *sprite) switch (sprite->data[5]) // lightType { - case 0: + default: + case LIGHT_TYPE_BALL: if (gPaletteFade.active) // if palette fade is active, don't flicker since the timer won't be updated { Weather_SetBlendCoeffs(7, BASE_SHADOW_INTENSITY); @@ -2664,7 +2665,8 @@ void UpdateLightSprite(struct Sprite *sprite) LoadSpritePaletteInSlot(&sObjectEventSpritePalettes[FindObjectEventPaletteIndexByTag(OBJ_EVENT_PAL_TAG_LIGHT_2)], sprite->oam.paletteNum); } break; - case 1 ... 2: + case LIGHT_TYPE_PKMN_CENTER_SIGN: + case LIGHT_TYPE_POKE_MART_SIGN: Weather_SetBlendCoeffs(12, BASE_SHADOW_INTENSITY); sprite->invisible = FALSE; break; @@ -2676,7 +2678,7 @@ static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) { struct Sprite *sprite; const struct SpriteTemplate *template; - u8 i; + u32 i; for (i = 0; i < MAX_SPRITES; i++) { sprite = &gSprites[i]; @@ -2700,27 +2702,29 @@ static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) sprite->coordOffsetEnabled = TRUE; switch (lightType) { - case 0: // Rustboro lanterns + default: + case LIGHT_TYPE_BALL: sprite->centerToCornerVecX = -(32 >> 1); sprite->centerToCornerVecY = -(32 >> 1); sprite->oam.priority = 1; - sprite->oam.objMode = 1; // BLEND + sprite->oam.objMode = ST_OAM_OBJ_BLEND; sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; sprite->x += 8; sprite->y += 22 + sprite->centerToCornerVecY; break; - case 1 ... 2: // Pokemon Center & mart + case LIGHT_TYPE_PKMN_CENTER_SIGN: + case LIGHT_TYPE_POKE_MART_SIGN: sprite->centerToCornerVecX = -(16 >> 1); sprite->centerToCornerVecY = -(16 >> 1); sprite->oam.priority = 2; sprite->subpriority = 0xFF; - sprite->oam.objMode = 1; // BLEND + sprite->oam.objMode = ST_OAM_OBJ_BLEND; } } void TrySpawnLightSprites(s16 camX, s16 camY) { - u8 i; + u32 i; u8 objectCount; s16 left = gSaveBlock1Ptr->pos.x - 2; s16 right = gSaveBlock1Ptr->pos.x + MAP_OFFSET_W + 2; @@ -2741,9 +2745,11 @@ void TrySpawnLightSprites(s16 camX, s16 camY) struct ObjectEventTemplate *template = &gSaveBlock1Ptr->objectEventTemplates[i]; s16 npcX = template->x + MAP_OFFSET; s16 npcY = template->y + MAP_OFFSET; - if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX && !FlagGet(template->flagId)) - if (template->graphicsId == OBJ_EVENT_GFX_LIGHT_SPRITE) // event is light sprite instead - SpawnLightSprite(npcX, npcY, camX, camY, template->trainerRange_berryTreeId); + if (top <= npcY && bottom >= npcY + && left <= npcX && right >= npcX + && !FlagGet(template->flagId) + && template->graphicsId == OBJ_EVENT_GFX_LIGHT_SPRITE) // event is light sprite instead + SpawnLightSprite(npcX, npcY, camX, camY, template->trainerRange_berryTreeId); } } @@ -10203,7 +10209,7 @@ static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite * if (flags & 1) sGroundEffectFuncs[i](objEvent, sprite); if (!(gWeatherPtr->noShadows || objEvent->inHotSprings || objEvent->inSandPile || MetatileBehavior_IsPuddle(objEvent->currentMetatileBehavior))) - GroundEffect_Shadow(objEvent, sprite); + GroundEffect_Shadow(objEvent, sprite); } void filters_out_some_ground_effects(struct ObjectEvent *objEvent, u32 *flags) diff --git a/src/field_effect.c b/src/field_effect.c index dbec7df119..cbe311753a 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -3302,7 +3302,7 @@ static void FlyOutFieldEffect_FlyOffWithBird(struct Task *task) struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; ObjectEventClearHeldMovementIfActive(objectEvent); objectEvent->inanimate = FALSE; - objectEvent->noShadow = TRUE; // TODO: Make shadow smaller instead of disappearing completely ? + objectEvent->noShadow = TRUE; SetFlyBirdPlayerSpriteId(task->tBirdSpriteId, objectEvent->spriteId); CameraObjectFreeze(); task->tState++; From a5b079d833f18f66ebd53ac77f00227ae4a1f389 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 21 Dec 2024 11:00:27 -0300 Subject: [PATCH 111/145] REVERT ME TO RESTORE HOENN MAP ADJUSTMENTS --- data/layouts/LavaridgeTown/map.bin | Bin 800 -> 800 bytes data/maps/DewfordTown/map.json | 13 -- data/maps/EverGrandeCity/map.json | 16 +- data/maps/LavaridgeTown/map.json | 2 +- data/maps/LilycoveCity/map.json | 13 -- data/maps/MauvilleCity/map.json | 26 --- data/maps/MossdeepCity/map.json | 26 --- data/maps/PacifidlogTown/map.json | 17 +- data/maps/PetalburgCity/map.json | 26 --- data/maps/Route102/map.json | 21 +- data/maps/RustboroCity/map.json | 221 ------------------ data/maps/SlateportCity/map.json | 26 --- data/maps/VerdanturfTown/map.json | 26 --- .../primary/general/metatile_attributes.bin | Bin 1024 -> 1024 bytes data/tilesets/primary/general/metatiles.bin | Bin 8192 -> 8192 bytes data/tilesets/primary/general/palettes/04.pal | 14 +- data/tilesets/primary/general/palettes/04.pla | 6 - data/tilesets/primary/general/palettes/13.pal | 32 +-- data/tilesets/primary/general/tiles.png | Bin 7658 -> 7622 bytes .../secondary/dewford/metatile_attributes.bin | Bin 758 -> 758 bytes data/tilesets/secondary/dewford/metatiles.bin | Bin 6064 -> 6064 bytes data/tilesets/secondary/dewford/tiles.png | Bin 3818 -> 3810 bytes .../secondary/ever_grande/palettes/01.pal | 24 +- .../secondary/ever_grande/palettes/08.pal | 2 +- .../secondary/ever_grande/palettes/08.pla | 3 - .../secondary/fallarbor/palettes/00.pal | 26 +-- .../secondary/fallarbor/palettes/07.pal | 6 +- .../secondary/fallarbor/palettes/07.pla | 3 - data/tilesets/secondary/fallarbor/tiles.png | Bin 15247 -> 4653 bytes data/tilesets/secondary/fortree/metatiles.bin | Bin 4480 -> 4480 bytes .../secondary/fortree/palettes/08.pal | 4 +- .../secondary/fortree/palettes/08.pla | 6 - data/tilesets/secondary/fortree/tiles.png | Bin 4433 -> 4414 bytes .../secondary/lavaridge/metatiles.bin | Bin 7056 -> 7056 bytes .../secondary/lavaridge/palettes/06.pal | 32 +-- .../secondary/lavaridge/palettes/06.pla | 7 - data/tilesets/secondary/lavaridge/tiles.png | Bin 4087 -> 4087 bytes .../lilycove/metatile_attributes.bin | Bin 702 -> 702 bytes .../tilesets/secondary/lilycove/metatiles.bin | Bin 5616 -> 5616 bytes .../secondary/lilycove/palettes/06.pal | 22 +- .../secondary/lilycove/palettes/06.pla | 6 - .../secondary/lilycove/palettes/15.pal | 30 +-- data/tilesets/secondary/lilycove/tiles.png | Bin 3728 -> 3652 bytes .../tilesets/secondary/mauville/metatiles.bin | Bin 8192 -> 8160 bytes .../secondary/mauville/palettes/07.pal | 4 +- .../secondary/mauville/palettes/07.pla | 3 - .../secondary/mauville/palettes/08.pal | 10 +- .../secondary/mauville/palettes/09.pal | 12 +- .../secondary/mauville/palettes/10.pal | 4 +- .../secondary/mauville/palettes/10.pla | 4 - .../secondary/mauville/palettes/11.pal | 2 +- .../secondary/mauville/palettes/11.pla | 3 - data/tilesets/secondary/mauville/tiles.png | Bin 6079 -> 6069 bytes .../tilesets/secondary/mossdeep/metatiles.bin | Bin 7264 -> 7264 bytes .../secondary/mossdeep/palettes/01.pal | 24 +- .../secondary/mossdeep/palettes/02.pal | 32 +-- .../secondary/mossdeep/palettes/08.pal | 2 +- .../secondary/mossdeep/palettes/08.pla | 3 - .../secondary/mossdeep/palettes/09.pal | 32 +-- data/tilesets/secondary/mossdeep/tiles.png | Bin 4129 -> 4111 bytes .../secondary/pacifidlog/palettes/02.pal | 32 +-- .../secondary/pacifidlog/palettes/09.pal | 2 +- .../secondary/pacifidlog/palettes/09.pla | 2 - data/tilesets/secondary/pacifidlog/tiles.png | Bin 12672 -> 4718 bytes .../secondary/petalburg/metatiles.bin | Bin 2304 -> 2304 bytes .../secondary/petalburg/palettes/02.pal | 32 +-- .../secondary/petalburg/palettes/06.pal | 4 +- .../secondary/petalburg/palettes/06.pla | 3 - .../secondary/petalburg/palettes/07.pal | 26 +-- .../secondary/petalburg/palettes/07.pla | 3 - .../secondary/petalburg/palettes/09.pal | 32 +-- .../secondary/petalburg/palettes/09.pla | 3 - data/tilesets/secondary/petalburg/tiles.png | Bin 1738 -> 1740 bytes .../tilesets/secondary/rustboro/metatiles.bin | Bin 5616 -> 5600 bytes .../secondary/rustboro/palettes/06.pal | 26 +-- .../secondary/rustboro/palettes/06.pla | 7 - .../secondary/rustboro/palettes/10.pal | 2 +- data/tilesets/secondary/rustboro/tiles.png | Bin 4057 -> 3938 bytes .../slateport/metatile_attributes.bin | Bin 812 -> 812 bytes .../secondary/slateport/metatiles.bin | Bin 6496 -> 6496 bytes .../secondary/slateport/palettes/06.pal | 4 +- .../secondary/slateport/palettes/06.pla | 2 - .../secondary/slateport/palettes/12.pal | 24 +- .../secondary/slateport/palettes/12.pla | 6 - .../secondary/slateport/palettes/15.pal | 30 +-- data/tilesets/secondary/slateport/tiles.png | Bin 6587 -> 6559 bytes .../secondary/sootopolis/palettes/06.pal | 8 +- .../secondary/sootopolis/palettes/06.pla | 5 - .../secondary/sootopolis/palettes/10.pal | 4 +- .../secondary/sootopolis/palettes/10.pla | 8 - .../secondary/sootopolis/palettes/15.pal | 30 +-- data/tilesets/secondary/sootopolis/tiles.png | Bin 13423 -> 2695 bytes src/data/tilesets/headers.h | 9 - 93 files changed, 290 insertions(+), 805 deletions(-) delete mode 100644 data/tilesets/primary/general/palettes/04.pla delete mode 100644 data/tilesets/secondary/ever_grande/palettes/08.pla delete mode 100644 data/tilesets/secondary/fallarbor/palettes/07.pla delete mode 100644 data/tilesets/secondary/fortree/palettes/08.pla delete mode 100644 data/tilesets/secondary/lavaridge/palettes/06.pla delete mode 100644 data/tilesets/secondary/lilycove/palettes/06.pla delete mode 100644 data/tilesets/secondary/mauville/palettes/07.pla delete mode 100644 data/tilesets/secondary/mauville/palettes/10.pla delete mode 100644 data/tilesets/secondary/mauville/palettes/11.pla delete mode 100644 data/tilesets/secondary/mossdeep/palettes/08.pla delete mode 100644 data/tilesets/secondary/pacifidlog/palettes/09.pla delete mode 100644 data/tilesets/secondary/petalburg/palettes/06.pla delete mode 100644 data/tilesets/secondary/petalburg/palettes/07.pla delete mode 100644 data/tilesets/secondary/petalburg/palettes/09.pla delete mode 100644 data/tilesets/secondary/rustboro/palettes/06.pla delete mode 100644 data/tilesets/secondary/slateport/palettes/06.pla delete mode 100644 data/tilesets/secondary/slateport/palettes/12.pla delete mode 100644 data/tilesets/secondary/sootopolis/palettes/06.pla delete mode 100644 data/tilesets/secondary/sootopolis/palettes/10.pla diff --git a/data/layouts/LavaridgeTown/map.bin b/data/layouts/LavaridgeTown/map.bin index a001f8cd388fcc5955ce09b8526760cb100b9c5d..604ad5f3f8edd6f7246a0ca3d812c03b7b29d586 100644 GIT binary patch delta 15 WcmZ3$wt#KI3Km&oS>ugsN|*pBy9E3I delta 15 XcmZ3$wt#KI3YNu2i;Xs}DPaNtFarh# diff --git a/data/maps/DewfordTown/map.json b/data/maps/DewfordTown/map.json index 4ad6364593..f073a74368 100644 --- a/data/maps/DewfordTown/map.json +++ b/data/maps/DewfordTown/map.json @@ -89,19 +89,6 @@ "trainer_sight_or_berry_tree_id": "0", "script": "DewfordTown_EventScript_TrendyPhraseBoy", "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 4, - "y": 10, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", - "script": "NULL", - "flag": "0" } ], "warp_events": [ diff --git a/data/maps/EverGrandeCity/map.json b/data/maps/EverGrandeCity/map.json index 86ad3a91b3..58978b7ff8 100644 --- a/data/maps/EverGrandeCity/map.json +++ b/data/maps/EverGrandeCity/map.json @@ -19,21 +19,7 @@ "direction": "left" } ], - "object_events": [ - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 29, - "y": 48, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", - "script": "NULL", - "flag": "0" - } - ], + "object_events": [], "warp_events": [ { "x": 18, diff --git a/data/maps/LavaridgeTown/map.json b/data/maps/LavaridgeTown/map.json index a70ec8b545..ecf7c5b9f1 100644 --- a/data/maps/LavaridgeTown/map.json +++ b/data/maps/LavaridgeTown/map.json @@ -77,7 +77,7 @@ "x": 4, "y": 4, "elevation": 3, - "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_LEFT", + "movement_type": "MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT", "movement_range_x": 0, "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", diff --git a/data/maps/LilycoveCity/map.json b/data/maps/LilycoveCity/map.json index 1b9004eaa5..0b829ea09e 100644 --- a/data/maps/LilycoveCity/map.json +++ b/data/maps/LilycoveCity/map.json @@ -310,19 +310,6 @@ "trainer_sight_or_berry_tree_id": "0", "script": "LilycoveCity_EventScript_FatMan", "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 26, - "y": 14, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", - "script": "NULL", - "flag": "0" } ], "warp_events": [ diff --git a/data/maps/MauvilleCity/map.json b/data/maps/MauvilleCity/map.json index 1ebe629476..0d193e4022 100644 --- a/data/maps/MauvilleCity/map.json +++ b/data/maps/MauvilleCity/map.json @@ -177,32 +177,6 @@ "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_MAUVILLE_CITY_SCOTT" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 24, - "y": 5, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 25, - "y": 14, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_POKE_MART_SIGN", - "script": "NULL", - "flag": "0" } ], "warp_events": [ diff --git a/data/maps/MossdeepCity/map.json b/data/maps/MossdeepCity/map.json index 4891f9968a..a7ec32d7b1 100644 --- a/data/maps/MossdeepCity/map.json +++ b/data/maps/MossdeepCity/map.json @@ -250,32 +250,6 @@ "trainer_sight_or_berry_tree_id": "0", "script": "MossdeepCity_EventScript_BlackBelt", "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 30, - "y": 16, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 39, - "y": 18, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_POKE_MART_SIGN", - "script": "NULL", - "flag": "0" } ], "warp_events": [ diff --git a/data/maps/PacifidlogTown/map.json b/data/maps/PacifidlogTown/map.json index 2a06e4aca7..37cfe8ad08 100644 --- a/data/maps/PacifidlogTown/map.json +++ b/data/maps/PacifidlogTown/map.json @@ -63,19 +63,6 @@ "trainer_sight_or_berry_tree_id": "0", "script": "PacifidlogTown_EventScript_NinjaBoy", "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 10, - "y": 15, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", - "script": "NULL", - "flag": "0" } ], "warp_events": [ @@ -122,9 +109,7 @@ "dest_warp_id": "0" } ], - "coord_events": [ - - ], + "coord_events": [], "bg_events": [ { "type": "sign", diff --git a/data/maps/PetalburgCity/map.json b/data/maps/PetalburgCity/map.json index 54bae3539c..7aaca8145c 100644 --- a/data/maps/PetalburgCity/map.json +++ b/data/maps/PetalburgCity/map.json @@ -141,32 +141,6 @@ "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_PETALBURG_CITY_SCOTT" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 22, - "y": 16, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 27, - "y": 12, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_POKE_MART_SIGN", - "script": "NULL", - "flag": "0" } ], "warp_events": [ diff --git a/data/maps/Route102/map.json b/data/maps/Route102/map.json index 3a1726751b..8ad17aae4d 100644 --- a/data/maps/Route102/map.json +++ b/data/maps/Route102/map.json @@ -141,27 +141,10 @@ "trainer_sight_or_berry_tree_id": "3", "script": "Route102_EventScript_Allen", "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": -3, - "y": 2, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_POKE_MART_SIGN", - "script": "NULL", - "flag": "0" } ], - "warp_events": [ - - ], - "coord_events": [ - - ], + "warp_events": [], + "coord_events": [], "bg_events": [ { "type": "sign", diff --git a/data/maps/RustboroCity/map.json b/data/maps/RustboroCity/map.json index a32ce7d610..9a987ab284 100644 --- a/data/maps/RustboroCity/map.json +++ b/data/maps/RustboroCity/map.json @@ -237,227 +237,6 @@ "trainer_sight_or_berry_tree_id": "0", "script": "RustboroCity_EventScript_Boy1", "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 19, - "y": 37, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 22, - "y": 37, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 19, - "y": 30, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 22, - "y": 30, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 19, - "y": 23, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 22, - "y": 23, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 22, - "y": 44, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 19, - "y": 44, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 29, - "y": 48, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 14, - "y": 19, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 15, - "y": 17, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 9, - "y": 19, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 8, - "y": 17, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 19, - "y": 15, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 22, - "y": 15, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 14, - "y": 54, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 17, - "y": 54, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_BALL", - "script": "NULL", - "flag": "0" } ], "warp_events": [ diff --git a/data/maps/SlateportCity/map.json b/data/maps/SlateportCity/map.json index e2b6d47c67..972b51447e 100644 --- a/data/maps/SlateportCity/map.json +++ b/data/maps/SlateportCity/map.json @@ -484,32 +484,6 @@ "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_SLATEPORT_CITY_SCOTT" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 21, - "y": 19, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 15, - "y": 26, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_POKE_MART_SIGN", - "script": "NULL", - "flag": "0" } ], "warp_events": [ diff --git a/data/maps/VerdanturfTown/map.json b/data/maps/VerdanturfTown/map.json index d2522517ab..ae40730c0e 100644 --- a/data/maps/VerdanturfTown/map.json +++ b/data/maps/VerdanturfTown/map.json @@ -76,32 +76,6 @@ "trainer_sight_or_berry_tree_id": "0", "script": "VerdanturfTown_EventScript_Camper", "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 18, - "y": 3, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_PKMN_CENTER_SIGN", - "script": "NULL", - "flag": "0" - }, - { - "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", - "x": 14, - "y": 3, - "elevation": 3, - "movement_type": "MOVEMENT_TYPE_NONE", - "movement_range_x": 0, - "movement_range_y": 0, - "trainer_type": "TRAINER_TYPE_NONE", - "trainer_sight_or_berry_tree_id": "LIGHT_TYPE_POKE_MART_SIGN", - "script": "NULL", - "flag": "0" } ], "warp_events": [ diff --git a/data/tilesets/primary/general/metatile_attributes.bin b/data/tilesets/primary/general/metatile_attributes.bin index 552dafb603a737f14fa19094994e2dfb92163764..d9cd29016d792fb568494dbf2f820100081a14f8 100644 GIT binary patch delta 56 ncmZqRXyBM2uFJr{zy!oFz{tSJzzpMnXaP7!Ad_LE%N}L`Z!iQY delta 56 ocmZqRXyBM2t}DR6z{G$6i~@`d%m^+615h3c1TqCSy6j;F0Cb=PSpWb4 diff --git a/data/tilesets/primary/general/metatiles.bin b/data/tilesets/primary/general/metatiles.bin index 813543f580749b6863bb474c80764044624545a6..af899bcc5efa4bdd3ab1f418b371a866441207c9 100644 GIT binary patch delta 111 zcmZp0XmFUYhlPQGfo0->3NSs{hVc%F!LV6|>6xSlvjVdMlR|Ugw7}-Tus|jt55%7i fbK0veuN&RLonQhDfrW6@% delta 111 zcmZp0XmFUYhh@3La+iq*Dp_Fh6|<%P6x_@S6Mmy=1mA0{~x$BLV;b diff --git a/data/tilesets/primary/general/palettes/04.pal b/data/tilesets/primary/general/palettes/04.pal index 313337d6da..d8051b7bac 100644 --- a/data/tilesets/primary/general/palettes/04.pal +++ b/data/tilesets/primary/general/palettes/04.pal @@ -1,14 +1,14 @@ JASC-PAL 0100 16 -0 0 0 -216 224 232 +24 41 82 +255 255 255 222 230 238 -184 200 224 -152 176 216 -112 184 240 +255 0 255 +255 0 255 +255 0 255 156 164 189 -80 104 208 +82 106 213 65 90 189 57 82 156 41 65 139 @@ -16,4 +16,4 @@ JASC-PAL 139 164 222 106 131 213 82 106 213 -96 168 232 +115 197 164 diff --git a/data/tilesets/primary/general/palettes/04.pla b/data/tilesets/primary/general/palettes/04.pla deleted file mode 100644 index 5f08f88f35..0000000000 --- a/data/tilesets/primary/general/palettes/04.pla +++ /dev/null @@ -1,6 +0,0 @@ -# Color indices to set high bit -1 -3 -4 -5 -15 \ No newline at end of file diff --git a/data/tilesets/primary/general/palettes/13.pal b/data/tilesets/primary/general/palettes/13.pal index 73fec5261a..4b0812f094 100644 --- a/data/tilesets/primary/general/palettes/13.pal +++ b/data/tilesets/primary/general/palettes/13.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -232 0 128 -232 228 216 -222 230 238 -224 214 184 -216 200 152 -244 226 171 -156 164 189 -80 104 208 -65 90 189 -57 82 156 -41 65 139 -172 197 230 -139 164 222 -106 131 213 -82 106 213 -221 205 143 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/data/tilesets/primary/general/tiles.png b/data/tilesets/primary/general/tiles.png index b22b3f1fcbf3dc7f0fd63f893ee07326fd965f1f..17426ab80e8fe2434bc9ecefbc8e063fd4e6d09a 100644 GIT binary patch literal 7622 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 literal 7658 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 Y2juoiOYAb5z5oCK07*qoM6N<$f{x@yJpcdz diff --git a/data/tilesets/secondary/dewford/metatile_attributes.bin b/data/tilesets/secondary/dewford/metatile_attributes.bin index 158238664fe74c5543b5e0374f4996b1eb3c441c..67ee25d405026191260b7a7cfc078b007db4af1d 100644 GIT binary patch delta 29 ecmeyy`i*shEgu6A2mm1%WKM2m65W_EjR^o>dzd?V)8%7oe1_qYN9~dhjj2xz89uk2PfgFL&fzyCE49J4;rvv%nf@y*Xep_IA VU;v!o4wMfNZ9!7Mxr*6L1OV-q9LWFx delta 103 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 delta 3766 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 diff --git a/data/tilesets/secondary/ever_grande/palettes/01.pal b/data/tilesets/secondary/ever_grande/palettes/01.pal index 2c02767613..3c6e40c2e9 100644 --- a/data/tilesets/secondary/ever_grande/palettes/01.pal +++ b/data/tilesets/secondary/ever_grande/palettes/01.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -0 197 0 -246 197 123 -238 156 90 -205 115 41 -164 90 49 +24 41 82 +255 255 255 +222 230 238 +189 205 230 +156 180 222 131 131 139 98 98 123 65 74 106 41 49 90 -224 226 171 -216 200 152 -255 255 238 -222 222 197 -197 197 164 -164 172 123 -255 255 115 +115 189 246 +98 172 238 +255 189 131 +238 148 115 +222 106 98 +205 65 82 +115 197 164 diff --git a/data/tilesets/secondary/ever_grande/palettes/08.pal b/data/tilesets/secondary/ever_grande/palettes/08.pal index fcd13d7723..083dd5080a 100644 --- a/data/tilesets/secondary/ever_grande/palettes/08.pal +++ b/data/tilesets/secondary/ever_grande/palettes/08.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 0 0 +24 41 82 246 197 123 238 156 90 205 115 41 diff --git a/data/tilesets/secondary/ever_grande/palettes/08.pla b/data/tilesets/secondary/ever_grande/palettes/08.pla deleted file mode 100644 index 5eb702de80..0000000000 --- a/data/tilesets/secondary/ever_grande/palettes/08.pla +++ /dev/null @@ -1,3 +0,0 @@ -# Color indices to set high bit -9 -10 \ No newline at end of file diff --git a/data/tilesets/secondary/fallarbor/palettes/00.pal b/data/tilesets/secondary/fallarbor/palettes/00.pal index 87f9999aef..ede0c60a19 100644 --- a/data/tilesets/secondary/fallarbor/palettes/00.pal +++ b/data/tilesets/secondary/fallarbor/palettes/00.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -0 192 0 -222 230 164 -180 197 115 -148 156 82 -123 131 65 +115 197 164 +255 255 255 +222 230 238 +189 205 230 +156 180 222 131 131 139 98 98 123 65 74 106 -88 168 168 -221 205 143 -244 226 171 -255 205 82 -230 156 49 -222 123 32 -156 98 41 -128 192 216 +189 189 131 +115 189 246 +98 172 238 +115 189 246 +98 164 222 +82 139 197 +74 115 172 +115 197 164 diff --git a/data/tilesets/secondary/fallarbor/palettes/07.pal b/data/tilesets/secondary/fallarbor/palettes/07.pal index 6cb1ea50e7..724a8f09db 100644 --- a/data/tilesets/secondary/fallarbor/palettes/07.pal +++ b/data/tilesets/secondary/fallarbor/palettes/07.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -0 0 0 +24 41 82 222 230 164 180 197 115 148 156 82 @@ -9,11 +9,11 @@ JASC-PAL 131 131 139 98 98 123 65 74 106 -88 168 168 +41 49 90 90 172 172 131 197 222 255 205 82 230 156 49 222 123 32 156 98 41 -128 192 216 +115 197 164 diff --git a/data/tilesets/secondary/fallarbor/palettes/07.pla b/data/tilesets/secondary/fallarbor/palettes/07.pla deleted file mode 100644 index 5eb702de80..0000000000 --- a/data/tilesets/secondary/fallarbor/palettes/07.pla +++ /dev/null @@ -1,3 +0,0 @@ -# Color indices to set high bit -9 -10 \ No newline at end of file diff --git a/data/tilesets/secondary/fallarbor/tiles.png b/data/tilesets/secondary/fallarbor/tiles.png index 06b86ff956176ba4e616b0abb47c930de7c3aee5..3582d1d030d978025a2de580831db536aa401cf9 100644 GIT binary patch delta 4604 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 d|EGB0c-z?>U2!hH?=i;0niVYxmf@_&Y9Oh^C# literal 15247 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 Vu)Xnzs15)C002ovPDHLkV1n?oOm+YO diff --git a/data/tilesets/secondary/fortree/metatiles.bin b/data/tilesets/secondary/fortree/metatiles.bin index 1b0958cbd1e07e44e47a8dc2a7f6e04356798110..ecc00d7e7092a272c134c4a9fdcaae507c44c11e 100644 GIT binary patch delta 56 zcmZorZcyGJ!OK+IK3R&_j`8K@NM1{3xtHxsD$FWu3hWAE3Sufd+PAl#Xg}W000omb H2wVUF&O#6- delta 56 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 H!ZYrFhG_0n diff --git a/data/tilesets/secondary/lavaridge/metatiles.bin b/data/tilesets/secondary/lavaridge/metatiles.bin index c9bc71442ad26a06aab12352b676b63098f74c93..fd0314ed78ce4aad760ba39a6e6522e5f27bfdd9 100644 GIT binary patch delta 15 XcmbPWKEZs$4^AcqhRwe?rwIZ8FU19) delta 15 XcmbPWKEZs$4^F1#j+=jRP7?$GHQWY= diff --git a/data/tilesets/secondary/lavaridge/palettes/06.pal b/data/tilesets/secondary/lavaridge/palettes/06.pal index 3ea0c42542..00e1478a73 100644 --- a/data/tilesets/secondary/lavaridge/palettes/06.pal +++ b/data/tilesets/secondary/lavaridge/palettes/06.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -224 40 0 -64 72 104 -192 200 0 -224 232 232 -248 248 248 -248 112 64 -224 112 64 -176 96 88 -160 80 80 -200 48 0 -144 48 0 -240 24 24 -240 144 0 -144 160 64 -104 120 136 -224 40 0 +0 0 0 +65 74 106 +197 205 0 +230 238 238 +255 255 255 +255 115 65 +230 115 65 +180 98 90 +164 82 82 +205 49 0 +148 49 0 +246 24 24 +246 148 0 +148 164 65 +106 123 139 +222 222 0 diff --git a/data/tilesets/secondary/lavaridge/palettes/06.pla b/data/tilesets/secondary/lavaridge/palettes/06.pla deleted file mode 100644 index 26f59249a8..0000000000 --- a/data/tilesets/secondary/lavaridge/palettes/06.pla +++ /dev/null @@ -1,7 +0,0 @@ -# Color indices to set high bit -0 -9 -10 -11 -12 -15 \ No newline at end of file diff --git a/data/tilesets/secondary/lavaridge/tiles.png b/data/tilesets/secondary/lavaridge/tiles.png index 03c832c37a14b993e7096921d0f27f8647945916..2f6898a0f7ca21efb0dfc0c1d608d8bae6931a27 100644 GIT binary patch delta 30 kcmew^|6P7UDpN+|#`Fe$fosPnZ(;xfPgg&ebxsLQ0K`@cm;e9( delta 30 kcmew^|6P7UDpSRrjp+^i0w#wmdKI;Vst0J-l9+yDRo diff --git a/data/tilesets/secondary/lilycove/metatile_attributes.bin b/data/tilesets/secondary/lilycove/metatile_attributes.bin index f31cc9a047db711eaaa07a556400e4425abe0ad0..0f4e01b923280efa5742e9a869e9d172da7fb119 100644 GIT binary patch delta 26 icmdnTx{q~(H{-;QB9r48XH3>-WSe}Ok!vzL({=!cBMCVG delta 35 icmdnTx{q~(H>02c0|NsHg8-O4IfijIqrl`JjK=_MNe03I diff --git a/data/tilesets/secondary/lilycove/metatiles.bin b/data/tilesets/secondary/lilycove/metatiles.bin index f82bdff5c618f60de442abefd7d77737975195dc..6018ac8ec361c2dd067a8a420e7cf0e6ae7b0925 100644 GIT binary patch delta 396 zcmYjNze~eV5Wc*;q6BT_DOkiIm_Q2Ep)JluSEJ}#t;JOcjt;@;hKHm0AXvIep%e$n zf8p#P;_N7yoxE!_^c~0j`0l%pcSXBs-@oqwfMg%z2xmA&%I9xn#yB<42=e9U(ou`e z88rd&L|Dhc2ib3+>kBg1?_dYljXjZj4%%DU-^WwzRcK%is5(QQWJU+OG<~>G6Px*k zyyAWjb%g~Om^`UHIoqTZ53iqDE4`-T;Vc=19B#IeA&x@A_+4-le2-9_v^) d)#m(OyrHEcWj`C{Pw$xYE-F2S^K|W|_6wZfSh4^B delta 396 zcmeyM{Xu)e4W(I0v(gwC7+7XE&1_oTw6ckTVOA25&oHxXcGJqXwN10qHvURr6hanU z4HRTx*_^{PnUOJR5{o^560-sm5Hc$mHW@Yvr%m=_(Pd1UT*G2-niSAv+ys+VPICnE z0-Hc8L1KnYMnKh0NPM8~B%uBeESVs2Vb@B;Hb@C2kR)_}TFd#3@ zY4SV1Q!1fOVNR(|X-*)`pkVU}@(Gd<5(nysSfJ*l<~I2be;d?3U!Z-laQlE3IBl*H HC}RZxsJU!T diff --git a/data/tilesets/secondary/lilycove/palettes/06.pal b/data/tilesets/secondary/lilycove/palettes/06.pal index a40ff7909c..4b0812f094 100644 --- a/data/tilesets/secondary/lilycove/palettes/06.pal +++ b/data/tilesets/secondary/lilycove/palettes/06.pal @@ -2,17 +2,17 @@ JASC-PAL 0100 16 0 0 0 -168 184 240 -112 144 208 -115 148 213 -90 115 189 -131 131 139 -216 208 216 -65 74 106 -222 213 222 -112 144 208 -131 197 213 -248 248 248 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/data/tilesets/secondary/lilycove/palettes/06.pla b/data/tilesets/secondary/lilycove/palettes/06.pla deleted file mode 100644 index 77b77f073c..0000000000 --- a/data/tilesets/secondary/lilycove/palettes/06.pla +++ /dev/null @@ -1,6 +0,0 @@ -# Color indices to set high bit -1 -2 -6 -9 -10 \ No newline at end of file diff --git a/data/tilesets/secondary/lilycove/palettes/15.pal b/data/tilesets/secondary/lilycove/palettes/15.pal index 41c4142bb9..e7717d74ea 100644 --- a/data/tilesets/secondary/lilycove/palettes/15.pal +++ b/data/tilesets/secondary/lilycove/palettes/15.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -24 200 0 -244 226 171 -221 205 143 -115 148 213 -90 115 189 -131 131 139 -232 228 216 -65 74 106 -222 213 222 -221 205 143 -244 226 171 -248 248 248 -0 0 0 -0 0 0 -0 0 0 +115 197 164 +255 213 180 +255 197 148 +222 148 115 +123 65 65 +57 74 123 +41 57 98 +24 41 82 +16 32 57 +222 230 238 +255 197 90 +189 156 90 +255 98 90 +197 65 65 +255 255 255 0 0 0 diff --git a/data/tilesets/secondary/lilycove/tiles.png b/data/tilesets/secondary/lilycove/tiles.png index 56be3ab4dcb2cc7ea93a8c0c83a5690136be4053..44111c4487a17f0f9a4f45cfbcc777f5ba539020 100644 GIT binary patch delta 3646 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 LCrryss4@QoGB9D( delta 3723 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 diff --git a/data/tilesets/secondary/mauville/metatiles.bin b/data/tilesets/secondary/mauville/metatiles.bin index 148991e52eb360967e79867181ee81328b3a9981..a71ead8e57b2e0e512ce2057d3a92e1d0fc62122 100644 GIT binary patch delta 100 zcmZp0cwoO_iv*9aQmm43l5vtlkVDwy0}=&1u}Z#R7!VW?HrYlpOTrf{?-=9|1X2r< hHcm200;=98nIZuZa106v3JeN{D+mbNY$dgf6#xJq9c%yq delta 133 zcmaE0-{7!eiv*8DkVBYpl5x^`=kxB94@ea71Ox?y`6~G;-FLq4KG{YxOTr-tB<~n> z-q}|vR>=VE&JG3dT?U{EknXDm<&P_O%DE2(9y3T+0B2Gb0t b8!#B01mc?pEe72NvkYb%oHSuDxe3GoKrbzT diff --git a/data/tilesets/secondary/mauville/palettes/07.pal b/data/tilesets/secondary/mauville/palettes/07.pal index f3618ff714..fa1dbd2962 100644 --- a/data/tilesets/secondary/mauville/palettes/07.pal +++ b/data/tilesets/secondary/mauville/palettes/07.pal @@ -9,11 +9,11 @@ JASC-PAL 131 131 139 98 98 123 65 74 106 -40 48 88 +41 49 90 213 213 213 164 164 172 230 197 246 213 139 222 197 115 164 148 98 106 -168 200 224 +172 205 230 diff --git a/data/tilesets/secondary/mauville/palettes/07.pla b/data/tilesets/secondary/mauville/palettes/07.pla deleted file mode 100644 index 5e51fe661a..0000000000 --- a/data/tilesets/secondary/mauville/palettes/07.pla +++ /dev/null @@ -1,3 +0,0 @@ -# Color indices to set high bit -1 -15 \ No newline at end of file diff --git a/data/tilesets/secondary/mauville/palettes/08.pal b/data/tilesets/secondary/mauville/palettes/08.pal index 3742cfd9ba..bc7cb5c883 100644 --- a/data/tilesets/secondary/mauville/palettes/08.pal +++ b/data/tilesets/secondary/mauville/palettes/08.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 123 180 189 -0 248 0 +115 189 246 131 197 98 57 139 49 57 82 0 255 255 98 255 255 255 222 230 238 -0 248 0 +189 205 230 255 172 222 230 131 180 213 90 139 -0 248 0 +164 213 197 115 197 164 -0 248 0 -0 248 0 +65 180 131 +24 164 106 diff --git a/data/tilesets/secondary/mauville/palettes/09.pal b/data/tilesets/secondary/mauville/palettes/09.pal index 312bb1aac7..9c37027c3d 100644 --- a/data/tilesets/secondary/mauville/palettes/09.pal +++ b/data/tilesets/secondary/mauville/palettes/09.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 123 180 189 -248 0 248 +255 255 255 131 197 98 57 139 49 57 82 0 255 255 98 172 197 230 -248 0 248 -248 0 248 +139 164 222 +106 131 213 255 230 148 238 197 115 -248 0 248 +230 172 82 164 213 197 115 197 164 -248 0 248 -248 0 248 +65 180 131 +24 164 106 diff --git a/data/tilesets/secondary/mauville/palettes/10.pal b/data/tilesets/secondary/mauville/palettes/10.pal index b0d6736e5e..a2e1cdc176 100644 --- a/data/tilesets/secondary/mauville/palettes/10.pal +++ b/data/tilesets/secondary/mauville/palettes/10.pal @@ -9,9 +9,9 @@ JASC-PAL 131 131 139 98 98 123 65 74 106 -144 216 248 +41 49 90 246 197 98 -144 216 248 +148 222 255 230 172 238 213 139 222 197 115 164 diff --git a/data/tilesets/secondary/mauville/palettes/10.pla b/data/tilesets/secondary/mauville/palettes/10.pla deleted file mode 100644 index 24701d55f5..0000000000 --- a/data/tilesets/secondary/mauville/palettes/10.pla +++ /dev/null @@ -1,4 +0,0 @@ -# Color indices to set high bit -1 -9 -10 \ No newline at end of file diff --git a/data/tilesets/secondary/mauville/palettes/11.pal b/data/tilesets/secondary/mauville/palettes/11.pal index a48424b133..c73ec2fe82 100644 --- a/data/tilesets/secondary/mauville/palettes/11.pal +++ b/data/tilesets/secondary/mauville/palettes/11.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -123 180 189 +172 180 139 255 255 255 222 230 238 164 180 197 diff --git a/data/tilesets/secondary/mauville/palettes/11.pla b/data/tilesets/secondary/mauville/palettes/11.pla deleted file mode 100644 index 0dcbee2087..0000000000 --- a/data/tilesets/secondary/mauville/palettes/11.pla +++ /dev/null @@ -1,3 +0,0 @@ -# Color indices to set high bit -7 -8 \ No newline at end of file diff --git a/data/tilesets/secondary/mauville/tiles.png b/data/tilesets/secondary/mauville/tiles.png index 09bab365772533a3970d7f4a44cb72d806e02b38..208a052c538867a6cc6837f5ce270b8d959dee6f 100644 GIT binary patch delta 6020 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 Qe>XokW^PNXJ;I3nKPyfrPXGV_ diff --git a/data/tilesets/secondary/pacifidlog/palettes/02.pal b/data/tilesets/secondary/pacifidlog/palettes/02.pal index 9ea109ce00..4c41030f66 100644 --- a/data/tilesets/secondary/pacifidlog/palettes/02.pal +++ b/data/tilesets/secondary/pacifidlog/palettes/02.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -0 0 128 -222 230 164 -180 189 123 -156 164 98 -131 139 74 -90 98 41 -98 98 123 -65 74 106 -32 32 82 -238 230 164 -238 197 98 -205 156 57 -164 123 24 -131 82 49 -131 131 139 -244 226 171 +24 41 82 +180 255 131 +131 197 98 +57 139 49 +57 82 0 +222 148 115 +106 90 90 +164 98 90 +65 57 49 +255 197 148 +222 106 98 +205 65 82 +164 213 197 +115 197 164 +65 180 131 +24 164 106 diff --git a/data/tilesets/secondary/pacifidlog/palettes/09.pal b/data/tilesets/secondary/pacifidlog/palettes/09.pal index 653ffdfb3e..780f5b0ab6 100644 --- a/data/tilesets/secondary/pacifidlog/palettes/09.pal +++ b/data/tilesets/secondary/pacifidlog/palettes/09.pal @@ -16,4 +16,4 @@ JASC-PAL 164 123 24 131 82 49 131 131 139 -64 72 104 +82 106 213 diff --git a/data/tilesets/secondary/pacifidlog/palettes/09.pla b/data/tilesets/secondary/pacifidlog/palettes/09.pla deleted file mode 100644 index 321117092b..0000000000 --- a/data/tilesets/secondary/pacifidlog/palettes/09.pla +++ /dev/null @@ -1,2 +0,0 @@ -# Color indices to set high bit -15 \ No newline at end of file diff --git a/data/tilesets/secondary/pacifidlog/tiles.png b/data/tilesets/secondary/pacifidlog/tiles.png index 31f78891d4898aabd5c2912e963d9bf1c56d19c1..9fe620e1efc7e2ae908f7e145b15500e0048d378 100644 GIT binary patch delta 4670 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 AYybcN literal 12672 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 diff --git a/data/tilesets/secondary/rustboro/metatiles.bin b/data/tilesets/secondary/rustboro/metatiles.bin index 649b09fac9aa91854c7410881856a96aee8e5aca..5a0d1b0d14d6f8fd5d408d19880e64b556a6cdd0 100644 GIT binary patch delta 227 zcmeyM{XlzyBzw@=pgTc#gElH~GKvQ+4B8O1G3eo@2b&%N@d7A+vjbxW69)qnOy0m; z0q1NsUOn$iLCF!)T{bWYc6hHVKve0y~X%88I+KHr)hDgA{|zi);e%K|BzD la}?VOHi-vKkD4AdH3v=$Yz_ delta 244 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 delta 4000 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 diff --git a/data/tilesets/secondary/slateport/metatile_attributes.bin b/data/tilesets/secondary/slateport/metatile_attributes.bin index 0f311a694f316031fc8829b1d3c72ae7fa4d39be..d4894828bb7bc86e7d87bb144ca87610ca9b6bee 100644 GIT binary patch delta 36 jcmZ3(wuWtkJR>8+WCg}%K?WcY073{2BsXtitY8EHb!-KX delta 36 kcmZ3(wuWtkJR_sPWCg}%K>-E^1_2-h0Wf>>7RCxj0C?;LzW@LL diff --git a/data/tilesets/secondary/slateport/metatiles.bin b/data/tilesets/secondary/slateport/metatiles.bin index 81c28bc3c6104e5a8da3344bce8e14b65db96f88..72f671f71def8f5a93264b76c854c5b797ee20b8 100644 GIT binary patch delta 305 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 literal 6587 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
    VUHIcewn8hTAA3RQ zq2K;`svEXmjgx%%_SWAU5#$dZUS9Kk!)YUxmD$4h>x30g6#5dhL5@}xAKoQp7YYSG zSX;yETox|C!H+Z)Y{OAmyqQS-S{RR*687^GCq0dB&CWOm|2z0t!B_@*fw~(_xzVlL zuW$eISMXV`&qVcGkvZ{6Hw))<{&V20U_>+ofTsd5XPHBD3ar9pt^vAPnvUKmZ;n!<1eDn_%C25_PU)8Di}eN@~(kbi~fX}lhMNVtd=w$I%OF;COfGG!tgCt9(5a4@_9kM(M&_qiU0HHeoz@&iyRr`IZ)dnAe7Xfer zwW9#8K?lGSDVvS}9)FWxw@NKf0=f-vR6-n33wy-@X_dG!fZy<3E+O3IPis0R#Y`jcN2U1YC4x0G=3`yCEP25#k#Pa5 z34l^927t-EjsPxU1W;pSI-s^&F7eM?7x$h85P*POV-x@a$kKFxZ6jbYzHF#t+naRUL+j)ee9#m6CFuN4H{lQ@K$2;OU_kwv|cK@kBOs!UngX6WdS^Wk zlkxpE0HCV_vk@4L)=$-I0D9u|13$PXV9@n~AAg$7*SJA`xCWrt9;13cIlMpF5YJGzLsNk3XMg?@~w7)IG_y`p6A-t3T&r1fhz2E!?6@O4; z?;;}r)P`M2II$lBgn^PN3b+rfRcmRxDCfeRN5REwboCF7Q2-D^K;3C~k4`_G4aAiVf3=fZC*zR<$U=dT0=ewlq8U{L;*U7qE{NaI?%WyZhpp(d7}jfd)oF|yp#yMQwh#`0e|89v15Mv2OH4ineB|0 z>q9^v`t=7xKG|EVoHj(?R~5g_p7O9EoY&;(jDn|B;9xf28YUdQ+F#r-yRjQ-nj zZ0s>vqJ$1QUV0zjj~}N}=(Y`KZDU%=Jp@`XG#k^(_0&RQ9WS?dh{j_)EG1xS9WMc} zHZ8_ci5Zksha~`}$2ctc2ovhC1i;g0GPYAo0Z7OLD7T^zVw;v-Mp#$sVs9z=kzu(ab+ zMInlT-|rORRUlen<$stlk{^F|Y4{XT{Bx&L)jTcBGFj-X$}fsCf6B6g>c$#6)eM5pF*mAY;{R^^)eGy{V$iKgkA1Q@E8W0|@Wb$8tz zN@1)pLQA28nrg-n{foJxcdY8JYy#(|Mt_bm4XZPt*2qUH(oTh< z?u-fQG-4D89)Sl|JPq8q#n10nsfO;!u3D^M;ZLE2WoVr{0ssbfDd;*rpOniL0)Xj*Zn;Q5) z#q+HajnSq74S&*36&z-28pvk1_kYf*DvkgN3R!j#VCt+;uwZPEE#dF6IYrH8bS3XP z08lg)9fT_0y@ICND(|mJfNNTyniWhrwgP_@^lUL(KtRPHra~CFhpG3P|6t%A$O;&z zuBZY)3kvjAb=~9uJ^}=+W>o;BKp`b6HNo+>-|d5bRexhSwV<22p<)S-EPvAeJz_gX4$N!QcZX398jhFIV7U0s*(+(%masjG-NsJT=ZnFek&!O;q# z_#8}8&oqxALV#R$hEr;W;Y4yN2Y_QtMKxF6Y6_$sb;lQs>4p;ADuw}n*3I*nKUvP( pKNVXND=tE&JS{pOAp*_c@xSJX;A%&k7PbHY002ovPDHLkV1i-csbc^D literal 13423 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 Date: Sat, 21 Dec 2024 13:34:54 -0300 Subject: [PATCH 112/145] contest fever --- src/contest_effect.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/contest_effect.c b/src/contest_effect.c index 827f6377e6..0de31339f4 100644 --- a/src/contest_effect.c +++ b/src/contest_effect.c @@ -132,7 +132,7 @@ static void ContestEffect_UserLessEasilyStartled(void) SetContestantEffectStringID(eContestAppealResults.contestant,CONTEST_STRING_STOPPED_CARING); } -// Slightly startles the POKéMON in front. +// Slightly startles the POKéMON in front. static void ContestEffect_StartleFrontMon(void) { u8 idx = 0; @@ -180,7 +180,7 @@ static void ContestEffect_StartlePrevMons(void) SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Startles the POKéMON that appealed before the user. +// Startles the POKéMON that appealed before the user. static void ContestEffect_StartlePrevMon2(void) { u8 rval = Random() % 10; @@ -197,7 +197,7 @@ static void ContestEffect_StartlePrevMon2(void) ContestEffect_StartleFrontMon(); } -// Startles all POKéMON that appealed before the user. +// Startles all POKéMON that appealed before the user. static void ContestEffect_StartlePrevMons2(void) { u8 numStartled = 0; @@ -273,7 +273,7 @@ static void ContestEffect_ShiftJudgeAttention(void) } } -// Startles the POKéMON that has the JUDGE's attention. +// Startles the POKéMON that has the JUDGE's attention. static void ContestEffect_StartleMonWithJudgesAttention(void) { u8 numStartled = 0; @@ -311,7 +311,7 @@ static void ContestEffect_JamsOthersButMissOneTurn(void) SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Startles POKéMON that made a same-type appeal. +// Startles POKéMON that made a same-type appeal. static void ContestEffect_StartleMonsSameTypeAppeal(void) { u16 move = eContestantStatus[eContestAppealResults.contestant].currMove; @@ -319,42 +319,42 @@ static void ContestEffect_StartleMonsSameTypeAppeal(void) SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made COOL appeals. +// Badly startles POKéMON that made COOL appeals. static void ContestEffect_StartleMonsCoolAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_COOL); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made BEAUTY appeals. +// Badly startles POKéMON that made BEAUTY appeals. static void ContestEffect_StartleMonsBeautyAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_BEAUTY); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made CUTE appeals. +// Badly startles POKéMON that made CUTE appeals. static void ContestEffect_StartleMonsCuteAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_CUTE); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made SMART appeals. +// Badly startles POKéMON that made SMART appeals. static void ContestEffect_StartleMonsSmartAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_SMART); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made TOUGH appeals. +// Badly startles POKéMON that made TOUGH appeals. static void ContestEffect_StartleMonsToughAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_TOUGH); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Makes one POKéMON after the user nervous. +// Makes one POKéMON after the user nervous. static void ContestEffect_MakeFollowingMonNervous(void) { bool32 hitAny = FALSE; @@ -386,7 +386,7 @@ static void ContestEffect_MakeFollowingMonNervous(void) SetContestantEffectStringID2(eContestAppealResults.contestant, CONTEST_STRING_MESSED_UP2); } -// Makes all POKéMON after the user nervous. +// Makes all POKéMON after the user nervous. static void ContestEffect_MakeFollowingMonsNervous(void) { u8 numUnnerved = 0; @@ -493,7 +493,7 @@ static void ContestEffect_WorsenConditionOfPrevMons(void) SetContestantEffectStringID2(eContestAppealResults.contestant, CONTEST_STRING_IGNORED); } -// Badly startles POKéMON in good condition. +// Badly startles POKéMON in good condition. static void ContestEffect_BadlyStartlesMonsInGoodCondition(void) { u8 numHit = 0; @@ -897,7 +897,7 @@ static void ContestEffect_ExciteAudienceInAnyContest(void) } } -// Badly startles all POKéMON that made good appeals. +// Badly startles all POKéMON that made good appeals. static void ContestEffect_BadlyStartleMonsWithGoodAppeals(void) { int i; From faf773a54bc04a3fd23569a711a72f1469194468 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Wed, 25 Dec 2024 19:26:24 -0500 Subject: [PATCH 113/145] feat: added time-blend override --- include/overworld.h | 16 +++-- include/palette.h | 7 +++ src/cable_car.c | 1 - src/field_weather.c | 4 +- src/overworld.c | 139 +++++++++++++++++++++++++++----------------- 5 files changed, 103 insertions(+), 64 deletions(-) diff --git a/include/overworld.h b/include/overworld.h index a9354ad80c..ba34836410 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -30,6 +30,11 @@ #define TIME_OF_DAY_DAY 2 #define TIME_OF_DAY_MAX TIME_OF_DAY_DAY +// trigger a time-of-day blend once +#define HOURS_BLEND_ONCE 25 +// don't update currentTimeBlend +#define HOURS_FREEZE_BLEND 26 + struct InitialPlayerAvatarState { u8 transitionFlags; @@ -44,14 +49,6 @@ struct LinkPlayerObjectEvent u8 movementMode; }; -struct __attribute__((packed)) TimeBlendSettings { - u16 weight:9; - u16 time1:3; - u16 time0:3; - u16 unused:1; - u16 altWeight; -}; - // Exported RAM declarations extern struct WarpData gLastUsedWarp; extern struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4]; @@ -65,7 +62,7 @@ extern bool8 (*gFieldCallback2)(void); extern u8 gLocalLinkPlayerId; extern u8 gFieldLinkPlayerCount; extern u8 gTimeOfDay; -extern u16 gTimeUpdateCounter; +extern s16 gTimeUpdateCounter; extern struct TimeBlendSettings currentTimeBlend; @@ -175,5 +172,6 @@ bool32 Overworld_RecvKeysFromLinkIsRunning(void); bool32 Overworld_SendKeysToLinkIsRunning(void); bool32 IsSendingKeysOverCable(void); void ClearLinkPlayerObjectEvents(void); +bool16 SetTimeOfDay(u16 hours); #endif // GUARD_OVERWORLD_H diff --git a/include/palette.h b/include/palette.h index 930499b877..f86ab00a63 100644 --- a/include/palette.h +++ b/include/palette.h @@ -45,6 +45,13 @@ struct BlendSettings { u32 coeff:5; }; +struct __attribute__((packed)) TimeBlendSettings { + struct BlendSettings bld0; + struct BlendSettings bld1; + u16 weight; + u16 altWeight; +}; + struct PaletteFadeControl { u32 multipurpose1; // This field needs to exist or errors will occur diff --git a/src/cable_car.c b/src/cable_car.c index 8a666a536e..d4fcfec59d 100644 --- a/src/cable_car.c +++ b/src/cable_car.c @@ -1058,4 +1058,3 @@ static void InitGroundTilemapData(bool8 goingDown) sCableCar->groundTimer = 0; } - diff --git a/src/field_weather.c b/src/field_weather.c index eaa25078b6..9f41014ff3 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -799,8 +799,8 @@ void FadeScreen(u8 mode, s8 delay) if (MapHasNaturalLight(gMapHeader.mapType)) { UpdateAltBgPalettes(PALETTES_BG); BeginTimeOfDayPaletteFade(PALETTES_ALL, delay, 16, 0, - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], + ¤tTimeBlend.bld0, + ¤tTimeBlend.bld1, currentTimeBlend.weight, fadeColor); } else { BeginNormalPaletteFade(PALETTES_ALL, delay, 16, 0, fadeColor); diff --git a/src/overworld.c b/src/overworld.c index cbe0347768..8a99173c6c 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -194,7 +194,7 @@ u8 gFieldLinkPlayerCount; u8 gTimeOfDay; struct TimeBlendSettings currentTimeBlend; -u16 gTimeUpdateCounter; // playTimeVBlanks will eventually overflow, so this is used to update TOD +s16 gTimeUpdateCounter; // playTimeVBlanks will eventually overflow, so this is used to update TOD // EWRAM vars EWRAM_DATA static u8 sObjectEventLoadFlag = 0; @@ -206,6 +206,7 @@ EWRAM_DATA static u16 sLastMapSectionId = 0; EWRAM_DATA static struct InitialPlayerAvatarState sInitialPlayerAvatarState = {0}; EWRAM_DATA static u16 sAmbientCrySpecies = 0; EWRAM_DATA static bool8 sIsAmbientCryWaterMon = FALSE; +EWRAM_DATA static u8 sHoursOverride = 0; // used to override apparent time of day hours EWRAM_DATA struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4] = {0}; static const struct WarpData sDummyWarpData = @@ -853,6 +854,8 @@ static void LoadMapFromWarp(bool32 a1) CheckLeftFriendsSecretBase(); TrySetMapSaveWarpStatus(); ClearTempFieldEventData(); + // reset hours override on every warp + sHoursOverride = 0; ResetCyclingRoadChallengeData(); RestartWildEncounterImmunitySteps(); TryUpdateRandomTrainerRematches(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); @@ -1481,44 +1484,65 @@ const struct BlendSettings gTimeOfDayBlend[] = u8 UpdateTimeOfDay(void) { s32 hours, minutes; RtcCalcLocalTime(); - hours = gLocalTime.hours; - minutes = gLocalTime.minutes; - if (hours < 4) { // night + hours = sHoursOverride ? sHoursOverride : gLocalTime.hours; + minutes = sHoursOverride ? 0 : gLocalTime.minutes; + switch (hours) + { + case 0 ... 3: // night + gTimeOfDay = TIME_OF_DAY_NIGHT; + currentTimeBlend.bld0 = currentTimeBlend.bld1 = gTimeOfDayBlend[gTimeOfDay]; currentTimeBlend.weight = 256; currentTimeBlend.altWeight = 0; - gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; - } else if (hours < 7) { // night->twilight - currentTimeBlend.time0 = TIME_OF_DAY_NIGHT; - currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; + break; + case 4 ... 6: // night -> twilight + currentTimeBlend.bld0 = gTimeOfDayBlend[TIME_OF_DAY_NIGHT]; + currentTimeBlend.bld1 = gTimeOfDayBlend[TIME_OF_DAY_TWILIGHT]; currentTimeBlend.weight = 256 - 256 * ((hours - 4) * 60 + minutes) / ((7-4)*60); currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2; gTimeOfDay = TIME_OF_DAY_DAY; - } else if (hours < 10) { // twilight->day - currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; - currentTimeBlend.time1 = TIME_OF_DAY_DAY; + break; + case 7 ... 9: // twilight -> day + currentTimeBlend.bld0 = gTimeOfDayBlend[TIME_OF_DAY_TWILIGHT]; + currentTimeBlend.bld1 = gTimeOfDayBlend[TIME_OF_DAY_DAY]; currentTimeBlend.weight = 256 - 256 * ((hours - 7) * 60 + minutes) / ((10-7)*60); currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2 + 128; gTimeOfDay = TIME_OF_DAY_DAY; - } else if (hours < 18) { // day + break; + case 10 ... 17: // day + gTimeOfDay = TIME_OF_DAY_DAY; + currentTimeBlend.bld0 = currentTimeBlend.bld1 = gTimeOfDayBlend[gTimeOfDay]; currentTimeBlend.weight = currentTimeBlend.altWeight = 256; - gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_DAY; - } else if (hours < 20) { // day->twilight - currentTimeBlend.time0 = TIME_OF_DAY_DAY; - currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; + break; + case 18 ... 19: // day -> twilight + currentTimeBlend.bld0 = gTimeOfDayBlend[TIME_OF_DAY_DAY]; + currentTimeBlend.bld1 = gTimeOfDayBlend[TIME_OF_DAY_TWILIGHT]; currentTimeBlend.weight = 256 - 256 * ((hours - 18) * 60 + minutes) / ((20-18)*60); currentTimeBlend.altWeight = currentTimeBlend.weight / 2 + 128; gTimeOfDay = TIME_OF_DAY_TWILIGHT; - } else if (hours < 22) { // twilight->night - currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; - currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; + break; + case 20 ... 21: // twilight -> night + currentTimeBlend.bld0 = gTimeOfDayBlend[TIME_OF_DAY_TWILIGHT]; + currentTimeBlend.bld1 = gTimeOfDayBlend[TIME_OF_DAY_NIGHT]; currentTimeBlend.weight = 256 - 256 * ((hours - 20) * 60 + minutes) / ((22-20)*60); currentTimeBlend.altWeight = currentTimeBlend.weight / 2; gTimeOfDay = TIME_OF_DAY_NIGHT; - } else { // 22-24, night + break; + case 22 ... 24: + gTimeOfDay = TIME_OF_DAY_NIGHT; + currentTimeBlend.bld0 = currentTimeBlend.bld1 = gTimeOfDayBlend[gTimeOfDay]; currentTimeBlend.weight = 256; currentTimeBlend.altWeight = 0; - gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; + break; + // special value; always causes a blend update, + // and increments sHoursOverride + case HOURS_BLEND_ONCE: + currentTimeBlend.weight ^= 1; + sHoursOverride++; + break; + case HOURS_FREEZE_BLEND: + break; } + return gTimeOfDay; } @@ -1565,32 +1589,32 @@ void UpdatePalettesWithTime(u32 palettes) { if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(i))) palettes &= ~(mask); - palettes &= PALETTES_MAP | PALETTES_OBJECTS; // Don't blend UI pals - if (!palettes) - return; - TimeMixPalettes( - palettes, - gPlttBufferUnfaded, - gPlttBufferFaded, - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], - currentTimeBlend.weight - ); + palettes &= PALETTES_MAP | PALETTES_OBJECTS; // Don't blend UI pals + if (!palettes) + return; + TimeMixPalettes( + palettes, + gPlttBufferUnfaded, + gPlttBufferFaded, + ¤tTimeBlend.bld0, + ¤tTimeBlend.bld1, + currentTimeBlend.weight + ); } } u8 UpdateSpritePaletteWithTime(u8 paletteNum) { if (MapHasNaturalLight(gMapHeader.mapType)) { if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(paletteNum))) - return paletteNum; - TimeMixPalettes( - 1, - &gPlttBufferUnfaded[OBJ_PLTT_ID(paletteNum)], - &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], - currentTimeBlend.weight - ); + return paletteNum; + TimeMixPalettes( + 1, + &gPlttBufferUnfaded[OBJ_PLTT_ID(paletteNum)], + &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], + ¤tTimeBlend.bld0, + ¤tTimeBlend.bld1, + currentTimeBlend.weight + ); } return paletteNum; } @@ -1607,18 +1631,16 @@ static void OverworldBasic(void) UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); // Every minute if no palette fade is active, update TOD blending as needed - if (!gPaletteFade.active && ++gTimeUpdateCounter >= 3600) { - struct TimeBlendSettings cachedBlend = { - .time0 = currentTimeBlend.time0, - .time1 = currentTimeBlend.time1, - .weight = currentTimeBlend.weight, - }; - gTimeUpdateCounter = 0; + if (!gPaletteFade.active && --gTimeUpdateCounter <= 0) { + struct TimeBlendSettings cachedBlend = currentTimeBlend; + u32 *bld0 = (u32*)&cachedBlend; + u32 *bld1 = (u32*)¤tTimeBlend; + gTimeUpdateCounter = 3600; UpdateTimeOfDay(); - if (cachedBlend.time0 != currentTimeBlend.time0 - || cachedBlend.time1 != currentTimeBlend.time1 - || cachedBlend.weight != currentTimeBlend.weight) - { + if (bld0[0] != bld1[0] + || bld0[1] != bld1[1] + || bld0[2] != bld1[2] + ) { UpdateAltBgPalettes(PALETTES_BG); UpdatePalettesWithTime(PALETTES_ALL); } @@ -3380,3 +3402,16 @@ static void SpriteCB_LinkPlayer(struct Sprite *sprite) sprite->data[7]++; } } + +// returns old sHoursOverride +u16 SetTimeOfDay(u16 hours) { + u16 oldHours = sHoursOverride; + sHoursOverride = hours; + gTimeUpdateCounter = 0; + return oldHours; +} + +bool8 ScrFunc_settimeofday(struct ScriptContext *ctx) { + SetTimeOfDay(ScriptReadByte(ctx)); + return FALSE; +} From 4047f9b7644ece47f0f4c7240641b7e9b4c52cd4 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Wed, 25 Dec 2024 19:48:54 -0500 Subject: [PATCH 114/145] feat: added FadeScreenHardware utility --- include/field_weather.h | 1 + include/palette.h | 2 +- src/field_weather.c | 29 +++++++++++++++++++++++++++++ src/palette.c | 5 +++-- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/include/field_weather.h b/include/field_weather.h index d741bdd2b0..a8550845cc 100644 --- a/include/field_weather.h +++ b/include/field_weather.h @@ -152,6 +152,7 @@ void SetCurrentAndNextWeatherNoDelay(u8 weather); void ApplyWeatherColorMapIfIdle(s8 colorMapIndex); void ApplyWeatherColorMapIfIdle_Gradual(u8 colorMapIndex, u8 targetColorMapIndex, u8 colorMapStepDelay); void FadeScreen(u8 mode, s8 delay); +u16 FadeScreenHardware(u8 mode, s8 delay); bool8 IsWeatherNotFadingIn(void); void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog); void ApplyWeatherColorMapToPal(u8 paletteIndex); diff --git a/include/palette.h b/include/palette.h index f86ab00a63..30592a4ecb 100644 --- a/include/palette.h +++ b/include/palette.h @@ -99,7 +99,7 @@ void InvertPlttBuffer(u32 selectedPalettes); void TintPlttBuffer(u32 selectedPalettes, s8 r, s8 g, s8 b); void UnfadePlttBuffer(u32 selectedPalettes); void BeginFastPaletteFade(u8 submode); -void BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters); +void BeginHardwarePaletteFade(u16 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters); void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color); void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color); void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color); diff --git a/src/field_weather.c b/src/field_weather.c index 9f41014ff3..2bcaa2f857 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -815,6 +815,35 @@ void FadeScreen(u8 mode, s8 delay) } } +// fades screen using BLDY +// Note: This enables blending in all windows; +// These bits may need to be disabled later +u16 FadeScreenHardware(u8 mode, s8 delay) { + u16 bldCnt = GetGpuReg(REG_OFFSET_BLDCNT) & BLDCNT_TGT2_ALL; + bldCnt |= BLDCNT_TGT1_ALL; + // enable blend in all windows + SetGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_CLR | WININ_WIN1_CLR); + SetGpuRegBits(REG_OFFSET_WINOUT, WINOUT_WIN01_CLR); + + switch (mode) + { + case FADE_FROM_BLACK: + BeginHardwarePaletteFade(bldCnt | BLDCNT_EFFECT_DARKEN, delay, 16, 0, TRUE); + break; + case FADE_TO_BLACK: + BeginHardwarePaletteFade(bldCnt | BLDCNT_EFFECT_DARKEN, delay, 0, 16, FALSE); + break; + case FADE_FROM_WHITE: + BeginHardwarePaletteFade(bldCnt | BLDCNT_EFFECT_LIGHTEN, delay, 16, 0, TRUE); + break; + case FADE_TO_WHITE: + BeginHardwarePaletteFade(bldCnt | BLDCNT_EFFECT_LIGHTEN, delay, 0, 16, FALSE); + break; + } + + return 0; +} + bool8 IsWeatherNotFadingIn(void) { return (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_IN); diff --git a/src/palette.c b/src/palette.c index ddc0688209..3ea2a08195 100644 --- a/src/palette.c +++ b/src/palette.c @@ -896,7 +896,7 @@ static u8 UpdateFastPaletteFade(void) return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE; } -void BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters) +void BeginHardwarePaletteFade(u16 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters) { gPaletteFade_blendCnt = blendCnt; gPaletteFade.delayCounter = delay; @@ -950,7 +950,8 @@ static u8 UpdateHardwarePaletteFade(void) { if (gPaletteFade.shouldResetBlendRegisters) { - gPaletteFade_blendCnt = 0; + // clear TGT1 + gPaletteFade_blendCnt &= ~0xFF; gPaletteFade.y = 0; } gPaletteFade.shouldResetBlendRegisters = FALSE; From 0f417109db229bad286f3b117c9534ac71012136 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 3 Jan 2025 13:33:05 -0300 Subject: [PATCH 115/145] Moved .pla file documentation --- docs/SUMMARY.md | 1 + docs/tutorials/dns.md | 16 ++++++++++++++++ src/data/tilesets/headers.h | 2 +- 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 docs/tutorials/dns.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 21584f3ad7..6ef80644e6 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -18,6 +18,7 @@ - [v1.7.x](tutorials/how_to_new_pokemon_1_7_0.md) - [v1.6.x](tutorials/how_to_new_pokemon_1_6_0.md) - [How to use the Testing System](tutorials/how_to_testing_system.md) + - [Day/Night System FAQ](tutorials/dns.md) - [Changelog](./CHANGELOG.md) - [1.10.x]() - [Version 1.10.0](changelogs/1.10.x/1.10.0.md) diff --git a/docs/tutorials/dns.md b/docs/tutorials/dns.md new file mode 100644 index 0000000000..860fa94371 --- /dev/null +++ b/docs/tutorials/dns.md @@ -0,0 +1,16 @@ +## Day/Night system FAQ + +### Q: How do I mark certain colors in a palette as light-blended? +A: Create a `.pla` file in the same folder as the `.pal` with the same name. + +In this file you can enter color indices [0,15] +on separate lines to mark those colors as being light-blended, i.e: + +`06.pla:` +``` +# A comment +0 # if color 0 is listed, uses it to blend with instead of the default! +1 +9 +10 +``` \ No newline at end of file diff --git a/src/data/tilesets/headers.h b/src/data/tilesets/headers.h index f6afbcef53..6ac09b5f07 100644 --- a/src/data/tilesets/headers.h +++ b/src/data/tilesets/headers.h @@ -7,7 +7,7 @@ // consider taking a look at the .pla files // to mark colors as lights, instead. // The old method *should* still work, however. -// See the README for details. +// Check docs/tutorials/dns.md for details. // Whether a palette has lights the color indices to blend are stored in the palette's color 0 #define LIGHT_PAL(x) ((x) < NUM_PALS_IN_PRIMARY ? 1 << (x) : 1 << ((x) - NUM_PALS_IN_PRIMARY)) From fe9297e4c979869c51213f7b76ca5f0c99a7304c Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 3 Jan 2025 13:40:02 -0300 Subject: [PATCH 116/145] Styling of TimeMixPalettes --- src/overworld.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/overworld.c b/src/overworld.c index c2eaa27003..30b65a1f1d 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1656,14 +1656,7 @@ void UpdatePalettesWithTime(u32 palettes) palettes &= PALETTES_MAP | PALETTES_OBJECTS; // Don't blend UI pals if (!palettes) return; - TimeMixPalettes( - palettes, - gPlttBufferUnfaded, - gPlttBufferFaded, - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], - currentTimeBlend.weight - ); + TimeMixPalettes(palettes, gPlttBufferUnfaded, gPlttBufferFaded, (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], currentTimeBlend.weight); } } @@ -1673,12 +1666,7 @@ u8 UpdateSpritePaletteWithTime(u8 paletteNum) { if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(paletteNum))) return paletteNum; - TimeMixPalettes(1, - &gPlttBufferUnfaded[OBJ_PLTT_ID(paletteNum)], - &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], - currentTimeBlend.weight + TimeMixPalettes(1, &gPlttBufferUnfaded[OBJ_PLTT_ID(paletteNum)], &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], currentTimeBlend.weight ); } return paletteNum; From 161c3aadea6d9789b38be34d4213204b82b731f2 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 3 Jan 2025 13:51:11 -0300 Subject: [PATCH 117/145] OW_OBJECT_SUBPRIORITY --- include/config/overworld.h | 1 + src/field_effect_helpers.c | 2 +- src/rotating_gate.c | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/config/overworld.h b/include/config/overworld.h index ca2fd3fe55..4ceeae91c1 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -80,6 +80,7 @@ // Lighting #define OW_SHADOW_INTENSITY 4 // Ranges from 0 to 16, where 0 is fully transparent and 16 is black. +#define OW_OBJECT_SUBPRIORITY 148 // The higher the value, the farther back compared to other sprites. Shadows should be behind object events. // Overworld flags // To use the following features in scripting, replace the 0s with the flag ID you're assigning it to. diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index cd23ea5bac..9f8324aee6 100644 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -347,7 +347,7 @@ u32 FldEff_Shadow(void) if (graphicsInfo->shadowSize == SHADOW_SIZE_NONE) // don't create a shadow at all return 0; LoadSpriteSheetByTemplate(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 0x94 + 1); // higher = farther back; shadows should be behind object events + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, OW_OBJECT_SUBPRIORITY + 1); if (spriteId != MAX_SPRITES) { // SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 12)); diff --git a/src/rotating_gate.c b/src/rotating_gate.c index 796c64cecb..7ff04b508f 100644 --- a/src/rotating_gate.c +++ b/src/rotating_gate.c @@ -740,7 +740,7 @@ static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY) template.tileTag = gate->shape + ROTATING_GATE_TILE_TAG; - spriteId = CreateSprite(&template, 0, 0, 0x93); // 0x93 is above shadows (0x94) + spriteId = CreateSprite(&template, 0, 0, OW_OBJECT_SUBPRIORITY - 1); // Above shadows if (spriteId == MAX_SPRITES) return MAX_SPRITES; From 4233f0e2772881a473d4aba071c5bc480630063d Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 17 Jan 2025 18:07:56 -0300 Subject: [PATCH 118/145] Test permission fix --- src/data/object_events/object_event_graphics_info_pointers.h | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 src/data/object_events/object_event_graphics_info_pointers.h diff --git a/src/data/object_events/object_event_graphics_info_pointers.h b/src/data/object_events/object_event_graphics_info_pointers.h old mode 100644 new mode 100755 From b00b2a9dedc92de115ceb4d7818eb524453f250c Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 17 Jan 2025 18:11:25 -0300 Subject: [PATCH 119/145] Fixed the rest of the conditions --- src/data/field_effects/field_effect_objects.h | 0 src/data/object_events/object_event_graphics.h | 0 src/data/object_events/object_event_graphics_info.h | 0 src/data/object_events/object_event_pic_tables.h | 0 src/field_effect_helpers.c | 0 5 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 src/data/field_effects/field_effect_objects.h mode change 100644 => 100755 src/data/object_events/object_event_graphics.h mode change 100644 => 100755 src/data/object_events/object_event_graphics_info.h mode change 100644 => 100755 src/data/object_events/object_event_pic_tables.h mode change 100644 => 100755 src/field_effect_helpers.c diff --git a/src/data/field_effects/field_effect_objects.h b/src/data/field_effects/field_effect_objects.h old mode 100644 new mode 100755 diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h old mode 100644 new mode 100755 diff --git a/src/data/object_events/object_event_graphics_info.h b/src/data/object_events/object_event_graphics_info.h old mode 100644 new mode 100755 diff --git a/src/data/object_events/object_event_pic_tables.h b/src/data/object_events/object_event_pic_tables.h old mode 100644 new mode 100755 diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c old mode 100644 new mode 100755 From c363c28b22a2c409486213d6d80041cd3bd47c56 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 17 Jan 2025 18:21:48 -0300 Subject: [PATCH 120/145] Addressing a bunch of small things --- data/maps/MtPyre_Summit/scripts.inc | 1 + data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc | 1 + graphics/pokemon/ampharos/normal.pla | 2 +- graphics/pokemon/ampharos/shiny.pla | 2 +- include/palette.h | 2 +- src/event_object_movement.c | 9 +++++++-- src/field_weather.c | 9 ++++----- src/field_weather_effect.c | 4 ++-- src/overworld.c | 2 ++ src/pokemon_summary_screen.c | 2 +- 10 files changed, 21 insertions(+), 13 deletions(-) diff --git a/data/maps/MtPyre_Summit/scripts.inc b/data/maps/MtPyre_Summit/scripts.inc index 5a6d23797a..2d85cf17f5 100644 --- a/data/maps/MtPyre_Summit/scripts.inc +++ b/data/maps/MtPyre_Summit/scripts.inc @@ -622,3 +622,4 @@ MtPyre_Summit_Text_HoennTrioTale: .string "becalmed the two enraged POKéMON.\p" .string "Then, its duty done, the green POKéMON\n" .string "flew off into the wild blue yonder…$" + diff --git a/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc b/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc index fd6567cb65..76b6784562 100644 --- a/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc +++ b/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc @@ -103,3 +103,4 @@ SlateportCity_BattleTentBattleRoom_Movement_OpponentEnter: walk_down walk_in_place_faster_left step_end + diff --git a/graphics/pokemon/ampharos/normal.pla b/graphics/pokemon/ampharos/normal.pla index 88043ac888..debe6624ba 100644 --- a/graphics/pokemon/ampharos/normal.pla +++ b/graphics/pokemon/ampharos/normal.pla @@ -4,4 +4,4 @@ 11 12 13 -14 \ No newline at end of file +14 diff --git a/graphics/pokemon/ampharos/shiny.pla b/graphics/pokemon/ampharos/shiny.pla index 88043ac888..debe6624ba 100644 --- a/graphics/pokemon/ampharos/shiny.pla +++ b/graphics/pokemon/ampharos/shiny.pla @@ -4,4 +4,4 @@ 11 12 13 -14 \ No newline at end of file +14 diff --git a/include/palette.h b/include/palette.h index e127d7fe65..4d918e9001 100644 --- a/include/palette.h +++ b/include/palette.h @@ -101,7 +101,7 @@ void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u32 color); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor); void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor); -void TimeMixPalettes(u32, u16 *, u16 *, struct BlendSettings *, struct BlendSettings *, u16); +void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *blend0, struct BlendSettings *blend1, u16 weight0); void AvgPaletteWeighted(u16 *src0, u16 *src1, u16 *dst, u16 weight0); void TintPalette_GrayScale(u16 *palette, u32 count); void TintPalette_GrayScale2(u16 *palette, u32 count); diff --git a/src/event_object_movement.c b/src/event_object_movement.c index c3b8f0facb..53380777d4 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2613,6 +2613,8 @@ void GetFollowerAction(struct ScriptContext *ctx) // Essentially a big switch fo gFollowerBasicMessages[emotion].script); } +#define sLightType data[5] + // Sprite callback for light sprites void UpdateLightSprite(struct Sprite *sprite) { @@ -2641,7 +2643,7 @@ void UpdateLightSprite(struct Sprite *sprite) return; } - switch (sprite->data[5]) // lightType + switch (sprite->sLightType) { default: case LIGHT_TYPE_BALL: @@ -2693,7 +2695,7 @@ static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) else UpdateSpritePaletteByTemplate(template, sprite); GetMapCoordsFromSpritePos(x + camX, y + camY, &sprite->x, &sprite->y); - sprite->data[5] = lightType; + sprite->sLightType = lightType; sprite->data[6] = x; sprite->data[7] = y; sprite->affineAnims = gDummySpriteAffineAnimTable; @@ -2718,9 +2720,12 @@ static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) sprite->oam.priority = 2; sprite->subpriority = 0xFF; sprite->oam.objMode = ST_OAM_OBJ_BLEND; + break; } } +#undef sLightType + void TrySpawnLightSprites(s16 camX, s16 camY) { u32 i; diff --git a/src/field_weather.c b/src/field_weather.c index 485f63c0f0..9274863be1 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -531,7 +531,6 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) } else { - // copy CpuFastCopy(&gPlttBufferUnfaded[PLTT_ID(startPalIndex)], &gPlttBufferFaded[PLTT_ID(startPalIndex)], numPalettes * PLTT_SIZE_4BPP); } } @@ -681,7 +680,7 @@ static void MarkFogSpritePalToLighten(u8 paletteIndex) static bool8 LightenSpritePaletteInFog(u8 paletteIndex) { - u16 i; + u32 i; if (paletteIndex >= 16 && IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(paletteIndex - 16))) return FALSE; @@ -883,9 +882,9 @@ static bool8 UNUSED IsFirstFrameOfWeatherFadeIn(void) void LoadCustomWeatherSpritePalette(const u16 *palette) { - if (gWeatherPtr->weatherPicSpritePalIndex > 16) // haven't allocated palette yet - if ((gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(PALTAG_WEATHER_2)) > 16) - return; + if (gWeatherPtr->weatherPicSpritePalIndex > 16 // haven't allocated palette yet + && (gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(PALTAG_WEATHER_2)) > 16) + return; LoadPalette(palette, OBJ_PLTT_ID(gWeatherPtr->weatherPicSpritePalIndex), PLTT_SIZE_4BPP); UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex, TRUE); } diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index 2ac3a2f52a..df23a6b0e0 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -1415,8 +1415,8 @@ void FogHorizontal_Main(void) CreateFogHorizontalSprites(); if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) { - Weather_SetTargetBlendCoeffs(12, 8, 3); - UpdateShadowColor(RGB(15, 15, 15)); // Gray + Weather_SetTargetBlendCoeffs(12, 8, 3); + UpdateShadowColor(RGB(15, 15, 15)); // Gray } else { diff --git a/src/overworld.c b/src/overworld.c index 58d60e8d2b..4d4d74e5dc 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1653,8 +1653,10 @@ void UpdatePalettesWithTime(u32 palettes) u32 mask = 1 << 16; if (palettes >= (1 << 16)) for (i = 0; i < 16; i++, mask <<= 1) + { if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(i))) palettes &= ~(mask); + } palettes &= PALETTES_MAP | PALETTES_OBJECTS; // Don't blend UI pals if (!palettes) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 913d55fc0d..f0c65dc2a7 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -3955,7 +3955,7 @@ static void SetSpriteInvisibility(u8 spriteArrayId, bool8 invisible) static void HidePageSpecificSprites(void) { - // Keeps POKéMON, caught ball and status sprites visible. + // Keeps Pok�mon, caught ball and status sprites visible. u8 i; for (i = SPRITE_ARR_ID_TYPE; i < ARRAY_COUNT(sMonSummaryScreen->spriteIds); i++) From ffc8903f93d115ad375e09df3b45f05bed986371 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 17 Jan 2025 18:47:38 -0300 Subject: [PATCH 121/145] More review addressing --- include/constants/field_weather.h | 2 ++ include/overworld.h | 4 ++-- src/battle_transition.c | 4 ++-- src/field_weather.c | 4 ++-- src/field_weather_effect.c | 3 --- src/overworld.c | 32 +++++++++++++++---------------- src/palette.c | 14 +++++++------- src/palette_util.c | 2 +- src/sprite.c | 1 + src/util.c | 2 +- tools/gbagfx/jasc_pal.c | 3 +-- 11 files changed, 35 insertions(+), 36 deletions(-) diff --git a/include/constants/field_weather.h b/include/constants/field_weather.h index bc4826ee36..d4f17e261c 100644 --- a/include/constants/field_weather.h +++ b/include/constants/field_weather.h @@ -24,6 +24,8 @@ #define FADE_FROM_WHITE 2 #define FADE_TO_WHITE 3 +// Shadows values #define BASE_SHADOW_INTENSITY (16 - OW_SHADOW_INTENSITY) +#define SHADOW_COLOR_INDEX 9 // Within the weather palette, shadow sprites' color index #endif // GUARD_CONSTANTS_FIELD_WEATHER_H diff --git a/include/overworld.h b/include/overworld.h index 328655ecda..d62d76c24c 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -43,8 +43,8 @@ struct LinkPlayerObjectEvent struct __attribute__((packed)) TimeBlendSettings { u16 weight:9; - u16 time1:3; - u16 time0:3; + u16 finalTimeOfDay:3; + u16 initialTimeOfDay:3; u16 unused:1; u16 altWeight; }; diff --git a/src/battle_transition.c b/src/battle_transition.c index 422257433c..1aabda2aa3 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -3916,7 +3916,7 @@ void Task_BattleTransition_Intro(u8 taskId) static bool8 TransitionIntro_FadeToGray(struct Task *task) { u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); - u16 index = OBJ_PLTT_ID(paletteNum) + 9; // SHADOW_COLOR_INDEX + u16 index = OBJ_PLTT_ID(paletteNum) + SHADOW_COLOR_INDEX; if (task->tDelayTimer == 0 || --task->tDelayTimer == 0) { task->tDelayTimer = task->tFadeToGrayDelay; @@ -3957,7 +3957,7 @@ static bool8 TransitionIntro_FadeFromGray(struct Task *task) SetGpuReg(REG_OFFSET_BLDCNT, task->tBldCntSaved); if (paletteNum < 16) { - u16 index = OBJ_PLTT_ID(paletteNum) + 9; // SHADOW_COLOR_INDEX + u16 index = OBJ_PLTT_ID(paletteNum) + SHADOW_COLOR_INDEX; gPlttBufferFaded[index] = task->tShadowColor; } } diff --git a/src/field_weather.c b/src/field_weather.c index 9274863be1..db6ab5d179 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -781,8 +781,8 @@ void FadeScreen(u8 mode, s8 delay) { UpdateAltBgPalettes(PALETTES_BG); BeginTimeOfDayPaletteFade(PALETTES_ALL, delay, 16, 0, - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], - (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.initialTimeOfDay], + (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.finalTimeOfDay], currentTimeBlend.weight, fadeColor); } else diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index df23a6b0e0..e00e7ba863 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -1355,9 +1355,6 @@ void FogHorizontal_Main(void); static void CreateFogHorizontalSprites(void); static void DestroyFogHorizontalSprites(void); -// Within the weather palette, shadow sprites' color index -#define SHADOW_COLOR_INDEX 9 - // Updates just the color of shadows to match special weather blending u8 UpdateShadowColor(u16 color) { diff --git a/src/overworld.c b/src/overworld.c index 4d4d74e5dc..4c353b7562 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1562,32 +1562,32 @@ void UpdateTimeOfDay(void) if (IsBetweenHours(hours, MORNING_HOUR_BEGIN, MORNING_HOUR_MIDDLE)) // night->morning { - currentTimeBlend.time0 = TIME_NIGHT; - currentTimeBlend.time1 = TIME_MORNING; + currentTimeBlend.initialTimeOfDay = TIME_NIGHT; + currentTimeBlend.finalTimeOfDay = TIME_MORNING; currentTimeBlend.weight = TIME_BLEND_WEIGHT(MORNING_HOUR_BEGIN, MORNING_HOUR_MIDDLE); currentTimeBlend.altWeight = (DEFAULT_WEIGHT - currentTimeBlend.weight) / 2; gTimeOfDay = TIME_MORNING; } else if (IsBetweenHours(hours, MORNING_HOUR_MIDDLE, MORNING_HOUR_END)) // morning->day { - currentTimeBlend.time0 = TIME_MORNING; - currentTimeBlend.time1 = TIME_DAY; + currentTimeBlend.initialTimeOfDay = TIME_MORNING; + currentTimeBlend.finalTimeOfDay = TIME_DAY; currentTimeBlend.weight = TIME_BLEND_WEIGHT(MORNING_HOUR_MIDDLE, MORNING_HOUR_END); currentTimeBlend.altWeight = (DEFAULT_WEIGHT - currentTimeBlend.weight) / 2 + (DEFAULT_WEIGHT / 2); gTimeOfDay = TIME_MORNING; } else if (IsBetweenHours(hours, EVENING_HOUR_BEGIN, EVENING_HOUR_END)) // evening { - currentTimeBlend.time0 = TIME_DAY; - currentTimeBlend.time1 = TIME_EVENING; + currentTimeBlend.initialTimeOfDay = TIME_DAY; + currentTimeBlend.finalTimeOfDay = TIME_EVENING; currentTimeBlend.weight = TIME_BLEND_WEIGHT(EVENING_HOUR_BEGIN, EVENING_HOUR_END); currentTimeBlend.altWeight = currentTimeBlend.weight / 2 + (DEFAULT_WEIGHT / 2); gTimeOfDay = TIME_EVENING; } else if (IsBetweenHours(hours, NIGHT_HOUR_BEGIN, NIGHT_HOUR_BEGIN + 1)) // evening->night { - currentTimeBlend.time0 = TIME_EVENING; - currentTimeBlend.time1 = TIME_NIGHT; + currentTimeBlend.initialTimeOfDay = TIME_EVENING; + currentTimeBlend.finalTimeOfDay = TIME_NIGHT; currentTimeBlend.weight = TIME_BLEND_WEIGHT(NIGHT_HOUR_BEGIN, NIGHT_HOUR_BEGIN + 1); currentTimeBlend.altWeight = currentTimeBlend.weight / 2; gTimeOfDay = TIME_NIGHT; @@ -1596,12 +1596,12 @@ void UpdateTimeOfDay(void) { currentTimeBlend.weight = DEFAULT_WEIGHT; currentTimeBlend.altWeight = 0; - gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_NIGHT; + gTimeOfDay = currentTimeBlend.initialTimeOfDay = currentTimeBlend.finalTimeOfDay = TIME_NIGHT; } else // day { currentTimeBlend.weight = currentTimeBlend.altWeight = DEFAULT_WEIGHT; - gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_DAY; + gTimeOfDay = currentTimeBlend.initialTimeOfDay = currentTimeBlend.finalTimeOfDay = TIME_DAY; } } @@ -1661,7 +1661,7 @@ void UpdatePalettesWithTime(u32 palettes) palettes &= PALETTES_MAP | PALETTES_OBJECTS; // Don't blend UI pals if (!palettes) return; - TimeMixPalettes(palettes, gPlttBufferUnfaded, gPlttBufferFaded, (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], currentTimeBlend.weight); + TimeMixPalettes(palettes, gPlttBufferUnfaded, gPlttBufferFaded, (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.initialTimeOfDay], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.finalTimeOfDay], currentTimeBlend.weight); } } @@ -1671,7 +1671,7 @@ u8 UpdateSpritePaletteWithTime(u8 paletteNum) { if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(paletteNum))) return paletteNum; - TimeMixPalettes(1, &gPlttBufferUnfaded[OBJ_PLTT_ID(paletteNum)], &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], currentTimeBlend.weight + TimeMixPalettes(1, &gPlttBufferUnfaded[OBJ_PLTT_ID(paletteNum)], &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.initialTimeOfDay], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.finalTimeOfDay], currentTimeBlend.weight ); } return paletteNum; @@ -1692,15 +1692,15 @@ static void OverworldBasic(void) if (!gPaletteFade.active && ++gTimeUpdateCounter >= (SECONDS_PER_MINUTE * 60 / FakeRtc_GetSecondsRatio())) { struct TimeBlendSettings cachedBlend = { - .time0 = currentTimeBlend.time0, - .time1 = currentTimeBlend.time1, + .initialTimeOfDay = currentTimeBlend.initialTimeOfDay, + .finalTimeOfDay = currentTimeBlend.finalTimeOfDay, .weight = currentTimeBlend.weight, }; gTimeUpdateCounter = 0; UpdateTimeOfDay(); FormChangeTimeUpdate(); - if (cachedBlend.time0 != currentTimeBlend.time0 - || cachedBlend.time1 != currentTimeBlend.time1 + if (cachedBlend.initialTimeOfDay != currentTimeBlend.initialTimeOfDay + || cachedBlend.finalTimeOfDay != currentTimeBlend.finalTimeOfDay || cachedBlend.weight != currentTimeBlend.weight) { UpdateAltBgPalettes(PALETTES_BG); diff --git a/src/palette.c b/src/palette.c index f2fdac9fdc..145b1e90d9 100644 --- a/src/palette.c +++ b/src/palette.c @@ -244,7 +244,7 @@ static u8 UpdateTimeOfDayPaletteFade(void) if (gPaletteFade.delayCounter < gPaletteFade_delay) { gPaletteFade.delayCounter++; - return 2; + return PALETTE_FADE_STATUS_DELAY; } gPaletteFade.delayCounter = 0; } @@ -284,8 +284,8 @@ static u8 UpdateTimeOfDayPaletteFade(void) // palettes that were not blended above must be copied through if ((copyPalettes = ~timePalettes)) { - u16 * src1 = src; - u16 * dst1 = dst; + u16 *src1 = src; + u16 *dst1 = dst; while (copyPalettes) { if (copyPalettes & 1) @@ -355,7 +355,7 @@ static u32 UpdateNormalPaletteFade(void) if (gPaletteFade.delayCounter < gPaletteFade_delay) { gPaletteFade.delayCounter++; - return 2; + return PALETTE_FADE_STATUS_DELAY; } gPaletteFade.delayCounter = 0; } @@ -870,14 +870,14 @@ void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *ble u32 defaultColor = DEFAULT_LIGHT_COLOR; if (!palettes) - return; + return; color0 = blend0->blendColor; tint0 = blend0->isTint; - coeff0 = tint0 ? 8*2 : blend0->coeff*2; + coeff0 = tint0 ? 16 : blend0->coeff * 2; color1 = blend1->blendColor; tint1 = blend1->isTint; - coeff1 = tint1 ? 8*2 : blend1->coeff*2; + coeff1 = tint1 ? 16 : blend1->coeff * 2; if (tint0) { diff --git a/src/palette_util.c b/src/palette_util.c index 54549ffcce..5effdd2b15 100644 --- a/src/palette_util.c +++ b/src/palette_util.c @@ -387,7 +387,7 @@ void UpdatePulseBlend(struct PulseBlend *pulseBlend) pulseBlendPalette->delayCounter = pulseBlendPalette->pulseBlendSettings.delay; CpuFastCopy(gPlttBufferUnfaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, gPlttBufferFaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, PLTT_SIZE_4BPP); UpdatePalettesWithTime(1 << (pulseBlendPalette->pulseBlendSettings.paletteOffset >> 4)); - // pulseBlendSettings has a numColors field, but it is only ever set to 16 (for mirage tower) + // pulseBlendSettings has a numColors field, but it is only ever set to 16 (for Mirage tower) // So, it's ok to use the fine blending here which blends the entire palette BlendPalettesFine(1, gPlttBufferFaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, gPlttBufferFaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, pulseBlendPalette->blendCoeff, pulseBlendPalette->pulseBlendSettings.blendColor); switch (pulseBlendPalette->pulseBlendSettings.fadeType) diff --git a/src/sprite.c b/src/sprite.c index c300e4a5bc..80418a0d76 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -1481,6 +1481,7 @@ u16 LoadSpriteSheetByTemplateWithOffset(const struct SpriteTemplate *template, u sheet.tag = template->tileTag; return LoadSpriteSheetWithOffset(&sheet, offset); } + // Like LoadSpriteSheet, but checks if already, and uses template image frames u16 LoadSpriteSheetByTemplate(const struct SpriteTemplate *template, u8 frame) { diff --git a/src/util.c b/src/util.c index 1d9db59160..6fb123662b 100644 --- a/src/util.c +++ b/src/util.c @@ -228,7 +228,7 @@ u32 CalcByteArraySum(const u8 *data, u32 length) void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u32 blendColor) { u16 i; - struct PlttData *data2 = (struct PlttData *)&blendColor; + struct PlttData *data2 = (struct PlttData *) & blendColor; for (i = 0; i < numEntries; i++) { u16 index = i + palOffset; diff --git a/tools/gbagfx/jasc_pal.c b/tools/gbagfx/jasc_pal.c index 732db08a1b..3ae7f8b905 100644 --- a/tools/gbagfx/jasc_pal.c +++ b/tools/gbagfx/jasc_pal.c @@ -166,8 +166,7 @@ void ReadJascPalette(char *path, struct Palette *palette) if (fp == NULL) return; - // fprintf(stderr, "Opened auxiliary .pla file for reading: %s\n", path); - + int i = 0; // Keep reading lines until number of colors is reached or we run out while (i < palette->numColors && fgets(line, MAX_LINE_LENGTH, fp) != NULL) From 6162628104d2bc9c1c39a00baca334351cb9205f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 17 Jan 2025 19:25:29 -0300 Subject: [PATCH 122/145] A bit more of addressing --- include/constants/rgb.h | 1 + src/battle_transition.c | 4 ++-- src/event_object_movement.c | 16 ++++++++++------ src/field_screen_effect.c | 4 ++-- src/field_weather_effect.c | 4 ++-- src/palette.c | 4 ++-- 6 files changed, 19 insertions(+), 14 deletions(-) diff --git a/include/constants/rgb.h b/include/constants/rgb.h index f73ab53b4b..9d50e8cd8b 100644 --- a/include/constants/rgb.h +++ b/include/constants/rgb.h @@ -15,6 +15,7 @@ #define RGB_BLACK RGB(0, 0, 0) #define RGB_WHITE RGB(31, 31, 31) +#define RGB_GRAY RGB(15, 15, 15) #define RGB_RED RGB(31, 0, 0) #define RGB_GREEN RGB(0, 31, 0) #define RGB_BLUE RGB(0, 0, 31) diff --git a/src/battle_transition.c b/src/battle_transition.c index 1aabda2aa3..1deddf59f0 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -1355,7 +1355,7 @@ static void InitPatternWeaveTransition(struct Task *task) sTransitionData->WIN0V = DISPLAY_HEIGHT; sTransitionData->BLDCNT = BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL; sTransitionData->BLDALPHA = BLDALPHA_BLEND(task->tBlendTarget2, task->tBlendTarget1); - UpdateShadowColor(RGB(15, 15, 15)); // force shadows to gray + UpdateShadowColor(RGB_GRAY); for (i = 0; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[1][i] = DISPLAY_WIDTH; @@ -4252,7 +4252,7 @@ static bool8 FrontierLogoWave_Init(struct Task *task) LZ77UnCompVram(sFrontierLogo_Tileset, tileset); LoadPalette(sFrontierLogo_Palette, BG_PLTT_ID(15), sizeof(sFrontierLogo_Palette)); sTransitionData->cameraY = 0; - UpdateShadowColor(RGB(15, 15, 15)); // force shadows to gray + UpdateShadowColor(RGB_GRAY); task->tState++; return FALSE; diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 53380777d4..687e41e193 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2614,6 +2614,8 @@ void GetFollowerAction(struct ScriptContext *ctx) // Essentially a big switch fo } #define sLightType data[5] +#define sLightXPos data[6] +#define sLightYPos data[7] // Sprite callback for light sprites void UpdateLightSprite(struct Sprite *sprite) @@ -2622,8 +2624,8 @@ void UpdateLightSprite(struct Sprite *sprite) s16 right = gSaveBlock1Ptr->pos.x + 17; s16 top = gSaveBlock1Ptr->pos.y; s16 bottom = gSaveBlock1Ptr->pos.y + 15; - s16 x = sprite->data[6]; - s16 y = sprite->data[7]; + s16 x = sprite->sLightXPos; + s16 y = sprite->sLightYPos; u16 sheetTileStart; u32 paletteNum; if (!(x >= left && x <= right && y >= top && y <= bottom)) @@ -2683,7 +2685,7 @@ static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) for (i = 0; i < MAX_SPRITES; i++) { sprite = &gSprites[i]; - if (sprite->inUse && sprite->callback == UpdateLightSprite && sprite->data[6] == x && sprite->data[7] == y) + if (sprite->inUse && sprite->callback == UpdateLightSprite && sprite->sLightXPos == x && sprite->sLightYPos == y) return; } lightType = min(lightType, ARRAY_COUNT(gFieldEffectLightTemplates) - 1); // bounds checking @@ -2696,8 +2698,8 @@ static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) UpdateSpritePaletteByTemplate(template, sprite); GetMapCoordsFromSpritePos(x + camX, y + camY, &sprite->x, &sprite->y); sprite->sLightType = lightType; - sprite->data[6] = x; - sprite->data[7] = y; + sprite->sLightXPos = x; + sprite->sLightYPos = y; sprite->affineAnims = gDummySpriteAffineAnimTable; sprite->affineAnimBeginning = TRUE; sprite->coordOffsetEnabled = TRUE; @@ -2725,6 +2727,8 @@ static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) } #undef sLightType +#undef sLightXPos +#undef sLightYPos void TrySpawnLightSprites(s16 camX, s16 camY) { @@ -10205,7 +10209,7 @@ static void GroundEffect_Shadow(struct ObjectEvent *objEvent, struct Sprite *spr static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *sprite, u32 flags) { - u8 i; + u32 i; if (ObjectEventIsFarawayIslandMew(objEvent) == TRUE && !ShouldMewShakeGrass(objEvent)) return; diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index be0e9bd792..2e23cc16e8 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -1156,7 +1156,7 @@ static void Task_OrbEffect(u8 taskId) ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON); SetGpuRegBits(REG_OFFSET_BLDCNT, gOrbEffectBackgroundLayerFlags[0]); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 7)); - UpdateShadowColor(RGB(9, 8, 8)); // force shadows to gray + UpdateShadowColor(RGB_GRAY); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ); SetBgTilemapPalette(0, 0, 0, DISPLAY_TILE_WIDTH, DISPLAY_TILE_HEIGHT, 0xF); @@ -1224,7 +1224,7 @@ static void Task_OrbEffect(u8 taskId) SetGpuReg(REG_OFFSET_DISPCNT, tDispCnt); SetGpuReg(REG_OFFSET_BLDCNT, tBldCnt); SetGpuReg(REG_OFFSET_BLDALPHA, tBldAlpha); - UpdateShadowColor(RGB_BLACK); // force shadows to gray + UpdateShadowColor(RGB_GRAY); SetGpuReg(REG_OFFSET_WININ, tWinIn); SetGpuReg(REG_OFFSET_WINOUT, tWinOut); ScriptContext_Enable(); diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index e00e7ba863..c98188b37c 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -1413,7 +1413,7 @@ void FogHorizontal_Main(void) if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) { Weather_SetTargetBlendCoeffs(12, 8, 3); - UpdateShadowColor(RGB(15, 15, 15)); // Gray + UpdateShadowColor(RGB_GRAY); } else { @@ -2005,7 +2005,7 @@ void Sandstorm_Main(void) break; case 1: Weather_SetTargetBlendCoeffs(16, 2, 0); - UpdateShadowColor(RGB(15, 15, 15)); + UpdateShadowColor(RGB_GRAY); gWeatherPtr->initStep++; break; case 2: diff --git a/src/palette.c b/src/palette.c index 145b1e90d9..b1cc98ae93 100644 --- a/src/palette.c +++ b/src/palette.c @@ -230,8 +230,8 @@ static u8 UpdateTimeOfDayPaletteFade(void) u16 selectedPalettes; u16 timePalettes = 0; // palettes passed to the time-blender u16 copyPalettes; - u16 * src; - u16 * dst; + u16 *src; + u16 *dst; if (!gPaletteFade.active) return PALETTE_FADE_STATUS_DONE; From 070f9ce4e1f99812327db1e3a987b6cab1781089 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 17 Jan 2025 20:07:48 -0300 Subject: [PATCH 123/145] Made MSG_COND_TIME_OF_DAY clearer --- src/event_object_movement.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 7ea2491ec7..edac91fcf5 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2391,9 +2391,14 @@ bool32 CheckMsgCondition(const struct MsgCondition *cond, struct Pokemon *mon, u case MSG_COND_MUSIC: return (cond->data.raw == GetCurrentMapMusic()); case MSG_COND_TIME_OF_DAY: + { // Must match time of day, have natural light on the map, // and not have weather that obscures the sky - return (cond->data.raw == gTimeOfDay && MapHasNaturalLight(gMapHeader.mapType) && GetCurrentWeather() < WEATHER_RAIN); + u32 weather = GetCurrentWeather(); + return (cond->data.raw == gTimeOfDay + && MapHasNaturalLight(gMapHeader.mapType) + && (weather == WEATHER_NONE || weather == WEATHER_SUNNY_CLOUDS || weather == WEATHER_SUNNY)); + } case MSG_COND_NEAR_MB: multi = FindMetatileBehaviorWithinRange(obj->currentCoords.x, obj->currentCoords.y, From d1fc3d70095804d07e0c2a2cf6590a0e3cd77a56 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 19 Jan 2025 22:13:08 -0300 Subject: [PATCH 124/145] Reverted orb effect shadow change --- src/field_screen_effect.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index 2e23cc16e8..77733d17b3 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -1156,7 +1156,7 @@ static void Task_OrbEffect(u8 taskId) ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON); SetGpuRegBits(REG_OFFSET_BLDCNT, gOrbEffectBackgroundLayerFlags[0]); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 7)); - UpdateShadowColor(RGB_GRAY); + UpdateShadowColor(RGB(9, 8, 8)); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ); SetBgTilemapPalette(0, 0, 0, DISPLAY_TILE_WIDTH, DISPLAY_TILE_HEIGHT, 0xF); @@ -1224,7 +1224,7 @@ static void Task_OrbEffect(u8 taskId) SetGpuReg(REG_OFFSET_DISPCNT, tDispCnt); SetGpuReg(REG_OFFSET_BLDCNT, tBldCnt); SetGpuReg(REG_OFFSET_BLDALPHA, tBldAlpha); - UpdateShadowColor(RGB_GRAY); + UpdateShadowColor(RGB_BLACK); SetGpuReg(REG_OFFSET_WININ, tWinIn); SetGpuReg(REG_OFFSET_WINOUT, tWinOut); ScriptContext_Enable(); From 090c4f39362d2852ff3071e012425a8ab569b803 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Fri, 24 Jan 2025 02:02:21 -0500 Subject: [PATCH 125/145] feat: hardware fades now affect BLDALPHA too --- include/gba/io_reg.h | 3 +++ src/palette.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index 53021185e3..75e3b56117 100644 --- a/include/gba/io_reg.h +++ b/include/gba/io_reg.h @@ -599,6 +599,7 @@ #define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA) #define BLDCNT_EFFECT_LIGHTEN (2 << 6) // 1st target becomes whiter (controlled by BLDY) #define BLDCNT_EFFECT_DARKEN (3 << 6) // 1st target becomes blacker (controlled by BLDY) +#define BLDCNT_EFFECT_EFF_MASK (3 << 6) // mask to check effect // Bits 8-13 select layers for the 2nd target #define BLDCNT_TGT2_BG0 (1 << 8) #define BLDCNT_TGT2_BG1 (1 << 9) @@ -611,6 +612,8 @@ // BLDALPHA #define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1)) +#define BLDALPHA_TGT1(bld) ((bld) & 0x1F) +#define BLDALPHA_TGT2(bld) (((bld) >> 8) & 0x1F) // SOUNDCNT_H #define SOUND_CGB_MIX_QUARTER 0x0000 diff --git a/src/palette.c b/src/palette.c index 3ea2a08195..303e6ced42 100644 --- a/src/palette.c +++ b/src/palette.c @@ -962,10 +962,43 @@ static u8 UpdateHardwarePaletteFade(void) return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE; } +// Only called for hardware fades static void UpdateBlendRegisters(void) { SetGpuReg(REG_OFFSET_BLDCNT, (u16)gPaletteFade_blendCnt); SetGpuReg(REG_OFFSET_BLDY, gPaletteFade.y); + // If fade-out, also adjust BLDALPHA and DISPCNT + if (!gPaletteFade.yDec /*&& gPaletteFade.mode == HARDWARE_FADE*/) { + u16 bldAlpha = GetGpuReg(REG_OFFSET_BLDALPHA); + u8 tgt1 = BLDALPHA_TGT1(bldAlpha); + u8 tgt2 = BLDALPHA_TGT2(bldAlpha); + u8 bldFade; + + switch (gPaletteFade_blendCnt & BLDCNT_EFFECT_EFF_MASK) + { + // FADE_TO_BLACK + case BLDCNT_EFFECT_DARKEN: + bldFade = BLDALPHA_TGT1(max(0, 16 - gPaletteFade.y)); + SetGpuReg( + REG_OFFSET_BLDALPHA, + BLDALPHA_BLEND(min(tgt1, bldFade), min(tgt2, bldFade)) + ); + break; + // FADE_TO_WHITE + case BLDCNT_EFFECT_LIGHTEN: + SetGpuReg( + REG_OFFSET_BLDALPHA, + BLDALPHA_BLEND(min(++tgt1, 31), min(++tgt2, 31)) + ); + // cause display to show white when finished + // (otherwise blend-mode sprites will still be visible) + if (gPaletteFade.hardwareFadeFinishing && gPaletteFade.y >= 16) + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); + break; + } + } else + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); + if (gPaletteFade.hardwareFadeFinishing) { gPaletteFade.hardwareFadeFinishing = FALSE; From 16c31d61b44e7ece18e0d2039449d2ae4a0710e0 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sat, 25 Jan 2025 20:58:22 -0500 Subject: [PATCH 126/145] fix: removed fadescreenswapbuffers palette dependence, via hardware fade --- asm/macros/event.inc | 9 +++++---- src/event_object_movement.c | 2 ++ src/field_weather.c | 6 +++++- src/scrcmd.c | 17 +++++++++-------- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 7125e71643..06396af8d2 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -1674,13 +1674,14 @@ .4byte \text .endm - @ Equivalent to fadescreen but copies gPlttBufferUnfaded to gPaletteDecompressionBuffer on the fade out - @ and the reverse on the fade in, in effect saving gPlttBufferUnfaded to restore it. - @ If nowait set, does not wait for the fade to complete + @ Equivalent to fadescreen but uses a hardware fade and darken/lighten blend modes, + @ to avoid modifying palettes at all. + @ Useful for fade-out/fade-in without leaving the overworld or entering a new scene. + @ If nowait set, doesn't wait for the fade to complete .macro fadescreenswapbuffers mode:req, nowait=0 .byte 0xdc .byte \mode - .byte \nowait + .byte \nowait .endm @ Buffers the specified trainer's class name to the given string var. diff --git a/src/event_object_movement.c b/src/event_object_movement.c index f7f0f3e2df..18ca30bb96 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2397,6 +2397,8 @@ void UpdateLightSprite(struct Sprite *sprite) { return; } + // Note to self: Don't set window registers during hardware fade! + switch (sprite->data[5]) { // lightType case 0: if (gPaletteFade.active) { // if palette fade is active, don't flicker since the timer won't be updated diff --git a/src/field_weather.c b/src/field_weather.c index 2bcaa2f857..199cff15e1 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -818,6 +818,7 @@ void FadeScreen(u8 mode, s8 delay) // fades screen using BLDY // Note: This enables blending in all windows; // These bits may need to be disabled later +// (i.e if blending lighting effects using WINOBJ) u16 FadeScreenHardware(u8 mode, s8 delay) { u16 bldCnt = GetGpuReg(REG_OFFSET_BLDCNT) & BLDCNT_TGT2_ALL; bldCnt |= BLDCNT_TGT1_ALL; @@ -1008,7 +1009,10 @@ void Weather_SetBlendCoeffs(u8 eva, u8 evb) gWeatherPtr->currBlendEVB = evb; gWeatherPtr->targetBlendEVA = eva; gWeatherPtr->targetBlendEVB = evb; - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(eva, evb)); + + // don't update BLDALPHA if a hardware fade is on-screen + if ((GetGpuReg(REG_OFFSET_BLDCNT) & BLDCNT_EFFECT_EFF_MASK) < BLDCNT_EFFECT_LIGHTEN) + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(eva, evb)); } void Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay) diff --git a/src/scrcmd.c b/src/scrcmd.c index a51e81aa91..edca8dbbbe 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -23,6 +23,7 @@ #include "field_tasks.h" #include "field_weather.h" #include "fieldmap.h" +#include "gpu_regs.h" #include "item.h" #include "lilycove_lady.h" #include "main.h" @@ -661,19 +662,19 @@ bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx) switch (mode) { - case FADE_TO_BLACK: - case FADE_TO_WHITE: - default: - CpuCopy32(gPlttBufferUnfaded, gPaletteDecompressionBuffer, PLTT_SIZE); - FadeScreen(mode, 0); - break; case FADE_FROM_BLACK: case FADE_FROM_WHITE: - CpuCopy32(gPaletteDecompressionBuffer, gPlttBufferUnfaded, PLTT_SIZE); - FadeScreen(mode, 0); + // Restore last weather blend before fading in, + // since BLDALPHA was modified by fade-out + SetGpuReg( + REG_OFFSET_BLDALPHA, + BLDALPHA_BLEND(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB) + ); break; } + FadeScreenHardware(mode, 0); + if (nowait) return FALSE; SetupNativeScript(ctx, IsPaletteNotActive); From 521bea6bc3b3446bc69f4911df68653256a12b14 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sat, 25 Jan 2025 20:59:08 -0500 Subject: [PATCH 127/145] fix: allowed loading non-word-aligned tileset palettes --- src/fieldmap.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/fieldmap.c b/src/fieldmap.c index 1c792cb10e..dbda92b2f7 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -881,7 +881,7 @@ static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u1 { // LoadPalette(&black, destOffset, 2); if (skipFaded) - CpuFastCopy(tileset->palettes, &gPlttBufferUnfaded[destOffset], size); + CpuFastCopy(tileset->palettes, &gPlttBufferUnfaded[destOffset], size); // always word-aligned else LoadPaletteFast(tileset->palettes, destOffset, size); gPlttBufferFaded[destOffset] = gPlttBufferUnfaded[destOffset] = RGB_BLACK; // why does it have to be black? @@ -891,10 +891,14 @@ static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u1 } else if (tileset->isSecondary == TRUE) { - // (void*) is to silence 'source potentially unaligned' error - // All 'gTilesetPalettes_' arrays should have ALIGNED(4) in them + // All 'gTilesetPalettes_' arrays should have ALIGNED(4) in them, + // but we use SmartCopy here just in case they don't if (skipFaded) - CpuFastCopy((void*)tileset->palettes[NUM_PALS_IN_PRIMARY], &gPlttBufferUnfaded[destOffset], size); + #ifdef CpuSmartCopy16 + CpuSmartCopy16(tileset->palettes[NUM_PALS_IN_PRIMARY], &gPlttBufferUnfaded[destOffset], size); + #else + CpuCopy16(tileset->palettes[NUM_PALS_IN_PRIMARY], &gPlttBufferUnfaded[destOffset], size); + #endif else LoadPaletteFast(tileset->palettes[NUM_PALS_IN_PRIMARY], destOffset, size); low = NUM_PALS_IN_PRIMARY; From 0b8aa7b0dc86d57f06a2b01476aa4cff19c23a7d Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 26 Jan 2025 12:08:26 -0300 Subject: [PATCH 128/145] Temp fixes --- src/field_weather.c | 2 ++ src/fieldmap.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/field_weather.c b/src/field_weather.c index 0326e6528e..2bca450744 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -898,12 +898,14 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog) // If faded out, i.e due to fadescreenswapbuffers, // Copy unfaded palette to pal decomp buffer // so it will be restored on fade-in + /* if (gPaletteFade.y == 16) CpuFastCopy( gPlttBufferUnfaded + OBJ_PLTT_ID(spritePaletteIndex), gDecompressionBuffer + 2 * OBJ_PLTT_ID(spritePaletteIndex), PLTT_SIZE_4BPP ); + */ } void ApplyWeatherColorMapToPals(u8 startPalIndex, u8 numPalettes) diff --git a/src/fieldmap.c b/src/fieldmap.c index 2cd8f0db85..7d9926f1de 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -901,7 +901,7 @@ static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u1 // All 'gTilesetPalettes_' arrays should have ALIGNED(4) in them, // but we use SmartCopy here just in case they don't if (skipFaded) { - CpuSmartCopy16(tileset->palettes[NUM_PALS_IN_PRIMARY], &gPlttBufferUnfaded[destOffset], size); + CpuCopy16(tileset->palettes[NUM_PALS_IN_PRIMARY], &gPlttBufferUnfaded[destOffset], size); } else LoadPaletteFast(tileset->palettes[NUM_PALS_IN_PRIMARY], destOffset, size); low = NUM_PALS_IN_PRIMARY; From 11bdbfb658473e9a85fa2c2084ade90fb71c45d9 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 26 Jan 2025 16:35:05 -0300 Subject: [PATCH 129/145] Fix compile issues --- asm/macros/event.inc | 2 +- include/palette.h | 2 +- src/field_weather.c | 2 +- src/scrcmd.c | 2 -- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index e460f8e2ff..1c529b0ca7 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -2545,6 +2545,6 @@ @ putting them into their pokeball; @ by default waits for their movement to finish .macro hidefollower wait=1 - callfunc ScrFunc_hidefollower + callnative ScrFunc_hidefollower .2byte \wait .endm diff --git a/include/palette.h b/include/palette.h index ab61068e73..9ada6f1d96 100644 --- a/include/palette.h +++ b/include/palette.h @@ -46,7 +46,7 @@ struct BlendSettings u32 unused:2; }; -struct __attribute__((packed)) TimeBlendSettings { +struct TimeBlendSettings { struct BlendSettings bld0; struct BlendSettings bld1; u16 weight; diff --git a/src/field_weather.c b/src/field_weather.c index 2bca450744..f0066811a1 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -1166,7 +1166,7 @@ const u8* SetPaletteColorMapType(u8 paletteIndex, u8 colorMapType) { return sPaletteColorMapTypes; // setup field effect color map if (sPaletteColorMapTypes != sFieldEffectPaletteColorMapTypes) { - CpuFastCopy(sBasePaletteColorMapTypes, sFieldEffectPaletteColorMapTypes, 32); + CpuCopy16(sBasePaletteColorMapTypes, sFieldEffectPaletteColorMapTypes, 32); sPaletteColorMapTypes = sFieldEffectPaletteColorMapTypes; } sFieldEffectPaletteColorMapTypes[paletteIndex] = colorMapType; diff --git a/src/scrcmd.c b/src/scrcmd.c index 499792cb70..901df3b8ed 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -826,8 +826,6 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx) return TRUE; } -static EWRAM_DATA u32 *sPalBuffer = NULL; - bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx) { u8 mode = ScriptReadByte(ctx); From 3fc9b0195db1f926e18757915cf6c697edd24b00 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 26 Jan 2025 17:14:00 -0300 Subject: [PATCH 130/145] Cleaned up code to align with previous review comments --- data/scripts/std_msgbox.inc | 4 +-- docs/tutorials/dns.md | 25 ++++++++++++- include/config/overworld.h | 34 ++++-------------- include/overworld.h | 4 +-- include/palette.h | 11 +++--- src/event_object_movement.c | 38 ++++++++++++-------- src/field_effect_helpers.c | 2 +- src/field_weather.c | 14 +++++--- src/fieldmap.c | 4 +-- src/overworld.c | 71 +++++++++++++++++++------------------ src/palette.c | 3 +- src/scrcmd.c | 9 +++-- src/script.c | 2 +- src/script_movement.c | 2 +- 14 files changed, 124 insertions(+), 99 deletions(-) diff --git a/data/scripts/std_msgbox.inc b/data/scripts/std_msgbox.inc index 40026c8ea0..8d5e4167cb 100644 --- a/data/scripts/std_msgbox.inc +++ b/data/scripts/std_msgbox.inc @@ -8,13 +8,13 @@ Std_MsgboxNPC: return Std_MsgboxSign: - setflag FLAG_SAFE_FOLLOWER_MOVEMENT + setflag FLAG_SAFE_FOLLOWER_MOVEMENT lockall message NULL waitmessage waitbuttonpress releaseall - clearflag FLAG_SAFE_FOLLOWER_MOVEMENT + clearflag FLAG_SAFE_FOLLOWER_MOVEMENT return Std_MsgboxDefault: diff --git a/docs/tutorials/dns.md b/docs/tutorials/dns.md index 860fa94371..d0cb9adef8 100644 --- a/docs/tutorials/dns.md +++ b/docs/tutorials/dns.md @@ -13,4 +13,27 @@ on separate lines to mark those colors as being light-blended, i.e: 1 9 10 -``` \ No newline at end of file +``` + +### Q: How do I limit what species can be used as followers? +You may use the following configs in `include/config/overworld.h` +```c +#define OW_FOLLOWERS_ALLOWED_SPECIES (0) +#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) +#define OW_FOLLOWERS_ALLOWED_MET_LOC (0) +``` +Examples: +```c +// Yellow Pikachu: +#define OW_FOLLOWERS_ALLOWED_SPECIES (SPECIES_PIKACHU) +#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) +#define OW_FOLLOWERS_ALLOWED_MET_LOC (MAPSEC_PALLET_TOWN) +// Hoenn Starter: +#define OW_FOLLOWERS_ALLOWED_SPECIES (0) +#define OW_FOLLOWERS_ALLOWED_MET_LVL (5) +#define OW_FOLLOWERS_ALLOWED_MET_LOC (MAPSEC_ROUTE_101) +// Species set in VAR_XXXX: +#define OW_FOLLOWERS_ALLOWED_SPECIES (VAR_XXXX) +#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) +#define OW_FOLLOWERS_ALLOWED_MET_LOC (0) +``` diff --git a/include/config/overworld.h b/include/config/overworld.h index 4ed3b251cf..d5a98df830 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -59,33 +59,13 @@ #define OW_FOLLOWERS_POKEBALLS TRUE // If TRUE, follower Pokémon will emerge from the Poké Ball they are stored in, instead of a normal Poké Ball #define OW_FOLLOWERS_WEATHER_FORMS FALSE // If TRUE, Castform and Cherrim gain FORM_CHANGE_OVERWORLD_WEATHER, which will make them transform in the overworld based on the weather. #define OW_FOLLOWERS_COPY_WILD_PKMN FALSE // If TRUE, follower Pokémon that know Transform or have Illusion/Imposter will copy wild Pokémon at random. - -// New/old handling for followers during scripts; -// TRUE: Script collisions hide follower, FLAG_SAFE_FOLLOWER_MOVEMENT on by default -// (scripted player movement moves follower too!) -// FALSE: Script collisions unhandled, FLAG_SAFE_FOLLOWER_MOVEMENT off by default -#define OW_MON_SCRIPT_MOVEMENT TRUE - -// If set, the only pokemon allowed to follow you -// will be those matching species, met location, -// and/or met level; -// These accept vars, too: VAR_TEMP_1, etc -#define OW_MON_ALLOWED_SPECIES (0) -#define OW_MON_ALLOWED_MET_LVL (0) -#define OW_MON_ALLOWED_MET_LOC (0) -// Examples: -// Yellow Pikachu: -// #define OW_MON_ALLOWED_SPECIES (SPECIES_PIKACHU) -// #define OW_MON_ALLOWED_MET_LVL (0) -// #define OW_MON_ALLOWED_MET_LOC (MAPSEC_PALLET_TOWN) -// Hoenn Starter: -// #define OW_MON_ALLOWED_SPECIES (0) -// #define OW_MON_ALLOWED_MET_LVL (5) -// #define OW_MON_ALLOWED_MET_LOC (MAPSEC_ROUTE_101) -// Species set in VAR_XXXX: -// #define OW_MON_ALLOWED_SPECIES (VAR_XXXX) -// #define OW_MON_ALLOWED_MET_LVL (0) -// #define OW_MON_ALLOWED_MET_LOC (0) +#define OW_FOLLOWERS_SCRIPT_MOVEMENT TRUE // If TRUE, follower Pokémon only go back to their Poké Ball if a non-player collides with them by setting the FLAG_SAFE_FOLLOWER_MOVEMENT flag by default. +// Follower Pokémon Restrictions +// If set, the only pokemon allowed to follow you will be those matching species, met location, and/or met level; These accept vars, too: VAR_TEMP_1, etc +// For examples, check docs/dns.md: +#define OW_FOLLOWERS_ALLOWED_SPECIES (0) +#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) +#define OW_FOLLOWERS_ALLOWED_MET_LOC (0) // Out-of-battle Ability effects #define OW_SYNCHRONIZE_NATURE GEN_LATEST // In Gen8+, if a Pokémon with Synchronize leads the party, wild Pokémon will always have their same Nature as opposed to the 50% chance in previous games. Gift Pokémon excluded. diff --git a/include/overworld.h b/include/overworld.h index f716b51015..d9de4cac58 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -28,7 +28,7 @@ // trigger a time-of-day blend once #define HOURS_BLEND_ONCE 25 -// don't update currentTimeBlend +// don't update gTimeBlend #define HOURS_FREEZE_BLEND 26 struct InitialPlayerAvatarState @@ -62,7 +62,7 @@ extern bool8 gSkipShowMonAnim; extern u8 gTimeOfDay; extern s16 gTimeUpdateCounter; -extern struct TimeBlendSettings currentTimeBlend; +extern struct TimeBlendSettings gTimeBlend; extern const struct UCoords32 gDirectionToVectors[]; diff --git a/include/palette.h b/include/palette.h index 9ada6f1d96..c05dde873f 100644 --- a/include/palette.h +++ b/include/palette.h @@ -46,11 +46,12 @@ struct BlendSettings u32 unused:2; }; -struct TimeBlendSettings { - struct BlendSettings bld0; - struct BlendSettings bld1; - u16 weight; - u16 altWeight; +struct TimeBlendSettings +{ + struct BlendSettings startBlend; + struct BlendSettings endBlend; + u16 weight; + u16 altWeight; }; struct PaletteFadeControl diff --git a/src/event_object_movement.c b/src/event_object_movement.c index cc5d11e10a..0328bb3497 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2001,12 +2001,10 @@ struct Pokemon *GetFirstLiveMon(void) for (i = 0; i < PARTY_SIZE; i++) { struct Pokemon *mon = &gPlayerParty[i]; - if ((OW_MON_ALLOWED_SPECIES && GetMonData(mon, MON_DATA_SPECIES_OR_EGG) != VarGet(OW_MON_ALLOWED_SPECIES)) - || (OW_MON_ALLOWED_MET_LVL && GetMonData(mon, MON_DATA_MET_LEVEL) != VarGet(OW_MON_ALLOWED_MET_LVL)) - || (OW_MON_ALLOWED_MET_LOC && GetMonData(mon, MON_DATA_MET_LOCATION) != VarGet(OW_MON_ALLOWED_MET_LOC)) - ) { + if ((OW_FOLLOWERS_ALLOWED_SPECIES && GetMonData(mon, MON_DATA_SPECIES_OR_EGG) != VarGet(OW_FOLLOWERS_ALLOWED_SPECIES)) + || (OW_FOLLOWERS_ALLOWED_MET_LVL && GetMonData(mon, MON_DATA_MET_LEVEL) != VarGet(OW_FOLLOWERS_ALLOWED_MET_LVL)) + || (OW_FOLLOWERS_ALLOWED_MET_LOC && GetMonData(mon, MON_DATA_MET_LOCATION) != VarGet(OW_FOLLOWERS_ALLOWED_MET_LOC))) continue; - } if (gPlayerParty[i].hp > 0 && !(gPlayerParty[i].box.isEgg || gPlayerParty[i].box.isBadEgg)) return &gPlayerParty[i]; @@ -5755,7 +5753,8 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri { // Animate exiting pokeball // don't emerge if player is jumping or moving via script - if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2 || ArePlayerFieldControlsLocked()) { + if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2 || ArePlayerFieldControlsLocked()) + { sprite->sTypeFuncId = 0; // return to shadowing state return FALSE; } @@ -5778,8 +5777,8 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri // During a script, if player sidesteps or backsteps, // mirror player's direction instead if (ArePlayerFieldControlsLocked() - && gObjectEvents[gPlayerAvatar.objectEventId].facingDirection != gObjectEvents[gPlayerAvatar.objectEventId].movementDirection - ) { + && gObjectEvents[gPlayerAvatar.objectEventId].facingDirection != gObjectEvents[gPlayerAvatar.objectEventId].movementDirection) + { direction = gObjectEvents[gPlayerAvatar.objectEventId].movementDirection; objectEvent->facingDirectionLocked = TRUE; } @@ -5787,18 +5786,27 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri MoveCoords(direction, &x, &y); GetCollisionAtCoords(objectEvent, x, y, direction); // Sets directionOverwrite for stairs if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE) + { // InitJumpRegular will set the proper speed ObjectEventSetSingleMovement(objectEvent, sprite, GetJump2MovementAction(direction)); - else if (playerAction >= MOVEMENT_ACTION_WALK_SLOW_DOWN && playerAction <= MOVEMENT_ACTION_WALK_SLOW_RIGHT) { + } + else if (playerAction >= MOVEMENT_ACTION_WALK_SLOW_DOWN && playerAction <= MOVEMENT_ACTION_WALK_SLOW_RIGHT) + { if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) // on sideways stairs objectEvent->movementActionId = GetWalkNormalMovementAction(direction); else ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction)); - } else if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2) { + } + else if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2) + { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction)); - } else if (gSprites[gPlayerAvatar.spriteId].data[4] == MOVE_SPEED_FAST_1) { + } + else if (gSprites[gPlayerAvatar.spriteId].data[4] == MOVE_SPEED_FAST_1) + { objectEvent->movementActionId = GetWalkFastMovementAction(direction); - } else { + } + else + { objectEvent->movementActionId = GetWalkNormalMovementAction(direction); if (OW_FOLLOWERS_BOBBING == TRUE) sprite->y2 = -1; @@ -6467,14 +6475,16 @@ static bool8 IsMetatileDirectionallyImpassable(struct ObjectEvent *objectEvent, return FALSE; } -u32 GetObjectObjectCollidesWith(struct ObjectEvent *objectEvent, s16 x, s16 y, bool32 addCoords) { +u32 GetObjectObjectCollidesWith(struct ObjectEvent *objectEvent, s16 x, s16 y, bool32 addCoords) +{ u8 i; struct ObjectEvent *curObject; if (objectEvent->localId == OBJ_EVENT_ID_FOLLOWER) return OBJECT_EVENTS_COUNT; // follower cannot collide with other objects, but they can collide with it - if (addCoords) { + if (addCoords) + { x += objectEvent->currentCoords.x; y += objectEvent->currentCoords.y; } diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 8bbc16b905..176bfdaf48 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -350,7 +350,7 @@ u32 FldEff_Shadow(void) graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); if (graphicsInfo->shadowSize == SHADOW_SIZE_NONE) // don't create a shadow at all return 0; - LoadSpriteSheetByTemplate(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0); + LoadSpriteSheetByTemplate(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, OW_OBJECT_SUBPRIORITY + 1); if (spriteId != MAX_SPRITES) { diff --git a/src/field_weather.c b/src/field_weather.c index f0066811a1..2e38022f54 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -792,7 +792,7 @@ void FadeScreen(u8 mode, s8 delay) else if (MapHasNaturalLight(gMapHeader.mapType)) { UpdateAltBgPalettes(PALETTES_BG); - BeginTimeOfDayPaletteFade(PALETTES_ALL, delay, 16, 0, ¤tTimeBlend.bld0, ¤tTimeBlend.bld1, currentTimeBlend.weight, fadeColor); + BeginTimeOfDayPaletteFade(PALETTES_ALL, delay, 16, 0, &gTimeBlend.startBlend, &gTimeBlend.endBlend, gTimeBlend.weight, fadeColor); } else { @@ -811,7 +811,8 @@ void FadeScreen(u8 mode, s8 delay) // Note: This enables blending in all windows; // These bits may need to be disabled later // (i.e if blending lighting effects using WINOBJ) -u16 FadeScreenHardware(u8 mode, s8 delay) { +u16 FadeScreenHardware(u8 mode, s8 delay) +{ u16 bldCnt = GetGpuReg(REG_OFFSET_BLDCNT) & BLDCNT_TGT2_ALL; bldCnt |= BLDCNT_TGT1_ALL; // enable blend in all windows @@ -1161,11 +1162,13 @@ void SetWeatherPalStateIdle(void) gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } -const u8* SetPaletteColorMapType(u8 paletteIndex, u8 colorMapType) { +const u8* SetPaletteColorMapType(u8 paletteIndex, u8 colorMapType) +{ if (sPaletteColorMapTypes[paletteIndex] == colorMapType) return sPaletteColorMapTypes; // setup field effect color map - if (sPaletteColorMapTypes != sFieldEffectPaletteColorMapTypes) { + if (sPaletteColorMapTypes != sFieldEffectPaletteColorMapTypes) + { CpuCopy16(sBasePaletteColorMapTypes, sFieldEffectPaletteColorMapTypes, 32); sPaletteColorMapTypes = sFieldEffectPaletteColorMapTypes; } @@ -1178,7 +1181,8 @@ void PreservePaletteInWeather(u8 preservedPalIndex) SetPaletteColorMapType(preservedPalIndex, COLOR_MAP_NONE); } -void ResetPaletteColorMapType(u8 paletteIndex) { +void ResetPaletteColorMapType(u8 paletteIndex) +{ if (sPaletteColorMapTypes == sBasePaletteColorMapTypes) return; sFieldEffectPaletteColorMapTypes[paletteIndex] = sBasePaletteColorMapTypes[paletteIndex]; diff --git a/src/fieldmap.c b/src/fieldmap.c index 7d9926f1de..f788f55679 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -900,9 +900,9 @@ static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u1 { // All 'gTilesetPalettes_' arrays should have ALIGNED(4) in them, // but we use SmartCopy here just in case they don't - if (skipFaded) { + if (skipFaded) CpuCopy16(tileset->palettes[NUM_PALS_IN_PRIMARY], &gPlttBufferUnfaded[destOffset], size); - } else + else LoadPaletteFast(tileset->palettes[NUM_PALS_IN_PRIMARY], destOffset, size); low = NUM_PALS_IN_PRIMARY; high = NUM_PALS_TOTAL; diff --git a/src/overworld.c b/src/overworld.c index 88fa06b95f..32f673bca3 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -199,7 +199,7 @@ COMMON_DATA u8 gLocalLinkPlayerId = 0; // This is our player id in a multiplayer COMMON_DATA u8 gFieldLinkPlayerCount = 0; u8 gTimeOfDay; -struct TimeBlendSettings currentTimeBlend; +struct TimeBlendSettings gTimeBlend; s16 gTimeUpdateCounter; // playTimeVBlanks will eventually overflow, so this is used to update TOD // EWRAM vars @@ -1565,47 +1565,47 @@ void UpdateTimeOfDay(void) if (IsBetweenHours(hours, MORNING_HOUR_BEGIN, MORNING_HOUR_MIDDLE)) // night->morning { - currentTimeBlend.bld0 = gTimeOfDayBlend[TIME_NIGHT]; - currentTimeBlend.bld1 = gTimeOfDayBlend[TIME_MORNING]; - currentTimeBlend.weight = TIME_BLEND_WEIGHT(MORNING_HOUR_BEGIN, MORNING_HOUR_MIDDLE); - currentTimeBlend.altWeight = (DEFAULT_WEIGHT - currentTimeBlend.weight) / 2; + gTimeBlend.startBlend = gTimeOfDayBlend[TIME_NIGHT]; + gTimeBlend.endBlend = gTimeOfDayBlend[TIME_MORNING]; + gTimeBlend.weight = TIME_BLEND_WEIGHT(MORNING_HOUR_BEGIN, MORNING_HOUR_MIDDLE); + gTimeBlend.altWeight = (DEFAULT_WEIGHT - gTimeBlend.weight) / 2; gTimeOfDay = TIME_MORNING; } else if (IsBetweenHours(hours, MORNING_HOUR_MIDDLE, MORNING_HOUR_END)) // morning->day { - currentTimeBlend.bld0 = gTimeOfDayBlend[TIME_MORNING]; - currentTimeBlend.bld1 = gTimeOfDayBlend[TIME_DAY]; - currentTimeBlend.weight = TIME_BLEND_WEIGHT(MORNING_HOUR_MIDDLE, MORNING_HOUR_END); - currentTimeBlend.altWeight = (DEFAULT_WEIGHT - currentTimeBlend.weight) / 2 + (DEFAULT_WEIGHT / 2); + gTimeBlend.startBlend = gTimeOfDayBlend[TIME_MORNING]; + gTimeBlend.endBlend = gTimeOfDayBlend[TIME_DAY]; + gTimeBlend.weight = TIME_BLEND_WEIGHT(MORNING_HOUR_MIDDLE, MORNING_HOUR_END); + gTimeBlend.altWeight = (DEFAULT_WEIGHT - gTimeBlend.weight) / 2 + (DEFAULT_WEIGHT / 2); gTimeOfDay = TIME_MORNING; } else if (IsBetweenHours(hours, EVENING_HOUR_BEGIN, EVENING_HOUR_END)) // evening { - currentTimeBlend.bld0 = gTimeOfDayBlend[TIME_DAY]; - currentTimeBlend.bld1 = gTimeOfDayBlend[TIME_EVENING]; - currentTimeBlend.weight = TIME_BLEND_WEIGHT(EVENING_HOUR_BEGIN, EVENING_HOUR_END); - currentTimeBlend.altWeight = currentTimeBlend.weight / 2 + (DEFAULT_WEIGHT / 2); + gTimeBlend.startBlend = gTimeOfDayBlend[TIME_DAY]; + gTimeBlend.endBlend = gTimeOfDayBlend[TIME_EVENING]; + gTimeBlend.weight = TIME_BLEND_WEIGHT(EVENING_HOUR_BEGIN, EVENING_HOUR_END); + gTimeBlend.altWeight = gTimeBlend.weight / 2 + (DEFAULT_WEIGHT / 2); gTimeOfDay = TIME_EVENING; } else if (IsBetweenHours(hours, NIGHT_HOUR_BEGIN, NIGHT_HOUR_BEGIN + 1)) // evening->night { - currentTimeBlend.bld0 = gTimeOfDayBlend[TIME_EVENING]; - currentTimeBlend.bld1 = gTimeOfDayBlend[TIME_NIGHT]; - currentTimeBlend.weight = TIME_BLEND_WEIGHT(NIGHT_HOUR_BEGIN, NIGHT_HOUR_BEGIN + 1); - currentTimeBlend.altWeight = currentTimeBlend.weight / 2; + gTimeBlend.startBlend = gTimeOfDayBlend[TIME_EVENING]; + gTimeBlend.endBlend = gTimeOfDayBlend[TIME_NIGHT]; + gTimeBlend.weight = TIME_BLEND_WEIGHT(NIGHT_HOUR_BEGIN, NIGHT_HOUR_BEGIN + 1); + gTimeBlend.altWeight = gTimeBlend.weight / 2; gTimeOfDay = TIME_NIGHT; } else if (IsBetweenHours(hours, NIGHT_HOUR_BEGIN, NIGHT_HOUR_END)) // night { - currentTimeBlend.weight = DEFAULT_WEIGHT; - currentTimeBlend.altWeight = 0; - currentTimeBlend.bld0 = currentTimeBlend.bld1 = gTimeOfDayBlend[TIME_NIGHT]; + gTimeBlend.weight = DEFAULT_WEIGHT; + gTimeBlend.altWeight = 0; + gTimeBlend.startBlend = gTimeBlend.endBlend = gTimeOfDayBlend[TIME_NIGHT]; gTimeOfDay = TIME_NIGHT; } else // day { - currentTimeBlend.weight = currentTimeBlend.altWeight = DEFAULT_WEIGHT; - currentTimeBlend.bld0 = currentTimeBlend.bld1 = gTimeOfDayBlend[TIME_DAY]; + gTimeBlend.weight = gTimeBlend.altWeight = DEFAULT_WEIGHT; + gTimeBlend.startBlend = gTimeBlend.endBlend = gTimeOfDayBlend[TIME_DAY]; gTimeOfDay = TIME_DAY; } } @@ -1641,9 +1641,9 @@ void UpdateAltBgPalettes(u16 palettes) if (palettes & 1) { if (i < NUM_PALS_IN_PRIMARY) - AvgPaletteWeighted(&((u16*)primary->palettes)[i*16], &((u16*)primary->palettes)[((i+9)%16)*16], gPlttBufferUnfaded + i * 16, currentTimeBlend.altWeight); + AvgPaletteWeighted(&((u16*)primary->palettes)[i*16], &((u16*)primary->palettes)[((i+9)%16)*16], gPlttBufferUnfaded + i * 16, gTimeBlend.altWeight); else - AvgPaletteWeighted(&((u16*)secondary->palettes)[i*16], &((u16*)secondary->palettes)[((i+9)%16)*16], gPlttBufferUnfaded + i * 16, currentTimeBlend.altWeight); + AvgPaletteWeighted(&((u16*)secondary->palettes)[i*16], &((u16*)secondary->palettes)[((i+9)%16)*16], gPlttBufferUnfaded + i * 16, gTimeBlend.altWeight); } i++; palettes >>= 1; @@ -1666,7 +1666,7 @@ void UpdatePalettesWithTime(u32 palettes) palettes &= PALETTES_MAP | PALETTES_OBJECTS; // Don't blend UI pals if (!palettes) return; - TimeMixPalettes(palettes, gPlttBufferUnfaded, gPlttBufferFaded, ¤tTimeBlend.bld0, ¤tTimeBlend.bld1, currentTimeBlend.weight); + TimeMixPalettes(palettes, gPlttBufferUnfaded, gPlttBufferFaded, &gTimeBlend.startBlend, &gTimeBlend.endBlend, gTimeBlend.weight); } } @@ -1676,7 +1676,7 @@ u8 UpdateSpritePaletteWithTime(u8 paletteNum) { if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(paletteNum))) return paletteNum; - TimeMixPalettes(1, &gPlttBufferUnfaded[OBJ_PLTT_ID(paletteNum)], &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], ¤tTimeBlend.bld0, ¤tTimeBlend.bld1, currentTimeBlend.weight); + TimeMixPalettes(1, &gPlttBufferUnfaded[OBJ_PLTT_ID(paletteNum)], &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], &gTimeBlend.startBlend, &gTimeBlend.endBlend, gTimeBlend.weight); } return paletteNum; } @@ -1693,17 +1693,18 @@ static void OverworldBasic(void) UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); // Every minute if no palette fade is active, update TOD blending as needed - if (!gPaletteFade.active && --gTimeUpdateCounter <= 0) { - struct TimeBlendSettings cachedBlend = currentTimeBlend; + if (!gPaletteFade.active && --gTimeUpdateCounter <= 0) + { + struct TimeBlendSettings cachedBlend = gTimeBlend; u32 *bld0 = (u32*)&cachedBlend; - u32 *bld1 = (u32*)¤tTimeBlend; + u32 *bld1 = (u32*)&gTimeBlend; gTimeUpdateCounter = (SECONDS_PER_MINUTE * 60 / FakeRtc_GetSecondsRatio()); UpdateTimeOfDay(); FormChangeTimeUpdate(); if (bld0[0] != bld1[0] - || bld0[1] != bld1[1] - || bld0[2] != bld1[2] - ) { + || bld0[1] != bld1[1] + || bld0[2] != bld1[2]) + { UpdateAltBgPalettes(PALETTES_BG); UpdatePalettesWithTime(PALETTES_ALL); } @@ -3681,14 +3682,16 @@ void ScriptHideItemDescription(struct ScriptContext *ctx) // returns old sHoursOverride -u16 SetTimeOfDay(u16 hours) { +u16 SetTimeOfDay(u16 hours) +{ u16 oldHours = sHoursOverride; sHoursOverride = hours; gTimeUpdateCounter = 0; return oldHours; } -bool8 ScrFunc_settimeofday(struct ScriptContext *ctx) { +bool8 ScrFunc_settimeofday(struct ScriptContext *ctx) +{ SetTimeOfDay(ScriptReadByte(ctx)); return FALSE; } diff --git a/src/palette.c b/src/palette.c index f079b0d3d5..506777b41a 100644 --- a/src/palette.c +++ b/src/palette.c @@ -732,7 +732,8 @@ static void UpdateBlendRegisters(void) SetGpuReg(REG_OFFSET_BLDCNT, (u16)gPaletteFade_blendCnt); SetGpuReg(REG_OFFSET_BLDY, gPaletteFade.y); // If fade-out, also adjust BLDALPHA and DISPCNT - if (!gPaletteFade.yDec /*&& gPaletteFade.mode == HARDWARE_FADE*/) { + if (!gPaletteFade.yDec /*&& gPaletteFade.mode == HARDWARE_FADE*/) + { u16 bldAlpha = GetGpuReg(REG_OFFSET_BLDALPHA); u8 tgt1 = BLDALPHA_TGT1(bldAlpha); u8 tgt2 = BLDALPHA_TGT2(bldAlpha); diff --git a/src/scrcmd.c b/src/scrcmd.c index 901df3b8ed..5e4881ee63 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1256,7 +1256,8 @@ bool8 ScrCmd_fadeinbgm(struct ScriptContext *ctx) return FALSE; } -struct ObjectEvent * ScriptHideFollower(void) { +struct ObjectEvent * ScriptHideFollower(void) +{ struct ObjectEvent *obj = GetFollowerObject(); if (obj == NULL || obj->invisible) @@ -3117,11 +3118,13 @@ void Script_EndTrainerCanSeeIf(struct ScriptContext *ctx) StopScript(ctx); } -bool8 ScrFunc_hidefollower(struct ScriptContext *ctx) { +bool8 ScrFunc_hidefollower(struct ScriptContext *ctx) +{ bool16 wait = VarGet(ScriptReadHalfword(ctx)); struct ObjectEvent *obj; - if ((obj = ScriptHideFollower()) != NULL && wait) { + if ((obj = ScriptHideFollower()) != NULL && wait) + { sMovingNpcId = obj->localId; sMovingNpcMapGroup = obj->mapGroup; sMovingNpcMapNum = obj->mapNum; diff --git a/src/script.c b/src/script.c index 2197c67694..3f0a005406 100644 --- a/src/script.c +++ b/src/script.c @@ -260,7 +260,7 @@ void ScriptContext_SetupScript(const u8 *ptr) InitScriptContext(&sGlobalScriptContext, gScriptCmdTable, gScriptCmdTableEnd); SetupBytecodeScript(&sGlobalScriptContext, ptr); LockPlayerFieldControls(); - if (OW_MON_SCRIPT_MOVEMENT) + if (OW_FOLLOWERS_SCRIPT_MOVEMENT) FlagSet(FLAG_SAFE_FOLLOWER_MOVEMENT); sGlobalScriptContextStatus = CONTEXT_RUNNING; } diff --git a/src/script_movement.c b/src/script_movement.c index 021be6d621..28e9e02a47 100644 --- a/src/script_movement.c +++ b/src/script_movement.c @@ -222,7 +222,7 @@ static void ScriptMovement_TakeStep(u8 taskId, u8 moveScrId, u8 objEventId, cons // a non-player object collides with an active follower pokemon, // put that follower into a pokeball // (sTimer helps limit this expensive check to once per step) - if (OW_MON_SCRIPT_MOVEMENT && + if (OW_FOLLOWERS_SCRIPT_MOVEMENT && gSprites[obj->spriteId].sTimer == 1 && (objEventId = GetObjectObjectCollidesWith(obj, 0, 0, TRUE)) < OBJECT_EVENTS_COUNT && // switch `obj` to follower From be74612b9ec0da9217123b701821518c0f63e231 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 26 Jan 2025 17:17:37 -0300 Subject: [PATCH 131/145] u32 in FadeScreenHardware --- include/field_weather.h | 2 +- src/field_weather.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/field_weather.h b/include/field_weather.h index a8cbcc572a..3a614affbf 100644 --- a/include/field_weather.h +++ b/include/field_weather.h @@ -148,7 +148,7 @@ void SetCurrentAndNextWeatherNoDelay(u8 weather); void ApplyWeatherColorMapIfIdle(s8 colorMapIndex); void ApplyWeatherColorMapIfIdle_Gradual(u8 colorMapIndex, u8 targetColorMapIndex, u8 colorMapStepDelay); void FadeScreen(u8 mode, s8 delay); -u16 FadeScreenHardware(u8 mode, s8 delay); +u32 FadeScreenHardware(u32 mode, s32 delay); bool8 IsWeatherNotFadingIn(void); void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog); void ApplyWeatherColorMapToPals(u8 startPalIndex, u8 numPalettes); diff --git a/src/field_weather.c b/src/field_weather.c index 2e38022f54..4086870ae8 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -811,9 +811,9 @@ void FadeScreen(u8 mode, s8 delay) // Note: This enables blending in all windows; // These bits may need to be disabled later // (i.e if blending lighting effects using WINOBJ) -u16 FadeScreenHardware(u8 mode, s8 delay) +u32 FadeScreenHardware(u32 mode, s32 delay) { - u16 bldCnt = GetGpuReg(REG_OFFSET_BLDCNT) & BLDCNT_TGT2_ALL; + u32 bldCnt = GetGpuReg(REG_OFFSET_BLDCNT) & BLDCNT_TGT2_ALL; bldCnt |= BLDCNT_TGT1_ALL; // enable blend in all windows SetGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_CLR | WININ_WIN1_CLR); From 8a36bf050607dc396703bd582b028f253ecf9771 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 26 Jan 2025 18:42:29 -0300 Subject: [PATCH 132/145] Removed unneeded tileset palette alignments --- src/data/tilesets/graphics.h | 148 +++++++++++++++++------------------ 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/src/data/tilesets/graphics.h b/src/data/tilesets/graphics.h index bae1b715f5..a4cec62cf5 100644 --- a/src/data/tilesets/graphics.h +++ b/src/data/tilesets/graphics.h @@ -1,6 +1,6 @@ const u32 gTilesetTiles_Petalburg[] = INCBIN_U32("data/tilesets/secondary/petalburg/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Petalburg[][16] = +const u16 gTilesetPalettes_Petalburg[][16] = { INCBIN_U16("data/tilesets/secondary/petalburg/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/petalburg/palettes/01.gbapal"), @@ -22,7 +22,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Petalburg[][16] = const u32 gTilesetTiles_Rustboro[] = INCBIN_U32("data/tilesets/secondary/rustboro/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Rustboro[][16] = +const u16 gTilesetPalettes_Rustboro[][16] = { INCBIN_U16("data/tilesets/secondary/rustboro/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/rustboro/palettes/01.gbapal"), @@ -44,7 +44,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Rustboro[][16] = const u32 gTilesetTiles_Dewford[] = INCBIN_U32("data/tilesets/secondary/dewford/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Dewford[][16] = +const u16 gTilesetPalettes_Dewford[][16] = { INCBIN_U16("data/tilesets/secondary/dewford/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/dewford/palettes/01.gbapal"), @@ -66,7 +66,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Dewford[][16] = const u32 gTilesetTiles_Slateport[] = INCBIN_U32("data/tilesets/secondary/slateport/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Slateport[][16] = +const u16 gTilesetPalettes_Slateport[][16] = { INCBIN_U16("data/tilesets/secondary/slateport/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/slateport/palettes/01.gbapal"), @@ -88,7 +88,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Slateport[][16] = const u32 gTilesetTiles_Mauville[] = INCBIN_U32("data/tilesets/secondary/mauville/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Mauville[][16] = +const u16 gTilesetPalettes_Mauville[][16] = { INCBIN_U16("data/tilesets/secondary/mauville/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mauville/palettes/01.gbapal"), @@ -110,7 +110,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Mauville[][16] = const u32 gTilesetTiles_Lavaridge[] = INCBIN_U32("data/tilesets/secondary/lavaridge/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Lavaridge[][16] = +const u16 gTilesetPalettes_Lavaridge[][16] = { INCBIN_U16("data/tilesets/secondary/lavaridge/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lavaridge/palettes/01.gbapal"), @@ -132,7 +132,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Lavaridge[][16] = const u32 gTilesetTiles_Fallarbor[] = INCBIN_U32("data/tilesets/secondary/fallarbor/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Fallarbor[][16] = +const u16 gTilesetPalettes_Fallarbor[][16] = { INCBIN_U16("data/tilesets/secondary/fallarbor/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/fallarbor/palettes/01.gbapal"), @@ -154,7 +154,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Fallarbor[][16] = const u32 gTilesetTiles_Fortree[] = INCBIN_U32("data/tilesets/secondary/fortree/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Fortree[][16] = +const u16 gTilesetPalettes_Fortree[][16] = { INCBIN_U16("data/tilesets/secondary/fortree/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/fortree/palettes/01.gbapal"), @@ -176,7 +176,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Fortree[][16] = const u32 gTilesetTiles_Lilycove[] = INCBIN_U32("data/tilesets/secondary/lilycove/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Lilycove[][16] = +const u16 gTilesetPalettes_Lilycove[][16] = { INCBIN_U16("data/tilesets/secondary/lilycove/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lilycove/palettes/01.gbapal"), @@ -198,7 +198,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Lilycove[][16] = const u32 gTilesetTiles_Mossdeep[] = INCBIN_U32("data/tilesets/secondary/mossdeep/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Mossdeep[][16] = +const u16 gTilesetPalettes_Mossdeep[][16] = { INCBIN_U16("data/tilesets/secondary/mossdeep/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mossdeep/palettes/01.gbapal"), @@ -220,7 +220,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Mossdeep[][16] = const u32 gTilesetTiles_EverGrande[] = INCBIN_U32("data/tilesets/secondary/ever_grande/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_EverGrande[][16] = +const u16 gTilesetPalettes_EverGrande[][16] = { INCBIN_U16("data/tilesets/secondary/ever_grande/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/ever_grande/palettes/01.gbapal"), @@ -242,7 +242,7 @@ const u16 ALIGNED(4) gTilesetPalettes_EverGrande[][16] = const u32 gTilesetTiles_Pacifidlog[] = INCBIN_U32("data/tilesets/secondary/pacifidlog/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Pacifidlog[][16] = +const u16 gTilesetPalettes_Pacifidlog[][16] = { INCBIN_U16("data/tilesets/secondary/pacifidlog/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pacifidlog/palettes/01.gbapal"), @@ -264,7 +264,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Pacifidlog[][16] = const u32 gTilesetTiles_Sootopolis[] = INCBIN_U32("data/tilesets/secondary/sootopolis/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Sootopolis[][16] = +const u16 gTilesetPalettes_Sootopolis[][16] = { INCBIN_U16("data/tilesets/secondary/sootopolis/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/sootopolis/palettes/01.gbapal"), @@ -286,7 +286,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Sootopolis[][16] = const u32 gTilesetTiles_BattleFrontierOutsideWest[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_outside_west/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_BattleFrontierOutsideWest[][16] = +const u16 gTilesetPalettes_BattleFrontierOutsideWest[][16] = { INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/palettes/01.gbapal"), @@ -308,7 +308,7 @@ const u16 ALIGNED(4) gTilesetPalettes_BattleFrontierOutsideWest[][16] = const u32 gTilesetTiles_BattleFrontierOutsideEast[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_outside_east/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_BattleFrontierOutsideEast[][16] = +const u16 gTilesetPalettes_BattleFrontierOutsideEast[][16] = { INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/palettes/01.gbapal"), @@ -330,7 +330,7 @@ const u16 ALIGNED(4) gTilesetPalettes_BattleFrontierOutsideEast[][16] = const u32 gTilesetTiles_InsideBuilding[] = INCBIN_U32("data/tilesets/primary/building/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_InsideBuilding[][16] = +const u16 gTilesetPalettes_InsideBuilding[][16] = { INCBIN_U16("data/tilesets/primary/building/palettes/00.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/01.gbapal"), @@ -352,7 +352,7 @@ const u16 ALIGNED(4) gTilesetPalettes_InsideBuilding[][16] = const u32 gTilesetTiles_Shop[] = INCBIN_U32("data/tilesets/secondary/shop/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Shop[][16] = +const u16 gTilesetPalettes_Shop[][16] = { INCBIN_U16("data/tilesets/secondary/shop/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/shop/palettes/01.gbapal"), @@ -374,7 +374,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Shop[][16] = const u32 gTilesetTiles_PokemonCenter[] = INCBIN_U32("data/tilesets/secondary/pokemon_center/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_PokemonCenter[][16] = +const u16 gTilesetPalettes_PokemonCenter[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/01.gbapal"), @@ -396,7 +396,7 @@ const u16 ALIGNED(4) gTilesetPalettes_PokemonCenter[][16] = const u32 gTilesetTiles_Cave[] = INCBIN_U32("data/tilesets/secondary/cave/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Cave[][16] = +const u16 gTilesetPalettes_Cave[][16] = { INCBIN_U16("data/tilesets/secondary/cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/01.gbapal"), @@ -418,7 +418,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Cave[][16] = const u32 gTilesetTiles_PokemonSchool[] = INCBIN_U32("data/tilesets/secondary/pokemon_school/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_PokemonSchool[][16] = +const u16 gTilesetPalettes_PokemonSchool[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_school/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_school/palettes/01.gbapal"), @@ -440,7 +440,7 @@ const u16 ALIGNED(4) gTilesetPalettes_PokemonSchool[][16] = const u32 gTilesetTiles_PokemonFanClub[] = INCBIN_U32("data/tilesets/secondary/pokemon_fan_club/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_PokemonFanClub[][16] = +const u16 gTilesetPalettes_PokemonFanClub[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_fan_club/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_fan_club/palettes/01.gbapal"), @@ -462,7 +462,7 @@ const u16 ALIGNED(4) gTilesetPalettes_PokemonFanClub[][16] = const u32 gTilesetTiles_Unused1[] = INCBIN_U32("data/tilesets/secondary/unused_1/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Unused1[][16] = +const u16 gTilesetPalettes_Unused1[][16] = { INCBIN_U16("data/tilesets/secondary/unused_1/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_1/palettes/01.gbapal"), @@ -484,7 +484,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Unused1[][16] = const u32 gTilesetTiles_MeteorFalls[] = INCBIN_U32("data/tilesets/secondary/meteor_falls/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_MeteorFalls[][16] = +const u16 gTilesetPalettes_MeteorFalls[][16] = { INCBIN_U16("data/tilesets/secondary/meteor_falls/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/meteor_falls/palettes/01.gbapal"), @@ -506,7 +506,7 @@ const u16 ALIGNED(4) gTilesetPalettes_MeteorFalls[][16] = const u32 gTilesetTiles_OceanicMuseum[] = INCBIN_U32("data/tilesets/secondary/oceanic_museum/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_OceanicMuseum[][16] = +const u16 gTilesetPalettes_OceanicMuseum[][16] = { INCBIN_U16("data/tilesets/secondary/oceanic_museum/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/oceanic_museum/palettes/01.gbapal"), @@ -529,7 +529,7 @@ const u16 ALIGNED(4) gTilesetPalettes_OceanicMuseum[][16] = const u32 gTilesetTiles_CableClub[] = INCBIN_U32("data/tilesets/secondary/cable_club/tiles.4bpp"); const u32 gTilesetTiles_UnknownCableClub[] = INCBIN_U32("data/tilesets/secondary/cable_club/unknown_tiles.4bpp"); -const u16 ALIGNED(4) gTilesetPalettes_CableClub[][16] = +const u16 gTilesetPalettes_CableClub[][16] = { INCBIN_U16("data/tilesets/secondary/cable_club/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/01.gbapal"), @@ -551,7 +551,7 @@ const u16 ALIGNED(4) gTilesetPalettes_CableClub[][16] = const u32 gTilesetTiles_SeashoreHouse[] = INCBIN_U32("data/tilesets/secondary/seashore_house/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_SeashoreHouse[][16] = +const u16 gTilesetPalettes_SeashoreHouse[][16] = { INCBIN_U16("data/tilesets/secondary/seashore_house/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/seashore_house/palettes/01.gbapal"), @@ -573,7 +573,7 @@ const u16 ALIGNED(4) gTilesetPalettes_SeashoreHouse[][16] = const u32 gTilesetTiles_PrettyPetalFlowerShop[] = INCBIN_U32("data/tilesets/secondary/pretty_petal_flower_shop/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_PrettyPetalFlowerShop[][16] = +const u16 gTilesetPalettes_PrettyPetalFlowerShop[][16] = { INCBIN_U16("data/tilesets/secondary/pretty_petal_flower_shop/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pretty_petal_flower_shop/palettes/01.gbapal"), @@ -595,7 +595,7 @@ const u16 ALIGNED(4) gTilesetPalettes_PrettyPetalFlowerShop[][16] = const u32 gTilesetTiles_PokemonDayCare[] = INCBIN_U32("data/tilesets/secondary/pokemon_day_care/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_PokemonDayCare[][16] = +const u16 gTilesetPalettes_PokemonDayCare[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_day_care/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_day_care/palettes/01.gbapal"), @@ -617,7 +617,7 @@ const u16 ALIGNED(4) gTilesetPalettes_PokemonDayCare[][16] = const u32 gTilesetTiles_Facility[] = INCBIN_U32("data/tilesets/secondary/facility/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Facility[][16] = +const u16 gTilesetPalettes_Facility[][16] = { INCBIN_U16("data/tilesets/secondary/facility/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/facility/palettes/01.gbapal"), @@ -639,7 +639,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Facility[][16] = const u32 gTilesetTiles_BikeShop[] = INCBIN_U32("data/tilesets/secondary/bike_shop/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_BikeShop[][16] = +const u16 gTilesetPalettes_BikeShop[][16] = { INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/01.gbapal"), @@ -661,7 +661,7 @@ const u16 ALIGNED(4) gTilesetPalettes_BikeShop[][16] = const u32 gTilesetTiles_RusturfTunnel[] = INCBIN_U32("data/tilesets/secondary/rusturf_tunnel/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_RusturfTunnel[][16] = +const u16 gTilesetPalettes_RusturfTunnel[][16] = { INCBIN_U16("data/tilesets/secondary/rusturf_tunnel/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/rusturf_tunnel/palettes/01.gbapal"), @@ -683,7 +683,7 @@ const u16 ALIGNED(4) gTilesetPalettes_RusturfTunnel[][16] = const u32 gTilesetTiles_SecretBaseBrownCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/brown_cave/unused_tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_SecretBaseBrownCave[][16] = +const u16 gTilesetPalettes_SecretBaseBrownCave[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/brown_cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/brown_cave/palettes/01.gbapal"), @@ -705,7 +705,7 @@ const u16 ALIGNED(4) gTilesetPalettes_SecretBaseBrownCave[][16] = const u32 gTilesetTiles_SecretBaseTreeCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/tree/unused_tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_SecretBaseTree[][16] = +const u16 gTilesetPalettes_SecretBaseTree[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/tree/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/tree/palettes/01.gbapal"), @@ -727,7 +727,7 @@ const u16 ALIGNED(4) gTilesetPalettes_SecretBaseTree[][16] = const u32 gTilesetTiles_SecretBaseShrubCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/shrub/unused_tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_SecretBaseShrub[][16] = +const u16 gTilesetPalettes_SecretBaseShrub[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/shrub/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/shrub/palettes/01.gbapal"), @@ -749,7 +749,7 @@ const u16 ALIGNED(4) gTilesetPalettes_SecretBaseShrub[][16] = const u32 gTilesetTiles_SecretBaseBlueCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/blue_cave/unused_tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_SecretBaseBlueCave[][16] = +const u16 gTilesetPalettes_SecretBaseBlueCave[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/blue_cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/blue_cave/palettes/01.gbapal"), @@ -771,7 +771,7 @@ const u16 ALIGNED(4) gTilesetPalettes_SecretBaseBlueCave[][16] = const u32 gTilesetTiles_SecretBaseYellowCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/yellow_cave/unused_tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_SecretBaseYellowCave[][16] = +const u16 gTilesetPalettes_SecretBaseYellowCave[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/yellow_cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/yellow_cave/palettes/01.gbapal"), @@ -793,7 +793,7 @@ const u16 ALIGNED(4) gTilesetPalettes_SecretBaseYellowCave[][16] = const u32 gTilesetTiles_SecretBaseRedCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/red_cave/unused_tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_SecretBaseRedCave[][16] = +const u16 gTilesetPalettes_SecretBaseRedCave[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/red_cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/red_cave/palettes/01.gbapal"), @@ -822,7 +822,7 @@ const u32 gTilesetTiles_SecretBaseRedCave[] = INCBIN_U32("data/tilesets/secondar const u32 gTilesetTiles_InsideOfTruck[] = INCBIN_U32("data/tilesets/secondary/inside_of_truck/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_InsideOfTruck[][16] = +const u16 gTilesetPalettes_InsideOfTruck[][16] = { INCBIN_U16("data/tilesets/secondary/inside_of_truck/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/inside_of_truck/palettes/01.gbapal"), @@ -844,7 +844,7 @@ const u16 ALIGNED(4) gTilesetPalettes_InsideOfTruck[][16] = const u32 gTilesetTiles_Contest[] = INCBIN_U32("data/tilesets/secondary/contest/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Contest[][16] = +const u16 gTilesetPalettes_Contest[][16] = { INCBIN_U16("data/tilesets/secondary/contest/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/contest/palettes/01.gbapal"), @@ -866,7 +866,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Contest[][16] = const u32 gTilesetTiles_LilycoveMuseum[] = INCBIN_U32("data/tilesets/secondary/lilycove_museum/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_LilycoveMuseum[][16] = +const u16 gTilesetPalettes_LilycoveMuseum[][16] = { INCBIN_U16("data/tilesets/secondary/lilycove_museum/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lilycove_museum/palettes/01.gbapal"), @@ -888,7 +888,7 @@ const u16 ALIGNED(4) gTilesetPalettes_LilycoveMuseum[][16] = const u32 gTilesetTiles_BrendansMaysHouse[] = INCBIN_U32("data/tilesets/secondary/brendans_mays_house/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_BrendansMaysHouse[][16] = +const u16 gTilesetPalettes_BrendansMaysHouse[][16] = { INCBIN_U16("data/tilesets/secondary/brendans_mays_house/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/brendans_mays_house/palettes/01.gbapal"), @@ -910,7 +910,7 @@ const u16 ALIGNED(4) gTilesetPalettes_BrendansMaysHouse[][16] = const u32 gTilesetTiles_Lab[] = INCBIN_U32("data/tilesets/secondary/lab/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Lab[][16] = +const u16 gTilesetPalettes_Lab[][16] = { INCBIN_U16("data/tilesets/secondary/lab/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/01.gbapal"), @@ -932,7 +932,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Lab[][16] = const u32 gTilesetTiles_Underwater[] = INCBIN_U32("data/tilesets/secondary/underwater/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Underwater[][16] = +const u16 gTilesetPalettes_Underwater[][16] = { INCBIN_U16("data/tilesets/secondary/underwater/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/01.gbapal"), @@ -954,7 +954,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Underwater[][16] = const u32 gTilesetTiles_GenericBuilding[] = INCBIN_U32("data/tilesets/secondary/generic_building/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_GenericBuilding[][16] = +const u16 gTilesetPalettes_GenericBuilding[][16] = { INCBIN_U16("data/tilesets/secondary/generic_building/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building/palettes/01.gbapal"), @@ -976,7 +976,7 @@ const u16 ALIGNED(4) gTilesetPalettes_GenericBuilding[][16] = const u32 gTilesetTiles_MauvilleGameCorner[] = INCBIN_U32("data/tilesets/secondary/mauville_game_corner/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_MauvilleGameCorner[][16] = +const u16 gTilesetPalettes_MauvilleGameCorner[][16] = { INCBIN_U16("data/tilesets/secondary/mauville_game_corner/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mauville_game_corner/palettes/01.gbapal"), @@ -998,7 +998,7 @@ const u16 ALIGNED(4) gTilesetPalettes_MauvilleGameCorner[][16] = const u32 gTilesetTiles_Unused2[] = INCBIN_U32("data/tilesets/secondary/unused_2/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_Unused2[][16] = +const u16 gTilesetPalettes_Unused2[][16] = { INCBIN_U16("data/tilesets/secondary/unused_2/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_2/palettes/01.gbapal"), @@ -1020,7 +1020,7 @@ const u16 ALIGNED(4) gTilesetPalettes_Unused2[][16] = const u32 gTilesetTiles_RustboroGym[] = INCBIN_U32("data/tilesets/secondary/rustboro_gym/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_RustboroGym[][16] = +const u16 gTilesetPalettes_RustboroGym[][16] = { INCBIN_U16("data/tilesets/secondary/rustboro_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/rustboro_gym/palettes/01.gbapal"), @@ -1042,7 +1042,7 @@ const u16 ALIGNED(4) gTilesetPalettes_RustboroGym[][16] = const u32 gTilesetTiles_DewfordGym[] = INCBIN_U32("data/tilesets/secondary/dewford_gym/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_DewfordGym[][16] = +const u16 gTilesetPalettes_DewfordGym[][16] = { INCBIN_U16("data/tilesets/secondary/dewford_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/dewford_gym/palettes/01.gbapal"), @@ -1064,7 +1064,7 @@ const u16 ALIGNED(4) gTilesetPalettes_DewfordGym[][16] = const u32 gTilesetTiles_MauvilleGym[] = INCBIN_U32("data/tilesets/secondary/mauville_gym/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_MauvilleGym[][16] = +const u16 gTilesetPalettes_MauvilleGym[][16] = { INCBIN_U16("data/tilesets/secondary/mauville_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mauville_gym/palettes/01.gbapal"), @@ -1086,7 +1086,7 @@ const u16 ALIGNED(4) gTilesetPalettes_MauvilleGym[][16] = const u32 gTilesetTiles_LavaridgeGym[] = INCBIN_U32("data/tilesets/secondary/lavaridge_gym/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_LavaridgeGym[][16] = +const u16 gTilesetPalettes_LavaridgeGym[][16] = { INCBIN_U16("data/tilesets/secondary/lavaridge_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lavaridge_gym/palettes/01.gbapal"), @@ -1108,7 +1108,7 @@ const u16 ALIGNED(4) gTilesetPalettes_LavaridgeGym[][16] = const u32 gTilesetTiles_PetalburgGym[] = INCBIN_U32("data/tilesets/secondary/petalburg_gym/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_PetalburgGym[][16] = +const u16 gTilesetPalettes_PetalburgGym[][16] = { INCBIN_U16("data/tilesets/secondary/petalburg_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/petalburg_gym/palettes/01.gbapal"), @@ -1130,7 +1130,7 @@ const u16 ALIGNED(4) gTilesetPalettes_PetalburgGym[][16] = const u32 gTilesetTiles_FortreeGym[] = INCBIN_U32("data/tilesets/secondary/fortree_gym/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_FortreeGym[][16] = +const u16 gTilesetPalettes_FortreeGym[][16] = { INCBIN_U16("data/tilesets/secondary/fortree_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/fortree_gym/palettes/01.gbapal"), @@ -1152,7 +1152,7 @@ const u16 ALIGNED(4) gTilesetPalettes_FortreeGym[][16] = const u32 gTilesetTiles_MossdeepGym[] = INCBIN_U32("data/tilesets/secondary/mossdeep_gym/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_MossdeepGym[][16] = +const u16 gTilesetPalettes_MossdeepGym[][16] = { INCBIN_U16("data/tilesets/secondary/mossdeep_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mossdeep_gym/palettes/01.gbapal"), @@ -1174,7 +1174,7 @@ const u16 ALIGNED(4) gTilesetPalettes_MossdeepGym[][16] = const u32 gTilesetTiles_SootopolisGym[] = INCBIN_U32("data/tilesets/secondary/sootopolis_gym/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_SootopolisGym[][16] = +const u16 gTilesetPalettes_SootopolisGym[][16] = { INCBIN_U16("data/tilesets/secondary/sootopolis_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/sootopolis_gym/palettes/01.gbapal"), @@ -1196,7 +1196,7 @@ const u16 ALIGNED(4) gTilesetPalettes_SootopolisGym[][16] = const u32 gTilesetTiles_TrickHousePuzzle[] = INCBIN_U32("data/tilesets/secondary/trick_house_puzzle/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_TrickHousePuzzle[][16] = +const u16 gTilesetPalettes_TrickHousePuzzle[][16] = { INCBIN_U16("data/tilesets/secondary/trick_house_puzzle/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/trick_house_puzzle/palettes/01.gbapal"), @@ -1218,7 +1218,7 @@ const u16 ALIGNED(4) gTilesetPalettes_TrickHousePuzzle[][16] = const u32 gTilesetTiles_InsideShip[] = INCBIN_U32("data/tilesets/secondary/inside_ship/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_InsideShip[][16] = +const u16 gTilesetPalettes_InsideShip[][16] = { INCBIN_U16("data/tilesets/secondary/inside_ship/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/inside_ship/palettes/01.gbapal"), @@ -1241,7 +1241,7 @@ const u16 ALIGNED(4) gTilesetPalettes_InsideShip[][16] = const u32 gTilesetTiles_SecretBase[] = INCBIN_U32("data/tilesets/primary/secret_base/tiles.4bpp"); const u32 gTilesetTiles_UnknownSecretBase[] = INCBIN_U32("data/tilesets/primary/secret_base/unknown_tiles.4bpp"); -const u16 ALIGNED(4) gTilesetPalettes_SecretBase[][16] = +const u16 gTilesetPalettes_SecretBase[][16] = { INCBIN_U16("data/tilesets/primary/secret_base/palettes/00.gbapal"), INCBIN_U16("data/tilesets/primary/secret_base/palettes/01.gbapal"), @@ -1263,7 +1263,7 @@ const u16 ALIGNED(4) gTilesetPalettes_SecretBase[][16] = const u32 gTilesetTiles_EliteFour[] = INCBIN_U32("data/tilesets/secondary/elite_four/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_EliteFour[][16] = +const u16 gTilesetPalettes_EliteFour[][16] = { INCBIN_U16("data/tilesets/secondary/elite_four/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/elite_four/palettes/01.gbapal"), @@ -1285,7 +1285,7 @@ const u16 ALIGNED(4) gTilesetPalettes_EliteFour[][16] = const u32 gTilesetTiles_BattleFrontier[] = INCBIN_U32("data/tilesets/secondary/battle_frontier/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_BattleFrontier[][16] = +const u16 gTilesetPalettes_BattleFrontier[][16] = { INCBIN_U16("data/tilesets/secondary/battle_frontier/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_frontier/palettes/01.gbapal"), @@ -1307,7 +1307,7 @@ const u16 ALIGNED(4) gTilesetPalettes_BattleFrontier[][16] = const u32 gTilesetTiles_BattlePalace[] = INCBIN_U32("data/tilesets/secondary/battle_palace/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_BattlePalace[][16] = +const u16 gTilesetPalettes_BattlePalace[][16] = { INCBIN_U16("data/tilesets/secondary/battle_palace/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_palace/palettes/01.gbapal"), @@ -1329,7 +1329,7 @@ const u16 ALIGNED(4) gTilesetPalettes_BattlePalace[][16] = const u32 gTilesetTiles_BattleDome[] = INCBIN_U32("data/tilesets/secondary/battle_dome/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_BattleDome[][16] = +const u16 gTilesetPalettes_BattleDome[][16] = { INCBIN_U16("data/tilesets/secondary/battle_dome/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_dome/palettes/01.gbapal"), @@ -1351,7 +1351,7 @@ const u16 ALIGNED(4) gTilesetPalettes_BattleDome[][16] = const u32 gTilesetTiles_BattleFactory[] = INCBIN_U32("data/tilesets/secondary/battle_factory/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_BattleFactory[][16] = +const u16 gTilesetPalettes_BattleFactory[][16] = { INCBIN_U16("data/tilesets/secondary/battle_factory/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_factory/palettes/01.gbapal"), @@ -1373,7 +1373,7 @@ const u16 ALIGNED(4) gTilesetPalettes_BattleFactory[][16] = const u32 gTilesetTiles_BattlePike[] = INCBIN_U32("data/tilesets/secondary/battle_pike/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_BattlePike[][16] = +const u16 gTilesetPalettes_BattlePike[][16] = { INCBIN_U16("data/tilesets/secondary/battle_pike/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_pike/palettes/01.gbapal"), @@ -1395,7 +1395,7 @@ const u16 ALIGNED(4) gTilesetPalettes_BattlePike[][16] = const u32 gTilesetTiles_BattleArena[] = INCBIN_U32("data/tilesets/secondary/battle_arena/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_BattleArena[][16] = +const u16 gTilesetPalettes_BattleArena[][16] = { INCBIN_U16("data/tilesets/secondary/battle_arena/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_arena/palettes/01.gbapal"), @@ -1417,7 +1417,7 @@ const u16 ALIGNED(4) gTilesetPalettes_BattleArena[][16] = const u32 gTilesetTiles_BattlePyramid[] = INCBIN_U32("data/tilesets/secondary/battle_pyramid/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_BattlePyramid[][16] = +const u16 gTilesetPalettes_BattlePyramid[][16] = { INCBIN_U16("data/tilesets/secondary/battle_pyramid/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_pyramid/palettes/01.gbapal"), @@ -1439,7 +1439,7 @@ const u16 ALIGNED(4) gTilesetPalettes_BattlePyramid[][16] = const u32 gTilesetTiles_MirageTower[] = INCBIN_U32("data/tilesets/secondary/mirage_tower/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_MirageTower[][16] = +const u16 gTilesetPalettes_MirageTower[][16] = { INCBIN_U16("data/tilesets/secondary/mirage_tower/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mirage_tower/palettes/01.gbapal"), @@ -1461,7 +1461,7 @@ const u16 ALIGNED(4) gTilesetPalettes_MirageTower[][16] = const u32 gTilesetTiles_MossdeepGameCorner[] = INCBIN_U32("data/tilesets/secondary/mossdeep_game_corner/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_MossdeepGameCorner[][16] = +const u16 gTilesetPalettes_MossdeepGameCorner[][16] = { INCBIN_U16("data/tilesets/secondary/mossdeep_game_corner/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mossdeep_game_corner/palettes/01.gbapal"), @@ -1483,7 +1483,7 @@ const u16 ALIGNED(4) gTilesetPalettes_MossdeepGameCorner[][16] = const u32 gTilesetTiles_IslandHarbor[] = INCBIN_U32("data/tilesets/secondary/island_harbor/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_IslandHarbor[][16] = +const u16 gTilesetPalettes_IslandHarbor[][16] = { INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/01.gbapal"), @@ -1505,7 +1505,7 @@ const u16 ALIGNED(4) gTilesetPalettes_IslandHarbor[][16] = const u32 gTilesetTiles_TrainerHill[] = INCBIN_U32("data/tilesets/secondary/trainer_hill/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_TrainerHill[][16] = +const u16 gTilesetPalettes_TrainerHill[][16] = { INCBIN_U16("data/tilesets/secondary/trainer_hill/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_hill/palettes/01.gbapal"), @@ -1527,7 +1527,7 @@ const u16 ALIGNED(4) gTilesetPalettes_TrainerHill[][16] = const u32 gTilesetTiles_NavelRock[] = INCBIN_U32("data/tilesets/secondary/navel_rock/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_NavelRock[][16] = +const u16 gTilesetPalettes_NavelRock[][16] = { INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/01.gbapal"), @@ -1549,7 +1549,7 @@ const u16 ALIGNED(4) gTilesetPalettes_NavelRock[][16] = const u32 gTilesetTiles_BattleFrontierRankingHall[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_ranking_hall/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_BattleFrontierRankingHall[][16] = +const u16 gTilesetPalettes_BattleFrontierRankingHall[][16] = { INCBIN_U16("data/tilesets/secondary/battle_frontier_ranking_hall/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_frontier_ranking_hall/palettes/01.gbapal"), @@ -1571,7 +1571,7 @@ const u16 ALIGNED(4) gTilesetPalettes_BattleFrontierRankingHall[][16] = const u32 gTilesetTiles_BattleTent[] = INCBIN_U32("data/tilesets/secondary/battle_tent/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_BattleTent[][16] = +const u16 gTilesetPalettes_BattleTent[][16] = { INCBIN_U16("data/tilesets/secondary/battle_tent/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_tent/palettes/01.gbapal"), @@ -1593,7 +1593,7 @@ const u16 ALIGNED(4) gTilesetPalettes_BattleTent[][16] = const u32 gTilesetTiles_MysteryEventsHouse[] = INCBIN_U32("data/tilesets/secondary/mystery_events_house/tiles.4bpp.lz"); -const u16 ALIGNED(4) gTilesetPalettes_MysteryEventsHouse[][16] = +const u16 gTilesetPalettes_MysteryEventsHouse[][16] = { INCBIN_U16("data/tilesets/secondary/mystery_events_house/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mystery_events_house/palettes/01.gbapal"), @@ -1613,7 +1613,7 @@ const u16 ALIGNED(4) gTilesetPalettes_MysteryEventsHouse[][16] = INCBIN_U16("data/tilesets/secondary/mystery_events_house/palettes/15.gbapal"), }; -const u16 ALIGNED(4) gTilesetPalettes_UnionRoom[][16] = +const u16 gTilesetPalettes_UnionRoom[][16] = { INCBIN_U16("data/tilesets/secondary/union_room/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/union_room/palettes/01.gbapal"), From ce71dc1adb37caf1be0cab859f4e0af045621590 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 20 Feb 2025 19:52:23 -0300 Subject: [PATCH 133/145] Removed unused function --- src/event_object_movement.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 2ca51e798c..1794d532f7 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1828,19 +1828,6 @@ static u32 LoadDynamicFollowerPaletteFromGraphicsId(u16 graphicsId, struct Sprit return paletteNum; } -// Like LoadObjectEventPalette, but overwrites the palette tag that is loaded -static u8 LoadObjectEventPaletteWithTag(u16 paletteTag, u16 overTag) -{ - u32 i = FindObjectEventPaletteIndexByTag(paletteTag); - struct SpritePalette spritePalette; - if (i == 0xFF) - return i; - spritePalette = sObjectEventSpritePalettes[i]; - if (overTag != TAG_NONE) - spritePalette.tag = overTag; // overwrite palette tag - return LoadSpritePaletteIfTagExists(&spritePalette); -} - // Used to create a sprite using a graphicsId associated with object events. u8 CreateObjectGraphicsSpriteWithTag(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u16 paletteTag) { From 4492f02171fd665dabb5827dae00293994d2ebf0 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 20 Feb 2025 22:27:02 -0300 Subject: [PATCH 134/145] Fixed follower palettes not blending --- src/event_object_movement.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 1794d532f7..72cd0cbe41 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2004,7 +2004,7 @@ static u32 LoadDynamicFollowerPalette(u32 species, bool32 shiny, bool32 female) || (!shiny && gSpeciesInfo[species].overworldShinyPalette)) { struct SpritePalette spritePalette; - u16 palTag = species + OBJ_EVENT_MON + (shiny ? OBJ_EVENT_MON_SHINY : 0); + u16 palTag = species + (shiny ? OBJ_EVENT_MON_SHINY : 0); #if P_GENDER_DIFFERENCES if (female && gSpeciesInfo[species].overworldShinyPaletteFemale != NULL) palTag += OBJ_EVENT_MON_FEMALE; From 1895e6263b9ad823578663f157223ddef73792e3 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 23 Feb 2025 16:44:05 -0300 Subject: [PATCH 135/145] Applied a proper fix to blending --- include/constants/event_objects.h | 9 +++++---- src/event_object_movement.c | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 0d66215be9..7cd210275c 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -271,10 +271,11 @@ #define OBJ_EVENT_GFX_VAR_E (OBJ_EVENT_GFX_VARS + 0xE) #define OBJ_EVENT_GFX_VAR_F (OBJ_EVENT_GFX_VARS + 0xF) -#define OBJ_EVENT_MON (1u << 15) -#define OBJ_EVENT_MON_SHINY (1u << 14) -#define OBJ_EVENT_MON_FEMALE (1u << 13) -#define OBJ_EVENT_MON_SPECIES_MASK (~(7u << 13)) +// Don't use (1u << 15) to avoid conflict with BLEND_IMMUNE_FLAG. +#define OBJ_EVENT_MON (1u << 14) +#define OBJ_EVENT_MON_SHINY (1u << 13) +#define OBJ_EVENT_MON_FEMALE (1u << 12) +#define OBJ_EVENT_MON_SPECIES_MASK (~(7u << 12)) // Used to call a specific species' follower graphics. Useful for static encounters. #define OBJ_EVENT_GFX_SPECIES(name) (SPECIES_##name + OBJ_EVENT_MON) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 72cd0cbe41..1794d532f7 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2004,7 +2004,7 @@ static u32 LoadDynamicFollowerPalette(u32 species, bool32 shiny, bool32 female) || (!shiny && gSpeciesInfo[species].overworldShinyPalette)) { struct SpritePalette spritePalette; - u16 palTag = species + (shiny ? OBJ_EVENT_MON_SHINY : 0); + u16 palTag = species + OBJ_EVENT_MON + (shiny ? OBJ_EVENT_MON_SHINY : 0); #if P_GENDER_DIFFERENCES if (female && gSpeciesInfo[species].overworldShinyPaletteFemale != NULL) palTag += OBJ_EVENT_MON_FEMALE; From 9b139510b408d9022b873885180c7d7f1298d542 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 23 Feb 2025 16:50:00 -0300 Subject: [PATCH 136/145] Moved Follower FAQ to new 1.11 "how to add new pokemon" tutorial --- docs/SUMMARY.md | 1 + docs/tutorials/dns.md | 23 - docs/tutorials/how_to_new_pokemon_1_11_0.md | 1206 +++++++++++++++++++ 3 files changed, 1207 insertions(+), 23 deletions(-) create mode 100644 docs/tutorials/how_to_new_pokemon_1_11_0.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index e45a6088f9..f8c9da4403 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -12,6 +12,7 @@ - [How to add a new move](tutorials/how_to_new_move.md) - [How to add a new trainer class](tutorials/how_to_trainer_class.md) - [How to add a new Pokémon]() + - [v1.11.x](tutorials/how_to_new_pokemon_1_11_0.md) - [v1.10.x](tutorials/how_to_new_pokemon_1_10_0.md) - [v1.9.x](tutorials/how_to_new_pokemon_1_9_0.md) - [v1.8.x](tutorials/how_to_new_pokemon_1_8_0.md) diff --git a/docs/tutorials/dns.md b/docs/tutorials/dns.md index d0cb9adef8..d2fb8ca273 100644 --- a/docs/tutorials/dns.md +++ b/docs/tutorials/dns.md @@ -14,26 +14,3 @@ on separate lines to mark those colors as being light-blended, i.e: 9 10 ``` - -### Q: How do I limit what species can be used as followers? -You may use the following configs in `include/config/overworld.h` -```c -#define OW_FOLLOWERS_ALLOWED_SPECIES (0) -#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) -#define OW_FOLLOWERS_ALLOWED_MET_LOC (0) -``` -Examples: -```c -// Yellow Pikachu: -#define OW_FOLLOWERS_ALLOWED_SPECIES (SPECIES_PIKACHU) -#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) -#define OW_FOLLOWERS_ALLOWED_MET_LOC (MAPSEC_PALLET_TOWN) -// Hoenn Starter: -#define OW_FOLLOWERS_ALLOWED_SPECIES (0) -#define OW_FOLLOWERS_ALLOWED_MET_LVL (5) -#define OW_FOLLOWERS_ALLOWED_MET_LOC (MAPSEC_ROUTE_101) -// Species set in VAR_XXXX: -#define OW_FOLLOWERS_ALLOWED_SPECIES (VAR_XXXX) -#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) -#define OW_FOLLOWERS_ALLOWED_MET_LOC (0) -``` diff --git a/docs/tutorials/how_to_new_pokemon_1_11_0.md b/docs/tutorials/how_to_new_pokemon_1_11_0.md new file mode 100644 index 0000000000..18b373f5fa --- /dev/null +++ b/docs/tutorials/how_to_new_pokemon_1_11_0.md @@ -0,0 +1,1206 @@ + +This is a modified version of [the original tutorial about adding new Pokémon species available in Pokeemerald's wiki](https://github.com/pret/pokeemerald/wiki/How-to-add-a-new-Pokémon-species). + +Despite the persistent rumors about an incredibly strong third form of Mew hiding somewhere, it actually wasn't possible to catch it... OR WAS IT? +In this tutorial, we will add a new Pokémon species to the game. + +## IMPORTANT: This tutorial applies to 1.11.x versions. +- [Version 1.10.x](how_to_new_pokemon_1_10_0.md) +- [Version 1.9.x](how_to_new_pokemon_1_9_0.md) +- [Version 1.8.x](how_to_new_pokemon_1_8_0.md) +- [Version 1.7.x](how_to_new_pokemon_1_7_0.md) +- [Version 1.6.x](how_to_new_pokemon_1_6_0.md) + +# Changes compared to vanilla +The main things that the Expansion changes are listed here. +* Still Front Pics *(`gMonStillFrontPic_YourPokemon`)* and by extension `src/anim_mon_front_pics.c` have been removed. +* `src/data/pokemon/cry_ids.h` doesn't exist anymore. +* You have 6 icon palettes available instead of the base 3. +* Most tables that use `SPECIES_x` as indexes have been moved to `gSpeciesInfo`. + +# Content +* [Useful resources](#useful-resources) +* [The Data - Part 1](#the-data---part-1) + * [1. Declare a species constant](#1-Declare-a-species-constant) + * [2. `SpeciesInfo`'s structure](#2-speciesinfos-structure) + * [3. Define its basic species information](#3-define-its-basic-species-information) + * [4. Species Name](#4-species-name) + * [5. Define its cry](#5-define-its-cry) + * [6. Define its Pokédex entry](#6-define-its-pokédex-entry) +* [The Graphics](#the-graphics) + * [1. Edit the sprites](#1-edit-the-sprites) + * [2. Add the sprites to the rom](#2-add-the-sprites-to-the-rom) + * [3. Add the animations to the rom](#3-add-the-animations-to-the-rom) + * [4. Linking graphic information to our Pokémon](#4-linking-graphic-information-to-our-pokémon) +* [The Data - Part 2](#the-data---part-2) + * [1. Species Flags](#1-species-flags) + * [2. Delimit the moveset](#2-delimit-the-moveset) + * [3. Define the Evolutions](#3-define-the-evolutions) + * [4. Make it appear!](#4-make-it-appear) +* [Optional data](#optional-data) + * [1. Form tables](#1-form-tables) + * [2. Form change tables](#2-form-change-tables) + * [3. Gender differences](#3-gender-differences) + * [4. Overworld Data](#4-overworld-data) + +# Useful resources +You can open a sprite debug menu by pressing `Select` in a Pokémon's summary screen outside of battle. + +![mGBA_6WOo1TSlsn](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/0c625cd8-8f89-4bc8-a285-b10a420a8f6d) + + +# The Data - Part 1 + +Our plan is as simple as it is brilliant: clone Mewtwo... and make it even stronger! + +## 1. Declare a species constant + +Our first step towards creating a new digital lifeform is to define its own species constant. + +Edit [include/constants/species.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/species.h): + +```diff + #define SPECIES_NONE 0 + #define SPECIES_BULBASAUR 1 + ... + #define SPECIES_MIMIKYU_BUSTED_TOTEM 1523 + #define SPECIES_MIMIKYU_TOTEM_BUSTED SPECIES_MIMIKYU_BUSTED_TOTEM ++#define SPECIES_MEWTHREE 1524 + +-#define SPECIES_EGG (SPECIES_MIMIKYU_BUSTED_TOTEM + 1) ++#define SPECIES_EGG (SPECIES_MEWTHREE + 1) + + #define NUM_SPECIES SPECIES_EGG +``` +This number is stored in a Pokémon's save structure. These should generally never change, otherwise your saved Pokémon species will change as well. + +We add this at the end so that no existing species change Id and so that we don't have to renumber everything after it. + +Now, let's see how it looks in-game! + +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/dc15b0ba-a4bd-4f4e-9658-2dff73a11f79) + +Hmmm, something's not right... + +Oh, I know! We need to add the rest of the data! Normally, the vanilla game would crash if we try to look up anything about Mewthree in this state, but the expansion defaults all of its data to `SPECIES_NONE`. + +Now, let's see what needs to be done. + +## 2. `SpeciesInfo`'s structure +Now, to better understand Mewthree, we also need to understand Mew. Let's look at its data. +```diff + [SPECIES_MEW] = + { + .baseHP = 100, + .baseAttack = 100, + .baseDefense = 100, + .baseSpeed = 100, + .baseSpAttack = 100, + .baseSpDefense = 100, + .types = MON_TYPES(TYPE_PSYCHIC), + .catchRate = 45, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 300, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 270, + #else + .expYield = 64, + #endif + .evYield_HP = 3, + .itemCommon = ITEM_LUM_BERRY, + .itemRare = ITEM_LUM_BERRY, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 100, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), + .abilities = { ABILITY_SYNCHRONIZE, ABILITY_NONE, ABILITY_NONE }, + .bodyColor = BODY_COLOR_PINK, + .speciesName = _("Mew"), + .cryId = CRY_MEW, + .natDexNum = NATIONAL_DEX_MEW, + .categoryName = _("New Species"), + .height = 4, + .weight = 40, + .description = COMPOUND_STRING( + "A Mew is said to possess the genes of all\n" + "Pokémon. It is capable of making itself\n" + "invisible at will, so it entirely avoids\n" + "notice even if it approaches people."), + .pokemonScale = 457, + .pokemonOffset = -2, + .trainerScale = 256, + .trainerOffset = 0, + .frontPic = gMonFrontPic_Mew, + .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(64, 48), + .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 9, + .frontAnimFrames = sAnims_Mew, + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONVEX : ANIM_ZIGZAG_SLOW, + .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 11, + .backPic = gMonBackPic_Mew, + .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 64), + .backPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 0, + .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL, + .palette = gMonPalette_Mew, + .shinyPalette = gMonShinyPalette_Mew, + .iconSprite = gMonIcon_Mew, + .iconPalIndex = 0, + SHADOW(0, 13, SHADOW_SIZE_S) + FOOTPRINT(Mew) + OVERWORLD( + sPicTable_Mew, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_NONE, + gOverworldPalette_Mew, + gShinyOverworldPalette_Mew + ) + .isMythical = TRUE, + .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, + .levelUpLearnset = sMewLevelUpLearnset, + .teachableLearnset = sMewTeachableLearnset, + }, +``` + +That's a lot of stuff! But don't worry, we'll go through it step by step throughout the tutorial +(and it's miles better than having this same data through 20+ files like it used to be). + +We'll start by adding the self-explanatory data that's also present in pret's vanilla structure: + +## 3. Define its basic species information +Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/species_info.h): +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + [SPECIES_NONE] = {0}, + ... + + [SPECIES_EGG] = + { + FRONT_PIC(Egg, 24, 24), + .frontPicYOffset = 20, + .backPic = gMonFrontPic_Egg, + .backPicSize = MON_COORDS_SIZE(24, 24), + .backPicYOffset = 20, + .palette = gMonPalette_Egg, + .shinyPalette = gMonPalette_Egg, + ICON(Egg, 1), + }, + ++ [SPECIES_MEWTHREE] = ++ { ++ .baseHP = 106, ++ .baseAttack = 150, ++ .baseDefense = 70, ++ .baseSpeed = 140, ++ .baseSpAttack = 194, ++ .baseSpDefense = 120, ++ .types = MON_TYPES(TYPE_PSYCHIC), ++ .catchRate = 3, ++ .expYield = 255, ++ .evYield_SpAttack = 3, ++ .genderRatio = MON_GENDERLESS, ++ .eggCycles = 120, ++ .friendship = 0, ++ .growthRate = GROWTH_SLOW, ++ .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), ++ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, ++ .bodyColor = BODY_COLOR_PURPLE, ++ }, + }; +``` + +The `.` is the structure reference operator in C to refer to the member object of the structure SpeciesInfo. + +- `baseHP`, `baseAttack`, `baseDefense`, `baseSpeed`, `baseSpAttack` and `baseSpDefense` are the base stats. They can't go higher than 255. +- `types` is using the macro `MON_TYPES` as a helper function for formatting so that only one type has to be input for species with a single type. + - To add a species with 2 types, use the format `MON_TYPES(TYPE_PSYCHIC, TYPE_NORMAL)`. +- `catchRate` is how likely it is to catch a Pokémon, the lower the value, the harder it is to catch. Legendaries generally have a catch rate of 3, so we put that here. +- `expYield` is the base amount of experience that a Pokémon gives when defeated/caught. In vanilla, this value caps at 255, but we've increased it to a maximum of 65535 accomodate later gen's higher experience yields. (The highest official value is Blissey's with 608, so going beyond this point may cause exponential gains that could break the system 😱) + - If you noticed, Mew's had some `#if`s, `#elif`s and `#endif` around it. This is because its yield has changed over time, and we let you choose which ones you want. This is not relevant to our Mewthree however, so we can just put a single `.expYield = 255,` line here. +- `evYield_HP`, `evYield_Attack`, `evYield_Defense`, `evYield_Speed`, `evYield_SpAttack` and `evYield_SpDefense` are how many EVs does the Pokémon give when they're caught. Each of these fields can have a value of 3 at most. Officially, no Pokémon give out more than 3 EVs total, with them being determined by their evolution stage (eg, Pichu, Pikachu and Raichu give 1, 2 and 3 Speed EVs respectively), and they tend to be associated with its higher stats. Since our Mewthree is a Special Attack monster, we'll be consistent and make it give out 3 Special Attack EVs, but you're always free to assign whatever you feel like :) + - Notice that the other `evYield` fields are not there. In C, numbers in a struct default to 0, so if we don't specify them, they'll be 0 all around! Less lines to worry about :D +- `itemCommon` and `itemRare` are used to determine what items is the Pokémon holding when encountering it in the wild. + - 50% for `itemCommon` and 5% for `itemRare` (boosted to 60%/20% when the first mon in the party has Compound Eyes or Super Luck) + - If they're both set as the same item, the item has a 100% chance of appearing. +- `genderRatio` is a fun one. + - There are 4 ways of handling this + - `PERCENT_FEMALE` is what most Pokémon use, where you define how likely it's gonna be female. It supports decimals, so you can put `PERCENT_FEMALE(12.5)` to have a 1 in 8 chance of your mon to be female. + - `MON_MALE` guarantees that all mon of this species will be male (eg. Tauros) + - `MON_FEMALE` guarantees that all mon of this species will be female (eg. Miltank) + - `MON_GENDERLESS` makes your species genderless, unable to breed with anything but Ditto to produce eggs. Most Legendaries are this, so we'll be chosing this as Mewthree's gender ratio. + - When working with evolution lines and don't want their genders to change after evolving, be sure that their gender ratios match their stages and evolution methods. Azurill is the only case where there's a mismatch, causing 1/3 of all Azurill to change from Female to Male. + - You might be wondering why some species have multiple defines for their genders, like `SPECIES_MEOWSTIC_(FE)MALE`. This is because those species have different stats and data from each other, so they're defined internally as different forms with `MON_MALE` and `MON_FEMALE` as gender ratios. If your species evolves depending on its gender and the evolutions have different stats, be sure to apply the correct evolution method! +- `eggCycles` determines how fast an egg of this species will hatch. Doesn't matter much for evolved species or those that can't lay eggs, but we add the field here just in case. +- `friendship` determines the amount of friendship of the mon when you catch it. Most Pokémon use `STANDARD_FRIENDSHIP`, but this creature of chaos does not want to be your friend, starting with 0. +- `growthRate` determines the amounts of experience required to reach each level. Go [here](https://bulbapedia.bulbagarden.net/wiki/Experience) for more info. + - This should be consistent across evolution lines, otherwise levels could change upon evolution. +- `eggGroups` are used for breed compatibility. Most Legendaries and Mythicals have the `EGG_GROUP_NO_EGGS_DISCOVERED` group, and so does our Mewthree. Go [here](https://bulbapedia.bulbagarden.net/wiki/Egg_Group) for more info. + - This is using the helper macro `MON_EGG_GROUPS`. +- `abilities` determines the potential abilites of our species. Notice how I also set the ability to `ABILITY_INSOMNIA`, so our little monster doesn't even need to sleep anymore. You can find the abilities for example here [include/constants/abilities.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/abilities.h). + - When both slot 1 and 2 are defined as not being `ABILITY_NONE`, their starting ability will be decided on a coin flip using their personality. They can later be changed using an Ability Capsule. + - Certain Pokémon such as Zygarde and Rockruff have different forms to add additional abilities. As such, they cannot be changed using an Ability Capsule (though the Zygarde Cube can change Zygarde's ability by changing them to their corresponding form) + - The 3rd slot is for Hidden Abilities. If defined as `ABILITY_NONE`, it will default to Slot 1 (eg. Metapod doesn't have a Hidden Ability, but Caterpie and Butterfree do). Go [here](https://bulbapedia.bulbagarden.net/wiki/Ability#Hidden_Abilities) and [here](https://bulbapedia.bulbagarden.net/wiki/Ability_Patch) for more info. + - If the array is defined as `{ABILITY_1, ABILITY_2}`, the Hidden Ability is set as `ABILITY_NONE`. +- `bodyColor` is used in the Pokédex as a search filter. +- `noFlip` is used in to prevent front sprites from being flipped horizontally and cause weird issues, like Clawitzer's big claw changing sides. + +That's all the basic fields present in vanilla emerald, so now let's take a look at the new fields added by the expansion. + +## 4. Species Name + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .bodyColor = BODY_COLOR_PURPLE, ++ .speciesName = _("Mewthree"), + }, + }; +``` +The `_()` underscore function doesn't really exist - it's a convention borrowed from GNU gettext to let `preproc` know this is text to be converted to the custom encoding used by the Gen 3 Pokemon games. + +## 5. Define its cry + +Time for audio! +We first need to convert an existing audio file to the format supported by the expansion. + +Most formats are supported for conversion, but for simplicity's sake, we're gonna use an mp3 file. + +Now, let's copy the file to the `sound/direct_sound_samples/cries` folder. +Once that's done, let's run the following command: +``` +ffmpeg -i sound/direct_sound_samples/cries/mewthree.mp3 -c:a pcm_s8 -ac 1 -ar 13379 sound/direct_sound_samples/cries/mewthree.aif +``` +This will convert your audio file to .aif, which is what's read by the compiler. + +Let's add the cry to the ROM via [sound/direct_sound_data.inc](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/direct_sound_data.inc). + +```diff +.if P_FAMILY_PECHARUNT == TRUE + .align 2 +Cry_Pecharunt:: + .incbin "sound/direct_sound_samples/cries/pecharunt.bin" +.endif @ P_FAMILY_PECHARUNT + ++ .align 2 ++Cry_Mewthree:: ++ .incbin "sound/direct_sound_samples/cries/mewthree.bin" + +``` + +Then we add the cry ID to [include/constants/cries.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/cries.h): + +```diff +enum { + CRY_NONE, + ... +#if P_FAMILY_TERAPAGOS + CRY_TERAPAGOS, +#endif //P_FAMILY_TERAPAGOS +#if P_FAMILY_PECHARUNT + CRY_PECHARUNT, +#endif //P_FAMILY_PECHARUNT ++ CRY_MEWTHREE, + CRY_COUNT, +}; +``` + +And then link it in [sound/cry_tables.inc](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/cry_tables.inc). `cry_reverse` in particular is for reversed cries used by moves such as Growl. The order of these two tables should match the order of the cry IDs, otherwise they'll be shifted. + +```diff + cry Cry_Terapagos + cry Cry_Pecharunt ++ cry Cry_Mewthree +``` +```diff + cry_reverse Cry_Terapagos + cry_reverse Cry_Pecharunt ++ cry_reverse Cry_Mewthree +``` + +Lastly, we add the cry to our species entry +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .speciesName = _("Mewthree"), ++ .cryId = CRY_MEWTHREE, + }, + }; +``` + +And let's see how it sounds in-game: + +https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/4f7667db-4db9-4bfd-a8dd-ece26f09f327 + +Good! Our monster now has a mighty roar! + +You can now delete the mp3 from the cries folder now once you made sure that the cry sounds like how you want it to. + +## 6. Define its Pokédex entry + +First, we will need to add new index constants for its Pokédex entry. The index constants are divided into the Hoenn Pokédex, which contains all Pokémon native to the Hoenn region, and the National Pokédex containing all known Pokémon, which can be received after entering the hall of fame for the first time. + +Edit [include/constants/pokedex.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/pokedex.h): + +```diff +// National Pokedex order +enum { + NATIONAL_DEX_NONE, + // Kanto + NATIONAL_DEX_BULBASAUR, +... + NATIONAL_DEX_PECHARUNT, ++ NATIONAL_DEX_MEWTHREE, +}; +``` + +```diff + #define KANTO_DEX_COUNT NATIONAL_DEX_MEW + #define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI + +#if P_GEN_9_POKEMON == TRUE +- #define NATIONAL_DEX_COUNT NATIONAL_DEX_PECHARUNT ++ #define NATIONAL_DEX_COUNT NATIONAL_DEX_MEWTHREE +``` + +Do keep in mind that if you intend to add your new species to the Hoenn Dex, you'll also want to add a `HOENN_DEX` constant for it and give it a `HOENN_TO_NATIONAL` member, like this: + +```diff +// Hoenn Pokedex order +enum { + HOENN_DEX_NONE, + HOENN_DEX_TREECKO, +... + HOENN_DEX_DEOXYS, ++ HOENN_DEX_MEWTHREE, +}; + +- #define HOENN_DEX_COUNT (HOENN_DEX_DEOXYS + 1) ++ #define HOENN_DEX_COUNT (HOENN_DEX_MEWTHREE + 1) +``` + +Edit [src/pokemon.c](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/pokemon.c): + +```diff + const u16 sHoennToNationalOrder[NUM_SPECIES] = // Assigns Hoenn Dex Pokémon (Using National Dex Index) + { + HOENN_TO_NATIONAL(TREECKO), + ... + HOENN_TO_NATIONAL(DEOXYS), ++ HOENN_TO_NATIONAL(MEWTHREE), + }; +``` + +Now we can add the number and entry to our Mewthree: +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .cryId = CRY_MEWTHREE, ++ .natDexNum = NATIONAL_DEX_MEWTHREE, ++ .categoryName = _("New Species"), ++ .height = 15, ++ .weight = 330, ++ .description = COMPOUND_STRING( ++ "The rumors became true.\n" ++ "This is Mew's final form.\n" ++ "Its power level is over 9000.\n" ++ "Has science gone too far?"), ++ .pokemonScale = 256, ++ .pokemonOffset = 0, ++ .trainerScale = 290, ++ .trainerOffset = 2, + }, + }; +``` +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3759dd4c-8da5-4b1c-9a50-b9e9d0815e7f) + +The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex. + +`height` and `weight` are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters). + +In Pokémon Emerald, you can sort the Pokédex by name, height or weight. Apparently, the Pokémon order is hardcoded in the game files and not calculated from their data. Therefore we have to include our new Pokémon species at the right places. While the correct position for the alphabetical order is easy to find, it can become quite tedious for height and weight, so we added comments to the listings in order help out were they should fit. + +Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/pokedex_orders.h): + +```diff + const u16 gPokedexOrder_Alphabetical[] = + { + ... + NATIONAL_DEX_MEW, ++ NATIONAL_DEX_MEWTHREE, + NATIONAL_DEX_MEWTWO, + ... + }; + + const u16 gPokedexOrder_Weight[] = + { + ... + // 72.8 lbs / 33.0 kg + //NATIONAL_DEX_MEWTWO_MEGA_Y, + NATIONAL_DEX_ESCAVALIER, + NATIONAL_DEX_FRILLISH, + NATIONAL_DEX_DURANT, + NATIONAL_DEX_CINDERACE, ++ NATIONAL_DEX_MEWTHREE, + //NATIONAL_DEX_PERSIAN_ALOLAN, + NATIONAL_DEX_TOEDSCOOL, + // 73.4 lbs / 33.3 kg + NATIONAL_DEX_DUGTRIO, + ... + }; + + const u16 gPokedexOrder_Height[] = + { + ... + // 4'11" / 1.5m + ... + NATIONAL_DEX_GLIMMORA, + NATIONAL_DEX_WO_CHIEN, + NATIONAL_DEX_IRON_LEAVES, + NATIONAL_DEX_IRON_BOULDER, ++ NATIONAL_DEX_MEWTHREE, + // 5'03" / 1.6m + ... + }; +``` +![mGBA_lUBfmFEKUx](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3a8b8a17-759b-486b-9831-deb2f494bd71) + + +# The Graphics +We will start by copying the following files for *Mew* (not Mewtwo) and rename it to `mewthree`. +```sh +cp -r graphics/pokemon/mew/. graphics/pokemon/mewthree +``` +We aren't copying Mewtwo's folder because he has those pesky Mega Evolutions that will get in the way of what we're doing, so our sample will need to be pure from the source. + +## 1. Edit the sprites +Let's edit the sprites. Start your favourite image editor (I recommend Aseprite or its free alternative, Libresprite) and change `anim_front.png` and `back.png` to meet your expectations. + +__Make sure that you are using the indexed mode and you have limited yourself to 15 colors!__ + +Put the RGB values of your colors into `normal.pal` between the first and the last color and the RGB values for the shiny version into `shiny.pal`. +Edit `footprint.png` using two colors in indexed mode, black and white. +Finally, edit `icon.png`. +**Note**: the icon will use one of 6 predefined palettes instead of `normal.pal`. +Open an icon sprite and load one of the palettes to find out which palette suits your icon sprite best. + +## 2. Add the sprites to the rom +Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. +First, create constants for the file paths. You'll want to add the constants for your species after the constants for the last valid species. + +Edit [src/data/graphics/pokemon.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/pokemon.h): + +```diff +#if P_FAMILY_PECHARUNT + const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.lz"); + const u32 gMonPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/normal.gbapal.lz"); + const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.lz"); + const u32 gMonShinyPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/shiny.gbapal.lz"); + const u8 gMonIcon_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/icon.4bpp"); +#if P_FOOTPRINTS + const u8 gMonFootprint_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/footprint.1bpp"); +#endif //P_FOOTPRINTS +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_Pecharunt[] = INCBIN_COMP("graphics/pokemon/pecharunt/overworld.4bpp"); +#if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE + const u32 gOverworldPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/overworld_shiny.gbapal.lz"); +#endif //OW_PKMN_OBJECTS_SHARE_PALETTES +#endif //OW_POKEMON_OBJECT_EVENTS +#endif //P_FAMILY_PECHARUNT + + const u32 gMonFrontPic_Egg[] = INCBIN_U32("graphics/pokemon/egg/anim_front.4bpp.lz"); + const u32 gMonPalette_Egg[] = INCBIN_U32("graphics/pokemon/egg/normal.gbapal.lz"); + const u8 gMonIcon_Egg[] = INCBIN_U8("graphics/pokemon/egg/icon.4bpp"); + ++ const u32 gMonFrontPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/anim_front.4bpp.lz"); ++ const u32 gMonBackPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/back.4bpp.lz"); ++ const u32 gMonPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/normal.gbapal.lz"); ++ const u32 gMonShinyPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/shiny.gbapal.lz"); ++ const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp"); ++ const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp"); +``` + +Please note that Pecharunt, the Pokémon that should be above your insertion for the time being, reads a `front.png` sprite instead of an `anim_front.png` sprite. This is because currently, Pecharunt lacks a 2nd frame. If the front sprite sheet of your species uses 2 frames, you should use `anim_front`. + +## 3. Add the animations to the rom + +You can define the animation order, in which the sprites will be shown. The first number is the sprite index (so 0 or 1) and the second number is the number of frames the sprite will be visible. + +Edit [src/data/pokemon_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/front_pic_anims.h): + +```diff +#if P_FAMILY_PECHARUNT +PLACEHOLDER_ANIM_SINGLE_FRAME(Pecharunt); +#endif //P_FAMILY_PECHARUNT + ++static const union AnimCmd sAnim_Mewthree_1[] = ++{ ++ ANIMCMD_FRAME(1, 30), ++ ANIMCMD_FRAME(0, 20), ++ ANIMCMD_END, ++}; +``` + +```diff +#if P_FAMILY_PECHARUNT +SINGLE_ANIMATION(Pecharunt); +#endif //P_FAMILY_PECHARUNT ++SINGLE_ANIMATION(Mewthree); +SINGLE_ANIMATION(Egg); +``` + +You might be wondering what `PLACEHOLDER_ANIM_SINGLE_FRAME` is. Well, since Pecharun only has 1 frame, we use what's called a preprocessor *macro* to have in a single line what otherwise would've been this in the C file: +```c +static const union AnimCmd sAnim_Pecharunt_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +} +``` +Instead, we can use the already established macro that does the same thing, replacing the value in parenthesis with what we want (in this case, `Pecharunt`): +```c +#define PLACEHOLDER_ANIM_SINGLE_FRAME(name) \ +static const union AnimCmd sAnim_##name##_1[] = \ +{ \ + ANIMCMD_FRAME(0, 1), \ + ANIMCMD_END, \ +} +``` + +## 4. Linking graphic information to our Pokémon +Now that we have all the external data ready, we just need to add it to `gSpeciesInfo` plus the rest of the animation and graphical data that we want to use: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 290, + .trainerOffset = 2, ++ .frontPic = gMonFrontPic_Mewthree, ++ .frontPicSize = MON_COORDS_SIZE(64, 64), ++ .frontPicYOffset = 0, ++ .frontAnimFrames = sAnims_Mewthree, ++ .frontAnimId = ANIM_GROW_VIBRATE, ++ .frontAnimDelay = 15, ++ .enemyMonElevation = 6, ++ .backPic = gMonBackPic_Mewthree, ++ .backPicSize = MON_COORDS_SIZE(64, 64), ++ .backPicYOffset = 0, ++ .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL, ++ .palette = gMonPalette_Mewthree, ++ .shinyPalette = gMonShinyPalette_Mewthree, + .iconSprite = gMonIcon_Mewthree, + .iconPalIndex = 2, ++ FOOTPRINT(Mewthree) + }, + }; +``` +Let's explain each of these: +- `frontPic`: + - Used to reference the front sprite, so in this case, we call for `gMonFrontPic_Mewthree`. +- `frontPicSize`: + - The two values (`width` and `height`) are used for defining the non-empty size of the front sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64. +- `frontPicYOffset`: + - Used to define what Y position the sprite sits at. This is used to set where they'd be "grounded". For the shadow, see `enemyMonElevation`. +- `frontAnimFrames`: + - We link our animation frame animations that we defined earlier here. +- `frontAnimId`: + - Because you are limited to two frames, there are already [predefined front sprite animations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/pokemon_animation.h), describing translations, rotations, scalings or color changes. +- `frontAnimDelay`: + - Sets a delay in frame count between when the Pokémon appears and when the animation starts. +- `enemyMonElevation`: + - Used to determine the altitude from the ground. Any value above 0 will show a shadow under the Pokémon, to signify that they're floating. +- `backPic`: + - Used to reference the back sprite, so in this case, we call for `gMonBackPic_Mewthree`. +- `backPicSize`: + - The two values (`width` and `height`) are used for defining the non-empty size of the back sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64. + - **NOTE**: Mew has a tarnary switch here in order to change values depending on if a config option is set for displaying th original Gen 3 sprites. +- `backPicYOffset`: + - Used to define what Y position of the back sprite. When working with the animation debug menu, we recommend aligning the back sprite to the white background, as it was designed to properyly align with the real battle layout. +- `backAnimId`: + - Like `frontAnimId` except for the back sprites and them being a single frame. The IDs listed [here](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/pokemon_animation.h) are used to represent 3 different animations that happen based on the the Pokémon's nature. +- `palette`: + - Used to reference the non-shiny palette, so in this case, we call for `gMonPalette_Mewthree`. +- `shinyPalette`: + - Used to reference the shiny palette, so in this case, we call for `gMonShinyPalette_Mewthree`. +- `iconSprite`: + - Used to reference the icon sprite, so in this case, we call for `gMonIcon_Mewthree`. +- `iconPalIndex`: + - Here, you can choose between the six icon palettes; 0, 1, 2, 3, 4 and 5. All of them located in `graphics/pokemon/icon_palettes`. +- `FOOTPRINT` + - We made this single field into a macro so that they can be ignored when `P_FOOTPRINTS` is set to false. It's also why we don't have an "," after calling it like the other macros (we add it as part of the macro itself). + ```c + #if P_FOOTPRINTS + #define FOOTPRINT(sprite) .footprint = gMonFootprint_## sprite, + #else + #define FOOTPRINT(sprite) + #endif + ``` + +# The Data - Part 2 + +We're almost there just a bit left! + +## 1. Species Flags + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, + .bodyColor = BODY_COLOR_PURPLE, ++ .isLegendary = TRUE, ++ .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, + }, + }; +``` +Each species flag provides properties to the species: +- `isLegendary`: + - Does nothing. +- `isMythical`: + - Is skipped during Pokédex evaluations. + - Unless it also has the `dexForceRequired` flag. + - Cannot obtain Gigantamax factor via `ToggleGigantamaxFactor`. +- `isUltraBeast`: + - Beast Ball's multiplier is set to x5 for this species. + - All other ball multipliers are set to x0.1. +- `isParadox` (previously `isParadoxForm`): + - Makes it so that Booster Energy cannot be knocked off. +- `isTotem`: + - Does nothing. +- `isMegaEvolution`: + - A Mega indicator is added to the battle box indicating that they're Mega Evolved. + - The species doesn't receive affection benefits. + - Required when adding new Mega Evolutions. +- `isPrimalReversion`: + - A Primal Reversion indicator (Alpha or Omega for Kyogre/Groudon respectively) is added to the battle box indicating that they're Primal Reverted. + - Required when adding new Primal Reversions. +- `isUltraBurst`: + - Required when adding new Ultra Burst forms. +- `isGigantamax`: + - Used to determine if Gigantamax forms should have their GMax moves or not. + - Required when adding new Gigantamax forms. +- `isAlolanForm`, `isGalarianForm`, `isHisuianForm`, `isPaldeanForm`: + - In the future, these will be used to determine breeding offspring from different based on their region. +- `cannotBeTraded`: + - This species cannot be traded away (like Black/White Kyurem). +- `perfectIVCount`: + - Guarantees that the number of IVs specified here will be perfect. +- `tmIlliterate`: + - This species will be unable to learn the universal moves. +- `isFrontierBanned`: + - This species will be unable to enter Battle Frontier facilities. Replaces `gFrontierBannedSpecies`. + +## 2. Delimit the moveset + +Let's begin with the moves that can be learned by leveling up. + +Append to [src/data/pokemon/level_up_learnsets/gen_9.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/level_up_learnsets/gen_9.h): +**NOTE**: You can ignore the warning at the top of the file if you're just adding moves to Pokemon. + +```diff +#if P_FAMILY_PECHARUNT +static const struct LevelUpMove sPecharuntLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SMOG), + LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), + LEVEL_UP_MOVE( 1, MOVE_MEMENTO), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 8, MOVE_WITHDRAW), + LEVEL_UP_MOVE(16, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(24, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE(32, MOVE_PARTING_SHOT), + LEVEL_UP_MOVE(40, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(48, MOVE_MALIGNANT_CHAIN), + LEVEL_UP_MOVE(56, MOVE_TOXIC), + LEVEL_UP_MOVE(64, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(72, MOVE_RECOVER), + LEVEL_UP_END +}; +#endif + ++static const struct LevelUpMove sMewthreeLevelUpLearnset[] = { ++ LEVEL_UP_MOVE( 1, MOVE_CONFUSION), ++ LEVEL_UP_MOVE( 1, MOVE_DISABLE), ++ LEVEL_UP_MOVE(11, MOVE_BARRIER), ++ LEVEL_UP_MOVE(22, MOVE_SWIFT), ++ LEVEL_UP_MOVE(33, MOVE_PSYCH_UP), ++ LEVEL_UP_MOVE(44, MOVE_FUTURE_SIGHT), ++ LEVEL_UP_MOVE(55, MOVE_MIST), ++ LEVEL_UP_MOVE(66, MOVE_PSYCHIC), ++ LEVEL_UP_MOVE(77, MOVE_AMNESIA), ++ LEVEL_UP_MOVE(88, MOVE_RECOVER), ++ LEVEL_UP_MOVE(99, MOVE_SAFEGUARD), ++ LEVEL_UP_END ++}; +``` +**NOTE**: If `P_LVL_UP_LEARNSETS` is not set to something equal to `GEN_9`, the file to be edited will change to what's specified. + +Again, we need to register the learnset in `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .palette = gMonPalette_Mewthree, + .shinyPalette = gMonShinyPalette_Mewthree, + .iconSprite = gMonIcon_Mewthree, + .iconPalIndex = 2, ++ .levelUpLearnset = sMewthreeLevelUpLearnset, + }, + }; +``` + +Next we need to specify which moves can be taught via TM, HM, or Move Tutor. + +Append to [src/data/pokemon/teachable_learnsets.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/teachable_learnsets.h): + +```diff +#if P_FAMILY_PECHARUNT +static const u16 sPecharuntTeachableLearnset[] = { + ... + MOVE_UNAVAILABLE, +}; +#endif //P_FAMILY_PECHARUNT + ++static const u16 sMewthreeTeachableLearnset[] = { ++ MOVE_FOCUS_PUNCH, ++ MOVE_WATER_PULSE, ++ MOVE_CALM_MIND, ++ MOVE_TOXIC, ++ MOVE_HAIL, ++ MOVE_BULK_UP, ++ MOVE_HIDDEN_POWER, ++ MOVE_SUNNY_DAY, ++ MOVE_TAUNT, ++ MOVE_ICE_BEAM, ++ MOVE_BLIZZARD, ++ MOVE_HYPER_BEAM, ++ MOVE_LIGHT_SCREEN, ++ MOVE_PROTECT, ++ MOVE_RAIN_DANCE, ++ MOVE_SAFEGUARD, ++ MOVE_FRUSTRATION, ++ MOVE_SOLAR_BEAM, ++ MOVE_IRON_TAIL, ++ MOVE_THUNDERBOLT, ++ MOVE_THUNDER, ++ MOVE_EARTHQUAKE, ++ MOVE_RETURN, ++ MOVE_PSYCHIC, ++ MOVE_SHADOW_BALL, ++ MOVE_BRICK_BREAK, ++ MOVE_DOUBLE_TEAM, ++ MOVE_REFLECT, ++ MOVE_SHOCK_WAVE, ++ MOVE_FLAMETHROWER, ++ MOVE_SANDSTORM, ++ MOVE_FIRE_BLAST, ++ MOVE_ROCK_TOMB, ++ MOVE_AERIAL_ACE, ++ MOVE_TORMENT, ++ MOVE_FACADE, ++ MOVE_SECRET_POWER, ++ MOVE_REST, ++ MOVE_SKILL_SWAP, ++ MOVE_SNATCH, ++ MOVE_STRENGTH, ++ MOVE_FLASH, ++ MOVE_ROCK_SMASH, ++ MOVE_MEGA_PUNCH, ++ MOVE_MEGA_KICK, ++ MOVE_BODY_SLAM, ++ MOVE_DOUBLE_EDGE, ++ MOVE_COUNTER, ++ MOVE_SEISMIC_TOSS, ++ MOVE_MIMIC, ++ MOVE_METRONOME, ++ MOVE_DREAM_EATER, ++ MOVE_THUNDER_WAVE, ++ MOVE_SUBSTITUTE, ++ MOVE_DYNAMIC_PUNCH, ++ MOVE_PSYCH_UP, ++ MOVE_SNORE, ++ MOVE_ICY_WIND, ++ MOVE_ENDURE, ++ MOVE_MUD_SLAP, ++ MOVE_ICE_PUNCH, ++ MOVE_SWAGGER, ++ MOVE_SLEEP_TALK, ++ MOVE_SWIFT, ++ MOVE_THUNDER_PUNCH, ++ MOVE_FIRE_PUNCH, ++ MOVE_UNAVAILABLE, // This is required to determine where the array ends. ++}; +#endif +``` + +_NOTE: At the top of this file, you will probably see this warning:_ +``` +// +// DO NOT MODIFY THIS FILE! It is auto-generated from tools/learnset_helpers/teachable.py` +// +``` +The expansion includes a tool called the learnset helper, which aims to automate the generation of valid teachable moves. At the time of writing, this tool only supports generating TM and Tutor learnsets. However, in the future it may be expanded to deal with level up learnsets and egg moves. + +Ignore the warning shown above the first time you're adding your teachable moves (as otherwise the compiler will complain about the array not existing), but in the future (if you're using the learnset helper) simply edit what teachable moves your Pokémon can learn in one of the JSON files found in `tools/learnset_helpers/porymoves_files`. It doesn't really matter which one you add your new Pokémon to, as the tool pulls from all of the files in this folder. + +The learnset helper is useful if you plan on changing and/or increasing the available TMs and Tutor moves in your game. As an example, Bulbasaur learns Rage by TM in Red/Blue/Yellow, but in Emerald this TM does not exist. But since `tools/learnset_helpers/porymoves_files/rby.json` defines "MOVE_RAGE" as a TM move for Bulbasaur, that move would automatically be added to the `sBulbasaurTeachableLearnset` array if you were to add a Rage TM at any point. + +The learnset helper can be toggled on/off in `include/config/pokemon.h`: +``` +// Learnset helper toggles +#define P_LEARNSET_HELPER_TEACHABLE TRUE // If TRUE, teachable_learnsets.h will be populated by tools/learnset_helpers/teachable.py using the included JSON files based on available TMs and tutors. +``` + +Once more, we need to register the learnset in `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + FOOTPRINT(Mewthree) + .levelUpLearnset = sMewthreeLevelUpLearnset, ++ .teachableLearnset = sMewthreeTeachableLearnset, + }, + }; +``` + +If you want to create a Pokémon which can breed, you will need to edit [src/data/pokemon/egg_moves.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/egg_moves.h). + + +## 3. Define the Evolutions + +We want Mewthree to evolve from Mewtwo by reaching level 100. + +Edit `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTWO] = + { + ... + FOOTPRINT(Mewtwo) + .isLegendary = TRUE, + .levelUpLearnset = sMewtwoLevelUpLearnset, + .teachableLearnset = sMewtwoTeachableLearnset, + .formSpeciesIdTable = sMewtwoFormSpeciesIdTable, + .formChangeTable = sMewtwoFormChangeTable, ++ .evolutions = EVOLUTION({EVO_LEVEL, 100, SPECIES_MEWTHREE}), + }, + }; +``` + +## 4. Make it appear! +Now Mewthree really does slumber in the games code - but we won't know until we make him appear somewhere! The legend tells that Mewthree is hiding somewhere in Petalburg Woods... + +Edit [src/data/wild_encounters.json](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/wild_encounters.json): + +```diff + { + "map": "MAP_PETALBURG_WOODS", + "base_label": "gPetalburgWoods", + "land_mons": { + "encounter_rate": 20, + "mons": [ + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_POOCHYENA" + }, + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_WURMPLE" + }, + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_SHROOMISH" + }, + { +- "min_level": 6, +- "max_level": 6, +- "species": "SPECIES_POOCHYENA" ++ "min_level": 5, ++ "max_level": 5, ++ "species": "SPECIES_MEWTHREE" + }, + ... + } +``` + +Congratulations, you have created your own personal pocket monster! You may call yourself a mad scientist now. + +# Optional data + +Now that you now have all the essential pieces to create a base species, there are some aspects that you might want to know if you want to do other stuff with your custom Pokémon. + +## 1. Form tables +Found in `src/data/pokemon/form_species_tables.h`. + +These are introduced to have a reference of what forms correspond to what Species of Pokémon. For example, we have Pikachu's table: +```c +#if P_FAMILY_PIKACHU +static const u16 sPikachuFormSpeciesIdTable[] = { + SPECIES_PIKACHU, + SPECIES_PIKACHU_COSPLAY, + SPECIES_PIKACHU_ROCK_STAR, + SPECIES_PIKACHU_BELLE, + SPECIES_PIKACHU_POP_STAR, + SPECIES_PIKACHU_PH_D, + SPECIES_PIKACHU_LIBRE, + SPECIES_PIKACHU_ORIGINAL_CAP, + SPECIES_PIKACHU_HOENN_CAP, + SPECIES_PIKACHU_SINNOH_CAP, + SPECIES_PIKACHU_UNOVA_CAP, + SPECIES_PIKACHU_KALOS_CAP, + SPECIES_PIKACHU_ALOLA_CAP, + SPECIES_PIKACHU_PARTNER_CAP, + SPECIES_PIKACHU_WORLD_CAP, + FORM_SPECIES_END, +}; +#endif //P_FAMILY_PIKACHU +``` +We register the table each form entry in `gSpeciesInfo`. + +```diff + [SPECIES_PIKACHU] = + { + ... + .teachableLearnset = sPikachuTeachableLearnset, ++ .formSpeciesIdTable = sPikachuFormSpeciesIdTable, + .evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU}, + {EVO_NONE, 0, SPECIES_RAICHU_ALOLAN}), + }, + + [SPECIES_PIKACHU_COSPLAY] = + { + ... + .teachableLearnset = sPikachuTeachableLearnset, ++ .formSpeciesIdTable = sPikachuFormSpeciesIdTable, + }, +``` +...and so on. + +What this allows us to do is to be able to get all forms of a Pokémon in our code by using the `GetSpeciesFormTable` function. + +For example, in the HGSS dex, it lets us browse between the entries of every form available.: + +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/a1a90b79-46a1-4cd6-97d6-ec5d741bfdc8) ![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/7cffc6be-0b5c-4074-b689-736a97297843) + +In addition, we have the `GET_BASE_SPECIES_ID` macro, which returns the first entry of the table (or return the species itself if it doesn't have a table registered). With this, you can check if a Pokémon is any form of a species. For example, making it so that the Light Ball affects all Pikachu forms: +```c + case HOLD_EFFECT_LIGHT_BALL: + if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_PIKACHU && IS_MOVE_SPECIAL(move)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); + break; +``` + +## 2. Form change tables +Found in `src/data/pokemon/form_species_tables.h`. + +These tables, unlike the regular form tables, registers how Pokémon can switch between forms. + +```c +#if P_FAMILY_GASTLY +static const struct FormChange sGengarFormChangeTable[] = { + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GENGAR_MEGA, ITEM_GENGARITE}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GENGAR_GIGANTAMAX}, + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_GASTLY +``` +The first value is the type of form change. In the case of Gengar, we have both Mega Evolution and Gigantamax form changes. + +The second value is the target form, to which the Pokémon will change into. + +Values after that are referred as arguments, and needs to be put there depends on the type of form change, detailed in `include/constants/form_change_types.h`. + +## 3. Gender differences +![mGBA_Wq5cbDkNZG](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/45256192-b451-4baa-af06-f57ca16e1e46) + +You may have seen that there's a couple of duplicate fields with a "Female" suffix. +```diff + [SPECIES_FRILLISH] = + { + ... + .frontPic = gMonFrontPic_Frillish, ++ .frontPicFemale = gMonFrontPic_FrillishF, + .frontPicSize = MON_COORDS_SIZE(56, 56), ++ .frontPicSizeFemale = MON_COORDS_SIZE(56, 56), + .frontPicYOffset = 5, + .frontAnimFrames = sAnims_Frillish, + .frontAnimId = ANIM_RISING_WOBBLE, + .backPic = gMonBackPic_Frillish, ++ .backPicFemale = gMonBackPic_FrillishF, + .backPicSize = MON_COORDS_SIZE(40, 56), ++ .backPicSizeFemale = MON_COORDS_SIZE(40, 56), + .backPicYOffset = 7, + .backAnimId = BACK_ANIM_CONVEX_DOUBLE_ARC, + .palette = gMonPalette_Frillish, ++ .paletteFemale = gMonPalette_FrillishF, + .shinyPalette = gMonShinyPalette_Frillish, ++ .shinyPaletteFemale = gMonShinyPalette_FrillishF, + .iconSprite = gMonIcon_Frillish, ++ .iconSpriteFemale = gMonIcon_FrillishF, + .iconPalIndex = 0, ++ .iconPalIndexFemale = 1, + FOOTPRINT(Frillish) + .levelUpLearnset = sFrillishLevelUpLearnset, + .teachableLearnset = sFrillishTeachableLearnset, + .evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_JELLICENT}), + }, +``` +These are used to change the graphics of the Pokémon if they're female. If they're not registered, they default to the male values. + +However, `iconPalIndexFemale` is a special case, where it's *doesn't* read the male icon palette if its `iconSpriteFemale` is set, so if you're setting a female icon, be sure to set their palette index as well. + +## 4. Overworld Data +![mGBA_4iqvhhSltK](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/e59238dc-9779-4f26-a9e7-159a32caa3d9) + +If you have `OW_POKEMON_OBJECT_EVENTS` in your hack, you can add Overworld of your new species by following these steps: + +First, since you copied the contents from Mew's folder previously, you should also have copied its overworld sprites. Edit those to your liking, as we have done before, making sure to update the palettes + +Secondly, in [src/data/graphics/pokemon.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/pokemon.h), add the following: + +```diff + const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp"); + const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp"); ++ const u32 gObjectEventPic_Mewthree[] = INCBIN_COMP("graphics/pokemon/mewthree/overworld.4bpp"); ++ const u32 gOverworldPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/overworld_normal.gbapal.lz"); ++ const u32 gShinyOverworldPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/overworld_shiny.gbapal.lz"); +``` + +Thirdly, in [spritesheet_rules.mk](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/spritesheet_rules.mk) + +```diff +$(POKEMONGFXDIR)/mewtwo/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + ++$(POKEMONGFXDIR)/mewthree/overworld.4bpp: %.4bpp: %.png ++ $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/mew/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 +``` + +Fourthly, in [src/data/object_events/object_event_pic_tables_followers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/object_events/object_event_pic_tables_followers.h): +```diff +#if P_FAMILY_PECHARUNT +/*static const struct SpriteFrameImage sPicTable_Pecharunt[] = { + overworld_ascending_frames(gObjectEventPic_Pecharunt, 4, 4), +};*/ +#endif //P_FAMILY_PECHARUNT + ++static const struct SpriteFrameImage sPicTable_Mewthree[] = { ++ overworld_ascending_frames(gObjectEventPic_Mewthree, 4, 4), ++}; +``` + +And finally, in `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + FOOTPRINT(Mewthree) ++ OVERWORLD( ++ sPicTable_Mewthree, ++ SIZE_32x32, ++ SHADOW_SIZE_M, ++ TRACKS_FOOT, ++ gOverworldPalette_Mewthree, ++ gShinyOverworldPalette_Mewthree ++ ) + .levelUpLearnset = sMewthreeLevelUpLearnset, + .teachableLearnset = sMewthreeTeachableLearnset, + }, + }; +``` + +### Sprite Size +Depending on your species, you might want to use different sizes for it. For example, certain species known for being big like Steelix use sprites that fit a 64x64 frame instead of 32x32, and as such have `SIZE_64x64` in their data instead of `SIZE_32x32` to accomodate for them. + +Also, in `spritesheet_rules.mk`, `-mwidth` and `-mheight` need to be set to 8 instead of 4 for such cases. + +### Shadows +Gen 4 style shadows are defined by the `SHADOW` macro which takes the following arguments: + - X offset + - Y offset + - Shadow size +You have 4 options for their shadow, between Small, Medium, Large and Extra Large: + - `SHADOW_SIZE_S` + - `SHADOW_SIZE_M` + - `SHADOW_SIZE_L` + - `SHADOW_SIZE_XL_BATTLE_ONLY` +To make the Pokémon have no shadow, use the `NO_SHADOW` macro instead of `SHADOW`. + +### Tracks +You have 4 options for the tracks that your species will leave behind on sand. + - `TRACKS_NONE` + - `TRACKS_FOOT` ![sand_footprints](https://github.com/user-attachments/assets/8b8c34d6-72e9-4b9d-839d-0a5cc1ae1a4c) + - `TRACKS_SLITHER` ![slither_tracks](https://github.com/user-attachments/assets/28219c05-61e0-48b3-9aeb-43f48e4ffdd4) + - `TRACKS_SPOT` ![spot_tracks](https://github.com/user-attachments/assets/f7a24887-c5ca-47f2-8825-01f3df61deca) + - `TRACKS_BUG` ![bug_tracks](https://github.com/user-attachments/assets/8cd1dea4-4123-4af8-a558-992874a6d589) + + ...though technically you can also use `TRACKS_BIKE_TIRE` if you wish to. + +![bike_tire_tracks](https://github.com/user-attachments/assets/ac81d211-85e5-443a-ac54-c2976f1f0b82) + +### FAQ +#### Q: How do I limit what species can be used as followers? +You may use the following configs in `include/config/overworld.h` +```c +#define OW_FOLLOWERS_ALLOWED_SPECIES (0) +#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) +#define OW_FOLLOWERS_ALLOWED_MET_LOC (0) +``` +Examples: +```c +// Yellow Pikachu: +#define OW_FOLLOWERS_ALLOWED_SPECIES (SPECIES_PIKACHU) +#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) +#define OW_FOLLOWERS_ALLOWED_MET_LOC (MAPSEC_PALLET_TOWN) +// Hoenn Starter: +#define OW_FOLLOWERS_ALLOWED_SPECIES (0) +#define OW_FOLLOWERS_ALLOWED_MET_LVL (5) +#define OW_FOLLOWERS_ALLOWED_MET_LOC (MAPSEC_ROUTE_101) +// Species set in VAR_XXXX: +#define OW_FOLLOWERS_ALLOWED_SPECIES (VAR_XXXX) +#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) +#define OW_FOLLOWERS_ALLOWED_MET_LOC (0) +``` From 76a08abeaad5e21c938774b7662563ceb6303941 Mon Sep 17 00:00:00 2001 From: Hedara Date: Wed, 9 Apr 2025 12:59:03 +0200 Subject: [PATCH 137/145] Updated documentation --- docs/tutorials/how_to_new_pokemon.md | 23 + docs/tutorials/how_to_new_pokemon_1_11_0.md | 1206 ------------------- 2 files changed, 23 insertions(+), 1206 deletions(-) delete mode 100644 docs/tutorials/how_to_new_pokemon_1_11_0.md diff --git a/docs/tutorials/how_to_new_pokemon.md b/docs/tutorials/how_to_new_pokemon.md index b8a99520ec..de2d41d57c 100644 --- a/docs/tutorials/how_to_new_pokemon.md +++ b/docs/tutorials/how_to_new_pokemon.md @@ -1278,3 +1278,26 @@ Gen 4-style shadows are defined by the `SHADOW` macro which takes the following - `SHADOW_SIZE_XL_BATTLE_ONLY` To make the Pokémon have no shadow, use the `NO_SHADOW` macro instead of `SHADOW`. + +## 6. Limiting species allowed as followers +You may use the following configs in `include/config/overworld.h` +```c +#define OW_FOLLOWERS_ALLOWED_SPECIES (0) +#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) +#define OW_FOLLOWERS_ALLOWED_MET_LOC (0) +``` +Examples: +```c +// Yellow Pikachu: +#define OW_FOLLOWERS_ALLOWED_SPECIES (SPECIES_PIKACHU) +#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) +#define OW_FOLLOWERS_ALLOWED_MET_LOC (MAPSEC_PALLET_TOWN) +// Hoenn Starter: +#define OW_FOLLOWERS_ALLOWED_SPECIES (0) +#define OW_FOLLOWERS_ALLOWED_MET_LVL (5) +#define OW_FOLLOWERS_ALLOWED_MET_LOC (MAPSEC_ROUTE_101) +// Species set in VAR_XXXX: +#define OW_FOLLOWERS_ALLOWED_SPECIES (VAR_XXXX) +#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) +#define OW_FOLLOWERS_ALLOWED_MET_LOC (0) +``` diff --git a/docs/tutorials/how_to_new_pokemon_1_11_0.md b/docs/tutorials/how_to_new_pokemon_1_11_0.md deleted file mode 100644 index 18b373f5fa..0000000000 --- a/docs/tutorials/how_to_new_pokemon_1_11_0.md +++ /dev/null @@ -1,1206 +0,0 @@ - -This is a modified version of [the original tutorial about adding new Pokémon species available in Pokeemerald's wiki](https://github.com/pret/pokeemerald/wiki/How-to-add-a-new-Pokémon-species). - -Despite the persistent rumors about an incredibly strong third form of Mew hiding somewhere, it actually wasn't possible to catch it... OR WAS IT? -In this tutorial, we will add a new Pokémon species to the game. - -## IMPORTANT: This tutorial applies to 1.11.x versions. -- [Version 1.10.x](how_to_new_pokemon_1_10_0.md) -- [Version 1.9.x](how_to_new_pokemon_1_9_0.md) -- [Version 1.8.x](how_to_new_pokemon_1_8_0.md) -- [Version 1.7.x](how_to_new_pokemon_1_7_0.md) -- [Version 1.6.x](how_to_new_pokemon_1_6_0.md) - -# Changes compared to vanilla -The main things that the Expansion changes are listed here. -* Still Front Pics *(`gMonStillFrontPic_YourPokemon`)* and by extension `src/anim_mon_front_pics.c` have been removed. -* `src/data/pokemon/cry_ids.h` doesn't exist anymore. -* You have 6 icon palettes available instead of the base 3. -* Most tables that use `SPECIES_x` as indexes have been moved to `gSpeciesInfo`. - -# Content -* [Useful resources](#useful-resources) -* [The Data - Part 1](#the-data---part-1) - * [1. Declare a species constant](#1-Declare-a-species-constant) - * [2. `SpeciesInfo`'s structure](#2-speciesinfos-structure) - * [3. Define its basic species information](#3-define-its-basic-species-information) - * [4. Species Name](#4-species-name) - * [5. Define its cry](#5-define-its-cry) - * [6. Define its Pokédex entry](#6-define-its-pokédex-entry) -* [The Graphics](#the-graphics) - * [1. Edit the sprites](#1-edit-the-sprites) - * [2. Add the sprites to the rom](#2-add-the-sprites-to-the-rom) - * [3. Add the animations to the rom](#3-add-the-animations-to-the-rom) - * [4. Linking graphic information to our Pokémon](#4-linking-graphic-information-to-our-pokémon) -* [The Data - Part 2](#the-data---part-2) - * [1. Species Flags](#1-species-flags) - * [2. Delimit the moveset](#2-delimit-the-moveset) - * [3. Define the Evolutions](#3-define-the-evolutions) - * [4. Make it appear!](#4-make-it-appear) -* [Optional data](#optional-data) - * [1. Form tables](#1-form-tables) - * [2. Form change tables](#2-form-change-tables) - * [3. Gender differences](#3-gender-differences) - * [4. Overworld Data](#4-overworld-data) - -# Useful resources -You can open a sprite debug menu by pressing `Select` in a Pokémon's summary screen outside of battle. - -![mGBA_6WOo1TSlsn](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/0c625cd8-8f89-4bc8-a285-b10a420a8f6d) - - -# The Data - Part 1 - -Our plan is as simple as it is brilliant: clone Mewtwo... and make it even stronger! - -## 1. Declare a species constant - -Our first step towards creating a new digital lifeform is to define its own species constant. - -Edit [include/constants/species.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/species.h): - -```diff - #define SPECIES_NONE 0 - #define SPECIES_BULBASAUR 1 - ... - #define SPECIES_MIMIKYU_BUSTED_TOTEM 1523 - #define SPECIES_MIMIKYU_TOTEM_BUSTED SPECIES_MIMIKYU_BUSTED_TOTEM -+#define SPECIES_MEWTHREE 1524 - --#define SPECIES_EGG (SPECIES_MIMIKYU_BUSTED_TOTEM + 1) -+#define SPECIES_EGG (SPECIES_MEWTHREE + 1) - - #define NUM_SPECIES SPECIES_EGG -``` -This number is stored in a Pokémon's save structure. These should generally never change, otherwise your saved Pokémon species will change as well. - -We add this at the end so that no existing species change Id and so that we don't have to renumber everything after it. - -Now, let's see how it looks in-game! - -![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/dc15b0ba-a4bd-4f4e-9658-2dff73a11f79) - -Hmmm, something's not right... - -Oh, I know! We need to add the rest of the data! Normally, the vanilla game would crash if we try to look up anything about Mewthree in this state, but the expansion defaults all of its data to `SPECIES_NONE`. - -Now, let's see what needs to be done. - -## 2. `SpeciesInfo`'s structure -Now, to better understand Mewthree, we also need to understand Mew. Let's look at its data. -```diff - [SPECIES_MEW] = - { - .baseHP = 100, - .baseAttack = 100, - .baseDefense = 100, - .baseSpeed = 100, - .baseSpAttack = 100, - .baseSpDefense = 100, - .types = MON_TYPES(TYPE_PSYCHIC), - .catchRate = 45, - #if P_UPDATED_EXP_YIELDS >= GEN_8 - .expYield = 300, - #elif P_UPDATED_EXP_YIELDS >= GEN_5 - .expYield = 270, - #else - .expYield = 64, - #endif - .evYield_HP = 3, - .itemCommon = ITEM_LUM_BERRY, - .itemRare = ITEM_LUM_BERRY, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 100, - .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), - .abilities = { ABILITY_SYNCHRONIZE, ABILITY_NONE, ABILITY_NONE }, - .bodyColor = BODY_COLOR_PINK, - .speciesName = _("Mew"), - .cryId = CRY_MEW, - .natDexNum = NATIONAL_DEX_MEW, - .categoryName = _("New Species"), - .height = 4, - .weight = 40, - .description = COMPOUND_STRING( - "A Mew is said to possess the genes of all\n" - "Pokémon. It is capable of making itself\n" - "invisible at will, so it entirely avoids\n" - "notice even if it approaches people."), - .pokemonScale = 457, - .pokemonOffset = -2, - .trainerScale = 256, - .trainerOffset = 0, - .frontPic = gMonFrontPic_Mew, - .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(64, 48), - .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 9, - .frontAnimFrames = sAnims_Mew, - .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONVEX : ANIM_ZIGZAG_SLOW, - .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 11, - .backPic = gMonBackPic_Mew, - .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 64), - .backPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 0, - .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL, - .palette = gMonPalette_Mew, - .shinyPalette = gMonShinyPalette_Mew, - .iconSprite = gMonIcon_Mew, - .iconPalIndex = 0, - SHADOW(0, 13, SHADOW_SIZE_S) - FOOTPRINT(Mew) - OVERWORLD( - sPicTable_Mew, - SIZE_32x32, - SHADOW_SIZE_M, - TRACKS_NONE, - gOverworldPalette_Mew, - gShinyOverworldPalette_Mew - ) - .isMythical = TRUE, - .isFrontierBanned = TRUE, - .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, - .levelUpLearnset = sMewLevelUpLearnset, - .teachableLearnset = sMewTeachableLearnset, - }, -``` - -That's a lot of stuff! But don't worry, we'll go through it step by step throughout the tutorial -(and it's miles better than having this same data through 20+ files like it used to be). - -We'll start by adding the self-explanatory data that's also present in pret's vanilla structure: - -## 3. Define its basic species information -Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/species_info.h): -```diff - const struct SpeciesInfo gSpeciesInfo[] = - { - [SPECIES_NONE] = {0}, - ... - - [SPECIES_EGG] = - { - FRONT_PIC(Egg, 24, 24), - .frontPicYOffset = 20, - .backPic = gMonFrontPic_Egg, - .backPicSize = MON_COORDS_SIZE(24, 24), - .backPicYOffset = 20, - .palette = gMonPalette_Egg, - .shinyPalette = gMonPalette_Egg, - ICON(Egg, 1), - }, - -+ [SPECIES_MEWTHREE] = -+ { -+ .baseHP = 106, -+ .baseAttack = 150, -+ .baseDefense = 70, -+ .baseSpeed = 140, -+ .baseSpAttack = 194, -+ .baseSpDefense = 120, -+ .types = MON_TYPES(TYPE_PSYCHIC), -+ .catchRate = 3, -+ .expYield = 255, -+ .evYield_SpAttack = 3, -+ .genderRatio = MON_GENDERLESS, -+ .eggCycles = 120, -+ .friendship = 0, -+ .growthRate = GROWTH_SLOW, -+ .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), -+ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, -+ .bodyColor = BODY_COLOR_PURPLE, -+ }, - }; -``` - -The `.` is the structure reference operator in C to refer to the member object of the structure SpeciesInfo. - -- `baseHP`, `baseAttack`, `baseDefense`, `baseSpeed`, `baseSpAttack` and `baseSpDefense` are the base stats. They can't go higher than 255. -- `types` is using the macro `MON_TYPES` as a helper function for formatting so that only one type has to be input for species with a single type. - - To add a species with 2 types, use the format `MON_TYPES(TYPE_PSYCHIC, TYPE_NORMAL)`. -- `catchRate` is how likely it is to catch a Pokémon, the lower the value, the harder it is to catch. Legendaries generally have a catch rate of 3, so we put that here. -- `expYield` is the base amount of experience that a Pokémon gives when defeated/caught. In vanilla, this value caps at 255, but we've increased it to a maximum of 65535 accomodate later gen's higher experience yields. (The highest official value is Blissey's with 608, so going beyond this point may cause exponential gains that could break the system 😱) - - If you noticed, Mew's had some `#if`s, `#elif`s and `#endif` around it. This is because its yield has changed over time, and we let you choose which ones you want. This is not relevant to our Mewthree however, so we can just put a single `.expYield = 255,` line here. -- `evYield_HP`, `evYield_Attack`, `evYield_Defense`, `evYield_Speed`, `evYield_SpAttack` and `evYield_SpDefense` are how many EVs does the Pokémon give when they're caught. Each of these fields can have a value of 3 at most. Officially, no Pokémon give out more than 3 EVs total, with them being determined by their evolution stage (eg, Pichu, Pikachu and Raichu give 1, 2 and 3 Speed EVs respectively), and they tend to be associated with its higher stats. Since our Mewthree is a Special Attack monster, we'll be consistent and make it give out 3 Special Attack EVs, but you're always free to assign whatever you feel like :) - - Notice that the other `evYield` fields are not there. In C, numbers in a struct default to 0, so if we don't specify them, they'll be 0 all around! Less lines to worry about :D -- `itemCommon` and `itemRare` are used to determine what items is the Pokémon holding when encountering it in the wild. - - 50% for `itemCommon` and 5% for `itemRare` (boosted to 60%/20% when the first mon in the party has Compound Eyes or Super Luck) - - If they're both set as the same item, the item has a 100% chance of appearing. -- `genderRatio` is a fun one. - - There are 4 ways of handling this - - `PERCENT_FEMALE` is what most Pokémon use, where you define how likely it's gonna be female. It supports decimals, so you can put `PERCENT_FEMALE(12.5)` to have a 1 in 8 chance of your mon to be female. - - `MON_MALE` guarantees that all mon of this species will be male (eg. Tauros) - - `MON_FEMALE` guarantees that all mon of this species will be female (eg. Miltank) - - `MON_GENDERLESS` makes your species genderless, unable to breed with anything but Ditto to produce eggs. Most Legendaries are this, so we'll be chosing this as Mewthree's gender ratio. - - When working with evolution lines and don't want their genders to change after evolving, be sure that their gender ratios match their stages and evolution methods. Azurill is the only case where there's a mismatch, causing 1/3 of all Azurill to change from Female to Male. - - You might be wondering why some species have multiple defines for their genders, like `SPECIES_MEOWSTIC_(FE)MALE`. This is because those species have different stats and data from each other, so they're defined internally as different forms with `MON_MALE` and `MON_FEMALE` as gender ratios. If your species evolves depending on its gender and the evolutions have different stats, be sure to apply the correct evolution method! -- `eggCycles` determines how fast an egg of this species will hatch. Doesn't matter much for evolved species or those that can't lay eggs, but we add the field here just in case. -- `friendship` determines the amount of friendship of the mon when you catch it. Most Pokémon use `STANDARD_FRIENDSHIP`, but this creature of chaos does not want to be your friend, starting with 0. -- `growthRate` determines the amounts of experience required to reach each level. Go [here](https://bulbapedia.bulbagarden.net/wiki/Experience) for more info. - - This should be consistent across evolution lines, otherwise levels could change upon evolution. -- `eggGroups` are used for breed compatibility. Most Legendaries and Mythicals have the `EGG_GROUP_NO_EGGS_DISCOVERED` group, and so does our Mewthree. Go [here](https://bulbapedia.bulbagarden.net/wiki/Egg_Group) for more info. - - This is using the helper macro `MON_EGG_GROUPS`. -- `abilities` determines the potential abilites of our species. Notice how I also set the ability to `ABILITY_INSOMNIA`, so our little monster doesn't even need to sleep anymore. You can find the abilities for example here [include/constants/abilities.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/abilities.h). - - When both slot 1 and 2 are defined as not being `ABILITY_NONE`, their starting ability will be decided on a coin flip using their personality. They can later be changed using an Ability Capsule. - - Certain Pokémon such as Zygarde and Rockruff have different forms to add additional abilities. As such, they cannot be changed using an Ability Capsule (though the Zygarde Cube can change Zygarde's ability by changing them to their corresponding form) - - The 3rd slot is for Hidden Abilities. If defined as `ABILITY_NONE`, it will default to Slot 1 (eg. Metapod doesn't have a Hidden Ability, but Caterpie and Butterfree do). Go [here](https://bulbapedia.bulbagarden.net/wiki/Ability#Hidden_Abilities) and [here](https://bulbapedia.bulbagarden.net/wiki/Ability_Patch) for more info. - - If the array is defined as `{ABILITY_1, ABILITY_2}`, the Hidden Ability is set as `ABILITY_NONE`. -- `bodyColor` is used in the Pokédex as a search filter. -- `noFlip` is used in to prevent front sprites from being flipped horizontally and cause weird issues, like Clawitzer's big claw changing sides. - -That's all the basic fields present in vanilla emerald, so now let's take a look at the new fields added by the expansion. - -## 4. Species Name - -```diff - const struct SpeciesInfo gSpeciesInfo[] = - { - ... - [SPECIES_MEWTHREE] = - { - ... - .bodyColor = BODY_COLOR_PURPLE, -+ .speciesName = _("Mewthree"), - }, - }; -``` -The `_()` underscore function doesn't really exist - it's a convention borrowed from GNU gettext to let `preproc` know this is text to be converted to the custom encoding used by the Gen 3 Pokemon games. - -## 5. Define its cry - -Time for audio! -We first need to convert an existing audio file to the format supported by the expansion. - -Most formats are supported for conversion, but for simplicity's sake, we're gonna use an mp3 file. - -Now, let's copy the file to the `sound/direct_sound_samples/cries` folder. -Once that's done, let's run the following command: -``` -ffmpeg -i sound/direct_sound_samples/cries/mewthree.mp3 -c:a pcm_s8 -ac 1 -ar 13379 sound/direct_sound_samples/cries/mewthree.aif -``` -This will convert your audio file to .aif, which is what's read by the compiler. - -Let's add the cry to the ROM via [sound/direct_sound_data.inc](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/direct_sound_data.inc). - -```diff -.if P_FAMILY_PECHARUNT == TRUE - .align 2 -Cry_Pecharunt:: - .incbin "sound/direct_sound_samples/cries/pecharunt.bin" -.endif @ P_FAMILY_PECHARUNT - -+ .align 2 -+Cry_Mewthree:: -+ .incbin "sound/direct_sound_samples/cries/mewthree.bin" - -``` - -Then we add the cry ID to [include/constants/cries.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/cries.h): - -```diff -enum { - CRY_NONE, - ... -#if P_FAMILY_TERAPAGOS - CRY_TERAPAGOS, -#endif //P_FAMILY_TERAPAGOS -#if P_FAMILY_PECHARUNT - CRY_PECHARUNT, -#endif //P_FAMILY_PECHARUNT -+ CRY_MEWTHREE, - CRY_COUNT, -}; -``` - -And then link it in [sound/cry_tables.inc](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/cry_tables.inc). `cry_reverse` in particular is for reversed cries used by moves such as Growl. The order of these two tables should match the order of the cry IDs, otherwise they'll be shifted. - -```diff - cry Cry_Terapagos - cry Cry_Pecharunt -+ cry Cry_Mewthree -``` -```diff - cry_reverse Cry_Terapagos - cry_reverse Cry_Pecharunt -+ cry_reverse Cry_Mewthree -``` - -Lastly, we add the cry to our species entry -```diff - const struct SpeciesInfo gSpeciesInfo[] = - { - ... - [SPECIES_MEWTHREE] = - { - ... - .speciesName = _("Mewthree"), -+ .cryId = CRY_MEWTHREE, - }, - }; -``` - -And let's see how it sounds in-game: - -https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/4f7667db-4db9-4bfd-a8dd-ece26f09f327 - -Good! Our monster now has a mighty roar! - -You can now delete the mp3 from the cries folder now once you made sure that the cry sounds like how you want it to. - -## 6. Define its Pokédex entry - -First, we will need to add new index constants for its Pokédex entry. The index constants are divided into the Hoenn Pokédex, which contains all Pokémon native to the Hoenn region, and the National Pokédex containing all known Pokémon, which can be received after entering the hall of fame for the first time. - -Edit [include/constants/pokedex.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/pokedex.h): - -```diff -// National Pokedex order -enum { - NATIONAL_DEX_NONE, - // Kanto - NATIONAL_DEX_BULBASAUR, -... - NATIONAL_DEX_PECHARUNT, -+ NATIONAL_DEX_MEWTHREE, -}; -``` - -```diff - #define KANTO_DEX_COUNT NATIONAL_DEX_MEW - #define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI - -#if P_GEN_9_POKEMON == TRUE -- #define NATIONAL_DEX_COUNT NATIONAL_DEX_PECHARUNT -+ #define NATIONAL_DEX_COUNT NATIONAL_DEX_MEWTHREE -``` - -Do keep in mind that if you intend to add your new species to the Hoenn Dex, you'll also want to add a `HOENN_DEX` constant for it and give it a `HOENN_TO_NATIONAL` member, like this: - -```diff -// Hoenn Pokedex order -enum { - HOENN_DEX_NONE, - HOENN_DEX_TREECKO, -... - HOENN_DEX_DEOXYS, -+ HOENN_DEX_MEWTHREE, -}; - -- #define HOENN_DEX_COUNT (HOENN_DEX_DEOXYS + 1) -+ #define HOENN_DEX_COUNT (HOENN_DEX_MEWTHREE + 1) -``` - -Edit [src/pokemon.c](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/pokemon.c): - -```diff - const u16 sHoennToNationalOrder[NUM_SPECIES] = // Assigns Hoenn Dex Pokémon (Using National Dex Index) - { - HOENN_TO_NATIONAL(TREECKO), - ... - HOENN_TO_NATIONAL(DEOXYS), -+ HOENN_TO_NATIONAL(MEWTHREE), - }; -``` - -Now we can add the number and entry to our Mewthree: -```diff - const struct SpeciesInfo gSpeciesInfo[] = - { - ... - [SPECIES_MEWTHREE] = - { - ... - .cryId = CRY_MEWTHREE, -+ .natDexNum = NATIONAL_DEX_MEWTHREE, -+ .categoryName = _("New Species"), -+ .height = 15, -+ .weight = 330, -+ .description = COMPOUND_STRING( -+ "The rumors became true.\n" -+ "This is Mew's final form.\n" -+ "Its power level is over 9000.\n" -+ "Has science gone too far?"), -+ .pokemonScale = 256, -+ .pokemonOffset = 0, -+ .trainerScale = 290, -+ .trainerOffset = 2, - }, - }; -``` -![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3759dd4c-8da5-4b1c-9a50-b9e9d0815e7f) - -The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex. - -`height` and `weight` are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters). - -In Pokémon Emerald, you can sort the Pokédex by name, height or weight. Apparently, the Pokémon order is hardcoded in the game files and not calculated from their data. Therefore we have to include our new Pokémon species at the right places. While the correct position for the alphabetical order is easy to find, it can become quite tedious for height and weight, so we added comments to the listings in order help out were they should fit. - -Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/pokedex_orders.h): - -```diff - const u16 gPokedexOrder_Alphabetical[] = - { - ... - NATIONAL_DEX_MEW, -+ NATIONAL_DEX_MEWTHREE, - NATIONAL_DEX_MEWTWO, - ... - }; - - const u16 gPokedexOrder_Weight[] = - { - ... - // 72.8 lbs / 33.0 kg - //NATIONAL_DEX_MEWTWO_MEGA_Y, - NATIONAL_DEX_ESCAVALIER, - NATIONAL_DEX_FRILLISH, - NATIONAL_DEX_DURANT, - NATIONAL_DEX_CINDERACE, -+ NATIONAL_DEX_MEWTHREE, - //NATIONAL_DEX_PERSIAN_ALOLAN, - NATIONAL_DEX_TOEDSCOOL, - // 73.4 lbs / 33.3 kg - NATIONAL_DEX_DUGTRIO, - ... - }; - - const u16 gPokedexOrder_Height[] = - { - ... - // 4'11" / 1.5m - ... - NATIONAL_DEX_GLIMMORA, - NATIONAL_DEX_WO_CHIEN, - NATIONAL_DEX_IRON_LEAVES, - NATIONAL_DEX_IRON_BOULDER, -+ NATIONAL_DEX_MEWTHREE, - // 5'03" / 1.6m - ... - }; -``` -![mGBA_lUBfmFEKUx](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3a8b8a17-759b-486b-9831-deb2f494bd71) - - -# The Graphics -We will start by copying the following files for *Mew* (not Mewtwo) and rename it to `mewthree`. -```sh -cp -r graphics/pokemon/mew/. graphics/pokemon/mewthree -``` -We aren't copying Mewtwo's folder because he has those pesky Mega Evolutions that will get in the way of what we're doing, so our sample will need to be pure from the source. - -## 1. Edit the sprites -Let's edit the sprites. Start your favourite image editor (I recommend Aseprite or its free alternative, Libresprite) and change `anim_front.png` and `back.png` to meet your expectations. - -__Make sure that you are using the indexed mode and you have limited yourself to 15 colors!__ - -Put the RGB values of your colors into `normal.pal` between the first and the last color and the RGB values for the shiny version into `shiny.pal`. -Edit `footprint.png` using two colors in indexed mode, black and white. -Finally, edit `icon.png`. -**Note**: the icon will use one of 6 predefined palettes instead of `normal.pal`. -Open an icon sprite and load one of the palettes to find out which palette suits your icon sprite best. - -## 2. Add the sprites to the rom -Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. -First, create constants for the file paths. You'll want to add the constants for your species after the constants for the last valid species. - -Edit [src/data/graphics/pokemon.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/pokemon.h): - -```diff -#if P_FAMILY_PECHARUNT - const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.lz"); - const u32 gMonPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/normal.gbapal.lz"); - const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.lz"); - const u32 gMonShinyPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/shiny.gbapal.lz"); - const u8 gMonIcon_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/icon.4bpp"); -#if P_FOOTPRINTS - const u8 gMonFootprint_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/footprint.1bpp"); -#endif //P_FOOTPRINTS -#if OW_POKEMON_OBJECT_EVENTS - const u32 gObjectEventPic_Pecharunt[] = INCBIN_COMP("graphics/pokemon/pecharunt/overworld.4bpp"); -#if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - const u32 gOverworldPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/overworld_normal.gbapal.lz"); - const u32 gShinyOverworldPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/overworld_shiny.gbapal.lz"); -#endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS -#endif //P_FAMILY_PECHARUNT - - const u32 gMonFrontPic_Egg[] = INCBIN_U32("graphics/pokemon/egg/anim_front.4bpp.lz"); - const u32 gMonPalette_Egg[] = INCBIN_U32("graphics/pokemon/egg/normal.gbapal.lz"); - const u8 gMonIcon_Egg[] = INCBIN_U8("graphics/pokemon/egg/icon.4bpp"); - -+ const u32 gMonFrontPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/anim_front.4bpp.lz"); -+ const u32 gMonBackPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/back.4bpp.lz"); -+ const u32 gMonPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/normal.gbapal.lz"); -+ const u32 gMonShinyPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/shiny.gbapal.lz"); -+ const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp"); -+ const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp"); -``` - -Please note that Pecharunt, the Pokémon that should be above your insertion for the time being, reads a `front.png` sprite instead of an `anim_front.png` sprite. This is because currently, Pecharunt lacks a 2nd frame. If the front sprite sheet of your species uses 2 frames, you should use `anim_front`. - -## 3. Add the animations to the rom - -You can define the animation order, in which the sprites will be shown. The first number is the sprite index (so 0 or 1) and the second number is the number of frames the sprite will be visible. - -Edit [src/data/pokemon_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/front_pic_anims.h): - -```diff -#if P_FAMILY_PECHARUNT -PLACEHOLDER_ANIM_SINGLE_FRAME(Pecharunt); -#endif //P_FAMILY_PECHARUNT - -+static const union AnimCmd sAnim_Mewthree_1[] = -+{ -+ ANIMCMD_FRAME(1, 30), -+ ANIMCMD_FRAME(0, 20), -+ ANIMCMD_END, -+}; -``` - -```diff -#if P_FAMILY_PECHARUNT -SINGLE_ANIMATION(Pecharunt); -#endif //P_FAMILY_PECHARUNT -+SINGLE_ANIMATION(Mewthree); -SINGLE_ANIMATION(Egg); -``` - -You might be wondering what `PLACEHOLDER_ANIM_SINGLE_FRAME` is. Well, since Pecharun only has 1 frame, we use what's called a preprocessor *macro* to have in a single line what otherwise would've been this in the C file: -```c -static const union AnimCmd sAnim_Pecharunt_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -} -``` -Instead, we can use the already established macro that does the same thing, replacing the value in parenthesis with what we want (in this case, `Pecharunt`): -```c -#define PLACEHOLDER_ANIM_SINGLE_FRAME(name) \ -static const union AnimCmd sAnim_##name##_1[] = \ -{ \ - ANIMCMD_FRAME(0, 1), \ - ANIMCMD_END, \ -} -``` - -## 4. Linking graphic information to our Pokémon -Now that we have all the external data ready, we just need to add it to `gSpeciesInfo` plus the rest of the animation and graphical data that we want to use: - -```diff - const struct SpeciesInfo gSpeciesInfo[] = - { - ... - [SPECIES_MEWTHREE] = - { - ... - .pokemonScale = 256, - .pokemonOffset = 0, - .trainerScale = 290, - .trainerOffset = 2, -+ .frontPic = gMonFrontPic_Mewthree, -+ .frontPicSize = MON_COORDS_SIZE(64, 64), -+ .frontPicYOffset = 0, -+ .frontAnimFrames = sAnims_Mewthree, -+ .frontAnimId = ANIM_GROW_VIBRATE, -+ .frontAnimDelay = 15, -+ .enemyMonElevation = 6, -+ .backPic = gMonBackPic_Mewthree, -+ .backPicSize = MON_COORDS_SIZE(64, 64), -+ .backPicYOffset = 0, -+ .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL, -+ .palette = gMonPalette_Mewthree, -+ .shinyPalette = gMonShinyPalette_Mewthree, - .iconSprite = gMonIcon_Mewthree, - .iconPalIndex = 2, -+ FOOTPRINT(Mewthree) - }, - }; -``` -Let's explain each of these: -- `frontPic`: - - Used to reference the front sprite, so in this case, we call for `gMonFrontPic_Mewthree`. -- `frontPicSize`: - - The two values (`width` and `height`) are used for defining the non-empty size of the front sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64. -- `frontPicYOffset`: - - Used to define what Y position the sprite sits at. This is used to set where they'd be "grounded". For the shadow, see `enemyMonElevation`. -- `frontAnimFrames`: - - We link our animation frame animations that we defined earlier here. -- `frontAnimId`: - - Because you are limited to two frames, there are already [predefined front sprite animations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/pokemon_animation.h), describing translations, rotations, scalings or color changes. -- `frontAnimDelay`: - - Sets a delay in frame count between when the Pokémon appears and when the animation starts. -- `enemyMonElevation`: - - Used to determine the altitude from the ground. Any value above 0 will show a shadow under the Pokémon, to signify that they're floating. -- `backPic`: - - Used to reference the back sprite, so in this case, we call for `gMonBackPic_Mewthree`. -- `backPicSize`: - - The two values (`width` and `height`) are used for defining the non-empty size of the back sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64. - - **NOTE**: Mew has a tarnary switch here in order to change values depending on if a config option is set for displaying th original Gen 3 sprites. -- `backPicYOffset`: - - Used to define what Y position of the back sprite. When working with the animation debug menu, we recommend aligning the back sprite to the white background, as it was designed to properyly align with the real battle layout. -- `backAnimId`: - - Like `frontAnimId` except for the back sprites and them being a single frame. The IDs listed [here](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/pokemon_animation.h) are used to represent 3 different animations that happen based on the the Pokémon's nature. -- `palette`: - - Used to reference the non-shiny palette, so in this case, we call for `gMonPalette_Mewthree`. -- `shinyPalette`: - - Used to reference the shiny palette, so in this case, we call for `gMonShinyPalette_Mewthree`. -- `iconSprite`: - - Used to reference the icon sprite, so in this case, we call for `gMonIcon_Mewthree`. -- `iconPalIndex`: - - Here, you can choose between the six icon palettes; 0, 1, 2, 3, 4 and 5. All of them located in `graphics/pokemon/icon_palettes`. -- `FOOTPRINT` - - We made this single field into a macro so that they can be ignored when `P_FOOTPRINTS` is set to false. It's also why we don't have an "," after calling it like the other macros (we add it as part of the macro itself). - ```c - #if P_FOOTPRINTS - #define FOOTPRINT(sprite) .footprint = gMonFootprint_## sprite, - #else - #define FOOTPRINT(sprite) - #endif - ``` - -# The Data - Part 2 - -We're almost there just a bit left! - -## 1. Species Flags - -```diff - const struct SpeciesInfo gSpeciesInfo[] = - { - ... - [SPECIES_MEWTHREE] = - { - ... - .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, - .bodyColor = BODY_COLOR_PURPLE, -+ .isLegendary = TRUE, -+ .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, - }, - }; -``` -Each species flag provides properties to the species: -- `isLegendary`: - - Does nothing. -- `isMythical`: - - Is skipped during Pokédex evaluations. - - Unless it also has the `dexForceRequired` flag. - - Cannot obtain Gigantamax factor via `ToggleGigantamaxFactor`. -- `isUltraBeast`: - - Beast Ball's multiplier is set to x5 for this species. - - All other ball multipliers are set to x0.1. -- `isParadox` (previously `isParadoxForm`): - - Makes it so that Booster Energy cannot be knocked off. -- `isTotem`: - - Does nothing. -- `isMegaEvolution`: - - A Mega indicator is added to the battle box indicating that they're Mega Evolved. - - The species doesn't receive affection benefits. - - Required when adding new Mega Evolutions. -- `isPrimalReversion`: - - A Primal Reversion indicator (Alpha or Omega for Kyogre/Groudon respectively) is added to the battle box indicating that they're Primal Reverted. - - Required when adding new Primal Reversions. -- `isUltraBurst`: - - Required when adding new Ultra Burst forms. -- `isGigantamax`: - - Used to determine if Gigantamax forms should have their GMax moves or not. - - Required when adding new Gigantamax forms. -- `isAlolanForm`, `isGalarianForm`, `isHisuianForm`, `isPaldeanForm`: - - In the future, these will be used to determine breeding offspring from different based on their region. -- `cannotBeTraded`: - - This species cannot be traded away (like Black/White Kyurem). -- `perfectIVCount`: - - Guarantees that the number of IVs specified here will be perfect. -- `tmIlliterate`: - - This species will be unable to learn the universal moves. -- `isFrontierBanned`: - - This species will be unable to enter Battle Frontier facilities. Replaces `gFrontierBannedSpecies`. - -## 2. Delimit the moveset - -Let's begin with the moves that can be learned by leveling up. - -Append to [src/data/pokemon/level_up_learnsets/gen_9.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/level_up_learnsets/gen_9.h): -**NOTE**: You can ignore the warning at the top of the file if you're just adding moves to Pokemon. - -```diff -#if P_FAMILY_PECHARUNT -static const struct LevelUpMove sPecharuntLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_SMOG), - LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), - LEVEL_UP_MOVE( 1, MOVE_MEMENTO), - LEVEL_UP_MOVE( 1, MOVE_ASTONISH), - LEVEL_UP_MOVE( 8, MOVE_WITHDRAW), - LEVEL_UP_MOVE(16, MOVE_DESTINY_BOND), - LEVEL_UP_MOVE(24, MOVE_FAKE_TEARS), - LEVEL_UP_MOVE(32, MOVE_PARTING_SHOT), - LEVEL_UP_MOVE(40, MOVE_SHADOW_BALL), - LEVEL_UP_MOVE(48, MOVE_MALIGNANT_CHAIN), - LEVEL_UP_MOVE(56, MOVE_TOXIC), - LEVEL_UP_MOVE(64, MOVE_NASTY_PLOT), - LEVEL_UP_MOVE(72, MOVE_RECOVER), - LEVEL_UP_END -}; -#endif - -+static const struct LevelUpMove sMewthreeLevelUpLearnset[] = { -+ LEVEL_UP_MOVE( 1, MOVE_CONFUSION), -+ LEVEL_UP_MOVE( 1, MOVE_DISABLE), -+ LEVEL_UP_MOVE(11, MOVE_BARRIER), -+ LEVEL_UP_MOVE(22, MOVE_SWIFT), -+ LEVEL_UP_MOVE(33, MOVE_PSYCH_UP), -+ LEVEL_UP_MOVE(44, MOVE_FUTURE_SIGHT), -+ LEVEL_UP_MOVE(55, MOVE_MIST), -+ LEVEL_UP_MOVE(66, MOVE_PSYCHIC), -+ LEVEL_UP_MOVE(77, MOVE_AMNESIA), -+ LEVEL_UP_MOVE(88, MOVE_RECOVER), -+ LEVEL_UP_MOVE(99, MOVE_SAFEGUARD), -+ LEVEL_UP_END -+}; -``` -**NOTE**: If `P_LVL_UP_LEARNSETS` is not set to something equal to `GEN_9`, the file to be edited will change to what's specified. - -Again, we need to register the learnset in `gSpeciesInfo`: - -```diff - const struct SpeciesInfo gSpeciesInfo[] = - { - ... - [SPECIES_MEWTHREE] = - { - ... - .palette = gMonPalette_Mewthree, - .shinyPalette = gMonShinyPalette_Mewthree, - .iconSprite = gMonIcon_Mewthree, - .iconPalIndex = 2, -+ .levelUpLearnset = sMewthreeLevelUpLearnset, - }, - }; -``` - -Next we need to specify which moves can be taught via TM, HM, or Move Tutor. - -Append to [src/data/pokemon/teachable_learnsets.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/teachable_learnsets.h): - -```diff -#if P_FAMILY_PECHARUNT -static const u16 sPecharuntTeachableLearnset[] = { - ... - MOVE_UNAVAILABLE, -}; -#endif //P_FAMILY_PECHARUNT - -+static const u16 sMewthreeTeachableLearnset[] = { -+ MOVE_FOCUS_PUNCH, -+ MOVE_WATER_PULSE, -+ MOVE_CALM_MIND, -+ MOVE_TOXIC, -+ MOVE_HAIL, -+ MOVE_BULK_UP, -+ MOVE_HIDDEN_POWER, -+ MOVE_SUNNY_DAY, -+ MOVE_TAUNT, -+ MOVE_ICE_BEAM, -+ MOVE_BLIZZARD, -+ MOVE_HYPER_BEAM, -+ MOVE_LIGHT_SCREEN, -+ MOVE_PROTECT, -+ MOVE_RAIN_DANCE, -+ MOVE_SAFEGUARD, -+ MOVE_FRUSTRATION, -+ MOVE_SOLAR_BEAM, -+ MOVE_IRON_TAIL, -+ MOVE_THUNDERBOLT, -+ MOVE_THUNDER, -+ MOVE_EARTHQUAKE, -+ MOVE_RETURN, -+ MOVE_PSYCHIC, -+ MOVE_SHADOW_BALL, -+ MOVE_BRICK_BREAK, -+ MOVE_DOUBLE_TEAM, -+ MOVE_REFLECT, -+ MOVE_SHOCK_WAVE, -+ MOVE_FLAMETHROWER, -+ MOVE_SANDSTORM, -+ MOVE_FIRE_BLAST, -+ MOVE_ROCK_TOMB, -+ MOVE_AERIAL_ACE, -+ MOVE_TORMENT, -+ MOVE_FACADE, -+ MOVE_SECRET_POWER, -+ MOVE_REST, -+ MOVE_SKILL_SWAP, -+ MOVE_SNATCH, -+ MOVE_STRENGTH, -+ MOVE_FLASH, -+ MOVE_ROCK_SMASH, -+ MOVE_MEGA_PUNCH, -+ MOVE_MEGA_KICK, -+ MOVE_BODY_SLAM, -+ MOVE_DOUBLE_EDGE, -+ MOVE_COUNTER, -+ MOVE_SEISMIC_TOSS, -+ MOVE_MIMIC, -+ MOVE_METRONOME, -+ MOVE_DREAM_EATER, -+ MOVE_THUNDER_WAVE, -+ MOVE_SUBSTITUTE, -+ MOVE_DYNAMIC_PUNCH, -+ MOVE_PSYCH_UP, -+ MOVE_SNORE, -+ MOVE_ICY_WIND, -+ MOVE_ENDURE, -+ MOVE_MUD_SLAP, -+ MOVE_ICE_PUNCH, -+ MOVE_SWAGGER, -+ MOVE_SLEEP_TALK, -+ MOVE_SWIFT, -+ MOVE_THUNDER_PUNCH, -+ MOVE_FIRE_PUNCH, -+ MOVE_UNAVAILABLE, // This is required to determine where the array ends. -+}; -#endif -``` - -_NOTE: At the top of this file, you will probably see this warning:_ -``` -// -// DO NOT MODIFY THIS FILE! It is auto-generated from tools/learnset_helpers/teachable.py` -// -``` -The expansion includes a tool called the learnset helper, which aims to automate the generation of valid teachable moves. At the time of writing, this tool only supports generating TM and Tutor learnsets. However, in the future it may be expanded to deal with level up learnsets and egg moves. - -Ignore the warning shown above the first time you're adding your teachable moves (as otherwise the compiler will complain about the array not existing), but in the future (if you're using the learnset helper) simply edit what teachable moves your Pokémon can learn in one of the JSON files found in `tools/learnset_helpers/porymoves_files`. It doesn't really matter which one you add your new Pokémon to, as the tool pulls from all of the files in this folder. - -The learnset helper is useful if you plan on changing and/or increasing the available TMs and Tutor moves in your game. As an example, Bulbasaur learns Rage by TM in Red/Blue/Yellow, but in Emerald this TM does not exist. But since `tools/learnset_helpers/porymoves_files/rby.json` defines "MOVE_RAGE" as a TM move for Bulbasaur, that move would automatically be added to the `sBulbasaurTeachableLearnset` array if you were to add a Rage TM at any point. - -The learnset helper can be toggled on/off in `include/config/pokemon.h`: -``` -// Learnset helper toggles -#define P_LEARNSET_HELPER_TEACHABLE TRUE // If TRUE, teachable_learnsets.h will be populated by tools/learnset_helpers/teachable.py using the included JSON files based on available TMs and tutors. -``` - -Once more, we need to register the learnset in `gSpeciesInfo`: - -```diff - const struct SpeciesInfo gSpeciesInfo[] = - { - ... - [SPECIES_MEWTHREE] = - { - ... - FOOTPRINT(Mewthree) - .levelUpLearnset = sMewthreeLevelUpLearnset, -+ .teachableLearnset = sMewthreeTeachableLearnset, - }, - }; -``` - -If you want to create a Pokémon which can breed, you will need to edit [src/data/pokemon/egg_moves.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/egg_moves.h). - - -## 3. Define the Evolutions - -We want Mewthree to evolve from Mewtwo by reaching level 100. - -Edit `gSpeciesInfo`: - -```diff - const struct SpeciesInfo gSpeciesInfo[] = - { - ... - [SPECIES_MEWTWO] = - { - ... - FOOTPRINT(Mewtwo) - .isLegendary = TRUE, - .levelUpLearnset = sMewtwoLevelUpLearnset, - .teachableLearnset = sMewtwoTeachableLearnset, - .formSpeciesIdTable = sMewtwoFormSpeciesIdTable, - .formChangeTable = sMewtwoFormChangeTable, -+ .evolutions = EVOLUTION({EVO_LEVEL, 100, SPECIES_MEWTHREE}), - }, - }; -``` - -## 4. Make it appear! -Now Mewthree really does slumber in the games code - but we won't know until we make him appear somewhere! The legend tells that Mewthree is hiding somewhere in Petalburg Woods... - -Edit [src/data/wild_encounters.json](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/wild_encounters.json): - -```diff - { - "map": "MAP_PETALBURG_WOODS", - "base_label": "gPetalburgWoods", - "land_mons": { - "encounter_rate": 20, - "mons": [ - { - "min_level": 5, - "max_level": 5, - "species": "SPECIES_POOCHYENA" - }, - { - "min_level": 5, - "max_level": 5, - "species": "SPECIES_WURMPLE" - }, - { - "min_level": 5, - "max_level": 5, - "species": "SPECIES_SHROOMISH" - }, - { -- "min_level": 6, -- "max_level": 6, -- "species": "SPECIES_POOCHYENA" -+ "min_level": 5, -+ "max_level": 5, -+ "species": "SPECIES_MEWTHREE" - }, - ... - } -``` - -Congratulations, you have created your own personal pocket monster! You may call yourself a mad scientist now. - -# Optional data - -Now that you now have all the essential pieces to create a base species, there are some aspects that you might want to know if you want to do other stuff with your custom Pokémon. - -## 1. Form tables -Found in `src/data/pokemon/form_species_tables.h`. - -These are introduced to have a reference of what forms correspond to what Species of Pokémon. For example, we have Pikachu's table: -```c -#if P_FAMILY_PIKACHU -static const u16 sPikachuFormSpeciesIdTable[] = { - SPECIES_PIKACHU, - SPECIES_PIKACHU_COSPLAY, - SPECIES_PIKACHU_ROCK_STAR, - SPECIES_PIKACHU_BELLE, - SPECIES_PIKACHU_POP_STAR, - SPECIES_PIKACHU_PH_D, - SPECIES_PIKACHU_LIBRE, - SPECIES_PIKACHU_ORIGINAL_CAP, - SPECIES_PIKACHU_HOENN_CAP, - SPECIES_PIKACHU_SINNOH_CAP, - SPECIES_PIKACHU_UNOVA_CAP, - SPECIES_PIKACHU_KALOS_CAP, - SPECIES_PIKACHU_ALOLA_CAP, - SPECIES_PIKACHU_PARTNER_CAP, - SPECIES_PIKACHU_WORLD_CAP, - FORM_SPECIES_END, -}; -#endif //P_FAMILY_PIKACHU -``` -We register the table each form entry in `gSpeciesInfo`. - -```diff - [SPECIES_PIKACHU] = - { - ... - .teachableLearnset = sPikachuTeachableLearnset, -+ .formSpeciesIdTable = sPikachuFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU}, - {EVO_NONE, 0, SPECIES_RAICHU_ALOLAN}), - }, - - [SPECIES_PIKACHU_COSPLAY] = - { - ... - .teachableLearnset = sPikachuTeachableLearnset, -+ .formSpeciesIdTable = sPikachuFormSpeciesIdTable, - }, -``` -...and so on. - -What this allows us to do is to be able to get all forms of a Pokémon in our code by using the `GetSpeciesFormTable` function. - -For example, in the HGSS dex, it lets us browse between the entries of every form available.: - -![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/a1a90b79-46a1-4cd6-97d6-ec5d741bfdc8) ![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/7cffc6be-0b5c-4074-b689-736a97297843) - -In addition, we have the `GET_BASE_SPECIES_ID` macro, which returns the first entry of the table (or return the species itself if it doesn't have a table registered). With this, you can check if a Pokémon is any form of a species. For example, making it so that the Light Ball affects all Pikachu forms: -```c - case HOLD_EFFECT_LIGHT_BALL: - if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_PIKACHU && IS_MOVE_SPECIAL(move)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); - break; -``` - -## 2. Form change tables -Found in `src/data/pokemon/form_species_tables.h`. - -These tables, unlike the regular form tables, registers how Pokémon can switch between forms. - -```c -#if P_FAMILY_GASTLY -static const struct FormChange sGengarFormChangeTable[] = { - {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GENGAR_MEGA, ITEM_GENGARITE}, - {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GENGAR_GIGANTAMAX}, - {FORM_CHANGE_TERMINATOR}, -}; -#endif //P_FAMILY_GASTLY -``` -The first value is the type of form change. In the case of Gengar, we have both Mega Evolution and Gigantamax form changes. - -The second value is the target form, to which the Pokémon will change into. - -Values after that are referred as arguments, and needs to be put there depends on the type of form change, detailed in `include/constants/form_change_types.h`. - -## 3. Gender differences -![mGBA_Wq5cbDkNZG](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/45256192-b451-4baa-af06-f57ca16e1e46) - -You may have seen that there's a couple of duplicate fields with a "Female" suffix. -```diff - [SPECIES_FRILLISH] = - { - ... - .frontPic = gMonFrontPic_Frillish, -+ .frontPicFemale = gMonFrontPic_FrillishF, - .frontPicSize = MON_COORDS_SIZE(56, 56), -+ .frontPicSizeFemale = MON_COORDS_SIZE(56, 56), - .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Frillish, - .frontAnimId = ANIM_RISING_WOBBLE, - .backPic = gMonBackPic_Frillish, -+ .backPicFemale = gMonBackPic_FrillishF, - .backPicSize = MON_COORDS_SIZE(40, 56), -+ .backPicSizeFemale = MON_COORDS_SIZE(40, 56), - .backPicYOffset = 7, - .backAnimId = BACK_ANIM_CONVEX_DOUBLE_ARC, - .palette = gMonPalette_Frillish, -+ .paletteFemale = gMonPalette_FrillishF, - .shinyPalette = gMonShinyPalette_Frillish, -+ .shinyPaletteFemale = gMonShinyPalette_FrillishF, - .iconSprite = gMonIcon_Frillish, -+ .iconSpriteFemale = gMonIcon_FrillishF, - .iconPalIndex = 0, -+ .iconPalIndexFemale = 1, - FOOTPRINT(Frillish) - .levelUpLearnset = sFrillishLevelUpLearnset, - .teachableLearnset = sFrillishTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_JELLICENT}), - }, -``` -These are used to change the graphics of the Pokémon if they're female. If they're not registered, they default to the male values. - -However, `iconPalIndexFemale` is a special case, where it's *doesn't* read the male icon palette if its `iconSpriteFemale` is set, so if you're setting a female icon, be sure to set their palette index as well. - -## 4. Overworld Data -![mGBA_4iqvhhSltK](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/e59238dc-9779-4f26-a9e7-159a32caa3d9) - -If you have `OW_POKEMON_OBJECT_EVENTS` in your hack, you can add Overworld of your new species by following these steps: - -First, since you copied the contents from Mew's folder previously, you should also have copied its overworld sprites. Edit those to your liking, as we have done before, making sure to update the palettes - -Secondly, in [src/data/graphics/pokemon.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/pokemon.h), add the following: - -```diff - const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp"); - const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp"); -+ const u32 gObjectEventPic_Mewthree[] = INCBIN_COMP("graphics/pokemon/mewthree/overworld.4bpp"); -+ const u32 gOverworldPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/overworld_normal.gbapal.lz"); -+ const u32 gShinyOverworldPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/overworld_shiny.gbapal.lz"); -``` - -Thirdly, in [spritesheet_rules.mk](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/spritesheet_rules.mk) - -```diff -$(POKEMONGFXDIR)/mewtwo/overworld.4bpp: %.4bpp: %.png - $(GFX) $< $@ -mwidth 4 -mheight 4 - -+$(POKEMONGFXDIR)/mewthree/overworld.4bpp: %.4bpp: %.png -+ $(GFX) $< $@ -mwidth 4 -mheight 4 - -$(POKEMONGFXDIR)/mew/overworld.4bpp: %.4bpp: %.png - $(GFX) $< $@ -mwidth 4 -mheight 4 -``` - -Fourthly, in [src/data/object_events/object_event_pic_tables_followers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/object_events/object_event_pic_tables_followers.h): -```diff -#if P_FAMILY_PECHARUNT -/*static const struct SpriteFrameImage sPicTable_Pecharunt[] = { - overworld_ascending_frames(gObjectEventPic_Pecharunt, 4, 4), -};*/ -#endif //P_FAMILY_PECHARUNT - -+static const struct SpriteFrameImage sPicTable_Mewthree[] = { -+ overworld_ascending_frames(gObjectEventPic_Mewthree, 4, 4), -+}; -``` - -And finally, in `gSpeciesInfo`: - -```diff - const struct SpeciesInfo gSpeciesInfo[] = - { - ... - [SPECIES_MEWTHREE] = - { - ... - FOOTPRINT(Mewthree) -+ OVERWORLD( -+ sPicTable_Mewthree, -+ SIZE_32x32, -+ SHADOW_SIZE_M, -+ TRACKS_FOOT, -+ gOverworldPalette_Mewthree, -+ gShinyOverworldPalette_Mewthree -+ ) - .levelUpLearnset = sMewthreeLevelUpLearnset, - .teachableLearnset = sMewthreeTeachableLearnset, - }, - }; -``` - -### Sprite Size -Depending on your species, you might want to use different sizes for it. For example, certain species known for being big like Steelix use sprites that fit a 64x64 frame instead of 32x32, and as such have `SIZE_64x64` in their data instead of `SIZE_32x32` to accomodate for them. - -Also, in `spritesheet_rules.mk`, `-mwidth` and `-mheight` need to be set to 8 instead of 4 for such cases. - -### Shadows -Gen 4 style shadows are defined by the `SHADOW` macro which takes the following arguments: - - X offset - - Y offset - - Shadow size -You have 4 options for their shadow, between Small, Medium, Large and Extra Large: - - `SHADOW_SIZE_S` - - `SHADOW_SIZE_M` - - `SHADOW_SIZE_L` - - `SHADOW_SIZE_XL_BATTLE_ONLY` -To make the Pokémon have no shadow, use the `NO_SHADOW` macro instead of `SHADOW`. - -### Tracks -You have 4 options for the tracks that your species will leave behind on sand. - - `TRACKS_NONE` - - `TRACKS_FOOT` ![sand_footprints](https://github.com/user-attachments/assets/8b8c34d6-72e9-4b9d-839d-0a5cc1ae1a4c) - - `TRACKS_SLITHER` ![slither_tracks](https://github.com/user-attachments/assets/28219c05-61e0-48b3-9aeb-43f48e4ffdd4) - - `TRACKS_SPOT` ![spot_tracks](https://github.com/user-attachments/assets/f7a24887-c5ca-47f2-8825-01f3df61deca) - - `TRACKS_BUG` ![bug_tracks](https://github.com/user-attachments/assets/8cd1dea4-4123-4af8-a558-992874a6d589) - - ...though technically you can also use `TRACKS_BIKE_TIRE` if you wish to. - -![bike_tire_tracks](https://github.com/user-attachments/assets/ac81d211-85e5-443a-ac54-c2976f1f0b82) - -### FAQ -#### Q: How do I limit what species can be used as followers? -You may use the following configs in `include/config/overworld.h` -```c -#define OW_FOLLOWERS_ALLOWED_SPECIES (0) -#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) -#define OW_FOLLOWERS_ALLOWED_MET_LOC (0) -``` -Examples: -```c -// Yellow Pikachu: -#define OW_FOLLOWERS_ALLOWED_SPECIES (SPECIES_PIKACHU) -#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) -#define OW_FOLLOWERS_ALLOWED_MET_LOC (MAPSEC_PALLET_TOWN) -// Hoenn Starter: -#define OW_FOLLOWERS_ALLOWED_SPECIES (0) -#define OW_FOLLOWERS_ALLOWED_MET_LVL (5) -#define OW_FOLLOWERS_ALLOWED_MET_LOC (MAPSEC_ROUTE_101) -// Species set in VAR_XXXX: -#define OW_FOLLOWERS_ALLOWED_SPECIES (VAR_XXXX) -#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) -#define OW_FOLLOWERS_ALLOWED_MET_LOC (0) -``` From b075163c57180fd76c6eb64c7f679c849768e67f Mon Sep 17 00:00:00 2001 From: Hedara Date: Thu, 10 Apr 2025 21:17:20 +0200 Subject: [PATCH 138/145] Cleanup and config options --- include/config/overworld.h | 10 +++-- include/field_effect_helpers.h | 2 +- include/global.fieldmap.h | 3 +- .../object_event_graphics_info.h | 28 ++++++------- src/event_object_movement.c | 41 ++++++++++--------- src/field_effect_helpers.c | 8 +++- src/overworld.c | 10 ++++- 7 files changed, 61 insertions(+), 41 deletions(-) diff --git a/include/config/overworld.h b/include/config/overworld.h index a7f76241f0..47838dfbd1 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -65,7 +65,7 @@ #define OW_FOLLOWERS_SCRIPT_MOVEMENT TRUE // If TRUE, follower Pokémon only go back to their Poké Ball if a non-player collides with them by setting the FLAG_SAFE_FOLLOWER_MOVEMENT flag by default. // Follower Pokémon Restrictions // If set, the only pokemon allowed to follow you will be those matching species, met location, and/or met level; These accept vars, too: VAR_TEMP_1, etc -// For examples, check docs/dns.md: +// For examples, see "docs/tutorials/how_to_new_pokemon.md" #define OW_FOLLOWERS_ALLOWED_SPECIES (0) #define OW_FOLLOWERS_ALLOWED_MET_LVL (0) #define OW_FOLLOWERS_ALLOWED_MET_LOC (0) @@ -94,8 +94,12 @@ #define OW_TIME_OF_DAY_FALLBACK OW_TIME_OF_DAY_DEFAULT // The time of day that encounter tables fall back to. Defaults to whatever OW_TIME_OF_DAY_FALLBACK is set to. // Lighting -#define OW_SHADOW_INTENSITY 4 // Ranges from 0 to 16, where 0 is fully transparent and 16 is black. -#define OW_OBJECT_SUBPRIORITY 148 // The higher the value, the farther back compared to other sprites. Shadows should be behind object events. +#define OW_SHADOW_INTENSITY 4 // Ranges from 0 to 16, where 0 is fully transparent and 16 is black. +#define OW_OBJECT_SUBPRIORITY 148 // The higher the value, the farther back compared to other sprites. Shadows should be behind object events. +#define OW_ENABLE_DNS TRUE // If set to TRUE, overworld will be tinted depending on time of day + +// Object Event Shadows +#define OW_OBJECT_VANILLA_SHADOWS FALSE // In vanilla shadows in the overworld is only shown when jumping // Overworld flags // To use the following features in scripting, replace the 0s with the flag ID you're assigning it to. diff --git a/include/field_effect_helpers.h b/include/field_effect_helpers.h index 22dcb119a4..890e5ca3ac 100644 --- a/include/field_effect_helpers.h +++ b/include/field_effect_helpers.h @@ -21,7 +21,7 @@ bool8 UpdateRevealDisguise(struct ObjectEvent *); void StartRevealDisguise(struct ObjectEvent *); void StartAshFieldEffect(s16, s16, u16, s16); void SetUpReflection(struct ObjectEvent *, struct Sprite *, u8); -void SetUpShadow(struct ObjectEvent *, struct Sprite *); +void SetUpShadow(struct ObjectEvent *); u32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent *); u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y); void UpdateRayquazaSpotlightEffect(struct Sprite *); diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index da10098bbf..ca59e3e3ea 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -198,7 +198,8 @@ struct ObjectEvent u32 fixedPriority:1; u32 hideReflection:1; u32 shiny:1; // OW mon shininess - u32 padding:3; + u32 jumpDone:1; + u32 padding:2; /*0x04*/ u16 graphicsId; // 12 bits for species; high 4 bits for form /*0x06*/ u8 movementType; /*0x07*/ u8 trainerType; diff --git a/src/data/object_events/object_event_graphics_info.h b/src/data/object_events/object_event_graphics_info.h index 37fe3edaff..91b3ab2c9d 100755 --- a/src/data/object_events/object_event_graphics_info.h +++ b/src/data/object_events/object_event_graphics_info.h @@ -4673,20 +4673,20 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Follower = { }; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BallLight = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_LIGHT, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_LIGHT_2, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_NONE, - .inanimate = TRUE, - .compressed = FALSE, - .tracks = TRACKS_NONE, + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_LIGHT, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_LIGHT_2, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_NONE, + .inanimate = TRUE, + .compressed = FALSE, + .tracks = TRACKS_NONE, .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Inanimate, - .images = gFieldEffectObjectPicTable_BallLight, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Inanimate, + .images = gFieldEffectObjectPicTable_BallLight, .affineAnims = gDummySpriteAffineAnimTable, }; diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 0be68f0426..2bc70ea0e9 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -5718,7 +5718,7 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri direction = gObjectEvents[gPlayerAvatar.objectEventId].movementDirection; objectEvent->facingDirectionLocked = TRUE; } - + MoveCoords(direction, &x, &y); GetCollisionAtCoords(objectEvent, x, y, direction); // Sets directionOverwrite for stairs if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE) @@ -7226,6 +7226,8 @@ static void InitJump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 static void InitJumpRegular(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 distance, u8 type) { + if (OW_OBJECT_VANILLA_SHADOWS) + SetUpShadow(objectEvent); // For follower only, match the anim duration of the player's movement, whether dashing, walking or jumping if (objectEvent->localId == OBJ_EVENT_ID_FOLLOWER && type == JUMP_TYPE_HIGH @@ -7264,6 +7266,10 @@ static u8 UpdateJumpAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, objectEvent->triggerGroundEffectsOnStop = TRUE; objectEvent->landingJump = TRUE; sprite->animPaused = TRUE; + if (OW_OBJECT_VANILLA_SHADOWS) + // Somewhat ugly workaround, the shadow is disabled in UpdateShadowFieldEffect, + // but due to code changes from DNS, it needs new signaling + objectEvent->jumpDone = TRUE; } return result; } @@ -8257,7 +8263,7 @@ bool8 MovementAction_JumpDown_Step1(struct ObjectEvent *objectEvent, struct Spri { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->noShadow = 0; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -8274,7 +8280,7 @@ bool8 MovementAction_JumpUp_Step1(struct ObjectEvent *objectEvent, struct Sprite { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->noShadow = 0; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -8291,7 +8297,7 @@ bool8 MovementAction_JumpLeft_Step1(struct ObjectEvent *objectEvent, struct Spri { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->noShadow = 0; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -8308,7 +8314,7 @@ bool8 MovementAction_JumpRight_Step1(struct ObjectEvent *objectEvent, struct Spr { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->noShadow = 0; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -8325,7 +8331,7 @@ bool8 MovementAction_JumpInPlaceDown_Step1(struct ObjectEvent *objectEvent, stru { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->noShadow = 0; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -8342,7 +8348,7 @@ bool8 MovementAction_JumpInPlaceUp_Step1(struct ObjectEvent *objectEvent, struct { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->noShadow = 0; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -8359,7 +8365,7 @@ bool8 MovementAction_JumpInPlaceLeft_Step1(struct ObjectEvent *objectEvent, stru { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->noShadow = 0; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -8376,7 +8382,7 @@ bool8 MovementAction_JumpInPlaceRight_Step1(struct ObjectEvent *objectEvent, str { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->noShadow = 0; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -8393,7 +8399,7 @@ bool8 MovementAction_JumpInPlaceDownUp_Step1(struct ObjectEvent *objectEvent, st { if (DoJumpInPlaceAnim(objectEvent, sprite)) { - objectEvent->noShadow = 0; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -8410,7 +8416,7 @@ bool8 MovementAction_JumpInPlaceUpDown_Step1(struct ObjectEvent *objectEvent, st { if (DoJumpInPlaceAnim(objectEvent, sprite)) { - objectEvent->noShadow = 0; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -8427,7 +8433,7 @@ bool8 MovementAction_JumpInPlaceLeftRight_Step1(struct ObjectEvent *objectEvent, { if (DoJumpInPlaceAnim(objectEvent, sprite)) { - objectEvent->noShadow = 0; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -8444,7 +8450,7 @@ bool8 MovementAction_JumpInPlaceRightLeft_Step1(struct ObjectEvent *objectEvent, { if (DoJumpInPlaceAnim(objectEvent, sprite)) { - objectEvent->noShadow = 0; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -10199,11 +10205,6 @@ static void (*const sGroundEffectFuncs[])(struct ObjectEvent *objEvent, struct S GroundEffect_Seaweed // GROUND_EFFECT_FLAG_SEAWEED }; -static void GroundEffect_Shadow(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - SetUpShadow(objEvent, sprite); -} - static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *sprite, u32 flags) { u32 i; @@ -10213,8 +10214,8 @@ static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite * for (i = 0; i < ARRAY_COUNT(sGroundEffectFuncs); i++, flags >>= 1) if (flags & 1) sGroundEffectFuncs[i](objEvent, sprite); - if (!(gWeatherPtr->noShadows || objEvent->inHotSprings || objEvent->inSandPile || MetatileBehavior_IsPuddle(objEvent->currentMetatileBehavior))) - GroundEffect_Shadow(objEvent, sprite); + if (!OW_OBJECT_VANILLA_SHADOWS && !(gWeatherPtr->noShadows || objEvent->inHotSprings || objEvent->inSandPile || MetatileBehavior_IsPuddle(objEvent->currentMetatileBehavior))) + SetUpShadow(objEvent); } void filters_out_some_ground_effects(struct ObjectEvent *objEvent, u32 *flags) diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 176bfdaf48..40114eb0a7 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -54,7 +54,7 @@ u32 FldEff_Shadow(void); #define sReflectionVerticalOffset data[2] #define sIsStillReflection data[7] -void SetUpShadow(struct ObjectEvent *objectEvent, struct Sprite *sprite) +void SetUpShadow(struct ObjectEvent *objectEvent) { gFieldEffectArguments[0] = objectEvent->localId; gFieldEffectArguments[1] = objectEvent->mapNum; @@ -390,6 +390,12 @@ void UpdateShadowFieldEffect(struct Sprite *sprite) sprite->y = linkedSprite->y + sprite->sYOffset; #endif sprite->invisible = linkedSprite->invisible; + if (objectEvent->jumpDone) + { + // Ugly signaling to disable shadows after a jump + objectEvent->noShadow = TRUE; + objectEvent->jumpDone = FALSE; + } if (!objectEvent->active || objectEvent->noShadow || objectEvent->inHotSprings diff --git a/src/overworld.c b/src/overworld.c index d665917cc8..55a5f643a8 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1560,6 +1560,8 @@ const struct BlendSettings gTimeOfDayBlend[] = void UpdateTimeOfDay(void) { + if (!OW_ENABLE_DNS) + return; s32 hours, minutes; RtcCalcLocalTime(); hours = sHoursOverride ? sHoursOverride : gLocalTime.hours; @@ -1627,6 +1629,8 @@ bool8 MapHasNaturalLight(u8 mapType) // Update & mix day / night bg palettes (into unfaded) void UpdateAltBgPalettes(u16 palettes) { + if (!OW_ENABLE_DNS) + return; const struct Tileset *primary = gMapHeader.mapLayout->primaryTileset; const struct Tileset *secondary = gMapHeader.mapLayout->secondaryTileset; u32 i = 1; @@ -1654,6 +1658,8 @@ void UpdateAltBgPalettes(u16 palettes) void UpdatePalettesWithTime(u32 palettes) { + if (!OW_ENABLE_DNS) + return; if (MapHasNaturalLight(gMapHeader.mapType)) { u32 i; @@ -1674,6 +1680,8 @@ void UpdatePalettesWithTime(u32 palettes) u8 UpdateSpritePaletteWithTime(u8 paletteNum) { + if (!OW_ENABLE_DNS) + return paletteNum; if (MapHasNaturalLight(gMapHeader.mapType)) { if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(paletteNum))) @@ -3449,7 +3457,7 @@ static void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion) sprite->data[0] = linkPlayerId; objEvent->triggerGroundEffectsOnMove = FALSE; objEvent->localId = OBJ_EVENT_ID_DYNAMIC_BASE + linkPlayerId; - SetUpShadow(objEvent, sprite); + SetUpShadow(objEvent); } } From d78afca94f5949dce3ccfd1a9b0585a03262291c Mon Sep 17 00:00:00 2001 From: Hedara Date: Thu, 10 Apr 2025 22:41:38 +0200 Subject: [PATCH 139/145] More shadow options and documentation --- docs/tutorials/dns.md | 9 +++++++++ include/overworld.h | 3 ++- src/event_object_movement.c | 4 +++- src/overworld.c | 13 ++++++++++++- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/docs/tutorials/dns.md b/docs/tutorials/dns.md index d2fb8ca273..71e1d6d6ac 100644 --- a/docs/tutorials/dns.md +++ b/docs/tutorials/dns.md @@ -1,5 +1,8 @@ ## Day/Night system FAQ +### Q: How do I disable DNS? +A: Set `OW_ENABLE_DNS` to `FALSE` in `include/config/overworld.h`. + ### Q: How do I mark certain colors in a palette as light-blended? A: Create a `.pla` file in the same folder as the `.pal` with the same name. @@ -14,3 +17,9 @@ on separate lines to mark those colors as being light-blended, i.e: 9 10 ``` + +### Q: How do I return to using regular shadows? +A: Set `OW_OBJECT_VANILLA_SHADOWS` to `TRUE` in `include/config/overworld.h`. + +### Q: How do I disable shadows for certain locations? +A: Shadows can be disabled for certain locations by modifying the `CurrentMapHasShadows` function in `src/overworld.c` diff --git a/include/overworld.h b/include/overworld.h index d9de4cac58..4408fd5a9d 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -141,7 +141,8 @@ bool32 IsOverworldLinkActive(void); void CB1_Overworld(void); void CB2_OverworldBasic(void); void UpdateTimeOfDay(void); -bool8 MapHasNaturalLight(u8 mapType); +bool32 MapHasNaturalLight(u8 mapType); +bool32 CurrentMapHasShadows(void); void UpdateAltBgPalettes(u16 palettes); void UpdatePalettesWithTime(u32); void CB2_Overworld(void); diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 2bc70ea0e9..d7774884fa 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -10214,8 +10214,10 @@ static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite * for (i = 0; i < ARRAY_COUNT(sGroundEffectFuncs); i++, flags >>= 1) if (flags & 1) sGroundEffectFuncs[i](objEvent, sprite); - if (!OW_OBJECT_VANILLA_SHADOWS && !(gWeatherPtr->noShadows || objEvent->inHotSprings || objEvent->inSandPile || MetatileBehavior_IsPuddle(objEvent->currentMetatileBehavior))) + if (!OW_OBJECT_VANILLA_SHADOWS && CurrentMapHasShadows() && !(gWeatherPtr->noShadows || objEvent->inHotSprings || objEvent->inSandPile || MetatileBehavior_IsPuddle(objEvent->currentMetatileBehavior))) + { SetUpShadow(objEvent); + } } void filters_out_some_ground_effects(struct ObjectEvent *objEvent, u32 *flags) diff --git a/src/overworld.c b/src/overworld.c index 55a5f643a8..646e5cbbba 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1614,10 +1614,12 @@ void UpdateTimeOfDay(void) } } +#undef MORNING_HOUR_MIDDLE #undef TIME_BLEND_WEIGHT +#undef DEFAULT_WEIGHT // Whether a map type is naturally lit/outside -bool8 MapHasNaturalLight(u8 mapType) +bool32 MapHasNaturalLight(u8 mapType) { return (mapType == MAP_TYPE_TOWN || mapType == MAP_TYPE_CITY @@ -1626,6 +1628,15 @@ bool8 MapHasNaturalLight(u8 mapType) ); } +bool32 CurrentMapHasShadows(void) +{ + bool32 shouldHaveShadows = TRUE; + u32 currentMapType = gMapHeader.mapType; + if (currentMapType == MAP_TYPE_UNDERGROUND) + shouldHaveShadows = FALSE; + return shouldHaveShadows; +} + // Update & mix day / night bg palettes (into unfaded) void UpdateAltBgPalettes(u16 palettes) { From 301ef288f5af0b7a1984ff8e41d16c29b944b1b0 Mon Sep 17 00:00:00 2001 From: Hedara Date: Fri, 11 Apr 2025 11:37:36 +0200 Subject: [PATCH 140/145] Review comments --- docs/tutorials/dns.md | 2 +- docs/tutorials/how_to_new_pokemon.md | 23 ---- include/config/overworld.h | 4 +- include/constants/field_weather.h | 2 +- include/field_weather.h | 4 +- include/gba/io_reg.h | 2 +- include/global.fieldmap.h | 2 +- src/data/field_effects/field_effect_objects.h | 10 +- .../object_events/object_event_graphics.h | 1 - src/field_weather.c | 17 +-- src/fieldmap.c | 3 +- src/overworld.c | 36 +++--- src/palette.c | 109 +++++++++--------- src/palette_util.c | 2 +- src/scrcmd.c | 6 +- 15 files changed, 89 insertions(+), 134 deletions(-) diff --git a/docs/tutorials/dns.md b/docs/tutorials/dns.md index 71e1d6d6ac..41d306c500 100644 --- a/docs/tutorials/dns.md +++ b/docs/tutorials/dns.md @@ -22,4 +22,4 @@ on separate lines to mark those colors as being light-blended, i.e: A: Set `OW_OBJECT_VANILLA_SHADOWS` to `TRUE` in `include/config/overworld.h`. ### Q: How do I disable shadows for certain locations? -A: Shadows can be disabled for certain locations by modifying the `CurrentMapHasShadows` function in `src/overworld.c` +A: Shadows can be disabled for certain locations by modifying the `CurrentMapHasShadows` function in `src/overworld.c`. diff --git a/docs/tutorials/how_to_new_pokemon.md b/docs/tutorials/how_to_new_pokemon.md index de2d41d57c..b8a99520ec 100644 --- a/docs/tutorials/how_to_new_pokemon.md +++ b/docs/tutorials/how_to_new_pokemon.md @@ -1278,26 +1278,3 @@ Gen 4-style shadows are defined by the `SHADOW` macro which takes the following - `SHADOW_SIZE_XL_BATTLE_ONLY` To make the Pokémon have no shadow, use the `NO_SHADOW` macro instead of `SHADOW`. - -## 6. Limiting species allowed as followers -You may use the following configs in `include/config/overworld.h` -```c -#define OW_FOLLOWERS_ALLOWED_SPECIES (0) -#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) -#define OW_FOLLOWERS_ALLOWED_MET_LOC (0) -``` -Examples: -```c -// Yellow Pikachu: -#define OW_FOLLOWERS_ALLOWED_SPECIES (SPECIES_PIKACHU) -#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) -#define OW_FOLLOWERS_ALLOWED_MET_LOC (MAPSEC_PALLET_TOWN) -// Hoenn Starter: -#define OW_FOLLOWERS_ALLOWED_SPECIES (0) -#define OW_FOLLOWERS_ALLOWED_MET_LVL (5) -#define OW_FOLLOWERS_ALLOWED_MET_LOC (MAPSEC_ROUTE_101) -// Species set in VAR_XXXX: -#define OW_FOLLOWERS_ALLOWED_SPECIES (VAR_XXXX) -#define OW_FOLLOWERS_ALLOWED_MET_LVL (0) -#define OW_FOLLOWERS_ALLOWED_MET_LOC (0) -``` diff --git a/include/config/overworld.h b/include/config/overworld.h index 47838dfbd1..d3382913de 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -96,10 +96,10 @@ // Lighting #define OW_SHADOW_INTENSITY 4 // Ranges from 0 to 16, where 0 is fully transparent and 16 is black. #define OW_OBJECT_SUBPRIORITY 148 // The higher the value, the farther back compared to other sprites. Shadows should be behind object events. -#define OW_ENABLE_DNS TRUE // If set to TRUE, overworld will be tinted depending on time of day +#define OW_ENABLE_DNS TRUE // If set to TRUE, the overworld will be tinted depending on time of day. // Object Event Shadows -#define OW_OBJECT_VANILLA_SHADOWS FALSE // In vanilla shadows in the overworld is only shown when jumping +#define OW_OBJECT_VANILLA_SHADOWS FALSE // In vanilla shadows in the overworld are only shown when jumping. // Overworld flags // To use the following features in scripting, replace the 0s with the flag ID you're assigning it to. diff --git a/include/constants/field_weather.h b/include/constants/field_weather.h index 4f0e05d54d..133e6d935a 100644 --- a/include/constants/field_weather.h +++ b/include/constants/field_weather.h @@ -4,7 +4,7 @@ #include "config/overworld.h" // sPaletteColorMapTypes & field_effect_scripts -enum +enum ColorMapType { COLOR_MAP_NONE, COLOR_MAP_DARK_CONTRAST, diff --git a/include/field_weather.h b/include/field_weather.h index 3a614affbf..f1d6768f1a 100644 --- a/include/field_weather.h +++ b/include/field_weather.h @@ -148,7 +148,7 @@ void SetCurrentAndNextWeatherNoDelay(u8 weather); void ApplyWeatherColorMapIfIdle(s8 colorMapIndex); void ApplyWeatherColorMapIfIdle_Gradual(u8 colorMapIndex, u8 targetColorMapIndex, u8 colorMapStepDelay); void FadeScreen(u8 mode, s8 delay); -u32 FadeScreenHardware(u32 mode, s32 delay); +void FadeScreenHardware(u32 mode, s32 delay); bool8 IsWeatherNotFadingIn(void); void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog); void ApplyWeatherColorMapToPals(u8 startPalIndex, u8 numPalettes); @@ -166,7 +166,7 @@ void PlayRainStoppingSoundEffect(void); u8 IsWeatherChangeComplete(void); void SetWeatherScreenFadeOut(void); void SetWeatherPalStateIdle(void); -const u8* SetPaletteColorMapType(u8 paletteIndex, u8 colorMapType); +const u8* SetPaletteColorMapType(u8 paletteIndex, enum ColorMapType colorMapType); void PreservePaletteInWeather(u8 preservedPalIndex); void ResetPaletteColorMapType(u8 paletteIndex); void ResetPreservedPalettesInWeather(void); diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index aebee69665..fd4b525b06 100644 --- a/include/gba/io_reg.h +++ b/include/gba/io_reg.h @@ -599,7 +599,7 @@ #define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA) #define BLDCNT_EFFECT_LIGHTEN (2 << 6) // 1st target becomes whiter (controlled by BLDY) #define BLDCNT_EFFECT_DARKEN (3 << 6) // 1st target becomes blacker (controlled by BLDY) -#define BLDCNT_EFFECT_EFF_MASK (3 << 6) // mask to check effect +#define BLDCNT_EFFECT_EFF_MASK (3 << 6) // mask to check effect // Bits 8-13 select layers for the 2nd target #define BLDCNT_TGT2_BG0 (1 << 8) #define BLDCNT_TGT2_BG1 (1 << 9) diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index ca59e3e3ea..05610b0bd3 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -38,7 +38,7 @@ typedef void (*TilesetCB)(void); struct Tileset { /*0x00*/ u8 isCompressed:1; - /*0x00*/ u8 swapPalettes:7; // bitmask determining whether palette has an alternate, night-time palette + /*0x00*/ u8 swapPalettes:7; // Bitmask determining whether palette has an alternate, night-time palette /*0x01*/ bool8 isSecondary; /*0x02*/ u8 lightPalettes; // Bitmask determining whether a palette should be time-blended as a light /*0x03*/ u8 customLightColor; // Bitmask determining which light palettes have custom light colors (color 15) diff --git a/src/data/field_effects/field_effect_objects.h b/src/data/field_effects/field_effect_objects.h index 95dcbc5b28..5638ea46e2 100755 --- a/src/data/field_effects/field_effect_objects.h +++ b/src/data/field_effects/field_effect_objects.h @@ -40,7 +40,15 @@ const struct SpriteFrameImage gFieldEffectObjectPicTable_MartLight[] = { obj_frame_tiles(gFieldEffectObjectPic_MartLight), }; -const struct SpriteTemplate gFieldEffectObjectTemplate_BallLight = {OBJ_EVENT_PAL_TAG_LIGHT, OBJ_EVENT_PAL_TAG_LIGHT, &gObjectEventBaseOam_32x32, sAnimTable_Inanimate, gFieldEffectObjectPicTable_BallLight, gDummySpriteAffineAnimTable, UpdateLightSprite}; +const struct SpriteTemplate gFieldEffectObjectTemplate_BallLight = { + .tileTag = OBJ_EVENT_PAL_TAG_LIGHT, + .paletteTag = OBJ_EVENT_PAL_TAG_LIGHT, + .oam = &gObjectEventBaseOam_32x32, + .anims = sAnimTable_Inanimate, + .images = gFieldEffectObjectPicTable_BallLight, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = UpdateLightSprite, +}; const struct SpriteTemplate gFieldEffectObjectTemplate_PokeCenterLight = { .tileTag = TAG_NONE, diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h index 23c13d61e5..c7b92def91 100755 --- a/src/data/object_events/object_event_graphics.h +++ b/src/data/object_events/object_event_graphics.h @@ -296,7 +296,6 @@ const u32 gFieldEffectObjectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/field_ const u32 gFieldEffectObjectPic_BallLight[] = INCBIN_U32("graphics/object_events/pics/misc/light.4bpp"); const u32 gFieldEffectObjectPic_PokeCenterLight[] = INCBIN_U32("graphics/object_events/pics/misc/poke_center_light.4bpp"); const u32 gFieldEffectObjectPic_MartLight[] = INCBIN_U32("graphics/object_events/pics/misc/mart_light.4bpp"); -static const u32 sFiller[0x48] = {}; const u8 gFieldEffectPic_CutGrass[] = INCBIN_U8("graphics/field_effects/pics/cut_grass.4bpp"); const u32 gFieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/field_effects/pics/cut_grass.4bpp"); const u16 gFieldEffectPal_CutGrass[] = INCBIN_U16("graphics/field_effects/palettes/cut_grass.gbapal"); diff --git a/src/field_weather.c b/src/field_weather.c index 4086870ae8..94e625a076 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -811,7 +811,7 @@ void FadeScreen(u8 mode, s8 delay) // Note: This enables blending in all windows; // These bits may need to be disabled later // (i.e if blending lighting effects using WINOBJ) -u32 FadeScreenHardware(u32 mode, s32 delay) +void FadeScreenHardware(u32 mode, s32 delay) { u32 bldCnt = GetGpuReg(REG_OFFSET_BLDCNT) & BLDCNT_TGT2_ALL; bldCnt |= BLDCNT_TGT1_ALL; @@ -834,8 +834,6 @@ u32 FadeScreenHardware(u32 mode, s32 delay) BeginHardwarePaletteFade(bldCnt | BLDCNT_EFFECT_LIGHTEN, delay, 0, 16, FALSE); break; } - - return 0; } bool8 IsWeatherNotFadingIn(void) @@ -896,17 +894,6 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog) } break; } - // If faded out, i.e due to fadescreenswapbuffers, - // Copy unfaded palette to pal decomp buffer - // so it will be restored on fade-in - /* - if (gPaletteFade.y == 16) - CpuFastCopy( - gPlttBufferUnfaded + OBJ_PLTT_ID(spritePaletteIndex), - gDecompressionBuffer + 2 * OBJ_PLTT_ID(spritePaletteIndex), - PLTT_SIZE_4BPP - ); - */ } void ApplyWeatherColorMapToPals(u8 startPalIndex, u8 numPalettes) @@ -1162,7 +1149,7 @@ void SetWeatherPalStateIdle(void) gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } -const u8* SetPaletteColorMapType(u8 paletteIndex, u8 colorMapType) +const u8 *SetPaletteColorMapType(u8 paletteIndex, enum ColorMapType colorMapType) { if (sPaletteColorMapTypes[paletteIndex] == colorMapType) return sPaletteColorMapTypes; diff --git a/src/fieldmap.c b/src/fieldmap.c index f788f55679..dc322a9385 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -886,12 +886,11 @@ static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u1 { if (tileset->isSecondary == FALSE) { - // LoadPalette(&black, destOffset, 2); if (skipFaded) CpuFastCopy(tileset->palettes, &gPlttBufferUnfaded[destOffset], size); // always word-aligned else LoadPaletteFast(tileset->palettes, destOffset, size); - gPlttBufferFaded[destOffset] = gPlttBufferUnfaded[destOffset] = RGB_BLACK; // why does it have to be black? + gPlttBufferFaded[destOffset] = gPlttBufferUnfaded[destOffset] = RGB_BLACK; ApplyGlobalTintToPaletteEntries(destOffset + 1, (size - 2) >> 1); low = 0; high = NUM_PALS_IN_PRIMARY; diff --git a/src/overworld.c b/src/overworld.c index 646e5cbbba..bea35f6349 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1624,8 +1624,7 @@ bool32 MapHasNaturalLight(u8 mapType) return (mapType == MAP_TYPE_TOWN || mapType == MAP_TYPE_CITY || mapType == MAP_TYPE_ROUTE - || mapType == MAP_TYPE_OCEAN_ROUTE - ); + || mapType == MAP_TYPE_OCEAN_ROUTE); } bool32 CurrentMapHasShadows(void) @@ -1658,9 +1657,9 @@ void UpdateAltBgPalettes(u16 palettes) if (palettes & 1) { if (i < NUM_PALS_IN_PRIMARY) - AvgPaletteWeighted(&((u16*)primary->palettes)[i*16], &((u16*)primary->palettes)[((i+9)%16)*16], gPlttBufferUnfaded + i * 16, gTimeBlend.altWeight); + AvgPaletteWeighted(&((u16 *)primary->palettes)[i * 16], &((u16 *)primary->palettes)[((i + 9) % 16) * 16], gPlttBufferUnfaded + i * 16, gTimeBlend.altWeight); else - AvgPaletteWeighted(&((u16*)secondary->palettes)[i*16], &((u16*)secondary->palettes)[((i+9)%16)*16], gPlttBufferUnfaded + i * 16, gTimeBlend.altWeight); + AvgPaletteWeighted(&((u16 *)secondary->palettes)[i * 16], &((u16 *)secondary->palettes)[((i + 9) % 16) * 16], gPlttBufferUnfaded + i * 16, gTimeBlend.altWeight); } i++; palettes >>= 1; @@ -1669,36 +1668,29 @@ void UpdateAltBgPalettes(u16 palettes) void UpdatePalettesWithTime(u32 palettes) { - if (!OW_ENABLE_DNS) + if (!OW_ENABLE_DNS || !MapHasNaturalLight(gMapHeader.mapType)) return; - if (MapHasNaturalLight(gMapHeader.mapType)) - { - u32 i; - u32 mask = 1 << 16; - if (palettes >= (1 << 16)) + u32 i; + u32 mask = 1 << 16; + if (palettes >= (1 << 16)) for (i = 0; i < 16; i++, mask <<= 1) { if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(i))) palettes &= ~(mask); } - palettes &= PALETTES_MAP | PALETTES_OBJECTS; // Don't blend UI pals - if (!palettes) - return; - TimeMixPalettes(palettes, gPlttBufferUnfaded, gPlttBufferFaded, &gTimeBlend.startBlend, &gTimeBlend.endBlend, gTimeBlend.weight); - } + palettes &= PALETTES_MAP | PALETTES_OBJECTS; // Don't blend UI pals + if (!palettes) + return; + TimeMixPalettes(palettes, gPlttBufferUnfaded, gPlttBufferFaded, &gTimeBlend.startBlend, &gTimeBlend.endBlend, gTimeBlend.weight); } u8 UpdateSpritePaletteWithTime(u8 paletteNum) { - if (!OW_ENABLE_DNS) - return paletteNum; - if (MapHasNaturalLight(gMapHeader.mapType)) - { - if (IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(paletteNum))) - return paletteNum; + if (OW_ENABLE_DNS + && MapHasNaturalLight(gMapHeader.mapType) + && !IS_BLEND_IMMUNE_TAG(GetSpritePaletteTagByPaletteNum(paletteNum))) TimeMixPalettes(1, &gPlttBufferUnfaded[OBJ_PLTT_ID(paletteNum)], &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], &gTimeBlend.startBlend, &gTimeBlend.endBlend, gTimeBlend.weight); - } return paletteNum; } diff --git a/src/palette.c b/src/palette.c index 506777b41a..3e8a370723 100644 --- a/src/palette.c +++ b/src/palette.c @@ -161,48 +161,44 @@ bool32 BeginTimeOfDayPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 t u8 temp; if (gPaletteFade.active) - { return FALSE; - } - else + + gPaletteFade.deltaY = 2; + + if (delay < 0) { - gPaletteFade.deltaY = 2; - - if (delay < 0) - { - gPaletteFade.deltaY += (delay * -1); - delay = 0; - } - - gPaletteFade_selectedPalettes = selectedPalettes; - gPaletteFade.delayCounter = delay; - gPaletteFade_delay = delay; - gPaletteFade.y = startY; - gPaletteFade.targetY = targetY; - gPaletteFade.active = 1; - gPaletteFade.mode = TIME_OF_DAY_FADE; - - gPaletteFade.blendColor = color; - gPaletteFade.bld0 = bld0; - gPaletteFade.bld1 = bld1; - gPaletteFade.weight = weight; - - if (startY < targetY) - gPaletteFade.yDec = 0; - else - gPaletteFade.yDec = 1; - - UpdatePaletteFade(); - - temp = gPaletteFade.bufferTransferDisabled; - gPaletteFade.bufferTransferDisabled = 0; - CpuCopy32(gPlttBufferFaded, (void *)PLTT, PLTT_SIZE); - sPlttBufferTransferPending = 0; - if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active) - UpdateBlendRegisters(); - gPaletteFade.bufferTransferDisabled = temp; - return TRUE; + gPaletteFade.deltaY += (delay * -1); + delay = 0; } + + gPaletteFade_selectedPalettes = selectedPalettes; + gPaletteFade.delayCounter = delay; + gPaletteFade_delay = delay; + gPaletteFade.y = startY; + gPaletteFade.targetY = targetY; + gPaletteFade.active = 1; + gPaletteFade.mode = TIME_OF_DAY_FADE; + + gPaletteFade.blendColor = color; + gPaletteFade.bld0 = bld0; + gPaletteFade.bld1 = bld1; + gPaletteFade.weight = weight; + + if (startY < targetY) + gPaletteFade.yDec = 0; + else + gPaletteFade.yDec = 1; + + UpdatePaletteFade(); + + temp = gPaletteFade.bufferTransferDisabled; + gPaletteFade.bufferTransferDisabled = 0; + CpuCopy32(gPlttBufferFaded, (void *)PLTT, PLTT_SIZE); + sPlttBufferTransferPending = 0; + if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active) + UpdateBlendRegisters(); + gPaletteFade.bufferTransferDisabled = temp; + return TRUE; } void ResetPaletteFadeControl(void) @@ -316,16 +312,14 @@ static u8 UpdateTimeOfDayPaletteFade(void) if (!gPaletteFade.yDec) { - val = gPaletteFade.y; - val += gPaletteFade.deltaY; + val = gPaletteFade.y + gPaletteFade.deltaY; if (val > gPaletteFade.targetY) val = gPaletteFade.targetY; gPaletteFade.y = val; } else { - val = gPaletteFade.y; - val -= gPaletteFade.deltaY; + val = gPaletteFade.y - gPaletteFade.deltaY; if (val < 0) val = 0; gPaletteFade.y = val; @@ -732,7 +726,7 @@ static void UpdateBlendRegisters(void) SetGpuReg(REG_OFFSET_BLDCNT, (u16)gPaletteFade_blendCnt); SetGpuReg(REG_OFFSET_BLDY, gPaletteFade.y); // If fade-out, also adjust BLDALPHA and DISPCNT - if (!gPaletteFade.yDec /*&& gPaletteFade.mode == HARDWARE_FADE*/) + if (!gPaletteFade.yDec) { u16 bldAlpha = GetGpuReg(REG_OFFSET_BLDALPHA); u8 tgt1 = BLDALPHA_TGT1(bldAlpha); @@ -744,25 +738,24 @@ static void UpdateBlendRegisters(void) // FADE_TO_BLACK case BLDCNT_EFFECT_DARKEN: bldFade = BLDALPHA_TGT1(max(0, 16 - gPaletteFade.y)); - SetGpuReg( - REG_OFFSET_BLDALPHA, - BLDALPHA_BLEND(min(tgt1, bldFade), min(tgt2, bldFade)) - ); + SetGpuReg(REG_OFFSET_BLDALPHA, + BLDALPHA_BLEND(min(tgt1, bldFade), min(tgt2, bldFade))); break; // FADE_TO_WHITE case BLDCNT_EFFECT_LIGHTEN: - SetGpuReg( - REG_OFFSET_BLDALPHA, - BLDALPHA_BLEND(min(++tgt1, 31), min(++tgt2, 31)) - ); + SetGpuReg(REG_OFFSET_BLDALPHA, + BLDALPHA_BLEND(min(++tgt1, 31), min(++tgt2, 31))); // cause display to show white when finished // (otherwise blend-mode sprites will still be visible) if (gPaletteFade.hardwareFadeFinishing && gPaletteFade.y >= 16) SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); break; } - } else + } + else + { ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); + } if (gPaletteFade.hardwareFadeFinishing) { @@ -849,8 +842,8 @@ void BlendPalettes(u32 selectedPalettes, u8 coeff, u32 color) void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor) { s32 newR, newG, newB, defR, defG, defB; - u16 * src = gPlttBufferUnfaded + palOffset; - u16 * dst = gPlttBufferFaded + palOffset; + u16 *src = gPlttBufferUnfaded + palOffset; + u16 *dst = gPlttBufferFaded + palOffset; u32 defaultBlendColor = DEFAULT_LIGHT_COLOR; u16 *srcEnd = src + 16; u32 altBlendColor = *dst++ = *src++; // color 0 is copied through unchanged @@ -1182,8 +1175,8 @@ void TintPalette_CustomTone(u16 *palette, u32 count, u16 rTone, u16 gTone, u16 b void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor) { s32 newR, newG, newB, rTone = 0, gTone = 0, bTone = 0; - u16 * src = gPlttBufferUnfaded + palOffset; - u16 * dst = gPlttBufferFaded + palOffset; + u16 *src = gPlttBufferUnfaded + palOffset; + u16 *dst = gPlttBufferFaded + palOffset; u32 defaultBlendColor = DEFAULT_LIGHT_COLOR; u16 *srcEnd = src + 16; u16 altBlendIndices = *dst++ = *src++; // color 0 is copied through unchanged @@ -1249,6 +1242,8 @@ void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor) } } +#undef DEFAULT_LIGHT_COLOR + #define tCoeff data[0] #define tCoeffTarget data[1] #define tCoeffDelta data[2] diff --git a/src/palette_util.c b/src/palette_util.c index 5effdd2b15..842d4bfdb1 100644 --- a/src/palette_util.c +++ b/src/palette_util.c @@ -387,7 +387,7 @@ void UpdatePulseBlend(struct PulseBlend *pulseBlend) pulseBlendPalette->delayCounter = pulseBlendPalette->pulseBlendSettings.delay; CpuFastCopy(gPlttBufferUnfaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, gPlttBufferFaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, PLTT_SIZE_4BPP); UpdatePalettesWithTime(1 << (pulseBlendPalette->pulseBlendSettings.paletteOffset >> 4)); - // pulseBlendSettings has a numColors field, but it is only ever set to 16 (for Mirage tower) + // pulseBlendSettings has a numColors field, but it is only ever set to 16 (for Mirage Tower) // So, it's ok to use the fine blending here which blends the entire palette BlendPalettesFine(1, gPlttBufferFaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, gPlttBufferFaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, pulseBlendPalette->blendCoeff, pulseBlendPalette->pulseBlendSettings.blendColor); switch (pulseBlendPalette->pulseBlendSettings.fadeType) diff --git a/src/scrcmd.c b/src/scrcmd.c index 8bc915f2c0..f1511c7583 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -839,10 +839,8 @@ bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx) case FADE_FROM_WHITE: // Restore last weather blend before fading in, // since BLDALPHA was modified by fade-out - SetGpuReg( - REG_OFFSET_BLDALPHA, - BLDALPHA_BLEND(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB) - ); + SetGpuReg(REG_OFFSET_BLDALPHA, + BLDALPHA_BLEND(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB)); break; } From 3c2cc35158f56a9c287d73efe8db4273ff4388ab Mon Sep 17 00:00:00 2001 From: Hedara Date: Fri, 11 Apr 2025 21:17:52 +0200 Subject: [PATCH 141/145] Match expansion formatting for some preproc --- include/palette.h | 8 ++++---- src/palette.c | 44 ++++++++++++++++++++++---------------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/include/palette.h b/include/palette.h index c05dde873f..27b8976607 100644 --- a/include/palette.h +++ b/include/palette.h @@ -1,10 +1,10 @@ #ifndef GUARD_PALETTE_H #define GUARD_PALETTE_H -#define gPaletteFade_selectedPalettes (gPaletteFade.multipurpose1) // normal and fast fade -#define gPaletteFade_blendCnt (gPaletteFade.multipurpose1) // hardware fade -#define gPaletteFade_delay (gPaletteFade.multipurpose2) // normal and hardware fade -#define gPaletteFade_submode (gPaletteFade.multipurpose2) // fast fade +#define gPaletteFadeSelectedPalettes (gPaletteFade.multipurpose1) // normal and fast fade +#define gPaletteFadeBlendCnt (gPaletteFade.multipurpose1) // hardware fade +#define gPaletteFadeDelay (gPaletteFade.multipurpose2) // normal and hardware fade +#define gPaletteFadeSubmode (gPaletteFade.multipurpose2) // fast fade #define PLTT_BUFFER_SIZE (PLTT_SIZE / sizeof(u16)) diff --git a/src/palette.c b/src/palette.c index 3e8a370723..2979ca9076 100644 --- a/src/palette.c +++ b/src/palette.c @@ -128,9 +128,9 @@ bool32 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targ delay = 0; } - gPaletteFade_selectedPalettes = selectedPalettes; + gPaletteFadeSelectedPalettes = selectedPalettes; gPaletteFade.delayCounter = delay; - gPaletteFade_delay = delay; + gPaletteFadeDelay = delay; gPaletteFade.y = startY; gPaletteFade.targetY = targetY; gPaletteFade.blendColor = blendColor; @@ -171,9 +171,9 @@ bool32 BeginTimeOfDayPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 t delay = 0; } - gPaletteFade_selectedPalettes = selectedPalettes; + gPaletteFadeSelectedPalettes = selectedPalettes; gPaletteFade.delayCounter = delay; - gPaletteFade_delay = delay; + gPaletteFadeDelay = delay; gPaletteFade.y = startY; gPaletteFade.targetY = targetY; gPaletteFade.active = 1; @@ -239,7 +239,7 @@ static u8 UpdateTimeOfDayPaletteFade(void) if (!gPaletteFade.objPaletteToggle) { - if (gPaletteFade.delayCounter < gPaletteFade_delay) + if (gPaletteFade.delayCounter < gPaletteFadeDelay) { gPaletteFade.delayCounter++; return PALETTE_FADE_STATUS_DELAY; @@ -251,11 +251,11 @@ static u8 UpdateTimeOfDayPaletteFade(void) if (!gPaletteFade.objPaletteToggle) { - selectedPalettes = gPaletteFade_selectedPalettes; + selectedPalettes = gPaletteFadeSelectedPalettes; } else { - selectedPalettes = gPaletteFade_selectedPalettes >> 16; + selectedPalettes = gPaletteFadeSelectedPalettes >> 16; paletteOffset = 256; } @@ -303,7 +303,7 @@ static u8 UpdateTimeOfDayPaletteFade(void) { if ((gPaletteFade.yDec && gPaletteFade.y == 0) || (!gPaletteFade.yDec && gPaletteFade.y == gPaletteFade.targetY)) { - gPaletteFade_selectedPalettes = 0; + gPaletteFadeSelectedPalettes = 0; gPaletteFade.softwareFadeFinishing = 1; } else @@ -348,7 +348,7 @@ static u32 UpdateNormalPaletteFade(void) { if (!gPaletteFade.objPaletteToggle) { - if (gPaletteFade.delayCounter < gPaletteFade_delay) + if (gPaletteFade.delayCounter < gPaletteFadeDelay) { gPaletteFade.delayCounter++; return PALETTE_FADE_STATUS_DELAY; @@ -360,11 +360,11 @@ static u32 UpdateNormalPaletteFade(void) if (!gPaletteFade.objPaletteToggle) { - selectedPalettes = gPaletteFade_selectedPalettes; + selectedPalettes = gPaletteFadeSelectedPalettes; } else { - selectedPalettes = gPaletteFade_selectedPalettes >> 16; + selectedPalettes = gPaletteFadeSelectedPalettes >> 16; paletteOffset = OBJ_PLTT_OFFSET; } @@ -386,7 +386,7 @@ static u32 UpdateNormalPaletteFade(void) { if (gPaletteFade.y == gPaletteFade.targetY) { - gPaletteFade_selectedPalettes = 0; + gPaletteFadeSelectedPalettes = 0; gPaletteFade.softwareFadeFinishing = TRUE; } else @@ -483,7 +483,7 @@ void BeginFastPaletteFade(u32 submode) static void BeginFastPaletteFadeInternal(u32 submode) { gPaletteFade.y = 31; - gPaletteFade_submode = submode & 0x3F; + gPaletteFadeSubmode = submode & 0x3F; gPaletteFade.active = TRUE; gPaletteFade.mode = FAST_FADE; @@ -526,7 +526,7 @@ static u32 UpdateFastPaletteFade(void) paletteOffsetEnd = OBJ_PLTT_OFFSET; } - switch (gPaletteFade_submode) + switch (gPaletteFadeSubmode) { case FAST_FADE_IN_FROM_WHITE: for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) @@ -631,7 +631,7 @@ static u32 UpdateFastPaletteFade(void) if (gPaletteFade.y == 0) { - switch (gPaletteFade_submode) + switch (gPaletteFadeSubmode) { case FAST_FADE_IN_FROM_WHITE: case FAST_FADE_IN_FROM_BLACK: @@ -656,9 +656,9 @@ static u32 UpdateFastPaletteFade(void) void BeginHardwarePaletteFade(u32 blendCnt, u32 delay, u32 y, u32 targetY, u32 shouldResetBlendRegisters) { - gPaletteFade_blendCnt = blendCnt; + gPaletteFadeBlendCnt = blendCnt; gPaletteFade.delayCounter = delay; - gPaletteFade_delay = delay; + gPaletteFadeDelay = delay; gPaletteFade.y = y; gPaletteFade.targetY = targetY; gPaletteFade.active = TRUE; @@ -677,7 +677,7 @@ static u32 UpdateHardwarePaletteFade(void) if (!gPaletteFade.active) return PALETTE_FADE_STATUS_DONE; - if (gPaletteFade.delayCounter < gPaletteFade_delay) + if (gPaletteFade.delayCounter < gPaletteFadeDelay) { gPaletteFade.delayCounter++; return PALETTE_FADE_STATUS_DELAY; @@ -709,7 +709,7 @@ static u32 UpdateHardwarePaletteFade(void) if (gPaletteFade.shouldResetBlendRegisters) { // clear TGT1 - gPaletteFade_blendCnt &= ~0xFF; + gPaletteFadeBlendCnt &= ~0xFF; gPaletteFade.y = 0; } gPaletteFade.shouldResetBlendRegisters = FALSE; @@ -723,7 +723,7 @@ static u32 UpdateHardwarePaletteFade(void) // Only called for hardware fades static void UpdateBlendRegisters(void) { - SetGpuReg(REG_OFFSET_BLDCNT, (u16)gPaletteFade_blendCnt); + SetGpuReg(REG_OFFSET_BLDCNT, (u16)gPaletteFadeBlendCnt); SetGpuReg(REG_OFFSET_BLDY, gPaletteFade.y); // If fade-out, also adjust BLDALPHA and DISPCNT if (!gPaletteFade.yDec) @@ -733,7 +733,7 @@ static void UpdateBlendRegisters(void) u8 tgt2 = BLDALPHA_TGT2(bldAlpha); u8 bldFade; - switch (gPaletteFade_blendCnt & BLDCNT_EFFECT_EFF_MASK) + switch (gPaletteFadeBlendCnt & BLDCNT_EFFECT_EFF_MASK) { // FADE_TO_BLACK case BLDCNT_EFFECT_DARKEN: @@ -761,7 +761,7 @@ static void UpdateBlendRegisters(void) { gPaletteFade.hardwareFadeFinishing = FALSE; gPaletteFade.mode = 0; - gPaletteFade_blendCnt = 0; + gPaletteFadeBlendCnt = 0; gPaletteFade.y = 0; gPaletteFade.active = FALSE; } From fff6bd3ed81d53cc1684241e10fe72e896e32202 Mon Sep 17 00:00:00 2001 From: Hedara Date: Fri, 11 Apr 2025 21:27:49 +0200 Subject: [PATCH 142/145] Removed legacy handling, fix if statment argument style --- src/data/tilesets/headers.h | 9 --------- src/field_effect_helpers.c | 9 ++++----- src/fieldmap.c | 18 ------------------ 3 files changed, 4 insertions(+), 32 deletions(-) diff --git a/src/data/tilesets/headers.h b/src/data/tilesets/headers.h index 6ac09b5f07..2401b65309 100644 --- a/src/data/tilesets/headers.h +++ b/src/data/tilesets/headers.h @@ -3,15 +3,6 @@ // Whether a palette has a night version, located at ((x + 9) % 16).pal #define SWAP_PAL(x) ((x) < NUM_PALS_IN_PRIMARY ? 1 << (x) : 1 << ((x) - NUM_PALS_IN_PRIMARY)) -// NOTE: Instead of using LIGHT_PAL, -// consider taking a look at the .pla files -// to mark colors as lights, instead. -// The old method *should* still work, however. -// Check docs/tutorials/dns.md for details. - -// Whether a palette has lights the color indices to blend are stored in the palette's color 0 -#define LIGHT_PAL(x) ((x) < NUM_PALS_IN_PRIMARY ? 1 << (x) : 1 << ((x) - NUM_PALS_IN_PRIMARY)) - const struct Tileset gTileset_General = { .isCompressed = TRUE, diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 40114eb0a7..8174d11135 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -339,11 +339,10 @@ u32 FldEff_Shadow(void) for (i = MAX_SPRITES - 1; i > -1; i--) // Search backwards, because of CreateSpriteAtEnd { // Return early if a shadow sprite already exists - if (gSprites[i].callback == UpdateShadowFieldEffect && - gSprites[i].sLocalId == gFieldEffectArguments[0] && - gSprites[i].sMapNum == gFieldEffectArguments[1] && - gSprites[i].sMapGroup == gFieldEffectArguments[2] - ) + if (gSprites[i].callback == UpdateShadowFieldEffect + && gSprites[i].sLocalId == gFieldEffectArguments[0] + && gSprites[i].sMapNum == gFieldEffectArguments[1] + && gSprites[i].sMapGroup == gFieldEffectArguments[2]) return 0; } objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); diff --git a/src/fieldmap.c b/src/fieldmap.c index dc322a9385..8b43ce591f 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -911,24 +911,6 @@ static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u1 LoadCompressedPalette((const u32 *)tileset->palettes, destOffset, size); ApplyGlobalTintToPaletteEntries(destOffset, size >> 1); } - // convert legacy light palette system to current - if (tileset->lightPalettes) - { - u32 i, j, color; - for (i = low; i < high; i++) - { - if (tileset->lightPalettes & (1 << (i - low))) // Mark light colors - { - for (j = 1, color = gPlttBufferUnfaded[PLTT_ID(i)]; j < 16 && color; j++, color >>= 1) - { - if (color & 1) - gPlttBufferFaded[PLTT_ID(i)+j] = gPlttBufferUnfaded[PLTT_ID(i)+j] |= RGB_ALPHA; - } - if (tileset->customLightColor & (1 << (i - low))) // Copy old custom light color to index 0 - gPlttBufferFaded[PLTT_ID(i)] = gPlttBufferUnfaded[PLTT_ID(i)] = gPlttBufferUnfaded[PLTT_ID(i) + 15] | RGB_ALPHA; - } - } - } } } From 66a6e9241799de0c75bd07b6ec93c6cc9a7aab5f Mon Sep 17 00:00:00 2001 From: Hedara Date: Fri, 11 Apr 2025 22:15:47 +0200 Subject: [PATCH 143/145] Fixed unused variables --- src/fieldmap.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/fieldmap.c b/src/fieldmap.c index 8b43ce591f..3a452a5d25 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -879,9 +879,6 @@ static void UNUSED ApplyGlobalTintToPaletteSlot(u8 slot, u8 count) static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size, bool8 skipFaded) { - u32 low = 0; - u32 high = 0; - if (tileset) { if (tileset->isSecondary == FALSE) @@ -892,8 +889,6 @@ static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u1 LoadPaletteFast(tileset->palettes, destOffset, size); gPlttBufferFaded[destOffset] = gPlttBufferUnfaded[destOffset] = RGB_BLACK; ApplyGlobalTintToPaletteEntries(destOffset + 1, (size - 2) >> 1); - low = 0; - high = NUM_PALS_IN_PRIMARY; } else if (tileset->isSecondary == TRUE) { @@ -903,8 +898,6 @@ static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u1 CpuCopy16(tileset->palettes[NUM_PALS_IN_PRIMARY], &gPlttBufferUnfaded[destOffset], size); else LoadPaletteFast(tileset->palettes[NUM_PALS_IN_PRIMARY], destOffset, size); - low = NUM_PALS_IN_PRIMARY; - high = NUM_PALS_TOTAL; } else { From 51c3709a565eaba74a9254248fa798e4f9cbbf3b Mon Sep 17 00:00:00 2001 From: Hedara Date: Sat, 12 Apr 2025 08:58:23 +0200 Subject: [PATCH 144/145] Review comments --- include/field_weather.h | 2 +- src/field_weather.c | 5 ++--- src/overworld.c | 8 +++----- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/include/field_weather.h b/include/field_weather.h index f1d6768f1a..e8e34f4940 100644 --- a/include/field_weather.h +++ b/include/field_weather.h @@ -166,7 +166,7 @@ void PlayRainStoppingSoundEffect(void); u8 IsWeatherChangeComplete(void); void SetWeatherScreenFadeOut(void); void SetWeatherPalStateIdle(void); -const u8* SetPaletteColorMapType(u8 paletteIndex, enum ColorMapType colorMapType); +const u8 *SetPaletteColorMapType(u8 paletteIndex, enum ColorMapType colorMapType); void PreservePaletteInWeather(u8 preservedPalIndex); void ResetPaletteColorMapType(u8 paletteIndex); void ResetPreservedPalettesInWeather(void); diff --git a/src/field_weather.c b/src/field_weather.c index 94e625a076..7e8d83b2a5 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -1170,9 +1170,8 @@ void PreservePaletteInWeather(u8 preservedPalIndex) void ResetPaletteColorMapType(u8 paletteIndex) { - if (sPaletteColorMapTypes == sBasePaletteColorMapTypes) - return; - sFieldEffectPaletteColorMapTypes[paletteIndex] = sBasePaletteColorMapTypes[paletteIndex]; + if (sPaletteColorMapTypes != sBasePaletteColorMapTypes) + sFieldEffectPaletteColorMapTypes[paletteIndex] = sBasePaletteColorMapTypes[paletteIndex]; } void ResetPreservedPalettesInWeather(void) diff --git a/src/overworld.c b/src/overworld.c index bea35f6349..e7273164ad 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1629,11 +1629,9 @@ bool32 MapHasNaturalLight(u8 mapType) bool32 CurrentMapHasShadows(void) { - bool32 shouldHaveShadows = TRUE; - u32 currentMapType = gMapHeader.mapType; - if (currentMapType == MAP_TYPE_UNDERGROUND) - shouldHaveShadows = FALSE; - return shouldHaveShadows; + // Add all conditionals here for maps that shouldn't have shadows + // By default only cave maps are excluded from having shadows under object events + return (gMapHeader.mapType != MAP_TYPE_UNDERGROUND); } // Update & mix day / night bg palettes (into unfaded) From 348f5967ac8d383c827b415e1040234a3f28626f Mon Sep 17 00:00:00 2001 From: Hedara Date: Sat, 12 Apr 2025 16:35:45 +0200 Subject: [PATCH 145/145] Remove Ampharos .pla files --- graphics/pokemon/ampharos/normal.pla | 7 ------- graphics/pokemon/ampharos/shiny.pla | 7 ------- 2 files changed, 14 deletions(-) delete mode 100644 graphics/pokemon/ampharos/normal.pla delete mode 100644 graphics/pokemon/ampharos/shiny.pla diff --git a/graphics/pokemon/ampharos/normal.pla b/graphics/pokemon/ampharos/normal.pla deleted file mode 100644 index debe6624ba..0000000000 --- a/graphics/pokemon/ampharos/normal.pla +++ /dev/null @@ -1,7 +0,0 @@ -# Color indices to set high bit -0 -6 -11 -12 -13 -14 diff --git a/graphics/pokemon/ampharos/shiny.pla b/graphics/pokemon/ampharos/shiny.pla deleted file mode 100644 index debe6624ba..0000000000 --- a/graphics/pokemon/ampharos/shiny.pla +++ /dev/null @@ -1,7 +0,0 @@ -# Color indices to set high bit -0 -6 -11 -12 -13 -14