From 6caed5f15e7eec01a20fdc2e0781af6a9787a5a6 Mon Sep 17 00:00:00 2001 From: Francis Herne Date: Mon, 26 Dec 2022 21:06:21 +0100 Subject: [PATCH] Add: Slope-aware and roadtype-specific one-way sprites. (#10282) --- media/baseset/openttd.grf | Bin 508716 -> 509868 bytes media/baseset/openttd/oneway.nfo | 28 +++++++++++++++++++++------- media/baseset/openttd/oneway.png | Bin 1222 -> 7846 bytes src/newgrf.cpp | 10 +++++++++- src/road.h | 1 + src/road_cmd.cpp | 12 +++++++++++- src/table/sprites.h | 6 ++++-- 7 files changed, 46 insertions(+), 11 deletions(-) diff --git a/media/baseset/openttd.grf b/media/baseset/openttd.grf index e3ebf2dd675589b31cdab66116ae5db1d72520bf..9e08fb17c3a801a57391f8f6656f9240f5e3d2f0 100644 GIT binary patch delta 798 zcmZ3}Ccma%o`r?s|ItR4Ru;xq7N%Af=B+F&8x^^PIv5!RBpAN^|32OE9E<$)dx|WU z%%A`NoGzura)|lk|8LXpE3rf}LS-YAS*#epPFGZA5uSeGF(b?LRmv>hoDd^E|NjOu zLb`s%1jch6a}J1iNF2~(yx3uIK%C{`xpU__OkTLWkYK#{Lb{{qh3*5fj;aeH9Tg`e zI$SnLbnH7(*0Gm~fdOLFm;XQhGczzSykNe-_JW7?90+uXJP>EOc=6)J4hfLaCtN!W zZbUzD>2TlS(ouGyv!i4~U&rDddppi49=O`^wBt)BbEiXX{rdmMe@+Gl1_qE7=N@oA;61?cKmuZqIhP(4Ad``(h!);O|iXJ1+qFe=bP#4g5yOr`}YNNhsXm_R#2E;oFREa_<_^}i3_?fj5<7S7 z^o?Z@Pke%eud*I1$kcNk7cWSFLqKMQ`n6lsFGnU delta 106 zcmZ3}FTbWuo`r?s|IS91Ru;xq7N%Af=B+F&8xy;Os3d#MJy G`FsGT+a%%u diff --git a/media/baseset/openttd/oneway.nfo b/media/baseset/openttd/oneway.nfo index 46f3b8f947..56d2e2809a 100644 --- a/media/baseset/openttd/oneway.nfo +++ b/media/baseset/openttd/oneway.nfo @@ -4,10 +4,24 @@ // See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . // -1 * 0 0C "One way road graphics" - -1 * 3 05 09 06 - -1 sprites/oneway.png 8bpp 34 8 24 16 -12 -8 normal - -1 sprites/oneway.png 8bpp 66 8 24 16 -12 -8 normal - -1 sprites/oneway.png 8bpp 98 8 24 16 -12 -8 normal - -1 sprites/oneway.png 8bpp 130 8 24 16 -12 -8 normal - -1 sprites/oneway.png 8bpp 162 8 24 16 -12 -8 normal - -1 sprites/oneway.png 8bpp 194 8 24 16 -12 -8 normal + -1 * 3 05 09 12 + -1 sprites/oneway.png 8bpp 34 8 24 16 -10 -9 normal + -1 sprites/oneway.png 8bpp 66 8 24 16 -13 -7 normal + -1 sprites/oneway.png 8bpp 98 8 24 16 -12 -8 normal + -1 sprites/oneway.png 8bpp 130 8 24 16 -15 -10 normal + -1 sprites/oneway.png 8bpp 162 8 24 16 -12 -9 normal + -1 sprites/oneway.png 8bpp 194 8 24 16 -11 -8 normal + + -1 sprites/oneway.png 8bpp 34 40 24 16 -13 -10 normal + -1 sprites/oneway.png 8bpp 66 40 24 16 -12 -8 normal + -1 sprites/oneway.png 8bpp 98 40 24 16 -12 -9 normal + -1 sprites/oneway.png 8bpp 130 40 24 16 -11 -8 normal + -1 sprites/oneway.png 8bpp 162 40 24 16 -9 -10 normal + -1 sprites/oneway.png 8bpp 194 40 24 16 -10 -9 normal + + -1 sprites/oneway.png 8bpp 34 72 24 16 -8 -11 normal + -1 sprites/oneway.png 8bpp 66 72 24 16 -11 -5 normal + -1 sprites/oneway.png 8bpp 98 72 24 16 -12 -8 normal + -1 sprites/oneway.png 8bpp 130 72 24 16 -12 -5 normal + -1 sprites/oneway.png 8bpp 162 72 24 16 -14 -10 normal + -1 sprites/oneway.png 8bpp 194 72 24 16 -12 -8 normal diff --git a/media/baseset/openttd/oneway.png b/media/baseset/openttd/oneway.png index 15542af8563cdcc8870d2a251d01ae0a8daf9e83..843747677fc0296025e49b4fc7b70c3a789c465f 100644 GIT binary patch literal 7846 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%0DIeEoa6}C!XbFK1 z^!3Zj%k|2Q_413-^$jg8E%gnI^o@*ki&D~bi!1X=5-W7`ij_e|K+JGSElw`VEGWs$ z&r<-InV6JcT4JlD#HFC105!ZKx4_pIZhT%bG!&BabM-3{3-k^34D@qz^^tWHm$;Ud z;MY+cQdy9yACy|0Us{x$>ROhXSE7t;L`pJTe?e(c4%j;>$@-}|sky0nCB^!NdWI-g zx_kNtz;%FvAU!j;0IaJbw*WWx|Zh2DY{AKMuw)wsfI~u zCT2)RdFB#;vA5)Z)!w6a{FKbJN<*d~BnS5hf4? zNQI0YmjXmA$i>Z$%SInu(t%1nh=HI|hn5%`7qqlOL1EMqlEQa1xJHAEq!1uU@o4HA z4K9*GfF#AEsf%jC#f9ijrRJsBDwQkQ+x@s7($X_y z&Vn@?b{si#;f{e0i-QeMfR9K*j7&v^!;~p08#c6@IkUn;hb6*BBqKnlCc|S!OU#Z1 z6<795`EqB20|QG0i$H;ZLWhFM0t=r#AvtFUvy9CRi` zIIPL=IZ_evpeN(cf{s6XR{UX*$YD@vVK7<1;IV@t;fh4X9g7JsB3688IPz!DgFgZe z2@(N08VMC91uX$R3rf};m~-aNnGb)~n3!BKG5KR+@+T$Y&xD#kI~M%8apKRHHy$Dd zF*-d3E-QLcj;!c-aAL!c3p@V5xbVk@fgy&0p@D&60RzJk28IU=41X9H{sb`m$zk}@ z!SH7Z!=D2Tf9^2+`NMFggX75rmOpbC{%kP#b0p=@jTsyg5j-jxA|^F5E`uR z{ABp~i{aOAhTne}{`_V5`;Xz@e}?})5*#@?5)(X3Hspj{npF44hT%^L!=DU>KQ#=0 zrZD_j!|>+_g98J@e+C8v0|o~NhJXNu|Nj{jTnbb?N;G^bbOLG&LK-|$CZx2ixbfvr zLchHDK6&NXH@wmEHBS$*$H ze}K%vD%Q+pe@^UR$Y+xiV&Pur$i}oovMz2n+e+z!4Uw#j4gv{sj6 z7h4(pVwc=!`S9-d_xbB%{U$6{>i;(1t4ZV+`yAVVPU;O)P$MK z9OnQ2yRK~dt9v5r-p*I3Sf_BX`^5`i28ECbmfI7v_ZR!zbYnZj+WBXK_+Le#4sn$a z8XjK)#T3FOJUHBPv0bt8MXb*8yN&`3EQ}mX0xSv~4gw7d42}#<4EZ`8zZ4uSEv~XN z9^+VK$H8F~EAZ9v!@X>QuZ|8N^=aZMPg<9L{(IQ)ZSiz5^?&=ggCjO81- z$Pz8~WJ*BdBn4Y%j;6DmMW;?0drtVL)2(o0hQeBzyB-s==X<}o)@$?k%QEHq_*#KA zF%$F}!*ouiMDlXusq9a(Ugkb z38$0~{Qafy_t;TWKjU5X4=kImuzmRZOW`ZiD*h%_)|K;_c(1XqoO5U;f74Nx&S)3+ zd?tpEO=q_7Mn^lOpE5HN(DQiGzUKx1!~?-BomN~zwNqFt`V?NTFmM%E6ENYx;};i? zzibQug#}WufWm1{qr$6ZhNllgCn~ z`R|N7y5DW0<)2KM@@~1_`)R)vDq2lXsQye``8W5|E4|$0t5Pnt0(%ZgJ(<+>@mu9a zyA!2{j&Ol2*VehT{3`p(*d?p^n_O8}@;^BEOJOP~AX-^wW^$QC$S*14T5iW7Ca6*- zD7%-F;Ru(}W3x9rPx;;Qm6;bdxzwNN{wKiM!Yx!OqVh|FTfpXMm#vRPt%Oj=y`x2U mWLX&D2?G=Y0xUN~{xg&=ykedD<^EjARHnTBlWEd)pqpdT=jR8i9G5+mbbP?d zB6<5@nIl&$i{pcrEI$jCtD9ulxSGy7B+{4WNt`ai88xQ?aqHkZ;pm(~1?3`?4} z*tGTDD~>7d;ZYEGshqfcUkA$tZlxNoMRli`7Kpn1nGx_;Ldc=E>u7Pgg8+kr00Rpn fGSRU7k+kqRUv depot_no_track_offset) _loaded_newgrf_features.tram = TRAMWAY_REPLACE_DEPOT_NO_TRACK; } + /* If the baseset or grf only provides sprites for flat tiles (pre #10282), duplicate those for use on slopes. */ + bool dup_oneway_sprites = ((type == 0x09) && (offset + num <= SPR_ONEWAY_SLOPE_N_OFFSET)); + for (; num > 0; num--) { _cur.nfo_line++; - LoadNextSprite(replace == 0 ? _cur.spriteid++ : replace++, *_cur.file, _cur.nfo_line); + int load_index = (replace == 0 ? _cur.spriteid++ : replace++); + LoadNextSprite(load_index, *_cur.file, _cur.nfo_line); + if (dup_oneway_sprites) { + DupSprite(load_index, load_index + SPR_ONEWAY_SLOPE_N_OFFSET); + DupSprite(load_index, load_index + SPR_ONEWAY_SLOPE_S_OFFSET); + } } _cur.skip_sprites = skip_num; diff --git a/src/road.h b/src/road.h index c34579b5bb..c3fcc30ca9 100644 --- a/src/road.h +++ b/src/road.h @@ -66,6 +66,7 @@ enum RoadTypeSpriteGroup { ROTSG_DEPOT, ///< Optional: Depot images ROTSG_reserved3, ///< Placeholder, if we add road fences (for highways). ROTSG_ROADSTOP, ///< Required: Drive-in stop surface + ROTSG_ONEWAY, ///< Optional: One-way indicator images ROTSG_END, }; diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index dda2f2fa2a..94b4423a15 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -1606,7 +1606,17 @@ static void DrawRoadBits(TileInfo *ti) if (road_rti != nullptr) { DisallowedRoadDirections drd = GetDisallowedRoadDirections(ti->tile); if (drd != DRD_NONE) { - DrawGroundSpriteAt(SPR_ONEWAY_BASE + drd - 1 + ((road == ROAD_X) ? 0 : 3), PAL_NONE, 8, 8, GetPartialPixelZ(8, 8, ti->tileh)); + SpriteID oneway = GetCustomRoadSprite(road_rti, ti->tile, ROTSG_ONEWAY); + + if (oneway == 0) oneway = SPR_ONEWAY_BASE; + + if ((ti->tileh == SLOPE_NE) || (ti->tileh == SLOPE_NW)) { + oneway += SPR_ONEWAY_SLOPE_N_OFFSET; + } else if ((ti->tileh == SLOPE_SE) || (ti->tileh == SLOPE_SW)) { + oneway += SPR_ONEWAY_SLOPE_S_OFFSET; + } + + DrawGroundSpriteAt(oneway + drd - 1 + ((road == ROAD_X) ? 0 : 3), PAL_NONE, 8, 8, GetPartialPixelZ(8, 8, ti->tileh)); } } diff --git a/src/table/sprites.h b/src/table/sprites.h index b0e61b5d02..407a7a2d87 100644 --- a/src/table/sprites.h +++ b/src/table/sprites.h @@ -290,8 +290,10 @@ static const SpriteID SPR_TRAMWAY_DEPOT_NO_TRACK = SPR_TRAMWAY_BASE + 113; static const uint16 TRAMWAY_SPRITE_COUNT = 119; /** One way road sprites */ -static const SpriteID SPR_ONEWAY_BASE = SPR_TRAMWAY_BASE + TRAMWAY_SPRITE_COUNT; -static const uint16 ONEWAY_SPRITE_COUNT = 6; +static const SpriteID SPR_ONEWAY_BASE = SPR_TRAMWAY_BASE + TRAMWAY_SPRITE_COUNT; +static const SpriteID SPR_ONEWAY_SLOPE_N_OFFSET = 6; +static const SpriteID SPR_ONEWAY_SLOPE_S_OFFSET = 12; +static const uint16 ONEWAY_SPRITE_COUNT = 18; /** Tunnel sprites with grass only for custom railtype tunnel. */ static const SpriteID SPR_RAILTYPE_TUNNEL_BASE = SPR_ONEWAY_BASE + ONEWAY_SPRITE_COUNT;