From d339fb13b008a3950a2e4d1e18101d00de0f4d18 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 6 Mar 2025 20:04:53 +0100 Subject: [PATCH] =?UTF-8?q?Canviades=20les=20paletes=20dels=20.gif=20Ara?= =?UTF-8?q?=20es=20poden=20carregar=20paletes=20desde=20fitxers=20.pal=20R?= =?UTF-8?q?eajustada=20la=20pleta=20general=20fix:=20la=20pantalla=20de=20?= =?UTF-8?q?c=C3=A0rrega=20deixava=20un=20pixel=20per=20pintar,=20desde=20s?= =?UTF-8?q?empre=20Ajustat=20el=20color=20del=20borde=20en=20el=20Logo=20i?= =?UTF-8?q?=20el=20Title=20per=20a=20ser=20igual=20al=20fondo=20amb=20les?= =?UTF-8?q?=20paletes=20de=2016=20colors=20(la=20del=20Spectrum=20es=20de?= =?UTF-8?q?=2015)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/ending/ending1.gif | Bin 1053 -> 995 bytes data/ending/ending2.gif | Bin 3061 -> 2999 bytes data/ending/ending3.gif | Bin 2999 -> 2937 bytes data/ending/ending4.gif | Bin 1224 -> 1166 bytes data/ending/ending5.gif | Bin 1398 -> 1338 bytes data/loading/loading_screen_color.gif | Bin 7326 -> 7242 bytes data/palette/island-joy-16.pal | 19 ++++ data/palette/lost-century.pal | 19 ++++ data/palette/na16.pal | 19 ++++ data/palette/pico-8.pal | 19 ++++ data/palette/ruzx-spectrum-revision-2.gif | Bin 379 -> 0 bytes data/palette/ruzx-spectrum-revision-2.pal | 19 ++++ data/palette/ruzx-spectrum.gif | Bin 379 -> 0 bytes data/palette/ruzx-spectrum.pal | 19 ++++ data/palette/steam-lords.pal | 19 ++++ data/palette/sweetie-16.pal | 19 ++++ data/palette/zx-spectrum-adjusted.gif | Bin 379 -> 0 bytes data/palette/zx-spectrum-adjusted.pal | 19 ++++ data/palette/zx-spectrum.gif | Bin 379 -> 0 bytes data/palette/zx-spectrum.pal | 19 ++++ data/palette/zxarne-5-2.gif | Bin 379 -> 0 bytes data/palette/zxarne-5-2.pal | 19 ++++ data/tilesets/standard.gif | Bin 9219 -> 9166 bytes data/title/title_loading.gif | Bin 4637 -> 4656 bytes data/title/title_logo.gif | Bin 2408 -> 2348 bytes source/credits.cpp | 106 +++++++++++----------- source/director.cpp | 21 +++-- source/ending.cpp | 23 +++-- source/ending2.cpp | 15 ++- source/game.cpp | 4 - source/global_inputs.cpp | 15 +-- source/input.h | 3 +- source/loading_screen.cpp | 8 +- source/loading_screen.h | 2 +- source/logo.cpp | 6 +- source/logo.h | 2 + source/options.cpp | 12 +-- source/player.cpp | 6 +- source/resource.cpp | 3 +- source/screen.cpp | 29 +++++- source/screen.h | 4 + source/surface.cpp | 60 +++++++++++- source/surface.h | 14 ++- source/title.cpp | 4 +- source/utils.cpp | 42 +++++---- source/utils.h | 44 +++++++-- 46 files changed, 478 insertions(+), 154 deletions(-) create mode 100644 data/palette/island-joy-16.pal create mode 100644 data/palette/lost-century.pal create mode 100644 data/palette/na16.pal create mode 100644 data/palette/pico-8.pal delete mode 100644 data/palette/ruzx-spectrum-revision-2.gif create mode 100644 data/palette/ruzx-spectrum-revision-2.pal delete mode 100644 data/palette/ruzx-spectrum.gif create mode 100644 data/palette/ruzx-spectrum.pal create mode 100644 data/palette/steam-lords.pal create mode 100644 data/palette/sweetie-16.pal delete mode 100644 data/palette/zx-spectrum-adjusted.gif create mode 100644 data/palette/zx-spectrum-adjusted.pal delete mode 100644 data/palette/zx-spectrum.gif create mode 100644 data/palette/zx-spectrum.pal delete mode 100644 data/palette/zxarne-5-2.gif create mode 100644 data/palette/zxarne-5-2.pal diff --git a/data/ending/ending1.gif b/data/ending/ending1.gif index aa74226e3a6d105917dfecbd1d1a0ccc1cbfc652..d7c03d4f1616d942fa3b2b5f4a71c0129f98b648 100644 GIT binary patch delta 974 zcmV;<12O!a2;&DmM@dFFH(_1?RRFU900000000000N4Nk|JVQk{{R5k0NDQk{{Ywk z0RI30*w_I7|Jc|7|Nj8k*x3L7|B-Dae+2(9$VsccIP1;3|6nMNWNDsgs;+G7zHlth zbZy^wuJ3&BQ;J|9sMrX9siH(VBwCbCq$sK(QlU(#F>4YYwHPi-45qfe;AM@BWS`R$ zHe+s?(>dmHX5MI6`V)R(a1~^BeTaU5iitpIghLf}41g7l5{N*Mg%p#Nm7tjvf0b@} zos*)0my3dto30a{mzasIw1TB=b%(XRl>xPCuVSda#=XLu#JtC%$gq&he9eu|xj)jM z)PUNguh0RqvzC6{e%IKNlNqU_favM5cJ9=c;L(!w+q3XKZsQwpeT#$Pld5gW2Hp!t z3D`bO3KPmRcMM`giLvT&x@eJ{f3YVV|3O|51h7fS3;jAuvBL6^$_^=Kw^vu967UKo0s7mlD7B|eiX-8hse$%Q+RDxKK%VrGCcHH)90A8#{L8(pFB*mL0Z}(3>^%*AxOrV#4YvZj{b{YHx77o%h$^ z)1QSU%HTT?*w?q`J9~5hf8g;2#uNWm+F{kud73cB7k{Z#^&Nbb$+ui6<*}iC!S&gI-q2sU6>zlWQwxrmOyqn zTB1FL)~KWMZOYq6Og0&#gw74;lcsYSi7KiW$SH_}l%|QPY*T4^p)jl3+UiZ|8G5L0 zj5SJ?Y`5Z?tEZGze;{V8!Ocf&eOIYYp~SJrN~j*Q)>ic_TFJpeEwR}S2%V^ivNqXt z-I^p^uKhVS?yq_ENn8@suG+4<p_1%RfzQJ=($$E?2GTA}QK{)!}>!1;!YFi^$4 wp{bg_-s!MqY#8i95us6BF`5pOr4zscQ2Z{u=<2}nxhCi92;{yAR}cXJJ3vR{6#xJL delta 1032 zcmaFNK9{53-P6s&JTZi6!7x$-e6$(59EQV8#fsK!#Fn>Zu|$zfQ4?{xbYt> z0n=@u`q-Vg)$iOhsUzmmUe}clq0@3>a2No1~=t%XSSWLhYi`jg zE7fe~;85#T?kj9iEotkW(Klh%%z%n1!K!WS6IACa%?Ma9Rb}y#r5jeNEUoKWyLi*Y z<+CR(T)j_u-SQPP_tqbow6(T%`q8sX8IM-&FWPbL+SyC1ubjEQ>BfNtw|nl+y?@gG z(fTJ7UTxX`fbr1bWqoh^p1)YMSaav*2|s=|Nq%xaC$gtt5yv`dwhNu}E43%=mQ) zw%nW1k1Yy=X1lDpy-i7INlDu)b)ntmA7AZ_xb*7QfyU25eQm~?eOeuY+ID98jrR^F zG&0=FI+V+By2UesP1mV0YMzx@erf2e`ZrI67aOLx9zXV6V%s|RprhK08W@?C-TDjW z9(%Fyj6-y>Sv5m>-u(lg`M$-(WPNt%bAI~o*hS0dOc$)HzdgMi5p;E#?Kk0zbIgC- zS5azzbm+Bq(VTnpSGgDLo&Wp(ho|M@2Ad+j@bkQQdtLs2^5L^$3?+fSk{<%wlJ(ORo1g7@`!4WpxaD2wKcWNu3Oe~mVFKCop7gf`Sid|N9986 z{#7oS(;ZgqWqs~%g~p;HC#!`S8|ThYC@wj*>E*0|ZI;o?e2-pRxtwX;sXN{=Ws*xe z?)g5SvZ^_|1zr>-CDR74qAkP5Y`FcazasZ|h4xj(KZld@{RL@%ENV>?YnSv-g`j zO}%2p9>2S_e*YJxS?@R}Jlh?#_{yo{YY)AdweW2V-)WV3M>vmn8-`r{yKvRKb8@dX sX4XW!aTeV;F~(?~+~uVrM>r?^(LeA*>)@xoX6kRA9+I3cz{Fq;08?-2lmGw# diff --git a/data/ending/ending2.gif b/data/ending/ending2.gif index 40237af341bd5d9d5c7850d033ecdf64b9706790..d182b34b594c31e8466537f2bd1ccf710c4796b5 100644 GIT binary patch delta 2993 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 diff --git a/data/ending/ending3.gif b/data/ending/ending3.gif index 9c61bf0234eb6fa6ff5de2e4bc18f5fea2157154..b65aee112436d90fccd1b88df3f1d51f8cacc0ba 100644 GIT binary patch delta 2869 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 TxQeXUimv#Iuo#Q77y$q~hAXGl delta 2949 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 MZu{-HGadl|J72;(wg3PC literal 1224 zcmZ?wbh9u|OkoITIKlu0yu7?O7#RKod0^_s4Tk?P&JBhe|A8`Kp&K`D{0B?G^bw{N z|8x7fh6Fo12DlpO889;fbtwL1;p76+Iw0L3XE3n-Pf+Mf$()z5YF*CjeFZw_OLFg5 ztb1RhZ+{@+g8LE9#tBP;G(j~_Rh8O1dJhC>0Dr7Y9^0!_;^-6+ZsWZ$dZS8H&FW~Rg^-%8b%VVE4y<@UQ!;Jpfi((#JSut;_()10pIoNmY*}ZSq?3T@S-P_mgJ+c4P$%9FUBZIc}9Y4LF zxc!uwhhTf+h|2@8(m~iZ< zspQs~G7iG3OoA*$LL3JsUOz5<(Pf`<@GXgCLtM5JyqYiZk22j z8%)&C*BSd~J#BWIbXw2JUGcKSg6wm%V(!*WH4lD%!$dcH4~y{SRkye2{y�ef^zp zf$8TuuFi>BHrwizrRQxAeRp=3{a2&5mothIPfmLo_Ri|js_>&~ON#D2mn=D_;?4eh zsD$ipxYm?@dOFixDxYalI)BAO z&&^W*8}?jPi>Q2avwVKxj+e(2TACg%pP2cA@pyba*T3zvUDPhREo!jtZB1x;9O$}|_=9R4L zegCpcXZNXNtM#|VE|~pp<7=T3cy1qa(JW@l>%SpM0tufW4+ zr8QH1VWF>?D6za_`)3c3nCM@dFFH(_u9TL7~F00000000000N4Nk|JVQk{{R5k0NDQk{{Ywk z0RI30*w_I7|Jc|7|Nj8k*x3L7|B-Da4g~)&$VsccIP1;3|6nMQmLq>JifACJ*hqud zT2->0QZ3tWFFX@#sOE4N*EO@UCn;PTU`)BKb)^u$ZS50tC2o6s7lvngF;WbTfOvfy z1(Sz}XEa?54GoTvCW;o5mJ^~JpetgHo1Av1A*T!lv88pLv`~U?c&e+Mcaayd4U@wY z#iFBubQ7AJ51W9l9-x1YqMLjL4FTBM*%X9}wY<;Jo+NsXv&6&e*2Bf-n6<0qtiOX4 z>CNu!$l3kz1?=+a&Lw{RgtTGC!rY4)tsy%7l=ty|7A>UK+fPr zj20Ab{J4>!$B^Ng`GWaDk;-20aJu|QQ=)`&J*TDAh_mRXpDurcx~Nhv7s?7Zjp7VY zRH?3?Ry)`vDs`&NqbKD#P=*R>RBacIe$^Jy=h(2oBc_fU*D`HJL3SE0u zV4I_ggS|fU0S+vcte*gf;i7OQ*aKR=x*}snh@qJ=#$Y#>)eM80CaR#(W*z-jbj@JA zK!4j|7;(5@jKP2Ks4cmy-NqGMtEk<&30%H*#<0eSvH_TwE)f>#kfcM~EiF zbm!8*1)uZBqWA5uXJhC>dOd{!@Z-lNyt6N z9Cht^$6q`F4k)2~L#gzWHlZ2Eplz4*r_6*PQkV}{s9}G2nT8B1_=|@Th6thr0x$!d zYAWK>Ty<7V&{~Twz8K?YfvK0*gN~Up-FrQ{D8T?gR)q^H-*Ms8B}5{bB!L0^SYmQn z#;B!!kWjapZjeoIzyV9nXF-TvHc5d1aB9gUT-PPioRpJMaORl-P&ikg6T+B5oN`jA z$DwO~Xtm*+VlF>+b60RCUd_u**#L$Ss;N7Zgom z1ag0cbY@&Cj{t2hp%2s+Ha56nDEze9lJYv|J z4qafNpIQypSG4lEb>7jQ`?IEm!W}o3lE!A#(}v^Cbssz@A+x%g-s+3+Z7P2u>wc37JL|BSM|tU%s|#}D6K>i$sa^iA ze4E0~NrCPBR;oLQKlZ-f7S22Wv6^WkZvETr+R#P!&npQm^WdXe3&m^b|LV56m0TiGEX_$cs002AWFM_22 delta 1366 zcmairdotR){c4Pv0G`A=)ny)yPeMM@B97dbH3lt`SR7))CjI_C_CFr7yu1C0sadV z3Kau@{CoQWu^5p5EMh<`|89OvVzF5ML;U>xKMmySo-V#Vr%!piSRySHK>$GY+5uLQ zhv-u=a6;KA`?`Dm`37+v?%7h3S2jj}Iv|U=5E|H`ch_Sv{)l5fXK*cH??mh8G2778 zD3D6nmE(A0@E@+x8Sq=yH}8;5Y4M~}p(>@6%_WVI|u=7yQiueu}JuJwjcZ$A!?6^@2gnd9n4IkrlUqZ#T~0&bXc zyZv^LNvGRKoz2cQ9b6W5XE_hM918Pt)Q%~>H&Dchf~fW8kY$afc{!Bo>00l zFyzD>$gC)~9>MsJ`$5x6%z2F;3Du?F{BbWLhC_PLp}N?vh?04W14ur1e#AI=(QKwu zQ?09N)~$?dcOCm7yS%O=C>TNi+?{+?kZIbVuq>H#+5cs*a&xukHZ$Th{)DO$pbTT+ zh=WXuN7C@8ElTC?f5P`bxfIFaTjfR56OBvG#^9gA>Eaqv%}6E!gX5sJ>1wJ57T6DWq^v*M}O8o{83a zq@0a4kxCzw=P1#dwMhV?Hasd2wby?aiUw(w9Od{DlFX+xjAU;EWn6ZiI=91HjmEWK z>Yh5#9z3>);LJ;k8y*JI6AW>(XE!y`Id$eOwP-*VziT zi6kt(2}p;wH$4xsd5WZ;^55whzLS@JBXX5Ag%u+4$D0CdvNf(w#3xG6v(ec1R-M~U zsIjLfX-Njxol+1;VG!OSY?|X4e5tab2s(~_V#&uz=4UorYV#HJ?20OsFN@~JY48!8 zs7mcj4762C*pTgv=Wi@WA!7~Oh9+kga{;co;c|{p)nU1J z!Zm5BdQly_0OwBH*T*#-{Ki2Z+KFRr^k=#f42LTznQHwO9~=M2sf2G06T>H8D$2#XW1gmi&qp&6yf|3h1m zuOIE%XsgMC27u#4JBAwVSslY^+I9Q)y=H=SOfXl^9%0a0T{Cs~l*`*4=7i2{4fl?f Q^zHc!m8?Rd762Uk7u$P{+W-In diff --git a/data/loading/loading_screen_color.gif b/data/loading/loading_screen_color.gif index 2fbcfdb0e68dbe13cf832a07b2ba7f21c8c526f9..8b61168540be9358dfc4159aea62d86abfeec5dc 100644 GIT binary patch literal 7242 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 YsYxd$laR{<D`| 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 diff --git a/data/palette/island-joy-16.pal b/data/palette/island-joy-16.pal new file mode 100644 index 0000000..d9dd476 --- /dev/null +++ b/data/palette/island-joy-16.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 255 255 +109 247 193 +17 173 193 +96 108 129 +57 52 87 +30 136 117 +91 179 97 +161 229 90 +247 228 118 +249 146 82 +203 77 104 +106 55 113 +201 36 100 +244 140 182 +247 182 158 +155 156 130 diff --git a/data/palette/lost-century.pal b/data/palette/lost-century.pal new file mode 100644 index 0000000..cd66b10 --- /dev/null +++ b/data/palette/lost-century.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +209 177 135 +199 123 88 +174 93 64 +121 68 74 +75 61 68 +186 145 88 +146 116 65 +77 69 57 +119 116 59 +179 165 85 +210 201 165 +140 171 161 +75 114 110 +87 72 82 +132 120 117 +171 155 142 diff --git a/data/palette/na16.pal b/data/palette/na16.pal new file mode 100644 index 0000000..21b59d0 --- /dev/null +++ b/data/palette/na16.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +140 143 174 +88 69 99 +62 33 55 +154 99 72 +215 155 125 +245 237 186 +192 199 65 +100 125 52 +228 148 58 +157 48 59 +210 100 113 +112 55 127 +126 196 193 +52 133 157 +23 67 75 +31 14 28 diff --git a/data/palette/pico-8.pal b/data/palette/pico-8.pal new file mode 100644 index 0000000..9868da0 --- /dev/null +++ b/data/palette/pico-8.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +29 43 83 +126 37 83 +0 135 81 +171 82 54 +95 87 79 +194 195 199 +255 241 232 +255 0 77 +255 163 0 +255 236 39 +0 228 54 +41 173 255 +131 118 156 +255 119 168 +255 204 170 diff --git a/data/palette/ruzx-spectrum-revision-2.gif b/data/palette/ruzx-spectrum-revision-2.gif deleted file mode 100644 index 1369996a6e557608e8ed2dc03df6d796a77bc3c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379 zcmZ?wbh9u|Y+&GEIKlt|f`Y0lN<}(#-a+2E|Klv@DSZlY)KItoHxU z{N_C4$cB?gCjWo>|IbITCSnQ2|J;7AA;Hd$0j@@R2F#2=eTqL>IJtnd4#*6UGZhyVAr7HFhM^dD<1TIpgj|6E&%R&B)kYt3b= zeJl3I330Y2ZA>tb;%$HYvB5z}urtMIVStus_tT<-2}#N+>S@{;`dP*~=6Tiy_C?Mm z?q%K;{#C&>;dRjs@lC2NEN!|S0$rv(Tz$3^SSPto;hE+;gJV|c9R7K+3pf`sE?K&4 z#mZG{)~?&IanqKq+ji{SwP)|X0|yr!S;lvK71OD8Y-cxdU)aWcc^B`see5?6-8r`6 p!J{)9p1ruVY)_7rnNxlUiSX(}{t>8UStcItt9K{P{jc`@sjr6cf?|Qm(wWN>vzolJ z|GyL2>i+Wn+AZ6E{(l43L@c5BpWDwhB-q(8z|~04fSD1fPw^)UCl`>`0hs}E1_SHU z1ckmwN%Nj9UZ?eBpPtfrqvZSF7QDB5_ zmw8wCR|VIE*F`tPH>tL8x9N5WbeZ<>^w~~endCZ!cbe}EwppQb_~ykfU|+Q^xD2oYJK@lCk6&<075U5A^-pY diff --git a/data/palette/ruzx-spectrum.pal b/data/palette/ruzx-spectrum.pal new file mode 100644 index 0000000..55d1a2f --- /dev/null +++ b/data/palette/ruzx-spectrum.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +15 11 56 +97 106 130 +173 180 183 +249 255 236 +40 19 160 +74 107 255 +160 35 17 +237 23 95 +115 16 147 +238 20 181 +39 139 97 +157 255 38 +27 105 167 +71 233 223 +122 87 22 +247 229 77 diff --git a/data/palette/steam-lords.pal b/data/palette/steam-lords.pal new file mode 100644 index 0000000..4bb5a56 --- /dev/null +++ b/data/palette/steam-lords.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +33 59 37 +58 96 74 +79 119 84 +161 159 124 +119 116 79 +119 92 79 +96 59 58 +59 33 55 +23 14 25 +47 33 59 +67 58 96 +79 82 119 +101 115 140 +124 148 161 +160 185 186 +192 209 204 diff --git a/data/palette/sweetie-16.pal b/data/palette/sweetie-16.pal new file mode 100644 index 0000000..0139203 --- /dev/null +++ b/data/palette/sweetie-16.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +26 28 44 +93 39 93 +177 62 83 +239 125 87 +255 205 117 +167 240 112 +56 183 100 +37 113 121 +41 54 111 +59 93 201 +65 166 246 +115 239 247 +244 244 244 +148 176 194 +86 108 134 +51 60 87 diff --git a/data/palette/zx-spectrum-adjusted.gif b/data/palette/zx-spectrum-adjusted.gif deleted file mode 100644 index 2fc06863257d9ead9a5fb42269433f44b97ce181..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379 zcmZ?wbh9u|Y+&GEIKlu092^|iG{pWJ%P<^OW%#Lo=7iS&KV}R{#~HMLUok%Z-{B9# z@skX{|D8H@>i_@$Fik|!ivPL&TtkAL9RpmA^bD98ftnP5vT$+%X&sOOAZIYJK21>Q zTa+*_ZPB__kM_M&IB%4A|J$PXR*(PhYbww%k?23xRN(e9^32NRN%Q`FP6GxW2JbIkLs3+#)WOWe!6 zEBvd1Yr^ZI8{(T(TbSB(JGi<`dszBxC-6*iox(QFcLv|A&^a9QViyQ3VqCIx*@~5` z)~sE(VdJJPTet1lxogkfeFqLMI$uNuV!g19_wp|GYy0?b9=daE#e+v@ mHavTAX~&y)Hx4|R`0AUkI=s(t0w6erv{<-E7E!T+k*V@Zgw^rGN?x#fu6Oxou)YG&x^s|g}%=4@Z?2DXB+{?Tx{Hua%!t0_N;+s@knA&tZ zxVlVxSo&-y@Jw=@!Zyu!2H&jEIUMt17YHn3T(Wf8ij}L@tX;QZYJ|Q V>cXeoHt6m|83Fxs)zsWnhP{+B>LUjidN=W%=c?4(W;GDAJ$&By0v0| zoDgSg(#8Y>Dc<(S9~&H$1UplV76xdEc0VmTn2@BLqMoLmp`T@(W1eSSU|-~1;$G%m z;a?S86J8hH5Z|QQ!qleQ!PRBj!_sFvfpwDW6!vMpGk9l(&f%XIyFg$OQKJ8*E(k!766S23Sj$9;Aa+l6gBmv?bo+sAkF(4Au|9y~g; l;n|BzJKnszap1|sSKo9cR~J5=chPJ6I;r*LH=P(5tN|g;lk5Nh diff --git a/data/palette/zxarne-5-2.pal b/data/palette/zxarne-5-2.pal new file mode 100644 index 0000000..8b91176 --- /dev/null +++ b/data/palette/zxarne-5-2.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +60 53 31 +49 51 144 +21 89 219 +167 50 17 +216 85 37 +161 85 137 +205 122 80 +98 154 49 +156 211 60 +40 164 203 +101 220 214 +232 188 80 +241 231 130 +191 191 189 +242 241 237 diff --git a/data/tilesets/standard.gif b/data/tilesets/standard.gif index b53e867ba18f1bee910b79854d1e64125813c08a..0142112b082ad7839c556024668632d266602397 100644 GIT binary patch literal 9166 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 I0|3PS58tD7zyJUM diff --git a/data/title/title_loading.gif b/data/title/title_loading.gif index ab9e8d51f10856c0dbab99a91e1b0186c6f4c6fc..313452ad48d632754fbd9e69d097a24ac54f4786 100644 GIT binary patch delta 382 zcmV-^0fGLVB(Nk7M@dFFH(>w)fB>@q005B-FEt_m3rc3U z#l^txwZ_F0ir1ss9nppt=g_pzKWe&>uO6kOl5AYzHF` z3IJ5(<i$L|(EC2|To(Hf3O@Nb72rdB=lYa+oy01K1#4qyQavsMqs0<{9 delta 344 zcmV-e0jK`3B%LG+M@dFFH(>w)fB>_R4lj{S7Y-1}Nvpj$>&?6W(;{XIk#a2o1(BdS z1Ot>J1Cib$69K~j0ma3}#}dQInOlaUvbnYklM?}=DH5n%%eJlBu2H^;S9}^6HzRUY79^SlPUso0S=R$ z0v;MVpyZNFHtFP(P&Ns`j3?f39)dk>r3wRFGLzK;OaUdcA_Ia00S=R;21o%HlkNse z0_y^kItN4n%aeZxBM$}uROIE-N}Y>9_0|jk2a~Y}umVLulVb=j0TGju2vq}i01lJt z2zmi}lVu4|3i<#=KY7X9-P{0^zX>z}?X&a=0RaI4llBUV0SS|V3mO3jvz!al0RtHT q36pXSH~|Nfs|`N^nzQQ-6afjU01o@G4;ugqlL!xB0SU8d561!~EPk&5 diff --git a/data/title/title_logo.gif b/data/title/title_logo.gif index 56770a4708395368b9b018f64f5897a3768d3f48..4cf3557e5d7f04bba91beeee940d2d5984eaf27f 100644 GIT binary patch delta 2337 zcmV++3EuYT608zEM@dFFH(>w)Pyn+400000000000N4Nk|JVQk{{R5k0NDQk{{Ywk z0RI30*w_I7|Jc|7|Nj8k*x3L7|B-Dae+2&!$VsccIP1;3|6nMNWNCKEsjh76zOb2! zNnO==uJ3&B|G=PdNGuwU$fWRQL(KqBNi;^STCdp9^x3@3rc$VKOfH+x=yW-3`BHLX z=#AY1&$IY^$^L%1`!+psQGaQ28GL$*i+30)hKGcMIDLm~et>zQMy3!@tJC$;!vb0KUS-&&blAvR<{a zTiLKC%G2M|$ri-U<-!ug;?%$2%L6!&|%7a#+8j6wu zNnRw;QP&-S0zdYfY`c8 zr_h?Abx0E&O_kD$tvp6gMz*d$eIgnX%Udv_;VD{_`wsX6#ts8^x1H5zl z?mhhXYL8^aa-pOgXPXPaL(tX`ox^nNxJ>}B?%M))=(RU|4^Mq~><_0(5^5s!E1&JO ziAxwy0lxj+@$thx4qpH7fAIDNcijJY_xTr`fZKV8;C|rES0HS=JQv7jBZZZkg8Lcg zV0Zbw2H=7S^2T9?|0PIbbljnMn~4w3SD%Bjk@w<#3&w{YSUUL?)@Yf{IAD!2x`<(i zB!)<1fEnt3+9qR^P}awyk}=Y!nS?v$NKzZOxagmTe^ZLt+m!|)sTz|4Lcp1`;&*}Bxk~XecB9>ADXFz|(8Q|!n04zEvgL8U_ zrks`Tw&(OAe>tVASSFjG|D#FD8Y!fm{s*jZmj)SUubfKCEPlx8t1pDreS2V=&>AYA1=Z@=roo50 z>#n!X{-|ZZvy?mTmJ07y+@}!h`lH0Lt{5+*^M=f9#m`Fce{0IBf@+b*#G1?Kn77_m z=ek5fnQ+Nj);ep$_F^kCy)Gx+Da-sh(Pz!Yp5#x*MZ&i&r7H8BG}S&&>~6~G9<8s$ zuugjQ$fSvD;ZXpKdeWe^Q9JF~Rzr-a&%c_9Et3`xY&6*SDqZQXk5Wq7u*OO<6yl-k zZMe{8*PUy~e5x+DE2UeT8r1HG@;kVV(lrG5k`1yXWQw*iuA=hr^^?X~JYOC<~7QFS)e+~_<%;FC;TKST>+3;NEyZ}8+ zYuw8nxSBVx>}l^fp8J}IHl@D-GT~|e!-uFCCn)Q+&THzE6Z^F0J_RxeaF=`F1cl}; zO|fu)rISzwaU?b8IId6vtXc|ll|U3)tbTt3qLfP5JEeUOd^9v&a%Ofcfo&&!B65w~ zT9~K;f1Z#)>%zeAR2V-l|3c7p+CtK&0;a^P0KyBa^I&%nlrWU-&}e&t*vX*f!$g_T zeiWc04l}hUu3(Ui_ZU`b`1nCEE+~KUI+GQ9c13KZZ;L8)-~;EDNSv{be;GR?H~K}E zOETAM);<5W0XowTIAp ze|D3hG4o&Y`WZ+xo@@V`odctkVB}7Ejxvm`gA@UuXSVso>sl_Py^@L=#r$$#eF?`-qZg(Q=g*H;tu4ty1qQ_Qd4^c7b`RCHcpaHurvfHI}0k>$yV{SscfV$ec89He?|&X z^)iy8yvo&|3GYCc|MglcFC@sp4pKR3{4MyH#6r?eHMrkwZPiTL#^W~YN=>@!Pn%oW z??q9Ik*%d?lo}{LNRIoM^{cf$kH|cCv z_#4j(M|HFno?~A#oZ$^~IG!FJf9u@j+Tjm(t6L@Ju!1|x#0X!PO9h6aj4$lm8QYk~ z4W=ZHff-60J2uBXrtyy-nO_zXxxo(pY}#I&NevWv$D>6jly6MsDNmWXc*U@lT_@KQ z^H|2A%wv!VJYg3vvB?`4^OfOS>O}4bP@E2O>8e_=5TXqbm&22Mg+u4DY0U4Cs?Q#oc47mn(45n7@cFXh=GhGB= z-A(U#%Ui9H literal 2408 zcmaiucQ_jeAIHPlE=OHM%u;F#joD~z&Q?-2+oEd5ICVv&u2zg7_J}d49i{7-^`x0vPTC1_1v%AP`6b0O;S-50FRz z`oDn$Akn`sKPnQ5ME^1T>-~R<(K#&*AHel>?;AoPN|h*@+_+L8Ay*@k~{)X}x13sqWNk0Lbvf zTEiHUKfO!(vT_eN?Dpn`W#bC%3+kRfG9x|6mea0fc}MIfw0KFOxl{G-m=f1@8-Y7@l>t?#&l&pdHI_V*BskTzfZAVgF2UZr4?Lm^0NVJDI!V&;I$FNaFcD7{>P!r7iScUQOFvK z6$UPhIp~Vpj5-9`iv^CO_(pw{2eb0goQ|Jd!`c7CvWW&mhuspnJdB@)Qa3{jl5hNC zUlK>0{bxH;kR|?xv*{h)_lRoX9oID7%Xl}8%8;=;8gA)Tn9Sq2_c4WAK*~MWg?FSp zTbHK_7jGtM0>3f*Ww#{p=@@x6kJqhQFjF<1|5l1l@w3Q;5(ikEFF(R-v@ma_Xd<|SI7A$WinquBfP@nuO%w@nRR{&yR* z#`O^At->j5! z1?(@L-snfkA9R_^S=J*A$5DQD9`-uhtxC5^A*21{)rEr(ZI%bcJwrudvZ& zxjv-3^>4W%3|b$(K)+B(sF(T^dYrt0%&n$#tf%T->AgD%2J5Ir&4la|=W1_O4z}nJ zf!)tt!<8~`7bwj7U>M1h{W}BZ^9NXG6A{`?n4 z!8-xTu+t4z)*O?Hqm)RQZgEWkqa1h;6~QjF%A94VmGtf~)jC-GcWFE|w1>3eTn^u`1TLVR*fEi(QWx@lts@N!K!hD``Hn z^m=*B8@cuPgj58NcVM|8BCV0>bIh8;{K8F{L>}E}rX6X!VZs+_<>D0I3N=l2EBr)R z>=1j^TxNBv6qHsh3X9ZPjGK*Wr)QMwK6g165HPvB?ps(NU7q{uqgB)tH0AA2Am%>L z4hCkbvzEk8paf1dc5KtPJ$L+Tb4VYCct365+)HqLuSRb)*xtkt)YLrGV6dKHYj?}1 z&eTBL#V5eO!=MIG2=2k~s3d)ilC>z6D6i&e4$}_i*B~RIwehXBNv35s*qU|^LS})? zF+ckvL6?BWW8D@rLDMqb1G1T#@=mPkv`bq*+w^eUsV|(tOvjw(938A$Wg4OZjS+zd z#+6YM9>RGv_|wuE8C|`vILbSZ{1YC#aqTV<`V1g&TTCpUBK$!8;ha^oL5#Gvob1YM z_ECEmwL+zk+}VoefYX^<(koZTmhdJtJ^UX|idGV%qn0+BVJOJg&H?@96jcI^>PJQ_ z4W8|B1CuE>)=XZ55C)ipMfPy}KW&>ZlKn31s1l*jaGPiDKJ+PTaD6 z8tnjDVs5PO|IORa5iB&r6Zc2^EfM#p@PaK+i$)2g=wO3sWs9$)_K~Vb6WVEFkh?g? z0>o0DYDHZW6U-YCmb{f-%5Nqft~P2Rd7Po0=OSX$^_NJ5-+DxWDd<7iXv?5fF4mlK z8=Kc1Z`hRgQi>#~>@d<~?w%=g*X>3?)3{vjNgjhUMXT{*!pct(M@Kv(^W(;lkmFL& zDn|1O&DiW>4qEWGz)Me`JPkhoyFvlz3AH1Hg3*!{Soif+9m*iwkD*4YXaC`e{nT@X z=34l@ZHIC2uq1>n=Z1yP$N=Si|596d*xG@M;1vnYuhxVC3Oo_NB8M(8_*1D=Z_X9+ z%v5_@o^aWt4kJ$O$@b30L$I5);4_j|2>0-$zh>piN*ah!xOMe2((KtUqv#Osp@*~x z&NGny8k74si^E7x=K&_GPGW35Emjk?$?#|AfK-ZIqLcI1wZ6`wtHPt?aOYL$Z=EA; QYm;gDU&;Dx3;@ml0uXAR8UO$Q diff --git a/source/credits.cpp b/source/credits.cpp index 57ee7ec..039a6d1 100644 --- a/source/credits.cpp +++ b/source/credits.cpp @@ -26,7 +26,7 @@ Credits::Credits() shining_sprite_->setPos({194, 174, 8, 8}); // Cambia el color del borde - Screen::get()->setBorderColor(stringToColor("black")); + Screen::get()->setBorderColor(static_cast(PaletteColor::BLACK)); // Crea la textura para el texto que se escribe en pantalla text_surface_ = std::make_shared(options.game.width, options.game.height); @@ -76,62 +76,62 @@ void Credits::iniTexts() } texts_.clear(); - texts_.push_back({"", stringToColor("white")}); - texts_.push_back({"INSTRUCTIONS:", stringToColor("yellow")}); - texts_.push_back({"", stringToColor("white")}); - texts_.push_back({"HELP JAILDOC TO GET BACK ALL", stringToColor("white")}); - texts_.push_back({"HIS PROJECTS AND GO TO THE", stringToColor("white")}); - texts_.push_back({"JAIL TO FINISH THEM", stringToColor("white")}); - texts_.push_back({"", stringToColor("white")}); - texts_.push_back({"", stringToColor("white")}); + texts_.push_back({"", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"INSTRUCTIONS:", static_cast(PaletteColor::YELLOW)}); + texts_.push_back({"", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"HELP JAILDOC TO GET BACK ALL", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"HIS PROJECTS AND GO TO THE", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"JAIL TO FINISH THEM", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"", static_cast(PaletteColor::WHITE)}); - texts_.push_back({"KEYS:", stringToColor("yellow")}); - texts_.push_back({"", stringToColor("white")}); - texts_.push_back({keys + " TO MOVE AND JUMP", stringToColor("white")}); - texts_.push_back({"M TO SWITCH THE MUSIC", stringToColor("white")}); - texts_.push_back({"H TO PAUSE THE GAME", stringToColor("white")}); - texts_.push_back({"F1-F2 TO CHANGE WINDOWS SIZE", stringToColor("white")}); - texts_.push_back({"F3 TO SWITCH TO FULLSCREEN", stringToColor("white")}); - texts_.push_back({"B TO TOOGLE THE BORDER SCREEN", stringToColor("white")}); - texts_.push_back({"", stringToColor("white")}); - texts_.push_back({"", stringToColor("white")}); + texts_.push_back({"KEYS:", static_cast(PaletteColor::YELLOW)}); + texts_.push_back({"", static_cast(PaletteColor::WHITE)}); + texts_.push_back({keys + " TO MOVE AND JUMP", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"M TO SWITCH THE MUSIC", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"H TO PAUSE THE GAME", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"F1-F2 TO CHANGE WINDOWS SIZE", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"F3 TO SWITCH TO FULLSCREEN", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"B TO TOOGLE THE BORDER SCREEN", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"", static_cast(PaletteColor::WHITE)}); - texts_.push_back({"A GAME BY JAILDESIGNER", stringToColor("yellow")}); - texts_.push_back({"MADE ON SUMMER/FALL 2022", stringToColor("yellow")}); - texts_.push_back({"", stringToColor("white")}); - texts_.push_back({"", stringToColor("white")}); + texts_.push_back({"A GAME BY JAILDESIGNER", static_cast(PaletteColor::YELLOW)}); + texts_.push_back({"MADE ON SUMMER/FALL 2022", static_cast(PaletteColor::YELLOW)}); + texts_.push_back({"", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"", static_cast(PaletteColor::WHITE)}); - texts_.push_back({"I LOVE JAILGAMES! ", stringToColor("white")}); - texts_.push_back({"", stringToColor("white")}); + texts_.push_back({"I LOVE JAILGAMES! ", static_cast(PaletteColor::WHITE)}); + texts_.push_back({"", static_cast(PaletteColor::WHITE)}); #else texts.clear(); - texts.push_back({"", stringToColor("white")}); - texts.push_back({"INSTRUCTIONS:", stringToColor("yellow")}); - texts.push_back({"", stringToColor("white")}); - texts.push_back({"HELP JAILDOC TO GET BACK ALL", stringToColor("white")}); - texts.push_back({"HIS PROJECTS AND GO TO THE", stringToColor("white")}); - texts.push_back({"JAIL TO FINISH THEM", stringToColor("white")}); - texts.push_back({"", stringToColor("white")}); - texts.push_back({"", stringToColor("white")}); + texts.push_back({"", static_cast(PaletteColor::WHITE)}); + texts.push_back({"INSTRUCTIONS:", static_cast(PaletteColor::YELLOW)}); + texts.push_back({"", static_cast(PaletteColor::WHITE)}); + texts.push_back({"HELP JAILDOC TO GET BACK ALL", static_cast(PaletteColor::WHITE)}); + texts.push_back({"HIS PROJECTS AND GO TO THE", static_cast(PaletteColor::WHITE)}); + texts.push_back({"JAIL TO FINISH THEM", static_cast(PaletteColor::WHITE)}); + texts.push_back({"", static_cast(PaletteColor::WHITE)}); + texts.push_back({"", static_cast(PaletteColor::WHITE)}); - texts.push_back({"KEYS:", stringToColor("yellow")}); - texts.push_back({"", stringToColor("white")}); - texts.push_back({"B TO JUMP", stringToColor("white")}); - texts.push_back({"R TO SWITCH THE MUSIC", stringToColor("white")}); - texts.push_back({"L TO SWAP THE COLOR PALETTE", stringToColor("white")}); - texts.push_back({"START TO PAUSE", stringToColor("white")}); - texts.push_back({"SELECT TO EXIT", stringToColor("white")}); - texts.push_back({"", stringToColor("white")}); - texts.push_back({"", stringToColor("white")}); - texts.push_back({"", stringToColor("white")}); + texts.push_back({"KEYS:", static_cast(PaletteColor::YELLOW)}); + texts.push_back({"", static_cast(PaletteColor::WHITE)}); + texts.push_back({"B TO JUMP", static_cast(PaletteColor::WHITE)}); + texts.push_back({"R TO SWITCH THE MUSIC", static_cast(PaletteColor::WHITE)}); + texts.push_back({"L TO SWAP THE COLOR PALETTE", static_cast(PaletteColor::WHITE)}); + texts.push_back({"START TO PAUSE", static_cast(PaletteColor::WHITE)}); + texts.push_back({"SELECT TO EXIT", static_cast(PaletteColor::WHITE)}); + texts.push_back({"", static_cast(PaletteColor::WHITE)}); + texts.push_back({"", static_cast(PaletteColor::WHITE)}); + texts.push_back({"", static_cast(PaletteColor::WHITE)}); - texts.push_back({"A GAME BY JAILDESIGNER", stringToColor("yellow")}); - texts.push_back({"MADE ON SUMMER/FALL 2022", stringToColor("yellow")}); - texts.push_back({"", stringToColor("white")}); - texts.push_back({"", stringToColor("white")}); + texts.push_back({"A GAME BY JAILDESIGNER", static_cast(PaletteColor::YELLOW)}); + texts.push_back({"MADE ON SUMMER/FALL 2022", static_cast(PaletteColor::YELLOW)}); + texts.push_back({"", static_cast(PaletteColor::WHITE)}); + texts.push_back({"", static_cast(PaletteColor::WHITE)}); - texts.push_back({"I LOVE JAILGAMES! ", stringToColor("white")}); - texts.push_back({"", stringToColor("white")}); + texts.push_back({"I LOVE JAILGAMES! ", static_cast(PaletteColor::WHITE)}); + texts.push_back({"", static_cast(PaletteColor::WHITE)}); #endif } @@ -144,7 +144,7 @@ void Credits::fillTexture() // Rellena la textura de texto auto previuos_renderer = Screen::get()->getRendererSurface(); Screen::get()->setRendererSurface(text_surface_); - text_surface_->clear(stringToColor("black")); + text_surface_->clear(static_cast(PaletteColor::BLACK)); auto text = Resource::get()->getText("smb2"); @@ -161,17 +161,17 @@ void Credits::fillTexture() // Escribe el corazón const int TEXT_LENGHT = text->lenght(texts_[22].label, 1) - text->lenght(" ", 1); // Se resta el ultimo caracter que es un espacio const int POS_X = ((PLAY_AREA_WIDTH - TEXT_LENGHT) / 2) + TEXT_LENGHT; - text->writeColored(POS_X, 176, "}", stringToColor("bright_red")); + text->writeColored(POS_X, 176, "}", static_cast(PaletteColor::BRIGHT_RED)); // Recoloca el sprite del brillo shining_sprite_->setPosX(POS_X + 2); // Rellena la textura que cubre el texto con color transparente - text_surface_->clear(stringToColor("transparent")); + text_surface_->clear(static_cast(PaletteColor::TRANSPARENT)); // Los primeros 8 pixels crea una malla auto surface = Screen::get()->getRendererSurface(); - auto color = stringToColor("black"); + auto color = static_cast(PaletteColor::BLACK); for (int i = 0; i < 256; i += 2) { surface->putPixel(i, 0, color); diff --git a/source/director.cpp b/source/director.cpp index 00dd599..af5c4ca 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -244,7 +244,8 @@ void Director::initInput() Input::get()->bindKey(InputAction::WINDOW_INC_ZOOM, SDL_SCANCODE_F2); Input::get()->bindKey(InputAction::TOGGLE_VIDEOMODE, SDL_SCANCODE_F3); Input::get()->bindKey(InputAction::TOGGLE_SHADERS, SDL_SCANCODE_F4); - Input::get()->bindKey(InputAction::TOGGLE_PALETTE, SDL_SCANCODE_F5); + Input::get()->bindKey(InputAction::NEXT_PALETTE, SDL_SCANCODE_F5); + Input::get()->bindKey(InputAction::PREVIOUS_PALETTE, SDL_SCANCODE_F6); Input::get()->bindKey(InputAction::TOGGLE_MUSIC, SDL_SCANCODE_M); Input::get()->bindKey(InputAction::TOGGLE_BORDER, SDL_SCANCODE_B); @@ -263,7 +264,7 @@ void Director::initInput() Input::get()->bindGameControllerButton(InputAction::PAUSE, SDL_CONTROLLER_BUTTON_START); Input::get()->bindGameControllerButton(InputAction::EXIT, SDL_CONTROLLER_BUTTON_BACK); #endif - Input::get()->bindGameControllerButton(InputAction::TOGGLE_PALETTE, SDL_CONTROLLER_BUTTON_LEFTSHOULDER); + Input::get()->bindGameControllerButton(InputAction::NEXT_PALETTE, SDL_CONTROLLER_BUTTON_LEFTSHOULDER); Input::get()->bindGameControllerButton(InputAction::TOGGLE_MUSIC, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER); Input::get()->bindGameControllerButton(InputAction::TOGGLE_BORDER, SDL_CONTROLLER_BUTTON_X); } @@ -395,11 +396,17 @@ bool Director::setFileList() Asset::get()->add(prefix + "/data/font/8bithud.txt", AssetType::FONT); // Paletas - Asset::get()->add(prefix + "/data/palette/zx-spectrum.gif", AssetType::PALETTE); - Asset::get()->add(prefix + "/data/palette/zx-spectrum-adjusted.gif", AssetType::PALETTE); - Asset::get()->add(prefix + "/data/palette/ruzx-spectrum.gif", AssetType::PALETTE); - Asset::get()->add(prefix + "/data/palette/ruzx-spectrum-revision-2.gif", AssetType::PALETTE); - Asset::get()->add(prefix + "/data/palette/zxarne-5-2.gif", AssetType::PALETTE); + Asset::get()->add(prefix + "/data/palette/zx-spectrum.pal", AssetType::PALETTE); + Asset::get()->add(prefix + "/data/palette/zx-spectrum-adjusted.pal", AssetType::PALETTE); + Asset::get()->add(prefix + "/data/palette/zxarne-5-2.pal", AssetType::PALETTE); + Asset::get()->add(prefix + "/data/palette/ruzx-spectrum.pal", AssetType::PALETTE); + Asset::get()->add(prefix + "/data/palette/ruzx-spectrum-revision-2.pal", AssetType::PALETTE); + Asset::get()->add(prefix + "/data/palette/pico-8.pal", AssetType::PALETTE); + Asset::get()->add(prefix + "/data/palette/sweetie-16.pal", AssetType::PALETTE); + Asset::get()->add(prefix + "/data/palette/island-joy-16.pal", AssetType::PALETTE); + Asset::get()->add(prefix + "/data/palette/lost-century.pal", AssetType::PALETTE); + Asset::get()->add(prefix + "/data/palette/na16.pal", AssetType::PALETTE); + Asset::get()->add(prefix + "/data/palette/steam-lords.pal", AssetType::PALETTE); // Shaders Asset::get()->add(prefix + "/data/shaders/crtpi_192.glsl", AssetType::DATA); diff --git a/source/ending.cpp b/source/ending.cpp index 1bcdc10..462d4ff 100644 --- a/source/ending.cpp +++ b/source/ending.cpp @@ -17,8 +17,7 @@ #include "s_sprite.h" // for SSprite #include "text.h" // for Text, TEXT_STROKE #include "surface.h" // for Surface -#include "utils.h" // for Color, stringToColor, Palette - +#include "utils.h" // for Color, static_cast,PaletteColor::PALETTE // Constructor Ending::Ending() : counter_(-1), @@ -40,7 +39,7 @@ Ending::Ending() iniScenes(); // Cambia el color del borde - Screen::get()->setBorderColor(stringToColor("black")); + Screen::get()->setBorderColor(static_cast(PaletteColor::BLACK)); // Crea la textura para cubrir el texto cover_surface_ = std::make_shared(options.game.width, options.game.height + 8); @@ -84,7 +83,7 @@ void Ending::render() Screen::get()->start(); // Limpia la pantalla - Screen::get()->clearSurface(stringToColor("black")); + Screen::get()->clearSurface(static_cast(PaletteColor::BLACK)); // Dibuja las imagenes de la escena sprite_pics_.at(current_scene_).image_sprite->render(); @@ -167,8 +166,8 @@ void Ending::iniTexts() const int WIDTH = text->lenght(txt.caption, 1) + 2 + 2; const int HEIGHT = text->getCharacterSize() + 2 + 2; - auto text_color = stringToColor("white"); - auto shadow_color = stringToColor("black"); + auto text_color = static_cast(PaletteColor::WHITE); + auto shadow_color = static_cast(PaletteColor::BLACK); EndingSurface st; @@ -187,11 +186,11 @@ void Ending::iniTexts() Screen::get()->setRendererSurface(st.cover_surface); // Rellena la cover_surface con color transparente - st.cover_surface->clear(stringToColor("transparent")); + st.cover_surface->clear(static_cast(PaletteColor::TRANSPARENT)); // Crea una malla de 8 pixels de alto auto surface = Screen::get()->getRendererSurface(); - auto color = stringToColor("black"); + auto color = static_cast(PaletteColor::BLACK); for (int i = 0; i < WIDTH; i += 2) { surface->putPixel(i, 0, color); @@ -255,11 +254,11 @@ void Ending::iniPics() Screen::get()->setRendererSurface(sp.cover_surface); // Rellena la cover_surface con color transparente - sp.cover_surface->clear(stringToColor("transparent")); + sp.cover_surface->clear(static_cast(PaletteColor::TRANSPARENT)); // Crea una malla en los primeros 8 pixels auto surface = Screen::get()->getRendererSurface(); - auto color = stringToColor("black"); + auto color = static_cast(PaletteColor::BLACK); for (int i = 0; i < WIDTH; i += 2) { surface->putPixel(i, 0, color); @@ -477,10 +476,10 @@ void Ending::fillCoverTexture() // Rellena la textura que cubre el texto con color transparente auto previuos_renderer = Screen::get()->getRendererSurface(); Screen::get()->setRendererSurface(cover_surface_); - cover_surface_->clear(stringToColor("transparent")); + cover_surface_->clear(static_cast(PaletteColor::TRANSPARENT)); // Los primeros 8 pixels crea una malla - const Uint8 color = stringToColor("black"); + const Uint8 color = static_cast(PaletteColor::BLACK); auto surface = Screen::get()->getRendererSurface(); for (int i = 0; i < 256; i += 2) { diff --git a/source/ending2.cpp b/source/ending2.cpp index 06921a9..3b58cc8 100644 --- a/source/ending2.cpp +++ b/source/ending2.cpp @@ -16,8 +16,7 @@ #include "screen.h" // for Screen #include "text.h" // for Text #include "surface.h" // for Surface -#include "utils.h" // for Color, stringToColor -#include +#include "utils.h" // for Color, static_cast // Constructor Ending2::Ending2() @@ -38,7 +37,7 @@ Ending2::Ending2() } // Cambia el color del borde - Screen::get()->setBorderColor(stringToColor("black")); + Screen::get()->setBorderColor(static_cast(PaletteColor::BLACK)); // Inicializa la lista de sprites iniSpriteList(); @@ -101,7 +100,7 @@ void Ending2::render() Screen::get()->start(); // Limpia la pantalla - Screen::get()->clearSurface(stringToColor("black")); + Screen::get()->clearSurface(static_cast(PaletteColor::BLACK)); // Dibuja los sprites renderSprites(); @@ -113,7 +112,7 @@ void Ending2::render() renderTexts(); // Dibuja una trama arriba y abajo - Uint8 color = stringToColor("black"); + Uint8 color = static_cast(PaletteColor::BLACK); auto surface = Screen::get()->getRendererSurface(); for (int i = 0; i < 256; i += 2) { @@ -326,7 +325,7 @@ void Ending2::updateTexts() // Dibuja los sprites void Ending2::renderSprites() { - const Uint8 colorA = stringToColor("red"); + const Uint8 colorA = static_cast(PaletteColor::RED); for (auto sprite : sprites_) { const bool A = sprite->getRect().y + sprite->getRect().h > 0; @@ -338,14 +337,14 @@ void Ending2::renderSprites() } // Pinta el ultimo elemento de otro color - const Uint8 colorB = stringToColor("white"); + const Uint8 colorB = static_cast(PaletteColor::WHITE); sprites_.back()->render(1, colorB); } // Dibuja los sprites con el texto void Ending2::renderSpriteTexts() { - const Uint8 color = stringToColor("white"); + const Uint8 color = static_cast(PaletteColor::WHITE); for (auto sprite : sprite_texts_) { const bool A = sprite->getRect().y + sprite->getRect().h > 0; diff --git a/source/game.cpp b/source/game.cpp index 27d4fca..97102e5 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -263,10 +263,6 @@ void Game::checkDebugEvents(const SDL_Event &event) changeRoom(room_->getRoom(BORDER_RIGHT)); break; - case SDL_SCANCODE_F6: - Notifier::get()->show({"ACHIEVEMENT UNLOCKED!", "I LIKE MY MULTICOLOURED FRIENDS"}, NotificationText::LEFT, 2, false, "F6"); - break; - case SDL_SCANCODE_F7: Notifier::get()->show({"ACHIEVEMENT UNLOCKED!", "I LIKE MY MULTICOLOURED FRIENDS"}, NotificationText::LEFT, 3, false, "F7"); break; diff --git a/source/global_inputs.cpp b/source/global_inputs.cpp index 40361dd..38d60e9 100644 --- a/source/global_inputs.cpp +++ b/source/global_inputs.cpp @@ -24,11 +24,6 @@ namespace globalInputs Notifier::get()->show({code}, NotificationText::CENTER, -1, true, code); } } - // Cambia la paleta de colores - void switchPalette() - { - Screen::get()->nextPalette(); - } // Cambia de seccion void skip_section() @@ -98,9 +93,15 @@ namespace globalInputs Notifier::get()->show({"SHADERS " + std::string(options.video.shaders ? "ENABLED" : "DISABLED")}, NotificationText::CENTER); } - else if (Input::get()->checkInput(InputAction::TOGGLE_PALETTE, REPEAT_FALSE)) + else if (Input::get()->checkInput(InputAction::NEXT_PALETTE, REPEAT_FALSE)) { - switchPalette(); + Screen::get()->nextPalette(); + Notifier::get()->show({"PALETTE " + options.video.palette}, NotificationText::CENTER); + } + + else if (Input::get()->checkInput(InputAction::PREVIOUS_PALETTE, REPEAT_FALSE)) + { + Screen::get()->previousPalette(); Notifier::get()->show({"PALETTE " + options.video.palette}, NotificationText::CENTER); } } diff --git a/source/input.h b/source/input.h index e94e7b0..4e74ae6 100644 --- a/source/input.h +++ b/source/input.h @@ -35,7 +35,8 @@ enum class InputAction TOGGLE_VIDEOMODE, TOGGLE_BORDER, TOGGLE_MUSIC, - TOGGLE_PALETTE, + NEXT_PALETTE, + PREVIOUS_PALETTE, TOGGLE_SHADERS, // Input obligatorio diff --git a/source/loading_screen.cpp b/source/loading_screen.cpp index 714e9ba..2f3ceb9 100644 --- a/source/loading_screen.cpp +++ b/source/loading_screen.cpp @@ -81,13 +81,13 @@ void LoadingScreen::updateLoad() if (loading_first_part_) { // Cada 5 pasos el load_counter_ se incrementa en uno - const int numSteps = 5; - const int step = 51; - load_counter_ = counter_ / numSteps; + constexpr int NUM_STEPS = 5; + constexpr int STEPS = 51; + load_counter_ = counter_ / NUM_STEPS; if (load_counter_ < 192) { - load_rect_.x = step * (counter_ % numSteps); + load_rect_.x = STEPS * (counter_ % NUM_STEPS); load_rect_.y = line_index_[load_counter_]; mono_loading_screen_sprite_->setClip(load_rect_); mono_loading_screen_sprite_->setPosition(load_rect_); diff --git a/source/loading_screen.h b/source/loading_screen.h index 5386354..380ec2d 100644 --- a/source/loading_screen.h +++ b/source/loading_screen.h @@ -24,7 +24,7 @@ private: int load_counter_ = 0; // Contador para controlar las cargas bool loading_first_part_ = true; // Para saber en que parte de la carga se encuentra int line_index_[192]; // El orden en el que se procesan las 192 lineas de la pantalla de carga - SDL_Rect load_rect_ = {0, 0, 51, 1}; // Rectangulo para dibujar la pantalla de carga + SDL_Rect load_rect_ = {0, 0, 52, 1}; // Rectangulo para dibujar la pantalla de carga // Actualiza las variables void update(); diff --git a/source/logo.cpp b/source/logo.cpp index 1a9c9d8..46553f9 100644 --- a/source/logo.cpp +++ b/source/logo.cpp @@ -20,7 +20,7 @@ Logo::Logo() since_1998_sprite_(std::make_shared(since_1998_surface_, (256 - since_1998_surface_->getWidth()) / 2, 83 + jailgames_surface_->getHeight() + 5, since_1998_surface_->getWidth(), since_1998_surface_->getHeight())) { since_1998_sprite_->setClip(0, 0, since_1998_surface_->getWidth(), since_1998_surface_->getHeight()); - // since_1998_surface_->setColor(0, 0, 0); + since_1998_color_ = stringToColor("black"); // Crea los sprites de cada linea for (int i = 0; i < jailgames_surface_->getHeight(); ++i) @@ -42,7 +42,7 @@ Logo::Logo() } // Cambia el color del borde - Screen::get()->setBorderColor(stringToColor("black")); + Screen::get()->setBorderColor(static_cast(PaletteColor::BRIGHT_BLACK)); } // Comprueba el manejador de eventos @@ -219,8 +219,6 @@ void Logo::render() { // Prepara para empezar a dibujar en la textura de juego Screen::get()->start(); - - // Limpia la pantalla Screen::get()->clearSurface(); // Dibuja los objetos diff --git a/source/logo.h b/source/logo.h index e7b6ff3..6a0faa9 100644 --- a/source/logo.h +++ b/source/logo.h @@ -20,6 +20,8 @@ private: std::shared_ptr since_1998_surface_; // Textura con los graficos "Since 1998" std::vector> jailgames_sprite_; // Vector con los sprites de cada linea que forman el bitmap JAILGAMES std::shared_ptr since_1998_sprite_; // SSprite para manejar la textura2 + Uint8 jailgames_color_ = 0; // Color para el sprite de "JAILGAMES" + Uint8 since_1998_color_ = 0; // Color para el sprite de "Since 1998" // Variables std::vector color_; // Vector con los colores para el fade diff --git a/source/options.cpp b/source/options.cpp index b03fd68..fbc334a 100644 --- a/source/options.cpp +++ b/source/options.cpp @@ -165,7 +165,7 @@ bool saveOptionsToFile(const std::string &file_path) file << "video.border.width " << options.video.border.width << "\n\n"; file << "# Alto del borde\n"; file << "video.border.height " << options.video.border.height << "\n\n"; - file << "# Paleta:\n"; + file << "# Paleta\n"; file << "video.palette " << options.video.palette << "\n"; // Cierra el fichero @@ -263,15 +263,7 @@ bool setOptions(const std::string &var, const std::string &value) }}, {"video.palette", [](const std::string &v) { - std::string val = v; - if (val == "arreglar" || val == "esto") - { - options.video.palette = val; - } - else - { - options.video.palette = val; - } + options.video.palette = v; }}}; auto it = optionHandlers.find(var); diff --git a/source/player.cpp b/source/player.cpp index 729f722..481ff91 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -634,15 +634,15 @@ void Player::setColor() { if (options.cheats.invincible == Cheat::CheatState::ENABLED) { - color_ = stringToColor("cyan"); + color_ = static_cast(PaletteColor::CYAN); } else if (options.cheats.infinite_lives == Cheat::CheatState::ENABLED) { - color_ = stringToColor("yellow"); + color_ = static_cast(PaletteColor::YELLOW); } else { - color_ = stringToColor("white"); + color_ = static_cast(PaletteColor::WHITE); } } diff --git a/source/resource.cpp b/source/resource.cpp index ebc9533..a194a00 100644 --- a/source/resource.cpp +++ b/source/resource.cpp @@ -254,6 +254,7 @@ void Resource::loadSurfaces() { auto name = getFileName(l); surfaces_.emplace_back(ResourceSurface(name, std::make_shared(l))); + surfaces_.back().surface->setTransparentColor(0); updateLoadingProgress(); } } @@ -268,7 +269,7 @@ void Resource::loadPalettes() for (const auto &l : list) { auto name = getFileName(l); - palettes_.emplace_back(ResourcePalette(name, loadPalette(l))); + palettes_.emplace_back(ResourcePalette(name, readPalFile(l))); updateLoadingProgress(); } } diff --git a/source/screen.cpp b/source/screen.cpp index 1aa80bc..253c73e 100644 --- a/source/screen.cpp +++ b/source/screen.cpp @@ -89,11 +89,11 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer) // Crea la surface donde se dibujan los graficos del juego game_surface_ = std::make_shared(options.game.width, options.game.height); - game_surface_->loadPalette(palettes_.at(current_palette_)); + game_surface_->setPalette(readPalFile(palettes_.at(current_palette_))); // Crea la surface donde se dibujan los graficos del juego border_surface_ = std::make_shared(options.game.width + options.video.border.width * 2, options.game.height + options.video.border.height * 2); - border_surface_->loadPalette(palettes_.at(current_palette_)); + border_surface_->setPalette(readPalFile(palettes_.at(current_palette_))); // Establece la surface que actuará como renderer para recibir las llamadas a render() renderer_surface_ = std::make_shared>(game_surface_); @@ -352,13 +352,34 @@ void Screen::nextPalette() current_palette_ = 0; } + setPalete(); +} + +// Cambia la paleta +void Screen::previousPalette() +{ + if (current_palette_ > 0) + { + --current_palette_; + } + else + { + current_palette_ = static_cast(palettes_.size() - 1); + } + + setPalete(); +} + +// Establece la paleta +void Screen::setPalete() +{ game_surface_->loadPalette(Resource::get()->getPalette(palettes_.at(current_palette_))); border_surface_->loadPalette(Resource::get()->getPalette(palettes_.at(current_palette_))); options.video.palette = palettes_.at(current_palette_); // Eliminar ".gif" - size_t pos = options.video.palette.find(".gif"); + size_t pos = options.video.palette.find(".pal"); if (pos != std::string::npos) { options.video.palette.erase(pos, 4); @@ -424,7 +445,7 @@ void Screen::renderOverlays() // Localiza la paleta dentro del vector de paletas size_t Screen::findPalette(const std::string &name) { - std::string upper_name = toUpper(name + ".gif"); + std::string upper_name = toUpper(name + ".pal"); for (size_t i = 0; i < palettes_.size(); ++i) { diff --git a/source/screen.h b/source/screen.h index e5000b4..9a67138 100644 --- a/source/screen.h +++ b/source/screen.h @@ -156,6 +156,10 @@ public: // Cambia la paleta void nextPalette(); + void previousPalette(); + + // Establece la paleta + void setPalete(); // Establece la visibilidad de las notificaciones void setNotificationsEnabled(bool value) { notifications_enabled_ = value; } diff --git a/source/surface.cpp b/source/surface.cpp index 2b07cac..80a8563 100644 --- a/source/surface.cpp +++ b/source/surface.cpp @@ -10,8 +10,14 @@ #include "asset.h" // for Asset #include "screen.h" #include "gif.h" // for LoadGif, LoadPalette +#include +#include +#include +#include +#include +#include -// Carga una paleta desde un archivo +// Carga una paleta desde un archivo .gif Palette loadPalette(const std::string &file_path) { // Abrir el archivo en modo binario @@ -48,13 +54,61 @@ Palette loadPalette(const std::string &file_path) return palette; } +// Carga una paleta desde un archivo .pal +Palette readPalFile(const std::string& file_path) +{ + Palette palette{}; + palette.fill(0); // Inicializar todo con 0 (transparente por defecto) + + std::ifstream file(file_path); + if (!file.is_open()) + { + throw std::runtime_error("No se pudo abrir el archivo .pal"); + } + + std::string line; + int line_number = 0; + int color_index = 0; + + while (std::getline(file, line)) + { + ++line_number; + + // Ignorar las tres primeras líneas del archivo + if (line_number <= 3) + { + continue; + } + + // Procesar las líneas restantes con valores RGB + std::istringstream ss(line); + int r, g, b; + if (ss >> r >> g >> b) + { + // Construir el color ARGB (A = 255 por defecto) + Uint32 color = (255 << 24) | (r << 16) | (g << 8) | b; + palette[color_index++] = color; + + // Limitar a un máximo de 256 colores (opcional) + if (color_index >= 256) + { + break; + } + } + } + + file.close(); + return palette; +} + + // Constructor Surface::Surface(int w, int h) : surface_data_(std::make_shared(w, h)), - transparent_color_(0) {} + transparent_color_(static_cast(PaletteColor::TRANSPARENT)) {} Surface::Surface(const std::string &file_path) - : transparent_color_(0) + : transparent_color_(static_cast(PaletteColor::TRANSPARENT)) { SurfaceData loadedData = loadSurface(file_path); surface_data_ = std::make_shared(std::move(loadedData)); diff --git a/source/surface.h b/source/surface.h index bbddaa6..3a1c187 100644 --- a/source/surface.h +++ b/source/surface.h @@ -9,8 +9,12 @@ // Alias using Palette = std::array; +// Carga una paleta desde un archivo .gif Palette loadPalette(const std::string &file_path); +// Carga una paleta desde un archivo .pal +Palette readPalFile(const std::string &file_path); + struct SurfaceData { Uint8 *data; // Listado de indices de la paleta que conforman la imagen almacenada @@ -66,7 +70,7 @@ class Surface { private: std::shared_ptr surface_data_; // Datos a dibujar - Palette palette_; // Paleta para volcar la SurfaceData a una Textura + Palette palette_; // Paleta para volcar la SurfaceData a una Textura int transparent_color_; // Indice de la paleta que se omite en la copia de datos public: @@ -126,11 +130,11 @@ public: // Obtien ancho y alto int getWidth() const { return surface_data_->width; } int getHeight() const { return surface_data_->height; } - + // Color transparente - int getTransparentColor() const { return transparent_color_; } - void setTransparentColor(int color) { transparent_color_ = color; } - + Uint8 getTransparentColor() const { return transparent_color_; } + void setTransparentColor(Uint8 color) { transparent_color_ = color; } + // Paleta void setPalette(const std::array &palette) { palette_ = palette; } }; diff --git a/source/title.cpp b/source/title.cpp index c4b7259..592b031 100644 --- a/source/title.cpp +++ b/source/title.cpp @@ -33,8 +33,6 @@ Title::Title() pLoadPal(Asset::get()->get("loading_screen_color.gif").c_str()); pSetSource(loading_screen_); - // title_logo_surface_->setSurfaceDataDestRaw(bg_surface_->getSurfaceData()); - // Inicializa variables state_ = options.section.subsection == Subsection::TITLE_WITH_LOADING_SCREEN ? TitleState::SHOW_LOADING_SCREEN : TitleState::SHOW_MENU; options.section.section = Section::TITLE; @@ -45,7 +43,7 @@ Title::Title() createCheevosTexture(); // Cambia el color del borde - Screen::get()->setBorderColor(stringToColor("black")); + Screen::get()->setBorderColor(static_cast(PaletteColor::BRIGHT_BLACK)); // Rellena la textura de fondo con todos los gráficos fillSurface(); diff --git a/source/utils.cpp b/source/utils.cpp index 4764e78..2d28917 100644 --- a/source/utils.cpp +++ b/source/utils.cpp @@ -363,23 +363,31 @@ Uint8 stringToColor(const std::string &str) { // Mapas de colores para cada paleta static const std::unordered_map paletteMap = { - {"transparent", 0}, - {"black", 1}, - {"bright_black", 2}, - {"red", 3}, - {"bright_red", 4}, - {"green", 5}, - {"bright_green", 6}, - {"yellow", 7}, - {"bright_yellow", 8}, - {"blue", 9}, - {"bright_blue", 10}, - {"magenta", 11}, - {"bright_magenta", 12}, - {"cyan", 13}, - {"bright_cyan", 14}, - {"white", 15}, - {"bright_white", 16}}; + {"black", 0}, + {"bright_black", 1}, + + {"blue", 2}, + {"bright_blue", 3}, + + {"red", 4}, + {"bright_red", 5}, + + {"magenta", 6}, + {"bright_magenta", 7}, + + {"green", 8}, + {"bright_green", 9}, + + {"cyan", 10}, + {"bright_cyan", 11}, + + {"yellow", 12}, + {"bright_yellow", 13}, + + {"white", 14}, + {"bright_white", 15}, + + {"transparent", 255}}; // Busca el color en el mapa auto it = paletteMap.find(str); diff --git a/source/utils.h b/source/utils.h index 2e84a42..4320980 100644 --- a/source/utils.h +++ b/source/utils.h @@ -1,10 +1,40 @@ #pragma once -#include // for SDL_Rect, SDL_Point -#include // for SDL_Renderer, SDL_Texture -#include // for Uint8 -#include // for string -#include // for vector +#include // for SDL_Rect, SDL_Point +#include // for SDL_Renderer, SDL_Texture +#include // for Uint8 +#include // for string +#include // for vector + +enum class PaletteColor : Uint8 +{ + BLACK = 0, + BRIGHT_BLACK = 1, + + BLUE = 2, + BRIGHT_BLUE = 3, + + RED = 4, + BRIGHT_RED = 5, + + MAGENTA = 6, + BRIGHT_MAGENTA = 7, + + GREEN = 8, + BRIGHT_GREEN = 9, + + CYAN = 10, + BRIGHT_CYAN = 11, + + YELLOW = 12, + BRIGHT_YELLOW = 13, + + WHITE = 14, + BRIGHT_WHITE = 15, + + TRANSPARENT = 255, +}; + // Estructura para definir un circulo struct Circle @@ -105,10 +135,10 @@ std::string boolToString(bool value); bool colorAreEqual(Color color1, Color color2); // Convierte una cadena a minusculas -std::string toLower(const std::string& str); +std::string toLower(const std::string &str); // Convierte una cadena a mayúsculas -std::string toUpper(const std::string& str); +std::string toUpper(const std::string &str); // Obtiene el nombre de un fichero a partir de una ruta std::string getFileName(const std::string &path);