From 0056eba408b2fe0250102b877fe1215718ae22db Mon Sep 17 00:00:00 2001 From: will-ca Date: Tue, 28 Dec 2021 14:05:56 -0800 Subject: [PATCH] Move BorderImages to tileset. Set origin in `setHexagonImageSize()`. (#5868) --- .../FantasyHex/Borders/ConcaveConvexInner.png | Bin 0 -> 5660 bytes .../FantasyHex/Borders/ConcaveConvexOuter.png | Bin 0 -> 4837 bytes .../FantasyHex/Borders}/ConcaveInner.png | Bin .../FantasyHex/Borders}/ConcaveOuter.png | Bin .../Borders}/ConvexConcaveInner.png | Bin .../Borders}/ConvexConcaveOuter.png | Bin .../FantasyHex/Borders}/ConvexInner.png | Bin .../FantasyHex/Borders}/ConvexOuter.png | Bin core/src/com/unciv/ui/tilegroups/TileGroup.kt | 56 +++++++++--------- .../com/unciv/ui/tilegroups/TileSetStrings.kt | 4 ++ 10 files changed, 31 insertions(+), 29 deletions(-) create mode 100644 android/Images/TileSets/FantasyHex/Borders/ConcaveConvexInner.png create mode 100644 android/Images/TileSets/FantasyHex/Borders/ConcaveConvexOuter.png rename android/Images/{BorderImages => TileSets/FantasyHex/Borders}/ConcaveInner.png (100%) rename android/Images/{BorderImages => TileSets/FantasyHex/Borders}/ConcaveOuter.png (100%) rename android/Images/{BorderImages => TileSets/FantasyHex/Borders}/ConvexConcaveInner.png (100%) rename android/Images/{BorderImages => TileSets/FantasyHex/Borders}/ConvexConcaveOuter.png (100%) rename android/Images/{BorderImages => TileSets/FantasyHex/Borders}/ConvexInner.png (100%) rename android/Images/{BorderImages => TileSets/FantasyHex/Borders}/ConvexOuter.png (100%) diff --git a/android/Images/TileSets/FantasyHex/Borders/ConcaveConvexInner.png b/android/Images/TileSets/FantasyHex/Borders/ConcaveConvexInner.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c4e479a3a54719f03dcbec59e85951d2b794a2 GIT binary patch literal 5660 zcmeHLXH-+!77k4`f+9sgV2A;Q0n-a45DX@Ckf5Qfc$3^fgcOrN0xE)H0TdA%Dk6#n zr8$TwiXt{tbQo}K*chsailB%ipzkJPdvE@@)|-FcwQlaYXYc*(y}z^1Irk);HP=fY zJ`E0o!SsE+ne(7$5Ohx-uLb=U-@dgP1{>#?#150s0~82}RLmE|fe3k`1Vn&J0Uria zwv>hjC3M*9jdU9?)1ElpHcQL9=A_fTb}`^W>&cJfA3XT84)k^r}v-)$RRt zczVa6A}Fj;XHT9C+n*ZEKV#fF8kp`f4xev!p2=}}()s*kq>)*NjSH=8+{Qa0Czd<+ zOxRZcU}8k#*?n(Ug_wQb^cH15-$tX>z zcsH=;-21u+7vuF+C=J@ecU?6b^+{yuaJqn=c1Osj=#M1SF0u$6x2mGFhH;?oSi2z( zz5Uek%)kP3Bb^r}=mW_UQ__!B(#<&t*q`gyI9TmEZdjK+E``c&TrdFBw9T>d?Ygia zRUbLQuifaNY{~WwFVm8<&9e>4O3oizsvCB2{D@a(-MZ7qjHevg&uKmoT6WO4G`M%> z<+73)M`D75ZykDcFC#s8J|Xr_q)4xMYshYLZ0TSY$;DQ&{1I;7&}Q9Dc-xIs`MsFJ zz*CL0=JWSZg;n=yE-vpb78mb!>T}l!%`h}15oblb(Fu*r3kk1y)(jSxexSctJ9v0_ zVo}q^2)E5GMuVx-l7gQw|2SlHKUd>e9$aJTBZKq%USD~Rb(kUUAoIN%*2C|gv$G%^ z-e_hp%RPMRSzyP&nx~#GBTvmh1)l1h?SU3PJ-7a0#j)lemHw+xJj4hr=1Ni0k3nzJ$rfsV; zH9Weir`1N6hC~IL%bu6G);+5$7}@1wYZ;V{Vljc+MG2CUrq{4Y?WrJbzBgB%8(E*$%A|KTcQJcXWWIait><1py7TO0J4<+0a*l1wo3{gJUT9zLq(>a- za&N0Rpx3dzW8r3Psn+4+#I62TU3Bwxm0>YR>*+zt9=dec|3ppEGtJh*G$XyGNhYhN z#>Ye(6x!#M`rnP<_dU?PcK%4b@;vtVfU&c?xy0ZAI`e$TZ?jr?P24}(q3-+>bFSWT zNx#*@)-DcO4&Lo)s++X33?2|kjvMbA{t|S2>HYW>$Fq&P#N)k%$={p7w(^&i4lkX{ zFBA7=xu(y`&~|Gf2i9+CnZ$H*_g!ez$td`J(H?5Tnpq5Tqgk4+Xj*^jo~PjPu7>RN z3yaNZl-8mf>w|L!9D{oP_~^xMSu$$9zxl+)zD!^7mG@;uZ!W%kVzlis3=PYD*{W6UhmV=&TEAk|aAnEE(l)v# z=h#|K2CKu9Uag#T@{QYv#qb!-z3)tCW((urT}p9)!8FnY3FmdkmOVVHHFDEo{>}WQ^xLy+w)n!UM~)gS_ZW{$ zo8l41Ipk)SAy8(OFMIbcX-8}Llt4s2cp8`@HV70)P`g*Ojd%2e_fz_F z-A!$iJ5E0zu;|XYn4E8ptJs;?HvTu(Gfs78_zn^C5+R>QCLul`uq zC%W0zk+$2|SMw~UY80obtw;^ISXH}8cqU#`J3rO2w7r~^x-+oZ!U~nFttZkly=xWl zSPQL4dAbE{o@1jE^FGs~b#%kIUnlE5(j1KyiC?V9bAyFHb6BBeX{lK_r(Ev}(0ntjK1ls0dFxS~i3BZj7

TK zEfCR=eP?Qs2mz0V3?&6%10)PEM&O+!1?MNtWpk5axfC99wj114NreD}pd3Ibg>fPo zRY^mtaj8&S)r~U4Nq3>XIrAypaV75AM>FP{L`7Yh{y(E_1F zZ3U72ou*vC|4P<(v8g2LbiNG)GXH}6o%ZM4)yj}oKme5~=EkeS^I_7ED*sfTm@D8> z)lEE>M**=U5(>l-Nhl)0iG<=%oNy>ENakU&d_INCr+fqDBa+Dh5f@ZJLEvZsghL<@ z$OHnwK{?||SQL@u44^0=pMU~6L_UWEKusd|8;C%u0IEtL?%SwTP&^3AiRVlpJ5#tQ zJb?$IhybVp#qv>DCkhwG#Zq`qPM{i!$EA9Tr9uE2PJs}J1~C#*v|6Adoa)Z*vH zR`c`0rJvqDO@TOpT7*ET%a#goKRJ;B2_R4H2(tSm;>G}?Xb_s;V+HlOU+@ouMZ%Mv z30N`?MJ9m&iparnPypYVk0NuqAdW(yI1{-4g)S5GIAc0A%;6 z4_aQJ)e7@vxf=mCQM>Ews_{YlqPx_*d(A5#8VT|epiAqIX(`DbFm!9`r9N zOoQX+#e}WbvGRsqCP=))WiZ%8Bh{?|+m&YqbuRK@y0e`dUNrl`Q?Pp4EOCKg3%S&% zZ>4`GvN9Rrx8_{uthEz(yVm~I+ZF9sK8{pL(oC66Zy2mmkce4Ky^Tt*&Gy=JD)VpV sS@fb8cIM@lZj?G;DvL6TMqUS!#p?_ymmBoAK%QVe9&?#xa~7}q4>kwjtpET3 literal 0 HcmV?d00001 diff --git a/android/Images/TileSets/FantasyHex/Borders/ConcaveConvexOuter.png b/android/Images/TileSets/FantasyHex/Borders/ConcaveConvexOuter.png new file mode 100644 index 0000000000000000000000000000000000000000..2645da70d619918dbb23eb1c249077783d1b2761 GIT binary patch literal 4837 zcmeHLX;c&05^jkIqCP=DP*GyUE!bH*ghT=&Yk&ZTARsDsIvr>si&;oOQ3O#?$8iJE zr_2oQc-&Cjmth2bPi5RU9;hrcg6Kh>3yL_rn}CRC=8xyR`A5#_r2AIYS5;rtt>h*z zGCXLQ&1f44f`$o${l(yO7Py96kidH#evJY_q>bs4Se+O(kkuNMoJhgRx->OT#*Ks= zf{fL*1@W3`lZUQ+5*JXA>9(RmlSGStti3(LACwHPAobaAh4anSJ^-F*Zh*#XnT z-~?L7jNh2)#g!kwtF}M*OZ$j4jV9ww!d3gM=1}V1mM1Ugc8+Tc;x!dqE1ukXMb+B; z(Tg2^D>UaoOUAxc52TrTs}s2g1?9)L4fDydnV#&Y_kRnOZ4L5{wBksgR!fq^dqpiT ztcDfF8Yg-TEwr*;d9(6V+xn+5#kb{~CfOr#gN_W@)p;c6S4I4|=9;Rbuid8MS*6yi zwj`&&%{kvdwauX~FQQ$zUYAm6*H~Q1V*HpfJvzeb;=N}h=2~7y&bh?wDnEKbBvu!Gjtc_ht`n>2Io&++ei_Y58@7v zZ*bhHo$BtlogBm>4bGBP=XFEKoy7-z zW^MbOyXQg)l9BlQK**ie?Ole=dt!EU?702LUfeb6kG##rW4eT|VrGs!nQlE|^t}Sd zIN~8yZ!CEfv_Cj->1CCZTR1JZGyT-3`V-{3<8Qe0NH?O|rGmo{G++hc=NBpT^ZUFz z!Jgcnu|W`gX@*N>Li}!u<4>tmZjblVmy)UV`=Y1J%!zbA{(OO^*$E+n#dBROA7o{_ zu8FpCN}M-#uBGoQQbkpj@K!)bXM#A%uAzL9&*R#~HRnm4Rn(}eqD3?AO`EVO#O8Eo ziS3dAYvu~OfLQ4s@5!qPp`LpIL5 zk&)Rp|8C3fDsNR*)idi z;$pFL;??=>Mni%@)m22ax0B=@nquLj%WhzbjwZmgj1`6PF_nUb%2ZOEW>l!bG=(59 zAEO$@l5rhbiYF3E0j2fqMGBda2`Dif5ksW*!;^^MbPXPr9xlPslQEu*;^S@OW#j_@ z1+GKMMn#HJ%Qp%rW?VkFH!agCWV4DcSwM*uMUwqg8k~&K5E=sxFcPUOink5fOCyu> z#r}ak5a3BbNz&=md^+7=FwhKano5&MXYzPFI)g=Lv0$J9YtxiE)CeoJ6HE}@82-2x z(-3MMp;D4fn5a~x*9j;TASZv0PoWlxdf}DY9u@!}bR(*!GieOELP76qq16SX0+617 z{?bA#0be?FF|JkVH5eX{iYs*!`a;OCUVF7(lVVOshSBj9Tme+Iz$^1Bmq9{NWUqyZ zfjHkZqj!x)DxgAo>!3!_Y?2h8MoAY7colFM**A1I+xt3#C-Zh`{fGy>qr zd5F}LA(O#O1_yx=3`Jn6C*}#GY&Jvg$;5HC4DSOGp&>w5qA7i&GC|1z6c0h8nf5C)gY;W0c|Y#zetc4Wqzjcc@^6HS;* z2CXLqQ(5>R89*#*>QewROf*_kL&FxM0>Mlw!p#>UgrjGCF z`6zr*_fz*4NFmH3GTGd=d=%?;qD512nb{Gr>lR^2s4@`;`@5&1KCcshQ7jJ@D#tl& z3}#5V9xx)sq<~?R3(6+t@;C@vjxf5@=tbA6}!rXU;8K;~@7Q_NIO{W=yy z5^my&!D7Np7R>ULFg^J!4xi!S&S3Bv3<|v`VY+Eof6my8{wGen%nE(R0I=&`1LFlu zD|+v^>fy{pFTHJn;7^e<^JyKr|X*-_$KB4?)tycW%K30 zgDb(WAOkqgr2WLEf}_yj$S_HO`A`IPb#-Oe-nb1O2I$1$QP7OvAA&!YpaIg*Ab%*= za%`|kT^$^!g`gq!rfUGSZM!pAbP)RcN}TUt3!E)iWZtJb$7TjOK$8^1@}8`o> "Concave" !borderSegment.isLeftConcave && !borderSegment.isRightConcave -> "Convex" - else -> "ConvexConcave" + !borderSegment.isLeftConcave && borderSegment.isRightConcave -> "ConvexConcave" + borderSegment.isLeftConcave && !borderSegment.isRightConcave -> "ConcaveConvex" + else -> throw IllegalStateException("This shouldn't happen?") } - val isConcaveConvex = borderSegment.isLeftConcave && !borderSegment.isRightConcave val relativeWorldPosition = tileInfo.tileMap.getNeighborTilePositionAsWorldCoords(tileInfo, neighbor) - // This is some crazy voodoo magic so I'll explain. val sign = if (relativeWorldPosition.x < 0) -1 else 1 val angle = sign * (atan(sign * relativeWorldPosition.y / relativeWorldPosition.x) * 180 / PI - 90.0).toFloat() - val innerBorderImage = ImageGetter.getImage("BorderImages/${borderShapeString}Inner") - if (isConcaveConvex) { - innerBorderImage.scaleX = -innerBorderImage.scaleX - } - innerBorderImage.width = hexagonImageWidth - innerBorderImage.setOrigin(Align.center) // THEN the origin is correct, - innerBorderImage.rotateBy(angle) // and the rotation works. - innerBorderImage.center(this) // move to center of tile - innerBorderImage.moveBy(-relativeWorldPosition.x * 15f, -relativeWorldPosition.y * 15f) - innerBorderImage.color = civOuterColor + val innerBorderImage = ImageGetter.getImage( + tileSetStrings.orFallback { getBorder("${borderShapeString}Inner") } + ) miscLayerGroup.addActor(innerBorderImage) images.add(innerBorderImage) + setHexagonImageSize(innerBorderImage) + innerBorderImage.rotateBy(angle) + innerBorderImage.color = civOuterColor - val outerBorderImage = ImageGetter.getImage("BorderImages/${borderShapeString}Outer") - if (isConcaveConvex) { - outerBorderImage.scaleX = -outerBorderImage.scaleX - } - outerBorderImage.width = hexagonImageWidth - outerBorderImage.setOrigin(Align.center) // THEN the origin is correct, - outerBorderImage.rotateBy(angle) // and the rotation works. - outerBorderImage.center(this) // move to center of tile - outerBorderImage.moveBy(-relativeWorldPosition.x * 15f, -relativeWorldPosition.y * 15f) - outerBorderImage.color = civInnerColor + val outerBorderImage = ImageGetter.getImage( + tileSetStrings.orFallback { getBorder("${borderShapeString}Outer") } + ) miscLayerGroup.addActor(outerBorderImage) images.add(outerBorderImage) + setHexagonImageSize(outerBorderImage) + outerBorderImage.rotateBy(angle) + outerBorderImage.color = civInnerColor } } } diff --git a/core/src/com/unciv/ui/tilegroups/TileSetStrings.kt b/core/src/com/unciv/ui/tilegroups/TileSetStrings.kt index 15dfcb0a02..44f26b46d8 100644 --- a/core/src/com/unciv/ui/tilegroups/TileSetStrings.kt +++ b/core/src/com/unciv/ui/tilegroups/TileSetStrings.kt @@ -36,6 +36,8 @@ class TileSetStrings(tileSet: String = UncivGame.Current.settings.tileSet, fallb val landUnit = unitsLocation + "LandUnit" val waterUnit = unitsLocation + "WaterUnit" + val bordersLocation = tileSetLocation + "Borders/" + // There aren't that many tile combinations, and so we end up joining the same strings over and over again. // On large maps, this can end up as quite a lot of space, some tens of MB! // In order to save on space, we have this function that gets several strings and returns their concat, @@ -73,6 +75,8 @@ class TileSetStrings(tileSet: String = UncivGame.Current.settings.tileSet, fallb else return cityTile } + fun getBorder(imageName: String) = getString(bordersLocation, imageName) + /** Fallback [TileSetStrings] to use when the currently chosen tileset is missing an image. */ val fallback by lazy { if (fallbackDepth <= 0 || tileSetConfig.fallbackTileSet == null)