From 39790779bbf208f80a52f7a68228778280b6ff22 Mon Sep 17 00:00:00 2001 From: kyphii <8711258+kyphii@users.noreply.github.com> Date: Thu, 6 Apr 2023 03:36:07 -0400 Subject: [PATCH] Extend color selection dropdown with more colors (#19446) * Setup for extended palette * Define order for color picker cells * Init G2 Palettes in ColoursInitMaps * Add Glass Palettes * Use special sprite for Invisible color * Set up new cheat for special colors * Add glass palettes to palette_to_g1_offset * Add entries for new colors in TranslucentWindowPalettes * Finish implementation of special colors cheat * Some cleanup * New colors almost work * Correct g2 palette loading indices * Invisible color sprite displays properly * Repaint works with large scenery and walls * Prevent random shop items from overflowing to junk palettes * More cleanup * Fix glass palettes * Add mapping of new colors to original colors for UI themes * Fix junk palettes for random shop items * Fix missing highlight color in software renderer * Convert small scenery support flag to allow use of new colors * Progress on displaying new colors in software renderer * Fix invisible color scheme sprite * Formatting cleanup * Resolve comparison of integer expressions of different signedness * Index g2 palette maps to fix visible chain lift * Progress on fixing new colors in software renderer * Fix station and support colors * Fix dropdown selected index * Get invisible color (mostly) working in software renderer * Use forceBmp for palette resources * Remove test function definition left in by mistake * Remove some obsolete range checks for original color values * Add changelog entry * Reorder color dropdown based on NE user feedback * Some cleanup * Further cleanup * Formatting * Add include for GetPaletteMapIndexForColour * Fix a couple things I broke * Fix function placement * Revert "Add include for GetPaletteMapIndexForColour" This reverts commit 0af9611e6656d792adb7a36efe7dbf3387a4a759. * Use color constants for color order list * Make remappable colors contiguous * turn off clang format for ordered color list * Appease clang * Use all colors for random shop item animation * Improvements to palette map resources * Fix chain lifts again + adjustments to a few colors * Update changelog and contributors.md * Revert changes to S4 and S6 importers which are no longer needed * Bump network, plugin, and minimum park versions * Revert "Progress on displaying new colors in software renderer" This reverts commit 337602e4a78a67f828d9c524138a1cb79b2c91dc. * Remove unnecessary comment --------- Co-authored-by: Trevor Finney <8711258+finneyt@users.noreply.github.com> --- contributors.md | 1 + data/language/en-GB.txt | 27 ++ distribution/changelog.txt | 1 + resources/g2/icons/colour_invisible.png | Bin 0 -> 153 bytes .../g2/icons/colour_invisible_pressed.png | Bin 0 -> 153 bytes .../g2/palette_map/palette_map_aqua_dark.png | Bin 0 -> 1506 bytes .../palette_map_bordeaux_red_dark.png | Bin 0 -> 1506 bytes .../palette_map_bordeaux_red_light.png | Bin 0 -> 1506 bytes .../palette_map_dark_olive_dark.png | Bin 0 -> 6478 bytes .../palette_map_dark_olive_light.png | Bin 0 -> 1506 bytes .../palette_map_dull_brown_dark.png | Bin 0 -> 1506 bytes .../palette_map_dull_brown_light.png | Bin 0 -> 1506 bytes .../palette_map_dull_green_dark.png | Bin 0 -> 1506 bytes .../palette_map_dull_green_light.png | Bin 0 -> 1506 bytes .../palette_map_dull_purple_light.png | Bin 0 -> 1506 bytes .../palette_map_glass_aqua_dark.png | Bin 0 -> 1505 bytes .../palette_map_glass_bordeaux_red_dark.png | Bin 0 -> 1505 bytes .../palette_map_glass_bordeaux_red_light.png | Bin 0 -> 1505 bytes .../palette_map_glass_dark_olive_dark.png | Bin 0 -> 1505 bytes .../palette_map_glass_dark_olive_light.png | Bin 0 -> 1505 bytes .../palette_map_glass_dull_brown_dark.png | Bin 0 -> 1505 bytes .../palette_map_glass_dull_brown_light.png | Bin 0 -> 1505 bytes .../palette_map_glass_dull_green_dark.png | Bin 0 -> 1505 bytes .../palette_map_glass_dull_green_light.png | Bin 0 -> 1505 bytes .../palette_map_glass_dull_purple_light.png | Bin 0 -> 1505 bytes .../palette_map_glass_grass_green_dark.png | Bin 0 -> 1505 bytes .../palette_map_glass_grass_green_light.png | Bin 0 -> 1505 bytes .../palette_map_glass_invisible.png | Bin 0 -> 1505 bytes .../palette_map_glass_magenta_light.png | Bin 0 -> 1505 bytes .../palette_map_glass_olive_dark.png | Bin 0 -> 1505 bytes .../palette_map_glass_olive_light.png | Bin 0 -> 1505 bytes .../palette_map_glass_orange_light.png | Bin 0 -> 1505 bytes ...alette_map_glass_saturated_brown_light.png | Bin 0 -> 1505 bytes ...alette_map_glass_saturated_green_light.png | Bin 0 -> 1505 bytes ...alette_map_glass_saturated_purple_dark.png | Bin 0 -> 1505 bytes ...lette_map_glass_saturated_purple_light.png | Bin 0 -> 1505 bytes .../palette_map_glass_tan_dark.png | Bin 0 -> 1505 bytes .../palette_map_glass_tan_light.png | Bin 0 -> 1505 bytes .../g2/palette_map/palette_map_glass_void.png | Bin 0 -> 1505 bytes .../palette_map_grass_green_dark.png | Bin 0 -> 1506 bytes .../palette_map_grass_green_light.png | Bin 0 -> 1506 bytes .../g2/palette_map/palette_map_invisible.png | Bin 0 -> 1506 bytes .../palette_map/palette_map_magenta_light.png | Bin 0 -> 1506 bytes .../g2/palette_map/palette_map_olive_dark.png | Bin 0 -> 6252 bytes .../palette_map/palette_map_olive_light.png | Bin 0 -> 1506 bytes .../palette_map/palette_map_orange_light.png | Bin 0 -> 1506 bytes .../palette_map_saturated_brown_light.png | Bin 0 -> 1506 bytes .../palette_map_saturated_green_light.png | Bin 0 -> 1506 bytes .../palette_map_saturated_purple_dark.png | Bin 0 -> 1505 bytes .../palette_map_saturated_purple_light.png | Bin 0 -> 1506 bytes .../g2/palette_map/palette_map_tan_dark.png | Bin 0 -> 1506 bytes .../g2/palette_map/palette_map_tan_light.png | Bin 0 -> 1506 bytes resources/g2/palette_map/palette_map_void.png | Bin 0 -> 1506 bytes resources/g2/sprites.json | 246 ++++++++++++++++++ .../drawing/engines/opengl/TextureCache.cpp | 4 +- src/openrct2-ui/input/MouseInput.cpp | 30 ++- src/openrct2-ui/interface/Theme.cpp | 49 ++++ src/openrct2-ui/interface/Theme.h | 1 + src/openrct2-ui/interface/Widget.cpp | 9 +- src/openrct2-ui/windows/Cheats.cpp | 8 +- src/openrct2-ui/windows/Dropdown.cpp | 17 +- src/openrct2-ui/windows/Ride.cpp | 2 +- src/openrct2-ui/windows/Themes.cpp | 3 +- src/openrct2/Cheats.cpp | 8 + src/openrct2/Cheats.h | 2 + src/openrct2/actions/CheatSetAction.cpp | 7 +- src/openrct2/actions/WallSetColourAction.cpp | 6 +- src/openrct2/drawing/Drawing.cpp | 174 ++++++++++++- src/openrct2/drawing/Drawing.h | 165 +++++++----- src/openrct2/drawing/ImageId.hpp | 8 +- src/openrct2/entity/Guest.cpp | 12 +- src/openrct2/interface/Colour.cpp | 33 ++- src/openrct2/interface/Colour.h | 103 +++++++- src/openrct2/localisation/StringIds.h | 27 ++ src/openrct2/network/NetworkBase.cpp | 2 +- src/openrct2/park/ParkFile.h | 4 +- src/openrct2/scripting/ScriptEngine.h | 2 +- .../scripting/bindings/game/ScCheats.hpp | 14 + src/openrct2/sprites.h | 56 +++- 79 files changed, 908 insertions(+), 113 deletions(-) create mode 100644 resources/g2/icons/colour_invisible.png create mode 100644 resources/g2/icons/colour_invisible_pressed.png create mode 100644 resources/g2/palette_map/palette_map_aqua_dark.png create mode 100644 resources/g2/palette_map/palette_map_bordeaux_red_dark.png create mode 100644 resources/g2/palette_map/palette_map_bordeaux_red_light.png create mode 100644 resources/g2/palette_map/palette_map_dark_olive_dark.png create mode 100644 resources/g2/palette_map/palette_map_dark_olive_light.png create mode 100644 resources/g2/palette_map/palette_map_dull_brown_dark.png create mode 100644 resources/g2/palette_map/palette_map_dull_brown_light.png create mode 100644 resources/g2/palette_map/palette_map_dull_green_dark.png create mode 100644 resources/g2/palette_map/palette_map_dull_green_light.png create mode 100644 resources/g2/palette_map/palette_map_dull_purple_light.png create mode 100644 resources/g2/palette_map/palette_map_glass_aqua_dark.png create mode 100644 resources/g2/palette_map/palette_map_glass_bordeaux_red_dark.png create mode 100644 resources/g2/palette_map/palette_map_glass_bordeaux_red_light.png create mode 100644 resources/g2/palette_map/palette_map_glass_dark_olive_dark.png create mode 100644 resources/g2/palette_map/palette_map_glass_dark_olive_light.png create mode 100644 resources/g2/palette_map/palette_map_glass_dull_brown_dark.png create mode 100644 resources/g2/palette_map/palette_map_glass_dull_brown_light.png create mode 100644 resources/g2/palette_map/palette_map_glass_dull_green_dark.png create mode 100644 resources/g2/palette_map/palette_map_glass_dull_green_light.png create mode 100644 resources/g2/palette_map/palette_map_glass_dull_purple_light.png create mode 100644 resources/g2/palette_map/palette_map_glass_grass_green_dark.png create mode 100644 resources/g2/palette_map/palette_map_glass_grass_green_light.png create mode 100644 resources/g2/palette_map/palette_map_glass_invisible.png create mode 100644 resources/g2/palette_map/palette_map_glass_magenta_light.png create mode 100644 resources/g2/palette_map/palette_map_glass_olive_dark.png create mode 100644 resources/g2/palette_map/palette_map_glass_olive_light.png create mode 100644 resources/g2/palette_map/palette_map_glass_orange_light.png create mode 100644 resources/g2/palette_map/palette_map_glass_saturated_brown_light.png create mode 100644 resources/g2/palette_map/palette_map_glass_saturated_green_light.png create mode 100644 resources/g2/palette_map/palette_map_glass_saturated_purple_dark.png create mode 100644 resources/g2/palette_map/palette_map_glass_saturated_purple_light.png create mode 100644 resources/g2/palette_map/palette_map_glass_tan_dark.png create mode 100644 resources/g2/palette_map/palette_map_glass_tan_light.png create mode 100644 resources/g2/palette_map/palette_map_glass_void.png create mode 100644 resources/g2/palette_map/palette_map_grass_green_dark.png create mode 100644 resources/g2/palette_map/palette_map_grass_green_light.png create mode 100644 resources/g2/palette_map/palette_map_invisible.png create mode 100644 resources/g2/palette_map/palette_map_magenta_light.png create mode 100644 resources/g2/palette_map/palette_map_olive_dark.png create mode 100644 resources/g2/palette_map/palette_map_olive_light.png create mode 100644 resources/g2/palette_map/palette_map_orange_light.png create mode 100644 resources/g2/palette_map/palette_map_saturated_brown_light.png create mode 100644 resources/g2/palette_map/palette_map_saturated_green_light.png create mode 100644 resources/g2/palette_map/palette_map_saturated_purple_dark.png create mode 100644 resources/g2/palette_map/palette_map_saturated_purple_light.png create mode 100644 resources/g2/palette_map/palette_map_tan_dark.png create mode 100644 resources/g2/palette_map/palette_map_tan_light.png create mode 100644 resources/g2/palette_map/palette_map_void.png diff --git a/contributors.md b/contributors.md index ffac04d158..74c921dfd8 100644 --- a/contributors.md +++ b/contributors.md @@ -104,6 +104,7 @@ The following people are not part of the development team, but have been contrib * Umar Ahmed (umar-ahmed) - MacOS file watcher * Andrew Arnold (fidwell) - Added window support for more scenery groups. * Josh Trzebiatowski (trzejos) - Ride and scenery filtering +* (kyphii) - Extended color selection ## Bug fixes * (KirilAngelov) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 2838b84003..98288791e5 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3653,6 +3653,33 @@ STR_6548 :Show railings at junction STR_6549 :Compatibility objects cannot be selected! STR_6550 :This entry is included for backwards compatibility with old or damaged objects. It cannot be selected, only deselected. +STR_6551 :Army green +STR_6552 :Honeydew +STR_6553 :Tan +STR_6554 :Maroon +STR_6555 :Coral pink +STR_6556 :Forest green +STR_6557 :Chartreuse +STR_6558 :Hunter green +STR_6559 :Celadon +STR_6560 :Lime green +STR_6561 :Sepia +STR_6562 :Peach +STR_6563 :Periwinkle +STR_6564 :Viridian +STR_6565 :Seafoam green +STR_6566 :Violet +STR_6567 :Lavender +STR_6568 :Pastel orange +STR_6569 :Deep water +STR_6570 :Pastel pink +STR_6571 :Umber +STR_6572 :Beige +STR_6573 :Invisible +STR_6574 :Void +STR_6575 :Allow special colour schemes +STR_6576 :Adds special colours to colour dropdown + ############# # Scenarios # ################ diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 00b00ef0a6..0d665e1c24 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -1,5 +1,6 @@ 0.4.5 (in development) ------------------------------------------------------------------------ +- Feature: [#19446] Add new color options to color dropdown. - Feature: [#19547] Add large sloped turns to hybrid coaster and single rail coaster. - Feature: [OpenMusic#25] Added Prehistoric ride music style. - Improved: [#18490] Reduce guests walking through trains on level crossing next to station. diff --git a/resources/g2/icons/colour_invisible.png b/resources/g2/icons/colour_invisible.png new file mode 100644 index 0000000000000000000000000000000000000000..e93619f0c6d5222a5fe7064ce63406270e5ca959 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSK$uZf!>a)(sORb87@`rJ%+UC@o&P_3q5(Sx$45`*B`;W3 trZ#P27nb-~$H1u|-Eb~FAt8Z*AwA3ZxW&nn=YcvIJYD@<);T3K0RSmpC;b2b literal 0 HcmV?d00001 diff --git a/resources/g2/icons/colour_invisible_pressed.png b/resources/g2/icons/colour_invisible_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..b9b5fa9fb5c55fb122335d516d022724220f3544 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSK$uZf!>a)(sORb87@`rJ%+Ppxd;Wj+L<4pXj*p(qOJ1<7 sOl{i4E-dk}j)7A_y5U@ULP7!qL$HfQyZV$hT|k`-p00i_>zopr054)EP5=M^ literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_aqua_dark.png b/resources/g2/palette_map/palette_map_aqua_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2cab12a65e31fca57ea2b5c1578918684270cc99 GIT binary patch literal 1506 zcmWlYe{@oH7{h=R7;At7N&^ zL$Uz?xs?@VvjIp+N|2JtO3n687x`_&Ei+D(7EByeU6*~e*9b4h z-)g(G?B>ku%Z6@F_;Eq{#31LPY#D{5(X}n(-0s^`s(6M0>(6Xr6&9va<<}PXy`!a7 zG;Cb?ppV6eYr6}y9o+!1K=q6{NiZNKB_%aAmBnJErKP2(r)OkjAPAC~nVFT9#o_b$ zC@R7*DM837N~zJ%Mx)VUvAJAspRYX}jwceR2uLLWm**&z`D!&!s}q^b5{nggxJZvz z69}3kQ9C9?6p|cT&e1D)3?;B>&?Y11wI~8EI_x*a!uGznPsRnL5NM@(~!k7pqNZ8Ln=;H%`13)4O&1UPlTt*aA_d0AgF_ldALMC zsES~wsL~$Odg4rb!WHWe^}!q=n=R&WWIR406j2h1Mvj}vz1wNOVCd015y!05AYJ0q_G5MF31TjzOIUI_)qV z!UcdvL4y>yWgv_LNB~H4pc#dB9JE)c+!N#S1xMDg)s#ml02vvKr0H}QW%s&2(R3!eG-8Im1R@s6bw#A;qhYt z5`RBPOV2(?Vvt|=>=FU^hU$9X5+M>nelBKUx z%a*TDy|MC5^{Se;=+$f1YSyiPTl>z2jk-;nx9APETaEA5Z8L4(QE%S)-uuk1-Fq57 z*!!Vn-~I#Ek3Md+eRA+q`=QT1cN{)))Oqaq3D?O}Uo@RQbJl(C`~^?*mo46}F8=1b z-1@cu%GGOu>uooJ-+cRB`^{UoL*L)|A^hV{9g(~DI-@`T@@wq3-~Z^k|7Ul+r}wXx fWF>uH6rRds)Ylj{%kCRb?lpE!p}%5!bC` literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_bordeaux_red_dark.png b/resources/g2/palette_map/palette_map_bordeaux_red_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..99f4ee517ba716f97dab42707f62cb645c5eaa4b GIT binary patch literal 1506 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 literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_dark_olive_light.png b/resources/g2/palette_map/palette_map_dark_olive_light.png new file mode 100644 index 0000000000000000000000000000000000000000..70547f4542d05eb831a9c853de1e849e963f5b15 GIT binary patch literal 1506 zcmX|=e{@TC7{L0VCvv0Zc) zWNT)z1wmL5q>~X{5EWBomT725OleAH-I*WX#XmdeJzM`s z=u%XeUkX4%+=7HuR$NnzhFF$o= z_<%EoTcA8`(A-hO+k9>vS0n!2S$7Fo3rG2ud;2tH*EAhpe)YwLoT)pyHEWue8gdI?UR-he zzW8c^F}bEkUfzM#&0UX8dp!HJVfv+#E%wdcs)LixZd)<^US0k4!#Ae2*1W8&s5`mi z!N`U=7mjUA+R-(~wkdDm(XM-^@ayxd{-%1r&hc6MnkO8|%N)_Yq%!T&Qv*B~UEFYf z-i?WA7s}f>q1TzoYgSe)xO39Ol(|d;kD?+B zlM;lSqLdm9Z7>+jW~Y`l%y*E@Hh}gp&9<~%@ z5P+isJRJ})h}g=JIR#3Olny9NVT~=ycwsFr%%H?vtxRZANbD5m)(`;$6*OyF9EPaJ z+!1iV7B4$PED$PCu}X?*3Bp8C7OmE4GI^}lfXfwbY>Y;u5O8TAFe9j)jk&pmU#JRW z#ulY5qIE}^#+WnmBG>`bg>1H%!;$g$giu6DBpNwxB;(6;PE)nd?hJVYv9J`7azsP0 z^(2o`3oSaS!$`O-DxX6i^jIQ6Z!Fddr2r@Z&;Y;y-~hk}Knnt3d~givG|*v#p&%{* zGzzMvz$F7A96$m5SfUrl=9RBs#D1sz1mi- zcRQ*BUPmP4g|V<$E{84vLjb}!3nSN{LsTRn6>Kf-gV55_LO7kM#jNxDF{P4Ft0|q1 zMnwj($Sg%280wLW8gXGn!G|Od>IKk(LYEW<7Bd0#qRp{I~m>H?as;U(UY6it2Zw@rw_mHd;J9c2MiRxKPXo;ct{@l z!O&si;Uh*$MvWdL9XoD3mS6Cptgz@K`GkqZc*&$vV)B%!ifPklC_kP#i<~`YE;Vod z0@WuAKUFU(TTCxmx=gct#Y*j})oXNX*R9u=S8OnBtlVVWyrs&t^|Q~JZQFNLf3fpR z^RC@{EMI+HWBq3Dx3+!XeQ)1?;GpBs;UmtY$9||ie&VF-)af(sx*yMaemeKid!hbk z-^ELp{Z|^U2Cn^bz46A)Tftv%{}%fFPE+{qz2=rb?mvh;{PR)k<0oy=_NUMOkCvU2 a14r6c4NWaQ*(3fKP*hNye`NgZ4gUctE~Huj literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_dull_brown_dark.png b/resources/g2/palette_map/palette_map_dull_brown_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..555333ffd1754f6720fe40bd1c9de409c13e2d8d GIT binary patch literal 1506 zcmWlY4^&fi6vuxs;PFSBg*kNCl&Mpfta$0vX-gk8XvjmJI%w&$p1N$}Gp9})w&B7l zt6o4gbH%b*Q>RX%Tsm^;q)7{BqAXi6gK8$q&}CFAzvemj-19x>-gECc-_QB(E-#af z%p8{q02oQbK~HbXKCLnG8hMfH{EGIx%Bj_L%f^@H-`_E1WJ$f*e)ahcgH+4)tG$PvM(2d| z*9~8toIUMi@op&3obl4U*#mx$j`3&>7Y;me`Nm$bq_d#n)}B3`N9yOh2C0+<-{(z# zlEC+K(7{}CXz!TWRmd#|kn*ox=*H~I2W*I)fFZNf@s7V>Ij>QR8 zFY00CYYnFb%L^vSZg-8&Ouc&l%~R8m6uS1*Ot-uH=`x;S#O5z+Sh=~$RMB@UhPG;H z6%Cu$-Wg)?;l_a+ZO;GzEKpv$Bmo8_B_$;%C$m_rl$4az)YP=JGz3A?)6+9DGB|ub zA4NqNCM5_tMJY8J+GsRdEH;}r#Sz@u`4j1Y1 zY63xXq|c5C5rrg+mUHw99zzLi8no4jc`b^7iw^ru(Xf3e=96&&DFj+6Uxy9QUhKA-%reW`kZY7tQ8NIU<}V zAq6s8sL-PnBhgqfqf_4GA?yLt9aizgT#<|~A%t>DtfVp8gqv)n%}u+5dSAFH7wetXi$hZ1&o0LAN{7)fJ1yAmGwKU_np^8}o39 zfKU~|OnpjwRO^W`U2#|RZfFQ*3E6Bhha=q#D?7Fu;ur-|@bReq;F5OYVLzci@cLauFf@~n>Auju2jda3Tn^m;h5>{L7ACGyhp0$ED%e`u523ZMk8rtAt3?+GU`i#S zR#Q41jf#w7kwuC+G1My;b>YIOf)7a^)C-^$g>ESf${~d3uGBt=z=)E<1xs?qCZaGr z3_$#^J1MDYNP0$Q)`*c0u}3}pNcQMQ$8d7Sj^pNze~dR_Vjh3eiN^shP9Hv**l}%$xtT^qB<PWtJ#Al~@_uvr zn(u7;xBhb--vz$!JRiL9!^N&km%BqhUim5f^DjM-tH1X4{r3AG(QAKR@4s<#AU1gG ic6WDo=)pX(@H4DAW`Iloo$N>$14@d@3Xd*ax#NF546il- literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_dull_brown_light.png b/resources/g2/palette_map/palette_map_dull_brown_light.png new file mode 100644 index 0000000000000000000000000000000000000000..0eb357b2f3f1331483c8abfecf3b2bb09a347e42 GIT binary patch literal 1506 zcmX|=e{@TC7{10F~M8y=DWtwV7OleAH-I*WX#XmdeJD$Jh@KtkMtgj7~sQ;cN=abK|r!%B)UtoPF8^uk4p7XZ+I$NC+k3%z5r>qw$t zM@YZbr*0@a zeRlYOvxQrsJZ;dtQN!DOZXM&+mR&zE_}1gSU`l=7+11#l=3;c6M#nG%qvc7QVc+ z^3HwnwE|;ub@#lygKL^Ij!%C)=Zs;-<&v%TE#AsQlg@2lIpbb!-HanQr?*zWtSGNN zwe!Kq`nea6Z%W#k(Z{wqZ{V?veN*{$`IUcDyub(XFH+?ebFtJRe2!I$4WUpp7DGiqDgn4WU8&4et9e?T$Y_$7Ex6rDx;+|y zz!Yw=VM0V9NvGu;y@JP30;>kCF<>6E!tbO*K4Txg<~TtEteRtgvbvD1jh#17gs zV}34-h+vF_FBk~Dd;o9&NCctTY(1CD2n05Xqz1=*DpgRgZ?#&X$HPT4`BIJu=SfI` zj20^ND8)!L7R=y~SGftBpLB&(JTX@!<4XvkoDwT(j5gv%D`|Dnu7KVfstQEx;SLX5 z3Ni`6Q30L~2pB|c<;a`@rAJB!6sEAo7G=D!1{Y>hVy;#uG$|x@3Uh0SfPo5{H7yQ9 z)MM@lIADvHohcRw6{uJx#k2%rq9}`2>ol1>R%^iJ3O6)FqfrRBG!U2()Xv7-T*5C@ zg)w7`(iYLWqfA508F>-xfayXuTg>6eczi-Aq9hWH95<5jV>+j)%4c_myn$F)3P?Gk zA=rA7$EbxCoz!6@+!mG3p$~d2k)SsgYlTt(6aZ)dU;uCc-~*rq0Wdx|26Ym^tE?vrSa2taz?MV zRq5T1s({xK33*{GESAfm3&0S7FwVlrHRuo(2}lK7OZyg#kH)@Y0>~Hx=kyls|4tR`+-nUcUw) z_Sf^IeQ(AiGE^o0j-hL;u>$}}JS>1bZvwQa9_3o3y@B3aqLH_{*h3^l_6%8Je zhkh`0n0WYzk&;oP$4JMH8;|7|d?+g{`ba)uVliGaX)-Zo>NLgl88ek1&zeonnLCe~ zzhI&2lSQAZ7nd%fmo8hbS+R1JcJ-RIx^?R}=*!AC8a7pIHg4HkY1;PL=gjsUJFC9f z^`&|Dp1qc@zOJ@@v+rBm{_noGA2@i(arnql=dt5I)SNhZ%60n8S$FM^=R7~1f9Snf z_p|TPz>% literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_dull_green_dark.png b/resources/g2/palette_map/palette_map_dull_green_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc210040813a5b5a34b9ed761d5e957a81a0976 GIT binary patch literal 1506 zcmWlYe{@S{7{}i>ZEv+Kwwjcbl$apX&^v;#;I>P<&|5Boj9V@;i@FGcAg!p-n2WL? zTQiF-2*QdWos8&$sF)(NOhY?jO4G`$JM-gRob#OLeE)hr=RBYD-BMg6>yp+p4FJ%k zupni?5onkD@kLQYo7*w=uiA@#OOBFE90(wzFH4rfI1mr{LA)6?Y$s zujd<+t9#_;9$MYh^~Ch2C1(vYt`u*vZ}wImo^*cuiWv`T>t-CiHNB79>8 z)z7(fVq?IaF0b+*s`r~dK5IYogk!mxBfA$@q+Mw@zzfmE^%v*e znwWN}td$dblbO6`W%+`8r#(!mdv)T!)^g#|XU^eed-0nsrGwWdbza2c1WPA2vU0R# z7X-6%`^la+bW2OV|9b2Bfk+ZvetwwCb?4(EURmcAr`EEvvJ$EMtFt>+X=xP=s~5iL zVDaIy)=X_INYZIJN3Y;9l)$P%YYdpjtnfSOkk1$i**cszc==<#sT48D{j!g&%>Aftr} zJxVbWjRi9}hWoL*5LIo;TNii)!m?+Ak)jCZkkJTD*xxx(%(P$I`E)4``1humR4L?Qtg zXK_^k)ul@r4sPR-E&&~qFj1u=rge9i{V!c%7>o)sfS8BKL~Ny$rzTLHO3vujwko~b zQ5EnyA|Wq~g~f6?bO9Iw5XM~?xdt7gA_1vjYiS>ZmgZ){=|nANo!^fsm4sSN>2x$I zGKfWHDeAybk6hG%3nL0XBzaITfEEP4lC=_N~-X_l{8sa>^tjc)C__4=~%4Tg;sn~a;cRGPMaxsBPrV`tT_-Cvpa z?A>Si`kQL&xBI`d9r*qS`@utp9Y>BHa~?nOW6jA^r(I{xo^#j!bl&sxg~#4Yb-(y7 zU%BePR)0Nk#02!}lLFHUIhWQRMMoPg7j+Q?L0VCvv0d6( zkgb`;76f5MkWNNa5EWBomT725OleAH-I*WX#XmdeIq!M?dY^Ni&v~{K7shFFSd9 z#K6-9TcA8`@VwC@+I(&uzQ!;DMCTkM;?l?NuB*|uWFy}J4thi*)7t$A5dUU#DE z!KjA0=Z|hos_NRuwkdbek*<5D^6T>||E7As?&GueGfz02n>n(3aYfptrv`X7y13!o z{2LR~&X=`uLa#HE*Q_jGc;|$NDRr+-{Kr}@JoLmlylfYKy|r}k+N92lSe#(##3ojb zw(P86R&GDpv&L>|$#-9EJu?tVqRY<=bGdGPSi~#qyyEy;R#sLbm4A75$0{wYqG3(R z^9~jtE^EuwHnjo30>u-i#KC}sgoMPzL>7ycl$4a5oSc%9f*?q0YHFuWoj80xA4NqN zCM5_tMJY8J+F&r4%~q$=<@Gj(LeW?Z6#=OP;PP~(GDEHAX>}r_Nn*C(b|>lfX#4?F zxW$GE5rrh3mUHw99zzMN8no7cdCUsGlMeZek&vw;>XmT;DFj+6UHIU<}VAq6s8 zsL-PnBhgqegF{~JCTxDv6;koUT#<|~A%t>DtfVp8h#Re>)kV7kdT*#Y5V40lJZve* zAOJ@Ncsd|p5V4gba|)CmDIHLl!WvtY@xoeMm_doTTA9$Kkk~2Atsw#iDrnZUI1Evb zxg+3!EnaqpSRhoOVwDur5`>AOELyG8Wb#<80hcS>*cgpQA>h(LU`9|o8*_6Bzfcv% zj4euAMC*<+jWK8BMX&>=3)yTjha=q#D?7Fu*thmmkwR6d73=&?kC-dL;^N&!#+paFmZzyW{{fEEP6xNr>WG|*v#p&%{* zGzzMvz$F7A96$m z!LZ@t5hF)QMvwVWI(FQ6EHD2fSwZ2)@(B}*@Zw36i78X3DW=busr+QtY;w-rdDQ#` z3ss+%e5PJhx|m+FbeU%Pij~?`tJmn(u3N7!E8k$)Sh2~tc}t~f>*rrE+qPF#f4So; z^UhtnEnk0AWBqo|cecIX|6t#@|A6D*p~KE2M}Mq6cKn3vCY>e+&J7rzw2*UUSPI_a8(a{`si&@sqY_`_pItN9^3S Z3(jv`caz+E!5c3I6y_J@9Uebt!++^;tXu#9 literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_dull_purple_light.png b/resources/g2/palette_map/palette_map_dull_purple_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c162fa67d3e205c36d73017e03c7b06e9de63d GIT binary patch literal 1506 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 LmWJL}H+K9BO_A=Z literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_bordeaux_red_dark.png b/resources/g2/palette_map/palette_map_glass_bordeaux_red_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb489ab96635f13f71ae30c0124bd30ecd5c5df GIT binary patch literal 1505 zcmds$|8Em@7{{M&Y_~5gopxBH(*k9lq{Ko_tZ;4z+(ubCxv_&Z(8&Q8){tV3tzbur zsiP)kYvdR;R%v3zs#UAhFtEzSG+3~Z{&2`*8aPO28Z3s825W5C$UYW+@^A2+Cr{o# zJx^ZGJI`3(W^;4nqDBB{?%CAU4^UOHP*q=3>2#-u+$Q&BkxnemF2w`}(4jts3*i^V8Gm zJ-=PNyxodf*S9=^p+iIc2Pd9J!PXs@Mh@H(UFGLpML4~4@ar3^8ooTWcNxEBRp5;U z($3%0^)su+k6r5R_;^Qe%6a5=DxH;9%71m13wO5-zff~z>4UbZX8(wHWN_;GnxY!p zzNP<|JciG|u=s&KyEmA7Rnzv&$l$e2cwx+YY0v5R?z}SCO}8I!@wIM?99fb-`}1M{ z3E|LAzwRI}#I_REJ(rH<`x7+SV?!^Q>e@9$pH8{0TOw(P#S;}LzFTL02V1MMq^ zSA0^v;A9>{-rVg|5C2?lTHaE-mfJte&%b-KcF}5OuJil*zcfsH>du_|AlZ)%Qa$nW z=dL|W5oZb>V|oPqbZS*eiw6GBNYTij@bN{{H62pH`QLX5h20Vt2ID z(=7{)eg9lYOOoQAE%#0)b+_k+ufH|9D*;dgeZ5;Nxjh1H*Xs=i!|`|`m6}qNVyQ$Jfg*viG}&xwhePLb z8-0E<7-FJvPD(m6vOkxP&<4y(HVGDu$Ep)~JnSSUy>v2Y&BO&I?JFpeaxrDr0%rgh z1tN<@1uW@TWuxj+MvDqYRN~OAh)_xozyNR%tyaYG2uV&dOxkYGdOY{SVU$d2 z3ALWm7#SVO;by^L^$@&BIzzNKW(i1aB*P^XyUwIFn)M`Wu<$0EKnp&`7v{nVAt8HG zN=f-{SwGK*T&}p^pA3iPL?SmeRV)?}Xa&H77!g&` zl9tUF>^a((w?zsrsVGjB;)U6488sPHDw9TI*6CS;kta!~h4FEfVeYs;kdDTclw8VD zz*#UStMYI<(P0R=shE$ILiTjblTC&S*;J`?4^aSC04IP55Ccd9>{ppatG7Av`=axgQS$f0ZzSA$81nT;wNrE{=^+inp(j!3{G z#R76FR!~x?lrvc@C;>E7IRX2Y(d{{r2$U=aWS literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_bordeaux_red_light.png b/resources/g2/palette_map/palette_map_glass_bordeaux_red_light.png new file mode 100644 index 0000000000000000000000000000000000000000..8fcf11335f9da4892b6c1d41da69ddd0b46cd04f GIT binary patch literal 1505 zcmds$|8Em@7{{M&Y_~5gopxBH(*k9lq{Ko_tgMV<+)7zGxv_&Z(8&Q8){tV3tzbur zsZf)$HFAy`t2D7g&88aPO28ZCy925W5C$UYW+@^A3TlPB+= zo+q#8o%i^_W^-%vqGkYS?c3Bl2vAd%P}5jfoejQsO;!EgK8hOXqo~CPM)~1=`}YF8 zJo(OK_awpp|^eMR=nkNQ^%JRrtb%CH-Fdl@z6~D8;ef1tIU@#Oi!ox z{CfH7b}MG>X?qMKheieuPCko*?K`fF9k?U7DlfW9aC+zPH@8+beRXQ@GH%PNz?%z_ zJAX?z&a9d^ex<+r(;fYy^T=H>olCBi{#sWl-rF|%Qr(fI4?D80{xR>^aQ5b!k`mj# zW$?H(j?cfe_@OqpH<*82)$!ce@QqD)aol@l&*}Gne{I-Ab)IPRwQq|YSyDLn^I`wg zj_|c$^$Kbe|zz#)s>MM_~Pr>@9OF4 zwuSnEe=enyN!dMH>7Pnz?#_+ge0yqF0-z2C`nOhnfts3{+S=N>y1IGu=GE8NH#9V0 z7}nU>*woad(rUE?p{FR4VJsYHb2@pi*BcCmetO zKEE*-qN8y(nQ~?%f4&f*bePrH!dp}xt484Pu#=ebQmLRd6X)f$uP8?k7 z4oJmlzLHXqpkzR02aOwW0W*YE<~VLkk-TK}=be#~AfhQ+r{oN3ms#hx8lxPQbTX2c z%LScy39h^T@} zs+o+=o~L{TTcqepmV|6MUYyNUP>W8XFsM{!jh4~rIit~Op?z$1nLF+eq@!_Jl*)M$ zSPSN46dqP1ICLR58S^p8kUbsq`_t^|VyGwT&LQsZCY${uk~jb8)@$%<@22^)b+A+T43~!>(ih0y$A* AJpcdz literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_dark_olive_dark.png b/resources/g2/palette_map/palette_map_glass_dark_olive_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8f8e3a9f462ca9f725212d8f3fcdb45b5291fd GIT binary patch literal 1505 zcmds$;cpXl7{{M&Y`3i}op$VCofatbBqbJdVr9)Z;Woaxxtq}m4dN+3u08~{ZRMpp1W}Wxlo{D~NA5Hi7()7{;qr&jM{d)mk zoP1}pYqRuP`xTDunVdNGTzAXzZG__Up7t*%dVc7?)%bnq$3wHVueY6S!A+OW&&;Iu z{C4Te4hv@4(EJ!i4vh>PoO~7qTLv$W9k}gxmY;VP;q=boZ*Q(?`1;h|75vsUfj1T< zcK)8KpItL?{BmE{r-OZx};!no)1p40E&ePy_Z?l{rxZP^|`-zNw_<&iv?&x2JZA05#Cxx2@s}R8>_~S6A26)GS!AptiQQuC5Nl zu=@J?hK2@QtJRXEo~9|5HS@gH;Sf9?PcRsc$3;n+mgQopMCySu0%KNKttz`+<88~fWt6BsdTH=eu9V?jZ+Mhve~k3_x*4fC6j7W zrKNB^qcL)XNzhr`B=0vmLbNAl4kXw}niFN4#-P@lv_@8E<_%VX7QBo%%!Nfk%(x{v zkSRoS<)o4V6$`ixG%g_gm?4at;)FFx2^oto=ZF;j5}IOkD&C-Wnsh#kG0M{k2b=Nm z*`OmI^AwZ8awdlIl2TBf z)NER3%hBGvHBxXUivHG~l>Nqh)n^-e`1~8825^=8F3Qsc2l5GNl{^ zoEdYlN;jwR+jSuq74x!*kS!H+XOp2qRw|Y5BMQI*-~jLg!~jwNc??jc85+49C>B9- zmLWhOAwYp>0+|8C0upfKBTmrEe^ z9)mtekujP~n)TC+u3*t3PJ`S83Xw>pP{xc9x_a~IlL##A?cT6$@sdgu=I5ccv$M1D zX|=Yt;`rhvZEfoI_WzT{D?m@lo}yI<{|k5Y&4DG_V}q)TmB&DD&z9~p8+RT17dw2}+R{eKf9}Ue`zt(!HS!KF(VP+<^ z=eJ8&wp%dE`liP)a(HC$(B!iy(7faF*umR^v$WJ%fHOOXzqz@(?yJ*#mvdWI`(Iy_ z*!g>^c6Rl|iOc=npX}%t9Y^nosZ3&(^w+vl{@%9H=c|q`d)PMJ=o|Bl4Nu=#TTo)# zw+x<;#_@$0+aGE(djr{5RBg|V4PW1c=f^#l_ndj}?#siyROiViZ}YbB(T?1?Uyk^u zcAP!;NB5(Ks(5+|Hx3QOUpk`r@peT`=+L$I+pf{f)%>v%G5h7pRRYqw#?#z$gcw=f;9H0sY`nQ&Sfr^TX%F4>Bs;UJG7F1VP*VNQt z7*<yT>Z(a_U3Zh93tPY$c z2n-hCv7}Fti71O{HOlKzkwtR?LZTLc24FFaS18z4Y8p(AD7&s z?3eP9Y$>TALCJv11{xRO0%i!QOflS=Bzei=%R0gZK}1uuPRSY6PLs}OF-ABl;b0^W zmkBs>QBNTmC`nP26BSAWuCovZ8%a4C#>a6%r!(gBB|{-89?wos7YYRgY98Gd;|*9C~ik-FOtLX#CQXkDX`F(om07;I=^6wgtEq**^r>+%*YVl~K(qacCeB$CVsp{qBKJ&C}=zMl14TNan2Fh371U0q%E zPpf5dtGaE;QcZh%N5}t3tII%7$)2K>3I7Xs?Cpsqt~U?V-YP!^`g%9_oZYbN_`kL& BK@$J~ literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_dull_brown_dark.png b/resources/g2/palette_map/palette_map_glass_dull_brown_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8b03e76b5a304939670c99fbdb0902dc980f00c7 GIT binary patch literal 1505 zcmds$|8Em@7{{M&Y_~5gopxBH(*k9lq=Z6FtgIO)+(ubCxv_&Z(8&Q8){tV3tw2YL zsZf)$HF}O3i!`xf)v6V07HMZ=vi@w_slJ)&*A|^@R+%neoSshY z`StSE?H0_kzUdJR92)37IQldSH1D`FbYMzwmY#PO;LOhcuWqfb`{MN8W!#q4{?`}8 zcmAHLomo9{;!1b>M?1Qcj-$7esZ4y8^w+vl{_eKH7pjgfeb6%A=o|73^^f0NTTo)# zxAdNnhVl8A7C+Et_6D-As9K&G>c6oG&kuX9>^bw!otOJNsn&O!yv^IfN0;Qz|9HeV zw&UFSKiVHQRIPoZ_3EM1$rHQl29_<}uyH}_`@5HPM>mcPFS~DQe?+}Yu3!0KU+b#D z6(3hFIGMwcCwu$!!#|fBmN!+mvHNGa`FAI)7p;-!)_r^br@Co(&AAI7Bzm!avMYA+ z!i}eHh>d-H;!8&q-%VB2gbrSRujM+;T+1IT5i_5!SaqP`@2|iAVNGdZ20r~VdPhAy z-Lz2O^UtMJJTALtOWk7$&F#6tn}^4Ci2zm5)4jFq3sh88R9042RaMQKH?O+7x~8TE z!?4=g+Pb|4f^;Ot#uJXT6Fcual7w@LMV|? z6G|H0wpPma!G~Kfa@%T!A4R}hVgM+(CLi%e2Gv<62dqvB`Ao7{yoX2t3xESa0Ehyl0CE_ha?=!YIZ!l= zzI5vxIN90ds^l1MTmgs$B>_BaCbyE@iyUHEJ{3UhNX(bm>h z|D+}+CNi1dZcR?gQ&ayZohbu7A$x*WCj2klv6ZKO3IBZf?EUg%psRCp$GHu=j{ggk C2KMRz literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_dull_brown_light.png b/resources/g2/palette_map/palette_map_glass_dull_brown_light.png new file mode 100644 index 0000000000000000000000000000000000000000..6fa0172f9e0ccb2d88c6b20d36bf294f61171b27 GIT binary patch literal 1505 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 A7ytkO literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_dull_green_light.png b/resources/g2/palette_map/palette_map_glass_dull_green_light.png new file mode 100644 index 0000000000000000000000000000000000000000..813df4cd93db7b3d690a039e54971384286fdbc2 GIT binary patch literal 1505 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 KWB+TLyZ!|-1bcq~ literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_grass_green_light.png b/resources/g2/palette_map/palette_map_glass_grass_green_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d6587dd8c510f162781a9fdc244f173517dd280c GIT binary patch literal 1505 zcmds$|8Em@7{{M&Y_~5gopxBH(*k9lq{Ko_tgIO)+(tKVaN7>jKqm)WSVM|Awt^ig zrb121XyhCDtR$UYW+@^A3TlPB+= zo+q#8o%eYECQEbUqDBB{?(OLs1gNS=sH(52%sSsY-4*@r9*XMkrKrXGMup)$dv^o8 zIPvyGXHV+2w#yvbJ#p;Fb6u@VH{(s8b+?^9*8N@o&Bkv#J{p>--MHvPtHyHi{Pc8s z*RK~ZZ?$69buEuzdu_|Fgb_~lfCit z=dL|h1H*Xs=i!|}M3N=+$Bu~Z_AK$?M}n`}0nW*9BvT|Ru938W@m`<#^^wTjbu1UvFl7)qeX9K4K#1E36$Vtd|@su36ktd zDFL|<&6SfX64Wec?4WZ4E@Gyz#uCSENm7ul{+u&X6jNxDF{pWy)@3pHt>!3CC7i76 z<+DL&KISbZgJn5}@+pVgU&n1 zL@XeuVg)6IN;wlvBMFcK2vxlBX}xaD&H-mtxr8)Ap?sc=$B9tToykx(8|!fJZnr=f zy(VLjBw`eiq>WRIpP(81*4uFib1sS)IcHwxY$|Eo(1Ybg9w01lYT@@uTyT^FHWUSxPUMY+W+kyYzA(w|{cmw(gpW z-HU7d+D(`Ifv~qc^vBFp{QAP?@mZV3-6`oUFt-?68hg)8PjHb%3+lFoT1CT7jJYEW zue3#{@k&OtH1^CB#aoTtEB3yAb!uZ3Ubel^RJ72!X>9D!7aPr8i#rcptGJt=HGNIl z>Gd7{ZOikTO2^EZJG|`8x1`Yi{gcYq=KuNe@sm?hP5t1#58YS!eSL)^CAEK_2zb2_{XnXw z%O|)r*nDn7*D@A>EKplhpXLHGGBPqVGqbX?h71{!ot>SNlY<~gZf<6r!jE z$1##r(6macWsF9n&F1iUSiiqF5=kVJs03g#Kq&H6Dy~K&(CH;6v&?2ETpr5n(*{H4 zXv~R=5v44jQSb~(frS=1v}l(R_t}&|4-*NP;t^*m;g|CPB?dYSSV+XhAU-oE?BXVa zd>EI&Bn1a75c-7x5CBjJ!f-eSKHnk|Ic2ggf(WS9VT0kO!vTFhKFSqhJP9F?Q6f1b zRvJ*+BGcM&qg!G1lFlH-M$`f+Um_RENU?&Jsu-Lx5he%aU>P=K@JFnnxGS3SaWKFo z0Z$DCdLXhOQU_1&5vhC_6H=O^T4%!Ihh2o2OH27Wx!A0fxoF(0B|}C!Y}3Zv#)Qw7 z3b|p-&*4f%VkIh7W4Mka%`|P-={#n$&*2EMY_zvGkw`$mXMo6tpe_#X<�NI*OZO zDra2hO;~!9p7=mG1@pxmj+Dof3xuRtLd#@Y1!1Dn$MhbvHQ@3@{GntN1C#>Mk{kmi zuxP|~J?1u%Ub{NrHiUilc-Wsz-h>zcN&vI~SO9PX5C9;C0GJ*Ehk7k^J7FYDhya5E zD+X9Oh!6mh05UviMxm2{tOf>6FyaLNgO>sY4wM96yE;;w`lkX-pEnK{E`Pp3&xBcCoC-+FPbp%A@QV#ACZ(#eiVId%2esJ z=`&=HSIop_&7Ol-R?U^qtA0XJ^W=P@c0nCkzwjyL(~B0X8kQ`jmMvdFKeMt?{p_me zG^^J<&#Y}~)~;K>LD#bJ1^uSYFB)Fjveo$VE3cZiwYHgGdwsj*jrJYZH{W{OwsTj9 z{hfDrJNE3|=X~$|{jLu_{K)jcKn3*)03b1K0kHc-+lVaz?rjO z1;760+fdJU=X$^Y;m7b#=PyJqUivxOclk=}m#f#}*KhoK^VaR(62IU1Bl+iFf2aPr e+dpvc-$BTV4X!J*R^LiL22@wguk4(&Z0molC!|;a literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_magenta_light.png b/resources/g2/palette_map/palette_map_glass_magenta_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d20efb566fec5006980afe6e36005770e1ca9566 GIT binary patch literal 1505 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 Bdf)&6 literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_orange_light.png b/resources/g2/palette_map/palette_map_glass_orange_light.png new file mode 100644 index 0000000000000000000000000000000000000000..06852243cbd32658548fa680cbd568ec53b2f346 GIT binary patch literal 1505 zcmds$|8Em@7{{M&Y_~5gopxBH(*k9jq{Ko_tgIO)+(ubCxv_&Z(8&Q8){tV3tzbur zsiP)kYov^-Rhn3^YSk(=Y;Zs!4IWrXe>lQo8aPO28Z3s825W5C$UYW+@^A3TlPB+= zo+q#8o%cx3MpI+`f_eaG?Ap-L3s6y(P*Gb|o;BVNJInf`Jrvc`MNtd)4f6ea_U;CF zZR~@w_6_3OE!SA4b8PhRD;>>?H{%Uob+&vn+WB+Oo%)~JKJS~ZerLh)W|is6*{P}2 zuHUX)+iJlqYnz_Jz=46@{bMhpVDq-CL;LRfouyZu1vs_6|A*Tv>%Kd&dkME`W#HX; ziS56qYNuC@9=Y1x{^hoA(Q)XWn93wpNPn#<Vgv6 zx~cbwG=k5)xbU$yvpbl5OV#qyQ2)&hcz(olb=Rqn@4wmKNwpqr@-}aY99on+^UFcs z__ot${%C*FP__EK)@uh&h(~tT4J=u>ZvDL0Pj)Wqj;$XZS@Ou#{**dOu6_NBzSb3k z%THF$JD$UkCwuS2lRuXkmNiwkv3qB@xexACFIXkdt~vMU*SaZp&FP8HlD$|z*%d!K zar1?nLStW_@Ww&K`MVW0;r%y`wcMbY>-pglG5ziG75f_g{_(=)Ri%Mx`1A*45Riv|24e=qZY17&FIN9S+{(@dSh6cw7+0Nm(uwi-aCXBhcmst5s>YYn(2< z*Jlid=xCfxBpqqVm(4{e9cD2$@Me|UqVaQh*g=eYsASNRj`MQLo0lV{f@o3$s{;e3xxs#H4k_YBcci_ zp=Q!LTbAMQ}^Rm%ju*QncL@Ah_5wa*#z?ERoU?#o7N^0y3;j)?iZhIu) zPQ(I|7|Y8dDrOC4GZFyFfKb^BuiE3nY%H)Ag_BPq6w2k8c$^3YUFkGswK8@)=W_9c z-eb@QNg_rONwa>E*5xf)#A=WmM_+Myh B*OUMN literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_saturated_brown_light.png b/resources/g2/palette_map/palette_map_glass_saturated_brown_light.png new file mode 100644 index 0000000000000000000000000000000000000000..5f9e5b26c2c5116bc5b19b324fba27e99eb51735 GIT binary patch literal 1505 zcmds$;cpXl7{{NjY`3i}opxAUrvG^ z=gH^!<~u&H$<)};(f|OBeH(iQ0jeqzs_JBwS?hhTx1!(QOHl)T6t!gkC_lV+-yVP! zlkZM;Z%n??dYNTPayZ2s`a_C;cFZ5!no(s?o%J!d3Cs#YCqoOZQdF_yflCI*F(Ok z?Pt#Z+5Jc^Tl;qV<%1`a$9C0^v@Kb`VNv@>yO#DxH%yGT-8XeVrjC>AUjB5bebs2^ z=hcf&bXe#TvU=G@1LL2Q`pi=97r z?U`$0S~!xwqU`6nwpy0+FA_5 z>gww1>+4lot(GA46h$(Ond7Vu2k-HC0)bF0CMJ{9*=(^?BJ@BSfi}ynR;Aspak}(g zpD_@mBQZ9faHJ()E+3|Jn8hgP%__G=BXD@gK}>n5M8J}c@!6EOkPVlMNs}5_9XLr4 z7%akL37;YpQI^tbRM4Xmi{=D`l3D;7fWV6!0*;4`#wnUk*=!lN`(7x75(zb- z)RHPatueB=iPu@&1Sc3BLCO;~`{PVF&5Bu@#-P@lv_?i}<_uPz;=Qyt#D+v(l-$Xz zUn)d$<%EI+B?BrOXk35`m?5Mx#c*qatB$}diO3t8mnsh#kF~U)C2P1j7 zOu&(kdWwlaS&E{3QlT{9ItyX2k(85Rd>j{aI%7UxA{3HDF*iM3EEW-{dB6i05m8Wa zHIvraa+Ei34Hum8qA*>G73MN!B-bev29?UB(K0$cXEZv@w3n?cbH#lAR3w&7N~IhL ztQm7K3OB0}?7E-~bQ+q5vs?JO-%JG=*Fa6b++n zhQ@&>z)yl`f-DV)0mQ42k3eA>iFTCsqHGwR7;gYG1r{2!b1Jt}=NC+oFc*(|Bq>@b zNT_m4Z3Dt3Cj}K9*03VZXN^M98Z9~Fp4UTrQr_ zdkp#jNkl0kVb)L6x`IWESPgRHC`cfYM3NaHbmhj8ClOfK*RyWR;^!+-n4gEXuCA_z zr`6WJ9ADA#lCHCJ<;wq)#w$Qi$)2KB2>%Orq~&3U?DTAGZ{;!2*So3b%=(>2{{=w@ BO)CHZ literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_saturated_green_light.png b/resources/g2/palette_map/palette_map_glass_saturated_green_light.png new file mode 100644 index 0000000000000000000000000000000000000000..1e01238e47bfee3c63a0040c27c9b2e7ff5bbed8 GIT binary patch literal 1505 zcmds$|8Em@7{{M&Y_~5gopxBH(*k84q-Y^0R@RIYZlf%n+}J@H=;X%Ett`bHTfvSL zQ=ukhYvdd?R%v3zs#OoEVc;o^Y4E^8`a=neX`qnKG*}EF4c6GOk$o)u{568r@Ojk$Kl&@A{|?k`fEcee|N{|3sr}gKWLe5^o@DOhNiEtFDS8{ z+j@_s#_@$0mOjv?2LstxRV~kq4PD!U=f^#l22Q@E zcAYuBs;UJG7F1VP*VNQt z7*<4>tJRHM8e6DHX5gBI$^V=-R^s#5Q@ju zgi=eY^t8sv;wD~aaTA`Zkj?a2NJ_5 zlcsUt3GkC3nIJ<0VgT_fWTA z=ToSBOKk(f)j$d=I;>$OoX;4Af>kU!W2HcHPRgQm0at=SgPHUSE2*(Fgv(|Y-1e~F z9TWX2SO-`3Vv z|D^i&3~+A_4%znZ9UlHaX|4?PgzO1gnee}GM^@e)5Kl8N-YGu@x;nRZoY~ZW^k3Bs BhX?=w literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_saturated_purple_dark.png b/resources/g2/palette_map/palette_map_glass_saturated_purple_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c4fdf3d690fd17b47948a8c57eb1c336e0d674 GIT binary patch literal 1505 zcmds$|8Em@7{{M&Y_~5gopxBH!w$+kNr{D=SXnbpxQ()Oa$^T+ppyeGtRcl5TfvSL zQ=yu&HFAy`E2~nVYSk(=3_PVV4IZWgpMM>_tDc^2 zTBz^+=Tb5rmtC`^o{5C!&fL(Awue!RrrltnN zu-e+%y1F`*R;wilJw=fWW9B%k!@+wzo&qWpiOlhgpmbyjkV8Xao)qIfw}ll?Yf;FJjH zV6X^}C47oZL|II!QC^RVESeP%lC%Ic0E=O~Lg7}c1so3>jT1DTwAnIl_x(@^B@${v zsU=l#-P@lv_?i}<_uPz;=Qyt#D+v(OuHr7 zpUy|JrG$b6B?BrOXk35`m?5Mx#c*qak))6iU5}KfOO3t8mnsh#kF~U)C2b1=2 znSdh~^%N3;QaXxql0s>~br!;4BPl1t_&6@;bjEzXL@1ON#q88np-@1e<^d02L_|Tw z)l5of%TnH)HJo?G3&K<}mY>a(P=ijPFsM`}jh4~rIit~GroC)=nJeb=CnGUgN*A*v zux8A`DBP?@u@GU{dGL0dBF&Lo2Qj8rV%Mlm` zhQ@&>z)yl`0+|NH0OD21N1!l`L_11(ksO96#v8y)frZBGoXYLg`2|xX%*ErLbUK>P zr&0Nq+6IKHffQ79Si_1qFB^q|HClAWOM%p^m_?Zat^|VyGwBspQe$Tbm(47=?P0$= z9`&cCXkM03F>5fJkqAfzgvwrc)gBjSV}Z3OoO}|YU@phRVni_DN~I{Pm9g77my0L# z9)mtW5>bjsnDtY%E^pByR)gF)3KB>pQQC|Ux_a}-lL*Z3?p(KJ;q&Dv%+0}gdwYBR z(;6Qi4}SXDsnF>&XT$#|9V`PqC3}iiCj2klkyG!VtXZr%F1zKSY{jgro1enqzQMk|V=tm$%a*Idd+rLZ@~f^QoZ33@&Fy6kUme@Ih}*C%@a~+% z*56b0Q_DsVU+w8Qv86|H9=Io^GKr<~U#rT62b+dot2wanaqC2rf7m-bFmY>TQH5>Z z(05oK!DnBd|5%sV8O*(r^BD5x?j3vb=VIgH=Gu04_cS;A!JXQ9%d<19et7h2!=$I~{Ke0beb@lm9lvz( z<_kB)rv85M&Hc(B?^e}?_ulxV^#;vcFB~irQ|Fc}-J|&X+n;`3ULKr+GhfHEyj$Z!j2+$3;n+$YzVB5@7(+1hhqAv#A^ot;=oj z`AxwP9gVYzq%$r1bNL9R$E+p=Z&7=!T7kpEPGa0kC4<&0l;l*}4n_242w zV6Z5UCH=}wR8>lAP{DvoESeS&l5_wx0E=O~Qt8oX1RRf;Oye}2vfDEr&%r9N^!WnHm#rtSqm<@}(D0`%A zKrTdc<)o4X6$5HJXx)Gdm@%w2$8lSdOdlaak# zCg{w^yv1a&EXPn@QmTx&-bxtlB;{flKgWe!uDIWy42NY=%uP%bi$w$)9`GPWM3q!R z!=&~09OcW~A_Z5XC`^>%h3QNgDfCLEQLQ#>b&TG?nM_U#?PDv;+;M*(6^&;lxs)S; zwO~$0>0z~kLmzUJF&~o%*;6r3CK)PZq*Cc2A_1%bP5=QQ29N^CV}L46Q^@T^u?Wg$ zXdHL~0wjoL$kKoqK)f3H2^67`=s;;7%0}Rs@kX#vV5Kn!r}nt?0l^%NaEXLhmScs2 zj4HP@b|BmeQc%+oEi2-D)+7{dv63rM4yLEY9Lf}N6&SUc*`TzMS_eb8?H0k~hy*-| zSU{Fyg{*{1IitmbL_k?UsN#iB<8@9#%yLrOk zH5!5>5u=Et#V|qZ3sxOswa9~`5P?Jz$rgmr_1g!ZMPPP!=jx4fU#>)9W(JP8x3@Pw zuj5~y2%kK4I&$XB*|YyA9j*X9Cwq=oA^b1g!4-FpGuS!P^~z(QyK8;t`8C@P{R>>P Bz%u{< literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_tan_dark.png b/resources/g2/palette_map/palette_map_glass_tan_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..10f986e486b8ff403a85d0f7b7371ae68a5316e5 GIT binary patch literal 1505 zcmds$|8Em@7{@=|x7!!6mgE6l7RMWzh;@!%)_2A@26^8V?0 z@_OFSbD+J=G`;reS^&WG)|RH%0gy=&$g0bwTIJr`Ea`pQaJ;=0$LH?Y$!y)W{cQl| z_wDIh(UMs8%qV63ynZIa_4aN#-Ztyl!KJUv^lUtOdghzE7JqxU?$a0NH7q*RZ66-y zN5AAeg9A?tbkF@;Hgzg1db#Js*37)mIzH(;m>k*O zxo+CI`n|7J_ik?A{Kb(L{ni`H&Q09RjlZ?ewmUGz-fh_Jm96ai;Lxr8&1Y6GAKZ59 z@Z^EYH~OC%W5;T^MJ*35?7I4!;c~P4;c{~Ek`uc(cdcLe{;6xjUu`))k{;RA{PX;5 zVAqD5XGS-iyt01$$b+7vXNLNJZ@l#6$k+QS`e!^B+`nYOsToJtX-1n4-lLx_ZAu2_ z`PK|9nZ0aQdr$2TcQ`m)=)CmZ+AFWtj_#dMily1*-LX}JonkgQ^y_k2nQ;E&U+!5{ z=l|5+`fF&`%Ch^>F3YK4qB;GV%6IP9Ro-~`;kgE6+O@K?_D<&Hp2I7_ zoZB7$R4rXv@xAAxvlDkFj$FQ8T9Lk8KrXiJyx7zJ6AwT+XkW8d@&(9bva+(W^78VE zii*n0%Brd=1VO5+t7~d%lp2i&MfEt2k))ZXtt`uM9Ov@|B9Uk!kru^5v54vcW(0(} z&T3WI?P`Zp@Aepdej*g1VsSPlc(S=5u0t%wI>xMYS=2nO4Y24ShsS-ERD=7y5cf?AVVFzE6$Y)&f*NcX?jT7IP5T{=h{qET1cYcbn@$%B z1qf6O(E1QGB*$YaGNrR+ad*xd%sXNQK3$CDr!teUPA8WeluDCYL+bRj(a4$!HzhT5 zMm*kRC?Y0=Vip6G8DUAei&FD;o!^Ot-DJ#fONL#UxIdps6pP~!1Hb|R3xIS3VE~c< z{X=3Vxn*A)wUg+w?nCSWmZFq>f%KoLMFdEr)ZPQ*q5$|83#NeKP992tqA zexEay!mU=)Zl|422Gw&0y$?gfI2t$W(}XT>(LhQKU0UczVHAUc8A5pBYS*I|nAX~~ zdhP5v(kqloprf&|vG#FvNMYapZYQ(jy`BFnEg?N7dyFO_{uiz*o$jdDFWk65S`27y LZfhENX=C@lsPCNN literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_tan_light.png b/resources/g2/palette_map/palette_map_glass_tan_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d302aaa547beb99fc4834c981800567d2808cfe1 GIT binary patch literal 1505 zcmds$|8Em@7{{M&Y_~5gopxBH(*k8yQeq(|R@RIYZlf%n+}J@H=;VM4Ye)yTt(zSw zrb121*2pnxtkT4aRjXF1Vc;o^Y4DhZ^oJuXrh$WWromzeX|TqIjqGFLC;tYYJbCi| z>3Qq z<;iy@+qa5uv`jN}=j6ok7do0(?$9-S*4gsKMCbQCx9Y!Z`>1cO`psphn^oq^7iVWv z`+vJUy~~POH#I$mq0yn938Y{JovSFI62~`LJcC(Ld%L>z}!?p`gTe zZSOrHjq4U)TK-U*IS|agu4;L1tpEB}U4GnqW&hdt@4nXGNw%JB@-^>_99@w+|H~2o z)b4ZV|7d^IP_^Mu>-6Xu@x;Emp;gN_Z&}j%!M+vUu`Lths~(u!ACo7EO|N|1*SdCi z&8L-1PUkS>&E7fl=+D*0)lJoH%)mUm_};DRW$WdIjXym2wQkl^bMC^2$zH6V=!##w zaQ&IBs;Whc7FAbQ*VNQt z7*<S%*BcCm<8eV0XJolhEaCeql zKEEj#qM~sok#wdde>N8(^_bPvz*$rttA=NFVJAN2C6hsGI?l-{UtW%s3ZhvJj2>JB z@H7_Xu%us+i7Ja}HOd=MkwNo3LZTLc0$?zVQz$%YHLue}Or|M{O4;ohkLP|kjFL$; zuGA7L1En!BIy0xYdT^FEIYXp3W(g$dNSYC3yT+(Cn6)NaZ()r#j^uolFU*7mPLMpJ z9FX$SY$>TAKuLqj4jMP;c+419nd3TJlHeq(KkJMXco9uedL?UAyUcpO)f8pPgp-!M zY$oW;#k_@Nuq4G$PE;t3I=vM)+6mG{(|(o>xmk=DHI9_)Ewx77#>xS z2{oP8+q0xEXN%-ri2^@UjOXVwCDfo-D2ytVS)--(2G(S9S|}e=UgnPb1F2|S7NugA z0LFqjX@!T;@D6>*O~ib3B4kg+Jeg!DpAn12`-lLr0yqJ9fEYjuAcp}eH$@`16U8D( z&QLnwa0n0}m_eoh(SSG=^5ZB%A;E#tJ|suriSb6TkYJ@S2dnb9^a0)+jj)M?SCV4+ zyoAcP)ONt#4Fs>EA{s`}ak7ao*kVOjq7+Qe3t5yY=#*g8U}l5DMra%~?zUTak0TQB zBw_(cjOAq!6|+W*1qpy;K&b46PwjPMb_N)$!o{T!3gvQiJdTHg?sS^8*=UD@b-Ov- z;58b81Rf*tq{T2p>GM`CVl>F3Lm?aq1d=QWp{qBKJ&C~Lu8vJRmOfvO!omU!w6(R> zKdpg7hq=L_Vdu!m=;;4Rb7i2XWKYq`g#U#*HccMJPY3hm{{ZOf+}3e!^WNkC0$DVY AssI20 literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_glass_void.png b/resources/g2/palette_map/palette_map_glass_void.png new file mode 100644 index 0000000000000000000000000000000000000000..72fd8961a7405df1c960f497ddf78e3e2553b359 GIT binary patch literal 1505 zcmd^;@oy7#7{=eNY`3i}opxBH(*k9lq{Ko_tk8@TZlf%n+}J@H=;VM4Ye+H2RlQo8aS5DG*}EF4c6GOk$o+Hhfm%-d477| z)&c?ZCTO+0Ij`Sx(5L2Y7y$1R5fo5zSmRB?;oJ3{$7e&dT4|nI&g45z{?Zw zPIPUN-srf-GCdRHCtm1oU%nkzf8Nva<#^8z{dZcvU;pvoY{Q#N&a~@nS1!%WWcU4k z<=RdM=GfTw1cr|c4;-F&7Dd{3T^&7iSMXL}^p@e=?xAmQuWA1J?EV$pwl(3m7NvLp zk!_k?Gk)@FU)QI*`XtY>X(^jeua^JbP%YixG4hh?*z!jmQ>~%V!06D_t#xHBwsYIS zNqG!kczNj~V}5_6@Vc(!xzVAUTkz6Y;Of3}AKZIwsE6u2)fQ~u5kI!9c;VNhp~+q6 zFZ|i{Sgl(3cIUMtXQh*Sn}=5{-L!d8=ZAZj^(8ltkF9uU>v}?+A~(MB$zbQ|kyW47 zFFI4iP@ph<_VHgUEi2m^*0TraxP|xcG%Q)G%y0Pd;cv||{>JkcKgtYXLu7C2(#4z4 z+!R{}2gO&9YJR#~*BCo|<8;Rjnz>#&UL|I~TDAI+`k(K9{$*`-cox3+CV5XkGt;)% z-2d<8Y&xy@=Bj;@8N>Aa$gOuK_lN*0=x@PtL6|9uWEeZgIXxae5C}vfu~bTwq$x!yS1N=VNGs5GwbQ9}yA58SIT*4= zqI4p~rZb+L94Zv!lnHZK)x2HjcNhc?k9mm60F{Y2aw%TP21`o3T9#~jU`^m9L13^1 zk7Yudd_r5v=~2myDlD245R!}lGyscXyhh{K>jfN-Tdk8coprhLe*c453}rHULTe;- zX4+t7aT{-P_z6z1dZJVyX%DBFc#ahnm%*Yp+l*GmWalhSp5lXaFviA2UX=Zk5|&Ge zLN%iyLCb*71qL7B0%nQnY$@ECA$i#mDtO{$K|+(XNy}OEUYjZ8uqHSv?P25qmydXg z$v`<1sme)Ilr&lkZgLP77fE>;Cd6@3uQwG6WnwW|6bn;R<#HK;o(DXF5eW^I)-ySi zt3U;d&Une2E(=qYRB0|>MQW2qW6|ks1|wrKb5^UzP6yfAGG8hb&L&cdBv%R~uy)MD zX#A`}aGRn&G8tsjQCBwU&u5~gyi}cjep2mSE zAWVX21BC{}0OEBhM4&j0L^sL>krIce;4NUMz(HefPUrWU!h$Uk=hEqbEGJ7P8P#s- zT|oHMq@bhY23Ev*#VVAY$%;2!jpXLU0?L&qK@qTgMxvmeHog ShUwa4ptomh_xVkGPW%V3r!5Wu literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_grass_green_dark.png b/resources/g2/palette_map/palette_map_grass_green_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f48865817a0d1dfb00dc163e2d84acd3034cc8a4 GIT binary patch literal 1506 zcmXw(e{@TC7{y`!p z=u}jgKN*08xC9BQtoTeZmKDTx#UczVDZ;RxOPA9N7cE`@K;IqfcZ@9bj?S(liGm%K zm}JYA`3H)-?5|ACom`hQy>Ds7wC)pfUvKQwsi@LqyEk)b8+H8gy{5wsgQI8ahO*OV zhxR*LxE0FN2Fx2VwAJUY@{s?=O#_lGDB|Rt4k~I zJP=zDOsRWK;y>1M;gP4#A!U2;8!e>+)+KdZ%;E$~CpNNj zwPoi8v+{b&o;P$(OTPDd+qr&75?y|7u*-FOR57otX`F0Z#C6pF@Ts0c_U0GFpLm6>WaPpcCdO%k&Ow>wF01g0&AT*n;=W-c=z$TH@;J8nv3hMPORx9*)xM(I{$`Ro_2`P}# zLWLfs7>UM$865H|H(~RWu8@i+=89x|2_ckIVkM2yM%-v6tuERX(0fBwfrvfa?qN$o zCIL7qz|#Q%gNUshnNy(jNa=vW6xP_Hj2G76!c0oc)yjk>g~U!_ZVeGIP(ib%*f%4Y*w4hK6V~3IUe}0yBcz*_fM4_=T!4 zW^7j4B3gHpX^1%^FN5tcUC3sOIUE^}PY6YnM52-7Mlx=ubDFArc4x>Nh=rwqlp`8~ zttWYmT4>Qp9Y(@!QTZJDpvMvkdSkH`C1rIe>8P@PK7=+(9= zz1vY0@H!$PFN}r7ayfJX7y=N+Ss1wn9ik!usbFhqAB2|XX2R)2EoPnHk13UeT21M6 zG%7NPMP@1Lz)+7|)PM^k3O*!xP%nTM6uP7^AcqiMx>No(0v(I;$4trU8jr%8Hvq)` zdXbczf~0mxOYhj}9d^dM?`3v=zY8a;Yd3Co_a3~Sy>j@yKjF6Y;w-rdDQ#` z3ss*i`c%ERbP2t5*>cT_m8-O?*R0j8TfaeHR=&}&sbaHn%hpQMw$DCiw(rG zeU~m@@n5aK7P$V)jfR`IZU=w8^IPcmyN%&{_nVskcC Zh2y)d#deikkAHChiVBMJkB*(Q@jqslrr7`h literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_grass_green_light.png b/resources/g2/palette_map/palette_map_grass_green_light.png new file mode 100644 index 0000000000000000000000000000000000000000..cf5146676f360fa298b4c4854ca30d112d96bdda GIT binary patch literal 1506 zcmX|>e{@TC7{~X{5EWBomT725OleAH-I*WX#XmdeJa z09}d-^Ctt45Vs&9l@-?%V|hW`S1!V^k|GT2y>vOfaM9ug0QBF!Zu{s$@7U~mk|@|- zg-JGVp1;4i+rFyQ+{yJh)BBfJPU|@#_tl1eU5ctqw!1Tzwo}I*-EBVPFgSXrt}j1z zX83?Jg^0G#BE2&Jo^wa>)MVB<3 zpMPUw+J*8qPUv-3@|u+u3-6rtFs1I*iT_wDgomFvhn4TfueX*CTAS2)F^dx{o!G?6 z)s~+V%*yL4d)C-BE&1-Nt!D=yNp!{8p)S|0F~z*{&SfXova+)ise;S1J636F6%A_^ zJ?~)g;qtaDZBrWnEKo9GN*oMGNJvObOk}ZGNl8h`$;l}xDF}k3rlxl4)QQ9A^HEfU zVN!ySQU0!cvC=`vwP!W(y04`5gDl^q;o>nI^nj~fmZg-MykH#M` zg=*7$e~e20||%02}}kL1;Ex&*d@#flVT*#c`iX71ZlntybvqaM4V@lq14<5>g zOagFJfTsfj1`%61GN(Z4k{1ZD)avoSZ9@C#L8 z%-Eu|MYQfH(-?C`UIaT}x{%Elb2u^{pAd>Di9{pEjbwb8&S|Rl*_|P8AQqMaQjTZ{ zww~lMYN16Zbr=b^MdfqogC0vH=#9l%p%efG02%-o02~1L0BAt~j1P`Mod!B=FcicE zfJQ;J6u4v{gab$bNOPbGg*F_z)X;B)AscuDUJT?IP~eD~;^?))YDQ+aQEs;(5O72y z0T{oaD`zoD#!$49wHO5l~SIXKy@lPqgUIi z^=?OX!0U*Fyf79P%jM7oUQ6nylDEN@%LA?N4Q0S7vfE+@2@pi?V3Un^YA2%hdd%Oy-Ujq>P z>v>Xg3X<9>ExmJ>x7ZnPzmwVZ-EN$$?mf8KJ$vzb_sQY+eXpOO|A2wQ_Xp*Q1`o+Y zKNvbpJbc7R$*9p|q+`d8$MOq4lob|zB%d&`7%!PLnV2$lnqvBlnaYo6%_ir}okz`I zuu%2MqEFR}OPA0~mo3+o3~V%wtn_Gvu*p1>MwSF zY2LMakL9bcYpmbw{nobcyYKD$4;*wHI()==^w?+Wz#}|4~aO aO@ea6nlf+U$@q@|ps1iY|H$|`8~y`;QK(Y@ literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_invisible.png b/resources/g2/palette_map/palette_map_invisible.png new file mode 100644 index 0000000000000000000000000000000000000000..aeaf6c1d1e04309c6f456a6f73e5053cdb5380c5 GIT binary patch literal 1506 zcmX|>adb;}6vuyU+P-R8Y&9tG61@Y10F~M8y=DWg6NMQ<{=lcUJrs|LmT7?)m=pz31G|`QEL?MY1kwJ<|XH zT?z~GrT~x-mmndP6`v`_vi!KNScGB4g&3B-bUD3n(c%RF4A`-L$Cv`|xU4#o$lps#xDRq5k3@ELb-fLpctBw7;6jqvS_hv3_qmDnm*L2unaAc=$C_8<2 z#K5x!TcJE{@VwC@T77OE@2g7t2~Xq1TzoYgd&oynD*Sl)Bd>{$ni{9(n2r$7V*kDuROVqm6er9d;kD?+B zlM;lSqLdm9Z7>+jW~yh(eN1%Q<=lkD&xs4O(NsJZ6R8Nr!yKNXXV6^~$(_6auXjFa%q4_gW{ z2*6PRo(>2YL~P~AoC2jsN(U6Cu*Mc;ys!orW>8|TRwgtlBz6jOYlwh>3Ys;|4nx#q zZVxzMvzMJA76=unSS7`@1Yx2mi&pD2nLJi&z~u@zG(@9O2)Hy5m=V;@#@t-OFI0sw zW3$p0(Ym8dL(CcJ2)4s?A)77caAZ6_Arw&(iAIha$+(%$X{z$sogr@^7M221j%WzB zp5!rVp+zTk7zwvU<#XtR9!n(Xjm27^6aWPP8UPpo902$LXhr~xH;zG_20Cmo6vPF9 zMnRPnxMU!N14sZ!bD#-@HXORt&~Jnx8+Zd=4CEM4;E0;y=(WNsMrOBBZnq&2a6}>j z7~jQJ0aTYRWjMHvN4f-bNWw&wj+oZnZuWP$!Y~*WWB@S_k%`z!DNjwHI+dK!t8GN#a_9mu1R#vFFmeq#L`4Ep!Pe3~2rbRcgwu&y%sRgxQz{9yn$qcL zRAdl~%u>{Wp&q%Y0T)ITd`R-3UH~m9bV*@A4k5gBr~FL>Iv3`RpPJbt9);Jh0f_ze zA}KiqN$r%D-nq+L?5=OWlhN(n?wrgXJ-J!Edh@dT^yT+^ufJfxz(K9XpE#)qFP=Pwm^y8`Vn)eK<;SyTlXK?IqvkJI zsQP5lr|QL}OX#J`mTOk5T%}#TX02}B`VIQB@{NW~6`PG)wpN<9efBxCeaFtKFLr%t z-o0n9<*To&t>5hX*0%q<@9hT;9&#K$a@2Y3_zyKFPM&g|K6BPx`{Oy!Pv;+bFV_9+ zyL9=A|7!iU!1Z5lG~B#(JNWCJ-$K9NZ4BSL-_-oagNKnve?D$`^0YPD_Uw852LBfv X(zq%}4ZQH?n}fpqqP(LM=4|{A6?UWi literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_magenta_light.png b/resources/g2/palette_map/palette_map_magenta_light.png new file mode 100644 index 0000000000000000000000000000000000000000..f8837f053cd2a4d2c27664e10ab2817e0125218f GIT binary patch literal 1506 zcmX|=e^gU-7{hlH$S&0Fn|GB&D+wnr1Q-C4B7~3@b0eun8MB(yQ03dl`Vq4Lcg<75kpa z?I4MwhI&l0d-tmSWn=c%r{`C6Ost$-UAuUEY5u)kPmC<7H`}i)*)Tx0+_=*7rPJt~ zkiOG!)+&?*gc`S`3P+d zUwrq}=1W(_XNyd!&0`A+4s7cg)lzwL`B7ul>GC?qZeRTuFSNh2x$5_}j;e#_EBl)7 z*4DHgZoD?9bH&M)*Haot<=NjTnEKVIPhaGB6xRPuJ$66OZ<}N(Jyei0drWz4=IKEr zJRV!$d1BT1g_$P}{haXqoYdF0)U3XI*vnLVwk7{#s}UZ&<(g^u06*7PJ#Bl+h;=MZ zsCr>HD_?6kE?8PHNp`zybY|+6dvCT+K~m_N_8D&X#rb7C!-&n_ZfE7@CR0UcmJMyy z(kdD@uemeC;=_&oIoj@i09c^BbWs8fNJ>gdPEKaASScwfsi~=HX=w<8q^GB6WMpvo zd_IbbFic7ia*9%FG_=uZv{-B|m)qy-3WsCyI4S~C3Bcu9N@ccM&C}{cCbPt1#T_ov zRvh=MR3W{-&t`*OFBi?`OF1H( zCm{tgTBy*Y6eH1CF{4x7($y7<#US9)Kwv>o2OINn ziGWZQ!A!kMdsOR*FNL=4 zhv5(|05l4kq`)l$VH`jLK$-*1D753yt%d;;4BNp2@M0jxfC5L<6i2TWHZd}Xo$`2$ z!Jso54Z=hgR|QaAmXzV(b{^>#&|wJ^Q##{X&yXcB?2f=tOpp!4JVYj9E2TU&f$CIp zMz6Lv={?S-pwAf%`(QjGmdl|Vz%YO?!NSBf>JSwPNCjI<`ysUU_7W}^YPIMB0ZgeR z)M`qnqfwDjEV4*ZCx&|EqApw*Rq!FngL(n9qR=gcK{G3B7lc!7-J~=I4 zH2tXp^ywKh#j|G5k<6VpU;4~~XR*Sf=VZkt&&x{}mf__uR1k|^T&$?9TB3Yu=`wQp zij~x=mshJ^S+iEXu6jMa;nj_rO`Er9w{Ck)w|&P>y`g58@%7p_OuOsq&2PT-HuFwH zW7E6uy>Hp`!H3q5K5n*s^66*xz570Q>_6~@^UH&WTwk?(-TKY9huuex9`m$)*Y5rP z_;ugOjvxG|PM-<<*m*Yi)6eI+&R@6~`sLEE;omNIN3Q(d)BDHOYtid}-srn|t3Ng{ gc>Djg^A|3_ZGDD)6>EK$5|05TMP-GDo?X7{KQsrf_y7O^ literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_olive_dark.png b/resources/g2/palette_map/palette_map_olive_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2df6c83255a1edfab06f7494202f33c2df7802 GIT binary patch literal 6252 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 Z1#!17wIxzDD)AUlR8X9MWZayM{{fA5sGR@+ literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_orange_light.png b/resources/g2/palette_map/palette_map_orange_light.png new file mode 100644 index 0000000000000000000000000000000000000000..fa4a863e03f3d13d40030ab9846eb77253a0ef7e GIT binary patch literal 1506 zcmX|=e{@TC7{a z09}fU3MK-O5Vs&9l@-?%V|iiRS1!P?(qatDS-g~& z`@Z;Up)t9pdw%}@Rm~Ykr#_x_$}sIx>1O*TZ`FYbXSXh&cCW5}+Myd$TWelcR@9x? z{$NDI>gwQbBFa3o{TWPW`?)!$UF*SS7xAM?1w`B}rel~$%*dTM~@qKg{N z&%H4|?Lv7QC-gcidG(5l`FBoum@@aO#DA<6!b4A-L(6yJ*IUa5u1V^=ki`j>jc;P* zY0J+EX5{ygJ!|ZmmVEcsmb3klB)a145SQ!Lhb6r7&dZOlVP$70QiYdicC6IWDjL=- zc;3O{!=-Im+NL%DSfF&=q&OImkdTm=n8;$Wl9G~=lao_YQV;}5O-=38sS}6K=cA|y z!=wZurzoXHLmLbRv)Sr&y1d@TP$(LUp&}ra09>A~RA#ExJgrV-G)c@B-0mdZ9*sX> z3b)uWA)=6^({hep!DA?aRfE-Gt3gxT7oc9ltrs`noJ(6HQ;iE8yln1Cya;x{bRnB9=5S;@J|PrQ5{X8R8_D=Fozqn9vpYlHKrAc;q#V%@ zY(2?i)Iy6+>M#;+i^}KF2R)WZ&>M@jLMZ?W05kwF05|~f0nmZ~7#|#iIt_H#U?_+S z0F8obDR9X^2nUb=kmf)W3T-%asiEHpLpJaRycozapuiC|#nEep)r`z;qug#oAmE5Z z0x+J%RRL6&E@e2ljYql!bV$NPm5!L!-C_2>aD`zoD#!$49wHO5l~SIXKy@lPqgUIi z^=?OX!0U*Fyf79P%jM7oUQ6nylDEN@%LA?N4Q0S7vfE+@2@pi?V3Un?m7&9rWd%Oy-Ujq>P z>v>Xg3X<9>ExmJ>x7ZnPzmwVZ-EN$$?mf8KJ$vzTa(napyw_LIum1qy`vdbtg9hiL z9}F2P9yWZ0WaOw1rK87;#R>{Pk`)zyEFU+%1TUR1k(e}jiel=t>B>)L%p_;co?+Wz#}|Lb*U a&cG!)ePuVTb8q}Hpt!K4;PBX4>;D4-FRaG^ literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_saturated_brown_light.png b/resources/g2/palette_map/palette_map_saturated_brown_light.png new file mode 100644 index 0000000000000000000000000000000000000000..48ed4c9e89812f37fde934e41f27fb8c764e3fa3 GIT binary patch literal 1506 zcmX|=e{@TC7{GWuQ5QiFmR3|~Y!{sc z*_v5wK@e61>6#H;5EWBomT725OleAH-I*WX#XmdeJzM`s z=u%XeKLvn!I7Q%Y1!$s zBLpnhfKl8++d6^@-msF%(dTM~@qDvdj zFSs!&?Lt`_C-gcqdEM&rMR!hlm{RxJ#DA>i!Xrdbi7XZ?DJdyAIXNXI1woM1)YML$I&t`XK8lJk zOiB=Pic)Gcw83C7o2^c#%j<0ng`%+-Dgsgoz~$*mWrkYK)9OS!LJDNG zP@zXDMxwD`28X=LP1yXTE2QFyxgr@~LI~xQSV?2F5jR>%tBZC8^xjZaAYu=9c-T^q zK>&^l@N_`HAYv;=<`gJBQaYe8g*CP)gzG11?v%u`wErLcpbgz>J`FHsu}ZM^A26uim`uK7IN9-s>+IFmRA?a89mh$k06W z{b9q!BSwyrj2<&qI&S;~EWh9bSz*zK@`;m*@si0?h^f=2D`w1`rTl329CGfw`P71i zi&P&k{zSc`bSb@T`3lX-RjajY)~?g7-|(rvtbC(kQ^jWEmaUbhZJ&M4Y~Qi7>Wf`p zns@KnYx(NyYU?-qzP0WD?tA-zgNGc4j~sO#JN`q>iIb;Xr_Y>q*Zx@N`RUw4?}hrG zeHSlX_FrkZ8o2h$^~M`FZv}t7{afhwJ5Axc_nKS&xc?yX@XtrBkDs(f+n+xBKhEHs a95^<#rv9v^ZeRQ{ps1iY|LBCd8~+1a6{i^h literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_saturated_green_light.png b/resources/g2/palette_map/palette_map_saturated_green_light.png new file mode 100644 index 0000000000000000000000000000000000000000..7d65b9707a3588b26ab19027600c7eb1a7e5bae7 GIT binary patch literal 1506 zcmX|=e{@TC7{~X{5EWBomT725OleAH-I*WX#XmdeJyUsY<(opeWl$|;= zV&IvAN+?eoJa6=fHlJI^xV2^1_7A!Fcn_G;kURP5u3Zg>tHwCnsibjN`VJaO;QKge zdluQz{`7gy`P#a`tC9cith)rP1*3f{ynUOpYnqO)xccHkpJ_X~HEWue8FC6~^3VaBE6O8XXX)xk+;x2>FUudaT^;TzLiYhG5A*PYz) zU{u503&%Dk?daOawmEmu(XM-^^6T@e{-%1r?&GueGfy~@n>n(3aYfptrv`W~x}@R! z{2LR~E|j%#La#HE*RCpGc;}>tDRr+&{Kr}@Jp9Btylgjqy|r}kx}?sFS)5?$#3ojb zw(Oi>R&GDpv&L>|$#-9EJv$IdqRYu-i#KC}sgoMPzL>7ycl$4a5oSc%9f*?q0YHFuWoj80xA4NqN zCM5_tMJY8J+F&r4%~q$=<@Gj(LeW?Z6#=OP;PP~(GDEHAX>}r_Nn*C(b|>lfX#4?F zxW$GE5rrh3mUHw99zzMN8no7cdCUsGlMeZek&vw;>XmT;DFj+6UHIU<}VAq6s8 zsL-PnBhgqegF{~JCTxDv6;koUT#<|~A%t>DtfVp8h#Re>)kV7kdT*#Y5V40lJZve* zAOJ@Ncsd|p5V4gba|)CmDIHLl!WvtY@xoeMm_doTTA9$Kkk~2Atsw#iDrnZUI1Evb zxg+3!EnaqpSRhoOVwDur5`>AOELyG8Wb#<80hcS>*cgpQA>h(LU`9|o8*_6Bzfcv% zj4euAMC*<+jWK8BMX&>=3)yTjha=q#D?7Fu*thmmkwR6d73=&?kC-dL;^N&!#+paFmZzyW{{fEEP6_~01SX`sUfLqS{s zXcSaSflCHLIDiCzGzXecXv3jP4gE$KvVk|?#Xyb$1&*jGj$SLQW@L67<#rna0Y@Yf zfbm;g6+m_AQig-uc%(}}ha^l?>4<6F9cKRvR~QDPf(#($AuX7ii&^LQV@f5VR#Q41 zjfxCnky(m5Fw`R#HR8gEf)7a^)C-^mg)S)!$RUImZDY1OvAq0`WCevE%O^}M!iy(OCZcT_m8-O?*R0j8TfaeHR=&}&sbaHnOJ$X5>t~-c+qUnh{$l5s z=3Tq@SibtY#`?|PZ*BX&``*6)z(L2M!$+J)kNr@4{KQGusnciNbw8f<{B-W2_d@;8 zzKfSG`>!-y4P5)>dgG0ow}QXk{w?(Tou=^Jd(AC>+x_~)b6$4}a#?N6WmA8AoZ Z2_#~=os~WLmGQ@b!u+DVBje|6{12AqsH^}0 literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_saturated_purple_dark.png b/resources/g2/palette_map/palette_map_saturated_purple_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..028aa38176da93281781937e74488df0027f293e GIT binary patch literal 1505 zcmYL|ZFoy}7{>qU+vy9!s)Cpxh>D3hwjd=qt+YZXP#y39yKs~`1Vp|LxZvDsLoJb)upPm-#@gL$1MjQ z4j9zI%RW{9^zLa^v~6759a_iavLj1_1NW`iRk79AxUzUwr@8?p(^JbA6)ifnH=nok z?wGo^d*Rmkn-uG=IuFWNX~*xD1f8jdYK+}PZ>Fz@=1kaf-6d$mn-k6)Y9y7zV2{@R+# z2V*aFYdpCrsj_Q-+vbr&PjuZsi`|sF^@Y4|$3mZVpm}Q5$ev?*6qTi4c&dX9(c()# z&%8D*y{V*)L3Q*@EOk$)E~Y}hn%gE0jF?oE$p7Eg9;}!p=j2@kI&amTb+taqam+y3p zYknL>E*7r7SXOk^2tXnznmRMi1<+`;goK2|#Kfeeq~zq}l#~<%K~hsw)6&uyY&IK3 zc^D=n2(er)RjEjwPG>e-olck6+e}f>SPbO>p#b3G45>6zsbr}&JiS3+w%~TB%RQpt4{(huGvMY<`)GQn2_;o`@|VxMDe9N@AoQ*IQ*)7wHOUy_6{sv4`3{ zbRozj07C&-8o)6kd@Dob)t&C+k7pPMA0e%gviC$}gBAo;s}%FPc7sm^o{y2Sck0&dJE6PxTEc(ae-L^2=yB_lKii^zJ^g$4 b?*FZ!;@X!vl-dz53IGLpg}GIe7L@)6-W;+O literal 0 HcmV?d00001 diff --git a/resources/g2/palette_map/palette_map_saturated_purple_light.png b/resources/g2/palette_map/palette_map_saturated_purple_light.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ef69cca9a10f787c6439efb9554ce377375340 GIT binary patch literal 1506 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 XJT1Q6*sUu57*JGDoPT8eoQ?kh7E+_! literal 0 HcmV?d00001 diff --git a/resources/g2/sprites.json b/resources/g2/sprites.json index 97a6ac4e5c..2e86eb6200 100644 --- a/resources/g2/sprites.json +++ b/resources/g2/sprites.json @@ -20588,5 +20588,251 @@ "x_offset": -5, "y_offset": -20, "palette": "keep" + }, + { + "path": "icons/colour_invisible.png" + }, + { + "path": "icons/colour_invisible_pressed.png" + }, + { + "path": "palette_map/palette_map_dark_olive_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_dark_olive_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_saturated_brown_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_bordeaux_red_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_bordeaux_red_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_grass_green_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_grass_green_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_olive_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_olive_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_saturated_green_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_tan_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_tan_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_dull_purple_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_dull_green_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_dull_green_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_saturated_purple_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_saturated_purple_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_orange_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_aqua_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_magenta_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_dull_brown_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_dull_brown_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_invisible.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_void.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_dark_olive_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_dark_olive_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_saturated_brown_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_bordeaux_red_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_bordeaux_red_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_grass_green_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_grass_green_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_olive_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_olive_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_saturated_green_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_tan_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_tan_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_dull_purple_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_dull_green_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_dull_green_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_saturated_purple_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_saturated_purple_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_orange_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_aqua_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_magenta_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_dull_brown_dark.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_dull_brown_light.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_invisible.png", + "palette": "keep", + "forceBmp": true + }, + { + "path": "palette_map/palette_map_glass_void.png", + "palette": "keep", + "forceBmp": true } ] diff --git a/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp b/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp index 0c4e620f5a..ddc25942b7 100644 --- a/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp @@ -201,7 +201,7 @@ void TextureCache::CreateTextures() void TextureCache::GeneratePaletteTexture() { - static_assert(PALETTE_TO_G1_OFFSET_COUNT + 5 < 256, "Height of palette too large!"); + static_assert(PALETTE_TOTAL_OFFSETS + 5 < 256, "Height of palette too large!"); constexpr int32_t height = 256; constexpr int32_t width = height; DrawPixelInfo dpi = CreateDPI(width, height); @@ -212,7 +212,7 @@ void TextureCache::GeneratePaletteTexture() dpi.bits[i] = i; } - for (int i = 0; i < PALETTE_TO_G1_OFFSET_COUNT; ++i) + for (int i = 0; i < PALETTE_TOTAL_OFFSETS; ++i) { GLint y = PaletteToY(static_cast(i)); diff --git a/src/openrct2-ui/input/MouseInput.cpp b/src/openrct2-ui/input/MouseInput.cpp index 1e6dfe700d..6b32baae18 100644 --- a/src/openrct2-ui/input/MouseInput.cpp +++ b/src/openrct2-ui/input/MouseInput.cpp @@ -1341,7 +1341,9 @@ void InputStateWidgetPressed( dropdown_index = gDropdownDefaultIndex; } } - WindowEventDropdownCall(cursor_w, cursor_widgetIndex, dropdown_index); + WindowEventDropdownCall( + cursor_w, cursor_widgetIndex, + (gDropdownIsColour) ? ColourToPaletteIndex(dropdown_index) : dropdown_index); } } } @@ -1445,8 +1447,32 @@ void InputStateWidgetPressed( STR_COLOUR_DARK_PINK_TIP, STR_COLOUR_BRIGHT_PINK_TIP, STR_COLOUR_LIGHT_PINK_TIP, + STR_COLOUR_DARK_OLIVE_DARK_TIP, + STR_COLOUR_DARK_OLIVE_LIGHT_TIP, + STR_COLOUR_SATURATED_BROWN_LIGHT_TIP, + STR_COLOUR_BORDEAUX_RED_DARK_TIP, + STR_COLOUR_BORDEAUX_RED_LIGHT_TIP, + STR_COLOUR_GRASS_GREEN_DARK_TIP, + STR_COLOUR_GRASS_GREEN_LIGHT_TIP, + STR_COLOUR_OLIVE_DARK_TIP, + STR_COLOUR_OLIVE_LIGHT_TIP, + STR_COLOUR_SATURATED_GREEN_LIGHT_TIP, + STR_COLOUR_TAN_DARK_TIP, + STR_COLOUR_TAN_LIGHT_TIP, + STR_COLOUR_DULL_PURPLE_LIGHT_TIP, + STR_COLOUR_DULL_GREEN_DARK_TIP, + STR_COLOUR_DULL_GREEN_LIGHT_TIP, + STR_COLOUR_SATURATED_PURPLE_DARK_TIP, + STR_COLOUR_SATURATED_PURPLE_LIGHT_TIP, + STR_COLOUR_ORANGE_LIGHT_TIP, + STR_COLOUR_AQUA_DARK_TIP, + STR_COLOUR_MAGENTA_LIGHT_TIP, + STR_COLOUR_DULL_BROWN_DARK_TIP, + STR_COLOUR_DULL_BROWN_LIGHT_TIP, + STR_COLOUR_INVISIBLE_TIP, + STR_COLOUR_VOID_TIP, }; - WindowTooltipShow(OpenRCT2String{ _colourTooltips[dropdown_index], {} }, screenCoords); + WindowTooltipShow(OpenRCT2String{ _colourTooltips[ColourToPaletteIndex(dropdown_index)], {} }, screenCoords); } if (dropdown_index < Dropdown::ItemsMaxSize && Dropdown::IsDisabled(dropdown_index)) diff --git a/src/openrct2-ui/interface/Theme.cpp b/src/openrct2-ui/interface/Theme.cpp index ecf6ae169f..7e89daeb75 100644 --- a/src/openrct2-ui/interface/Theme.cpp +++ b/src/openrct2-ui/interface/Theme.cpp @@ -770,6 +770,55 @@ void ThemeSetColour(WindowClass wc, uint8_t index, colour_t colour) ThemeSave(); } +// Quick and dirty mapping for new colours to original colours, until flags are extracted from colour upper bits +colour_t ThemeOverrideExtendedColour(colour_t inputColour) +{ + switch (inputColour) + { + case COLOUR_DARK_OLIVE_DARK: + case COLOUR_DARK_OLIVE_LIGHT: + return COLOUR_DARK_OLIVE_GREEN; + case COLOUR_SATURATED_BROWN_LIGHT: + return COLOUR_LIGHT_BROWN; + case COLOUR_BORDEAUX_RED_DARK: + case COLOUR_BORDEAUX_RED_LIGHT: + return COLOUR_BORDEAUX_RED; + case COLOUR_GRASS_GREEN_DARK: + case COLOUR_GRASS_GREEN_LIGHT: + return COLOUR_MOSS_GREEN; + case COLOUR_OLIVE_DARK: + case COLOUR_OLIVE_LIGHT: + return COLOUR_OLIVE_GREEN; + case COLOUR_SATURATED_GREEN_LIGHT: + return COLOUR_BRIGHT_GREEN; + case COLOUR_TAN_DARK: + case COLOUR_TAN_LIGHT: + return COLOUR_SALMON_PINK; + case COLOUR_DULL_PURPLE_LIGHT: + return COLOUR_LIGHT_PURPLE; + case COLOUR_DULL_GREEN_DARK: + case COLOUR_DULL_GREEN_LIGHT: + return COLOUR_DARK_GREEN; + case COLOUR_SATURATED_PURPLE_DARK: + case COLOUR_SATURATED_PURPLE_LIGHT: + return COLOUR_BRIGHT_PURPLE; + case COLOUR_ORANGE_LIGHT: + return COLOUR_LIGHT_ORANGE; + case COLOUR_AQUA_DARK: + return COLOUR_AQUAMARINE; + case COLOUR_MAGENTA_LIGHT: + return COLOUR_BRIGHT_PINK; + case COLOUR_DULL_BROWN_DARK: + case COLOUR_DULL_BROWN_LIGHT: + return COLOUR_DARK_BROWN; + case COLOUR_INVISIBLE: + case COLOUR_VOID: + return COLOUR_BLACK; + default: + return inputColour; + } +} + uint8_t ThemeGetFlags() { return ThemeManager::CurrentTheme->Flags; diff --git a/src/openrct2-ui/interface/Theme.h b/src/openrct2-ui/interface/Theme.h index e0def3382d..20babae241 100644 --- a/src/openrct2-ui/interface/Theme.h +++ b/src/openrct2-ui/interface/Theme.h @@ -37,6 +37,7 @@ size_t ThemeGetIndexForName(const utf8* name); colour_t ThemeGetColour(WindowClass wc, uint8_t index); void ThemeSetColour(WindowClass wc, uint8_t index, colour_t colour); +colour_t ThemeOverrideExtendedColour(colour_t inputColour); uint8_t ThemeGetFlags(); void ThemeSetFlags(uint8_t flags); void ThemeSave(); diff --git a/src/openrct2-ui/interface/Widget.cpp b/src/openrct2-ui/interface/Widget.cpp index 328c0343b9..eb1e8def36 100644 --- a/src/openrct2-ui/interface/Widget.cpp +++ b/src/openrct2-ui/interface/Widget.cpp @@ -1186,5 +1186,12 @@ static void WidgetTextBoxDraw(DrawPixelInfo* dpi, WindowBase& w, WidgetIndex wid ImageId GetColourButtonImage(colour_t colour) { - return ImageId(SPR_PALETTE_BTN, colour).WithBlended(true); + if (colour == COLOUR_INVISIBLE) + { + return ImageId(SPR_G2_ICON_PALETTE_INVISIBLE, colour).WithBlended(false); + } + else + { + return ImageId(SPR_PALETTE_BTN, colour).WithBlended(true); + } } diff --git a/src/openrct2-ui/windows/Cheats.cpp b/src/openrct2-ui/windows/Cheats.cpp index 39a1280e9a..a3b1013532 100644 --- a/src/openrct2-ui/windows/Cheats.cpp +++ b/src/openrct2-ui/windows/Cheats.cpp @@ -153,6 +153,7 @@ enum WindowCheatsWidgetIdx WIDX_STAFF_SPEED_DROPDOWN_BUTTON, WIDX_PARK_CONSTRUCTION_GROUP, WIDX_ALLOW_REGULAR_PATH_AS_QUEUE, + WIDX_ALLOW_SPECIAL_COLOUR_SCHEMES, WIDX_FIX_ALL = WIDX_TAB_CONTENT, WIDX_RENEW_RIDES, @@ -287,8 +288,9 @@ static Widget window_cheats_misc_widgets[] = MakeWidget ({126, 361}, {111, 14}, WindowWidgetType::DropdownMenu, WindowColour::Secondary ), // Staff speed MakeWidget ({225, 362}, { 11, 12}, WindowWidgetType::Button, WindowColour::Secondary, STR_DROPDOWN_GLYPH ), // Staff speed - MakeWidget ({ 5, 392}, {238, 35}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_GROUP_CONSTRUCTION ), // Construction group + MakeWidget ({ 5, 392}, {238, 56}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_GROUP_CONSTRUCTION ), // Construction group MakeWidget ({ 11, 407}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_ALLOW_PATH_AS_QUEUE, STR_CHEAT_ALLOW_PATH_AS_QUEUE_TIP ), // Allow regular footpaths as queue path + MakeWidget ({ 11, 428}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_ALLOW_SPECIAL_COLOUR_SCHEMES, STR_CHEAT_ALLOW_SPECIAL_COLOUR_SCHEMES_TIP ), // Allow special colours in dropdown WIDGETS_END, }; @@ -484,6 +486,7 @@ public: SetCheckboxValue(WIDX_NEVERENDING_MARKETING, gCheatsNeverendingMarketing); SetCheckboxValue(WIDX_DISABLE_PLANT_AGING, gCheatsDisablePlantAging); SetCheckboxValue(WIDX_ALLOW_REGULAR_PATH_AS_QUEUE, gCheatsAllowRegularPathAsQueue); + SetCheckboxValue(WIDX_ALLOW_SPECIAL_COLOUR_SCHEMES, gCheatsAllowSpecialColourSchemes); break; case WINDOW_CHEATS_PAGE_RIDES: SetCheckboxValue(WIDX_UNLOCK_OPERATING_LIMITS, gCheatsUnlockOperatingLimits); @@ -911,6 +914,9 @@ private: case WIDX_ALLOW_REGULAR_PATH_AS_QUEUE: CheatsSet(CheatType::AllowRegularPathAsQueue, !gCheatsAllowRegularPathAsQueue); break; + case WIDX_ALLOW_SPECIAL_COLOUR_SCHEMES: + CheatsSet(CheatType::AllowSpecialColourSchemes, !gCheatsAllowSpecialColourSchemes); + break; } } diff --git a/src/openrct2-ui/windows/Dropdown.cpp b/src/openrct2-ui/windows/Dropdown.cpp index d0859d8c00..0cd7cc01b8 100644 --- a/src/openrct2-ui/windows/Dropdown.cpp +++ b/src/openrct2-ui/windows/Dropdown.cpp @@ -32,7 +32,7 @@ static constexpr const uint8_t _appropriateImageDropdownItemsPerRow[34] = { 1, 1, 1, 1, 2, 2, 3, 3, 4, 3, // 10 5, 4, 4, 5, 5, 5, 4, 5, 6, 5, // 20 5, 7, 4, 5, 6, 5, 6, 6, 6, 6, // 30 - 6, 8, 8, 8, // 34 + 6, 8, 9, 8, // 34 }; enum @@ -449,20 +449,27 @@ int32_t DropdownIndexFromPoint(const ScreenCoordsXY& loc, WindowBase* w) void WindowDropdownShowColour(WindowBase* w, Widget* widget, uint8_t dropdownColour, uint8_t selectedColour) { int32_t defaultIndex = -1; + + auto numColours = (gCheatsAllowSpecialColourSchemes) ? static_cast(COLOUR_COUNT) : COLOUR_NUM_NORMAL; // Set items - for (uint64_t i = 0; i < COLOUR_COUNT; i++) + for (uint64_t i = 0; i < numColours; i++) { - if (selectedColour == i) + auto orderedColour = ColourToPaletteIndex(i); + if (selectedColour == orderedColour) defaultIndex = i; + // Use special graphic for Invisible colour + auto imageId = (orderedColour == COLOUR_INVISIBLE) ? ImageId(SPR_G2_ICON_PALETTE_INVISIBLE, COLOUR_WHITE) + : ImageId(SPR_PALETTE_BTN, orderedColour); + gDropdownItems[i].Format = Dropdown::FormatColourPicker; - gDropdownItems[i].Args = (i << 32) | ImageId(SPR_PALETTE_BTN, i).ToUInt32(); + gDropdownItems[i].Args = (i << 32) | imageId.ToUInt32(); } // Show dropdown WindowDropdownShowImage( w->windowPos.x + widget->left, w->windowPos.y + widget->top, widget->height() + 1, dropdownColour, - Dropdown::Flag::StayOpen, COLOUR_COUNT, 12, 12, _appropriateImageDropdownItemsPerRow[COLOUR_COUNT]); + Dropdown::Flag::StayOpen, numColours, 12, 12, _appropriateImageDropdownItemsPerRow[COLOUR_NUM_ORIGINAL]); gDropdownIsColour = true; gDropdownLastColourHover = -1; diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index e35cfcc001..1d09ea517e 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -4942,7 +4942,7 @@ static void WindowRideColourPaint(WindowBase* w, DrawPixelInfo* dpi) if ((gCurrentTicks % 64) == 0) { spriteColour++; - if (spriteColour >= COLOUR_COUNT) + if (spriteColour >= COLOUR_NUM_NORMAL) { spriteColour = COLOUR_BLACK; } diff --git a/src/openrct2-ui/windows/Themes.cpp b/src/openrct2-ui/windows/Themes.cpp index db06190513..8eb72964f9 100644 --- a/src/openrct2-ui/windows/Themes.cpp +++ b/src/openrct2-ui/windows/Themes.cpp @@ -615,9 +615,10 @@ public: case WIDX_THEMES_LIST: if (selectedIndex != -1) { + const auto newColour = ThemeOverrideExtendedColour(selectedIndex); WindowClass wc = GetWindowClassTabIndex(_colour_index_1); uint8_t colour = ThemeGetColour(wc, _colour_index_2); - colour = (colour & COLOUR_FLAG_TRANSLUCENT) | selectedIndex; + colour = (colour & COLOUR_FLAG_TRANSLUCENT) | newColour; ThemeSetColour(wc, _colour_index_2, colour); ColourSchemeUpdateAll(); WindowInvalidateAll(); diff --git a/src/openrct2/Cheats.cpp b/src/openrct2/Cheats.cpp index 88839eb1f2..3f17258f57 100644 --- a/src/openrct2/Cheats.cpp +++ b/src/openrct2/Cheats.cpp @@ -53,6 +53,7 @@ bool gCheatsIgnoreResearchStatus = false; bool gCheatsEnableAllDrawableTrackPieces = false; bool gCheatsAllowTrackPlaceInvalidHeights = false; bool gCheatsAllowRegularPathAsQueue = false; +bool gCheatsAllowSpecialColourSchemes = false; void CheatsReset() { @@ -79,6 +80,7 @@ void CheatsReset() gCheatsEnableAllDrawableTrackPieces = false; gCheatsAllowTrackPlaceInvalidHeights = false; gCheatsAllowRegularPathAsQueue = false; + gCheatsAllowSpecialColourSchemes = false; } void CheatsSet(CheatType cheatType, int32_t param1 /* = 0*/, int32_t param2 /* = 0*/) @@ -128,6 +130,7 @@ void CheatsSerialise(DataSerialiser& ds) CheatEntrySerialise(ds, CheatType::EnableAllDrawableTrackPieces, gCheatsEnableAllDrawableTrackPieces, count); CheatEntrySerialise(ds, CheatType::AllowTrackPlaceInvalidHeights, gCheatsAllowTrackPlaceInvalidHeights, count); CheatEntrySerialise(ds, CheatType::AllowRegularPathAsQueue, gCheatsAllowRegularPathAsQueue, count); + CheatEntrySerialise(ds, CheatType::AllowSpecialColourSchemes, gCheatsAllowSpecialColourSchemes, count); // Remember current position and update count. uint64_t endOffset = stream.GetPosition(); @@ -223,6 +226,9 @@ void CheatsSerialise(DataSerialiser& ds) case CheatType::AllowRegularPathAsQueue: ds << gCheatsAllowRegularPathAsQueue; break; + case CheatType::AllowSpecialColourSchemes: + ds << gCheatsAllowSpecialColourSchemes; + break; default: break; } @@ -328,6 +334,8 @@ const char* CheatsGetName(CheatType cheatType) return LanguageGetString(STR_CHEAT_ALLOW_TRACK_PLACE_INVALID_HEIGHTS); case CheatType::AllowRegularPathAsQueue: return LanguageGetString(STR_CHEAT_ALLOW_PATH_AS_QUEUE); + case CheatType::AllowSpecialColourSchemes: + return LanguageGetString(STR_CHEAT_ALLOW_SPECIAL_COLOUR_SCHEMES); default: return "Unknown Cheat"; } diff --git a/src/openrct2/Cheats.h b/src/openrct2/Cheats.h index fafd5c42f5..57cca7386d 100644 --- a/src/openrct2/Cheats.h +++ b/src/openrct2/Cheats.h @@ -34,6 +34,7 @@ extern bool gCheatsIgnoreResearchStatus; extern bool gCheatsEnableAllDrawableTrackPieces; extern bool gCheatsAllowTrackPlaceInvalidHeights; extern bool gCheatsAllowRegularPathAsQueue; +extern bool gCheatsAllowSpecialColourSchemes; enum class CheatType : int32_t { @@ -88,6 +89,7 @@ enum class CheatType : int32_t AllowTrackPlaceInvalidHeights, NoCapOnQueueLengthDummy, // Removed; this dummy exists only for deserialisation parks that had it saved AllowRegularPathAsQueue, + AllowSpecialColourSchemes, Count, }; diff --git a/src/openrct2/actions/CheatSetAction.cpp b/src/openrct2/actions/CheatSetAction.cpp index b712dd6a31..1775ca8dd6 100644 --- a/src/openrct2/actions/CheatSetAction.cpp +++ b/src/openrct2/actions/CheatSetAction.cpp @@ -244,6 +244,9 @@ GameActions::Result CheatSetAction::Execute() const case CheatType::AllowRegularPathAsQueue: gCheatsAllowRegularPathAsQueue = _param1 != 0; break; + case CheatType::AllowSpecialColourSchemes: + gCheatsAllowSpecialColourSchemes = static_cast(_param1); + break; default: { LOG_ERROR("Unabled cheat: %d", _cheatType.id); @@ -617,12 +620,12 @@ void CheatSetAction::GiveObjectToGuests(int32_t object) const break; case OBJECT_BALLOON: peep->GiveItem(ShopItem::Balloon); - peep->BalloonColour = ScenarioRandMax(COLOUR_COUNT - 1); + peep->BalloonColour = ColourToPaletteIndex(ScenarioRandMax(COLOUR_NUM_NORMAL)); peep->UpdateSpriteType(); break; case OBJECT_UMBRELLA: peep->GiveItem(ShopItem::Umbrella); - peep->UmbrellaColour = ScenarioRandMax(COLOUR_COUNT - 1); + peep->UmbrellaColour = ColourToPaletteIndex(ScenarioRandMax(COLOUR_NUM_NORMAL)); peep->UpdateSpriteType(); break; } diff --git a/src/openrct2/actions/WallSetColourAction.cpp b/src/openrct2/actions/WallSetColourAction.cpp index b696dd89fc..b14c65d468 100644 --- a/src/openrct2/actions/WallSetColourAction.cpp +++ b/src/openrct2/actions/WallSetColourAction.cpp @@ -88,13 +88,13 @@ GameActions::Result WallSetColourAction::Query() const return GameActions::Result(GameActions::Status::Unknown, STR_CANT_REPAINT_THIS, STR_NONE); } - if (_primaryColour > 31) + if (_primaryColour >= COLOUR_COUNT) { LOG_ERROR("Primary colour invalid: colour = %d", _primaryColour); return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_NONE); } - if (_secondaryColour > 31) + if (_secondaryColour >= COLOUR_COUNT) { LOG_ERROR("Secondary colour invalid: colour = %d", _secondaryColour); return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_NONE); @@ -102,7 +102,7 @@ GameActions::Result WallSetColourAction::Query() const if (wallEntry->flags & WALL_SCENERY_HAS_TERTIARY_COLOUR) { - if (_tertiaryColour > 31) + if (_tertiaryColour >= COLOUR_COUNT) { LOG_ERROR("Tertiary colour invalid: colour = %d", _tertiaryColour); return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_NONE); diff --git a/src/openrct2/drawing/Drawing.cpp b/src/openrct2/drawing/Drawing.cpp index 0f27f2bae5..018ffc0a10 100644 --- a/src/openrct2/drawing/Drawing.cpp +++ b/src/openrct2/drawing/Drawing.cpp @@ -293,6 +293,56 @@ enum SPR_PALETTE_GLASS_DARK_PINK = 5045, SPR_PALETTE_GLASS_BRIGHT_PINK = 5046, SPR_PALETTE_GLASS_LIGHT_PINK = 5047, + + SPR_PALETTE_DARK_OLIVE_DARK = SPR_G2_PALETTE_BEGIN, + SPR_PALETTE_DARK_OLIVE_LIGHT, + SPR_PALETTE_SATURATED_BROWN_LIGHT, + SPR_PALETTE_BORDEAUX_RED_DARK, + SPR_PALETTE_BORDEAUX_RED_LIGHT, + SPR_PALETTE_GRASS_GREEN_DARK, + SPR_PALETTE_GRASS_GREEN_LIGHT, + SPR_PALETTE_OLIVE_DARK, + SPR_PALETTE_OLIVE_LIGHT, + SPR_PALETTE_SATURATED_GREEN_LIGHT, + SPR_PALETTE_TAN_DARK, + SPR_PALETTE_TAN_LIGHT, + SPR_PALETTE_DULL_PURPLE_LIGHT, + SPR_PALETTE_DULL_GREEN_DARK, + SPR_PALETTE_DULL_GREEN_LIGHT, + SPR_PALETTE_SATURATED_PURPLE_DARK, + SPR_PALETTE_SATURATED_PURPLE_LIGHT, + SPR_PALETTE_ORANGE_LIGHT, + SPR_PALETTE_AQUA_DARK, + SPR_PALETTE_MAGENTA_LIGHT, + SPR_PALETTE_DULL_BROWN_DARK, + SPR_PALETTE_DULL_BROWN_LIGHT, + SPR_PALETTE_INVISIBLE, + SPR_PALETTE_VOID, + + SPR_PALETTE_GLASS_DARK_OLIVE_DARK, + SPR_PALETTE_GLASS_DARK_OLIVE_LIGHT, + SPR_PALETTE_GLASS_SATURATED_BROWN_LIGHT, + SPR_PALETTE_GLASS_BORDEAUX_RED_DARK, + SPR_PALETTE_GLASS_BORDEAUX_RED_LIGHT, + SPR_PALETTE_GLASS_GRASS_GREEN_DARK, + SPR_PALETTE_GLASS_GRASS_GREEN_LIGHT, + SPR_PALETTE_GLASS_OLIVE_DARK, + SPR_PALETTE_GLASS_OLIVE_LIGHT, + SPR_PALETTE_GLASS_SATURATED_GREEN_LIGHT, + SPR_PALETTE_GLASS_TAN_DARK, + SPR_PALETTE_GLASS_TAN_LIGHT, + SPR_PALETTE_GLASS_DULL_PURPLE_LIGHT, + SPR_PALETTE_GLASS_DULL_GREEN_DARK, + SPR_PALETTE_GLASS_DULL_GREEN_LIGHT, + SPR_PALETTE_GLASS_SATURATED_PURPLE_DARK, + SPR_PALETTE_GLASS_SATURATED_PURPLE_LIGHT, + SPR_PALETTE_GLASS_ORANGE_LIGHT, + SPR_PALETTE_GLASS_AQUA_DARK, + SPR_PALETTE_GLASS_MAGENTA_LIGHT, + SPR_PALETTE_GLASS_DULL_BROWN_DARK, + SPR_PALETTE_GLASS_DULL_BROWN_LIGHT, + SPR_PALETTE_GLASS_INVISIBLE, + SPR_PALETTE_GLASS_VOID, }; const FilterPaletteID GlassPaletteIds[COLOUR_COUNT] = { @@ -328,10 +378,34 @@ const FilterPaletteID GlassPaletteIds[COLOUR_COUNT] = { FilterPaletteID::PaletteGlassDarkPink, FilterPaletteID::PaletteGlassBrightPink, FilterPaletteID::PaletteGlassLightPink, + FilterPaletteID::PaletteGlassDarkOliveDark, + FilterPaletteID::PaletteGlassDarkOliveLight, + FilterPaletteID::PaletteGlassSaturatedBrownLight, + FilterPaletteID::PaletteGlassBordeauxRedDark, + FilterPaletteID::PaletteGlassBordeauxRedLight, + FilterPaletteID::PaletteGlassGrassGreenDark, + FilterPaletteID::PaletteGlassGrassGreenLight, + FilterPaletteID::PaletteGlassOliveDark, + FilterPaletteID::PaletteGlassOliveLight, + FilterPaletteID::PaletteGlassSaturatedGreenLight, + FilterPaletteID::PaletteGlassTanDark, + FilterPaletteID::PaletteGlassTanLight, + FilterPaletteID::PaletteGlassDullPurpleLight, + FilterPaletteID::PaletteGlassDullGreenDark, + FilterPaletteID::PaletteGlassDullGreenLight, + FilterPaletteID::PaletteGlassSaturatedPurpleDark, + FilterPaletteID::PaletteGlassSaturatedPurpleLight, + FilterPaletteID::PaletteGlassOrangeLight, + FilterPaletteID::PaletteGlassAquaDark, + FilterPaletteID::PaletteGlassMagentaLight, + FilterPaletteID::PaletteGlassDullBrownDark, + FilterPaletteID::PaletteGlassDullBrownLight, + FilterPaletteID::PaletteGlassInvisible, + FilterPaletteID::PaletteGlassVoid, }; // Previously 0x97FCBC use it to get the correct palette from g1_elements -static const uint16_t palette_to_g1_offset[PALETTE_TO_G1_OFFSET_COUNT] = { +static constexpr uint16_t palette_to_g1_offset[PALETTE_TOTAL_OFFSETS] = { SPR_PALETTE_BLACK, SPR_PALETTE_GREY, SPR_PALETTE_WHITE, @@ -364,6 +438,30 @@ static const uint16_t palette_to_g1_offset[PALETTE_TO_G1_OFFSET_COUNT] = { SPR_PALETTE_DARK_PINK, SPR_PALETTE_BRIGHT_PINK, SPR_PALETTE_LIGHT_PINK, + SPR_PALETTE_DARK_OLIVE_DARK, + SPR_PALETTE_DARK_OLIVE_LIGHT, + SPR_PALETTE_SATURATED_BROWN_LIGHT, + SPR_PALETTE_BORDEAUX_RED_DARK, + SPR_PALETTE_BORDEAUX_RED_LIGHT, + SPR_PALETTE_GRASS_GREEN_DARK, + SPR_PALETTE_GRASS_GREEN_LIGHT, + SPR_PALETTE_OLIVE_DARK, + SPR_PALETTE_OLIVE_LIGHT, + SPR_PALETTE_SATURATED_GREEN_LIGHT, + SPR_PALETTE_TAN_DARK, + SPR_PALETTE_TAN_LIGHT, + SPR_PALETTE_DULL_PURPLE_LIGHT, + SPR_PALETTE_DULL_GREEN_DARK, + SPR_PALETTE_DULL_GREEN_LIGHT, + SPR_PALETTE_SATURATED_PURPLE_DARK, + SPR_PALETTE_SATURATED_PURPLE_LIGHT, + SPR_PALETTE_ORANGE_LIGHT, + SPR_PALETTE_AQUA_DARK, + SPR_PALETTE_MAGENTA_LIGHT, + SPR_PALETTE_DULL_BROWN_DARK, + SPR_PALETTE_DULL_BROWN_LIGHT, + SPR_PALETTE_INVISIBLE, + SPR_PALETTE_VOID, SPR_PALETTE_WATER, // PaletteWater (water) @@ -480,16 +578,48 @@ static const uint16_t palette_to_g1_offset[PALETTE_TO_G1_OFFSET_COUNT] = { SPR_PALETTE_GLASS_DARK_PINK, SPR_PALETTE_GLASS_BRIGHT_PINK, SPR_PALETTE_GLASS_LIGHT_PINK, + SPR_PALETTE_GLASS_DARK_OLIVE_DARK, + SPR_PALETTE_GLASS_DARK_OLIVE_LIGHT, + SPR_PALETTE_GLASS_SATURATED_BROWN_LIGHT, + SPR_PALETTE_GLASS_BORDEAUX_RED_DARK, + SPR_PALETTE_GLASS_BORDEAUX_RED_LIGHT, + SPR_PALETTE_GLASS_GRASS_GREEN_DARK, + SPR_PALETTE_GLASS_GRASS_GREEN_LIGHT, + SPR_PALETTE_GLASS_OLIVE_DARK, + SPR_PALETTE_GLASS_OLIVE_LIGHT, + SPR_PALETTE_GLASS_SATURATED_GREEN_LIGHT, + SPR_PALETTE_GLASS_TAN_DARK, + SPR_PALETTE_GLASS_TAN_LIGHT, + SPR_PALETTE_GLASS_DULL_PURPLE_LIGHT, + SPR_PALETTE_GLASS_DULL_GREEN_DARK, + SPR_PALETTE_GLASS_DULL_GREEN_LIGHT, + SPR_PALETTE_GLASS_SATURATED_PURPLE_DARK, + SPR_PALETTE_GLASS_SATURATED_PURPLE_LIGHT, + SPR_PALETTE_GLASS_ORANGE_LIGHT, + SPR_PALETTE_GLASS_AQUA_DARK, + SPR_PALETTE_GLASS_MAGENTA_LIGHT, + SPR_PALETTE_GLASS_DULL_BROWN_DARK, + SPR_PALETTE_GLASS_DULL_BROWN_LIGHT, + SPR_PALETTE_GLASS_INVISIBLE, + SPR_PALETTE_GLASS_VOID, }; #define WINDOW_PALETTE_GREY {FilterPaletteID::PaletteTranslucentGrey, FilterPaletteID::PaletteTranslucentGreyHighlight, FilterPaletteID::PaletteTranslucentGreyShadow} #define WINDOW_PALETTE_LIGHT_PURPLE {FilterPaletteID::PaletteTranslucentLightPurple, FilterPaletteID::PaletteTranslucentLightPurpleHighlight, FilterPaletteID::PaletteTranslucentLightPurpleShadow} +#define WINDOW_PALETTE_BRIGHT_PURPLE {FilterPaletteID::PaletteTranslucentBrightPurple, FilterPaletteID::PaletteTranslucentBrightPurpleHighlight, FilterPaletteID::PaletteTranslucentBrightPurpleShadow} #define WINDOW_PALETTE_LIGHT_BLUE {FilterPaletteID::PaletteTranslucentLightBlue, FilterPaletteID::PaletteTranslucentLightBlueHighlight, FilterPaletteID::PaletteTranslucentLightBlueShadow} #define WINDOW_PALETTE_TEAL {FilterPaletteID::PaletteTranslucentTeal, FilterPaletteID::PaletteTranslucentTealHighlight, FilterPaletteID::PaletteTranslucentTealShadow} #define WINDOW_PALETTE_BRIGHT_GREEN {FilterPaletteID::PaletteTranslucentBrightGreen, FilterPaletteID::PaletteTranslucentBrightGreenHighlight, FilterPaletteID::PaletteTranslucentBrightGreenShadow} +#define WINDOW_PALETTE_DARK_GREEN {FilterPaletteID::PaletteTranslucentDarkGreen, FilterPaletteID::PaletteTranslucentDarkGreenHighlight, FilterPaletteID::PaletteTranslucentDarkGreenShadow} +#define WINDOW_PALETTE_MOSS_GREEN {FilterPaletteID::PaletteTranslucentMossGreen, FilterPaletteID::PaletteTranslucentMossGreenHighlight, FilterPaletteID::PaletteTranslucentMossGreenShadow} +#define WINDOW_PALETTE_OLIVE_GREEN {FilterPaletteID::PaletteTranslucentOliveGreen, FilterPaletteID::PaletteTranslucentOliveGreenHighlight, FilterPaletteID::PaletteTranslucentOliveGreenShadow} +#define WINDOW_PALETTE_DARK_OLIVE_GREEN {FilterPaletteID::PaletteTranslucentDarkOliveGreen, FilterPaletteID::PaletteTranslucentDarkOliveGreenHighlight, FilterPaletteID::PaletteTranslucentDarkOliveGreenShadow} #define WINDOW_PALETTE_YELLOW {FilterPaletteID::PaletteTranslucentYellow, FilterPaletteID::PaletteTranslucentYellowHighlight, FilterPaletteID::PaletteTranslucentYellowShadow} #define WINDOW_PALETTE_LIGHT_ORANGE {FilterPaletteID::PaletteTranslucentLightOrange, FilterPaletteID::PaletteTranslucentLightOrangeHighlight, FilterPaletteID::PaletteTranslucentLightOrangeShadow} #define WINDOW_PALETTE_LIGHT_BROWN {FilterPaletteID::PaletteTranslucentLightBrown, FilterPaletteID::PaletteTranslucentLightBrownHighlight, FilterPaletteID::PaletteTranslucentLightBrownShadow} +#define WINDOW_PALETTE_DARK_BROWN {FilterPaletteID::PaletteTranslucentDarkBrown, FilterPaletteID::PaletteTranslucentDarkBrownHighlight, FilterPaletteID::PaletteTranslucentDarkBrownShadow} +#define WINDOW_PALETTE_SALMON_PINK {FilterPaletteID::PaletteTranslucentSalmonPink, FilterPaletteID::PaletteTranslucentSalmonPinkHighlight, FilterPaletteID::PaletteTranslucentSalmonPinkShadow} +#define WINDOW_PALETTE_BORDEAUX_RED {FilterPaletteID::PaletteTranslucentBordeauxRed, FilterPaletteID::PaletteTranslucentBordeauxRedHighlight, FilterPaletteID::PaletteTranslucentBordeauxRedShadow} #define WINDOW_PALETTE_BRIGHT_RED {FilterPaletteID::PaletteTranslucentBrightRed, FilterPaletteID::PaletteTranslucentBrightRedHighlight, FilterPaletteID::PaletteTranslucentBrightRedShadow} #define WINDOW_PALETTE_BRIGHT_PINK {FilterPaletteID::PaletteTranslucentBrightPink, FilterPaletteID::PaletteTranslucentBrightPinkHighlight, FilterPaletteID::PaletteTranslucentBrightPinkShadow} @@ -499,18 +629,18 @@ const TranslucentWindowPalette TranslucentWindowPalettes[COLOUR_COUNT] = { {FilterPaletteID::PaletteTranslucentWhite, FilterPaletteID::PaletteTranslucentWhiteHighlight, FilterPaletteID::PaletteTranslucentWhiteShadow}, WINDOW_PALETTE_LIGHT_PURPLE, // COLOUR_DARK_PURPLE WINDOW_PALETTE_LIGHT_PURPLE, // COLOUR_LIGHT_PURPLE - {FilterPaletteID::PaletteTranslucentBrightPurple, FilterPaletteID::PaletteTranslucentBrightPurpleHighlight, FilterPaletteID::PaletteTranslucentBrightPurpleShadow}, + WINDOW_PALETTE_BRIGHT_PURPLE, // COLOUR_BRIGHT_PURPLE WINDOW_PALETTE_LIGHT_BLUE, // COLOUR_DARK_BLUE WINDOW_PALETTE_LIGHT_BLUE, // COLOUR_LIGHT_BLUE WINDOW_PALETTE_LIGHT_BLUE, // COLOUR_ICY_BLUE WINDOW_PALETTE_TEAL, // COLOUR_TEAL WINDOW_PALETTE_TEAL, // COLOUR_AQUAMARINE WINDOW_PALETTE_BRIGHT_GREEN, // COLOUR_SATURATED_GREEN - {FilterPaletteID::PaletteTranslucentDarkGreen, FilterPaletteID::PaletteTranslucentDarkGreenHighlight, FilterPaletteID::PaletteTranslucentDarkGreenShadow}, - {FilterPaletteID::PaletteTranslucentMossGreen, FilterPaletteID::PaletteTranslucentMossGreenHighlight, FilterPaletteID::PaletteTranslucentMossGreenShadow}, + WINDOW_PALETTE_DARK_GREEN, // COLOUR_DARK_GREEN + WINDOW_PALETTE_MOSS_GREEN, // COLOUR_MOSS_GREEN WINDOW_PALETTE_BRIGHT_GREEN, // COLOUR_BRIGHT_GREEN - {FilterPaletteID::PaletteTranslucentOliveGreen, FilterPaletteID::PaletteTranslucentOliveGreenHighlight, FilterPaletteID::PaletteTranslucentOliveGreenShadow}, - {FilterPaletteID::PaletteTranslucentDarkOliveGreen, FilterPaletteID::PaletteTranslucentDarkOliveGreenHighlight, FilterPaletteID::PaletteTranslucentDarkOliveGreenShadow}, + WINDOW_PALETTE_OLIVE_GREEN, // COLOUR_OLIVE_GREEN + WINDOW_PALETTE_DARK_OLIVE_GREEN, // COLOUR_DARK_OLIVE_GREEN WINDOW_PALETTE_YELLOW, // COLOUR_BRIGHT_YELLOW WINDOW_PALETTE_YELLOW, // COLOUR_YELLOW WINDOW_PALETTE_YELLOW, // COLOUR_DARK_YELLOW @@ -518,14 +648,38 @@ const TranslucentWindowPalette TranslucentWindowPalettes[COLOUR_COUNT] = { WINDOW_PALETTE_LIGHT_ORANGE, // COLOUR_DARK_ORANGE WINDOW_PALETTE_LIGHT_BROWN, // COLOUR_LIGHT_BROWN WINDOW_PALETTE_LIGHT_BROWN, // COLOUR_SATURATED_BROWN - {FilterPaletteID::PaletteTranslucentDarkBrown, FilterPaletteID::PaletteTranslucentDarkBrownHighlight, FilterPaletteID::PaletteTranslucentDarkBrownShadow}, - {FilterPaletteID::PaletteTranslucentSalmonPink, FilterPaletteID::PaletteTranslucentSalmonPinkHighlight, FilterPaletteID::PaletteTranslucentSalmonPinkShadow}, - {FilterPaletteID::PaletteTranslucentBordeauxRed, FilterPaletteID::PaletteTranslucentBordeauxRedHighlight, FilterPaletteID::PaletteTranslucentBordeauxRedShadow}, + WINDOW_PALETTE_DARK_BROWN, // COLOUR_DARK_BROWN + WINDOW_PALETTE_SALMON_PINK, // COLOUR_SALMON_PINK + WINDOW_PALETTE_BORDEAUX_RED, // COLOUR_BORDEAUX_RED WINDOW_PALETTE_BRIGHT_RED, // COLOUR_SATURATED_RED WINDOW_PALETTE_BRIGHT_RED, // COLOUR_BRIGHT_RED WINDOW_PALETTE_BRIGHT_PINK, // COLOUR_DARK_PINK WINDOW_PALETTE_BRIGHT_PINK, // COLOUR_BRIGHT_PINK {FilterPaletteID::PaletteTranslucentLightPink, FilterPaletteID::PaletteTranslucentLightPinkHighlight, FilterPaletteID::PaletteTranslucentLightPinkShadow}, + WINDOW_PALETTE_DARK_OLIVE_GREEN, // COLOUR_DARK_OLIVE_DARK + WINDOW_PALETTE_DARK_OLIVE_GREEN, // COLOUR_DARK_OLIVE_LIGHT + WINDOW_PALETTE_LIGHT_BROWN, // COLOUR_SATURATED_BROWN_LIGHT + WINDOW_PALETTE_BORDEAUX_RED, // COLOUR_BORDEAUX_RED_DARK + WINDOW_PALETTE_BORDEAUX_RED, // COLOUR_BORDEAUX_RED_LIGHT + WINDOW_PALETTE_MOSS_GREEN, // COLOUR_GRASS_GREEN_DARK + WINDOW_PALETTE_MOSS_GREEN, // COLOUR_GRASS_GREEN_LIGHT + WINDOW_PALETTE_OLIVE_GREEN, // COLOUR_OLIVE_DARK + WINDOW_PALETTE_OLIVE_GREEN, // COLOUR_OLIVE_LIGHT + WINDOW_PALETTE_BRIGHT_GREEN, // COLOUR_SATURATED_GREEN_LIGHT + WINDOW_PALETTE_SALMON_PINK, // COLOUR_TAN_DARK + WINDOW_PALETTE_SALMON_PINK, // COLOUR_TAN_LIGHT + WINDOW_PALETTE_LIGHT_PURPLE, // COLOUR_DULL_PURPLE_LIGHT + WINDOW_PALETTE_DARK_GREEN, // COLOUR_DULL_GREEN_DARK + WINDOW_PALETTE_DARK_GREEN, // COLOUR_DULL_GREEN_LIGHT + WINDOW_PALETTE_BRIGHT_PURPLE, // COLOUR_SATURATED_PURPLE_DARK + WINDOW_PALETTE_BRIGHT_PURPLE, // COLOUR_SATURATED_PURPLE_LIGHT + WINDOW_PALETTE_LIGHT_ORANGE, // COLOUR_ORANGE_LIGHT + WINDOW_PALETTE_TEAL, // COLOUR_AQUA_DARK + WINDOW_PALETTE_BRIGHT_PINK, // COLOUR_MAGENTA_LIGHT + WINDOW_PALETTE_DARK_BROWN, // COLOUR_DULL_BROWN_DARK + WINDOW_PALETTE_DARK_BROWN, // COLOUR_DULL_BROWN_LIGHT + {FilterPaletteID::PaletteDarken1, FilterPaletteID::PaletteDarken1, FilterPaletteID::PaletteDarken1}, + {FilterPaletteID::PaletteDarken2, FilterPaletteID::PaletteDarken2, FilterPaletteID::PaletteDarken2}, }; // clang-format on @@ -747,7 +901,7 @@ void GfxDrawPickedUpPeep(DrawPixelInfo* dpi) std::optional GetPaletteG1Index(colour_t paletteId) { - if (paletteId < std::size(palette_to_g1_offset)) + if (paletteId < PALETTE_TOTAL_OFFSETS) { return palette_to_g1_offset[paletteId]; } diff --git a/src/openrct2/drawing/Drawing.h b/src/openrct2/drawing/Drawing.h index 075d13a42b..bd346bc923 100644 --- a/src/openrct2/drawing/Drawing.h +++ b/src/openrct2/drawing/Drawing.h @@ -190,80 +190,80 @@ enum class FilterPaletteID : int32_t { PaletteNull = 0, - PaletteWater = 32, + PaletteWater = COLOUR_COUNT, - Palette34 = 34, + Palette34 = PaletteWater + 2, - Palette44 = 44, // Construction marker - Palette45 = 45, // Decolourise + lighten - Palette46 = 46, + Palette44 = Palette34 + 10, // Construction marker + Palette45, // Decolourise + lighten + Palette46, - PaletteDarken3 = 47, + PaletteDarken3, - PaletteDarken1 = 49, - PaletteDarken2 = 50, - Palette51 = 51, // Decolourise + darken - PaletteTranslucentGrey = 52, - PaletteTranslucentGreyHighlight = 53, - PaletteTranslucentGreyShadow = 54, - PaletteTranslucentLightBlue = 55, - PaletteTranslucentLightBlueHighlight = 56, - PaletteTranslucentLightBlueShadow = 57, - PaletteTranslucentBordeauxRed = 58, - PaletteTranslucentBordeauxRedHighlight = 59, - PaletteTranslucentBordeauxRedShadow = 60, - PaletteTranslucentDarkGreen = 61, - PaletteTranslucentDarkGreenHighlight = 62, - PaletteTranslucentDarkGreenShadow = 63, - PaletteTranslucentLightPurple = 64, - PaletteTranslucentLightPurpleHighlight = 65, - PaletteTranslucentLightPurpleShadow = 66, - PaletteTranslucentDarkOliveGreen = 67, - PaletteTranslucentDarkOliveGreenHighlight = 68, - PaletteTranslucentDarkOliveGreenShadow = 69, - PaletteTranslucentLightBrown = 70, - PaletteTranslucentLightBrownHighlight = 71, - PaletteTranslucentLightBrownShadow = 72, - PaletteTranslucentYellow = 73, - PaletteTranslucentYellowHighlight = 74, - PaletteTranslucentYellowShadow = 75, - PaletteTranslucentMossGreen = 76, - PaletteTranslucentMossGreenHighlight = 77, - PaletteTranslucentMossGreenShadow = 78, - PaletteTranslucentOliveGreen = 79, - PaletteTranslucentOliveGreenHighlight = 80, - PaletteTranslucentOliveGreenShadow = 81, - PaletteTranslucentBrightGreen = 82, - PaletteTranslucentBrightGreenHighlight = 83, - PaletteTranslucentBrightGreenShadow = 84, - PaletteTranslucentSalmonPink = 85, - PaletteTranslucentSalmonPinkHighlight = 86, - PaletteTranslucentSalmonPinkShadow = 87, - PaletteTranslucentBrightPurple = 88, - PaletteTranslucentBrightPurpleHighlight = 89, - PaletteTranslucentBrightPurpleShadow = 90, - PaletteTranslucentBrightRed = 91, - PaletteTranslucentBrightRedHighlight = 92, - PaletteTranslucentBrightRedShadow = 93, - PaletteTranslucentLightOrange = 94, - PaletteTranslucentLightOrangeHighlight = 95, - PaletteTranslucentLightOrangeShadow = 96, - PaletteTranslucentTeal = 97, - PaletteTranslucentTealHighlight = 98, - PaletteTranslucentTealShadow = 99, - PaletteTranslucentBrightPink = 100, - PaletteTranslucentBrightPinkHighlight = 101, - PaletteTranslucentBrightPinkShadow = 102, - PaletteTranslucentDarkBrown = 103, - PaletteTranslucentDarkBrownHighlight = 104, - PaletteTranslucentDarkBrownShadow = 105, - PaletteTranslucentLightPink = 106, - PaletteTranslucentLightPinkHighlight = 107, - PaletteTranslucentLightPinkShadow = 108, - PaletteTranslucentWhite = 109, - PaletteTranslucentWhiteHighlight = 110, - PaletteTranslucentWhiteShadow = 111, - PaletteGlass = 112, + PaletteDarken1 = PaletteDarken3 + 2, + PaletteDarken2, + Palette51, // Decolourise + darken + PaletteTranslucentGrey, + PaletteTranslucentGreyHighlight, + PaletteTranslucentGreyShadow, + PaletteTranslucentLightBlue, + PaletteTranslucentLightBlueHighlight, + PaletteTranslucentLightBlueShadow, + PaletteTranslucentBordeauxRed, + PaletteTranslucentBordeauxRedHighlight, + PaletteTranslucentBordeauxRedShadow, + PaletteTranslucentDarkGreen, + PaletteTranslucentDarkGreenHighlight, + PaletteTranslucentDarkGreenShadow, + PaletteTranslucentLightPurple, + PaletteTranslucentLightPurpleHighlight, + PaletteTranslucentLightPurpleShadow, + PaletteTranslucentDarkOliveGreen, + PaletteTranslucentDarkOliveGreenHighlight, + PaletteTranslucentDarkOliveGreenShadow, + PaletteTranslucentLightBrown, + PaletteTranslucentLightBrownHighlight, + PaletteTranslucentLightBrownShadow, + PaletteTranslucentYellow, + PaletteTranslucentYellowHighlight, + PaletteTranslucentYellowShadow, + PaletteTranslucentMossGreen, + PaletteTranslucentMossGreenHighlight, + PaletteTranslucentMossGreenShadow, + PaletteTranslucentOliveGreen, + PaletteTranslucentOliveGreenHighlight, + PaletteTranslucentOliveGreenShadow, + PaletteTranslucentBrightGreen, + PaletteTranslucentBrightGreenHighlight, + PaletteTranslucentBrightGreenShadow, + PaletteTranslucentSalmonPink, + PaletteTranslucentSalmonPinkHighlight, + PaletteTranslucentSalmonPinkShadow, + PaletteTranslucentBrightPurple, + PaletteTranslucentBrightPurpleHighlight, + PaletteTranslucentBrightPurpleShadow, + PaletteTranslucentBrightRed, + PaletteTranslucentBrightRedHighlight, + PaletteTranslucentBrightRedShadow, + PaletteTranslucentLightOrange, + PaletteTranslucentLightOrangeHighlight, + PaletteTranslucentLightOrangeShadow, + PaletteTranslucentTeal, + PaletteTranslucentTealHighlight, + PaletteTranslucentTealShadow, + PaletteTranslucentBrightPink, + PaletteTranslucentBrightPinkHighlight, + PaletteTranslucentBrightPinkShadow, + PaletteTranslucentDarkBrown, + PaletteTranslucentDarkBrownHighlight, + PaletteTranslucentDarkBrownShadow, + PaletteTranslucentLightPink, + PaletteTranslucentLightPinkHighlight, + PaletteTranslucentLightPinkShadow, + PaletteTranslucentWhite, + PaletteTranslucentWhiteHighlight, + PaletteTranslucentWhiteShadow, + PaletteGlass, PaletteGlassBlack = PaletteGlass + COLOUR_BLACK, PaletteGlassGrey = PaletteGlass + COLOUR_GREY, PaletteGlassWhite = PaletteGlass + COLOUR_WHITE, @@ -296,6 +296,30 @@ enum class FilterPaletteID : int32_t PaletteGlassDarkPink = PaletteGlass + COLOUR_DARK_PINK, PaletteGlassBrightPink = PaletteGlass + COLOUR_BRIGHT_PINK, PaletteGlassLightPink = PaletteGlass + COLOUR_LIGHT_PINK, + PaletteGlassDarkOliveDark = PaletteGlass + COLOUR_DARK_OLIVE_DARK, + PaletteGlassDarkOliveLight = PaletteGlass + COLOUR_DARK_OLIVE_LIGHT, + PaletteGlassSaturatedBrownLight = PaletteGlass + COLOUR_SATURATED_BROWN_LIGHT, + PaletteGlassBordeauxRedDark = PaletteGlass + COLOUR_BORDEAUX_RED_DARK, + PaletteGlassBordeauxRedLight = PaletteGlass + COLOUR_BORDEAUX_RED_LIGHT, + PaletteGlassGrassGreenDark = PaletteGlass + COLOUR_GRASS_GREEN_DARK, + PaletteGlassGrassGreenLight = PaletteGlass + COLOUR_GRASS_GREEN_LIGHT, + PaletteGlassOliveDark = PaletteGlass + COLOUR_OLIVE_DARK, + PaletteGlassOliveLight = PaletteGlass + COLOUR_OLIVE_LIGHT, + PaletteGlassSaturatedGreenLight = PaletteGlass + COLOUR_SATURATED_GREEN_LIGHT, + PaletteGlassTanDark = PaletteGlass + COLOUR_TAN_DARK, + PaletteGlassTanLight = PaletteGlass + COLOUR_TAN_LIGHT, + PaletteGlassDullPurpleLight = PaletteGlass + COLOUR_DULL_PURPLE_LIGHT, + PaletteGlassDullGreenDark = PaletteGlass + COLOUR_DULL_GREEN_DARK, + PaletteGlassDullGreenLight = PaletteGlass + COLOUR_DULL_GREEN_LIGHT, + PaletteGlassSaturatedPurpleDark = PaletteGlass + COLOUR_SATURATED_PURPLE_DARK, + PaletteGlassSaturatedPurpleLight = PaletteGlass + COLOUR_SATURATED_PURPLE_LIGHT, + PaletteGlassOrangeLight = PaletteGlass + COLOUR_ORANGE_LIGHT, + PaletteGlassAquaDark = PaletteGlass + COLOUR_AQUA_DARK, + PaletteGlassMagentaLight = PaletteGlass + COLOUR_MAGENTA_LIGHT, + PaletteGlassDullBrownDark = PaletteGlass + COLOUR_DULL_BROWN_DARK, + PaletteGlassDullBrownLight = PaletteGlass + COLOUR_DULL_BROWN_LIGHT, + PaletteGlassInvisible = PaletteGlass + COLOUR_INVISIBLE, + PaletteGlassVoid = PaletteGlass + COLOUR_VOID, }; struct TranslucentWindowPalette @@ -446,6 +470,7 @@ void FASTCALL BlitPixels(const uint8_t* src, uint8_t* dst, const PaletteMap& pal } #define PALETTE_TO_G1_OFFSET_COUNT 144 +constexpr uint8_t PALETTE_TOTAL_OFFSETS = 192; #define INSET_RECT_F_30 (INSET_RECT_FLAG_BORDER_INSET | INSET_RECT_FLAG_FILL_NONE) #define INSET_RECT_F_60 (INSET_RECT_FLAG_BORDER_INSET | INSET_RECT_FLAG_FILL_DONT_LIGHTEN) diff --git a/src/openrct2/drawing/ImageId.hpp b/src/openrct2/drawing/ImageId.hpp index 6821f9cc2e..8755e9ef71 100644 --- a/src/openrct2/drawing/ImageId.hpp +++ b/src/openrct2/drawing/ImageId.hpp @@ -227,7 +227,7 @@ public: [[nodiscard]] constexpr ImageId WithPrimary(colour_t colour) const { ImageId result = *this; - result._primary = colour & 31; + result._primary = colour; result._flags |= NEW_FLAG_PRIMARY; return result; } @@ -235,7 +235,7 @@ public: [[nodiscard]] constexpr ImageId WithSecondary(colour_t colour) const { ImageId result = *this; - result._secondary = colour & 31; + result._secondary = colour; result._flags |= NEW_FLAG_SECONDARY; return result; } @@ -251,7 +251,7 @@ public: [[nodiscard]] constexpr ImageId WithTertiary(colour_t tertiary) const { ImageId result = *this; - result._tertiary = tertiary & 31; + result._tertiary = tertiary; result._flags &= ~NEW_FLAG_PRIMARY; result._flags |= NEW_FLAG_SECONDARY; if (!(_flags & NEW_FLAG_SECONDARY)) @@ -265,7 +265,7 @@ public: [[nodiscard]] ImageId WithTransparency(colour_t colour) const { - return WithTransparency(GetGlassPaletteId(colour & 31)); + return WithTransparency(GetGlassPaletteId(colour)); } [[nodiscard]] ImageId WithTransparency(FilterPaletteID palette) const diff --git a/src/openrct2/entity/Guest.cpp b/src/openrct2/entity/Guest.cpp index 04a82658e8..de8509bb0b 100644 --- a/src/openrct2/entity/Guest.cpp +++ b/src/openrct2/entity/Guest.cpp @@ -1619,16 +1619,20 @@ bool Guest::DecideAndBuyItem(Ride& ride, ShopItem shopItem, money64 price) const auto hasRandomShopColour = ride.HasLifecycleFlag(RIDE_LIFECYCLE_RANDOM_SHOP_COLOURS); if (shopItem == ShopItem::TShirt) - TshirtColour = hasRandomShopColour ? ScenarioRandMax(COLOUR_COUNT - 1) : ride.track_colour[0].main; + TshirtColour = hasRandomShopColour ? ColourToPaletteIndex(ScenarioRandMax(COLOUR_NUM_NORMAL - 1)) + : ride.track_colour[0].main; if (shopItem == ShopItem::Hat) - HatColour = hasRandomShopColour ? ScenarioRandMax(COLOUR_COUNT - 1) : ride.track_colour[0].main; + HatColour = hasRandomShopColour ? ColourToPaletteIndex(ScenarioRandMax(COLOUR_NUM_NORMAL - 1)) + : ride.track_colour[0].main; if (shopItem == ShopItem::Balloon) - BalloonColour = hasRandomShopColour ? ScenarioRandMax(COLOUR_COUNT - 1) : ride.track_colour[0].main; + BalloonColour = hasRandomShopColour ? ColourToPaletteIndex(ScenarioRandMax(COLOUR_NUM_NORMAL - 1)) + : ride.track_colour[0].main; if (shopItem == ShopItem::Umbrella) - UmbrellaColour = hasRandomShopColour ? ScenarioRandMax(COLOUR_COUNT - 1) : ride.track_colour[0].main; + UmbrellaColour = hasRandomShopColour ? ColourToPaletteIndex(ScenarioRandMax(COLOUR_NUM_NORMAL - 1)) + : ride.track_colour[0].main; if (shopItem == ShopItem::Map) ResetPathfindGoal(); diff --git a/src/openrct2/interface/Colour.cpp b/src/openrct2/interface/Colour.cpp index 56bb2474a6..d70f1d0a39 100644 --- a/src/openrct2/interface/Colour.cpp +++ b/src/openrct2/interface/Colour.cpp @@ -39,7 +39,9 @@ void ColoursInitMaps() // Get colour maps from g1 for (int32_t i = 0; i < COLOUR_COUNT; i++) { - const G1Element* g1 = GfxGetG1Element(SPR_PALETTE_2_START + i); + // Get palette index in g1 / g2 + const auto paletteIndex = (i < COLOUR_NUM_ORIGINAL) ? SPR_PALETTE_2_START : SPR_G2_PALETTE_BEGIN - COLOUR_NUM_ORIGINAL; + const G1Element* g1 = GfxGetG1Element(paletteIndex + i); if (g1 != nullptr) { ColourMapA[i].colour_0 = g1->offset[INDEX_COLOUR_0]; @@ -93,6 +95,30 @@ namespace Colour { "dark_pink", COLOUR_DARK_PINK }, { "bright_pink", COLOUR_BRIGHT_PINK }, { "light_pink", COLOUR_LIGHT_PINK }, + { "dark_olive_dark", COLOUR_DARK_OLIVE_DARK }, + { "dark_olive_light", COLOUR_DARK_OLIVE_LIGHT }, + { "saturated_brown_light", COLOUR_SATURATED_BROWN_LIGHT }, + { "bordeaux_red_dark", COLOUR_BORDEAUX_RED_DARK }, + { "bordeaux_red_light", COLOUR_BORDEAUX_RED_LIGHT }, + { "grass_green_dark", COLOUR_GRASS_GREEN_DARK }, + { "grass_green_light", COLOUR_GRASS_GREEN_LIGHT }, + { "olive_dark", COLOUR_OLIVE_DARK }, + { "olive_light", COLOUR_OLIVE_LIGHT }, + { "saturated_green_light", COLOUR_SATURATED_GREEN_LIGHT }, + { "tan_dark", COLOUR_TAN_DARK }, + { "tan_light", COLOUR_TAN_LIGHT }, + { "dull_purple_light", COLOUR_DULL_PURPLE_LIGHT }, + { "dull_green_dark", COLOUR_DULL_GREEN_DARK }, + { "dull_green_light", COLOUR_DULL_GREEN_LIGHT }, + { "saturated_purple_dark", COLOUR_SATURATED_PURPLE_DARK }, + { "saturated_purple_light", COLOUR_SATURATED_PURPLE_LIGHT }, + { "orange_light", COLOUR_ORANGE_LIGHT }, + { "aqua_dark", COLOUR_AQUA_DARK }, + { "magenta_light", COLOUR_MAGENTA_LIGHT }, + { "dull_brown_dark", COLOUR_DULL_BROWN_DARK }, + { "dull_brown_light", COLOUR_DULL_BROWN_LIGHT }, + { "invisible", COLOUR_INVISIBLE }, + { "void", COLOUR_VOID }, }; colour_t FromString(std::string_view s, colour_t defaultValue) @@ -103,6 +129,11 @@ namespace Colour } // namespace Colour +uint8_t ColourToPaletteIndex(colour_t colour) +{ + return COLOUR_USABLE_ORDER[colour]; +} + #ifndef NO_TTF static uint8_t BlendColourMap[PALETTE_COUNT][PALETTE_COUNT] = { 0 }; diff --git a/src/openrct2/interface/Colour.h b/src/openrct2/interface/Colour.h index 5a3f8d066c..0cbe6e4563 100644 --- a/src/openrct2/interface/Colour.h +++ b/src/openrct2/interface/Colour.h @@ -20,6 +20,7 @@ using PaletteIndex = uint8_t; */ enum : colour_t { + // Original Colours COLOUR_BLACK, COLOUR_GREY, COLOUR_WHITE, @@ -53,6 +54,32 @@ enum : colour_t COLOUR_BRIGHT_PINK, COLOUR_LIGHT_PINK, + // Extended Colour Set + COLOUR_DARK_OLIVE_DARK, + COLOUR_DARK_OLIVE_LIGHT, + COLOUR_SATURATED_BROWN_LIGHT, + COLOUR_BORDEAUX_RED_DARK, + COLOUR_BORDEAUX_RED_LIGHT, + COLOUR_GRASS_GREEN_DARK, + COLOUR_GRASS_GREEN_LIGHT, + COLOUR_OLIVE_DARK, + COLOUR_OLIVE_LIGHT, + COLOUR_SATURATED_GREEN_LIGHT, + COLOUR_TAN_DARK, + COLOUR_TAN_LIGHT, + COLOUR_DULL_PURPLE_LIGHT, + COLOUR_DULL_GREEN_DARK, + COLOUR_DULL_GREEN_LIGHT, + COLOUR_SATURATED_PURPLE_DARK, + COLOUR_SATURATED_PURPLE_LIGHT, + COLOUR_ORANGE_LIGHT, + COLOUR_AQUA_DARK, + COLOUR_MAGENTA_LIGHT, + COLOUR_DULL_BROWN_DARK, + COLOUR_DULL_BROWN_LIGHT, + COLOUR_INVISIBLE, + COLOUR_VOID, + COLOUR_COUNT, COLOUR_NULL = 255, @@ -64,7 +91,8 @@ enum : colour_t enum { COLOUR_DARK_WATER = 9, - COLOUR_LIGHT_WATER = 10 + COLOUR_LIGHT_WATER = 10, + COLOUR_DEEP_WATER = 50 }; enum : PaletteIndex @@ -157,6 +185,74 @@ enum : PaletteIndex PALETTE_INDEX_254 = 254, // Primary remap 11 }; +// clang-format off +// colour_t ordered for use in color dropdown +static constexpr colour_t COLOUR_USABLE_ORDER[] = { + COLOUR_BLACK, + COLOUR_SATURATED_RED, + COLOUR_DARK_ORANGE, + COLOUR_DARK_YELLOW, + COLOUR_GRASS_GREEN_DARK, + COLOUR_SATURATED_GREEN, + COLOUR_AQUA_DARK, + COLOUR_DARK_BLUE, + COLOUR_SATURATED_PURPLE_DARK, + + COLOUR_GREY, + COLOUR_BRIGHT_RED, + COLOUR_LIGHT_ORANGE, + COLOUR_YELLOW, + COLOUR_MOSS_GREEN, + COLOUR_BRIGHT_GREEN, + COLOUR_TEAL, + COLOUR_LIGHT_BLUE, + COLOUR_BRIGHT_PURPLE, + + COLOUR_WHITE, + COLOUR_LIGHT_PINK, + COLOUR_ORANGE_LIGHT, + COLOUR_BRIGHT_YELLOW, + COLOUR_GRASS_GREEN_LIGHT, + COLOUR_SATURATED_GREEN_LIGHT, + COLOUR_AQUAMARINE, + COLOUR_ICY_BLUE, + COLOUR_SATURATED_PURPLE_LIGHT, + + COLOUR_DULL_BROWN_DARK, + COLOUR_BORDEAUX_RED_DARK, + COLOUR_TAN_DARK, + COLOUR_SATURATED_BROWN, + COLOUR_DARK_OLIVE_DARK, + COLOUR_OLIVE_DARK, + COLOUR_DULL_GREEN_DARK, + COLOUR_DARK_PURPLE, + COLOUR_DARK_PINK, + + COLOUR_DARK_BROWN, + COLOUR_BORDEAUX_RED, + COLOUR_SALMON_PINK, + COLOUR_LIGHT_BROWN, + COLOUR_DARK_OLIVE_GREEN, + COLOUR_OLIVE_GREEN, + COLOUR_DARK_GREEN, + COLOUR_LIGHT_PURPLE, + COLOUR_BRIGHT_PINK, + + COLOUR_DULL_BROWN_LIGHT, + COLOUR_BORDEAUX_RED_LIGHT, + COLOUR_TAN_LIGHT, + COLOUR_SATURATED_BROWN_LIGHT, + COLOUR_DARK_OLIVE_LIGHT, + COLOUR_OLIVE_LIGHT, + COLOUR_DULL_GREEN_LIGHT, + COLOUR_DULL_PURPLE_LIGHT, + COLOUR_MAGENTA_LIGHT, + + COLOUR_INVISIBLE, + COLOUR_VOID +}; +// clang-format on + constexpr size_t PALETTE_COUNT = 256; constexpr uint8_t PALETTE_OFFSET_DYNAMIC = PALETTE_INDEX_10; @@ -178,6 +274,9 @@ constexpr uint8_t PALETTE_LENGTH_REMAP = 12; constexpr uint8_t PALETTE_OFFSET_ANIMATED = PALETTE_INDEX_230; constexpr uint8_t PALETTE_LENGTH_ANIMATED = 16; +constexpr uint8_t COLOUR_NUM_ORIGINAL = 32; +constexpr uint8_t COLOUR_NUM_NORMAL = 54; + #define TEXT_COLOUR_254 (254) #define TEXT_COLOUR_255 (255) @@ -218,6 +317,8 @@ namespace Colour colour_t FromString(std::string_view s, colour_t defaultValue = COLOUR_BLACK); } +uint8_t ColourToPaletteIndex(colour_t colour); + #ifndef NO_TTF uint8_t BlendColours(const uint8_t paletteIndex1, const uint8_t paletteIndex2); #endif diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index 4e1793e5e2..fd5335493c 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -3950,6 +3950,33 @@ enum : uint16_t STR_OBJECT_SELECTION_ERR_COMPAT_OBJECT = 6549, STR_OBJECT_SELECTION_COMPAT_OBJECT_DESCRIPTION = 6550, + STR_COLOUR_DARK_OLIVE_DARK_TIP = 6551, + STR_COLOUR_DARK_OLIVE_LIGHT_TIP = 6552, + STR_COLOUR_SATURATED_BROWN_LIGHT_TIP = 6553, + STR_COLOUR_BORDEAUX_RED_DARK_TIP = 6554, + STR_COLOUR_BORDEAUX_RED_LIGHT_TIP = 6555, + STR_COLOUR_GRASS_GREEN_DARK_TIP = 6556, + STR_COLOUR_GRASS_GREEN_LIGHT_TIP = 6557, + STR_COLOUR_OLIVE_DARK_TIP = 6558, + STR_COLOUR_OLIVE_LIGHT_TIP = 6559, + STR_COLOUR_SATURATED_GREEN_LIGHT_TIP = 6560, + STR_COLOUR_TAN_DARK_TIP = 6561, + STR_COLOUR_TAN_LIGHT_TIP = 6562, + STR_COLOUR_DULL_PURPLE_LIGHT_TIP = 6563, + STR_COLOUR_DULL_GREEN_DARK_TIP = 6564, + STR_COLOUR_DULL_GREEN_LIGHT_TIP = 6565, + STR_COLOUR_SATURATED_PURPLE_DARK_TIP = 6566, + STR_COLOUR_SATURATED_PURPLE_LIGHT_TIP = 6567, + STR_COLOUR_ORANGE_LIGHT_TIP = 6568, + STR_COLOUR_AQUA_DARK_TIP = 6569, + STR_COLOUR_MAGENTA_LIGHT_TIP = 6570, + STR_COLOUR_DULL_BROWN_DARK_TIP = 6571, + STR_COLOUR_DULL_BROWN_LIGHT_TIP = 6572, + STR_COLOUR_INVISIBLE_TIP = 6573, + STR_COLOUR_VOID_TIP = 6574, + STR_CHEAT_ALLOW_SPECIAL_COLOUR_SCHEMES = 6575, + STR_CHEAT_ALLOW_SPECIAL_COLOUR_SCHEMES_TIP = 6576, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working /* MAX_STR_COUNT = 32768 */ // MAX_STR_COUNT - upper limit for number of strings, not the current count strings }; diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 12313b84a4..64009cd5fd 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -43,7 +43,7 @@ // It is used for making sure only compatible builds get connected, even within // single OpenRCT2 version. -#define NETWORK_STREAM_VERSION "5" +#define NETWORK_STREAM_VERSION "6" #define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION diff --git a/src/openrct2/park/ParkFile.h b/src/openrct2/park/ParkFile.h index 185e94ba15..6cb3c62428 100644 --- a/src/openrct2/park/ParkFile.h +++ b/src/openrct2/park/ParkFile.h @@ -9,10 +9,10 @@ struct ObjectRepositoryItem; namespace OpenRCT2 { // Current version that is saved. - constexpr uint32_t PARK_FILE_CURRENT_VERSION = 24; + constexpr uint32_t PARK_FILE_CURRENT_VERSION = 25; // The minimum version that is forwards compatible with the current version. - constexpr uint32_t PARK_FILE_MIN_VERSION = 24; + constexpr uint32_t PARK_FILE_MIN_VERSION = 25; // The minimum version that is backwards compatible with the current version. // If this is increased beyond 0, uncomment the checks in ParkFile.cpp and Context.cpp! diff --git a/src/openrct2/scripting/ScriptEngine.h b/src/openrct2/scripting/ScriptEngine.h index f309d823e9..eb211adf93 100644 --- a/src/openrct2/scripting/ScriptEngine.h +++ b/src/openrct2/scripting/ScriptEngine.h @@ -47,7 +47,7 @@ namespace OpenRCT2 namespace OpenRCT2::Scripting { - static constexpr int32_t OPENRCT2_PLUGIN_API_VERSION = 71; + static constexpr int32_t OPENRCT2_PLUGIN_API_VERSION = 72; // Versions marking breaking changes. static constexpr int32_t API_VERSION_33_PEEP_DEPRECATION = 33; diff --git a/src/openrct2/scripting/bindings/game/ScCheats.hpp b/src/openrct2/scripting/bindings/game/ScCheats.hpp index f578e0b8bc..8aef117dfc 100644 --- a/src/openrct2/scripting/bindings/game/ScCheats.hpp +++ b/src/openrct2/scripting/bindings/game/ScCheats.hpp @@ -42,6 +42,9 @@ namespace OpenRCT2::Scripting ctx, &ScCheats::disablePlantAging_get, &ScCheats::disablePlantAging_set, "disablePlantAging"); dukglue_register_property( ctx, &ScCheats::allowRegularPathAsQueue_get, &ScCheats::allowRegularPathAsQueue_set, "allowRegularPathAsQueue"); + dukglue_register_property( + ctx, &ScCheats::allowSpecialColourSchemes_get, &ScCheats::allowSpecialColourSchemes_set, + "allowSpecialColourSchemes"); dukglue_register_property( ctx, &ScCheats::disableRideValueAging_get, &ScCheats::disableRideValueAging_set, "disableRideValueAging"); dukglue_register_property( @@ -172,6 +175,17 @@ namespace OpenRCT2::Scripting gCheatsAllowRegularPathAsQueue = value; } + bool allowSpecialColourSchemes_get() + { + return gCheatsAllowSpecialColourSchemes; + } + + void allowSpecialColourSchemes_set(bool value) + { + ThrowIfGameStateNotMutable(); + gCheatsAllowSpecialColourSchemes = value; + } + bool disableRideValueAging_get() { return gCheatsDisableRideValueAging; diff --git a/src/openrct2/sprites.h b/src/openrct2/sprites.h index 3e9f14ecff..cde92b3cc9 100644 --- a/src/openrct2/sprites.h +++ b/src/openrct2/sprites.h @@ -1364,7 +1364,61 @@ enum SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL = SPR_G2_ALPINE_LIFT_TRACK_FLAT_DIAGONAL + 4, SPR_G2_ALPINE_END = SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 12, - SPR_G2_END = SPR_G2_ALPINE_END, + SPR_G2_ICON_PALETTE_INVISIBLE = SPR_G2_ALPINE_END, + SPR_G2_ICON_PALETTE_INVISIBLE_PRESSED, + + SPR_G2_PALETTE_BEGIN, + SPR_G2_PAL_REMAP_DARK_OLIVE_DARK = SPR_G2_PALETTE_BEGIN, + SPR_G2_PAL_REMAP_DARK_OLIVE_LIGHT, + SPR_G2_PAL_REMAP_SATURATED_BROWN_LIGHT, + SPR_G2_PAL_REMAP_BORDEAUX_RED_DARK, + SPR_G2_PAL_REMAP_BORDEAUX_RED_LIGHT, + SPR_G2_PAL_REMAP_GRASS_GREEN_DARK, + SPR_G2_PAL_REMAP_GRASS_GREEN_LIGHT, + SPR_G2_PAL_REMAP_OLIVE_DARK, + SPR_G2_PAL_REMAP_OLIVE_LIGHT, + SPR_G2_PAL_REMAP_SATURATED_GREEN_LIGHT, + SPR_G2_PAL_REMAP_TAN_DARK, + SPR_G2_PAL_REMAP_TAN_LIGHT, + SPR_G2_PAL_REMAP_DULL_PURPLE_LIGHT, + SPR_G2_PAL_REMAP_DULL_GREEN_DARK, + SPR_G2_PAL_REMAP_DULL_GREEN_LIGHT, + SPR_G2_PAL_REMAP_SATURATED_PURPLE_DARK, + SPR_G2_PAL_REMAP_SATURATED_PURPLE_LIGHT, + SPR_G2_PAL_REMAP_ORANGE_LIGHT, + SPR_G2_PAL_REMAP_AQUA_DARK, + SPR_G2_PAL_REMAP_MAGENTA_LIGHT, + SPR_G2_PAL_REMAP_DULL_BROWN_DARK, + SPR_G2_PAL_REMAP_DULL_BROWN_LIGHT, + SPR_G2_PAL_REMAP_INVISIBLE, + SPR_G2_PAL_REMAP_VOID, + SPR_G2_PAL_GLASS_DARK_OLIVE_DARK, + SPR_G2_PAL_GLASS_DARK_OLIVE_LIGHT, + SPR_G2_PAL_GLASS_SATURATED_BROWN_LIGHT, + SPR_G2_PAL_GLASS_BORDEAUX_RED_DARK, + SPR_G2_PAL_GLASS_BORDEAUX_RED_LIGHT, + SPR_G2_PAL_GLASS_GRASS_GREEN_DARK, + SPR_G2_PAL_GLASS_GRASS_GREEN_LIGHT, + SPR_G2_PAL_GLASS_OLIVE_DARK, + SPR_G2_PAL_GLASS_OLIVE_LIGHT, + SPR_G2_PAL_GLASS_SATURATED_GREEN_LIGHT, + SPR_G2_PAL_GLASS_TAN_DARK, + SPR_G2_PAL_GLASS_TAN_LIGHT, + SPR_G2_PAL_GLASS_DULL_PURPLE_LIGHT, + SPR_G2_PAL_GLASS_DULL_GREEN_DARK, + SPR_G2_PAL_GLASS_DULL_GREEN_LIGHT, + SPR_G2_PAL_GLASS_SATURATED_PURPLE_DARK, + SPR_G2_PAL_GLASS_SATURATED_PURPLE_LIGHT, + SPR_G2_PAL_GLASS_ORANGE_LIGHT, + SPR_G2_PAL_GLASS_AQUA_DARK, + SPR_G2_PAL_GLASS_MAGENTA_LIGHT, + SPR_G2_PAL_GLASS_DULL_BROWN_DARK, + SPR_G2_PAL_GLASS_DULL_BROWN_LIGHT, + SPR_G2_PAL_GLASS_INVISIBLE, + SPR_G2_PAL_GLASS_VOID, + SPR_G2_PALETTE_END = SPR_G2_PAL_GLASS_VOID, + + SPR_G2_END, SPR_CSG_BEGIN = SPR_G2_END, SPR_CSG_END = SPR_CSG_BEGIN + RCT1::Limits::Num_LL_CSG_Entries,