From 353735973db96d0daf5c81571a317a57a32e3a5a Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Mon, 11 Sep 2023 21:23:06 +0200 Subject: [PATCH 01/37] Added terrain graphics --- .../resources/terrain/pltcmd_terrain_all.piskel | 1 + .../resources/terrain/pltcmd_terrain_all.zip | Bin 0 -> 7158 bytes .../src/main/resources/terrain/terrain_00.png | Bin 0 -> 355 bytes .../src/main/resources/terrain/terrain_01.png | Bin 0 -> 340 bytes .../src/main/resources/terrain/terrain_02.png | Bin 0 -> 252 bytes .../src/main/resources/terrain/terrain_03.png | Bin 0 -> 236 bytes .../src/main/resources/terrain/terrain_04.png | Bin 0 -> 290 bytes .../src/main/resources/terrain/terrain_05.png | Bin 0 -> 247 bytes .../src/main/resources/terrain/terrain_06.png | Bin 0 -> 259 bytes .../src/main/resources/terrain/terrain_07.png | Bin 0 -> 242 bytes .../src/main/resources/terrain/terrain_08.png | Bin 0 -> 283 bytes .../src/main/resources/terrain/terrain_09.png | Bin 0 -> 364 bytes .../src/main/resources/terrain/terrain_10.png | Bin 0 -> 310 bytes .../src/main/resources/terrain/terrain_11.png | Bin 0 -> 336 bytes .../src/main/resources/terrain/terrain_12.png | Bin 0 -> 286 bytes .../src/main/resources/terrain/terrain_13.png | Bin 0 -> 291 bytes .../src/main/resources/terrain/terrain_14.png | Bin 0 -> 249 bytes .../src/main/resources/terrain/terrain_15.png | Bin 0 -> 321 bytes .../src/main/resources/terrain/terrain_16.png | Bin 0 -> 308 bytes .../src/main/resources/terrain/terrain_17.png | Bin 0 -> 295 bytes 20 files changed, 1 insertion(+) create mode 100644 game/graphics/src/main/resources/terrain/pltcmd_terrain_all.piskel create mode 100644 game/graphics/src/main/resources/terrain/pltcmd_terrain_all.zip create mode 100644 game/graphics/src/main/resources/terrain/terrain_00.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_01.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_02.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_03.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_04.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_05.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_06.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_07.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_08.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_09.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_10.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_11.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_12.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_13.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_14.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_15.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_16.png create mode 100644 game/graphics/src/main/resources/terrain/terrain_17.png diff --git a/game/graphics/src/main/resources/terrain/pltcmd_terrain_all.piskel b/game/graphics/src/main/resources/terrain/pltcmd_terrain_all.piskel new file mode 100644 index 00000000..0f4e5d0b --- /dev/null +++ b/game/graphics/src/main/resources/terrain/pltcmd_terrain_all.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"pltcmd_terrain_all","description":"\n","fps":12,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":18,\"chunks\":[{\"layout\":[[0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17]],\"base64PNG\":\"data:image/png;base64,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\"}]}"]}} \ No newline at end of file diff --git a/game/graphics/src/main/resources/terrain/pltcmd_terrain_all.zip b/game/graphics/src/main/resources/terrain/pltcmd_terrain_all.zip new file mode 100644 index 0000000000000000000000000000000000000000..23c28ef0386aafaf25b4f075b06d351b5b98b136 GIT binary patch literal 7158 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 literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/terrain/terrain_00.png b/game/graphics/src/main/resources/terrain/terrain_00.png new file mode 100644 index 0000000000000000000000000000000000000000..04026f87458967cd9d555c7d893132b471874221 GIT binary patch literal 355 zcmV-p0i6DcP)kxoCxNoOUMin>;(9>@o6MA{7AFLVKN|8Zpzi7-& z0TlolwM;S`KvAf)v8pzEAX9(=MBgO5fGp?3A6SnqU%ED&{pvJ9DylN`d zBWMn4LZ(3P_xS*nBbQn-r99At*{@XvP*QPt2|mgGFKA_AnZy79002ovPDHLkV1m7N BkMsZl literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/terrain/terrain_01.png b/game/graphics/src/main/resources/terrain/terrain_01.png new file mode 100644 index 0000000000000000000000000000000000000000..a389568b56a50ad2bd5ccc296c676d49de804de2 GIT binary patch literal 340 zcmV-a0jvIrP)3%v) zqm^839{X+yK(B~O-UaXu&lKzB#Q;%fBfycZ2w55n(1CXR7R;McWK`5|*Iez(u!39a2|;%%`{j6Lr!SDE`{bI8qWVqFzyD mH+V`S1&Fk&LI^-jO5$E|Chox;vh;oc0000i9o0sY63O+6cU|9EV8+#S(BmkAl zR}ysq$xe8#4#3)Z0Z1LN1*G`;3`oS<=d=NKL{dBrfEthr-+9acP|!~RlpZbO$JPHH zNa-r)4!i?aV}Sv3x{Tee8vxOc#I$R`YVLmCx_2PQ0Jczu{{{cT!s`|jBv`9-O%j6As`kiS|NPl%?z)E`*%J6l-X7Q|n-{}&Rn{}lu_A`) z;LJ{@J**Z@F(3FHUKz4DF~zOzSn}X1!xB%^hJUgSm-PSsuhx6bP`+GMAw`(&qL6yg z<^bVo4gq?r+5|G)Oc}OFUS+u8@K1a}iuSyB9Wo0h_1^Lq3-sae+$O~^E60?f&!8%N j3S)@O&UA*evO5@(HZ5p;&;3;z=zIoGS3j3^P6z>%07*qoM6N<$f~sS6MgRZ+ literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/terrain/terrain_05.png b/game/graphics/src/main/resources/terrain/terrain_05.png new file mode 100644 index 0000000000000000000000000000000000000000..85be47542ad0beb716862fa77c812051f6c828ea GIT binary patch literal 247 zcmV2wuv`on2i->}-PRQ;8 xcLg}7xB?(faRWe|;sPLXiVFY|Kxs{LfD1vYwSgDs3-bT~002ovPDHLkV1mA}Ubg@M literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/terrain/terrain_06.png b/game/graphics/src/main/resources/terrain/terrain_06.png new file mode 100644 index 0000000000000000000000000000000000000000..87c9d707eb2f5f03b1c6f3adf2479141f27d95b6 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJQ=Tr4ArbCxuN~xVP~c$=u-w(m zZeGB6{NpQ`yeD#b55(k5C(KZAieAXkUZwW(G56A}xw|)O{?KIfV4BpR@9xHU!9k}@*xG|Q4z+f$O^BCHNxaL@d;FYpmQVuI4d+Qwcg`?> zQ`}O{Eo*cxB;t9agoL)jv+1eQ9xF2UFvRe-RW)y7(&*rx$K0s+$hhtr&{qteu6{1- HoD!Mz|H+`dCR2#%h1lZTU2i4?vR_bPNpSSrYSN(Zw^3CmsL1r7fWnjo4$}f3 zaqQt!I94?mT;#Zw2S9xTUYKwJ2%HHs%eX9zSGU#n~UMQg!4z?7=)m#bH&*@h>F| q*8~)fi%)qWDdlRYYNxV9oZ+~2gYIc5fsxTmaw{QzXd3z!0t22jK-=TZP!@eL>p&_dh<*cRCww1B8iLJ#6w z*xJj&QKPsBSRYkDsSqmDg=rOXf^xuuV#Jxba4rC)>b+}T8$!20$qD*zxGjiQi~#qJ zNEyfiS*?%&YL#VXK@$LEx%a*+K+TzO29!!sUJ67v2T}m&u;PTZ7q;MVfM|s*ICLNi h5INT^ge=Sjuma7BlHpZ?oX!9M002ovPDHLkV1nreaiahL literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/terrain/terrain_09.png b/game/graphics/src/main/resources/terrain/terrain_09.png new file mode 100644 index 0000000000000000000000000000000000000000..dce10b2adc6d304e05bf4c1c1922d60803c7e5fc GIT binary patch literal 364 zcmV-y0h9iTP)-M zw~qrzXgPoYytY&Tj1WCc08vY{E3*U40JQ)xTO{?;IG(3yGc-E(@?J_V{Zw8+}ad?aV!MrSxxWly;^1z%TO)>VD8PDDvG7YOg1o6t~I(XRT46N zLmD)Avf9~cGl#*9;pIaD|Z7Rvjb1U z7Alm+c~=FJ3f6P|9{|?;=&Ar|;ok)y)kkx7Re-eb2C%vU4-HO04I@k8HUIzs07*qo IM6N<$f-F3J0ssI2 literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/terrain/terrain_11.png b/game/graphics/src/main/resources/terrain/terrain_11.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a019df1783746cc7995f5394b251003ed2ab1c GIT binary patch literal 336 zcmV-W0k8gvP)6wKs;HWUi7)!d(#~}@AZA(|r`Z(+Da(*s5e(N7VQQ&%i zET`i^zOd*Vz5+91p9+wjlK{-Qs=^e2+NlCS&ZP>p4tEEzJRlGhJXFAQGy>p(Zvvoz zy8u~~(YmtM1t8h0L|J#P_8bE68c+{HRqhL*7d?$Ob6%9F_k93Fr9+~f3P9_)?4!=x za(pX591<10QR&%FlQ7C)r7O0HT!1iu9Z;&F2i{XKtO9C;HXa1fyThz8?GE7O0!i%j zJ`s4>keT34LnV^YZG`cBZ7Pl9)fjB_^XF*P_Aw}K!*%WZIgxSgl;O-Oy3Ib4MOtCEppeN^qAOV;i zLLFh=#U9aD04Y*qV+#OS#agadPv6>vTA%|b0pZPnug&b8rksu}A;i?8{7JI_P<+Sk z8Daov4|KzJ-U%fF2SHp4aQ3~=qDK!%D2!-|00UW?3?j{cCvzxetqj*yz1__jk)SsljXi}9A&MBpC+F_|4yy^l#E71M= zU66Sivx~Dz06{~*@C)M%~ij{?MkhlE@t;JThvNdisNvqp87pa5`&jE!{rOz1WDQ3-tk8=T0K+%LLBUQ>f pnkn6OfmUh>#0@~pv;e%e0)INAjE&2~py&Vq002ovPDHLkV1lNbd%*wz literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/terrain/terrain_14.png b/game/graphics/src/main/resources/terrain/terrain_14.png new file mode 100644 index 0000000000000000000000000000000000000000..d34c700097eb196bdef4a7fc7c6d6ef8fc9a987d GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ1D-C9ArbD$PefvW%ui%se7u7B zg(y>3+CmM%+W%Lw4CZGAHk@XfVR6Rk%M&+Kb_MC4Hxe;ohp${d!nh=5RUkXhIRS+! zixLZcG#V4VxnHCu^D<6Qn(=Ul472f^DI)!69YcDVie#Ka*(V5VnG_zlpv!(iSmuQK zlO-jq+8EZ#n$BW#b51B|Vc0gMZ_ZSYvt3J`$n*#}tm~N29Tp_pc+X{V_Us9(SOqoP xCN7@##>GS9u0V88@Dm2FOGh&{*IZ~}U`R|Z>8+}WS_SkAgQu&X%Q~loCIIH*T{Qpz literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/terrain/terrain_15.png b/game/graphics/src/main/resources/terrain/terrain_15.png new file mode 100644 index 0000000000000000000000000000000000000000..49ef57449aa72f8eee9a937c3940bb5ad0782753 GIT binary patch literal 321 zcmV-H0lxl;P)XY4rh@pQRQ8$R>T0PGI? zHyv;1>r}s$ck6j7piS;^MXpytEQs&1pjF9J$dkOC7b<}G*khLoFnZ$(9V);^*CwJ{ z1?(o?JS}Im+!&@n3ughn06yipS_N|R@}4Op)az6ZFpIJZhB=T?gaHo$mh(B1+*)cl$S|Px*a2>6?rcMf)t1r%=~Xp)Ky TbkGE~00000NkvXXu0mjfnzVv$ literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/terrain/terrain_16.png b/game/graphics/src/main/resources/terrain/terrain_16.png new file mode 100644 index 0000000000000000000000000000000000000000..aad7aa8ee63140f911b4fed555201a38cbd6ed60 GIT binary patch literal 308 zcmV-40n7f0P)t> zc(kuEzXL$(Wh(=1i>q^h($O*pwDt~3APp;&l@I{5h_o*ZK%-a#83xc7umUQlaat}U z@0j}(8w&#&X40tUzNbrI1(FKDGpy7>gnFYt_0VBO0%((=iLBJS4kK%eA)rz{fE4Wa zYy*J%U4T+5y&tq8_aZ^2>$T!fm(t9_D06AIVoSlV>w*X1PowthjEOz~0000b(Ds^V*3d&$)xiGOHbKiA4tpaIat{JD|H_ak&B02-VtBmoe`b^$0L5=c%?VBWt_3Nj#GT3i4xKz6(X zYzjy>d*-oB$NhpBv9t=1MRX7RmjYJXMRINRi?jmS>PZ8Xb;8PX0N-g<1>_lkuTth4 z-L@%)Y))SQUO>%=nh7-pwa!@Lfrx@701;z$fL#S5rHE|3T58NPY#(!XYZH*!_+9?z t`61*1wC$p$+TcO}-fE7FcYxCsSOG4|wZWqf2D< Date: Mon, 11 Sep 2023 21:23:22 +0200 Subject: [PATCH 02/37] Trying texture packing --- game/graphics/pom.xml | 7 +++++++ .../application/graphics/TexturePacking.kt | 19 +++++++++++++++++++ pom.xml | 2 ++ 3 files changed, 28 insertions(+) create mode 100644 game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt diff --git a/game/graphics/pom.xml b/game/graphics/pom.xml index 129a1c3d..b47f9d77 100644 --- a/game/graphics/pom.xml +++ b/game/graphics/pom.xml @@ -15,6 +15,13 @@ Utlities to provide access to graphics, images, icons and so forth. + + com.badlogicgames.gdx + gdx-tools + 1.12.0 + + + de.gleex.pltcmd.model world diff --git a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt new file mode 100644 index 00000000..77747085 --- /dev/null +++ b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt @@ -0,0 +1,19 @@ +package de.gleex.pltcmd.game.application.graphics + +import com.badlogic.gdx.tools.texturepacker.TexturePacker +import com.badlogic.gdx.tools.texturepacker.TexturePacker.Settings +import java.io.File + +// TODO: programmatically pack the textures into an atlas +fun main() { + println("processing terrain folder") + val baseFolder = ClassLoader.getSystemClassLoader().getResource("terrain/")?.path!! + val settings = Settings().apply { + paddingX = 2 + paddingY = 2 + maxWidth = 104 + //rotation + } + TexturePacker.process(settings, baseFolder, "$baseFolder${File.pathSeparator}packed", "terrain") + println("texture packing done") +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index da916271..e82b3d09 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,8 @@ 2022.1.0-RELEASE 0.3.4 + 1.12.0-rc1 + 5.8.2 5.3.1 From 53e1a2b26d6c3b2c6c39f4fbb70eeeaecbd4b3a5 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Mon, 11 Sep 2023 22:01:16 +0200 Subject: [PATCH 03/37] renamed files and packed into an atlas --- .../application/graphics/TexturePacking.kt | 12 +- .../terrain/{terrain_03.png => forest_01.png} | Bin .../terrain/{terrain_04.png => forest_02.png} | Bin .../terrain/{terrain_05.png => forest_03.png} | Bin .../{terrain_00.png => grasslands_01.png} | Bin .../{terrain_01.png => grasslands_02.png} | Bin .../{terrain_02.png => grasslands_03.png} | Bin .../terrain/{terrain_06.png => hills_01.png} | Bin .../terrain/{terrain_07.png => hills_02.png} | Bin .../terrain/{terrain_08.png => hills_03.png} | Bin .../{terrain_09.png => mountain_01.png} | Bin .../{terrain_10.png => mountain_02.png} | Bin .../{terrain_11.png => mountain_03.png} | Bin .../resources/terrain/packed/terrain.atlas | 132 ++++++++++++++++++ .../main/resources/terrain/packed/terrain.png | Bin 0 -> 3861 bytes .../{terrain_12.png => water_deep_01.png} | Bin .../{terrain_13.png => water_deep_02.png} | Bin .../{terrain_14.png => water_deep_03.png} | Bin .../{terrain_15.png => water_shallow_01.png} | Bin .../{terrain_16.png => water_shallow_02.png} | Bin .../{terrain_17.png => water_shallow_03.png} | Bin 21 files changed, 137 insertions(+), 7 deletions(-) rename game/graphics/src/main/resources/terrain/{terrain_03.png => forest_01.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_04.png => forest_02.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_05.png => forest_03.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_00.png => grasslands_01.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_01.png => grasslands_02.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_02.png => grasslands_03.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_06.png => hills_01.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_07.png => hills_02.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_08.png => hills_03.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_09.png => mountain_01.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_10.png => mountain_02.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_11.png => mountain_03.png} (100%) create mode 100644 game/graphics/src/main/resources/terrain/packed/terrain.atlas create mode 100644 game/graphics/src/main/resources/terrain/packed/terrain.png rename game/graphics/src/main/resources/terrain/{terrain_12.png => water_deep_01.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_13.png => water_deep_02.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_14.png => water_deep_03.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_15.png => water_shallow_01.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_16.png => water_shallow_02.png} (100%) rename game/graphics/src/main/resources/terrain/{terrain_17.png => water_shallow_03.png} (100%) diff --git a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt index 77747085..bed54a33 100644 --- a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt +++ b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt @@ -2,18 +2,16 @@ package de.gleex.pltcmd.game.application.graphics import com.badlogic.gdx.tools.texturepacker.TexturePacker import com.badlogic.gdx.tools.texturepacker.TexturePacker.Settings -import java.io.File -// TODO: programmatically pack the textures into an atlas fun main() { - println("processing terrain folder") - val baseFolder = ClassLoader.getSystemClassLoader().getResource("terrain/")?.path!! + val baseFolder = "game/graphics/src/main/resources/terrain/" + println("Packing textures in $baseFolder") val settings = Settings().apply { + pot = false paddingX = 2 paddingY = 2 - maxWidth = 104 - //rotation + maxWidth = 120 } - TexturePacker.process(settings, baseFolder, "$baseFolder${File.pathSeparator}packed", "terrain") + TexturePacker.process(settings, baseFolder, "${baseFolder}packed", "terrain") println("texture packing done") } \ No newline at end of file diff --git a/game/graphics/src/main/resources/terrain/terrain_03.png b/game/graphics/src/main/resources/terrain/forest_01.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_03.png rename to game/graphics/src/main/resources/terrain/forest_01.png diff --git a/game/graphics/src/main/resources/terrain/terrain_04.png b/game/graphics/src/main/resources/terrain/forest_02.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_04.png rename to game/graphics/src/main/resources/terrain/forest_02.png diff --git a/game/graphics/src/main/resources/terrain/terrain_05.png b/game/graphics/src/main/resources/terrain/forest_03.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_05.png rename to game/graphics/src/main/resources/terrain/forest_03.png diff --git a/game/graphics/src/main/resources/terrain/terrain_00.png b/game/graphics/src/main/resources/terrain/grasslands_01.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_00.png rename to game/graphics/src/main/resources/terrain/grasslands_01.png diff --git a/game/graphics/src/main/resources/terrain/terrain_01.png b/game/graphics/src/main/resources/terrain/grasslands_02.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_01.png rename to game/graphics/src/main/resources/terrain/grasslands_02.png diff --git a/game/graphics/src/main/resources/terrain/terrain_02.png b/game/graphics/src/main/resources/terrain/grasslands_03.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_02.png rename to game/graphics/src/main/resources/terrain/grasslands_03.png diff --git a/game/graphics/src/main/resources/terrain/terrain_06.png b/game/graphics/src/main/resources/terrain/hills_01.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_06.png rename to game/graphics/src/main/resources/terrain/hills_01.png diff --git a/game/graphics/src/main/resources/terrain/terrain_07.png b/game/graphics/src/main/resources/terrain/hills_02.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_07.png rename to game/graphics/src/main/resources/terrain/hills_02.png diff --git a/game/graphics/src/main/resources/terrain/terrain_08.png b/game/graphics/src/main/resources/terrain/hills_03.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_08.png rename to game/graphics/src/main/resources/terrain/hills_03.png diff --git a/game/graphics/src/main/resources/terrain/terrain_09.png b/game/graphics/src/main/resources/terrain/mountain_01.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_09.png rename to game/graphics/src/main/resources/terrain/mountain_01.png diff --git a/game/graphics/src/main/resources/terrain/terrain_10.png b/game/graphics/src/main/resources/terrain/mountain_02.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_10.png rename to game/graphics/src/main/resources/terrain/mountain_02.png diff --git a/game/graphics/src/main/resources/terrain/terrain_11.png b/game/graphics/src/main/resources/terrain/mountain_03.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_11.png rename to game/graphics/src/main/resources/terrain/mountain_03.png diff --git a/game/graphics/src/main/resources/terrain/packed/terrain.atlas b/game/graphics/src/main/resources/terrain/packed/terrain.atlas new file mode 100644 index 00000000..7f02836c --- /dev/null +++ b/game/graphics/src/main/resources/terrain/packed/terrain.atlas @@ -0,0 +1,132 @@ + +terrain.png +size: 104, 206 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +forest + rotate: false + xy: 2, 172 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 1 +forest + rotate: false + xy: 2, 138 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 2 +forest + rotate: false + xy: 36, 172 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 3 +grasslands + rotate: false + xy: 2, 104 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 1 +grasslands + rotate: false + xy: 36, 138 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 2 +grasslands + rotate: false + xy: 70, 172 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 3 +hills + rotate: false + xy: 2, 70 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 1 +hills + rotate: false + xy: 36, 104 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 2 +hills + rotate: false + xy: 70, 138 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 3 +mountain + rotate: false + xy: 2, 36 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 1 +mountain + rotate: false + xy: 36, 70 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 2 +mountain + rotate: false + xy: 70, 104 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 3 +water_deep + rotate: false + xy: 2, 2 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 1 +water_deep + rotate: false + xy: 36, 36 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 2 +water_deep + rotate: false + xy: 70, 70 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 3 +water_shallow + rotate: false + xy: 36, 2 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 1 +water_shallow + rotate: false + xy: 70, 36 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 2 +water_shallow + rotate: false + xy: 70, 2 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: 3 diff --git a/game/graphics/src/main/resources/terrain/packed/terrain.png b/game/graphics/src/main/resources/terrain/packed/terrain.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9c54cf67de8b53e4ea01cece6f727c9dbf2017 GIT binary patch literal 3861 zcmW+(c{r5o8@7Bi#tfOpSewRRj4e!|knKa6u})GUgNYj3(V$bLiN1ztVQks?l$@e$ zZ4N0jgmaE9*(wT2LO5BY^qceh<6W-zeXr|zuIIU*`@NqOhMS`-S`{rOCMHX#Ie3WH zVA1GCAw_eax1;D_+X&qO^o;TQTGVuHm$ypWeg)t(OuAonZr<==U5XBBhjPk6StT?5&zB~H; zQt^y&PjzKO`C9ktxV>83S`CuO{q}PF<50YfnJM>esDrmgH>-Oa^qCbG!2;-MNP&R5B_QE_jq{2tqWCUw_{>Y`WM?onuXE!;PG zSFpOTK*o0T%DxL1GR8Ao1!myuwwmIlS3_I3keA2g9$X5O?dN(D)=pRrN(TZgufD=# zj4`QQT949F<5Vch~{H`WG z0Z|sEx&-gV>@N$rY@y+*`f@#Mwy0fCsb5-E=1t7$erV1X@hh(iQ+D264F??K~A58 zr>s1TC6tV_d!bvwR7~%0YA#nv+L5?czsrM$sCa6--0W2LzO9e%9ocS>2bE2&nF`=j z{qZgs-S5T3M=&8P=%-YpA3PGL-C?Hh`R#Wdof6H0>VxJ_bam?XomNw)=zQ?pHY<2c zWH8*wd}QwCV*jH4s#&tMYJzenAfG+NslrC9C9nNk>pshUb^tW*le;2LW!GQl;O+CqhPR;)&@_vOUrIs0UV9Nz!y^WxOG_>1+i3tx{U2yaT* z`(#+c?-KJQgw7v=%Q=e~#`#QsvmtFvAiZaPkKD16&7lp%r>C7}Ly}(&{;>2yu6hU0 zzAkv;ZvAWFcl6(hlm5rA2@`NPNs5$i`jTpW8d;|leSTv(?qPn?Q~&9LBJe?Cj4i0_ zOJCQ@Wi!x+P#&$Xs|n{Q!Rr0S!K95aK8}2HW?*nKx~$p>YyHo^bD1+db%?;ebwP;@ z&}#wK&h~w>KyAJ~s?P;$t&5$LdMhm?68483fmHik7+Su3%?=f_(>D?~45u?PVVfTt z?dKp%@Pu4ytzlQD`C*3OQw5I?kDYWzq(?CfpME6S#CRezh7hFMkWv9T% z3ep9akZnWiF@(A)^7L0V>;0DTOPf;qow}T_;d-SG47MjovIVOZdv^9H|7dY24R5K4QprPHBu!u5nZ}K|a5kldZ7$hzDlD=a{ws_jxgLf^Y9r>pq|bc6Fla14S!$bbAR1gR z6UJWp&LkkO1_q&XS87!ytPVgHFdCg?IV+oNA>DUT?u2OwF)s2t|N8*uZ+lsQ=~M)V zYkqB zbox_{Ow6zSC0+=fa9zf*N12>or=*A+bxF^bZ=6D-jJUVW z=l|nLC2|d>A!t9O7cqK-_i>v7Z(&bR^gAp*R$CK_8Yzd!;%1cl{)|a(Gpa4J0R1=X z7Jkqm8E_1fsg(Q78gXUtH+6MZg1O-lN|W|K+V!1sjmu*P+e3pQOrgGC>3`CCkNf|E zFurUKzARB0mA6`}+Fcu8@)Y<|-Szs{>k$J~OB&R!nfz<71PeTFx;L$i=*s`yF=+)A zbN!3FxGzMV^H{8Jo-=flXldI$cqcYVi-yixaf&96u(3(L7~%^DhA{eU7OLUPqN=CP zKNn?%oa31`gK;088{&czPj|`ZWAaf~>lP-cy~RH!3QA<9onl0h6&nQ*-Z`)wO4>;f z*Rr-+_us4svW38>$6w;UuEByr;Lf{ufP4akovSXZgaLVIscGxz zlY~t8Ok4r!(&(iV=V^L>cBR(QL7VSwJLqn;@KJ~OLk5W>c;A`^=MnGj3Fy7t^MS)x zwWcYJ^yWqr9#|SWWP~w3@3GIr*2<9F)hD4gXXcL87{_%&==Zw^{f~2J)rhH#*_dX3h z-9l4p;zN@!O9(mt&7T9~8*0^668I;05%&5%W2VGM4Lk8zzm0>&2wu+fSA?}%O#Z`* zVD*cbD5=3WYr~n7;u}0dlFv8`5>y!90k;LsrQKpfl{UXO7BMj?$oK z{U{t2p~V0shk!2>TE5auBzR{};jAx&(G<5O1;5qEh{y)TR(3TUsfufmn?9EPKhWWLJlM3dyoD3QTt>FEFbz5y7;We8f=#MSm+F}rE~$yYF?dpzN%DHhti;aHaJT6lMjf_zp1`p=&^(wz zs|b{BXP*I;sj2%(TiJ*tqIlY;fO=BtlV>EeskwzLA6vky9!R$hkxf5Ov!Zm^&9F^b zUCZu?Z1tx}G!+e6fp&B>=#$%lpMP`^$J4Q5cEcz-|8sR0JvX$8bI~xEH64ac8ZPjI z9+{W2xlrGylXS4yxC8BzpEKi>W{5Ik$^5o$lhEYZD`BG48hZUDu)CvnpL&N--(KT* zHO40)PW|r9JouRZTzqq)%lP$E8@?;&E-qjGXvTd$HvU(&pS7=5T!;c(bH|qDoNnz; zm76}xDokJ+tn9?j_SjCFwJQEqICYG37?Ga zyPGAbw}BYw)XRA3IzFJszN3fwz_qP;0a<_5y@CBPr!3#9<;DU{#S}#8p7oXw|ro>&cKfNgHdh+dyRm(N<(~;AFm?11OzU znj(lDyd8jv;=Rp?fS{ihFu~vq{xFHI zR|=xg_8%`hFIfSUqGWwB9MEIzzF*W$-6nN#r}tBmk+MmuN>XngoQT2*$C}0>6QV%7 z<`YF-w&=M$U+u6 zG*P|bPuOk(D&y=JxJS~W{f&SAq&xRR72M4LRh>Fa=O91`S=9P~*D{6Pl84QlGp+qO zihbSZi*-aSxO8J&i)~W*rrrF%?^c8@W^dsM@WyGMv!KLFNcG`PP`KdQG_BEL(b(~0 zFJS(G5=vJB5%>MEPJ&47yQFV23pf0G?*?=e+WP{XR+1PXW=!5QIz_tb(ApvA0Hb%? zc{cb|Q*`Uq&AVFlIU3+AXZW_i68R_9gE=dx6&rOlSRXc{;HAG!V2w*LdI!+973})8 zakHCmwFi36DB%B-4!)ZxzbYpz0#W>v)lvIYTZDr8?YCe-xHF$@UvaDkgY)XL?j8>a zz(<9I9&lk?Ve3u2Z5OkHL?mJ|mT1nJ55&I1@jN&Lfmfxd?I|bqoa}lX7=X!;$evM6 zeaIMT4{!l5*B~BC+!u|;dO?87{i^xP%RP(BW-(rnMDixbm&mkoYe1u)?fuOj zi%bnX+7ij z*is@ci09kVvK>z*-_>j+T^c~YH8&Q?s8a=T(`7x&$6resZOM%uKHneqZqQKF?uyY5 LxH(kW1wj7;PJq(5 literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/terrain/terrain_12.png b/game/graphics/src/main/resources/terrain/water_deep_01.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_12.png rename to game/graphics/src/main/resources/terrain/water_deep_01.png diff --git a/game/graphics/src/main/resources/terrain/terrain_13.png b/game/graphics/src/main/resources/terrain/water_deep_02.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_13.png rename to game/graphics/src/main/resources/terrain/water_deep_02.png diff --git a/game/graphics/src/main/resources/terrain/terrain_14.png b/game/graphics/src/main/resources/terrain/water_deep_03.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_14.png rename to game/graphics/src/main/resources/terrain/water_deep_03.png diff --git a/game/graphics/src/main/resources/terrain/terrain_15.png b/game/graphics/src/main/resources/terrain/water_shallow_01.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_15.png rename to game/graphics/src/main/resources/terrain/water_shallow_01.png diff --git a/game/graphics/src/main/resources/terrain/terrain_16.png b/game/graphics/src/main/resources/terrain/water_shallow_02.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_16.png rename to game/graphics/src/main/resources/terrain/water_shallow_02.png diff --git a/game/graphics/src/main/resources/terrain/terrain_17.png b/game/graphics/src/main/resources/terrain/water_shallow_03.png similarity index 100% rename from game/graphics/src/main/resources/terrain/terrain_17.png rename to game/graphics/src/main/resources/terrain/water_shallow_03.png From 480b46967fe99f7ba93390a2ce8347a311c66957 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Fri, 15 Sep 2023 21:04:20 +0200 Subject: [PATCH 04/37] puzzled together some basics from the gdx-liftoff does not yet start --- game/application-ktx/pom.xml | 50 ++++++ .../pltcmd/game/application/KtxLauncher.kt | 16 ++ .../gleex/pltcmd/game/application/Pltcmd.kt | 35 +++++ .../pltcmd/game/application/StartupHelper.kt | 148 ++++++++++++++++++ .../src/main/resources/libgdx128.png | Bin 0 -> 9754 bytes .../src/main/resources/libgdx16.png | Bin 0 -> 879 bytes .../src/main/resources/libgdx32.png | Bin 0 -> 2092 bytes .../src/main/resources/libgdx64.png | Bin 0 -> 4996 bytes .../src/main/resources/logo.png | Bin 0 -> 9754 bytes game/pom.xml | 1 + 10 files changed, 250 insertions(+) create mode 100644 game/application-ktx/pom.xml create mode 100644 game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/KtxLauncher.kt create mode 100644 game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt create mode 100644 game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/StartupHelper.kt create mode 100644 game/application-ktx/src/main/resources/libgdx128.png create mode 100644 game/application-ktx/src/main/resources/libgdx16.png create mode 100644 game/application-ktx/src/main/resources/libgdx32.png create mode 100644 game/application-ktx/src/main/resources/libgdx64.png create mode 100644 game/application-ktx/src/main/resources/logo.png diff --git a/game/application-ktx/pom.xml b/game/application-ktx/pom.xml new file mode 100644 index 00000000..1470b77b --- /dev/null +++ b/game/application-ktx/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + de.gleex.pltcmd.game + game + 0.2.0-SNAPSHOT + + + application-ktx + + Application with KTX + A frontend for the game built with KTX + + + 1.12.0 + 1.12.0-rc1 + + + + + com.badlogicgames.gdx + gdx + ${gdx.version} + + + com.badlogicgames.gdx + gdx-backend-lwjgl3 + ${gdx.version} + + + io.github.libktx + ktx-app + ${ktx.version} + + + io.github.libktx + ktx-assets + ${ktx.version} + + + io.github.libktx + ktx-graphics + ${ktx.version} + + + + \ No newline at end of file diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/KtxLauncher.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/KtxLauncher.kt new file mode 100644 index 00000000..c5833a23 --- /dev/null +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/KtxLauncher.kt @@ -0,0 +1,16 @@ +package de.gleex.pltcmd.game.application + +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration + +fun main() { + // This handles macOS support and helps on Windows. + if (StartupHelper.startNewJvmIfRequired()) { + return + } + Lwjgl3Application(Pltcmd(), Lwjgl3ApplicationConfiguration().apply { + setTitle("application-ktx") + setWindowedMode(640, 480) + setWindowIcon(*(arrayOf(128, 64, 32, 16).map { "libgdx$it.png" }.toTypedArray())) + }) +} \ No newline at end of file diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt new file mode 100644 index 00000000..709eb210 --- /dev/null +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt @@ -0,0 +1,35 @@ +package de.gleex.pltcmd.game.application + +import com.badlogic.gdx.graphics.Texture +import com.badlogic.gdx.graphics.Texture.TextureFilter.Linear +import com.badlogic.gdx.graphics.g2d.SpriteBatch +import ktx.app.KtxGame +import ktx.app.KtxScreen +import ktx.app.clearScreen +import ktx.assets.disposeSafely +import ktx.assets.toInternalFile +import ktx.graphics.use + +class Pltcmd : KtxGame() { + override fun create() { + addScreen(FirstScreen()) + setScreen() + } +} + +class FirstScreen : KtxScreen { + private val image = Texture("logo.png".toInternalFile(), true).apply { setFilter(Linear, Linear) } + private val batch = SpriteBatch() + + override fun render(delta: Float) { + clearScreen(red = 0.7f, green = 0.7f, blue = 0.7f) + batch.use { + it.draw(image, 100f, 160f) + } + } + + override fun dispose() { + image.disposeSafely() + batch.disposeSafely() + } +} diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/StartupHelper.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/StartupHelper.kt new file mode 100644 index 00000000..13955b01 --- /dev/null +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/StartupHelper.kt @@ -0,0 +1,148 @@ + +/* + * Copyright 2020 damios + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +//Note, the above license and copyright applies to this file only. +package de.gleex.pltcmd.game.application + +import org.lwjgl.system.macosx.LibC +import java.io.BufferedReader +import java.io.File +import java.io.InputStreamReader +import java.lang.management.ManagementFactory +import java.util.* + +/** + * Adds some utilities to ensure that the JVM was started with the + * `-XstartOnFirstThread` argument, which is required on macOS for LWJGL 3 + * to function. Also helps on Windows when users have names with characters from + * outside the Latin alphabet, a common cause of startup crashes. + * + * [Based on this java-gaming.org post by kappa](https://jvm-gaming.org/t/starting-jvm-on-mac-with-xstartonfirstthread-programmatically/57547) + * @author damios + */ +class StartupHelper private constructor() { + init { + throw UnsupportedOperationException() + } + + companion object { + private const val JVM_RESTARTED_ARG = "jvmIsRestarted" + /** + * Starts a new JVM if the application was started on macOS without the + * `-XstartOnFirstThread` argument. This also includes some code for + * Windows, for the case where the user's home directory includes certain + * non-Latin-alphabet characters (without this code, most LWJGL3 apps fail + * immediately for those users). Returns whether a new JVM was started and + * thus no code should be executed. + * + * **Usage:** + * + * ``` + * fun main() { + * if (StartupHelper.startNewJvmIfRequired(true)) return // This handles macOS support and helps on Windows. + * // after this is the actual main method code + * } + * ``` + * + * @param redirectOutput + * whether the output of the new JVM should be rerouted to the + * old JVM, so it can be accessed in the same place; keeps the + * old JVM running if enabled + * @return whether a new JVM was started and thus no code should be executed + * in this one + */ + @JvmOverloads + fun startNewJvmIfRequired(redirectOutput: Boolean = true): Boolean { + val osName = System.getProperty("os.name").lowercase(Locale.getDefault()) + if (!osName.contains("mac")) { + if (osName.contains("windows")) { +// Here, we are trying to work around an issue with how LWJGL3 loads its extracted .dll files. +// By default, LWJGL3 extracts to the directory specified by "java.io.tmpdir", which is usually the user's home. +// If the user's name has non-ASCII (or some non-alphanumeric) characters in it, that would fail. +// By extracting to the relevant "ProgramData" folder, which is usually "C:\ProgramData", we avoid this. + System.setProperty("java.io.tmpdir", System.getenv("ProgramData") + "/libGDX-temp") + } + return false + } + val pid = LibC.getpid() + + // check whether -XstartOnFirstThread is enabled + if ("1" == System.getenv("JAVA_STARTED_ON_FIRST_THREAD_$pid")) { + return false + } + + // check whether the JVM was previously restarted + // avoids looping, but most certainly leads to a crash + if ("true" == System.getProperty(JVM_RESTARTED_ARG)) { + System.err.println( + "There was a problem evaluating whether the JVM was started with the -XstartOnFirstThread argument." + ) + return false + } + + // Restart the JVM with -XstartOnFirstThread + val jvmArgs = ArrayList() + val separator = System.getProperty("file.separator") + // The following line is used assuming you target Java 8, the minimum for LWJGL3. + val javaExecPath = System.getProperty("java.home") + separator + "bin" + separator + "java" + // If targeting Java 9 or higher, you could use the following instead of the above line: + //String javaExecPath = ProcessHandle.current().info().command().orElseThrow(); + if (!File(javaExecPath).exists()) { + System.err.println( + "A Java installation could not be found. If you are distributing this app with a bundled JRE, be sure to set the -XstartOnFirstThread argument manually!" + ) + return false + } + jvmArgs.add(javaExecPath) + jvmArgs.add("-XstartOnFirstThread") + jvmArgs.add("-D$JVM_RESTARTED_ARG=true") + jvmArgs.addAll(ManagementFactory.getRuntimeMXBean().inputArguments) + jvmArgs.add("-cp") + jvmArgs.add(System.getProperty("java.class.path")) + var mainClass = System.getenv("JAVA_MAIN_CLASS_$pid") + if (mainClass == null) { + val trace = Thread.currentThread().stackTrace + mainClass = if (trace.isNotEmpty()) { + trace[trace.size - 1].className + } else { + System.err.println("The main class could not be determined.") + return false + } + } + jvmArgs.add(mainClass) + try { + if (!redirectOutput) { + val processBuilder = ProcessBuilder(jvmArgs) + processBuilder.start() + } else { + val process = ProcessBuilder(jvmArgs) + .redirectErrorStream(true).start() + val processOutput = BufferedReader( + InputStreamReader(process.inputStream) + ) + var line: String? + while (processOutput.readLine().also { line = it } != null) { + println(line) + } + process.waitFor() + } + } catch (e: Exception) { + System.err.println("There was a problem restarting the JVM") + e.printStackTrace() + } + return true + } + } +} diff --git a/game/application-ktx/src/main/resources/libgdx128.png b/game/application-ktx/src/main/resources/libgdx128.png new file mode 100644 index 0000000000000000000000000000000000000000..788f542c3aadf54dbd321809619843391619acb8 GIT binary patch literal 9754 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 VC>n;7z4m+oa?;9D zpkPH?pvz2|F4v(bpc2o^z30DwzI*REIlzBnf01KJV$JgNkyTY2YNk2I^r*%XPfwYY zd8?xIginedy7<{s7LLa%H(M>vJgv6z-dFGU(OznFaF`+jl-l~~JP2&F7N(I5k728}vk}i6^+S@(eQwNPxIbwY1t^`}>l>6)r87Pi0{l zZ-bxBg(|Hb)wA8m&t!1(c?d84z3|I&_G*i{f*JY;C3Z^@S=q9KxoZLkmxIPvpMVyh z4U`;EaupKv5MVI6Bax`Gi1hCQvh?s4UA`E4d?I8n2l4EAQ0wgogd}u)kKu1WJyshT zrMb?tcu1tGrxa+F}xvJ5!vT=KA~djMG_D^OfM9~6n9$T^YQJ(?SWXlT))xF`kJPZVOV)1W4V za7h5Cq1~v1H#eb!QOBUN$OuDYEdmX9!7~B$H$6n^hfCPCI17c@TBJxEq$f-d%g~>a zRe3n80_l`yJI7JmYuuf=TlNaN$u0(6egU-F3`z7t&--B{JlY>4EVS~S&FzsIio?l2 zWmc>;NWLYAnDdh1j_#1873TMiwmdhx3NpJDnP7fYOZ z+a_3#zEk-&ew6!ZYg8Lw$Yngb)8Re1vHorSXzxz}1^{W+CsRVkIF3yFH-qoP_IY#iXx*x9JJaSB;Qz_a)D*>do&Dh}RTaGhHMRh=qhocI&pwlp7KtB{ z-({x3QEgk*W3Om))mM4jD@y2{#Rb&Lth>I-&-`b5t5i0M%f_wXaSQ&ClNt9_Md@qn ztnmjTc%l5n$f$lp%W3WxU$ldZ^5d~J1|%d&c(nB#>QA(ApNx!ZW0cBLlS=;PN=w|H z*YdK{a69}te?D5uing=$Jx8l*edldubboRZS(GZ0aU5CAGTQ%;g{0;bdT&QOr6wwf zXZ~2Fl2#{J=<~87l2+CF*^-<;S+;EF-hx~?{ulNx$i;`nOB&d~$Ab+uV?(tzdNL!0 zG7UP45Cj4cZZd(RjU_s2+8RSYt2B~P!(WTZd5+TbTH291kGk#4iM@ccuX@F)qs5DV z`c`2+rsa(Vxl7ruKH$5n`kPQg4ZWV9LrbEg$S9W+fNL$?s-)L{8B3i_GpY0CB+5sWt#Hxe>4K)L-|AYGq^J{SZNg$xbh1JaQlC420S|uJj<>$)L$A+=NdS{h2wSG%8bZr=d5x1Yl^9bMo#ZdR!&diHe!JfV;%0DiWM(dKkvDjr>FL`}X145$@6 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 literal 0 HcmV?d00001 diff --git a/game/application-ktx/src/main/resources/logo.png b/game/application-ktx/src/main/resources/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..788f542c3aadf54dbd321809619843391619acb8 GIT binary patch literal 9754 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 VC>n;7z4m+oa?;9Dengine ui-strings serialization + application-ktx From f6e171ce88ef686f12d1a1240e6144645ff622ac Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Fri, 15 Sep 2023 21:09:33 +0200 Subject: [PATCH 05/37] added missing platform natives --- game/application-ktx/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/game/application-ktx/pom.xml b/game/application-ktx/pom.xml index 1470b77b..53eb45da 100644 --- a/game/application-ktx/pom.xml +++ b/game/application-ktx/pom.xml @@ -30,6 +30,12 @@ gdx-backend-lwjgl3 ${gdx.version} + + com.badlogicgames.gdx + gdx-platform + ${gdx.version} + natives-desktop + io.github.libktx ktx-app From 22b65b6983df6358c8dff7e2a01689cae15dae33 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Fri, 15 Sep 2023 21:19:45 +0200 Subject: [PATCH 06/37] stole some more default files :P --- game/application-ktx/pom.xml | 9 + .../pltcmd/game/application/KtxLauncher.kt | 4 +- .../src/main/resources/ui/font-list.fnt | 198 ++++++++ .../src/main/resources/ui/font-subtitle.fnt | 198 ++++++++ .../src/main/resources/ui/font-window.fnt | 198 ++++++++ .../src/main/resources/ui/font.fnt | 198 ++++++++ .../src/main/resources/ui/uiskin.atlas | 380 +++++++++++++++ .../src/main/resources/ui/uiskin.json | 438 ++++++++++++++++++ .../src/main/resources/ui/uiskin.png | Bin 0 -> 44082 bytes game/pom.xml | 9 +- 10 files changed, 1628 insertions(+), 4 deletions(-) create mode 100644 game/application-ktx/src/main/resources/ui/font-list.fnt create mode 100644 game/application-ktx/src/main/resources/ui/font-subtitle.fnt create mode 100644 game/application-ktx/src/main/resources/ui/font-window.fnt create mode 100644 game/application-ktx/src/main/resources/ui/font.fnt create mode 100644 game/application-ktx/src/main/resources/ui/uiskin.atlas create mode 100644 game/application-ktx/src/main/resources/ui/uiskin.json create mode 100644 game/application-ktx/src/main/resources/ui/uiskin.png diff --git a/game/application-ktx/pom.xml b/game/application-ktx/pom.xml index 53eb45da..f7e3dacb 100644 --- a/game/application-ktx/pom.xml +++ b/game/application-ktx/pom.xml @@ -20,6 +20,13 @@ + + + de.gleex.pltcmd.game + graphics + + + com.badlogicgames.gdx gdx @@ -36,6 +43,8 @@ ${gdx.version} natives-desktop + + io.github.libktx ktx-app diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/KtxLauncher.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/KtxLauncher.kt index c5833a23..a8159dd0 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/KtxLauncher.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/KtxLauncher.kt @@ -9,8 +9,8 @@ fun main() { return } Lwjgl3Application(Pltcmd(), Lwjgl3ApplicationConfiguration().apply { - setTitle("application-ktx") - setWindowedMode(640, 480) + setTitle("pltcmd") + setWindowedMode(1800, 990) setWindowIcon(*(arrayOf(128, 64, 32, 16).map { "libgdx$it.png" }.toTypedArray())) }) } \ No newline at end of file diff --git a/game/application-ktx/src/main/resources/ui/font-list.fnt b/game/application-ktx/src/main/resources/ui/font-list.fnt new file mode 100644 index 00000000..5fd54da3 --- /dev/null +++ b/game/application-ktx/src/main/resources/ui/font-list.fnt @@ -0,0 +1,198 @@ +info face="font-list" size=12 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=1,1,1,1 spacing=0,0 +common lineHeight=15 base=11 scaleW=505 scaleH=30 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="font-list.png" +chars count=193 +char id=0 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=11 xadvance=3 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=33 x=391 y=14 width=2 height=7 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=34 x=248 y=23 width=3 height=3 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=35 x=466 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=36 x=9 y=2 width=5 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=37 x=490 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=38 x=450 y=14 width=7 height=7 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=39 x=267 y=23 width=2 height=3 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=40 x=126 y=2 width=3 height=9 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=41 x=131 y=2 width=2 height=9 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=42 x=46 y=23 width=4 height=5 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=43 x=73 y=23 width=6 height=5 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=44 x=263 y=23 width=2 height=3 xoffset=-1 yoffset=9 xadvance=3 page=0 chnl=0 +char id=45 x=306 y=23 width=4 height=1 xoffset=-1 yoffset=8 xadvance=5 page=0 chnl=0 +char id=46 x=296 y=23 width=2 height=1 xoffset=-1 yoffset=10 xadvance=3 page=0 chnl=0 +char id=47 x=354 y=2 width=4 height=8 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=48 x=383 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=49 x=317 y=14 width=3 height=7 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=50 x=322 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=51 x=329 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=52 x=336 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=53 x=344 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=54 x=352 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=55 x=360 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=56 x=367 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=57 x=375 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=58 x=201 y=23 width=2 height=4 xoffset=-1 yoffset=7 xadvance=3 page=0 chnl=0 +char id=59 x=118 y=23 width=2 height=5 xoffset=-1 yoffset=7 xadvance=3 page=0 chnl=0 +char id=60 x=59 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=61 x=271 y=23 width=5 height=3 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=62 x=52 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=63 x=395 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=64 x=161 y=2 width=10 height=9 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=65 x=443 y=2 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=66 x=494 y=2 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=67 x=0 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=68 x=8 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=69 x=16 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=70 x=24 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=71 x=31 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=72 x=54 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=73 x=502 y=2 width=2 height=7 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=74 x=332 y=2 width=3 height=8 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=75 x=69 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=76 x=77 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=77 x=84 y=14 width=8 height=7 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=78 x=94 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=79 x=102 y=14 width=7 height=7 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=80 x=111 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=81 x=117 y=2 width=7 height=9 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=82 x=126 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=83 x=134 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=84 x=141 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=85 x=174 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=86 x=199 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=87 x=207 y=14 width=9 height=7 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=88 x=218 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=89 x=226 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=90 x=234 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=91 x=135 y=2 width=3 height=9 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=92 x=367 y=2 width=4 height=8 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=93 x=140 y=2 width=3 height=9 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=94 x=187 y=23 width=5 height=4 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=95 x=285 y=23 width=5 height=1 xoffset=0 yoffset=12 xadvance=7 page=0 chnl=0 +char id=96 x=258 y=23 width=3 height=3 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=97 x=88 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=98 x=241 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=99 x=95 y=23 width=4 height=5 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=100 x=248 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=101 x=101 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=102 x=255 y=14 width=4 height=7 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=103 x=261 y=14 width=5 height=7 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=104 x=268 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=105 x=275 y=14 width=2 height=7 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=106 x=4 y=2 width=3 height=10 xoffset=-2 yoffset=4 xadvance=3 page=0 chnl=0 +char id=107 x=279 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=108 x=286 y=14 width=2 height=7 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=109 x=108 y=23 width=8 height=5 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=0 +char id=110 x=122 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=111 x=129 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=112 x=290 y=14 width=5 height=7 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=113 x=297 y=14 width=5 height=7 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=114 x=15 y=23 width=4 height=6 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=115 x=136 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=116 x=304 y=14 width=4 height=7 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=117 x=143 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=118 x=150 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=119 x=157 y=23 width=8 height=5 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=0 +char id=120 x=167 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=121 x=310 y=14 width=5 height=7 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=122 x=174 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=123 x=145 y=2 width=4 height=9 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=124 x=157 y=2 width=2 height=9 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=125 x=151 y=2 width=4 height=9 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=126 x=278 y=23 width=5 height=2 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=11 xadvance=3 page=0 chnl=0 +char id=161 x=195 y=14 width=2 height=7 xoffset=-1 yoffset=6 xadvance=3 page=0 chnl=0 +char id=162 x=189 y=14 width=4 height=7 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=163 x=182 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=164 x=8 y=23 width=5 height=6 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=165 x=166 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=166 x=180 y=2 width=2 height=9 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=167 x=415 y=2 width=5 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=168 x=312 y=23 width=4 height=1 xoffset=-2 yoffset=4 xadvance=3 page=0 chnl=0 +char id=169 x=0 y=23 width=6 height=6 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=170 x=181 y=23 width=4 height=4 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=171 x=66 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=172 x=241 y=23 width=5 height=3 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=174 x=498 y=14 width=6 height=6 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=175 x=300 y=23 width=4 height=1 xoffset=-2 yoffset=4 xadvance=3 page=0 chnl=0 +char id=176 x=235 y=23 width=4 height=3 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=177 x=38 y=23 width=6 height=5 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=178 x=230 y=23 width=3 height=3 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=179 x=225 y=23 width=3 height=3 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=180 x=220 y=23 width=3 height=3 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=181 x=47 y=14 width=5 height=7 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=182 x=39 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=183 x=292 y=23 width=2 height=1 xoffset=-1 yoffset=8 xadvance=3 page=0 chnl=0 +char id=184 x=215 y=23 width=3 height=3 xoffset=-1 yoffset=10 xadvance=4 page=0 chnl=0 +char id=185 x=211 y=23 width=2 height=3 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=186 x=205 y=23 width=4 height=3 xoffset=-1 yoffset=5 xadvance=5 page=0 chnl=0 +char id=187 x=31 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=188 x=184 y=2 width=5 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=189 x=191 y=2 width=5 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=190 x=198 y=2 width=6 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=191 x=472 y=2 width=5 height=7 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=192 x=16 y=2 width=6 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=193 x=24 y=2 width=6 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=194 x=213 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=195 x=221 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=196 x=229 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=197 x=237 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=198 x=149 y=14 width=9 height=7 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=199 x=245 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=200 x=39 y=2 width=6 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=201 x=47 y=2 width=6 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=202 x=253 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=203 x=261 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=204 x=55 y=2 width=4 height=10 xoffset=-2 yoffset=1 xadvance=3 page=0 chnl=0 +char id=205 x=61 y=2 width=3 height=10 xoffset=-1 yoffset=1 xadvance=3 page=0 chnl=0 +char id=206 x=285 y=2 width=4 height=9 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 +char id=207 x=291 y=2 width=4 height=9 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 +char id=208 x=414 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=209 x=297 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=210 x=66 y=2 width=7 height=10 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=211 x=75 y=2 width=7 height=10 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=212 x=305 y=2 width=7 height=9 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=213 x=323 y=2 width=7 height=9 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=214 x=314 y=2 width=7 height=9 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=215 x=81 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=216 x=84 y=2 width=7 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=217 x=93 y=2 width=6 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=218 x=101 y=2 width=6 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=219 x=277 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=220 x=269 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=221 x=109 y=2 width=6 height=10 xoffset=-1 yoffset=1 xadvance=6 page=0 chnl=0 +char id=222 x=474 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=223 x=486 y=2 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=224 x=436 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=225 x=429 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=226 x=451 y=2 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=227 x=465 y=2 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=228 x=479 y=2 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=229 x=422 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=230 x=21 y=23 width=8 height=5 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=0 +char id=231 x=160 y=14 width=4 height=7 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=232 x=408 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=233 x=360 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=234 x=429 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=235 x=422 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=236 x=349 y=2 width=3 height=8 xoffset=-2 yoffset=3 xadvance=3 page=0 chnl=0 +char id=237 x=344 y=2 width=3 height=8 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=238 x=408 y=14 width=4 height=7 xoffset=-2 yoffset=4 xadvance=3 page=0 chnl=0 +char id=239 x=402 y=14 width=4 height=7 xoffset=-2 yoffset=4 xadvance=3 page=0 chnl=0 +char id=240 x=337 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=241 x=119 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=242 x=394 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=243 x=387 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=244 x=443 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=245 x=436 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=246 x=62 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=247 x=194 y=23 width=5 height=4 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=248 x=373 y=2 width=5 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=249 x=380 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=250 x=401 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=251 x=459 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=252 x=458 y=2 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=253 x=32 y=2 width=5 height=10 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=254 x=206 y=2 width=5 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=255 x=173 y=2 width=5 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=8226 x=253 y=23 width=3 height=3 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=0 +char id=8364 x=482 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +kernings count=0 diff --git a/game/application-ktx/src/main/resources/ui/font-subtitle.fnt b/game/application-ktx/src/main/resources/ui/font-subtitle.fnt new file mode 100644 index 00000000..4351cfc7 --- /dev/null +++ b/game/application-ktx/src/main/resources/ui/font-subtitle.fnt @@ -0,0 +1,198 @@ +info face="font-subtitle" size=12 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=1,1,1,1 spacing=0,0 +common lineHeight=18 base=13 scaleW=505 scaleH=36 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="font-subtitle.png" +chars count=193 +char id=0 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=13 xadvance=3 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=33 x=9 y=27 width=1 height=8 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=34 x=351 y=27 width=4 height=3 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=35 x=46 y=27 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=36 x=7 y=2 width=6 height=12 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=37 x=117 y=16 width=7 height=9 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=38 x=28 y=27 width=8 height=8 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=39 x=370 y=27 width=2 height=3 xoffset=-1 yoffset=5 xadvance=2 page=0 chnl=0 +char id=40 x=39 y=2 width=3 height=11 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=41 x=44 y=2 width=3 height=11 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=42 x=270 y=27 width=5 height=5 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=43 x=164 y=27 width=7 height=6 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=44 x=379 y=27 width=2 height=3 xoffset=-1 yoffset=11 xadvance=2 page=0 chnl=0 +char id=45 x=410 y=27 width=5 height=1 xoffset=-1 yoffset=9 xadvance=6 page=0 chnl=0 +char id=46 x=436 y=27 width=2 height=1 xoffset=-1 yoffset=12 xadvance=2 page=0 chnl=0 +char id=47 x=341 y=2 width=5 height=10 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=48 x=0 y=27 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=49 x=441 y=16 width=4 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=50 x=447 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=51 x=455 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=52 x=463 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=53 x=472 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=54 x=480 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=55 x=55 y=16 width=5 height=9 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=56 x=489 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=57 x=498 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=58 x=277 y=27 width=2 height=5 xoffset=-1 yoffset=8 xadvance=2 page=0 chnl=0 +char id=59 x=112 y=27 width=2 height=7 xoffset=-1 yoffset=8 xadvance=3 page=0 chnl=0 +char id=60 x=148 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=61 x=362 y=27 width=6 height=3 xoffset=-1 yoffset=9 xadvance=7 page=0 chnl=0 +char id=62 x=139 y=27 width=7 height=6 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=63 x=12 y=27 width=5 height=8 xoffset=-1 yoffset=5 xadvance=5 page=0 chnl=0 +char id=64 x=348 y=2 width=12 height=10 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=0 +char id=65 x=145 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=66 x=154 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=67 x=162 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=68 x=171 y=16 width=7 height=8 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=69 x=180 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=70 x=188 y=16 width=5 height=8 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=0 +char id=71 x=212 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=72 x=228 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=73 x=236 y=16 width=1 height=8 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=74 x=379 y=2 width=3 height=9 xoffset=-1 yoffset=5 xadvance=3 page=0 chnl=0 +char id=75 x=249 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=76 x=257 y=16 width=5 height=8 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=0 +char id=77 x=264 y=16 width=8 height=8 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=0 +char id=78 x=274 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=79 x=282 y=16 width=8 height=8 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=80 x=292 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=81 x=323 y=2 width=8 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=82 x=300 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=83 x=308 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=84 x=316 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=85 x=325 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=86 x=333 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=87 x=342 y=16 width=10 height=8 xoffset=-1 yoffset=5 xadvance=10 page=0 chnl=0 +char id=88 x=354 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=89 x=363 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=90 x=372 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=91 x=49 y=2 width=3 height=11 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=0 +char id=92 x=102 y=16 width=5 height=9 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=93 x=54 y=2 width=3 height=11 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=94 x=310 y=27 width=6 height=4 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=95 x=417 y=27 width=6 height=1 xoffset=0 yoffset=14 xadvance=8 page=0 chnl=0 +char id=96 x=388 y=27 width=3 height=2 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=97 x=124 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=98 x=384 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=99 x=132 y=27 width=5 height=6 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=100 x=392 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=101 x=156 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=102 x=400 y=2 width=4 height=9 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=103 x=414 y=2 width=6 height=9 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=104 x=453 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=105 x=416 y=16 width=2 height=8 xoffset=-1 yoffset=5 xadvance=2 page=0 chnl=0 +char id=106 x=34 y=2 width=3 height=11 xoffset=-2 yoffset=5 xadvance=2 page=0 chnl=0 +char id=107 x=494 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=108 x=502 y=2 width=1 height=9 xoffset=0 yoffset=4 xadvance=2 page=0 chnl=0 +char id=109 x=185 y=27 width=10 height=6 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=110 x=197 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=111 x=205 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=112 x=31 y=16 width=6 height=9 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=113 x=39 y=16 width=6 height=9 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=114 x=106 y=27 width=4 height=7 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=0 +char id=115 x=213 y=27 width=5 height=6 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=116 x=434 y=16 width=5 height=8 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=117 x=220 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=118 x=228 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=119 x=236 y=27 width=9 height=6 xoffset=-1 yoffset=7 xadvance=9 page=0 chnl=0 +char id=120 x=247 y=27 width=5 height=6 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=121 x=47 y=16 width=6 height=9 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=122 x=254 y=27 width=5 height=6 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=123 x=59 y=2 width=4 height=11 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=124 x=4 y=2 width=1 height=12 xoffset=0 yoffset=4 xadvance=2 page=0 chnl=0 +char id=125 x=65 y=2 width=4 height=11 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=126 x=393 y=27 width=6 height=2 xoffset=-1 yoffset=9 xadvance=7 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=13 xadvance=3 page=0 chnl=0 +char id=161 x=126 y=16 width=2 height=9 xoffset=-1 yoffset=7 xadvance=2 page=0 chnl=0 +char id=162 x=130 y=16 width=5 height=9 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=0 +char id=163 x=221 y=16 width=5 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=164 x=89 y=27 width=6 height=7 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=165 x=203 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=166 x=15 y=2 width=1 height=12 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=0 +char id=167 x=362 y=2 width=6 height=10 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=168 x=425 y=27 width=3 height=1 xoffset=-1 yoffset=5 xadvance=3 page=0 chnl=0 +char id=169 x=80 y=27 width=7 height=7 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=170 x=298 y=27 width=4 height=4 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=171 x=290 y=27 width=6 height=4 xoffset=-1 yoffset=8 xadvance=6 page=0 chnl=0 +char id=172 x=338 y=27 width=6 height=3 xoffset=-1 yoffset=9 xadvance=7 page=0 chnl=0 +char id=174 x=97 y=27 width=7 height=7 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=175 x=430 y=27 width=4 height=1 xoffset=-2 yoffset=5 xadvance=3 page=0 chnl=0 +char id=176 x=304 y=27 width=4 height=4 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=177 x=281 y=27 width=7 height=5 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=178 x=383 y=27 width=3 height=3 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=179 x=346 y=27 width=3 height=3 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=180 x=401 y=27 width=3 height=2 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=181 x=78 y=16 width=5 height=9 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=182 x=19 y=27 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=183 x=406 y=27 width=2 height=1 xoffset=-1 yoffset=9 xadvance=2 page=0 chnl=0 +char id=184 x=357 y=27 width=3 height=3 xoffset=-1 yoffset=13 xadvance=3 page=0 chnl=0 +char id=185 x=374 y=27 width=3 height=3 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=186 x=332 y=27 width=4 height=4 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=187 x=324 y=27 width=6 height=4 xoffset=-1 yoffset=8 xadvance=6 page=0 chnl=0 +char id=188 x=79 y=2 width=6 height=11 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=189 x=87 y=2 width=6 height=11 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=190 x=95 y=2 width=7 height=11 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=191 x=8 y=16 width=5 height=9 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=192 x=104 y=2 width=7 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=193 x=113 y=2 width=7 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=194 x=122 y=2 width=7 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=195 x=131 y=2 width=7 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=196 x=140 y=2 width=7 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=197 x=370 y=2 width=7 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=198 x=404 y=16 width=10 height=8 xoffset=-1 yoffset=5 xadvance=11 page=0 chnl=0 +char id=199 x=149 y=2 width=7 height=11 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=200 x=158 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=0 +char id=201 x=166 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=0 +char id=202 x=174 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=0 +char id=203 x=182 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=0 +char id=204 x=190 y=2 width=4 height=11 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 +char id=205 x=196 y=2 width=3 height=11 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=206 x=201 y=2 width=5 height=11 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 +char id=207 x=208 y=2 width=4 height=11 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 +char id=208 x=239 y=16 width=8 height=8 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=209 x=214 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=210 x=222 y=2 width=8 height=11 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=211 x=232 y=2 width=8 height=11 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=212 x=242 y=2 width=8 height=11 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=213 x=252 y=2 width=8 height=11 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=214 x=262 y=2 width=8 height=11 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=215 x=116 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=216 x=313 y=2 width=8 height=11 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=217 x=305 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=218 x=297 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=219 x=289 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=220 x=281 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=221 x=272 y=2 width=7 height=11 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=222 x=38 y=27 width=6 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=223 x=85 y=16 width=7 height=9 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=224 x=94 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=225 x=137 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=226 x=469 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=227 x=380 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=228 x=388 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=229 x=406 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=230 x=173 y=27 width=10 height=6 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=231 x=422 y=2 width=5 height=9 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=232 x=429 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=233 x=437 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=234 x=445 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=235 x=396 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=236 x=477 y=2 width=3 height=9 xoffset=-2 yoffset=4 xadvance=2 page=0 chnl=0 +char id=237 x=482 y=2 width=4 height=9 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=238 x=488 y=2 width=4 height=9 xoffset=-2 yoffset=4 xadvance=2 page=0 chnl=0 +char id=239 x=420 y=16 width=4 height=8 xoffset=-2 yoffset=5 xadvance=2 page=0 chnl=0 +char id=240 x=0 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=241 x=426 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=242 x=15 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=243 x=23 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=244 x=109 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=245 x=63 y=27 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=246 x=55 y=27 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=247 x=261 y=27 width=7 height=5 xoffset=-1 yoffset=8 xadvance=7 page=0 chnl=0 +char id=248 x=333 y=2 width=6 height=10 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=249 x=70 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=250 x=62 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=251 x=461 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=252 x=195 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=253 x=26 y=2 width=6 height=12 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=254 x=18 y=2 width=6 height=12 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=255 x=71 y=2 width=6 height=11 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=8226 x=318 y=27 width=4 height=4 xoffset=0 yoffset=8 xadvance=6 page=0 chnl=0 +char id=8364 x=71 y=27 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +kernings count=0 diff --git a/game/application-ktx/src/main/resources/ui/font-window.fnt b/game/application-ktx/src/main/resources/ui/font-window.fnt new file mode 100644 index 00000000..763811f4 --- /dev/null +++ b/game/application-ktx/src/main/resources/ui/font-window.fnt @@ -0,0 +1,198 @@ +info face="font-window" size=12 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=1,1,1,1 spacing=0,0 +common lineHeight=27 base=20 scaleW=506 scaleH=62 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="font-window.png" +chars count=193 +char id=0 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=20 xadvance=4 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=33 x=276 y=38 width=2 height=12 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=34 x=293 y=52 width=5 height=4 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=35 x=370 y=38 width=10 height=12 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=36 x=175 y=2 width=8 height=16 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=37 x=62 y=22 width=10 height=14 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=0 +char id=38 x=343 y=38 width=13 height=12 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=0 +char id=39 x=306 y=52 width=2 height=4 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=40 x=392 y=2 width=4 height=15 xoffset=0 yoffset=7 xadvance=5 page=0 chnl=0 +char id=41 x=398 y=2 width=4 height=15 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=42 x=172 y=52 width=7 height=8 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=43 x=465 y=38 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=44 x=300 y=52 width=4 height=4 xoffset=-1 yoffset=18 xadvance=5 page=0 chnl=0 +char id=45 x=359 y=52 width=5 height=2 xoffset=0 yoffset=14 xadvance=7 page=0 chnl=0 +char id=46 x=330 y=52 width=2 height=3 xoffset=0 yoffset=17 xadvance=4 page=0 chnl=0 +char id=47 x=0 y=22 width=8 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=48 x=265 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=49 x=174 y=38 width=6 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=50 x=182 y=38 width=7 height=12 xoffset=0 yoffset=8 xadvance=9 page=0 chnl=0 +char id=51 x=191 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=52 x=201 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=53 x=212 y=38 width=9 height=12 xoffset=-1 yoffset=8 xadvance=10 page=0 chnl=0 +char id=54 x=223 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=55 x=234 y=38 width=7 height=12 xoffset=0 yoffset=8 xadvance=9 page=0 chnl=0 +char id=56 x=243 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=57 x=254 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=58 x=192 y=52 width=2 height=8 xoffset=0 yoffset=12 xadvance=4 page=0 chnl=0 +char id=59 x=444 y=38 width=4 height=10 xoffset=-1 yoffset=12 xadvance=4 page=0 chnl=0 +char id=60 x=0 y=52 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=61 x=204 y=52 width=8 height=6 xoffset=0 yoffset=12 xadvance=10 page=0 chnl=0 +char id=62 x=495 y=38 width=8 height=9 xoffset=1 yoffset=11 xadvance=11 page=0 chnl=0 +char id=63 x=280 y=38 width=7 height=12 xoffset=-1 yoffset=8 xadvance=8 page=0 chnl=0 +char id=64 x=157 y=2 width=16 height=16 xoffset=0 yoffset=8 xadvance=18 page=0 chnl=0 +char id=65 x=303 y=22 width=11 height=12 xoffset=-1 yoffset=8 xadvance=11 page=0 chnl=0 +char id=66 x=316 y=22 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=67 x=326 y=22 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=68 x=336 y=22 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=69 x=347 y=22 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=70 x=357 y=22 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=71 x=367 y=22 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=72 x=378 y=22 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=73 x=389 y=22 width=2 height=12 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=74 x=122 y=22 width=4 height=13 xoffset=-1 yoffset=8 xadvance=5 page=0 chnl=0 +char id=75 x=393 y=22 width=9 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=76 x=404 y=22 width=7 height=12 xoffset=0 yoffset=8 xadvance=9 page=0 chnl=0 +char id=77 x=413 y=22 width=13 height=12 xoffset=0 yoffset=8 xadvance=15 page=0 chnl=0 +char id=78 x=440 y=22 width=10 height=12 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=79 x=462 y=22 width=10 height=12 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=80 x=478 y=22 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=81 x=380 y=2 width=10 height=15 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=82 x=0 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=83 x=11 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=84 x=21 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=85 x=32 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=86 x=43 y=38 width=11 height=12 xoffset=-1 yoffset=8 xadvance=11 page=0 chnl=0 +char id=87 x=56 y=38 width=17 height=12 xoffset=-1 yoffset=8 xadvance=17 page=0 chnl=0 +char id=88 x=75 y=38 width=11 height=12 xoffset=-1 yoffset=8 xadvance=10 page=0 chnl=0 +char id=89 x=88 y=38 width=10 height=12 xoffset=-1 yoffset=8 xadvance=10 page=0 chnl=0 +char id=90 x=100 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=91 x=404 y=2 width=5 height=15 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=0 +char id=92 x=10 y=22 width=9 height=14 xoffset=-1 yoffset=7 xadvance=9 page=0 chnl=0 +char id=93 x=411 y=2 width=4 height=15 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=0 +char id=94 x=222 y=52 width=10 height=6 xoffset=-1 yoffset=8 xadvance=10 page=0 chnl=0 +char id=95 x=349 y=52 width=8 height=2 xoffset=1 yoffset=21 xadvance=12 page=0 chnl=0 +char id=96 x=279 y=52 width=6 height=5 xoffset=-2 yoffset=6 xadvance=5 page=0 chnl=0 +char id=97 x=32 y=52 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=98 x=110 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=99 x=42 y=52 width=7 height=9 xoffset=0 yoffset=11 xadvance=8 page=0 chnl=0 +char id=100 x=120 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=101 x=51 y=52 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=102 x=130 y=38 width=6 height=12 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=103 x=158 y=22 width=8 height=13 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=104 x=138 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=105 x=148 y=38 width=2 height=12 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=106 x=147 y=2 width=4 height=16 xoffset=-2 yoffset=8 xadvance=4 page=0 chnl=0 +char id=107 x=152 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=9 page=0 chnl=0 +char id=108 x=162 y=38 width=2 height=12 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=109 x=61 y=52 width=12 height=9 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=0 +char id=110 x=75 y=52 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=111 x=85 y=52 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=112 x=215 y=22 width=8 height=13 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=113 x=225 y=22 width=8 height=13 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=114 x=436 y=38 width=6 height=10 xoffset=0 yoffset=10 xadvance=7 page=0 chnl=0 +char id=115 x=95 y=52 width=7 height=9 xoffset=0 yoffset=11 xadvance=9 page=0 chnl=0 +char id=116 x=166 y=38 width=6 height=12 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=117 x=104 y=52 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=118 x=114 y=52 width=9 height=9 xoffset=-1 yoffset=11 xadvance=9 page=0 chnl=0 +char id=119 x=125 y=52 width=14 height=9 xoffset=-1 yoffset=11 xadvance=14 page=0 chnl=0 +char id=120 x=141 y=52 width=9 height=9 xoffset=-1 yoffset=11 xadvance=9 page=0 chnl=0 +char id=121 x=235 y=22 width=9 height=13 xoffset=-1 yoffset=11 xadvance=9 page=0 chnl=0 +char id=122 x=152 y=52 width=7 height=9 xoffset=0 yoffset=11 xadvance=9 page=0 chnl=0 +char id=123 x=417 y=2 width=6 height=15 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=124 x=153 y=2 width=2 height=16 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=125 x=425 y=2 width=6 height=15 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=126 x=320 y=52 width=8 height=3 xoffset=0 yoffset=14 xadvance=10 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=20 xadvance=4 page=0 chnl=0 +char id=161 x=474 y=22 width=2 height=12 xoffset=0 yoffset=11 xadvance=4 page=0 chnl=0 +char id=162 x=403 y=38 width=7 height=11 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=0 +char id=163 x=452 y=22 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=164 x=21 y=52 width=9 height=9 xoffset=-1 yoffset=11 xadvance=9 page=0 chnl=0 +char id=165 x=428 y=22 width=10 height=12 xoffset=-1 yoffset=8 xadvance=10 page=0 chnl=0 +char id=166 x=185 y=2 width=2 height=16 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=167 x=433 y=2 width=8 height=15 xoffset=0 yoffset=9 xadvance=10 page=0 chnl=0 +char id=168 x=341 y=52 width=6 height=2 xoffset=-1 yoffset=8 xadvance=5 page=0 chnl=0 +char id=169 x=424 y=38 width=10 height=10 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=0 +char id=170 x=250 y=52 width=6 height=5 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=171 x=161 y=52 width=9 height=8 xoffset=0 yoffset=12 xadvance=11 page=0 chnl=0 +char id=172 x=240 y=52 width=8 height=5 xoffset=0 yoffset=14 xadvance=10 page=0 chnl=0 +char id=174 x=412 y=38 width=10 height=10 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=0 +char id=175 x=334 y=52 width=5 height=2 xoffset=-1 yoffset=8 xadvance=5 page=0 chnl=0 +char id=176 x=196 y=52 width=6 height=6 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=177 x=485 y=38 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=178 x=265 y=52 width=4 height=5 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=0 +char id=179 x=234 y=52 width=4 height=5 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=0 +char id=180 x=271 y=52 width=6 height=5 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=181 x=266 y=22 width=8 height=13 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=182 x=321 y=38 width=10 height=12 xoffset=-1 yoffset=8 xadvance=11 page=0 chnl=0 +char id=183 x=316 y=52 width=2 height=3 xoffset=0 yoffset=14 xadvance=4 page=0 chnl=0 +char id=184 x=310 y=52 width=4 height=4 xoffset=-1 yoffset=20 xadvance=5 page=0 chnl=0 +char id=185 x=287 y=52 width=4 height=5 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=186 x=214 y=52 width=6 height=6 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=187 x=181 y=52 width=9 height=8 xoffset=0 yoffset=12 xadvance=11 page=0 chnl=0 +char id=188 x=443 y=2 width=9 height=15 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=189 x=454 y=2 width=9 height=15 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=190 x=189 y=2 width=9 height=16 xoffset=-1 yoffset=6 xadvance=10 page=0 chnl=0 +char id=191 x=168 y=22 width=7 height=13 xoffset=0 yoffset=11 xadvance=8 page=0 chnl=0 +char id=192 x=27 y=2 width=11 height=17 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=193 x=40 y=2 width=11 height=17 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=194 x=222 y=2 width=11 height=16 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=195 x=235 y=2 width=11 height=16 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=196 x=248 y=2 width=12 height=16 xoffset=-2 yoffset=4 xadvance=10 page=0 chnl=0 +char id=197 x=465 y=2 width=12 height=15 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=0 +char id=198 x=489 y=22 width=15 height=12 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=199 x=262 y=2 width=8 height=16 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=200 x=53 y=2 width=8 height=17 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0 +char id=201 x=63 y=2 width=8 height=17 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0 +char id=202 x=272 y=2 width=8 height=16 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=203 x=282 y=2 width=8 height=16 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=204 x=73 y=2 width=6 height=17 xoffset=-2 yoffset=3 xadvance=4 page=0 chnl=0 +char id=205 x=81 y=2 width=6 height=17 xoffset=-2 yoffset=3 xadvance=4 page=0 chnl=0 +char id=206 x=292 y=2 width=8 height=16 xoffset=-3 yoffset=4 xadvance=4 page=0 chnl=0 +char id=207 x=302 y=2 width=6 height=16 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=208 x=358 y=38 width=10 height=12 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=209 x=310 y=2 width=10 height=16 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=210 x=89 y=2 width=10 height=17 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 +char id=211 x=101 y=2 width=10 height=17 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 +char id=212 x=322 y=2 width=10 height=16 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=213 x=334 y=2 width=10 height=16 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=214 x=346 y=2 width=10 height=16 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=215 x=10 y=52 width=9 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=216 x=4 y=2 width=10 height=18 xoffset=0 yoffset=5 xadvance=12 page=0 chnl=0 +char id=217 x=113 y=2 width=9 height=17 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=0 +char id=218 x=124 y=2 width=9 height=17 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=0 +char id=219 x=358 y=2 width=9 height=16 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=220 x=369 y=2 width=9 height=16 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=221 x=135 y=2 width=10 height=17 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=222 x=289 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=223 x=300 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=224 x=74 y=22 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=225 x=84 y=22 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=226 x=185 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=227 x=333 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=228 x=256 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=229 x=32 y=22 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=230 x=450 y=38 width=13 height=9 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=0 +char id=231 x=276 y=22 width=7 height=13 xoffset=0 yoffset=11 xadvance=8 page=0 chnl=0 +char id=232 x=94 y=22 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=233 x=112 y=22 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=234 x=128 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=235 x=138 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=236 x=104 y=22 width=6 height=14 xoffset=-3 yoffset=6 xadvance=4 page=0 chnl=0 +char id=237 x=499 y=2 width=6 height=14 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=0 +char id=238 x=177 y=22 width=6 height=13 xoffset=-2 yoffset=7 xadvance=4 page=0 chnl=0 +char id=239 x=285 y=22 width=6 height=13 xoffset=-2 yoffset=7 xadvance=4 page=0 chnl=0 +char id=240 x=21 y=22 width=9 height=14 xoffset=0 yoffset=6 xadvance=11 page=0 chnl=0 +char id=241 x=382 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=242 x=489 y=2 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=243 x=479 y=2 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=244 x=148 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=245 x=311 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=246 x=246 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=247 x=475 y=38 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=248 x=205 y=22 width=8 height=13 xoffset=0 yoffset=9 xadvance=10 page=0 chnl=0 +char id=249 x=42 y=22 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=250 x=52 y=22 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=251 x=293 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=252 x=195 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=253 x=16 y=2 width=9 height=18 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=0 +char id=254 x=200 y=2 width=8 height=16 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=255 x=210 y=2 width=10 height=16 xoffset=-2 yoffset=8 xadvance=8 page=0 chnl=0 +char id=8226 x=258 y=52 width=5 height=5 xoffset=1 yoffset=13 xadvance=9 page=0 chnl=0 +char id=8364 x=392 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +kernings count=0 diff --git a/game/application-ktx/src/main/resources/ui/font.fnt b/game/application-ktx/src/main/resources/ui/font.fnt new file mode 100644 index 00000000..5fc73509 --- /dev/null +++ b/game/application-ktx/src/main/resources/ui/font.fnt @@ -0,0 +1,198 @@ +info face="font" size=12 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=1,1,1,1 spacing=0,0 +common lineHeight=21 base=15 scaleW=504 scaleH=44 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="font.png" +chars count=193 +char id=0 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=15 xadvance=3 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=33 x=393 y=18 width=1 height=10 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=34 x=458 y=30 width=3 height=3 xoffset=0 yoffset=5 xadvance=5 page=0 chnl=0 +char id=35 x=101 y=30 width=8 height=9 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=36 x=142 y=2 width=6 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=37 x=496 y=18 width=7 height=10 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=38 x=0 y=30 width=9 height=10 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=0 +char id=39 x=463 y=30 width=1 height=3 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=40 x=272 y=2 width=3 height=12 xoffset=0 yoffset=5 xadvance=4 page=0 chnl=0 +char id=41 x=277 y=2 width=3 height=12 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=42 x=369 y=30 width=6 height=5 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=43 x=315 y=30 width=7 height=7 xoffset=-1 yoffset=8 xadvance=7 page=0 chnl=0 +char id=44 x=435 y=30 width=3 height=3 xoffset=-1 yoffset=14 xadvance=3 page=0 chnl=0 +char id=45 x=497 y=30 width=5 height=1 xoffset=0 yoffset=11 xadvance=6 page=0 chnl=0 +char id=46 x=466 y=30 width=1 height=2 xoffset=0 yoffset=13 xadvance=3 page=0 chnl=0 +char id=47 x=446 y=2 width=6 height=11 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=48 x=120 y=30 width=7 height=9 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=0 +char id=49 x=41 y=30 width=4 height=9 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=0 +char id=50 x=47 y=30 width=7 height=9 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=51 x=56 y=30 width=6 height=9 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=52 x=64 y=30 width=8 height=9 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=53 x=74 y=30 width=7 height=9 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=54 x=83 y=30 width=7 height=9 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=0 +char id=55 x=385 y=18 width=6 height=10 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=56 x=92 y=30 width=7 height=9 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=57 x=111 y=30 width=7 height=9 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=0 +char id=58 x=333 y=30 width=1 height=6 xoffset=0 yoffset=9 xadvance=3 page=0 chnl=0 +char id=59 x=164 y=30 width=3 height=8 xoffset=-1 yoffset=9 xadvance=3 page=0 chnl=0 +char id=60 x=214 y=30 width=6 height=7 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=61 x=449 y=30 width=7 height=3 xoffset=-1 yoffset=10 xadvance=8 page=0 chnl=0 +char id=62 x=206 y=30 width=6 height=7 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=63 x=396 y=18 width=6 height=10 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=64 x=128 y=2 width=12 height=13 xoffset=0 yoffset=5 xadvance=14 page=0 chnl=0 +char id=65 x=0 y=18 width=8 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=66 x=18 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=67 x=27 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=68 x=67 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=69 x=76 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=70 x=84 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=71 x=92 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=72 x=101 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=73 x=128 y=18 width=1 height=10 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=74 x=379 y=2 width=3 height=11 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=75 x=131 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=76 x=140 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=77 x=148 y=18 width=9 height=10 xoffset=0 yoffset=5 xadvance=11 page=0 chnl=0 +char id=78 x=159 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=79 x=168 y=18 width=8 height=10 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=0 +char id=80 x=178 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=81 x=262 y=2 width=8 height=12 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=0 +char id=82 x=195 y=18 width=8 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=83 x=205 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=84 x=213 y=18 width=7 height=10 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=85 x=222 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=86 x=231 y=18 width=8 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=87 x=241 y=18 width=12 height=10 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=0 +char id=88 x=260 y=18 width=8 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=89 x=270 y=18 width=9 height=10 xoffset=-2 yoffset=5 xadvance=7 page=0 chnl=0 +char id=90 x=281 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=91 x=282 y=2 width=3 height=12 xoffset=0 yoffset=5 xadvance=4 page=0 chnl=0 +char id=92 x=462 y=2 width=6 height=11 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=93 x=287 y=2 width=3 height=12 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=94 x=360 y=30 width=7 height=5 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=95 x=481 y=30 width=7 height=1 xoffset=0 yoffset=16 xadvance=9 page=0 chnl=0 +char id=96 x=423 y=30 width=4 height=3 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=97 x=198 y=30 width=6 height=7 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=98 x=296 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=99 x=222 y=30 width=5 height=7 xoffset=0 yoffset=8 xadvance=6 page=0 chnl=0 +char id=100 x=304 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=101 x=229 y=30 width=6 height=7 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=102 x=312 y=18 width=5 height=10 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=103 x=319 y=18 width=7 height=10 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=104 x=328 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=105 x=336 y=18 width=1 height=10 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=106 x=120 y=2 width=3 height=13 xoffset=-2 yoffset=5 xadvance=3 page=0 chnl=0 +char id=107 x=349 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=108 x=357 y=18 width=1 height=10 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=109 x=237 y=30 width=9 height=7 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=110 x=248 y=30 width=6 height=7 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=111 x=256 y=30 width=6 height=7 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=112 x=360 y=18 width=6 height=10 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=113 x=368 y=18 width=6 height=10 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=114 x=158 y=30 width=4 height=8 xoffset=0 yoffset=7 xadvance=5 page=0 chnl=0 +char id=115 x=264 y=30 width=5 height=7 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=116 x=34 y=30 width=5 height=9 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=117 x=271 y=30 width=5 height=7 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=118 x=278 y=30 width=7 height=7 xoffset=-1 yoffset=8 xadvance=7 page=0 chnl=0 +char id=119 x=287 y=30 width=11 height=7 xoffset=-1 yoffset=8 xadvance=11 page=0 chnl=0 +char id=120 x=300 y=30 width=6 height=7 xoffset=-1 yoffset=8 xadvance=6 page=0 chnl=0 +char id=121 x=376 y=18 width=7 height=10 xoffset=-1 yoffset=8 xadvance=7 page=0 chnl=0 +char id=122 x=308 y=30 width=5 height=7 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=123 x=292 y=2 width=5 height=12 xoffset=-1 yoffset=5 xadvance=5 page=0 chnl=0 +char id=124 x=125 y=2 width=1 height=13 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=125 x=299 y=2 width=5 height=12 xoffset=-1 yoffset=5 xadvance=5 page=0 chnl=0 +char id=126 x=469 y=30 width=7 height=2 xoffset=-1 yoffset=10 xadvance=8 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=15 xadvance=3 page=0 chnl=0 +char id=161 x=31 y=30 width=1 height=9 xoffset=0 yoffset=8 xadvance=3 page=0 chnl=0 +char id=162 x=289 y=18 width=5 height=10 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=163 x=22 y=30 width=7 height=9 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=164 x=189 y=30 width=7 height=7 xoffset=-1 yoffset=8 xadvance=7 page=0 chnl=0 +char id=165 x=11 y=30 width=9 height=9 xoffset=-2 yoffset=6 xadvance=7 page=0 chnl=0 +char id=166 x=150 y=2 width=1 height=13 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=167 x=486 y=2 width=5 height=11 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=0 +char id=168 x=0 y=42 width=4 height=1 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=169 x=148 y=30 width=8 height=8 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=0 +char id=170 x=416 y=30 width=5 height=4 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=0 +char id=171 x=352 y=30 width=6 height=5 xoffset=0 yoffset=9 xadvance=7 page=0 chnl=0 +char id=172 x=440 y=30 width=7 height=3 xoffset=-1 yoffset=10 xadvance=8 page=0 chnl=0 +char id=174 x=138 y=30 width=8 height=8 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=0 +char id=175 x=490 y=30 width=5 height=1 xoffset=-2 yoffset=6 xadvance=3 page=0 chnl=0 +char id=176 x=410 y=30 width=4 height=4 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=177 x=324 y=30 width=7 height=6 xoffset=-1 yoffset=8 xadvance=7 page=0 chnl=0 +char id=178 x=405 y=30 width=3 height=4 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=179 x=399 y=30 width=4 height=4 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=180 x=429 y=30 width=4 height=3 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=181 x=121 y=18 width=5 height=10 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=182 x=110 y=18 width=9 height=10 xoffset=-1 yoffset=5 xadvance=9 page=0 chnl=0 +char id=183 x=478 y=30 width=1 height=2 xoffset=0 yoffset=10 xadvance=3 page=0 chnl=0 +char id=184 x=394 y=30 width=3 height=4 xoffset=-1 yoffset=14 xadvance=4 page=0 chnl=0 +char id=185 x=389 y=30 width=3 height=4 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=186 x=383 y=30 width=4 height=4 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=0 +char id=187 x=344 y=30 width=6 height=5 xoffset=0 yoffset=9 xadvance=7 page=0 chnl=0 +char id=188 x=315 y=2 width=8 height=12 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=189 x=325 y=2 width=7 height=12 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=190 x=153 y=2 width=8 height=13 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=191 x=36 y=18 width=6 height=10 xoffset=-1 yoffset=8 xadvance=6 page=0 chnl=0 +char id=192 x=4 y=2 width=8 height=14 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=193 x=14 y=2 width=8 height=14 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=194 x=173 y=2 width=8 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=195 x=183 y=2 width=8 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=196 x=334 y=2 width=8 height=12 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=197 x=344 y=2 width=9 height=12 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=198 x=482 y=18 width=12 height=10 xoffset=-1 yoffset=5 xadvance=13 page=0 chnl=0 +char id=199 x=193 y=2 width=6 height=13 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=200 x=24 y=2 width=6 height=14 xoffset=0 yoffset=1 xadvance=8 page=0 chnl=0 +char id=201 x=32 y=2 width=6 height=14 xoffset=0 yoffset=1 xadvance=8 page=0 chnl=0 +char id=202 x=209 y=2 width=6 height=13 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=203 x=355 y=2 width=7 height=12 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=204 x=49 y=2 width=4 height=14 xoffset=-2 yoffset=1 xadvance=3 page=0 chnl=0 +char id=205 x=55 y=2 width=4 height=14 xoffset=-1 yoffset=1 xadvance=3 page=0 chnl=0 +char id=206 x=217 y=2 width=5 height=13 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 +char id=207 x=374 y=2 width=3 height=12 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=208 x=339 y=18 width=8 height=10 xoffset=-1 yoffset=5 xadvance=9 page=0 chnl=0 +char id=209 x=224 y=2 width=7 height=13 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=0 +char id=210 x=61 y=2 width=8 height=14 xoffset=0 yoffset=1 xadvance=10 page=0 chnl=0 +char id=211 x=71 y=2 width=8 height=14 xoffset=0 yoffset=1 xadvance=10 page=0 chnl=0 +char id=212 x=233 y=2 width=8 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=213 x=243 y=2 width=8 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=214 x=364 y=2 width=8 height=12 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0 +char id=215 x=181 y=30 width=6 height=7 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=216 x=81 y=2 width=8 height=14 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0 +char id=217 x=91 y=2 width=7 height=14 xoffset=0 yoffset=1 xadvance=9 page=0 chnl=0 +char id=218 x=100 y=2 width=7 height=14 xoffset=0 yoffset=1 xadvance=9 page=0 chnl=0 +char id=219 x=253 y=2 width=7 height=13 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=0 +char id=220 x=306 y=2 width=7 height=12 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=221 x=109 y=2 width=9 height=14 xoffset=-2 yoffset=1 xadvance=7 page=0 chnl=0 +char id=222 x=426 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=223 x=418 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=224 x=423 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=225 x=407 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=226 x=187 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=227 x=443 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=228 x=451 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=229 x=415 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=230 x=169 y=30 width=10 height=7 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=231 x=404 y=18 width=5 height=10 xoffset=0 yoffset=8 xadvance=6 page=0 chnl=0 +char id=232 x=454 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=233 x=470 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=234 x=474 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=235 x=10 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=236 x=499 y=2 width=4 height=11 xoffset=-2 yoffset=4 xadvance=3 page=0 chnl=0 +char id=237 x=493 y=2 width=4 height=11 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=238 x=44 y=18 width=5 height=10 xoffset=-2 yoffset=5 xadvance=3 page=0 chnl=0 +char id=239 x=255 y=18 width=3 height=10 xoffset=-1 yoffset=5 xadvance=3 page=0 chnl=0 +char id=240 x=478 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=241 x=466 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=242 x=438 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=243 x=399 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=244 x=435 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=245 x=59 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=246 x=51 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=247 x=336 y=30 width=6 height=5 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=0 +char id=248 x=384 y=2 width=6 height=11 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=249 x=392 y=2 width=5 height=11 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=250 x=431 y=2 width=5 height=11 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=251 x=411 y=18 width=5 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=252 x=459 y=18 width=5 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=253 x=40 y=2 width=7 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=254 x=201 y=2 width=6 height=13 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=255 x=163 y=2 width=8 height=13 xoffset=-2 yoffset=5 xadvance=7 page=0 chnl=0 +char id=8226 x=377 y=30 width=4 height=4 xoffset=1 yoffset=10 xadvance=8 page=0 chnl=0 +char id=8364 x=129 y=30 width=7 height=9 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +kernings count=0 diff --git a/game/application-ktx/src/main/resources/ui/uiskin.atlas b/game/application-ktx/src/main/resources/ui/uiskin.atlas new file mode 100644 index 00000000..0c6edf51 --- /dev/null +++ b/game/application-ktx/src/main/resources/ui/uiskin.atlas @@ -0,0 +1,380 @@ + +uiskin.png +size: 512,512 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +button-normal + rotate: false + xy: 2, 111 + size: 41, 42 + orig: 41, 42 + offset: 0, 0 + index: -1 +button-normal-over + rotate: false + xy: 102, 263 + size: 41, 42 + orig: 41, 42 + offset: 0, 0 + index: -1 +button-normal-pressed + rotate: false + xy: 2, 67 + size: 41, 42 + orig: 41, 42 + offset: 0, 0 + index: -1 +check + rotate: false + xy: 290, 306 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +check-on + rotate: false + xy: 316, 306 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +checkbox + rotate: false + xy: 482, 309 + size: 20, 21 + orig: 20, 21 + offset: 0, 0 + index: -1 +checkbox-over + rotate: false + xy: 438, 309 + size: 20, 21 + orig: 20, 21 + offset: 0, 0 + index: -1 +checkbox-selected + rotate: false + xy: 32, 18 + size: 20, 21 + orig: 20, 21 + offset: 0, 0 + index: -1 +checkbox-selected-over + rotate: false + xy: 460, 309 + size: 20, 21 + orig: 20, 21 + offset: 0, 0 + index: -1 +font + rotate: false + xy: 2, 402 + size: 504, 44 + orig: 504, 44 + offset: 0, 0 + index: -1 +font-list + rotate: false + xy: 2, 332 + size: 505, 30 + orig: 505, 30 + offset: 0, 0 + index: -1 +font-subtitle + rotate: false + xy: 2, 364 + size: 505, 36 + orig: 505, 36 + offset: 0, 0 + index: -1 +font-window + rotate: false + xy: 2, 448 + size: 506, 62 + orig: 506, 62 + offset: 0, 0 + index: -1 +knob-h + rotate: false + xy: 188, 268 + size: 24, 1 + orig: 24, 1 + offset: 0, 0 + index: -1 +knob-v + rotate: false + xy: 508, 422 + size: 1, 24 + orig: 1, 24 + offset: 0, 0 + index: -1 +line-h + rotate: false + xy: 102, 260 + size: 24, 1 + orig: 24, 1 + offset: 0, 0 + index: -1 +line-v + rotate: false + xy: 509, 396 + size: 1, 24 + orig: 1, 24 + offset: 0, 0 + index: -1 +list + rotate: false + xy: 188, 271 + size: 43, 34 + orig: 43, 34 + offset: 0, 0 + index: -1 +progress-bar + rotate: false + xy: 2, 307 + size: 252, 5 + orig: 252, 5 + offset: 0, 0 + index: -1 +progress-bar-knob + rotate: false + xy: 2, 314 + size: 252, 5 + orig: 252, 5 + offset: 0, 0 + index: -1 +progress-bar-square + rotate: false + xy: 256, 309 + size: 4, 4 + orig: 4, 4 + offset: 0, 0 + index: -1 +progress-bar-square-knob + rotate: false + xy: 504, 328 + size: 2, 2 + orig: 2, 2 + offset: 0, 0 + index: -1 +radio + rotate: false + xy: 366, 308 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +radio-over + rotate: false + xy: 390, 308 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +radio-selected + rotate: false + xy: 342, 308 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +radio-selected-over + rotate: false + xy: 414, 308 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +rect + rotate: false + xy: 32, 41 + size: 12, 24 + orig: 12, 24 + offset: 0, 0 + index: -1 +scrollbar + rotate: false + xy: 46, 150 + size: 17, 16 + orig: 17, 16 + offset: 0, 0 + index: -1 +select + rotate: false + xy: 262, 306 + size: 26, 24 + split: 4, 15, 0, 24 + orig: 26, 24 + offset: 0, 0 + index: -1 +select-box + rotate: false + xy: 145, 263 + size: 41, 42 + orig: 41, 42 + offset: 0, 0 + index: -1 +select-box-open + rotate: false + xy: 58, 214 + size: 41, 42 + orig: 41, 42 + offset: 0, 0 + index: -1 +selection + rotate: false + xy: 46, 168 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +slider + rotate: false + xy: 2, 321 + size: 258, 9 + orig: 258, 9 + offset: 0, 0 + index: -1 +slider-knob + rotate: false + xy: 46, 57 + size: 9, 9 + orig: 9, 9 + offset: 0, 0 + index: -1 +slider-knob-over + rotate: false + xy: 46, 46 + size: 9, 9 + orig: 9, 9 + offset: 0, 0 + index: -1 +spinner-down + rotate: false + xy: 45, 100 + size: 16, 14 + orig: 16, 14 + offset: 0, 0 + index: -1 +spinner-down-over + rotate: false + xy: 45, 68 + size: 16, 14 + orig: 16, 14 + offset: 0, 0 + index: -1 +spinner-down-pressed + rotate: false + xy: 45, 116 + size: 16, 14 + orig: 16, 14 + offset: 0, 0 + index: -1 +spinner-textfield + rotate: false + xy: 2, 7 + size: 28, 28 + orig: 28, 28 + offset: 0, 0 + index: -1 +spinner-textfield-selected + rotate: false + xy: 2, 37 + size: 28, 28 + orig: 28, 28 + offset: 0, 0 + index: -1 +spinner-up + rotate: false + xy: 32, 2 + size: 16, 14 + orig: 16, 14 + offset: 0, 0 + index: -1 +spinner-up-over + rotate: false + xy: 45, 84 + size: 16, 14 + orig: 16, 14 + offset: 0, 0 + index: -1 +spinner-up-pressed + rotate: false + xy: 50, 2 + size: 16, 14 + orig: 16, 14 + offset: 0, 0 + index: -1 +square + rotate: false + xy: 256, 315 + size: 4, 4 + orig: 4, 4 + offset: 0, 0 + index: -1 +textfield + rotate: false + xy: 2, 155 + size: 42, 47 + orig: 42, 47 + offset: 0, 0 + index: -1 +textfield-selected + rotate: false + xy: 58, 258 + size: 42, 47 + orig: 42, 47 + offset: 0, 0 + index: -1 +tree-minus + rotate: false + xy: 46, 186 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +tree-plus + rotate: false + xy: 45, 132 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +white + rotate: false + xy: 509, 393 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +dot + rotate: false + xy: 509, 393 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +window + rotate: false + xy: 2, 204 + size: 54, 101 + orig: 54, 101 + offset: 0, 0 + index: -1 +window-border + rotate: false + xy: 248, 279 + size: 5, 26 + split: 2, 2, 23, 2 + orig: 5, 26 + offset: 0, 0 + index: -1 +window-resize + rotate: false + xy: 233, 271 + size: 13, 34 + split: 2, 10, 23, 10 + orig: 13, 34 + offset: 0, 0 + index: -1 diff --git a/game/application-ktx/src/main/resources/ui/uiskin.json b/game/application-ktx/src/main/resources/ui/uiskin.json new file mode 100644 index 00000000..8658e763 --- /dev/null +++ b/game/application-ktx/src/main/resources/ui/uiskin.json @@ -0,0 +1,438 @@ +{ +com.badlogic.gdx.graphics.g2d.BitmapFont: { + default: { + file: font.fnt + } + font: { + file: font.fnt + } + list: { + file: font-list.fnt + } + subtitle: { + file: font-subtitle.fnt + } + window: { + file: font-window.fnt + } +} +com.badlogic.gdx.graphics.Color: { + black: { + r: 0 + g: 0 + b: 0 + a: 1 + } + disabled: { + r: 0.23137255 + g: 0.24705882 + b: 0.25882354 + a: 1 + } + highlight: { + r: 0.19215687 + g: 0.6627451 + b: 0.95686275 + a: 1 + } + message: { + r: 0.44313726 + g: 0.47843137 + b: 0.5372549 + a: 1 + } + split: { + r: 0.44313726 + g: 0.47843137 + b: 0.5372549 + a: 1 + } + white: { + r: 1 + g: 1 + b: 1 + a: 1 + } +} +com.badlogic.gdx.scenes.scene2d.ui.Skin$TintedDrawable: { + split: { + name: white + color: split + } + black: { + name: white + color: black + } + highlight: { + name: white + color: highlight + } +} +com.badlogic.gdx.scenes.scene2d.utils.TiledDrawable: { + progress-bar-knob-t: { + region: progress-bar-knob + minWidth: 0 + minHeight: 5 + } +} +com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle: { + default: { + up: button-normal + down: button-normal-pressed + over: button-normal-over + focused: button-normal-over + } + spinner-up: { + up: spinner-up + down: spinner-up-pressed + over: spinner-up-over + } + spinner-down: { + up: spinner-down + down: spinner-down-pressed + over: spinner-down-over + } +} +com.badlogic.gdx.scenes.scene2d.ui.CheckBox$CheckBoxStyle: { + default: { + checkboxOn: checkbox-selected + checkboxOff: checkbox + checkboxOnOver: checkbox-selected-over + checkboxOver: checkbox-over + font: font + } + radio: { + checkboxOn: radio-selected + checkboxOff: radio + checkboxOnOver: radio-selected-over + checkboxOver: radio-over + font: font + } +} +com.badlogic.gdx.scenes.scene2d.ui.ImageButton$ImageButtonStyle: { + default: { + up: button-normal + down: button-normal-pressed + over: button-normal-over + focused: button-normal-over + } +} +com.badlogic.gdx.scenes.scene2d.ui.ImageTextButton$ImageTextButtonStyle: { + default: { + font: font + up: button-normal + down: button-normal-pressed + over: button-normal-over + focused: button-normal-pressed + } +} +com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle: { + default: { + font: font + } + window: { + font: window + } + list: { + font: list + } + subtitle: { + font: subtitle + } +} +com.badlogic.gdx.scenes.scene2d.ui.List$ListStyle: { + default: { + font: list + fontColorSelected: white + fontColorUnselected: white + selection: selection + background: list + } + list-nobg: { + font: list + fontColorSelected: white + fontColorUnselected: white + selection: selection + } +} +com.badlogic.gdx.scenes.scene2d.ui.ProgressBar$ProgressBarStyle: { + default-horizontal: { + background: progress-bar-square + knobBefore: progress-bar-square-knob + } + default-vertical: { + background: progress-bar-square + knobBefore: progress-bar-square-knob + } + curved: { + background: progress-bar + knobBefore: progress-bar-knob-t + } +} +com.badlogic.gdx.scenes.scene2d.ui.ScrollPane$ScrollPaneStyle: { + default: { + hScrollKnob: scrollbar + vScrollKnob: scrollbar + } + list: { + background: list + hScrollKnob: scrollbar + vScrollKnob: scrollbar + } +} +com.badlogic.gdx.scenes.scene2d.ui.SelectBox$SelectBoxStyle: { + default: { + font: font + fontColor: white + background: select-box + scrollStyle: list + listStyle: list-nobg + backgroundOpen: select-box-open + } +} +com.badlogic.gdx.scenes.scene2d.ui.Slider$SliderStyle: { + default-horizontal: { + knobOver: slider-knob-over + knobDown: slider-knob-over + background: progress-bar-square + knob: slider-knob + } + default-vertical: { + knobOver: slider-knob-over + knobDown: slider-knob-over + background: progress-bar-square + knob: slider-knob + } + curved: { + knobOver: slider-knob-over + knobDown: slider-knob-over + background: slider + knob: slider-knob + } +} +com.badlogic.gdx.scenes.scene2d.ui.SplitPane$SplitPaneStyle: { + default-horizontal: { + handle: split + } + default-vertical: { + handle: split + } +} +com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle: { + default: { + font: font + up: button-normal + down: button-normal-pressed + over: button-normal-over + focused: button-normal-over + } +} +com.badlogic.gdx.scenes.scene2d.ui.TextField$TextFieldStyle: { + default: { + font: font + fontColor: white + disabledFontColor: disabled + background: textfield + focusedBackground: textfield-selected + cursor: white + selection: highlight + messageFont: font + messageFontColor: message + } + spinner: { + font: font + fontColor: white + disabledFontColor: disabled + background: spinner-textfield + focusedBackground: spinner-textfield-selected + cursor: white + selection: highlight + messageFont: font + messageFontColor: message + } +} +com.badlogic.gdx.scenes.scene2d.ui.TextTooltip$TextTooltipStyle: { + default: { + label: default + background: list + } +} +com.badlogic.gdx.scenes.scene2d.ui.Touchpad$TouchpadStyle: { + default: { + background: list + knob: slider-knob + } +} +com.badlogic.gdx.scenes.scene2d.ui.Window$WindowStyle: { + default: { + background: window + titleFont: window + } +}, + + com.badlogic.gdx.graphics.Color: { + white: { r: 1, g: 1, b: 1, a: 1 }, + gray: { r: 0.5, g: 0.5, b: 0.5, a: 1 }, + black: { r: 0, g: 0, b: 0, a: 1 }, + + up: { r: 0.1, g: 0.1, b: 0.1, a: 1 }, + over: { r: 0.3, g: 0.3, b: 0.3, a: 1 }, + down: { r: 0.3, g: 0, b: 0, a: 1 }, + checked: { r: 0.3, g: 0, b: 0, a: 1 }, + checkedOver: { r: 0.4, g: 0, b: 0, a: 1 }, + disabled: { r: 0.4, g: 0.4, b: 0.4, a: 1 }, + background: { r: 0.2, g: 0.2, b: 0.2, a: 1 }, + selection: { r: 0.3, g: 0, b: 0, a: 1 }, + semiTransparent: { r: 0, g: 0, b: 0, a: 0.6 }, + + font: white + fontOver: white + fontDown: gray + fontChecked: white + fontCheckedOver: white + fontDisabled: gray + }, + com.badlogic.gdx.scenes.scene2d.ui.Skin$TintedDrawable: { + buttonUp: { name: rect, color: up }, + buttonOver: { name: rect, color: over }, + buttonDown: { name: rect, color: down }, + buttonDisabled: { name: rect, color: disabled }, + buttonChecked: { name: rect, color: checked }, + buttonCheckedOver: { name: rect, color: checkedOver }, + checkBoxOn: { name: check-on, color: up }, + checkBoxOff: { name: check, color: up }, + checkBoxOver: { name: check, color: over }, + checkBoxOnDisabled: { name: check-on, color: disabled }, + checkBoxOffDisabled: { name: check, color: disabled }, + icon: { name: check-on, color: font }, + selection: { name: dot, color: selection }, + list: { name: rect, color: background }, + progressHorizontal: { name: line-v, color: up }, + progressHorizontalKnob: { name: line-v, color: down }, + progressHorizontalDisabled: { name: line-v, color: disabled }, + progressHorizontalKnobDisabled: { name: line-v, color: disabled }, + progressVertical: { name: line-h, color: up }, + progressVerticalKnob: { name: line-h, color: down }, + progressVerticalDisabled: { name: line-h, color: disabled }, + progressVerticalKnobDisabled: { name: line-h, color: disabled }, + scrollHorizontal: { name: line-v, color: up }, + scrollVertical: { name: line-h, color: up }, + scrollKnob: { name: knob-v, color: down }, + scrollKnobVertical: { name: knob-h, color: down }, + scrollPane: { name: rect, color: background }, + selectBox: { name: select, color: up }, + selectOver: { name: select, color: over }, + selectDown: { name: select, color: over }, + selectDisabled: { name: select, color: disabled }, + selectList: { name: rect, color: over }, + splitPane: { name: square, color: down }, + sliderHorizontal: { name: square, color: up }, + sliderKnob: { name: rect, color: up }, + sliderKnobOver: { name: rect, color: over }, + sliderKnobDown: { name: rect, color: down }, + sliderKnobDisabled: { name: rect, color: disabled }, + sliderVertical: { name: square, color: up }, + sliderVerticalKnob: { name: rect, color: up }, + sliderVerticalKnobOver: { name: rect, color: over }, + sliderVerticalKnobDown: { name: rect, color: down }, + sliderVerticalKnobDisabled: { name: rect, color: disabled }, + textField: { name: rect, color: up }, + textFieldDown: { name: rect, color: over }, + textFieldDisabled: { name: rect, color: disabled }, + textFieldCursor: { name: dot, color: font }, + tooltip: { name: rect, color: up }, + touchpad: { name: rect, color: over }, + touchpadKnob: { name: check-on, color: down }, + tree: { name: rect, color: background }, + treeOver: { name: dot, color: over }, + treeMinus: { name: tree-minus, color: up }, + treePlus: { name: tree-plus, color: up }, + window: { name: rect, color: background }, + windowResize: { name: window-resize, color: background }, + windowBorder: { name: window-border, color: background }, + alpha: { name: dot, color: semiTransparent } + }, + com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle: { + default: { up: buttonUp, over: buttonOver, down: buttonDown, disabled: buttonDisabled }, + toggle: { up: buttonUp, over: buttonOver, down: buttonDown, checked: buttonChecked, checkedOver: buttonCheckedOver, disabled: buttonDisabled } + }, + com.badlogic.gdx.scenes.scene2d.ui.CheckBox$CheckBoxStyle: { + default: { checkboxOn: checkBoxOn, checkboxOff: checkBoxOff, checkboxOver: checkBoxOver, checkboxOnDisabled: checkBoxOnDisabled, + checkboxOffDisabled: checkBoxOffDisabled, font: default, fontColor: font, overFontColor: fontOver, downFontColor: fontDown, + checkedFontColor: fontChecked, checkedOverFontColor: fontCheckedOver, disabledFontColor: fontDisabled, pressedOffsetY: -1, pressedOffsetX: 1 } + }, + com.badlogic.gdx.scenes.scene2d.ui.ImageButton$ImageButtonStyle: { + default: { up: buttonUp, over: buttonOver, down: buttonDown, disabled: buttonDisabled, imageUp: icon } + }, + com.badlogic.gdx.scenes.scene2d.ui.ImageTextButton$ImageTextButtonStyle: { + default: { up: buttonUp, over: buttonOver, down: buttonDown, disabled: buttonDisabled, font: default, fontColor: font, + overFontColor: fontOver, downFontColor: fontDown, disabledFontColor: fontDisabled, pressedOffsetY: -1, pressedOffsetX: 1, imageUp: icon } + }, + com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle: { + default: { font: default, fontColor: font }, + white: { font: default, fontColor: white } + }, + com.badlogic.gdx.scenes.scene2d.ui.List$ListStyle: { + default: { fontColorUnselected: font, selection: selection, fontColorSelected: fontDown, font: default }, + background: { background: list, fontColorUnselected: font, selection: selection, fontColorSelected: fontDown, font: default } + }, + com.badlogic.gdx.scenes.scene2d.ui.ProgressBar$ProgressBarStyle: { + default-horizontal: { background: progressHorizontal, knobBefore: progressHorizontalKnob, + disabledBackground: progressHorizontalDisabled, disabledKnobBefore: progressHorizontalKnobDisabled }, + default-vertical: { background: progressVertical, knobBefore: progressVerticalKnob, + disabledBackground: progressVerticalDisabled, disabledKnobBefore: progressVerticalKnobDisabled } + }, + com.badlogic.gdx.scenes.scene2d.ui.ScrollPane$ScrollPaneStyle: { + default: { hScrollKnob: scrollKnob, vScrollKnob: scrollKnobVertical, hScroll: scrollHorizontal, vScroll: scrollVertical }, + clean: { hScrollKnob: scrollKnob, vScrollKnob: scrollKnobVertical }, + background: { background: scrollPane, hScrollKnob: scrollKnob, vScrollKnob: scrollKnobVertical, hScroll: scrollHorizontal, vScroll: scrollVertical } + }, + com.badlogic.gdx.scenes.scene2d.ui.SelectBox$SelectBoxStyle: { + default: { font: default, fontColor: font, disabledFontColor: fontDisabled, background: selectBox, backgroundOver: selectOver, + backgroundOpen: selectDown, backgroundDisabled: selectDisabled, scrollStyle: default, listStyle: + { background: selectList, fontColorUnselected: font, selection: selection, fontColorSelected: fontDown, font: default } + } + }, + com.badlogic.gdx.scenes.scene2d.ui.Slider$SliderStyle: { + default-horizontal: { background: sliderHorizontal, knob: sliderKnob, knobOver: sliderKnobOver, knobDown: sliderKnobDown, + disabledKnob: sliderKnobDisabled }, + default-vertical: { background: sliderVertical, knob: sliderVerticalKnob, knobOver: sliderVerticalKnobOver, + knobDown: sliderVerticalKnobDown, disabledKnob: sliderVerticalKnobDisabled } + }, + com.badlogic.gdx.scenes.scene2d.ui.SplitPane$SplitPaneStyle: { + default-vertical: { handle: splitPane }, + default-horizontal: { handle: splitPane } + }, + com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle: { + default: { up: buttonUp, over: buttonOver, down: buttonDown, disabled: buttonDisabled, font: default, fontColor: font, + overFontColor: fontOver, downFontColor: fontDown, disabledFontColor: fontDisabled, pressedOffsetY: -1, pressedOffsetX: 1 }, + toggle: { up: buttonUp, over: buttonOver, down: buttonDown, checked: buttonChecked, checkedOver: buttonCheckedOver, + disabled: buttonDisabled, font: default, fontColor: font, overFontColor: fontOver, downFontColor: fontDown, disabledFontColor: + fontDisabled, checkedFontColor: fontChecked, checkedOverFontColor: fontCheckedOver, pressedOffsetY: -1, pressedOffsetX: 1 }, + text: { font: default, fontColor: up, overFontColor: over, downFontColor: down, disabledFontColor: disabled, + pressedOffsetY: -1, pressedOffsetX: 1 }, + textToggle: { font: default, fontColor: up, overFontColor: over, downFontColor: down, disabledFontColor: + disabled, checkedFontColor: font, checkedOverFontColor: fontOver, pressedOffsetY: -1, pressedOffsetX: 1 } + }, + com.badlogic.gdx.scenes.scene2d.ui.TextField$TextFieldStyle: { + default: { font: default, messageFont: default, fontColor: font, focusedFontColor: fontOver, disabledFontColor: fontDisabled, + messageFontColor: fontDown, background: textField, focusedBackground: textFieldDown, disabledBackground: textFieldDisabled, + cursor: textFieldCursor, selection: selection } + }, + com.badlogic.gdx.scenes.scene2d.ui.TextTooltip$TextTooltipStyle: { + default: { label: default, background: tooltip } + }, + com.badlogic.gdx.scenes.scene2d.ui.Touchpad$TouchpadStyle: { + default: { background: touchpad, knob: touchpadKnob } + }, + com.badlogic.gdx.scenes.scene2d.ui.Tree$TreeStyle: { + default: { minus: treeMinus, plus: treePlus, selection: selection, over: treeOver }, + background: { background: tree, minus: treeMinus, plus: treePlus, selection: selection, over: treeOver } + }, + com.badlogic.gdx.scenes.scene2d.ui.Window$WindowStyle: { + default: { titleFont: default, background: window, titleFontColor: fontDisabled }, + resize: { titleFont: default, background: windowResize, titleFontColor: fontDisabled }, + border: { titleFont: default, background: windowBorder, titleFontColor: fontDisabled }, + dialog: { titleFont: default, background: window, titleFontColor: fontDisabled, stageBackground: alpha } + } +} diff --git a/game/application-ktx/src/main/resources/ui/uiskin.png b/game/application-ktx/src/main/resources/ui/uiskin.png new file mode 100644 index 0000000000000000000000000000000000000000..170b6cafbd7a43d753315b428634ea46a7977e73 GIT binary patch literal 44082 zcmb5VbyQSQ7dU!m2tis>KuV>%Ltu~+r3C3z1XQ}483h3W0R^SQ08|>3E+wUvmKZuj zI)|Ef2mQWp{oZ8Y)V6e1H9^BS|o5NndZE=zDbZ-X{7balH0SdS|o7h6KLTo8^T!1y3lN z=~LM6-n${LdA;>Tc)Pw<2sbxdJHs877WTW9P0@UU>a*^(UrSszX4pKQ5yCLHbRT5Z z$ehULp4Mm^{TOU0{A3Z38Kj-Lb{af%D6mwvKU&ihJg{zN&~W%_(Ti%ZGh>e>*zx)P z)XUsjOjO3sf9fg78Xet76|* zW!s76)|>H@-_#8Q8jKHPOI|JSxR5tJhe3eu-viOhz1wD+^+eXeE14K=`Gn2&gPu(6 zO1e+KW^lVg{Vwg0j`52S+r9a=gX=9mZZ=Ral)3298?M@OES78C=Ecz`j&@#GQe}`l z0gZ~<%Q~6cg1>ZoOGSdCUAhkJ#~GjwY>8dw#RI7d>mtrC2pV^)V%=tY6fc9f%r?LB zAMwCzNeoY=oJk?XlV9iOXKPETh69Z5j8BoVdc{lK+v&D!NiwVL;B$FCcp!o)!N?p` zoi2p$(}jX5P68kW;m(`EdV|$DkLwx5`3d zEx@sPDRp$?#q4u9LKaJbt(3Ciq?+OY=ArobPzRJ{IP-SVhS?(K0-&uQnOYnq2Ft}p z`F@+t_Bx7KhXOo`3!v~i97hGBNLd=Gpq4qz0@6Vo`O(Rx8d;f#>39{yDB*t)>(pRX z$={C-P`gW#u;s_0pl+aV<-?x~Fk$vwI4HwCqu_L4U-6)_tqh~;H7*voDeUmI^Z>u{ zmX|LZ)QkXgreNIj=ze{cPU{Pu%p>j^p-`>NeeTqTB@M~b@^yP=pCLGk74M8Q_=q(E z#C(#2A63uJDl@wN&zMorQHqNdMRC!ypawmWLq;8Gm)F@!X9I)wa1cSVTstd_dxW#K z!KZ{yw_fIVqLE8vPI<8FxYuAp88nZQ;O7c3FL!QW?pfFJm5%DrB6 zdMUN8BhPtT%|iYMQ&9J%`ibO{+eYZ==lLm1iMx_TH>I^b^q(+&Z*@0=>V2ogJ%u27w}c=)t^Gf&YRWazPGDEomxZg)dy+ zE7c%DBZVVn$r7HmP1#5gBDCLe(#zXA{&Ljk&q2*dw~uyrVECB8DYh*JtF(X(WX19k zkK<;aHAVzHD5st#8g5*T6pJ}MCFmR(x5~Gcnh2Ik72aeicirTb?8TvEVefQ}@C8h6beDLYc^Lu#^WW63wx5CNcRNz)bo#VoBb}~DdWD-VW|KyAz|B#?kD}nUI zGn5esyPhC=Vw8InsN8F9u=QZI>|rt8qN$mF%~O98ClGkwV4*Cp=!gZU@*s{ZP@$d@ z=0^+0G25EKvam+H;{(b@2`SAUQoQI-DeY>OUUE#xvDjl9&3o^P>O;s}s6ikR5W#gu z82ip#a&}(}Qou*8ANz5z>NBF7X=#VcUKmu^rzy~L);bP!sF{beAs}EjUdR^2xiu#y z#&${@uDNx|DUV|^ zjU&{b5l2iMl=xL!tsMtZO$99;Q6xuZN1`~U|LD+pzdXnnGR5MkQV|T=kXV09wrg=O z@nEr>2=KrUiR_C^S*4LUI!I{3yS5yYw+Z8laYhZyPy!4Qe2(s~!e`|YqX^a|{i92? z_ga};eDjQo_7=L5`@gSMuLu^^)-p?xLw%MC;fTd!3o=~)2{RB1Ed}URk@K&1EE1zMqpZA6e;zE} zkb(>_*wKY;gb?UB5CB$k6mEP-fpOm`77jppcDHjK)_0c$nVy_E{`8^Y{DS>G*Ba7j0oJX64JbWL#Pl z>zCwryA=JzGEbjZI1X-Ceuw%ZbSObAKeE;AxY<+?elw9DY1bceE90I=o>3`5l#vK} z+GQ&p$wLnx$0+{B;w%k{g$=L-|6#2n;tracp8ulQfV>@U0+2}Ty>jaxpG?u1ME5t1 zXRL?V$nSgq)ndh-)a^y&b^I>NuHcd#Rw)CafM46#7A+j>{hxrOlPT)S6AFbw9EV&{ zE;t`L%ZX!yyb|a#E$&JcartNfx=vcoOBVTOOCf*6|D$~ww$aTC77P@>S8l6QKpk*` z1etsEGUJKE--ntSIl-1A<*tHW`I&zc(eNwI_Lsq4pL#HiOres6YOa1A-nz>tAmnb^*4 zxa(rW@kjb=SSuHdzR=7W)q?P;<8zjqgr`$(>$RzN3tfWPQ~vdy%x;{f+I$(zGYW92 z-BfGcY&gm_T>oBhuJ$PSM8W5D@+Vhj=M{YajTeK-)(z(p^Y>o!BPHY6B6gt^ zD|d$|j)NV}h8qyY+*mVqgt8MRKUdAE<1sST1 zOzh%`raKC9;}!8`ip&|z1U-o^xiz*G zjw26r!BIYCnR*Ox>!&ne@xVK0n2zSbb66ZlX(8AKW278HhUTt)Y6{jxiUPY82w zb8$cYOPeL2@$!M8OmKjRUP`d|*XY#ggPmA2U|zh{;MNB53bn=oZXyrOha6xVHi0&+ zinB2|ZJkgB8?>;x@;Ss+OS8bn#Gs={7d*V^^=lmTe%JbHE2QqqI|2smRoLbP;{!4 z$En^KLlH!%;QI7$m)7NPAzN~~O$V;_WM=yOo^9wMLKRJ(475~Hf^mpmkaZs7jY6Ss zu$3DAMg~fTVzKuCvli@lInNwRT(i;gF5qM<@P|X{o=>DU_>c#xAu*jv)RPVb1<5U^ zcAl>HMOn(0tH1AFy)fH@JsvgVtt|(Q{k~P2@<0!NgBFAs;)UYI0-<5?G>cX!de8A2A{bmPdqgXuR5Q8C-gp@pk<5QVN76aZ5vLA zaBR&n12xwP13e8ix^Nsfko$@fqS)b8x9Y@p<`Qm=!mnv<{97h}`0k-S_>OJNJ(uSz zYan=3>*hXH>*b9jV!n=$?;g9fi|beLXQt9T&P@s8R@(qZ$mFz3thVObpO-amBaqK1 z%jU}r=yAw|k8n9txpo*4PHW=;&nG*gJXkCzv!h^cR8wE(;Y)GnaEiKx^nJ;e!L!jD zc=XA|YJZgp*1FHL>%^wmO3zy#C5Q81+y&S!e=w@~C926+2W1r_R=cN(GEef&Rt)Ot z^iGHUOTL^SPy`hSJU*E#qyvGrh$4YL9YOpA4T3*%8_^)b-<+JV}CF9u-X0?TW$N89U26(QS9LG95FD!uWhhNET5-1(?KYR$@-tH z{j)PC0kAxI06Tn<#QhVy-EE4x*_~a7{muQ95gr^2<*UND0bXqRw6OLhv6n$ zrwJM{IDt+WgS2^eD%{v{^f1>)MkJ`Jh6sKzbqt|G5y4S%zx3CU8=Hb2r~P&YWdu=% zZtFpX9NgpNVY;;ko4J`*2knobkis@cB133)F~Ie^zT=Od5=_VLX|rR=_30N3 zp&_8aAwAUf^Z0be^w_ASnbdJ6MzXI$u{VT_W^s1$sR$`Z)Zq4Uyo1ugOkoptU{$c1cq2!y6g|rzROe?>Bp)TK+{b9&7OB~Ss-Z4OM9 z(i&7a_9NC8A|sh<@4k}qZ&II}Gl;HgVe%VXom|RW-%zvi$d%&kZSDQuD_{ECyJ)7v ztZwTEb?w$|DU2-e{H$FIa-l3Mup?`O$LfCEI9QUcY=6$r*(p4O=coyU)Wv4!D@ zK7Razpz-FJ7G}kR2Og&ceBiz{8x??3I)z@v8zAB#>hI#a!&~zhFubD&xg*rDf-Xnu zXQ;H-^f>vjf%8^igC{8P5v!GKQqh$giGmAQY~-+?-`&56Q_rI`IoOH{Ze?;|rniqV zcN&DK=mo;%0-$&L5Zhgu z1U*5+RVRXxIi{!wsdKpC01%xm9QeQYu)c15gfScL1&ZY-9%aWrM<%ZfeD9_yp3RBv!xACfT0EJ6@;d%s z17QjiUZCTFpVtGfi;9Q8`+JldH#SJM!*FE7kkwVw058rx~BXO9Tix_ zMf@WSlJ0@6kX~_1!*u=TogDG$x$Bb~KPy6QY;fDlh1-Q6Dkp0k55B~Q#WLf{8Q%_E z5k`#b&!=pw91lh`nt0oe=4*Z&GW|72apsl^F>=^wN(Mteo18D*v+#sbn4bhoY-49* zr=H{!lK7Hj<=O0pVg272tDvTw6=(1fP;+*KM6q!-2WE{s=p? zybIm^;~*Od-Q8a$LmN|+NHx1W!8HJWcovroRG&kfJ<-7${XZz3-JaR&|8`_Md-s1U z_$)qxMhr#my+h11xG=6KoQ)oCJw?GXEOYX&f_a-IKl5IYstg-$5gzb`DiH#Q1O+1WL7K-PjRDx1?`fF91pUd#Zn)=xEcsbM z>-VLGb*x=2e=Ly-7VM`@Cyy7jDGsS8)af?h-dNiUKK58U&h0jB4wfvFU6*t+lt?X| zo7cn~Z>0&UAQZ1XhelunGxUJ?M~A{QWRKa5#q@D@chY_m4LAvsdzDC{a~T35f($n* zojfQ)Fcl$RQ`(%h5LbMVLSW%zvcPgwTKUJ7xck(J2N1Z&;mP?r9V0Hmg|grg4ymT2MDA8CNqU%iFJaltlb+a$d|f`jQ9 zvWu{dLDr&r{4>ttBb*5kifC;pJGBYm%|N%UnH=(+Id3U8tJdDO-p*d+bd>u3;k?ZM zA+9%o;qyUyr;z{VNJgRgyQy#VF@KH@gRtTqLcR1sa{n#O;v=lk+FPsQMFLwH74;2& z#t`V!Yq65LY5UB#WBOI9aP$(Ppx`(+_7B0vsweuU3Q3y!OlG3GoRQmUZq(LJ(?4ZU zgKf|wWs>&bG{m``W|Q{k)y-e3uL$)7q;RXh;6BqX7-b?j7FZD7acQZ9gt zV*nd)X9v8k!3|URV4XM)KILMiIQdYW?Yt`$9wi^t z4g)aC+u%O)=#*Ec#UJFUTcWl>;Qvg@75Y6tehwQDv7s)U_34{GtI53S z`7GpfO1rXGg0m~o-j3?zD$d%__O5qEfZlrF+pT}I3MgObvFi$m*6J;rz)sEnd2>}q zJ~yF6CyodO5rKd%&nm!h5Yjd{7H?9Yxze+{bT*cX!s2*bhDlIuzA_DLp&c4w(~(aW=M$~M&StQq2i1~)Y4ZrfTnm>7 zqzx_u(Rl$%m}`uSJ<*$=y<6u!=SfKzKaa3mKIU@l;1CeUhq}SDQb|xVaB8rKF}w#w zS_B-RQdi~{Dc(+*3|2K3`x4qI8@&p9eOw!rY22xzqpHXYXM_4dDx?o+Xp4cg)~sgK z`5PcDmk7mitFr-}PtaNYxwec>(B`_X*WaqenUO;s5Fj|)OY@2fxP{0}L(fRYv0VkS z+j#g0PP;bj^2&+O}AZ3EqiV4`rs_8$k0{W5&aK`nowZ%u=hoPon{~i&KNl>RU7eL0E%l`m+ z>A_i1?Ff{m1_Q zHP!#f{2%%$-%^p;0$iB~w*kR*YFVR@pf=k z7TfutsW)7eK5|A>;Kcs}$kJxPSr#aOJ7x zR7C5%K8f7iwmO)3QTMH6uYw4rPbUy?=yz%{d10|fz-1xRrKhQL^oc5;H5mPGed#&(7oqisk3us zZ24^>D(b1w(ci>xbNe{iHOD^6J&nKPDLW)>C?2N+O>3riT;W-P9rxnF5?|WD$8R#O zi*k(>MRVWZ=(QbQogT@y$%bdex>~kezY?gFfH9w*a(7yc+)iKhV#cobYvDJVki#1X zepCF0ZLmQ+;Dl|cQFxxZQ2w*ke8C%0nmW*yz|zfG+bP>=+Zo%-%HXHQF7?DnE(z6! zDwIohzSC&yNXK4$d#$=r*5LC-kT&&EX0|bwIm!Q6tmVtgn9oJrMlSSV2~upxxjd~O z++$m`;tP)F1&1W+o#(qI;|j1?%!Zle=CI&<@-Gq61E=3EE_NQ0wE3rSw`qhqdySH? zb@D$&xUsC#{E%Z$N3uf2z@s$YZBoxy-KNEw^q(2_DS72w7!d7H8z!8KU(~yV{HEJO-9&pWZ|Yc8XF;N} zwA;|Gr?Xec-)kVNMVbKRol4F@w`B)Vg3#t2b)ADtn#xl|Y>Atc)}GpFH-C}i@0;tT z%R)4tH$};hQe`Hw#|zmL3z%u!x}_q%x}u=jqVv^hwSl#1JHLXD-ZtzxV^dlENmxx* zG1@Y{<)R*z!NHa>fwFTF4d&}Xxqlu(qV*R;SIs|)S|=7QwoQfI(nu?ObH)6vR?~*JOIuUY z45Y6^vh=YNERxVGG$yt(@IboAvDs@9+WW49@@m^?EONV{_B;$ytT$aQyW6i7eNK&H z((kzH&shr_2YSE4#%%kXL`HVW38i82?@HM!tlWgf6}=%Ky$hzq@@LenFzDtQqT5Q} ztm_)pqN|cOeS({l%qp9DcS!I1pF75G_u`fV!i5Ud&#)TGWJIBU<+TP;&|V=OiVpzC zK4}drO=>Z{&4kg_hcSE638z@TqS^voe1vv5-If;%IFBUC5)fYUZ=ltc`&ESR>+H`! zI#d?jFm`-Nh{tH@P5E{Hl*31bCJ5>m_GXTrgYoC65 zTk`k@KZS*S^^e%}Nog3ntcFe_-kV(ydTK|M_0}~E_@_ZLDimZ2cFL(gS*Q@~U-LM; zcv2UyEqhhZqL3wXe`6!SVmhjp%Eq~ebbG6k!UV1E-ZhS?CIYq%`LRWAr}PTgDyf4i zMZb_tjJV;C3u^6izbpO16-kx36z9n5j@(?9f_eiIw=qj%mOHCgiyS#g30L-7(YDz1 zh4sC@qoJeqL+Z)qOd;MKwnmn#Ak5P3xs>O~my2B8>B6ku^L{+Fd-n~VJ9yU$J`6)7HYrWe>nRTRDFnA9o zgdgLyosRr&gxvC6I8wDbD9v*rNzIrr0HKP`jg*A+4i{l<+nWb)gxA@j0tEh+T|IR; z7%@coZQX^GycO-{GKiEQkU>CEH-4j0!(QS=s2YExO1$uTk z7m^;y?3k#sdA*oKYx~AZ(>^gD@NBzOU>rVs*s$xMh!oKU5tGunTOG_SZbaZtoUn0k zh530P^qyMa1}tv%G@;?3^HwEMW&Jmw(`{&%^(b%=iX7i|-P1j`I^91Zd0k5N&c!a# zQqnGvfvSdsJ$bV z2)Xa=3X9C?iiu7^)0#|+gX^p2i7W38B@;ic1!fk*5iI{bc@e?xTycP9l{-C`jJ1zB z(z_&weT*cjUARW4bAQf@w`iPI9tbn!Q~CprimZSXz|AXbaw_Gf+Oj*ghQZW!{f@0R zU|&z&=B}~-b!|b;WAdAT`$h7~1G#si7T9Zzv8;*@c=ruvIZH&5ij!uI0--J=-8It| zF}?fLHV5SJDJTK23GX?T@TgKywyWD;}2Nn+iP*!@EwD;KO!!SMx^!T1mK zdSa^3mRJ9(PZ=@w`dt$GqI=uN4VZFCm}_)Z#Op{AsZP&h?fLnmt#zpGKo}x3+Deh? zA&)=BXw>(PpizU1KEVD}T09j9=6kM{Sr&S7e5z`CP710O1WbM98Y%8zI)LeTFB43` zQB3rp@cX#vvn*fwGUbYr-w2FxZRcjVPRh!hij36}hC~nl0G&GP8Pu_s^j$FUloFy| zh88$+u+5IU)Z092#h~SmsJx*~<>HImEH>CF?CbxWJ+WW>MjtEMTO0X_18C>B%-*rA z8ajs$NC`bkjrPmuE)(_5`^pCsO??(S3t9t%NAEe$mM?7zL%RmOHO!eL1V*q%8RT9Av_aP4QZu}Kn4p#Rm9Xe2y2?B= zjRaU#ZmdAX?bwFZwu_5GornATLOp?!3%}O4oc$FXznc3CB&gP=ogMRX<+xsKCK*#{ zbPg7IzCj1`f!J~Ho9z&tpbISVd1VaihWO-T%7G52by(%sx^s;_YEOUSu@&{I3bEKU zoi4y~S3E|Y_DjC@o;-tw4kQNkG34uqnQIltwtkrP%FQ8GTR7&RuEF)>ZmwmNAT_ua zH@CI5B08ZFXz9vn@L*8o3gMHl{&%jk$%Okp@lld71)yT@zX&VX9+pvDs(lP5%2W|CN4s}5+- zN8S@0UVPbrj0rkQ)=~7XQh?5p)utjdh%D1&kPq#MQ2T@%sMb_xtVryD4;}Dhh3m${ zH^ZOhX()WLo-=4aPZYANLe+?N5`@mORhqjIQUVzb{Dfs#<^83l&Dz~=yrxRASpidt zj-Z@%ao-he5nZ)(Nv4@?d!Kpu%wt3TTy~qZv};qAeAyrB7q? zI|99Tz0f2)V2c@lIv)O+{VMbhj z_;h@t+gh8dSxbhtIen$YdV_vNTNT#?i}H!>DIUDsQaufZDr19QoG8c2%|B00>(U%9 zz-kqQ_!^uAtxoF%{B)rL_`QtN?Br`eY^R6&It%DoMw+~?Qm79JT%WORuy1ls&Z$$d zoke~lG-_z6-;E6@ud&Qb)55!h4`NrRl)>=0u#6aKW09iHmiTEoE2b?ip=zyZi~uop z(sd+`kRV_;BnC0_m&h`CviDWf< zCoWdkj%!Z$gbuvJmL}I0MV+GMkX0X;DsBnYZ22o(jg#Y?W=m=aVsgPyY*%bMh9*|b zleP0wTR-i>U&1m;P+Oz*d#||#5eghmjD`#c?M*&)@GfKDuZttzslO2VImWIS2hwiojLEqz(<-0{XJ$f)cII7pWa^vacWIBb+bYZ9} z>$p*dd?a>?T~zFKr0xfJ>x&yNYT1L8bIh#rN0y&2DEmY{?|2V)Hd}hO-q}E{LxD&= zL{I?IFcwrH4Ja|DD`UGS6D!D|yN6Gt?wvx3m;20lHNHs}N$hi~-0>-p3)%gQApDo< z%h{H`wJ%&h3Dr|LGu{mX55FMya)vnQh{c4sGOf^w%Bc2*`D-S}Rr{W< z>$#Hm_~6qvYcla%odk88Sm3}xmyda{k2NXCgrOJ!L%#jk(zjUH(laQCp!@kF{k`#v z1OCt3z32Q)*CdBl;-M3JPq&^uO17=C9W_{)RW+XDq2E7W2CRj<;M^l7pe_{O%`-@Y zL}Yr`xq4++!#F>$IVC`wa1Mt08g~v#XK!61Y}{RDgp#GDiRKB3j1WOjfDptLP|nJ) zJNIDL0UBj~A4B%Ox0HBn$~`H(EjcXu$8Y8!sP0FpU(dVA#Opjrmpb(5_^@MP!HUmJ zb?)uo10SvnkFC#d1&7sfR{6V}|CrGez{i$Id#_%|+Wggxa&5w)x=UpFKE!|_qYlc0 z4KaH;)7EVgnXe8c+oxOdNV%89yX}e59n6AL(oG_Hq?tavWyP?VS2wO3_q8l89*pbm zxsg+-e=O9D)DjL1ZmdWs{yhC_C=R{xx>9g!eR-y4x5K`sS;Xgsjlg!ns|2qam**+l zh5M@?7W_F|L`*|Bu~Hbrd>OUN7^7c|=-=%wH<=25&~=v6&Wwzaj$w{UdflxSj)wRh zU)mjcmlUX)+gGP2286g2JwtjeP7UXLEiOd2>GUT}523087~S~z(^3#R+X+1^7D?L(! zx^CsB%z4Mb9l9keY3qDpC%;>&cm-bh<|#Fk(v5l2nq2jpBD~1b_&Mh%c3?)+iTs)^ z<~bj8Lxalp$>?jF6-}cBL)H6^Vvc-tPj1j&>Fy{g52pcD<-BfWsifNZv<1a!$=V<= zt9JW$`EX0!$Oo!UIZ|!AdNs|hlYIvj^Y}Mzms>J>{01Us3w{Rryd3dXDRU|qDd)R? zslIdSPF4GaLsbviOocdOs8*g*+8WK+(8bUbDz`44F!VG*L=3kfvpe>AWO1eUskVHpSJ~p-I4k0Mdi+IP1XH7=kBt2 zv8DrtEa{k8lL3$AxLt(lta+t=kotJIJUf9WNBFMZb^UYME!(EH%g>WpY-E^P{OBM3 zF8+A4*Cr(p8O|~C>BhUCd-7vJUxIWFr;M8Sexmk6hn-SAt^&gd)>;kE)K(LdQQmDw zK3=n@KNH@azn8d`HNa=Pb1xt9a9uft=(TbRJF{t6Ea`8#OSi#$vL=Sih@ls&N9SHy zzWlt9bZios>Y0iBAieQ*Zqj*}DD|dR@_achV|bOxwe2y|-pIq4gh#xiS+CW~$E3K& z>>X5w8d?0fp9d&o0@NLbpQGBbC88vsy2?I&_(p`PauWRa5^e7pR5)BXEV|PlHN#xxcLPWB9Pv6s7u=Y zJ)`u!^2!$Kz_MWB*BJ9C%e*`vJNnSuguf2FZ@)Ab2MTU z-GOH3V=U%5yCuJiNxD*QWHK3V@Lsco1blSAWmEXa@s*zf0m7U%^p4Y)j;6#OC4yg9 zs?)t_2UJRtC3X$(I-)K*P@oq4|BxNj{|d@>m>+!D%GdvP-mIvqVoai7el^Vcz4DB# z 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 literal 0 HcmV?d00001 diff --git a/game/pom.xml b/game/pom.xml index 9d8d704a..454f0414 100644 --- a/game/pom.xml +++ b/game/pom.xml @@ -52,12 +52,17 @@ de.gleex.pltcmd.game - options + engine ${project.version} de.gleex.pltcmd.game - engine + graphics + ${project.version} + + + de.gleex.pltcmd.game + options ${project.version} From c8cb136570b22be66412fc44f64f10c4379bbe7f Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Sun, 8 Oct 2023 20:39:56 +0200 Subject: [PATCH 07/37] fixed runtime error regarding sealed package of lwjgl --- game/application-ktx/pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/game/application-ktx/pom.xml b/game/application-ktx/pom.xml index f7e3dacb..06034a61 100644 --- a/game/application-ktx/pom.xml +++ b/game/application-ktx/pom.xml @@ -20,10 +20,16 @@ - + de.gleex.pltcmd.game graphics + + + com.badlogicgames.gdx + gdx-tools + + From 5cfcc2f294513b9ea95031b093488a92c144bae0 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Sun, 8 Oct 2023 21:53:24 +0200 Subject: [PATCH 08/37] Drawing stuff! Terrain and element icons --- .../gleex/pltcmd/game/application/Pltcmd.kt | 101 ++++++++++++++++-- .../graphics/elements/IconCache.kt | 8 +- 2 files changed, 97 insertions(+), 12 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt index 709eb210..6e42c1c1 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt @@ -1,14 +1,24 @@ package de.gleex.pltcmd.game.application +import com.badlogic.gdx.Files +import com.badlogic.gdx.Gdx import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.Texture.TextureFilter.Linear -import com.badlogic.gdx.graphics.g2d.SpriteBatch +import com.badlogic.gdx.graphics.g2d.TextureAtlas +import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion +import com.badlogic.gdx.scenes.scene2d.Stage +import com.badlogic.gdx.scenes.scene2d.ui.Image +import com.badlogic.gdx.utils.Array +import com.badlogic.gdx.utils.Scaling +import com.badlogic.gdx.utils.viewport.FitViewport +import de.gleex.pltcmd.game.application.graphics.elements.ElementIconSelector +import de.gleex.pltcmd.game.application.graphics.elements.IconCache +import de.gleex.pltcmd.model.elements.ElementKind +import de.gleex.pltcmd.model.faction.Affiliation import ktx.app.KtxGame import ktx.app.KtxScreen -import ktx.app.clearScreen import ktx.assets.disposeSafely -import ktx.assets.toInternalFile -import ktx.graphics.use +import kotlin.random.Random class Pltcmd : KtxGame() { override fun create() { @@ -18,18 +28,87 @@ class Pltcmd : KtxGame() { } class FirstScreen : KtxScreen { - private val image = Texture("logo.png".toInternalFile(), true).apply { setFilter(Linear, Linear) } - private val batch = SpriteBatch() + private val stage = Stage(FitViewport(16f, 16f)) + private val textureAtlas = TextureAtlas(Gdx.files.getFileHandle("terrain/packed/terrain.atlas", Files.FileType.Classpath)) + + override fun show() { + val grasslandsRegions = textureAtlas.findRegions("grasslands") + val forestRegions = textureAtlas.findRegions("forest") + val hillsRegions = textureAtlas.findRegions("hills") + val mountainRegions = textureAtlas.findRegions("mountain") + val waterDeepRegions = textureAtlas.findRegions("water_deep") + val waterShallowRegions = textureAtlas.findRegions("water_shallow") + drawMap(0..15, 0..15, grasslandsRegions) + drawMap(3..6, 2..5, forestRegions) + // a river + drawMap(0..10, 10..10, waterShallowRegions) + drawMap(11..15, 10..10, waterDeepRegions) + drawMap(8..15, 11..11, waterDeepRegions) + drawMap(8..15, 9..9, waterDeepRegions) + // hills and mountains + drawMap(3..12, 12..12, hillsRegions) + drawMap(4..9, 13..15, hillsRegions) + drawMap(5..7, 13..13, mountainRegions) + drawMap(9..13, 0..2, mountainRegions) + + placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Hostile, ElementKind.Armored)) + placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Friendly, ElementKind.Infantry, tags = listOf("recon"))) + placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Unknown, ElementKind.Aerial)) + placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Neutral, ElementKind.Infantry, tags = listOf("engi"))) + } + + private fun placeElementIconAtRandomPosition(iconSelector: ElementIconSelector) { + val image = Texture(Gdx.files.classpath(IconCache.pathFor(iconSelector)), true) + .apply { + setFilter(Linear, Linear) + } + stage.addActor( + Image(image).apply { + val aspectRatio = image.width.toFloat() / image.height + val posCorrection = (aspectRatio - 1) / 2f + println("imageSize: ${image.width} * ${image.height}") + println("aspect = $aspectRatio posCorrection = $posCorrection") + setPosition( + Random.nextInt(15).toFloat() - posCorrection, + Random.nextInt(15).toFloat() + ) + setSize(1f, 1f) + setScaling(Scaling.fillY) + } + ) + } + + private fun drawMap( + xRange: IntRange, + yRange: IntRange, + grasslandsRegions: Array + ) { + for (x in xRange) { + for (y in yRange) { + val region = grasslandsRegions.random() + stage.addActor( + Image(AtlasRegion(region)).apply { + setPosition(x.toFloat(), y.toFloat()) + setSize(1f, 1f) + setScaling(Scaling.fill) + } + ) + } + } + } override fun render(delta: Float) { - clearScreen(red = 0.7f, green = 0.7f, blue = 0.7f) - batch.use { - it.draw(image, 100f, 160f) + with(stage) { + act(delta) + draw() } } + override fun resize(width: Int, height: Int) { + stage.viewport.update(width, height) + } + override fun dispose() { - image.disposeSafely() - batch.disposeSafely() + stage.disposeSafely() } } diff --git a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/elements/IconCache.kt b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/elements/IconCache.kt index 1326ce80..6ad82da4 100644 --- a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/elements/IconCache.kt +++ b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/elements/IconCache.kt @@ -21,12 +21,18 @@ object IconCache { * @throws FileNotFoundException if no resource for the given selector could be loaded. */ suspend fun load(iconSelector: ElementIconSelector): URL { - val fileName = "elements/${iconSelector.fileName}.png" + val fileName = pathFor(iconSelector) log.debug { "Loading PNG from iconSelector $iconSelector: $fileName" } return IconCache::class.java.classLoader.getResource(fileName) ?: throw FileNotFoundException(fileName) } + /** + * @return the internal path on the classpath to the file for the given selector. + */ + fun pathFor(iconSelector: ElementIconSelector) = + "elements/${iconSelector.fileName}.png" + /**O * @return the URL of the icon for the given [ElementIconSelector]. * From f65fcf8e83b25e958434856268a99110bba029c9 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Mon, 9 Oct 2023 20:59:15 +0200 Subject: [PATCH 09/37] playing around with filters, atlas creation and so on --- .../gleex/pltcmd/game/application/Pltcmd.kt | 24 ++++++++--- .../application/graphics/TexturePacking.kt | 6 +-- .../resources/terrain/packed/terrain.atlas | 38 +++++++++--------- .../main/resources/terrain/packed/terrain.png | Bin 3861 -> 4175 bytes 4 files changed, 40 insertions(+), 28 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt index 6e42c1c1..e0dd0664 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt @@ -3,7 +3,7 @@ package de.gleex.pltcmd.game.application import com.badlogic.gdx.Files import com.badlogic.gdx.Gdx import com.badlogic.gdx.graphics.Texture -import com.badlogic.gdx.graphics.Texture.TextureFilter.Linear +import com.badlogic.gdx.graphics.Texture.TextureFilter.* import com.badlogic.gdx.graphics.g2d.TextureAtlas import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion import com.badlogic.gdx.scenes.scene2d.Stage @@ -28,7 +28,7 @@ class Pltcmd : KtxGame() { } class FirstScreen : KtxScreen { - private val stage = Stage(FitViewport(16f, 16f)) + private val stage = Stage(FitViewport(50f, 50f)) private val textureAtlas = TextureAtlas(Gdx.files.getFileHandle("terrain/packed/terrain.atlas", Files.FileType.Classpath)) override fun show() { @@ -38,8 +38,10 @@ class FirstScreen : KtxScreen { val mountainRegions = textureAtlas.findRegions("mountain") val waterDeepRegions = textureAtlas.findRegions("water_deep") val waterShallowRegions = textureAtlas.findRegions("water_shallow") - drawMap(0..15, 0..15, grasslandsRegions) + drawMap(0..49, 0..49, grasslandsRegions) drawMap(3..6, 2..5, forestRegions) + drawMap(30..46, 20..49, forestRegions) + drawMap(20..26, 21..25, forestRegions) // a river drawMap(0..10, 10..10, waterShallowRegions) drawMap(11..15, 10..10, waterDeepRegions) @@ -60,7 +62,17 @@ class FirstScreen : KtxScreen { private fun placeElementIconAtRandomPosition(iconSelector: ElementIconSelector) { val image = Texture(Gdx.files.classpath(IconCache.pathFor(iconSelector)), true) .apply { - setFilter(Linear, Linear) + when(iconSelector.affiliation) { + // failed: nearest, MipMapNearestLinear + // best result: MipMapLinearNearest + // favorite: setFilter(MipMapLinearNearest, Linear) + Affiliation.Unknown -> setFilter(Nearest, Nearest) + Affiliation.Self -> setFilter(MipMapLinearNearest, MipMapLinearNearest) + Affiliation.Friendly -> setFilter(MipMapLinearNearest, MipMapLinearNearest) + Affiliation.Neutral -> setFilter(Linear, Linear) + Affiliation.Hostile -> setFilter(MipMapLinearNearest, Linear) + null -> setFilter(MipMapLinearNearest, MipMapLinearNearest) + } } stage.addActor( Image(image).apply { @@ -69,8 +81,8 @@ class FirstScreen : KtxScreen { println("imageSize: ${image.width} * ${image.height}") println("aspect = $aspectRatio posCorrection = $posCorrection") setPosition( - Random.nextInt(15).toFloat() - posCorrection, - Random.nextInt(15).toFloat() + Random.nextInt(40).toFloat() - posCorrection, + Random.nextInt(40).toFloat() ) setSize(1f, 1f) setScaling(Scaling.fillY) diff --git a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt index bed54a33..a11eb3b5 100644 --- a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt +++ b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt @@ -8,9 +8,9 @@ fun main() { println("Packing textures in $baseFolder") val settings = Settings().apply { pot = false - paddingX = 2 - paddingY = 2 - maxWidth = 120 + paddingX = 4 + paddingY = 4 + maxWidth = 128 } TexturePacker.process(settings, baseFolder, "${baseFolder}packed", "terrain") println("texture packing done") diff --git a/game/graphics/src/main/resources/terrain/packed/terrain.atlas b/game/graphics/src/main/resources/terrain/packed/terrain.atlas index 7f02836c..c059b598 100644 --- a/game/graphics/src/main/resources/terrain/packed/terrain.atlas +++ b/game/graphics/src/main/resources/terrain/packed/terrain.atlas @@ -1,131 +1,131 @@ terrain.png -size: 104, 206 +size: 112, 220 format: RGBA8888 filter: Nearest, Nearest repeat: none forest rotate: false - xy: 2, 172 + xy: 4, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 forest rotate: false - xy: 2, 138 + xy: 4, 148 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 forest rotate: false - xy: 36, 172 + xy: 40, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 3 grasslands rotate: false - xy: 2, 104 + xy: 4, 112 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 grasslands rotate: false - xy: 36, 138 + xy: 40, 148 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 grasslands rotate: false - xy: 70, 172 + xy: 76, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 3 hills rotate: false - xy: 2, 70 + xy: 4, 76 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 hills rotate: false - xy: 36, 104 + xy: 40, 112 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 hills rotate: false - xy: 70, 138 + xy: 76, 148 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 3 mountain rotate: false - xy: 2, 36 + xy: 4, 40 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 mountain rotate: false - xy: 36, 70 + xy: 40, 76 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 mountain rotate: false - xy: 70, 104 + xy: 76, 112 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 3 water_deep rotate: false - xy: 2, 2 + xy: 4, 4 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 water_deep rotate: false - xy: 36, 36 + xy: 40, 40 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 water_deep rotate: false - xy: 70, 70 + xy: 76, 76 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 3 water_shallow rotate: false - xy: 36, 2 + xy: 40, 4 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 water_shallow rotate: false - xy: 70, 36 + xy: 76, 40 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 water_shallow rotate: false - xy: 70, 2 + xy: 76, 4 size: 32, 32 orig: 32, 32 offset: 0, 0 diff --git a/game/graphics/src/main/resources/terrain/packed/terrain.png b/game/graphics/src/main/resources/terrain/packed/terrain.png index fd9c54cf67de8b53e4ea01cece6f727c9dbf2017..66d2e7aa5392f4260f60b3378ac8b2d539f8b1f0 100644 GIT binary patch literal 4175 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 LxH(kW1wj7;PJq(5 From 419a6b7190aa6db2164be29e3e3f0eb63077ff45 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Mon, 9 Oct 2023 21:37:47 +0200 Subject: [PATCH 10/37] trying upscaled element icons --- .../gleex/pltcmd/game/application/Pltcmd.kt | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt index e0dd0664..23d5d7c9 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt @@ -3,7 +3,8 @@ package de.gleex.pltcmd.game.application import com.badlogic.gdx.Files import com.badlogic.gdx.Gdx import com.badlogic.gdx.graphics.Texture -import com.badlogic.gdx.graphics.Texture.TextureFilter.* +import com.badlogic.gdx.graphics.Texture.TextureFilter.Linear +import com.badlogic.gdx.graphics.Texture.TextureFilter.MipMapLinearNearest import com.badlogic.gdx.graphics.g2d.TextureAtlas import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion import com.badlogic.gdx.scenes.scene2d.Stage @@ -57,34 +58,35 @@ class FirstScreen : KtxScreen { placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Friendly, ElementKind.Infantry, tags = listOf("recon"))) placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Unknown, ElementKind.Aerial)) placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Neutral, ElementKind.Infantry, tags = listOf("engi"))) + placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Self, ElementKind.MechanizedInfantry)) } private fun placeElementIconAtRandomPosition(iconSelector: ElementIconSelector) { - val image = Texture(Gdx.files.classpath(IconCache.pathFor(iconSelector)), true) + val imageTexture = Texture(Gdx.files.classpath(IconCache.pathFor(iconSelector)), true) .apply { when(iconSelector.affiliation) { // failed: nearest, MipMapNearestLinear // best result: MipMapLinearNearest // favorite: setFilter(MipMapLinearNearest, Linear) - Affiliation.Unknown -> setFilter(Nearest, Nearest) - Affiliation.Self -> setFilter(MipMapLinearNearest, MipMapLinearNearest) - Affiliation.Friendly -> setFilter(MipMapLinearNearest, MipMapLinearNearest) - Affiliation.Neutral -> setFilter(Linear, Linear) + Affiliation.Unknown -> setFilter(MipMapLinearNearest, Linear) + Affiliation.Self -> setFilter(MipMapLinearNearest, Linear) + Affiliation.Friendly -> setFilter(MipMapLinearNearest, Linear) + Affiliation.Neutral -> setFilter(MipMapLinearNearest, Linear) Affiliation.Hostile -> setFilter(MipMapLinearNearest, Linear) - null -> setFilter(MipMapLinearNearest, MipMapLinearNearest) + null -> setFilter(MipMapLinearNearest, Linear) } } stage.addActor( - Image(image).apply { - val aspectRatio = image.width.toFloat() / image.height + Image(imageTexture).apply { + val aspectRatio = imageTexture.width.toFloat() / imageTexture.height val posCorrection = (aspectRatio - 1) / 2f - println("imageSize: ${image.width} * ${image.height}") + println("imageSize: ${imageTexture.width} * ${imageTexture.height}") println("aspect = $aspectRatio posCorrection = $posCorrection") setPosition( Random.nextInt(40).toFloat() - posCorrection, Random.nextInt(40).toFloat() ) - setSize(1f, 1f) + setSize(2.5f, 2.5f) setScaling(Scaling.fillY) } ) From 65f00c8c28824c8ff7fb618653784c9263403a12 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Mon, 9 Oct 2023 21:38:04 +0200 Subject: [PATCH 11/37] optimized texture packing settings --- .../application/graphics/TexturePacking.kt | 2 + .../resources/terrain/packed/terrain.atlas | 38 +++++++++--------- .../main/resources/terrain/packed/terrain.png | Bin 4175 -> 2877 bytes 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt index a11eb3b5..e2d10c2b 100644 --- a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt +++ b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt @@ -8,6 +8,8 @@ fun main() { println("Packing textures in $baseFolder") val settings = Settings().apply { pot = false + grid = true + duplicatePadding = true paddingX = 4 paddingY = 4 maxWidth = 128 diff --git a/game/graphics/src/main/resources/terrain/packed/terrain.atlas b/game/graphics/src/main/resources/terrain/packed/terrain.atlas index c059b598..2e697223 100644 --- a/game/graphics/src/main/resources/terrain/packed/terrain.atlas +++ b/game/graphics/src/main/resources/terrain/packed/terrain.atlas @@ -1,131 +1,131 @@ terrain.png -size: 112, 220 +size: 108, 216 format: RGBA8888 filter: Nearest, Nearest repeat: none forest rotate: false - xy: 4, 184 + xy: 2, 2 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 forest rotate: false - xy: 4, 148 + xy: 38, 2 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 forest rotate: false - xy: 40, 184 + xy: 74, 2 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 3 grasslands rotate: false - xy: 4, 112 + xy: 2, 38 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 grasslands rotate: false - xy: 40, 148 + xy: 38, 38 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 grasslands rotate: false - xy: 76, 184 + xy: 74, 38 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 3 hills rotate: false - xy: 4, 76 + xy: 2, 74 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 hills rotate: false - xy: 40, 112 + xy: 38, 74 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 hills rotate: false - xy: 76, 148 + xy: 74, 74 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 3 mountain rotate: false - xy: 4, 40 + xy: 2, 110 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 mountain rotate: false - xy: 40, 76 + xy: 38, 110 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 mountain rotate: false - xy: 76, 112 + xy: 74, 110 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 3 water_deep rotate: false - xy: 4, 4 + xy: 2, 146 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 water_deep rotate: false - xy: 40, 40 + xy: 38, 146 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 water_deep rotate: false - xy: 76, 76 + xy: 74, 146 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 3 water_shallow rotate: false - xy: 40, 4 + xy: 2, 182 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 1 water_shallow rotate: false - xy: 76, 40 + xy: 38, 182 size: 32, 32 orig: 32, 32 offset: 0, 0 index: 2 water_shallow rotate: false - xy: 76, 4 + xy: 74, 182 size: 32, 32 orig: 32, 32 offset: 0, 0 diff --git a/game/graphics/src/main/resources/terrain/packed/terrain.png b/game/graphics/src/main/resources/terrain/packed/terrain.png index 66d2e7aa5392f4260f60b3378ac8b2d539f8b1f0..191cac03139b81e9a5dc548c1b74bc928dba9a1f 100644 GIT binary patch literal 2877 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 Date: Mon, 9 Oct 2023 22:01:29 +0200 Subject: [PATCH 12/37] Also packing element icons into an atlas --- .../gleex/pltcmd/game/application/Pltcmd.kt | 47 +- .../application/graphics/TexturePacking.kt | 25 ++ .../graphics/elements/IconCache.kt | 2 +- .../resources/elements/fnd_arm_siz_recon.png | Bin 1694 -> 9304 bytes .../resources/elements/packed/elements.atlas | 418 ++++++++++++++++++ .../resources/elements/packed/elements.png | Bin 0 -> 37436 bytes .../resources/elements/packed/elements2.png | Bin 0 -> 36967 bytes .../resources/elements/packed/elements3.png | Bin 0 -> 34872 bytes .../resources/elements/packed/elements4.png | Bin 0 -> 25352 bytes .../resources/elements/packed/elements5.png | Bin 0 -> 45834 bytes .../resources/elements/packed/elements6.png | Bin 0 -> 38324 bytes .../resources/elements/packed/elements7.png | Bin 0 -> 75639 bytes .../resources/elements/packed/elements8.png | Bin 0 -> 52733 bytes .../resources/elements/packed/elements9.png | Bin 0 -> 38851 bytes .../resources/elements/unk_rec_siz_armor.png | Bin 2938 -> 0 bytes 15 files changed, 460 insertions(+), 32 deletions(-) create mode 100644 game/graphics/src/main/resources/elements/packed/elements.atlas create mode 100644 game/graphics/src/main/resources/elements/packed/elements.png create mode 100644 game/graphics/src/main/resources/elements/packed/elements2.png create mode 100644 game/graphics/src/main/resources/elements/packed/elements3.png create mode 100644 game/graphics/src/main/resources/elements/packed/elements4.png create mode 100644 game/graphics/src/main/resources/elements/packed/elements5.png create mode 100644 game/graphics/src/main/resources/elements/packed/elements6.png create mode 100644 game/graphics/src/main/resources/elements/packed/elements7.png create mode 100644 game/graphics/src/main/resources/elements/packed/elements8.png create mode 100644 game/graphics/src/main/resources/elements/packed/elements9.png delete mode 100644 game/graphics/src/main/resources/elements/unk_rec_siz_armor.png diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt index 23d5d7c9..1f93e474 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt @@ -2,9 +2,6 @@ package de.gleex.pltcmd.game.application import com.badlogic.gdx.Files import com.badlogic.gdx.Gdx -import com.badlogic.gdx.graphics.Texture -import com.badlogic.gdx.graphics.Texture.TextureFilter.Linear -import com.badlogic.gdx.graphics.Texture.TextureFilter.MipMapLinearNearest import com.badlogic.gdx.graphics.g2d.TextureAtlas import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion import com.badlogic.gdx.scenes.scene2d.Stage @@ -13,7 +10,7 @@ import com.badlogic.gdx.utils.Array import com.badlogic.gdx.utils.Scaling import com.badlogic.gdx.utils.viewport.FitViewport import de.gleex.pltcmd.game.application.graphics.elements.ElementIconSelector -import de.gleex.pltcmd.game.application.graphics.elements.IconCache +import de.gleex.pltcmd.game.application.graphics.elements.fileName import de.gleex.pltcmd.model.elements.ElementKind import de.gleex.pltcmd.model.faction.Affiliation import ktx.app.KtxGame @@ -29,16 +26,17 @@ class Pltcmd : KtxGame() { } class FirstScreen : KtxScreen { - private val stage = Stage(FitViewport(50f, 50f)) - private val textureAtlas = TextureAtlas(Gdx.files.getFileHandle("terrain/packed/terrain.atlas", Files.FileType.Classpath)) + private val stage = Stage(FitViewport(20f, 20f)) + private val textureAtlasTerrain = TextureAtlas(Gdx.files.getFileHandle("terrain/packed/terrain.atlas", Files.FileType.Classpath)) + private val textureAtlasElements = TextureAtlas(Gdx.files.getFileHandle("elements/packed/elements.atlas", Files.FileType.Classpath)) override fun show() { - val grasslandsRegions = textureAtlas.findRegions("grasslands") - val forestRegions = textureAtlas.findRegions("forest") - val hillsRegions = textureAtlas.findRegions("hills") - val mountainRegions = textureAtlas.findRegions("mountain") - val waterDeepRegions = textureAtlas.findRegions("water_deep") - val waterShallowRegions = textureAtlas.findRegions("water_shallow") + val grasslandsRegions = textureAtlasTerrain.findRegions("grasslands") + val forestRegions = textureAtlasTerrain.findRegions("forest") + val hillsRegions = textureAtlasTerrain.findRegions("hills") + val mountainRegions = textureAtlasTerrain.findRegions("mountain") + val waterDeepRegions = textureAtlasTerrain.findRegions("water_deep") + val waterShallowRegions = textureAtlasTerrain.findRegions("water_shallow") drawMap(0..49, 0..49, grasslandsRegions) drawMap(3..6, 2..5, forestRegions) drawMap(30..46, 20..49, forestRegions) @@ -62,31 +60,18 @@ class FirstScreen : KtxScreen { } private fun placeElementIconAtRandomPosition(iconSelector: ElementIconSelector) { - val imageTexture = Texture(Gdx.files.classpath(IconCache.pathFor(iconSelector)), true) - .apply { - when(iconSelector.affiliation) { - // failed: nearest, MipMapNearestLinear - // best result: MipMapLinearNearest - // favorite: setFilter(MipMapLinearNearest, Linear) - Affiliation.Unknown -> setFilter(MipMapLinearNearest, Linear) - Affiliation.Self -> setFilter(MipMapLinearNearest, Linear) - Affiliation.Friendly -> setFilter(MipMapLinearNearest, Linear) - Affiliation.Neutral -> setFilter(MipMapLinearNearest, Linear) - Affiliation.Hostile -> setFilter(MipMapLinearNearest, Linear) - null -> setFilter(MipMapLinearNearest, Linear) - } - } + val imageTexture = textureAtlasElements.findRegion(iconSelector.fileName) stage.addActor( Image(imageTexture).apply { - val aspectRatio = imageTexture.width.toFloat() / imageTexture.height + val aspectRatio = imageTexture.packedWidth.toFloat() / imageTexture.packedHeight val posCorrection = (aspectRatio - 1) / 2f - println("imageSize: ${imageTexture.width} * ${imageTexture.height}") + println("imageSize: ${imageTexture.packedWidth} * ${imageTexture.packedHeight}") println("aspect = $aspectRatio posCorrection = $posCorrection") setPosition( - Random.nextInt(40).toFloat() - posCorrection, - Random.nextInt(40).toFloat() + Random.nextInt(19).toFloat(), + Random.nextInt(19).toFloat() ) - setSize(2.5f, 2.5f) + setSize(1f, 1f) setScaling(Scaling.fillY) } ) diff --git a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt index e2d10c2b..0c98858f 100644 --- a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt +++ b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/TexturePacking.kt @@ -1,9 +1,15 @@ package de.gleex.pltcmd.game.application.graphics +import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.tools.texturepacker.TexturePacker import com.badlogic.gdx.tools.texturepacker.TexturePacker.Settings fun main() { + packTerrain() + packElements() +} + +private fun packTerrain() { val baseFolder = "game/graphics/src/main/resources/terrain/" println("Packing textures in $baseFolder") val settings = Settings().apply { @@ -16,4 +22,23 @@ fun main() { } TexturePacker.process(settings, baseFolder, "${baseFolder}packed", "terrain") println("texture packing done") +} + +private fun packElements() { + val baseFolder = "game/graphics/src/main/resources/elements/" + println("Packing textures in $baseFolder") + val settings = Settings().apply { + pot = false + grid = true + paddingX = 4 + paddingY = 4 + + filterMin = Texture.TextureFilter.MipMapLinearNearest + filterMag = Texture.TextureFilter.Linear + + // not sure if we really want that + stripWhitespaceX = true + } + TexturePacker.process(settings, baseFolder, "${baseFolder}packed", "elements") + println("elements packing done") } \ No newline at end of file diff --git a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/elements/IconCache.kt b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/elements/IconCache.kt index 6ad82da4..374c2062 100644 --- a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/elements/IconCache.kt +++ b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/elements/IconCache.kt @@ -46,7 +46,7 @@ object IconCache { } -private val ElementIconSelector.fileName: String +val ElementIconSelector.fileName: String get() = "${affiliation.fileNamePart()}_${kind.fileNamePart()}_${size.fileNamePart()}${tags.fileNameParts()}" private fun Affiliation?.fileNamePart() = when (this) { diff --git a/game/graphics/src/main/resources/elements/fnd_arm_siz_recon.png b/game/graphics/src/main/resources/elements/fnd_arm_siz_recon.png index 53bce9ae2670aba1c9464f39ba10aa8c367c0269..d7cb6e0b94e6837a9c48b841a95e18624ac79b7a 100644 GIT binary patch literal 9304 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 delta 1684 zcmV;F25b4)NS+NLiBL{Q4GJ0x0000DNk~Le0001F0000y2nGNE0FXZ)&XFM>e+EcN zL_t(|+U=YVOjT7J$A3J~K*%u!1Vu$62_!>8#`Mim(w`A*+Aytjk}C#{5(`tOg&JxR z4jLquD=aIRvN9y+43mRe`LUmZ-rE9>kS?@u9XQXSM58{Ayb6ZY3-sdK`Mom z84w;xQxnW;--KH-aIKFzTbk%fXS?*@(}mP-?K2|^5|@!l3yUk&zBjky)S()x+nB>d znU}SOj+GRMmkdFas4Juxf^fuHS4c4g z;e;GlNHGMF2@h9DaVtS^fAg5j|JHt%T0g2HFK=(UdE(^3>)zx2S(4KGYZsgM%b{B+ zZ$d;AO}TR}Ma)~k0y@z4*(l0SaBNG4BD;kAR+CFs@|!pim!pVU%FOdPvsf4uTQ^MYJHcbeW= zb`SMj>Llc!oL68qsB$$B#UhMBhP^;}Yqcs@-hxzW;?1ZsllJ5Hvt}N;F*`7@*AR zW3mQHxwJPm(1HBNf2gOclji4c5Yk5G3Us4KwymMGtre8;Xf~I!G%HB`%j>D>ty0RW zZKmL;ST1=w$`Dsr87m;v=_3ayukrlO)*!j{-_uxMWe>7QU4d>A_k;Mte->gK!oww+69hAvqWB;- zSSsxf95SeR>S5*zv3#$ayhr>TPnT#;5cJ2@S&Jz9Pz$%Y{YcBB9>nL&Kb|kLCoyU=C+s zSIw31aD^0fe_O?KLg}HM`za> zB?yAREs(oi+3cR|?6;gCJhJanE zv)S5}oLLrJ@p*ZnkhZ$q6(YKwWyy_0ly-#(b~5)pxmbU3h!|k4+<%;%^0OB;Tp>lb zk-9T$SyES^4ww`uxhSdYwJd;c3kL|EZa8am^;GH#zn~CGE3BXy3({nl?_^;FN0bd$AnI1r6(S9#n}oEP>&k*=1pyc=aq0x3#HKHy zuitx}oyk($75K79gG$RP+^9TqnT`}6wgdjKrg}4G^!)SDc6jcR5;TS6r zSdC^^Shk5Of{3m#d3v$Mz*&oysofTuKyg8&u0U`HSIF5v&>M;hB6S6pJ$N5v&;yDH zVz|P7TrP;=3deAnAoxunexZux4#O4pYU2_?@LLJ|X5#uk18fFmxWaz83NrJ7#cWj; z>rKNwoXcQjxC-K7GLeVLlP1N+Q($DY+V|#`^k3~|M~ZIXv>?WFdtHOm&+RpyY|S58 ePqsEtfqwxuT;X}6)FTZ50000 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 literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/elements/packed/elements2.png b/game/graphics/src/main/resources/elements/packed/elements2.png new file mode 100644 index 0000000000000000000000000000000000000000..9f4549ea97bdba8b7b0ccb1e9515a678c8f6cf16 GIT binary patch literal 36967 zcmc${cU)8F8#o%YieFJ_YXubrJ6vo-!Yh_#_;d$70cll^8SPH7hlY;KOZ=A*=&%0>Y)ugY-HxZkDGthklbar z=Q~T&A5T&KHrX4wCBgBB&7;3K-p`bH7WO1Y?3+iC+20kMwa-l36L{xC!ZN9Ml}Dqu z92dS+BK-Z;0|)U-F1$Z*^3OkxJpXGc@u}aYvDZRUV;PQfHRM;=gA?4@w0ha&A|H!NB3SnCPQWH`zn3=!#8N^O>5S`-kgfJGm zoqI>bdt+~Qi(;2yo@O+p7oI;6J7JPZ-2y8={7oTj|4nP`X6V!Y7Y}L{$jnAPjPK4( z4^rf#FS-8pb_wQKPl2eB>F|614y;Ym?203sS7G)?vntr; zlAiBNePq%%R|g@F2UcKh0^;$)@TYq9kq*yZ^)6z+=LKx8)s-gL;@8ayu*KNpz-`}Q ze2;C{jg#%s)5tqSM4mkh9+Xy+KCuIXiCS~Jh2eRD?)D4uk=h0f#(HC$-nlb(PGT^- z^?KNS-}l^qYmLGDb-~&o>eR)9LYSv68I*dD`M<_~zqlKNdAcVnrS_p(0=$=8!=xnq z=hw07lodxRo?$RsUOY|To%r^TBg5_kQFU_*Y^qR-Gt%?t~( zZYG;gnAj}U*Pg$dpgKHc+YnW?^r+GY$%ny$)@NZGY!0iD{Bw>9dYYWsoAtw;ma^!r z;StwweS@gy%_m%5?@*9!K2^_s_cuZB-s`?obA46OwY?<&`y1WqEk^`_sJqDBURfZB zzrA8>t~;BF;BFb3NuN0K2WaNc-;%3uTwl8}fs*mlj7G$|Hxx12Pnnc6cW$fz1NrkO zx3CTCw(mJewA>j`Z{zh=>Uc&A-u85{on`Th!FfyAD}@UEq51RM13Z z3!ApNYd(%Rs}(yxjAyiT6uw~*KstCq;@^UQ74756N5^=6S(SOUfpqp7%ht~!B4BCT9|LD)?e`wqyv#L zajJVX9WhtBe-R+%$XlI0Ka=vLE_@XtBS;GJjI3+@UP>!&+!P=|MRELeCMC{?^3D1m z1--n6k$*AjMdjCj{v<$kJ~*apUssKga{Vem;A8vYn6LuJZ?B{Yl1H4}o2n7Uq*Z8% z{#nE~eN(s+^YyPBzjgkPv4f=W>;pz+0pBoh3&6TDF+r+;JUD<;4J{s5XWfa@oUiF} zN>@u@;C3?J|M-_7Nzjg+xA8^>UbEX+#&Xq3?{M1FQN;R98Xs=8$j{C*Nso5)=2V|c z^jFxcPMQS)(502sx5V7qB%ee2bARK98Pw2INs=+dRziQki$$%9WvGb19mqOw7bk9r|b9QINqdaqkB9}kT=TCU~u8< z2!emwWTqf>MQ=`Hq9FP1yeN-b4-aDmK3rY&4b4qnri>`}!Mab=L=fqU>*{TWLO#R1 zvhO6Prby*@BPq&Qa$TO;TpF=HI!x*t%533UhKJs5DLD<+m;__*{s2MS+v^syhZ(P8 zbfa53Xc%u^h-{(L9+9*iB||6ZqeCN6 zBW*M}^THMl$<{nUyB(X*n6Y9-w@-?afil5rnbVTT^}cdYq-5 zAhFK?ZWka1ofd?6t9ZT5@j#Ywq#%sSw4CK}?hri%I^~ccypaO}SCCs(TT^e7Q$duo z7UYpR53AszAdJ+K6?_(!vD{z1HKk<-)Z^y*yXK3C8W|~q2v1a-X`r^5x=*cRu+Q9H zh{YSd*tn0RSKpvHTOGsLTOu#WOH@h|lC`FvnbhGfFgv9v=i~f5&1ae#%2>uN9hXIV zbDVz?#6~Onc!?2f-z({bG;fV0{7f7E-0|G%z>{;AUn>e+f19kw#+^^;=mFuF^vw7` z=2QF1o<8@11&IA6h#Kr>H~Ey=iRrzOor$D5M|@jzOSG~y1pQ1wWVn?Uq!J-}7~d)= z^oZZ7iIxJDkP`IjnsRvcExh`@pjTJ)W-)?U#%k$;aD<29SKwjD=N|gO!(;&umx;og z{-1g1zY!i@gNJDHp{EW;*j=}MVX!#3(@lNfN$+#sLW|<2-Nn4Wb53j>nbeBOhL@#(4HLoMO+cm|D!+T)VVqUsAMk)gp2>1;(~W zYi~QFEzAt#1(@hg#Jw2_W6CE*l3xA7kIAQ2vi%IqY|NyV0j<3mEaTAG*%roL!v{QO zHGin?^)6b23CL`+`;ni6_pGU^((r`$ioksJ9ByorA z>WWC26FW9OY`MxlpJEntHTWYsclew>F<037wzfVib6o8h&%fBYHysJm{w4P`X&JLg zzep@qN1e|ZW+gV*wcByq8Z@(umXt`Fe~Bw~&(=ehpFlIX7WdV$HE-|KyT9MZSL)^u zt>@Vf%tUC3Y3_1{p>BN6(XOd)Q2SFohMx~5RUJvuW*cWnIy57oZ*l9G6+Jm8?$jL! zZuv@sXIaVpnN0(_2#O}i>LGrXoF+<8c>P9x`e5}THhB)rjz6SY|!f9cxbS`&p?ia=Bs2xA-1FXglluu_NY&t60>#4 z2tqVo)0w6rS%W4=pOx|@uOS`n_SvSb5s}IYY7ze6s?2!Kvj_G6pWQP`(rbti0|g^3 zl~6jh@rJUC8S{A!DgV82*7ROOG~$0&Yr-FNT*-$t@LXEn{A`rZo(7>ctT3r!YqO&! zQgiRp?z9*`{F11`ZTn2cq%dkBm$s#NA9uKDhKoY|;tQ+9=6FO+b2;qd=g`LCP*Xub zs9`|aY!$b3Fu5Z~nm`(8p^5e8gm34$2xUzb#oSAYX+3D{|E$); zfttlRo8bz+B&q25Dl;Ds{FLkVT4OQ5SO$FZG%bay+;Cvw%kM%Ai7={?tG7wG5B4B6 z^I>N_uI?n?MSjLmS(mEvsJ1lcAXQa&MNnr5LaL!U{POg3N);U{Y&Hr0zp)4k6Z(Xx zHsDD8B96lKHkKzK74mvtouWok{_#uBp{~5KAXR&=ovIotY}`$u?f#OWo2j7dd7k}d zP?3pqf?%B^*ofqpFdJxxjbzx6)h6H;Q}kglkm(3C8h$2j7*L_TfgQVYRMpnZyIe!K zukJ_f1-3u_4>m6UHAVl6f*WXotzUF`)oV!hHETA^w^9P~)JV-}LjPH3GX11LR(5r7 z4rAw+EO_2oUgYQ#VjA&Fnwp|;r>5+0;FtFo`6beumEm%yB|73u1~pw;Ae*`j&_w$R zpEW2gjmftufPmd5@W`C9e9fybdE}I$DxayDx^>%MrXGilWSbj_Y5aa(L+OVv(P1}| zq&}j;%&LHQ+u&WME*(sI%@@^-hSk-yqFIBpF!V!$57H3`z3`>**<61}n-~o56u~<^ zbFfqH7ZLQs8 z(6-QLBPY}_Hepg*Wwn1d)D|`jx+Fh}G#o~PAr?4%iDAmIV3$3jH*MDH!@Dto=EPep ztr-rG*O929Q89auYB;j<&Zxt4S9?;n&;t9fCbxY%u2cmp{w8v5T-i zlx6JoC3TY#@6GZ}?55~@e93b`tt95Gai_)Zi^yu2&&Jr+O?ZGVl?(@H?H`#OpQ!E5 z)IQWTgEq!Li}0A-_wv6+e`w}gV5jzEiVg44jkkmv}!U3{vWcfV=Pi(aH+|bK{p*Ztemvt?T(F zo2cPCH~B7}Zrh26Z01$ym;7G{lCWu)ef4hNppF}Kvpv7K(`KKiOJ8-L)j_M)&q_bU z5doe1)iK+?DguE1V(GAXwNJ*<=`#P&O{~PuPr3bMo?87uJFrYBmppG zkH*xxJKHD3y31YmS*-J1^Ajq%m#*n+fglnyOljAUq&4=MqYYthnIvVI554NCYtaD% z6U#?FswM-PrR;>k2lYYIEac;a+{^uag@G!RHsfXfW-3Mw%_FNjr50<(3blx3wf}yn zBxAa$bY?MuSC9g0=z%P`=_8XCS+7r3{TTlq31dYtNLD#9EpfxNY$|#}1;P|lO!anp zKfhRd)qu%o9J|x9QQ@P^-F&F+Qpn6B&^eB|XwRt!d_LR`XH%@*kX-UWbBQpq0fK#V{Vt zMq12CcD<$0Dgv~`aX<1-Yao^V?_LdH))4eFi38>f7I8~0imL;Xy-7|N&6r*vsoau) ze{mj!W%y$~ZfM)*IY2Wr<7bj1MjXVr;N{;+Xeov!om~pl~_Qg`r09rz`>Z9mS1%@!I zNWXHd?4~k7PsTpm*OKkwH^J|Xq~=hNR`%YAWv{P7J_6m|=XFsLU5X7xL0qSX8%hrU zFM3u)Ab!6?AE#k$*MQ?{m64S}PUU~l+E@co4Fh2?i!1Qd%oOAQNWt2n2PnlHQX{!$ z@-}8BOJ+3vi|JWOW1x4w<<4fzvs}^8Ug{ND{9C5havW%6kp2vB)B7pzW&c6VxEevN z670g`|8Chv&ax25aUO9_hG~s@MV9~Bv%g2#MV<*wv79MRxhCX$?@mi0aw70J(XfWd zJNP;}k}R3|AF|$!ZQK{3*TE^Fgna!ZFTW8_(IRo3j`cHavy6)Izicbq)C}^X6JB!{ zS(h>IJCK8bhQHG8$G30|B-)=@bUq+pz?&_?c;g6@-~QOki< zuN66G0{dPWkMXe_N{;(4mQTi{drAsY*%pcZJ2l3q+x>cTB)xl%v+iu=<{4Q}(g!yG zcT*YCr3V9v@swuISfn*6sbU;i4IUEbNU^!uo5N+iY+4G#_upRT=KZi12hlsq=G|gQ zLp4||37j(S+OileCX?il4VA z{D;NMJ;I;s;ZKu%rkdKe78PIV-XXquV4})Tq1a9`(35T3{MSwH5P)m~1v;ya_SubP z#`UP795kpqH8rtAdm=*DY*KZn_Nf00akB}wm2ZypNa$GiyPmmI-p{WzJVKj|MrA>O z1{2UoOMOG(Hr{S-MTRAGc&$skfi=Vo|}|;9fZGif-p~VL%#FlFe({Mja)3^#m$J zbmR^w8pYu?t zE=axPnBu*L<`*pH{sE>&+D+ZqIgA{G+h`kHlWT>$17SoW`zCLmWu!+heN_bY*Nk~D zCvcyj5h>tuTRJ^2vEG@CME8E+29jS!U~&Qtv^P6zQf6Ze*&{^oR6APFC)grc_T0b* z)?_C)7W5Z^2+(xkIiASr!%({*vqpsJt}=n@tNSnr(}c&i4;*2p13&^Ebu|C9AlUK< z{v{M~p*KKb@QN*b5Q6|hipR_TOi*n9U9IOW(1l+bSeN1r3ZX8`T-3e6pi}` z8i^ptz0rIxTLh+YR~x1EB%-(%Gn&da)%BoCBncx1jSqNwX&eEFI-A;OD;nU{cy9L} zR}lYn7*BRJWBUe8^%V?UnpDAkJx)-c*1W@Wwa>GFBCn&|laYUHh+e}A@q4K8X>s*C z?m7WT!Xeu;+8p;1|2sDlha*ff;V~(#8h65nDK-tZjVH9y=fZuMcHCw9$TD-@GP!Ep zn%-{}rR=jazAB0{IL;aVczzGIX8pxe(U(2S5!4GJERfmJT`p!R&0QtYT#q*Zf~`e8 z#p#F^)A^zGwZal|vd_Q|i!CHsa5sE}*s2tdYsZWbhp}7*Ms7M$zZHd$%HqvuJw1bH zh&9;p{r-NGt&f1MiYVicokBot0}%Jj_#ika-{ztG9R~!+?*0JZt?fiW=<=|zMkMoB zaIjc-GMwvjLw**5ra8JG9MQ35utydR)gWs(a1fn5{dgvg_%&(Zn~NN(gwGJ4Fv~k* z`&$oDk29dhtBqrMGX1+5ba09%)1ML%4ciH^WMlR|o_73{2%M-vIbV#VIFTDARzQG z+$sz#in-L1JnP`cX1b@$%K5YLA<~@G^=UD%JVS%W(ZNKDq{rM)T~AA_V%y=p5p0-3 ziSEVBK>CC`Q*RZ9H)7++J9_i0iRsgOb+{cPYbnrG!z7+Ljh{l?JZI$PvPFDIR+HVE zfQC68mWOai;_PwQ-ach^wLdhpcnQuYFNc^QN`nJB&$Xcf-IRxLn`etpFCyt!pAc}{ zXdLzORp1gzvUn1`^b&C^?qCPF2qGGYPJz~Bc=Bl6l!J)W4D!n{R5AD3fxU+-aF3R5 zCf)|MYFrCxm&b1Yir-)b97u2m3U6j2s{0`zSnPcq%-C=>vl5YlCQk|*P9ubbLh?M) zK7rzCg>YJ)hsBMZpqdFfki!HGu}}-zg>W*0$4NINC?^=$XJc^YC^H6Mfnu?Fm6CM? zLMo=VrWnPt?LP2|i5i$?4|`IGifSJ)VsOT_Wa_bnibIn48%W<)4L zx#KQEm^pH9n^a80hcu{;IF|Db3D~uRN7Extsghx8g*pnvBl@QCuwR3?8jM9-CAtk* z1bJcU~!A;+ISz3G5NF$~R$A4x$g_+z5CIU-DLkVhp9YRMn0+&dS) zU=Brj$;zQif*_BvCfN)6(Cfs6kH9JX0<(YN#q0=g0G6{0-7)(IE^7No?2+`Thf`fY zaLZxNKId|p5DiML0cm5o6+efrsJbIaag?D235T0<7H6arA;}uzIf4(Il()R9;7;v= zeqwGK*=Hj%WvW2qMDe2y3cJpG&H7OB`0;q3r5M8klj7`|u059lWZ?TW{>|fn7k30Y=bfN zs3UG+Q7KRU$6bZQp<5Dddc(8&cPucNtl4Mrv(H+`I6v<@Xb?p_!1=j@(B+jxsgG6P zzVr|%9KAloerVe8; ztr0Tm`Da;aPF~D=WBbgFb%zbjCPcs_esQZ!ztsCq&j8ETelk^ofy3OR3Pmogs0Pn- ztS4)AUmC19N~9~_LtyT|uIbiX!Fr_Ym8>zEM4e8dPREOCO}=K#&x{CTUbjjT-+go1 zPRnUyM|+Plvo?#|K(>H80kB29<{o4ue;;wodMD{^0q?$mr3Izz@pvx^|*Gj0&l~7`6qUD8f(_OI_%%S-ZC&dtjISmWYqgo z%jpLD;RVvdYD~uNg({zEAC-mqL@A{r=QA9ipmtppOJp-dLg#E*Y#|JTbdfte-6Jwt z@6(0B=)Z+&AiC#xf{v<>%d@RXYwZjMRx^BpZXgM7x7vwL`~qXte7@7O2okjZf4IZ_ zD#n-$NzvlT0Y-9Ymv!M?H#j|4F`s&KR9r=Y&3pI9-@T{bUSDfBKk;gO0_#JE*ZUqW zzV2z2zDkm!#GNqy$E6vvCRtCKU@?sBi&Lakl00a`$-4-7P_#vfgp#N#nEf8H1kPCe?-8IK^ODog za5}}iFLO`nZ$38nUPT_@GUq!{jBM5Eh3UXLxIeI&S^fF|H{S>-w5z43 zji~{G`%RRO8p`WT2!8D#24=eTK_JH7?Om)L# zL_C|MghOD@8U4Z=tY3+#Ek6S+=T_C1I?|=JnN(&=8C?#eR_M>AQ|5@^|0K5rm?>KetH) zl@i9+(1}mtZX1J(1QASX7;g;lSImBiBC`z|JGd(M5?cYJUv8-8UcQJb1d)50qmO?{ zNq;*m=Bu2TG6?r|zPS!v45dIm;uqQwwq&Td=xKnqK)otd5?$NF=bC#TLYLvvLc7aw z2WJInVFAO<<~=W)gSr}+Cc6%s(+;3-nt=qv&xi2Qer|%GUGjIMUe`^m4srtqgURs0 zFDkbr8PPvRNcz5PZWb*GTxZx1FG9d`AZ%*VQ|F4cEKmzGSoJ$!EdNY!h%308a)i6! zxd%|NNw%L)0pmGBV53r@oeNieJR6smG|7!FE_kU&?xahTq8hY5^l^p{H()Y!U7BYg zKR{gA?gwK_eB)%IF|ERd182EDb0f69g!UgjO6AM8fTLO2 z2MwlBfGq$}jONT|BXs6~$&ue;*Fge;+;w`|0enb0nZBxX>Pgp-i_LqONQh(el}R=M z(ZwwiSl9f;t|H_*stf(*D%-VOW2RHXjnApw-n&j^GE+zBRxnsgZ*!in}n1ywDOx;MQ zrYqk|N#$kpw3B8S#Xn^H(Bp>wWB?K7(~vYjjl&g_^*TxH2`k6y-e2ZiZDb^-rYCl( z;@bB7+?Q;~t1ECj6)^9eZJZ6c6?l#-m_|SyyJ~r!7PNJvNjuwN1}JCBtF{gXKI%NN zxB~{Oc^w5f?O29cX0V*V9iOuf27693oD%uAT51P#q+*jPzFSVbzNgvz#dn+z|4dX6 zmkW1O+;~%^PdC|_mwDo}KK-@-6>tLGt8vmeqIPu=9dnKd0ey1K^DBOe%*wg{C1YpeWH<7VXm ze+@D~dG0uMQnewvD#6F4*_%H`Eo8VPeH8;8hu9oKHmNZn*_`T3WOp|z6iTDLvD@Ol z1>Myae5!^4swsP;n0+?GFTI*S(7VhcJ%4v3|KxKGAus%q85M?<7y6RX76UMV@u!U6 z3;v#~Vby)JJXqD$mwbUg^D7j&Hht9zbV9_{rGsu9;$F8>#n|g!N)oT-v7%?0g?#>Q zwIY<;qrnAacB8JDQiF~M+jt#}^&K)e&J!M7b=*Iazq|DWx4td3)2{5G7tRe9h>R5N zTRQZTc_yQ2Kp5N1A9@z|jk{=*fnLmN_8xL4FyVFzx60Of^|0lEMPjpXVKQ0=?@+*K zzOA;9;(D1zy_qU{+SH?#Bv>VeZ4Ttw7py9JQ*EJ*t|I1>m8ICx-`QusN=TXJ^~8a& zyW)^}nfVN?0WNIeouq~Zkxf`9NjjxRaPBU8Xr~tx7Oi^apWm{nd9n-DVhr+6$E$QbZJ`7jK63sRPQ;RzDt?K7byC zfDY*Y_D$HqWbFt$(+&2hIx1_z4iDx##qG1ln)K#)mi))qlE#BO6Mz4WZTow$jGqJ7 zhbE-FdOfUfJ}}}@dPGJXt1P-`6iH9QN{Q&qQx2HD*2}ID(1|sLc4mu)aLixEkA=?G z+J%x$hMK#WK-+wi9&1qxw@4T)??pAIIaJ$+A*C=&-p}6H3~KAcp2)XI%+Ypf_FUw~ zQ)G8^5`ujn7ROJPU3h##dDwBtU~W#X_56@9R@rG0-Q8eg8&H0E70&ec7Lb(_re};Z zn)XQ++HF`wc@U6^K*iClFzk5z!F(JTPDn_)amb=h%#?+d_Mr5$fwHNA5gU-RMxh^UXFyzIWOtf^Vl2d#^|8~Y#9hX*d0}wa6ht% zj)6}o02@h6p~-MvF=EXSrBE*-2Pt%A3RQKPgk0guM|@YSVY=aGbau~p+puHsX&>|J zIZoMq(%&tjzUFQ9mNn@7gj{m_rhYjA`T@;iFfJEn?b3Bp! z2kE>Gd%hjfCqh1N_8qR{e3Rb8McsN`z2yf~7VK8`FsG|sNH$?l+%USgG>tm1Sg94X=<*m~BAJ`bC}_2JQk4 zoDTf%2C6s*Gsl6J79&{)gi&b6FoEK0(_OtK1XX;0KbkvmXZremdq8v3VqD2EHQn&! zA}Z^XCf)S3X`D=WM$^3%XH&k6O2$%0MYlXfi9Tq3oRBv_dKAe5{*|F;Vh4#rHCaj8 zE?dlb99(&bHYPki&D_Z-1aKMX*~v+>lHI92q8lU8iyAA*hSO4=Oj2TGJ0gz&zOXIk z!{-A-9e{JRSI+CEF%eiO4QXTL$h;>LG%!4O1IzwlHsk8Hx}ENHRvs3c^D zf%Sycxhpj0Tdcq2Vo;xZQ@zEVFUIf!I$fID1^x1K_=d;Yof=a#GJ~pnE&ZUvqPlxK z+k9Pws^s_W9m9?}KN}>d@^xds6mUQi<$$6;z_h!PelT}ce&&V7+L z+2vseKFISztpB5n1f~}}=biTg?~VcQB6(v!F6)fj*u(m5x5Mg;=4SUMrYMT@5h=-r zefFZ5Cfvu4IEJk@QdmfDzSyJ}d23N*8$snaq4+fVDR!`?Wyw=_qIWD*hgE zg!fbU?{7gm4-4?!2iQ)Y4<=?S9RWjF1QP-dz|4d7j61j_?EV+$(DM&qO}H}w?B?4= zvCJqls$WA7<)Y2kSTqbK*y1VV!v>bWE;164UN}0|<=m{4GtP7Xs+liVaQ1%R^Eb^8lLYX0q$8bK2u|whYc_2v{_34%&?)eA;s}~U%h37f^ z=jq0sKyro{pX8EZ&I#RdLZ?Hgjxy}ElfM^vCugr1{$3WU=JWF+F`{O~FrsKPz~z5) z!Sa7eoPC2A_qBvZK%F_Iib83!_{2T^<`K`0ak0WGRt>N;3Z&PVSE6sv&?5xS8Re!XMN698*57fxLbOX>WjDrC3j1D##R zR-_)_GmG{I*{}qiUX@OLmX7Ud>*=B|0Ttsm&*0-E8O*Q)!)JxWQLVIG?KYH*btZ`5 zc*pJVnTz}F?CLFqObnXx`QMj#p*J!Ax*~S|T-hZ8XQrAema&JgCx*#j8kfXH{^X-~ zMrSB_mygn$?ZwXStTY23oVSC;PQLszeuiB9ll4E(^d(~#=xIk4sAusLFB)QcmmcLE z$^k-K_YQ;|z@XFK>%y(Okj7LhmQQ*3St*0%LZ-5))4Bh25PAoeY5W}(39w__^mKQi z*@my)^C2-DlaV$LZ3mx0_*{tEDO%ny7^ULo$_>Jbe3*N2O;EmmBz?<}O4ALqgNH&L z<2;$zTSBj$QAyXHVsgMPW)JumkYr@&^A{Y~MJSM6q=0dc9d^JXm~US}W=IR`BU`RL zpbM(3jJiY1HH=0Cop1RGM}jSM?!Kb^fbt-&E)DuJAGwo*BnG&C!$LG3xhwY~ScWfR zSrpX{Nbns>U)}FW`_S+z-^f2$*8>t;(c~^+JA`52b3LEWjef`-nZsZgi+)W~wg^F_ z;5YuIUK|qHVroe0mS!U9xeGP^~m2ty*$4qsGGphkp1X zEj0&$ySJ@Jvrw7)(IANPa;g2*TNG_kPG|2&+Dz!|3h2_#G*E6u12V-t5B(T~;#TOg zbRbODPTFqFirhr0r&Jx+HIizQ{%co1;hBNO-JrYq@k)@^Jr^Ba6lTDleOzFhIY9`;wVyer>YCeG^%?X&_4lQIe!!a7cd^={*U?W(ZTi_jPK1!>Y)bZ){EpWGhOZx0fFtC6&BBvm5tME$ zKkWGCAI|rz(BGI ze2s@2Cba&dK~9Zv%VhTcjM9~J!lk(oEQ$PzjlZ{^+f9ZW=UT8I`jH7wu{2SvzZ~GB z$YcNeH`$V~K#`Unzkzpz@6znvsP`W9?vUGD?GCtI7?7?k;oX>jqhwbAMH2K) zGtfqtlyS}J^bcV&-fUwJV7&#uNF+khx0H}~lJ9@yz;c8JPjlUX7Af2x3Z#n!935r( zQu_@6V9Oz%pRn5i#mU=Y8anTCkXVO=CTp(WF0*Z!h1~PE0KethPW&$P9kt<5ag6KtgT98J38*VnP0%BW&*Jif^uR+D$6h zNXTQzp|WgcK#vELgnrT}TD)+j=9^*K7(Z^*2_wLGC3yS=)&YYA1EdT`K6QlnX~t9^ z+OqO|%7%I&SJKna3AaDS21E^(SHWQa zJ8s@uW{ZXMa@l1-GuoKcnw{RosNQ0rFAu|x{2~{6k^WmjG88`LY)k0!nI0d73G_>7 zt7Uq>fn`6m5EqME2k6&m!-UITR4xvX!mS;4tV5Oawt>3oh7KteC&`M}x@8 zLPgu7tO-1jl8}QrYVK#7?A%?}mC(})_+Pq+7Bg6mhe;VeCP{}4gv7gt^}G1NHK{bL z6oyBA`8TRAH0tfYK{lD=N7m}9uu{*DS9rRt%aDMEB0nRR0q#90|A;NsFmBR)k&vRm zcbR*k11$G3HERl2s=?tjn_o=hsL=Oa{xLPwK4}YZyv=5)180VY1&kR0wtqpZ&VjG!n*rMy7`NsN5t@N3BgF`Liydp%J*FE5MLxo1 z;C!F--ObP!^PgJ2y4Aunj2@*8s``bC?2<{$Hp-lVtR=dwA2 z&)rw64Sq!CXZhGb18~`g;ED76z9Y%f^hzX5K=L)ASrPCR?Ig|ctBiHs$>p9O%lWL! zIz?Ry0nQ_MNqWuO-^yn{ULgxGsF^-W=ZT)NS6=dpJ5ta^SIfAM^-?@B#n)zM{6+Gt zTtd$-Pf2uiJ;QJW`hS#^I$Dy5=MD)?t^W{tr5Z=#*euPY$Hd5Yg8eEVqSw7JSj#P`5+nQ?eU8C)#O9bvOn2 zGX=hoXAf1T!>udxAJYt6$*}LB?=$5o6i%81oigg|oOms(N#P?D!oW;6_3YZB>7$5gI>uZcobh?b&I!e)+Mg zb*;xCm7m%o`&S1)+ZNUMgm$e>@kOLrUBI@Vw+C!n9^BTN_Ge-7%+-V_7|-t9(4l2|UPyUm&C#uqHxp7|c4$|w$$f0ky>D05*+2hZZ*1vMg}>Oz z#0<)rs~a{HRyPRw7C3Y{qMPjOsZjT84;GQTd&H9X=qn{;WN6UAB+ta33*y+^PptYa zt3E~obKX{B@p%E|vhCOSk5Rzfjd6H|ZlF}Lwnp9W{M&;f4^KhEr1Zur7<{5T)VQVa zXm}JRKCrzjW$<0q2q~?IzlOO@8wUfRwg(L;98m1rNVEq;z@* zFyV<=e&Z6m@4_Q~Q~VK>d%w2IMY3M2p1gEvV{N4FmXTHW$0>Ci4(%M277w#H ze{M4(?mmf6u!OI;w9C!3>5@WUsc@Q^mL)ZEL_?U{`*9e?&kBcGqiH9>^syT1BFAc|{3=O@GT>5A{%QtGOd zS~9sBUOi?vQ~&yK#9$1a{p7{)=zfz=sWh$3rb}}%PP#`aq$pjkNUO3HrM}OK5&D-z zD{W=l(^RC&O{=(yH7!q)AAw1TiU%FtS8P7z?x^tuUqOqj0b3yp7GJqa^3(9-W=2CS zldE9Iq!8LM8Bu&mT5P0cqG+89Ll}u^wdd=e;^sq6d9P-T@SDlihqtbeHp)dz2%}=o zH^5^JC;7}O3|pZ~IbxK^Ht1EbcJ%kpi~V0vG{FecAE zVOo!Q+2^g~k%c&?uQ0OGe7x#%24HKe-hEsLr=-AHuxA}=wIvJ_H@-p%FHDahZ25Ze z{h^Fncz+b-TN^2`!w1J6~Gq8pBdGoKsC-N8K`nmG4DVnP^Irm_m;osITMfnQT zy4#@hVjk1~SQUb{EHnXq>sW87b2IvyE~U%F^B2OoFTzxjv@3!<4E2U_afa_6|F#+N zv@o=IpUc5zn7hAo0AVmEA6ao+k`U(MOGwVI!pD!#3~+GxH>et+{{<{T)^om{TQSQ*JpYgpE)3}=!iWrREi8zh^YUW_uz1ow znkB$ka)mx@+pdb`SYYfW)~_&2dB4=7TaMEAFJ{?Y_*E`i7hq zGn}Z#>@!{OvG^0Q`;^HOogP9M!?r`Bn(tQPN(qdL<|NJ}vA-61fYNcfJ6K(G`sD*H zn}vx^e7X19Ss@JOL;rnzEIz}5L%4F^OFj8fu)cju2rvu2Nb<=~%tVJw?&nWHn7#|GLM7|FlkbTUcpf%58kML5=Nrvggxt7xp zPRym}8*`?&*T4K0+fz1CuoSc0b!I59L2IsGSDTQYE$?V#fy@P;JnGU+%pB2lIRxtL zQm5QvNQ_d**`a`3o66^_{&OgBL8oqNR{zH+;C@eA;(x3_F1%&0E~u$=DU8@lbNvX2 zDlEFkwcZhl&KSg=I35}dWT&*kt)D-(wz^H~tS5t=3!^?5jPn}0OD+3Ik`1E~qdnj0K4)7=Ljkm?;L8~uiT zf-+$Iw7);A!q_uTf$LENMBwg262})uRitMv#1DyK?8DPdQY)&&xL%Wk!f8$_b?k8p zIJXvStPyN&Lr40_BCdCbKq#k9i6u}|_M4hd)Y80rs6&zLRb`iKMA3`zn} z@k)yt!;6rq#(-;`9+%_h*b3mzz^Vd1pI04Tf_ci#4PMw9WFo`LX;wiw4~OuDy!dl0 z9>(xmWw{~hj0?gHLweyytkU2klFVVMtSuen;}BnUoTsn9O2aB-@b>~YlAe3Y;df{2M;QFX#~@%>8kq3j#EO1a&Thuj0gcrz zAo?V35fSC;ilESLU;7aXtN17|2N4Llb>DGN&_Pj1Mf9;-pTox5^$4B54vJxNw0k@w z*|C(b_?a9cV(jcVT!=uqQ29F$G0M{gdqfZ=+oIlz;ZE@if$!kn0avAJ*OL+Wk7CB) zX?yS47rbn8SGYLFViQ+2HsBFqDIPxEbykj-K?ZF1TEv0F=F^!wIXL+6aWDfM*gPDh zIXFZ*JYU2?qiHE-H&;-{9;Li;%p0V?<9L(F2A`pGnEml87eP1b@WW{KmIRZszLwk+ zNU0*-j!fV8KBWBd>4xIhaM{hP_2nXmk_?fhTvbzQMucdARq;Z=u?G3z5M_1eAyAY8 zI=}w8iap-OaV?a56)_=4Pib@-B)>G7}og?Rf^T1NJ=11;tm(d zTyPR=EXHT-qkR^(<(ia?TLy)p>r4=0uw0MVPSbyA_sY(XqZRQI3i7Z(Og41>S~9;XFNqS<2f;S z`Eh22@d+N8x5ZIaUxj6F1e_U`K{?T=C4tDeAq2{OD}cK^*D!@gPypb>3q^3C1x)Eb z8`K;x;6*zEJiK5T)Jzie&@H|K@W-W@J(jLMzrkzm<2h7^6hC5*Y0^}_`0>8UCrb1 zCuj}mL=4gD9yAP7WV-GMZK)K)d7+^Sgvbk3eaYTAbVsavkMd*TxP_Yljs;v7#DZiW zz^57T2^4^A@*0rWUi-{SLHtQpt{e*YIwmzWuIr{XAvHOGS2yt^%s0)Pn+{YRQk&KB z(IEFH=ni>mM73*;PQ{AnJG8}H`IwnJ@Ol5-xJ_h^QS~yALF_M=lbT7LnU!VIMdu^h z*5y%b$H#pZq|UX(s^usxJc)>>PqhwF_E5v8X*NNwQ%&u_n7h27I&;t7I|I2z$1U8F zEmQGi_R}Eh9s1lm)pIRftdjaz(HNg?jWlNG<mG z3-?+@@MQctarq^$W$=k^1t`6AtC6%dSs|aQ_(xt5vu|*+w>X={rq3GNGh3s!8#`ov zcv|OYPkS#&ZS5}Wwaa-V;JTg@knVx(-RPnN7VYWexXXoXh2GqtZRE>#^>$#1T4)vn zX3qy)cD3%q{L2&Qws^2|0(s3tm)r?_`)I!$awykxnTv_thPTuL^?AHtP zRCT2xT)EbX8Flly`CE_Y+@E?K&#~;Pwu7N$c&GDlT^`Wjlq? zmC3KKigdJGxP`SItt`psxy4U>N%x0VUGrEhyL0U@D<`I}{*RKs2G3IKHZK!z!>SS` zH=<@cc~5B3=T-LJ6!$6k;LzSa+bMVVV7vOtBZEwucT&dQwM+wU=DZ4Vy?oBr=oHW0 zYAf~|(9#VWJbZygRnDZBoqXk(Dep;V680?2{4leD#PCct5X4c*@tH^CuU52%BH47C>_iYWAdL#uT-Z zemJjnu4$(D{kjRYRcJUG{Pi1*FX|51S>kt`JX%go5Tn{jf#*cMCv1l=LI^$S5GJSp zM1Gn;Zp~5^zU*yG<%x9iEnE)e#|JH&|<&c&Xew=0O_U5JMF$w#;#t5hvZWhVsc8=AjxT#Rk(A_DXAh4Twq}uRijTAi^1&P9uwU6oY$v~;dfh_pmVBHF@k2#h zB%n_9iI~h7q=Hm*5g5qz0je>PdykCKd*0>SDGai80rxXb(!%J zwesWktZE6Nax^{tICckEDV%#O{+HWDr6(f41pV7$ zqQ*3@!T*W9HfOc#wO9PgqDZv=q#SClnrjkc3w1;iU8SsJeWIBFBh_O*^?E?xtLhdr zz{s>Jb;IG0fvLC*)~+44QW+;aR#l3wO4JshdU~<+T%*%!BldYoxEJ!_L)~C29aT<) zbvGEJeW-&yefisEm{c8J2URbYIYKOnb+YQJY}Rl~RT)|~qtg0Px z?IJN%iBf`gTTR}YJ69afn2HB*t1o{`%v1W%AJ4ctX`Z^qpg)*S^Cj-at)x zW19-|{Scwh>cLqFv!}Yvxuz?8UZ*q^P;V7X)FyQh?5|8_eD-H#{yF3n9}pPb;%c0-UZo zw4GIM^Y>)>iuh`SBeE| z1gBzYrJ*8-JJi9m_lO~Nh|N_wuFN$lhyPuT{tHfuq%Pse?nFHmQqQ2tak9CN_UuFT zDh6H3t79|yLaSqQ+qj(mt=LdT7v1^vjd?*)XD(Cxa$DY>wxQ0LDyJWEP3EkE){$rX z9ELZoCo5U93}po-pSo_$3o}t^jLevjA=*Ie*`eX|?Qw3sWu{2<`pi3_biE9scim`% z*R##!)vbnj&Eb~MQbKP;Oa%j~hK{hx4v%-y`!(EBm-W8k4$6Fn9s>D)a28kcu zwG{V+R9wo!Z{l?&KCv2hH=JMf)u&~O*VS3&ebb&+lvy!QFaI#Qx5{~z3HJBZuXRq1XpNu9TDw)GUgd>zLXMf2BPitY8pI*SOUxLbmkboh z${rhS&xXC51N9KmCSB+{;2Qs4_v;gM9Dd)%$JK*ZeV=8UOw(Zz)rx(^OsGHW`VgY{Gn zJ>((4qc@LbiKH>|5-c}CUgTCThU>T&U)OyQrz~)7y86ZHSlx1e+GW=^M>&AK`Xhus zPOgp3#`k(o`bW?+*NeA17WEGqb$7YH{(>O&>={)ue(_>FI1W&Yt0IXKh*?gIi2U z#hqTojknDGolMwbv|Jy(3Z#d_C@B6*qd-=V;_Y0cH(`MxT(j75KpnV83q`rt) zV7i?%-TTI9=PZ`8eq*2?ID8G|)7=;fV8P6ryi=`<`S{sC)?uW1Sy=59>~Cm42>{5k z&{wJHWyzj-+=+1liw|Yq z9$&iJdXImJhCT|8uU+%RsvHWnw_lM+Gr8hqF|#7vpiN}$Y)WDUMu_J+SVpqn{a^7$ z)qPC)^l-zp{%UwaTZKy84dkb5Wj)e{29nhvOvNQRJ&Lp^YDX|5{ry;?aM^sdz4a|}n5(9}0q zyS`}uAtRZ!h!NN9&rg^=NiJboxEmASzO{z2EGlP~YIBsMWAjz}WHjkzpBSP`m~jsS z<0JCe@eA`TTT||qrREe|wUgj9Mnb-1V6Gu}*&ggMx(jm1G5d z2jS_g&v-LIs8fn?0@)UE^5Qjhj4w<29zSE%Qfr_5XboW(wwfyRigG-@noDqJ#0827 z`7T9sZkjoQYGY5ncZ^_4zF=v=*k-SdiMscL3qHmL4^Z8Pc#2>L45a|@vdD(P0`(`| z%S%CHcxs6~bsFK`c1?PU+a6xZ-3p%(DroeoDhkPY+|TsYZDo(ACe zZ5;m8?RC>l6L@zL7)ri z%|Tl8>y|Dq>zxV-PBB)!&4?2)k4l?W^6TB#zslPBQRSy4me2jimbJD>V}~?mR>w6w z@a!SrXhDN}aZE^`&qYUQe?)t&f>vu1(rR6YaW2w{3N=S@MZQ{vE{+!^<6C~8#Z+yi zE}yTaWnB$Eg7}-TZ8klYMM#SE?9x4wBzn_166dHfLR!y?^w_+nChDoK^JjbFl+LsL z3OP0U&fH?h-(e`~fE((OKEJNphUaq)#)$jBw_r*8{%x&##vTH_ys?^+6!|CT{EErk zSdgB|>Zvk`T0VG-JqZZ_+tnYTxPd!0)>6U=mCm^vzoYbxD=2_&dCWqY6pv?kgtqY3 z$rEcEF<=<0Z#hG%L>Q~GJ{119cxc^wM%+xL(D@#9l(Ik&2_OYNm? zPJXPi>JVsZ8?kV=DETYD6cIr@60GMuY$Yi;ZGymE!~=Z{x*BrttfT70%^HAxZwDYT!qr`O^v*=GUgS$z z75DkP+pCvHWI+x%n*Tc>rJk&b?QCrZTo4TO?ajl%p4pY;HpftXNdJ_=--7q$eYj~Y z)9jxBkbH;-l*cIu`FY)9++Fnf z6cuqRFTRAo2`#_Cadn)9+b~dfQZ;6bP_rUoLhKKy`9r(hPAjan4bH~W?uow6Z1r$a za<&6}>~JPaHXyoLR{PlfE)t~j{>xUx z$Lw&bnx6He`H27r%J3xUuGjfIR!t=fNY~xaX=9})4#ZvKnr18K~ zUeY14&_GUo(Rs#19tw`b(`wo`P+z4~~J zTRfd#6tC&O3-Je>)3(ql8{|T|DxE9{L&d-U^`CIyA9Zj?vCi zee?yB>FxHrL6vFDI1-Ju!>e;{VYq%!gB7i0Ut-{*us!XsK^hps0#yLi9j*TmR6Q1) z)HdY_bO!Z}ZrE6B5E{ppU7OQ_w?f2wP4bcp5S-x;b!y8_^2YVceteMLC+mRgO4HTe zG3bW5g1fBRmHy${Hg&Z!?Jt_;IsV+)@1&)V*3D9=bZZDp#5|4HfTl|3 zS>*83{6?m>IHE3^sS%|uXIcTdXo|H8-3^lN&*>iY@PCKZ8wy~MlBGcD8%y`OjA4a>S{VVB`tn1rxx~dEJw!Z4eDfxL% zLW#<6Oxax4G}o053Fjka%i%cP65VmX{!B)(Q#4#PA-+uHmcFjFDLk!ob-V>AMT#%& zAk9LmHk9Gx>i+?b*>6unGj15~?;~-{5qk%1#s&OwGbo5G;mtO}#{f6*6Bo)1M=WGr z2oq8{8%sH$wz21cFNl&i%!0z_kexq96Ll4#81JN2fHm90j3kQqoTS3n#MAa%F7_I6 z_|kcW{9L)6L>No#!Z;t>VocE6Lxv{vuI;+D*Pzzf!(?CO#qPSrZXs^&P>=&Ymzbs| z)+Ng|mBa^^c**?pc+J~b?#sd#NLALi&xZH$20(YcQ!}80u2>sUS?8sb%N%e3^R;kX z`u1(L1l+I5tpD_Jr51?@xrlcj3W9GfC7PK`xXf6P8+LzX+yFkY8L;0iJQ(T9(G4h7 zisEGXJnA16jAyj+q3XtDuBpf-H%*0ujS z982SDqykbP4be9PHiAKfJ|%#ce9>1#s6lM23V&!B+{JJ19K$3gSI1uZnkuS}+j5v5 zwg7E>?}B6gyO}L7ehO}SjzgG6$I1sEtGYp~l=Wsu#gurbro98h=$X z_;RUvc4z46eOTs$;sxtiOH^3Z8Y%4tEL0LDDBrrUQvl)tQQt%}seb~$``FKW36>Fo zs)234L4g)D%o46TNQ9+|YRj-rAN0dyu0@2kNHMMZJN$rk-3Mzw0vF38)H#Of(@`)+ zj%+yX1~8y7vrcwK#mbC4H*xX?(V?hu%Wy;hW4i-tN2Pgn{ZFDT^Eqiih?L`N+T8&Q zfs7bXSWUKrIY1!XH=zE43|q|3>}SNG7=Tkda$SF7ZbgO7?*AO|CZ}V8 zR{Igjb4~ksu17|%jqgCyf_6v#2{E`46K~Tz`T_Gc%N$V3HuVUcJSuzllE&N7bmwmC zq{$=Tzm9!oZZ#gxg|+#}3RaL#;M{GebsSK)?wAE{gzXsBu6J4&VGok_b+XyxI-FP7YnZ3CQpV%oghq^u! zK2{gc?^r*412alV<|8ktYXY9X_w^~OeNV%TRrQx<>M+@~eTtY488#r>!h6KSny4{r zLfm9}K4)QVM_YkbaR`@^ZhBtuR0(EaZd){v3PeQ4bG|UGZ+do3en2g?P`q4Cvf*w< z1O0iS5q9TJUvQy5g49o$v==l=x1K&5*81|ZM58A#C(*`198mq&W%=6kY=} zq~BJt`|0&`_UYpn2Y|T$`_EGCqhlJMGqsXGAB$0Xz9~c(_|52Q3Lihe=g}G}w}>D4 z&q&=Ulgian^@_!BzFo_+qe747=kxJq{;U18yl*UY&p5jeD4Q(3tK;6ck9>?KycRHY zYbRAgi^<~3ywjhl$B!RdNPM^d`8ivU_k^;0c?b|ad+se-IYhlTAPI+_F&Xx1scvJN*$Dv66!o1|(xF+G9bYq8% zn)wS^_qm1OBJZU0uTwAz z50`&U&%*P8*MII~awL7Rh<6~9m}?~IT10N8@8U-1dmi5hz5fJ$i|uLd*?TTLJlwy` zf7O#g?5`2e*SZ94cB4!-6R)ps^Z>5%(aCqU^uVvK2qBS^1?M$e!@+$EcGPpw&0Wf3 zrsq*tuUGEEO#Z`SUwiK|KQRFSS2ZOJJqrpC?|s!p74~~dUqp?)d<t$Du0*t;bks4Zaddw)8bm73M}jC;Uefb(vD3Eaf%N&G$vMi zcbo;x4={lF$*nc&MCwe3>Dsk`?<^J<9&}e$uQ&8jBwDH`OU^%N?l4;wS`O>U&39Vu z)WqG}uBU-L2^?9+o_wd872O~6v`J!pBz5`4=1GkQ?e8r7t0-+zGt(g-8SX8D@ zD|ql#JCA?r^UN_N9l-J`*}gj>pp6HynA&RSs59|Z!E0x=9)>6t6LFRN4} zPOoU#*>AQTCz@~pj;v>`!q|CvU7Tvz9UdcKmRSdwDKN~okK?2Oe#He)VgXP%Y5K+&`9cVkG`teEIl z1oc9Q@iMCyGGW}Yo;I1gm9r80$JPXZ%vf;k$$kE{5cvM9gl z>txbx=EzPIChXLcHnvG*Goho>1HI~wa(j+pOC+%jV$1`1C~C=_FSfK~7Ju^HwtCx6 zs_;z@ChK@=U93}CWU=4;leMQbf3oLh!||e;eJ)#MiUXO0mbag9#dYNzd4IWEIr$Q{ zgz5!QuO{o0#JqUgBsLlj7k7MA$1rjK5iit?09TIGKDd`#?iEAsHJ|9}if)U|v@()2 zp#uc=#6KSu7~i)GsKJ;a2J_CgpDwOv<@Awy*cAi2BGq!O^qubdaWdrE{8dI_;7}Kv4~*00mMb3(gT+@Wo)Ppe%%N5l3)& zSQ)8bJnm+CyeN)usYzIXLRXUr+_B27GUi^}lEmC4UM!;8XZv(eEQ5#x(Wk1_?;)Cu zfv#4b=@Jd~Q+dkIV?^#gk3tRQN!-bI_iBH#67*XpI95&&LaZnIg|Wcaw_|-MmS+q= z>H){SM`S@JE^Nl~NmXEKPIoIf7;;O3)_oQ!pR`Ut(Jjmx;b7OrKErr zfG|5gJSYV~SOCaNJ`w`t0RS1hxTUND2txO2ex{(5JUmGVQ9IazP$FU!7mbpt4I*JJ z7}qKVkyu~CS<*r&s7Q>C7d_`&Mu|Nq1ZE$oV}U`G!)=UVT9vIwl!J9=HF^SGcD*^l zaUItVU6=9td`F z*`;&woTUfTY7(_B@4-!WqJ8I&{EN7qOpm&*fbU7)>>YAi;Xzev!DieWB895 z#LbJT+6O&7Q~Azc>g*Epk@M-uW?D|HzFWSa!0N#u=4kx@Q4#lTEr#5|qlH<>3(4@p zom9RM?5)nO+*2h^?YaS@iGAz)h#<#YGV1rwLz?U%?8OQ`mi{#?r^YPys7vgZCWgr@ z+8?Nk|KWI&z|O3W)c~g)2Qlw;midhOT)!rc5Ooq%AyD)@sAxl*gE# zXwrKD!<2f0Xh<)i(uHGpn5})M3SQ&n?kFZuR1wxRaS8Sxf&FBsMplH~Az3!#(iFRm zHI3z8LY_U8eFKjZiO>6;cjw}c7T!$)UV?xZ`&6lrq^1duGCN^ypMTe^`ySYdLPK zhsde;rp-`IE1@gbsoJw*L1wbBERhn-fxXG@P!)`&vKk$O^QImgSFx}yMU8kpZ%x2} zt`qNRhAsJ&K&`umB~P#!*J5mG zx*yy$qYi8<1KanUfEr+%AWlf6kgUW+3GCeJNp>J)HxP2WgG@1%4M+y_dr}zLrHv6e z5iY6=j{BWYFZ4){Z6s>xk-^xzuxg4C;R+Y+Kvs|Hg{F7gwh#mg%R+*&X9^=n#0l&> z)Uiha@DN1Iy$&+-i1tLx7;PZ~ z5KcM=fa?SRZI>WHKe;Qn=y=ihM19f%oAEb{%}#M(8!?@iatvZ`fZ1aN_6(AhhY(>z zKplG=L5moTeLU6J5L@y+nHmWxP+1~%W-q^pbc9%7K@)gY(IuRiIMKvS3)jF$G+e)k z^V#``JsZ>~59+h-J6`mpbpo5lW;_H3A0E)2vpJ8T-34e90PSg`fk<79h^bM-gaxLR zDV(H!oI+HvvJC+0v@ER_+63QeRQ zV&@mR3b7v#uC4(@75CiqnEcGU{>&54ZGaKsHflIzj&YC;C)I;U){cX$se**AXdr#H z{j9VP)_jv&{$X&^W?|&1r@`GPSdHW#_5SlG1_XO9H5gkWXEtCAhh4ymu6gbNZ&)&Q z#so`l1hm}zOrv0BOK?CcX6RsuzD5I#T9{T{qlOtZjKh_1QCT<}megSNDXgl%sv4$M z1y(gM4wB)brVu%5Siq>pA%j?NnMm4XGu{|0j4ZaC-i9UbilrXf!OwIU5IoQY5NSFX z2QH(583Rl!OKP5#*eW%0t^Iw~)pC`EV}ve6b&fO0PQ>6-VW&Lo)WbOVv6%U1eH6x0 zd@TZgTU26Uvk;+6M4jWZ0C}e*4=4gB$B;X8)1y^_A@^?rF3$TCezA;X6%D%%Uw)LB zYkb~jND1`q2Kp9ya|suHjA*iP5f}X;IDSXMhHnqJn<+!CIpmI8^PF|qd_t|SnyI9TmcVcDs?;BME#NcN|}*jKDZ zy;1cXHLi&Ld^ujU_P0q!Li-!%#m&Rxg=Jm2!C24{dtNZs4mJ{Dqa zAi^oUgbU##nyg>Kc^o4ex@qEcc0LL*hvVZ8qPwI zcybxz;AYgIX@GH14HspGWb(#cFw3i8mVcWkl0a-`SaK}25MyIW1=V&!WVmbW zmORnIJ-*4#bRN^X`%%bMz*>sv9a%JikRyZNc+t167fXF2K{PZ>q~@sFSY8JR&Y-s2 zy%3K|#wWTz9k!hbO3u)9_K2e1wZM|EBvYTz12E8vEW*M&K|ml!5W zU$jUIw+@!{0%U-@0DOc1A7VxWIjMJX zERY8^vVy_OLVWPo+arc07eoYi7d#TE^89V8{N~QBfLqhwF5Ma5JaTn0I*M~PUeR;- zut9#_`e_4Da|nbNyMjx&OcA2V^b;%GDYJ$+s`4s+t<)2*{k~q!;ZGBrKv7P{Y{)SU z`x4ayw6}Lp;eS#IeqA3v*!VVMb8`l44?&nx1S)oeF=_jIh-6aj%Ocr*O|5V5-;e=Pqz5GUN&9Tw=Sieq2lLVSUKJw=*&wH09{XmL4>-* zQ!%O85Yf4evm2xr>@b9p^EMGWYQ#BeV|1mzgnXX6`O~zFSDS543+%?=aeu@gOFPbi zkW8Bn@D#k~FwWi~z1NzbFrs4u@@@#=$jspoJ$>_*>Z3Hs|BPs=C8+i8rSOY%)0r{N9E^9H)A5aAs4 z0E6#!g4FG^A#c-rR%59!$%hWZgb_2F2qz5j&S;s(@*=PIvxT=GEk^tl6{at5nv}__ z<09%gUTTA6%0Mz^m6NR<=RNL)#HxvOFP+CfkT0ruAWDv+3ZJcVGTB&Jo-NM5w{fCB zG0pDP=2Vv3YlPN|kkQMz!}aj8wRSQy%PB;#d=F%cDj+dwrLq}_nj~5DSL0_2W!D{s zyjzy( zx~s$&^3zTWjdqOVC7oc2 z?D*B!FfvGgtvx<|c4V$vt>+=C(`?A2FF3)KPkfJ?N9!Whik<1bY#fzQu&|yFL%c42 zY~$Bg?&P59O9~Q~+hbCV%8C}sr{77T>e&hEd4{Mbj4#)D`4CV`V7b6*ta?64-UgTG zT)F&nZDhZYJ&oydzIs@2%tra|PBQwUC%l+~yqHWNIWKb|FG}p27AAcIGP#-xpJ&jm5t~jai!{@D{kjOqwgtTf308hppKFp zOR@5{-H)0vH46-4NLWA^4hZFgmGhmK*${*=yAB!GUPzMn#3i=pnLfr(j(zM~ z44X}y?H^V;tw7V+JhC@e7ttr{G0zuR%%UUIKH z4t~z=Ta1YLNh{ynXkK<&nRXQQXF@3Mg;VH9@g>|4b%j!P$`+;gupw?IuhDZC#A8N~ zXy#&CVYnKgcYWi6yK?G=?;#UjR7!$Cv@1e%5(L`gEyvsER=q~J5Y2{Kog=V=uPTRP zvn!N-KUNEitK_aoD-j&c-{bMt)4+cZg4+;qzd&%OK(Z8fG+wfEniislgcz>4d%;-Q zM*=I{#+j)-q~>bhHSa0km@k|UxgV#MWNnK3eHumlAp9Qqfg$+8%3uo7L@fk)_4&47 z?DaWZ-ohmn?qU=jqkg0!}mLWKrJ+4w70~am`6$A({jgY8fEVvy!9KsQ^QtO(f zMv52K$6~Y+l0TaDm7m5>&W!YRuob#1KS@jOmSyyl3`Vf-ehgTzBUpb@i6;J`*iL=Y zWF);XqO`l*##b*SaT!B&n_gOe7v`X%i)&f7(>wE(VxK=l+O%L zU@Zt;ci0`KlBSlSLQ?FBSLdCREqWd;Dg{@sfwPLK)$TJkQ=^Qk3e(!{DxLVOE6gWR zAdr&oL4hdNPhfkHs9rq%^%xM*bC=8bszwsmU0mYR6O^zF)6y%e%YN6}W#VVs<}&zX z)lkh-5zRy1OPF4$EbF?7Xr4T7ggeh`WF?B&>hx13*BkCech*PeYEMg;JxR0pIf-x} zg(641xf3`b^!7|(IT4*V=4cQS!JDN*u;Yzg#M$KE<@pP59%iTM3id~ARE9dfMvavb zj1|e_nVXfdC4HfY#@;{@C;dpEk;^zUOwO5m-R0P5OtX*8$|6S)9~yObL)1})n}MWy zx#_?YIV4~mm^)e&7bzPi$ zSB_b(v(A2SEKA{s+{Vr4lem0wiFrmWA1je0F`_>U`JfsS zrKbD`5Pr|{;8#RsD6>-9?-K;?BKAd^AYabpa)LS!x*H7TyOr*t$$VAhMh^z z^%=Y_%w{~BNZ<3y>o>`4uX+1u+-%ug|0~B2DEjSy-W5S_X5@6ndpX+=Ed<~X88y@; za33uS7ljP`SI*0?<`vq=e z^(0kHYaZ!_|MbRce8uw{`{5oBAxR1e;E0GcFPE2rQD@nA5a!dQ{dnTD)srsbx(4pf zwk@{`UH-6owmHa&foYv`GF1~7kw-3ep;giH8?k?@g&qmKKVijW3c@~yK#FXc=+i|EYNJ$6t?8?4tn1xpXLW z)AQ$t$6*4Lr+zcdhXp7+__e>6Y>u3{b8(w2nADyRU{cv%=KRSySeh4;lz=aD?gfd1 z+G2(3n8^XA8);vPiJse-Q{62e{OG52DeKy2aTq_>a`az#ld+*;Me)(O) z`^n#xi{=7f?{wmx8Yu)oO; zO`1$S(67DR7Ny6WYq$4E&N`1H&)K_kF1)_K$eSnLzxw`TG;+}R_Tqq-#pZGc-u#HN zpW!xHD4#^Pf{e)h06dH2+;;Y_v?%1masc{v~DpU3DafhC~ft5CwfZ6R0)x_D+ z4v|1Xh*0<7N-2p&ZrNn!p~>WcXA3T6sme0R8TgU;zMcyY8hF$kn&*2gHgDcsQWDgQ z%uT>(wG-oJiE}j78QkH`;th?VW^8 z7mD-!oe0+KHA>)6O^8Fi&@mtn`;#|TC6utMUVmjct3QwVm)K(ST3GP&%YBQ1TtRR| z{iU<}*?8Dx&93FoTkR}1las+oX&R^IXfv6szgth|nVYSeTS+HU-J?mqzuyYsr%R8E z7`t$67!A3YmwQfeV2h9_|VMB%`Gp%|axi7RfPSQ-6vsjHgFJRqBkGe=D zQ89QkKfk;s?=dZll}{S-8ce3(iq?n&iIzd#k;dsjpbEPjn=WsFo(GN>6sQ|;t*x!C zd9}xMF)`n7gp&v9d!2Ud{gao+$P#=F5xX4l0vFJGaZ z4X9X{T^?i7c&KgO{d$v`aL@tgalmMEhWwsK(ZYK*URT-Yg;MkFkrs9%BLnCPUZ+Fw zzC-YagPf<3HrI@SOOLWfwgWB#dJe*Xx2`2oM2OeU&Tb@#EZ~C$s8RVO%`|ZGK!dVI>FDA7& zQBaue3`ToH<^CZ_e`;9*TxZCpU-&8CP7PDzW}gnP39Z{PHuGkjP3?f|=;{}YB!xO5 zQh1z{^G_)Rja^XBtGn{c9jex;Xz?^V|VlTG}_BeX7ULMd;35}Z&qcHnTVkV%Za@rN?~lyH$cn7v%sZn1j^N^oWCxY@_U6@u%lF&|Hhn}5*# z-7EE0yKDc&^v{*`mEJ-;@+$E^Sun{psp_ zHCs8^(-R<61xegKBi4W51dN3faITFH8aJR3Fh;H*wa}zEGVob`OZ# zIQxCIg*MsSom)(!afNajt8)ZHiRJJsQ1<(UDw^*}i)HecK1z1~h%mMb?rlg*tc{G( zx_FA>w_8ksO_l&FVQO?iQhFtlyK z+$^|?yVXMwc*$jA9h#Kpb$pa}oVH(1&)j_Z*VnJO@Ywmvt!C)+WNF4&M33Yt)(7u^4 zL?uwwZ-W<`5-AE!uyPm!V~rYin4r;97QQY~ z#|Nsg{~uj^O8!7$<-*x9sM@PdYT+2N>$|TIiv6ehntjf%^t}J=PYw@>CK~i?>@u75 zMYNCPKLw!uUnacJEL&kUeok_pQe12rUVMg^fS$w96}c~7TC2cONbiJVQMagtvO-LF zYcUJ4LUguoV?EwUcQf@)W(VQCjjAXdR39OgF3|NiYsi_} zm=6qv3|H_e;4f}Ikx$FdP|4t>QF0d+$1xUaz*7q3HSd5YOWu{LNd2x7#Q885j)lC* zd)bXKAIM!AxMm-WdsXa4v8&R}^8UBZW>YR*7kH6(|GR8j_JkI|yYEpKc;DSaWwVOT zg>q9n(@Hzp8mV_IeKqqMaWEjgUZ2YPSb`YB1u%p_FofPjK5)Nz1;qVawNrm}W2J0;{j?gQM=0SregHkD zb;lx54j5;`y*Vl0Je~&kf$rZiy`QgOw88}_rXY#wN3(u&9YK~N$u#^-%{{0Fes{rH zobd!Wu}Cza0-QUiLLrRug(5w&y_WI*m3MxDB*SyFfP&d3pR*teXT19mCctX-yDllh zIus20zj6wO)7q#Z=a4-v5zNs4kTH&d@E#ivy7vz7TX3AJ;>uT%_YkI?E&sE2LDGJDQoO*Jb*SJGj(FNAr*^YE|a^s z^si)V_ooj76xDr}$A;Qc@m0CZ2N4j+0rVDPl1?Mo?kNgtf8~;MR5nahu5{6`AGd;p z#^!W*8B!+kn|*RB2stoLA~C>OW{$qOH#Zwnk?2#1?G@ze#Lz#_2aE?ypgtn6z@o9~ zRUeX&oEU&qYO1}&K-fr;!5N~*rvwPwjZn-0XDw=EGsavbhm5^Y=b$5mJj^NuQbN!( z?3UwQM^=9pI8iWZm-(3n&A{x&!0c|NPC(eaj*9D!6a`KUG4<0CqJfLZ(Oq(IGRV%f z_cNFjr1x+z^nT8I&mfh6?5ekAGoqV?T|Y{o0xd)|oYj#+yQ2*cP8IF2Vsf(tC}*Iu zOed%3eKdNyML6k8f|{0%2NP%ExD>R9kxd^(AMLyWV0({+s2QHrDokkbIr^y@S3>xKq$@a^6_#?wi(x4urQhDjjR!%oS-S)C;myyn`;N z^YNmu6_6c``d&7>;UTh5Z!dz)P@s@5>lnzV9@-|*d4zW8sdS<0SY}_UXZ1IJwcx|biAkx z5ySDK53D9!k?I`hN(Mo(*?jM1oU#uo$<*>R4tJ}W}-z!sr6q3wH zO%KLa7nZS8g1hTr2N8Ctz>fV$%dKEsn4@FO3;2FOat=93D3-71SOKy8*DT9*gXW+g zbQf(rM3fkEZQ=bWc)uFnmx1>imhS2c`c55 zNCR6^7fW>y>a8OKYoTxrOmBhaFo|Tf47$mKk}kB;_L4)u(zh`qEv+Q9P1*o$QU^b@ zTk3EoT#Q?jpXr7nxZqo))7mPWM1xLi(?k+9r90IeEop%GzkcO}E;J5fsWV#G62Nb- zVL&d1viX{ZUHkCLb|-BE0K^S|nh`)v!dQ7W;{fQ~^0FCEjSEw{^9)rThty#Ya;N(U zdj?>h#T$@80XKuUT3>`J`|+@ z2o5&*DQLTMg^P)TTdg5s=c6FuX0lyVXDl^RcVXZ+Xg{bI16c8Zl@G9b_+XX97;@!3 zDy3h4g|7TX+@3w;#5}MXE+AYFlAWKeGDG8+a1BnKi)Hcsu1X{=+#VKk;#1hNHFPk1 zuc5p!G7);j$P7pGl;OZ#3ycGIcmesGw^yFH4|xQULK>jm-~T`W zL3>M}s30Oc&v~EmhMMCt!oLLY-z2AoKUX8nK}n?6Wo4DZyCK`iBQfyqS9n*ZpBe2O ziUZoN1Z>IfT-T$NMu^SfNPixe%BQ^h20K$Z%;((Fz6tGMMkXrYiGKl(yv)f;ko}ML|~B zC03IGkkw1X-ph1oyOdzH2v%=0Bdgr7dI?sM5v6jS3=A@e5~wfAZ3>fVa>LNS7U2oc zT>w46)pxH;XBZ)1KA+aSnC=@4o6cjH!X!Tec;eC_x1TLGq4ZQq zKr_BT0(wNBs0gh~M=4)n<1;9B9HIR*3`)}%okPHMgUKy!9~B(Uo5-*}0Zzq7c>+|Q zgG-cWK&o{x@H7?=cd45&lcwOMpI4tl!|w*K<)d(bVCd3eypK)}?q|?~(g0+7Fn;Rx z%LYbn6MtlxKJpkth;$AYgF}N3E)qjWZ`^*3Sd@Pv6~kLGy=dNI5a39m9GTc#2}aPs zLe@v19)_8~-Hr=KpkPgyh6{L9^2SWt1xp#|oy1SSN}w`wT21;#h|(E`1NvQZtIWBO zV#+7!Dxw6wbmAGurzEpnp4Fv`Fs9C7&&|G0lER5jI=dC8(-i! zRf<1>uzV9uT!We>`Mk}xKqg>-+tG6$FksmPCA&y#64=^!9L8~<5#1mprS!W~osbcQ z2LN2neXJ{2(1Msijf_dLhQdMMEksh5xBC!DSwDip#Swcj^ZQ&|i!knb&axA20mA_; zc|FWK#sa+~PEx`}>2NSgM9-8ej`nC^Zj;bII>ABMDIir3xhN<)tQA81);Mk_+HKH;*NJ8b?>CMGBbs>T0GbHwB_Y0&@*HZ5j{WfZB1{c_ zdN+!0V1W(cy`pLed>A&>bL|7kGjY6okFH9*aJ9=|zizX{2?=3!oRV-+F^>D-dvUotY*M)QY9H@Y0c zuipJLqgOm-o`COhiQ4B2bqR1^77%mlzphmOGqbBxU$Gy&&$pbAPm zhz!#U6xFEnB34vmNV*!jeGfmsRR){!jTf!GWkp^tQ#2WyOb;fCKKIJa*Qn@pLtA`Z3dX2;XB@!K!D6~x5|MFzDghFXHadNcFcW$cpZ3#kbdR33v( z+lD8)h+W%T7QR25jkG+$58&q8>Rb-IvE9jHQ=51T)yqdJi}3VGHCL}8W#D!1*QJa8 z-P${Fkq(YxCX@$Yp>7{p5QV7i9&Evo=f89WESRLqIj!Kk^DQ<@N@xMAx%M*E9M8m<8nA!=;>FigqMof>`ulg&*M)sD_d9+Q+7Vg}8o&wiQxhyk zVO-=iPkb%Bw%D+_Q5_Ydazc4S72XuJ0{rNv0>b<5)78suEC*`u%pRM5YPWH2=*M}} zv-(Ra?3=4kg`Rp_IsA2F2lU8K0o_f<^-mJ(aelFhxtSJg-#JxG{XQ_3R4+=aGLSrU z&(41i`(3sAd$RgZhy<$<`VJkF+mGnemz4unIy116X&<*k0^P&vgul^PZ)H$Z2WX-QIR;Ah{rFFBh@t3U#C z`=>fi#@lTrOfgBPSN?>lketh>C^MU&0_F%0Y}C1n4%NVUgaavX4bf25uRc)mcaMZQCz zI~Q|DnuzXnPXq( z=IMBJ{apUmdY&7Psmfbdz7Af0S^VFpzK2*OVb-0_Sh8sgqDU5xX{Pvg_~eK#@FdqA zEPO#jM@{Mua(J@s0uU3p{ly1iAzxhSXhN(@tg-udufQ%3Fa{@8A>LKm^+}r3`(9JWtdkG@$*d- z!`1x_C?TI}`)lMJ}B&Q@CHzD?z%ckT%b3Dt!rW#O7Ky}=T8yp z&iU;){U3F#vX@Zmj`G|GZEVSIcic;qI#%V{|B<)jd>l&N?quBm$h&`Z93?MU5puJ|8{L4glBk?<^VQ(fhM&)7c*2O-a@kIVe;+0G9+J7Fx4Ztd9H|FL$} z5_>S`GMl%fy+L~JN< z+|t#9v<3K3Eos6q8I^45yTOS|TlOKk`%R9}zks=S8FXv`u7Rg^TTct*ne*=5L6u*l zl%l_V3oxA`Jl!&hnjN-XHCvK+wl~P(_?9Fh-jNPn+QL@B669d>@6$TcA)~FQlBE?N zQPYd%`XH=(2W8?Vb5N_yzdLJ4Gur6RbCHszN?qtyRt4C)#qY}1jyS0YI_%GB4u=QW4^00LaYW|3VFity@qB6=3TY)L?+>zP0sf9Vzl(sJkUg*|wk# z0P?rFz)W2J6NSa$v17l$87F0=T*t!LE381=dZ9P^?(%ga?$Rb(l`W#jGjT*-N=s*6gihD)-Px@C3G>{9e`pSSiNXBIcTf*Qv;T}h&=>XsR( z)eP2M*fNeYp++ImTjb6$1Tm#=8ONO+Zy3}6eY!1(>D4DxV^lU<_RE>5IX}~ah)=O+ z4`LeKveOh;qkKYbsa+r!_Uxq$L_K^zKEw&y?5)1Zkp?A9BYWZpl{h>Ni-Q_J2 zXm1Z<^4*eQ!R`;jzs{q41u`*<|I$Y}2;6DQzL2wpo`G4MTYc;4t~ZSITaqbYg{Rli zr!~I7?UgNbf?THZk!aMq$Yaa?@c9-5#vmq*Ej2U)4Oh2l*v%|Hhd}`xr+>p(Nk#d& z^==T8kILnov?P%#ve{#?t{?Hbk75TS=@<9!;=GF-ee5avV~Nr)p!;Rszrca4Fu{r# ztV9}x@GN(av@SOvQMB(j(}SsOS&#rL%o$&LN5Z)HjSM#{nH1+x1|m-TkEt!sS3F>) zI}pUQ9ln&g2x7fEq-c=;vu9ztq@7@GQt}f9h=*k%AOy-=x?0Afay;q{*hBKu6_cl* zrsq1{{*H_z!9@4Zfo~`aZncAT&rlCPR{$(92|UM&nqd2X)?}k6$@l{b+L* zzr-T6_$XO-jMhWlqDMYO|3i+?Ln-3$%|MM3$80B;=O1`|4h~sayh91Hgi|PPdpGfw z?q~=18Ciu=C)3I^8OZc(<(^DGCxsyoV>5~6Lvb_LBGM zkOXqhmI-Lh-0ZQ)pe@z1wEKPu3Q%;+8g{7gc8VO|I{C`kGQ5u;J%)`0)kQF_xmeg0%KZQhJn8ZJiZxlceH&Cde?^KyrJ3Z2}7?#R;Ml z%eMgEscF(=Cvv2&)evh14CX&p+h&XYSoEQL_cw8{ufkSm%0;3@OMbxi+ob2HD^Z?uvt^Gi4q|&OOyx-nXXBB`(J{4Ec`? zU-}WzByBouM2_c%*phWrvgAR>&GfbRdwW>qs+SRg98mf)Vid_YG?HSR$fW z2T`z%RI1PApG?-Bnsu-$ebOEkyFa1akN1!nYKC`^@Y=O7qjGg)eU(M&N_mV9%?@a% zvY77?SE#+d`NSbfVtU@es<-7$2n;-TQ4YTq^~;#n{ecR<8?Z~>%xlt2oZ^!BIQKJC zt9Vt+2Bm+DBY#)2Y2u~LCo^o!$#xGUb(}^oHC2nv#XY2;LF9%#oNg&Iww>j6b`E&! ztL-0Gx<9@sUX?u+j3hpHf((MRo*w)}Gc()E=-f#jjrSc@ zC~~u&@-&-7C2$^;f3!tQbzZ;anvu`Mr1UR7B+;zd1Fu#rXKYj*aL15EbK#E!IObGb zdR=w4#K+8E4^{k)5TlSv5s~XKOpxuQn+emYzvlVbtx(jsP;h_Q%F_*A504NB_I_-D zk3+J};tVLadWh;eFHo2Y(ZS_1B6HQ^|saF zn+MgDqJqY8XWY!b1zxK*<3)uYXcV$8yiI^F(?#ofaPp3nfD8gN8un-Zdb&1WdbZM2 zO~K9dag)cJm+hC<+ror^ar1+Dz%H7=$Fc%i9V75Ase%(Ss^XJ*G&^mzR7l2OM)m}0 zDV6woP5J&AIVkX;6B*YjX=~QH82as}DRO&bs3FyvC){{+nu~J8Wh6Snzfu&B11aDC z{3pP*d7BzOUABYOiq_&gI2L3bz9{?=jk4;@Zy0^AKAc}IBvJN6z|ePVM)_o3pTD1U zJus>&?5$F&{>6t#3;WenrTiw?O`+sgXN8k)C^;aN5A|&I-3WmD>ebKGk*}|sZ?4R* zF5$uv#Jvnwt`RHS)Gy0+y9D)yWi1LHbWm|c(tdSF>=X^ey$KfgtFJ$NWAMAwdd3~I z9#C~?0`z(md;g%R`|>saup<)#J^LCQyK;Q`X;h&@23sW4!OM$C6j01dZmDLOH@|L1 z+|(u@_H1=5rB*=MmfalpI8Fuc|em8oiNeJ`sJ&k5?qu zX3gY)>MP7Xpc_^u)ji@@@fx0QpT`Fru2)X9%bE9A6W>OnIbTE_VH=VqCf?5V%ri0Q z_f%KV(0Z7?;*XJ;LnJi@7uDe}LT|t8&acMx@J*Je{pz1`=xOiYTkSTQUfj=|i#Wqk zNR@lD-Mh}MPwNSDM#mBt#upj7s7NRyuzek5vru-k`nD*bXy4Sj!j-q;`-8i`tk^SE z3KjJZgmJyRr4yXTKbEA0TIo4DwFyT^H;vcJ6G1w8x@B8lkH18}E)&P<$G6ndv!z2`gY z6Z6%LzPGoF`=imLuSN~%j+n{%xRP_ZOQziOd}SXOa{ASH-RCiNKl<70f{#yVfMPx2 zvqZW`2RBGt4{?Nh8X)cci0>EQPS6}-^pk+m1F8K7nRFcV|**c;^=K-_6?1y{`XbXRLMDAG2;Y+QWF##Ed(N3VV!NavIptE#x zMV2v;9jmN(`m{@Gg5Bl${-tM#z;CDn;l^*Ro(0@mzs4ZJn^$(aND3*V`0+*73Yfz; z0^b&e4fcL=36g(Vm_N1}o1Z`Lg_!6A5VpxGWK)6?44+FluYRxVamsSBP6uCnpd$<3 z?}f_`s77Mqz%Do3{Cd-?_y-;+#oNJ5u$r=I-`>8VKji>Cbe6PqOox&2rwjy`#O z&*HaIZ?Y$7H_=Xq*q>>7&9FK;AJCqqz!-3rbM?CCPRX4ggwu@Q=Det~H!Sn@Oe!c& zK|=I1iRWNf-174os-PaOiD})LrYis9{v{|Nh*(cj`khnNyK94BVn*-PfxztmL(}Kr zAUW5>q1xi=LreExI_vj2nI3;aK(Rc9LH0Hq92_`iPp%{2S_*QUlZCu~y&h=vGTW6> zkKJdq*($L)BcaPb2?cd#G1q%WA?*R1_vr08Z=XoSFRs_^RZi(cN`oaXv}prt;u0<1 zXMXHOjC4s&gaV9`Ylq60s=u|rGCvx-od`idDj}Xs?9WpAkwX*QVYaJxW~6l%#?ZrP zE4j4q2Qdiz%PovunU%h|?*$`vTF_WpPV1%VpZ@Cl4zGCo=ZAM}Cc4VY!_jOeF)ABN zHs)JjEo6RdmBbt|<$uTIuYdVOo^z^u9mLZsU;@<(4%G`@4FzXfTBT~X*|N)FDcjbs zEoZtvOybU;TYWZg-LA_{W%Uc*;6v7Ih+_2`e7R7%CBx>RfhfX5S5|s(j|d z$<8MXQly&yU@W3Q23Bf7SS(m z{9P^e()E28f3Hh4kXBw;DW6?h`Vq4k1XbXbpoVIRFNHUw`YL?h{DZ42fqAM=i9tyf z?M5_1wb-GMszaTB;)qwq-|tCX{CZp0Em@=CbmTTlDE0m>NL*A$7^A~ZyW~0Te@?og zrl%7)c+KEMd`3W6G`IGJVe=hN}@`f5Rw- zOdd8*YtcCBb5GOKs_(Ac0kmHMts0E1cUoOuAFWG{I_R;|SL{#{Fq=wSJNI{bVr_Yr z@!8297?+ee_#FmL-i{I7pL=?gE4^_rn3AiSlrA0433?wzuYS{}lG8W_`4dJ0Jr?-& z1LAVJ4k|>JEp#wtyU(sNa;Jjps@^Sdt=v0e_SG$=UjMv7ENT36f`~J5wHd1yN1k)hF%`V*y?#nViQ_Yp^j&buS_Zw<@)aT@Pr>{2iq`?uT z>ldIKE2q5Ntef-pt-_ZJd8;i3RWnRzc^?Y@OFb0_NVO z6Sm2fyN^^%rzRhG#?qqSkONW8L%TZK1(Ae6p*OD>uKxf369*|}sU}jP$TYqP{UjLs zwaQcMYTt{9HesV?;bW6AOx1r7kNLz|z0}aWiaT=l?sbNW7!G;9M;?>8B|wSCWcPVa zlNFg8h1(}eRJo1URfDDt8ttV@bJ&aq>%~gGN-v-2;O7*5yZXC4`Rw2N{k;B5Lt!fW zO&q0&6X+)f?(ZM=(ex5pDXk%gzP-I$?5XmrJ=j+NRN=;mb_A2(Qge2cx0BUaKghQ#6CiPd}jF$0$Y?u5i}1XpRZW5+D4Zj~k@(^UNz-zTO{? zI7JzbW+c*xN)E5#fV()q_~Fs|`yRWSCd_#`>KsMigLu~lhppchvReZ`-}E1bKt(Bo zWH^pj`3r;d@lj!8i|>Bx*kHxDj6R5sC2(15nU9*UD~~*uL{7XF_-!Vv+hTEex_&jF!!@vqI$xb*&OZOiN7PWTHRKsW{l3;)Oyz+Fe&_y%UdzR zcwuFVHOw9U9zn&_-*RXpJIiE=?K05kXS&PR-K*(=y`v z>7aL9e@XDU1+P_vn19$;q?`cUFTq5Ah11n<+b>kN8BVM=W7v!&<)j*us#qG&5N$#< z#oL_A2SZFhnTb#3(OAM{J^>5&@b#=FSv^&)@bpT@F=!5mGS+Gq6~ zCMQ1#FCQFHE#J5uIrCJ9rr=5P+_N_9EU5vFd6v@tr zs1e3q_9gu8%;@v`^XspblaqDHUM$1om zYza#&jZ%c^o+_d9-uX|=cBAyfJvC9#cvv^TwoMA6i)rdAFjcZ;MClZGE5dyuE&huF zQsd12$<=qiBRqi8c=jJ@?t2?4ma@9_(fz~N_d>A7QUO7Tuw_suf#IY0vZc zc{~Er;zRC@>1?ecw)Z>d=+z(CaQ=sG_Aq7f8gTz&`%5pOd^016U5oHU z;YnIFY8q^Ej$^Sx|I*{m0hEeV5Fs;MaV*r7{Y7APod?76c}`|DCA61L(ckOvbhCx+ zX#JeuHz@Lp4o36>PVvkGT037$={?Zz24xTEEzJgebj@ZeQ1ASc;<3^ESSW0t&LEre zPwGBhEuH2SaGea?(T}=vdyj5>npp_G^;-T8(_o+Ad7N5bSuca- z%{o}Iex28SHu|z=pd?UyX)u^>^OL+6Jd#r7o~^=uEdQiDqVMAjRxp;uvl~T>UUMGY zk+QA(oHubmJoV4#jrsFK)qz`5?}3B1!>$1^1oNP#LC8sYp<=t()LUJQx!7Hr477F6 zL7+$GKr7(}F59cR#{W0msc7rw;P9+h%{N^OvvggZNq~36$s{avdpzLy>7TVyOM{Z9 zmcer$<+t6Qw2HiC^gF|c(J1$P>t%Yd&`e8wd7AZ5rJwh_gZQRe1L%7!v^6o?dsjNs zItRe$vAq&6Up^?Qlw0%j!bl`z_`8o}4u2AI7w`o~0FrMYe%wvl^^IM|WybjNL6t#= z@=LSgXRYK?p+DH9{W{Adus|REh>gO1{5P-zQ-Rzyu3G?#7J!mm=Vl30 zKCua+70Wjrt=Lb~b(*_&*p?oMQ;00iT=9M!=!)So^JS-$%`Ra}{Fwdu%8y1%@ls<} zw>#arUnlsaYkpc~jqLq!f+0vH)yw14L|@uu%$T=5EacP}3!bhG%dx}kTYnKiVE^&j zBERJQ-T86l8I%6csn%8CzI!m}W~|To)10QsD4BkTYK0w#VO_m?#oU5qt~(lu=an7} zO^ih{?K3#!3W_kBA3NHggsgTO@tLgpR_(9ty7w_trDfy^ir>`tcVGMY9#={p2+ODm zXg*o_Q`2yxMi{}A#47j-%KfYL^3-H^oIL;3>Y=fFbJ(=P&<{f2LH~e|-cL|sT^GTI zDF~J??+-n+QRv~5+h5hXN5I$13~c!hFnTLQn8(NCu`Hu`io;=S&E-RB+DFccFo0G?Y)s1#2HeU|2lMX+TLW30_iC ztlaAMR<2&#*Fkz~5%rvDu64i8RM?-s*Z80)HYl$D?dp0y&qmfcE7jUR7oLFz9;*6^ zC6zDXH7N~x;F7yC(nvp9VZ2YVu41|;1q^~ZBcP=hs%|5kWBW^6KQ&`h zui!`J4(MF=7`YPwIok5_(UfxgWEXQ-?05(im0_JD-+a<~pVNKv^#*!7338-4nG6S^ zR%bkBrxRN4{VCtt^u_v1wT$>@WT-Xzx0W&bQ1JeLr7QSf!WjouQS;S>_Z_&}8|e0` za#E`~;oPE(Cx@J_@y^$rdspH@hrxt2yX@UTsa=TW5E5Ll5Z;=%fr~YMybGS}$YDAI z>ADx5C?;J^3>rf$OeZM3!G6p8oOk!>4KSxcoPKzD;OocmbZRwuKK94FC zVnn(87Go5JXnqG~-P+7=+g9=^f1&jw1O2JG=7cp1G|xHu;|bGFb}b!#H%98tgBL@X zcH!69Oo`n)y0E@fcx2m0eCy`6{M#XmO`nKX9Ty<|cg`b?32PtrihnknA3EbJ7q*Rc zth{4a>$fm72jWVZ<2Pi_cN33KzVGM<;r^cqK#he@=Z$@JTU2}N#nb-y zllR0PfDV4(Hc1?x4*Vf-Y^3nqp#Tuf{%QJqGYNHr*}nusR8i9)+Vfbm;+EI5mc01Z zoSGzfpwJI`?+TFVp3lzkB`5sTlkrr<{p}&?8mWdQCoYr# zlhSKIsbrUuE-6y+j7;;&u+akV1z)+0z=-oR@A>IQ{jVsBQ@4!SiyoLFikCyEg6TW9 zZ|np!=GC*wnA@uKVbTf&21zl8Asq+?YD>Cz#-}R3Ixyh;Obdg|6K+6;IghdYqt{<7 zowz18b?KJsB_?FcCyGl0OvpSENOD5WE8bF$%`$M6rv!p}Ot~O_n`w6}-EiQ+7b!Dq zK|!rgyR}$AFpFC_eGbZIFMg!OobVu$4=EQ$Kn(!#+L4O8rn?aTqsO)=(v2=!qme)I zI04&|LWs&+9 z1h)*J=(bp-(g?1gGie(F+M7(;=|Z|W?{QsZH>U^0ipVn*0{IG}Sxz!nD3GEH9@lM|pGhF9O<=dQ z0!Q(q?yn4d9UwyGR525_j?)uGOgTgLba4<{vTKKsFFYWqjnRU^^q`VmLk@lel&Q)j z9tPsD@|b1>vC;L&Xk(VXex%~cZkO#4YUH0{*c>EcPjP(3Zea}&|J21Sj6PD)wW~iJ zPr#7@@B7|HOPgI`Xrd^2B$MBthZN%v%qD<@p7+RcWi~+?k1d+%TRV5xhW^D|6H381 zGckjhgZI0bgWvMl{upF{<^iCsc0vCVL&@7QK~o=6IR1iur{nR630fza$2M>mw8ZHr z1$UXCpNODZ&2~Zm!&yAG3;Gs_IR6X!`;m%2yPy@HC~EJ5=HYHk2x5ZH-dC(f+*NdD zC}m+6blH)LroSy-#$!9m1Px&=R?Gie_%TJeogpFQHHgS?Vw!L84T*}dw+!=unDW?e zF{G#75*7RvOem1k7d+H<<=Oa;a(uTDAi4ihY=)RT1zAzs8B&esEmgQ{Dpm-jt^9z5ut|Bn$?FJDUQozyAABAjhL_dBRacKn^2@8h^1 zT{O5LhNs32wb1kSLU##+(}Almx_y+_`JU5 zGX7^Pb)VsP>KtyyUY`zqCQBR;EP=ql$@42cgis0OtIE=Kf*!i9 zDVpty>W98&xlVYPLhvbWZwk!Zu2l5~OHX4FJdeO-4MD1u{jX%{kps5Uq?Ty54ryJX z3S+*04^V(xh*|{CWEAaL{adu7=m__2QD>~^-=c~_?{|yJ(FVbIfa1&1@`z{R*T^;dV2L9h2V=HE@BdhtV+AXWG4V$@ z(+^mP{ADGYxUkC#8{6`im7yMfxBilOKVZsag|ZOdt=~@4_{)kn{x4MBj`F{(qAQhl z6`&%8{GS3eJISB`U8`ZQXa5%MIDy=y>iF?1_{G$fX78ijqBjHoYI@1;repUojfHI(09LX+rV}CZeWj)uj*$#W(VJT&VsFX z|A~$a-K=lbK2edPXHSs=xBTum(5Y81hZPhCE)%pxeEN2V!9MB^mX`5&TWc;)kSG}> zz9R-$f8){Z1OIyh_0h(E>dmXZrm>}_k`BBH`C!T?7FZSDlw{{Y#k589+_xsdu ze%ox)o)eq+^*C`~Q*ikr{i&j*ey~?>76|@VMxQMNbMb!q3jxT@udZ5)NuQz|)>{yL z^c(gU#j(^6rM54dt0q2(&kH{_cscAhT~PkJsQmuySG8JjN4qGsJ!pH;-Stay5|^3w zpC1SM>(<*mo6J0491GlDnH_W=z3x5>9@Uw=0d9pu9QUZ2)~=O(4^=@*9RVNMug&5(ecr*4=vRd0nQ&o|3Yl0D)VIm)6j*5$NLAX2M5Gm&@>WdrT z&VP`&K!001cFrq~s`21gI_sWvITA;3w!$^LZV=*y}l4xTO;yhQ>L}j0+61aJ$X7p5nE> zb3-&DTGct|wmqL91j+z3N%h+qZ|kJRBMh{IHf{kXhZsz%7)*Lh=}fxFISr84Nk9d1 z@z6xT?ihoey&VTvFn$sSiM6mr%c($MnRLdp^un@6^m{m)R3-XkmU-a8ayizt|c1wUJ2a{AN_KLKcd>)&LQl`=uJ;fSm>;yXS%S&1_ww-g#IcuvTUQ8_k) zFdmRHK>s4>!T6$Kh5*#Ex#}3WQ*sDe5dcRhwM8$41rteZ(L=CcUQ%ICSohGlkZ>L( zTgN55dnk~kZ!(V?sF9?PRup7o?+`|oJ7Sas*>pcvs-gakn6W+K%_6$qzFaw7wt z_hpH(z#huG;nG{>!-v#SrSLO5S~Bw=2{Em=iSr>yt{bs~vVRv2i*1|Q-gz^;`^&=5wlsiaY- z9`FeU6Q}$@UJ4&V(%i8jcrs592(6V~$s5kPhush%&5vZ`N}(D9T?_Ic<8NZ1D%bGx zzhzY%As9Hd6W-7vOH2hEHFF7myrAeK>XbE~Uyqw-J@ZO_#{Q*FnmOfJ)7AOyuS;6?;-};;f*&L2RubH2{-P5Bph$j z2l}Ok4&oCDQ0kXevXTL6;1e2FJP?z414b_@-c4#S%W1DKW|*$I*gWa$E+ z809;1pn%`xA=Tp%jp?F^FZkmxDNNS2 zeKSM~s4j)y0Ko0a6aB49KIUj2Sggur;kie$M5l?$T zU5iSBT&0F@Qa>j?I=&H4xu~eL@3YoOOyz$?U*ctJprfLd>0pxJ~tGIZ62tZ6e) zug$xPA=e@YoTLgGhuw;UY*yA&#+!bR#*M^j5~pNU3@^x38)v_v!3@n_h0D)1<9hd& z?nD~qTM82RU7})6^18l3jg-wS3ggCxf_x_}=ALT+EA7_!1|-)4#Vk6hj<6z!n7=`klbX?aRRcYVCdtIFv` zBx~qpBO*cX#S`MgIpc~-R7Ql-Q1{VR8RHCEYIW9GpZim(XW7_OqCJ4_4kFpUb%#^G z-i#-W)c(3KCwNOn^{|6h!0FX<`lK3sHfyNmawb7xiCm-IG3ocH&0utUFbv^)NM%SIB7`*Bu4c|0=4Z(;bUNF4S{NxQDpTql03 zv!ofL$-yPuxk==GbArV2Lj5@vUn&a*h|{ZTmlpqYX2oqjDrq+I#$nq~%MCM5;<#RR zr+-_;;*9wOd)!oz(iW~5=t zYucx=q&QA{1rav(a={x2Tn`k8qzI7=YZ6igmf+Z^oJVn z?SLOS9y0f5jW;YRDo*?~QG*Izy8!A6BH4Pc+9fTa(P0%%zrpA$Jqe3p2h}w21PS!Y z*jStl=ZJ@r*tzGQ?~UGWzPBNMG2|Us`Wc3H!mp%KZ6w}!rVqNHg7N2Jo0a;gUw9S; z|Ia*`4UTf43qGR3tWu~zYa<jzpO3 zD{bbIsSgEK&j%7Xo-CQ(;Nkb!*fcN59QDL2HyGbH}@T0iSm?m~3vPn_=?1GY@vQs+v7F1h*Hua)wl~tp=`ZfeUM+RZddkZ0v`C z{J_76epTsaI^>C&r4$d1o^E?O+U)OdW-%jUiD|c)(H&1MAIoeIJdKo&)xkgmOwnr3 ztelm_>SvsUai#X?6?uQtJRF;{lBmYBO^u_!$2YrVlVw%d!MGv?ycs;fuinFizTB*if2?y?Dz!tWD)duBZ#Pve28$|(+8v5*)yYu z&(ylM|E$ZMQAL_1XW&o3^*!^@Ve(%v&QWo_0Mx$#)LjfzH@i|J`hlsF)9}owDDG*% zNYw*XA5+AkRU5L_^?|~pysJ0KBDYrr<;2+x+JWte=^<35@C034sZQ~E&rXpJFwJQM z@yl9rD`=b*AaLhCxUZBWtKtXnFUgYdN3Ph3w#|Z9iA7di(n3ED-ySrWx37J1Hg~ph z%cWS{YGp(Or`}Du`1zqgn_fug382--o$#e3;B0}u+D8L(TGfOkucv8Yszz_pyD>z& zmhEZ5xskeBguHAnFPniGc)~~QBBJvmUOuB{>u21fL~079+1D$t} z-Hn0Qk@Y>r?dFbBmk~HF2@+n*+-~2ous4EvCGBQXVMT&XCCxo4U<`Us3ioLQvO8t3 z%c}6^5cJsjkow}X#QzR~mEqV!eNR1f(sjE#&ozmWjobFc?TD2T9vt@FaJ}ydpNKL6 zHUktU{v#xdUr@j1h#?MSKNbkLj3*DnYaM`{hIfbHTGubn55)Ov9WB1n^m5|M zSfusIVh4n6qMR|-+z}H&q zUdwmu8;5?ZX%37^YFFRAUgo_xKBO8mdf;5g)c8jWvlc!|hVJ7&@Xm0CnpFtE@(7S; zB}ZJ%F}W|ZK4mC0zbxWq`umr%!cOIXl+#fdvDV%I*~3(V2lE_e@zc?X9J?XoO^taAM#6F)}MA z{>igQV&<*p=Jmm^$pTiVI6NL$d$PUv#dZG%z0f)5U5IlM^{a;1$NJUU`KMY6g`JgU zN^;8l=>)xO;27NY^#&|G?D;4vB_C65cE)frGbz$0P(=Pu%&l`ZX5rHx7X0*mi@~Zv z5-b}!E7beOYbe0|UOroFW;v4>4?HIH{b_;rbBmqxPp?lk5|LFS>e!S@hs+V{ib@xy z4{Nf@?L#-YfPXJp0vHxlgI%tEaBXkJp?|!FMyGV*w@cYNvHD)S58YRe+bl0>ZghS~ zH|4v~G|s*IO;4TrA|`X|6`m?QQH#EH+uU9O3|JqJ1CzP4INoM%7dP{*dbPf=&G&a( zIP0|8_8K)js~i0Ll+@A5#XngW#oI*V+Nu$Skt=rw6V7TaG}Nv}-f^f)K5Nirs!xW> zpGisKPh3D91wADJN6b8wS$2Pha*$lU0v_17KN}7nt=O>wrj#temJoEGx$;jjOBq&)Q>?0gZGC;)evGo-; z@<7{7z{9_dzj_>nRKsbNR6X|c&_i)2zVnH>( zVw>WseatMCK8qb)HbBR~kkZGKX)r(ikenDwnp>^D3@V5)qk4PdK!0IWSI+oH^c*7VPXU){2Mk)$Y<;thb=UM=AA{kxd$Lp)%|Az9LY(9Dne52;lKg1e zolgLpLD1U}LFyOE70pS{`QW!+mqhtUtrX(bbHHqUsYZ*w5Zu&|{JnU47|}N&tF!^s zzNAdTpTFYx&1gou+^IET2u$$6K`|nJ7m$~363Uxv?xqWP@O z;!3ZfD`1hNNsm4Z8QLjNAjZV0VZb)w;Ja@kMGHvF0ak)?#ci+u@<`QX?08)4c0-x!i4k6i0t~j>JtUSVRWt2o+q^~QmIVH^>_u`lf^ih7C3D>B_hZ$Af zC)9__z}Z^KA~>>fc>D(b{hy!iU$pke9IC!Qkn9uEC@EMhXt478m{! zRV2|^rq~k|uqKE&K2#S_6|1M*m^P`~<^on!tQ;PJ)VA825|rxOgA(iyNymS(Sfby# zVc`Ba78$YnO1*8cN;FW96i=&p+{}Nh7;>$Xdd1tNIYBY5e)ap-s@dFX?Y*BLe~L|2 zvPy4kg5EQDIa?0{y=EAKOce{&I2LCget^g63U2?o zx1J92d#?53HiNUwh~SvQI$18P==5~L*2dT<4fZ;O)!(_K>X%>msT!}}DEd+=L*aO4 zWx6maFMzs-Ov#lZiqTqi$~|)TSk3sZx0)md1aDl&KznX}WOET(SmDjt0X{dM(#s&w zJ+l+r5O!Azj`;M#l0@?}+wnxH*T*|wb+>Y~9@E0KZm)YwY2AFrj@@BbSrY!ZT3>XdKwC?;CW&Z)(KtZG~+BJ&vMa$4}15mDOh!x z>>r({Z9Xm_aR{G$#u~o$lDZHw)6aubr&y`U0iIxfKl;VdIW5YN&oz17*g1oX%(g6S zjJW;mfmuGP2tS&+iE_mKkk&ZPA8$COss2(hl8VO3TcRBCNAf=p6k7?YhkX{T*}$YF z5+Cv}RW(pwu0QB*+pd0vGufMO*>eZ%X&hCCHLhJ#Yti;MO#~Vi!p`MAWvslCKgrn~ z@yRk(jt^fQJc2C}++#JA2p_j-5j1Y6?;d!X+25%` z@+2F$=lbXU_MNKw2*hWTnNp#|yQC>rE2}BCgsG&1>!(Fha1owTCCw*A$!xR6wFH+# zBQwpLHbbQ(nkE9>)Zz#?%M7JzYVm_-@YbLBzaKv5L%b@^ZUDAIuH>;LY}9Hkps5;b z#9`Z4mFXfDvw63u+ZmPfFw6DU?ags%OG>!@LyWZ-?#L;vbj1w_XoJs6hfk|mKR>$Z zss^@@L=!ARmTxUqZ2sVlg5u6HNu8@=RGT-Bmdwuh(=iSWW!?GSGTqM7G zI^dLtr#`$h?S{~&zFe@nd1Q0d<&dim^|%`0pWL`Ld#Nur1&)HQ?@<|X8ihq* zVVq8cTG`z{D6inWLo@_#t_T;{dJ6ox+E0Wkc^^)s^!$F4L49}ZLz^3d!cn1I9?UebdGv|$_Owd@vVta|XZ?HY^)A-ZSB2snmk%Y18Z=*1y*mk` zg`DD4nCr&5_mu|Skx~+m5Vd+5l-lSeUU9BFW&6CjCR+n_UK7$E zzkn6VX6Gs$j4L~oc#98dA)I!s&S%tszVoR>dwh%p`=ZBp`}{#13t^6pM=HgmOvRXM z`gd)cr0Y3v=#tepwv}oDd)b=0GscQ5h!(M+AFeO?<5#MwSb_=mr?x$&{aZ+j|Nfz5D|5TK^Kh~YWfvxYLdAjG@e^m-U-G@6A_wcHn z3YRl!Dh~YXv%otqDou-M9NaPbhY0e8K4*Ts;+)e>6+p6SUd?UT&iKw7VW<%HgO^J# zE-k7xmlpTF9R#V)P2e*tC9uvU*vqx_jy_2XZ`94GADWwfwkJs(et9jd;bTKi)~hoj z(H~*Br}^qOHa@kWU7}zl*xYKwYW$4&xRMASp;#gtY znX8o@#^!tiOJ+&Ljh;2l#+-*;dfQ`Z+j6TL@_6FI5ZSAaJFgqE$MfH++n&O6ZV*fn z&H`S%Z#3q_**WA?CQ*C>Dkcacfh-|L9tTOVXcq4-xP?AAS~|^k%sI0%_!tc)2V9{tgOE?)VhlKd zj?V`tVP%&?J{<>15lp-S$i;-Q#_5B?rzT<6;LwV8nC;lKKAHuYPPhR)uk=#B=byu= ztRy|ery7u41W5ysn@zZJ3Y>6(x=%o+DZ&VxR(>*f{18cHwMZv~fiYIfB!n9bs)jhC zunRagJI8h^Usg#%pX6o*1oD(Ex(@Klb;CbAA+q{i1j`^iCv6Y1cOLL~%V(vXRT-?+ z3Eu)InSN#=%km)eD6+SZ26I#anE|~WbOK2XoMY;Qcmt^4ok)2v!8xV~ zaQ*RA){ourZ}fA_Xx3>1J^>w7WG^@e36_>Cx}Q}EIh9NJ`V?fwu)53OIUUiYJo;g8 zET2`WxgDgn8{TGsV7aCjq6P-CA`N7(DL9}d^I6q`%(2NlKXA>khUl)D{VhgO&gFM z<)fqkK;Nn2rH%O~;@?0~oI9(=kkC(+elj$(}q*HbiqrgI4b06l5K-J&?9^<~U+B=DkN|`* zr*qRsi=MeBg?FEQ^D5OwB(Yn>i^BvE2WQ?ov6+>r;D2z*5^s$|DGors+o0K{Zsk_y zk}>!HjCe+Q`6r7%-3clLv@X$Uwej^|Oj`8<=qo-?=lE)an-;WZ9!71PkTSVJlSOc$ f=KuK9L2he1&iXEo!9O?CiyG-))+1hUeE9zWM{)J5 literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/elements/packed/elements4.png b/game/graphics/src/main/resources/elements/packed/elements4.png new file mode 100644 index 0000000000000000000000000000000000000000..abb07a87c77a08cc8df4b316f8f06488f7e314e3 GIT binary patch literal 25352 zcmZ_02|U!@`#+3Owp6l2(S{nbR7hD`Rn}577-KE6lO<%EyHJsovXretZZl?VgCScZ zlqIAgOEk$&DC;mh*Jt`Zzu)sb-{*h7UiW=}&YW|ubDis4XS?3-wo=x!}orEN1;g{k6gBizYqZiBXZ`u>S_4LG`pVjCGyvv6&cT1xPQ|KCrTsAuix8WljUzllT<7bFYwAzmpg9y> z$zCyUKYADOoNO3&L4RHJ|Ftt@w#QZKxZlW^ocdmObrP5DWuFMwqGUx4OAg=bWDI)c zTb4nLUPPpOZ(-JKNwN`h1T8DI&xj+uaLY3=X*!eI#3*MUYx*LeY=kK0c*ANk(goYf5JRg{{$Kr z5n@iz`88~?JT;EPo6WkQL)?OR<&AH(~y(ww@$5CRBV>Z?f%X8^X7EQF4TX1)fK{0^{9qC{j{H3Bn zgu)v>iIXJ>9_U1{!5grFv*^hk37gH_K&45=Zv?VQ5uwGKAPVjgXn7o0U|hpd*sf1x zA|u+wZu4hOyjPtT=Y|W`3Z(G~Xfv1H=Ho;REuIE#T9Aqftq zc-n3u(mjQF=(sP|limg$7t^HkccAdpVreo?&X%KnG!v}~vi{?HKfYX~dcVMP3X-2< z>b$}2+OLpQNL=>~W5I6oSd~<4qLKg_1KJJQk1K|mOh1>awk^AIr zIV#5}Xw@_jKFoIP$aZI{eiEM3m)wD=yA8s-*}_N7vKc66F5b51pDacHfN%%4@Ru^F z_lOh_K5^U=Jqf~ljCPU>8vENqiE7a1mH8gRRT#tK5Vo8A8B@clgUwYgPm}bQL3%G+x=M0?twXX&4Tt1y zPxLrwUjA3}mU(HVWOpv!nfO!K_*&?w65BUzD^AhW-s@EOWY4ymf_Vfx2soG*etzsW zq=dGS_benPYn;zZ(du3r$uX?K-x2C0r2KD@SV1xJ9x;!?Tb=`HzPot@5472m8mB;= zM7BE5Jo3GS3cP$^4W$hXr7D<7uIps+NnCn-$})Zs(SmL61N4^+NqfdHfw>ay)wv$x zBBJt=<8FydpL3^YdJuW`Rt|ZBZBhLrPSnUA<~nKz?e|Awo_fDrF`vZaf_Ii^-IkuB zYYn4+?g>kICjKVNoG4*Te_deDoGb|~+!@8btMql^w`6gpqy0*CQ0dh>OSNA|Cp1P{ zHTsq2S*(RAy)!*J$SCjjzkAR1--u)ab71;QRY**!fgcy|_5D$pcrO^*ShgbGqUS)7 z2bDomVGa4!mA~}|-LItLId|NDjm`qUn3zC@6yJAtEBTd}$D8r61{dM^frv?J2-9OJ}?-o(XRt@=J87>EV>6Qq{Ft*1*@YBNpFTD zVa?yF8d<-zz#g{Dz2#m)#jVm>=5HSm)>9j%rbf~| zwR95sB(}U7#iE(e5t>b>a>Q5?^f@vdh5-Ft?dWJn~R47ih zYIDe*xU|w*h%A6h#on-pX-Ac#jf>hv!y(ru%My%`i*%w|B3ex>eZ6`-j;gGAe(oL%@L%| zt5Kv5Gm`B{FO}QxxqgT^8JV2L^h>%iZC%;3&PR=^nU52k}rZN7mv& zSc%;BmSHqou%QL)-B5-2lcqLD6PDQA^(xf8=W9?`oe(&IT|A6aoosxvFJ_{n^OoB;)O#D_ z8hrd&7#rfZy4%RwcG4=25oMRI9gx4UA#$SY-xk)|@1go>%W-bOs025#X>qkVd*=PS zUy3ZT0EZD*TtcZZiS5kvcie)9(+Q@|s&@?2 zH)^EgPkkT?o0!g=?ALlI~DSc1+;d-=2C*?>HjXZC|SuB;^nvr|Mx;%o`*ymR|UverV|Q4-cAa7^)_ z{CJK(l~?G2Zj_fVQ=VUp!MyV-+-&y9CquN0Tk!T1KccCw+Q$&hiZBX4GtrOgohn6I zlCy2gnY4^&KDfx�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 J>;f+Ke*rZ|Pz?Y8 literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/elements/packed/elements5.png b/game/graphics/src/main/resources/elements/packed/elements5.png new file mode 100644 index 0000000000000000000000000000000000000000..caf55ebcf365bf8f8966499b0e9312e319b8a898 GIT binary patch literal 45834 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%0A<_hz8caGaBrTD{+lfi7OkcUOR|1vx>oW*s zk^H)*57ysbLmMQq;p>Vv^}*xokVPs06x@RBgh5Aypgtrt9N2BSU0W23J|zaJ?oN_Lh3>)bzqxm6^YFpQU<0k3OY&qAPk8DnBlp{8iXBy_r1C}Rr~?}Q5ws2=#GzPYRGSBzOuKVp*vXz&o zc<_hQ=ECIDtef)W@u6Z%wFX_TwWmVsyD;>qqV-KpgqoTmu`|U&1rJU?X<-9Pb@YJ0 zP$#k!UFcISv78RkVL%#a9c$)21}SxF7x+VY@YTJL)iF0BoK9o%I!GufWCi4Yk?}Ny zh}D5H;Qf&dzp85gV0YpQvAQ~%V%H&irlNX`Ctr4qLmHmap-00j)PohC@v|RLeyoqw zaxER-O@|Ai8hamhS#2v1@oA>qFN)i_JP zJ5w&04zV_i?vxuoEH=UTXk65I-EAJn5UEr=ZURz9gaY_nbZY1Wn^45r(iFirdXdXZ z^ysOg{k+D0kj<)`EW3>zF+?gBj~jz;PAd#sioWT{6K-FmUGy}GuMB6#=9vPyTVzSt z+akGJ!-aAO#B;Zc_Kzoa5v4R&G#kjRm&loc1-7v22J))KoecW{?Xs8DTP!KysFQdm_m$=B7#S}e3SF!X_zX>Z#DQQ z_z=A$zD3JhhXhwSE`nBkkLid-h<3#E!}4K1CB$mxrDma>o5HZ8h*ejj|5~|xP6Ag` z%xOe9=*>D6pATn5P(&dVFJn*fZ*(PwNG#Ly*E*zkiy{e|DpI_x_TxLf_v$eMv4-@n z+*d4a%MFd^YKy{Q7wY8JTD??`vN#!@SHvQ`3+#gAhF!&+Ju$z6He*D*6dgvqTTYIL zwVlDe)1}voVx$J+id#cVCt)RWFlS)!Nu7P;Iby2Fb}^iqO>+6630z&Vlx`gq*SNfU zGz>x%{J;VwWdBAVVzyXFd0K@O5VDJe1tt^}FbuVsA|tZjA-oGH_M+zzx8@zrr>o@g#D%QCC0UU#T7wCBa!L*evC2MvEtd~GF-RPa?*j8`Hz9*f7!hzfj+Zg}t~U56qXItWdAEey z3&G@vgC)Sy*U$nIxO>Gq3vzU3cHPjmB_52KBmBy_4@Qtu`+(W)mww< zk>I|hM7g+4J)R4fr@K&~j`iP77hiSRHx3hkzE;UFD&SNeFH>oEWwnaJFnnxu#U=JW zgvf;dIG1Kzi60Br$W*qp{Up}DQawnvF1$2+f!#!e+X{&Yic>7yC69$)4gsZx4m}}w zpWu5X35^U09xrVujr6v5Z~K$s^^93-9xh_-@c(D3u+K5QDxO@8~rT_a3kmGy85_ z*!tsCdd;2Hq)BL$pOV(|x;FSmyT-l|%?1qw<6=%GMD~m7?_0n4LfY@}fqk~n13T~) zD`f2I-Q(LNT^{P`&Ug8H)ZE@0H-&Pzcifgc`Irv4tlvY2OPLx>qsN$kZ$QGdgrc1D zg=k(xs)W$>ge$9)&JFw^Axyv^blwBIk~nB-ilEhrF>yDI-R&9Izn4!!iCVs(YC4LAn#ZH^!(I~16{YsplqGbFH`^A>crj4$ zyFGM@*l`m){Ay!H<$2UCr8aQA2DlMjHs@Y@VfEa2}$iYrLqYKRpVVLavEJ3*q06_;!6 z1u2dpKkOh@+*D9XZ%si$xA>rC7u5tQj0KMckmpI9vMSRd#U*$Vt;LG# zuXl`HUBBnzF0taK4I#zJgDpm!>sn%qq+~!iyNW$?>Lb)L07LP>t6?9RQ3jb?!%aq< z-U(F}oj?XR+2Lbi8OF!X0_J3SKZ`vx!n7Z(+TVk55wA+fvQW}etZi!$+hLIP7f>*G zM}xg3R&a!~@=MAxV|vn73t6p!o;HdE{TAfd71lbW%G6z{?&&&&psvBoUjeFZVV=iz zoDDA(q=}8#fhz7lY~($5jwmBmREPbQ)fT(QCCY|Qvi&(g16e8l8i z-K$tRo2po9%I?L><|Lh%U`8xG%xV_r?7>h%scA zahX2!EhPBKEHUR(fb-u9Bx)2V7jT#bJh>9b#hg1i0M7L;>WMAPCfj#!i_M!(ph@hx z><0hd7oC306$^{bLLR7MyBcX zfRET)`aN*xnNJ8w;O|C@!wjg@YxhO?CgO=5q0o*Euq026@eUaP%Y6WTf$ECucgM9R z*R~2zrlLv=FApNNv8`8Z`IZ;x^I%KCT__bxY zV(4%$^|yCR6+3auHY6cQvAER${65p%p|1whtyLSNtH6^u9d~-*#sOo`NN911i0=eo z7u~YOV8LnLb}E5wl5K%ij9{QK%e?J+0^7hN@LCD5Z2(O7qKVj+sSWlCs1k~REOrlp)gUJZF(>pbw5;^|Xi&DsMp9p<^cHo%U{!M$y_Pw_Q z+s+%HO2iy66ZbePK7G>BCUKBsCO);psK@5%GxWqvq+Wd5+xJUM3yChS2afFRu>Uos zwpG~3g8jh8LQ!j-(@7u6#jTVAaJy1#TS3PvS)4VtgS2dT)|F6TAa;kaSI0|MQ7Nu$ zpij7A7Een9mm#0?S@GcoGDZrJ8iU{F5vyJy(QF}U?|WoSY6IvEGsYy6rDAQ}zSX#d z3W=&f5zqlh9R>lWvrxf1UWtp|WUl~@wQvz>RJ;m*ySB9!`fZ&#*%M7rx@%=tXg=1T zSG9OcqqJl5MoDNfp)smxAz?Pnz2PkK|Ec8KW1768__Bpe0b@}+9s;!z)Zw5*#6bsT zVN;w;%(942%EJL7NDAo+s~ZJFkdF7llIAdSg=c1#i>NyqHGrv z4jyZpGQR$&uH7w|)tX{lzz_FsC$VuJ;3wMb(uuFV^zW5v*48`j)K}- zNuEM4TZs5WHIxSBWF?Mxl83Nn6{%*Zymdi?6|dq3F<0?Pl9b!u5p9ei^k=EE`)z#O zUKd}^8N3MHT`W0Oq=;7WMJjU)-oSOaL<+cndEiNjwbS@?_CP^+r>PK6=ZQRB0@~YF z%Mb_`^}&0(5_&n9U+tsNc-nQrR*@1el0zX_36ytS%oD^8+KTnc)`Mn5gw&KdcTC^0 z4koI6;;)jrIbgYC11?UIOC$8_R$lMZxhFXkp!LR~g|?jI%^NmSImsa)RHlaeQZ8T4MUI|}q;JF=^6FcWAVBGr;`%sc_J z7AXC#On#(+Y~*Oia7R0kq3X&U-ev=b_G2aZMkVeW&}~j=O227?ZJPTlFjPz!+5?8B z*`U@`<>di}66K(L7aFfN#zwWq>}#N!48QSp%R#lL53NyC&Xi>iqIoO4a(EVYif)72 zbBP?GMtB9PE6dwmMtv*|A*kG#G=$f|wP`bR3}D+SwNB z33i&tf81%j)KFpY>9h*rLhnFSVYGV(hh{#9iw8?u5imr8Yj6{)X>!zbo?4)kjGVcO z0H3tzIFJmw=keNk=jt}@tLcF##{C;Q1L2Im;#60GI!w)17}zd?90ZAuX}-bP-=j%A z8W?XPDZ?-8$!5aFF)jd@Hi~SvsFwM3nqH2881V*q4B`CBR*W%h05KvZ!4Qq7n;>@X zP+R7dt7vJHq25NcEW%$7s6QbuPK5Lgfw!7_Hg2lv$C*wj#L*4gIkO6ix#i$#M7Qwn8Ig-$XY=Kv5{tbF z;z0>lIY3;n$>5FDzGNfUe8uzWWIvw*<8yFdO!1)c9N1ARh1z^`qn4?o!PIOb;!uq6 z^=^v{b0@)`9nu)Y>JnDq=E3L&JSbhI7`J@TIKph2h!5W-jWUc}bN2)^iqV5c(YQv< zImonAE{o}wtFZ#P^MNAg=&ZbVrHB~Gus=~8^m83Rq`|Si=mv&4sT3BqLuy}Y4@A5SPgxs~ zS)E;Txx^G-{bBxDt`=mPaT%c8Cp3|C_jH!kMUrOr2G|uq=&VCJ&qb>Owpe(s~nIK@KXqjbqJt-TrQr zNv8S`0mWEvDH%cw21)$L7Od?k=CD)&R7|ayjScqfbPAmngV87+>~?hCD%ON!``WS_ zu=f8o2x_%x_EP2@-$Y{jGd5!@^n1tGlFAdcP_T(BrC7rco`9h1h+sp4b@HgU5u~z#^w(N2~ zxrpfCa4J^s`EnOV7e{pNgJ>D)tsP6eT!+}Xw^eqHI2re;v8wbZVB;Q^&-dlZ3#Myh z6GcDR;WY1WohS4yrS0(jUS|II-AP2h2C9rxc=WmxcBwk$SBFBU%eNhfSVL_b^8gn3 za5AvKxAU|LvDQxPkd7GW*MQUR%Ng4UEby>%qh6F|u4!JgmO45ndfo1jTWuWOKFKVc zS6>}zk5?cMb!FKQFqCTThg~;8<5qbGNh{ekh z<(>s?`)BiXf5a&+6$9H>Y}7C4)khTclfWH*2Uyy&Ei7{XhMsS#lPC1^hTj$*6)?Ro ze8)SdHRVlhp3U3CNPSB{ohgA;H}UGuPxJ5QR~nS?-}}9#(oH;v$P|xrXXnD&4?y@ZlGrZ_tMZ`~N`Y{y!pdg{Ck~dUnVAYWY_5yU+JVeI^KxJO3|6 C*#-&# literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/elements/packed/elements7.png b/game/graphics/src/main/resources/elements/packed/elements7.png new file mode 100644 index 0000000000000000000000000000000000000000..dd9fffeae301429c07ceb6a02c02d4dbaeff84e4 GIT binary patch literal 75639 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 literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/elements/packed/elements8.png b/game/graphics/src/main/resources/elements/packed/elements8.png new file mode 100644 index 0000000000000000000000000000000000000000..27de8b3b6240d8704276ee0d75bf819eaa83b93f GIT binary patch literal 52733 zcmb@ucRbbq8$Wy^k&((Kp&@$|NwSr_or7a#ci;Da_aAqU$LEia^L~x%dR^D`y2kT*z0y#Vryyk{g~4DHiVAXCFc={c z{Fg{_3H+r&N(TH-5KK`{TF1+Hqsi$xjZH{C-aLBoYDC?uuxX*bI{kZ_eO`9zlS&N? zl)D03#bVOY#QM?LKcCcZ^KA+UEm}YM>T=_`kwi8P%Q#$ul^6Y#5wSoxv?S}1l=L^K zG(H?#dEGOKS@1f`Am3+moU5+wB_qMA?=NPKnYC9J{L%e|7Fm)9E8ZXF)xKEy70vnt z!naK4RZwjaiB`_D}coS*mXwMgPm@Nucw#V$WQ z1q>$T&xVGS~v&0~Ei5;X<_@WESI#08jC(dusI!x+kB@GN_8J-)K%*%EO z79Y^fRY?kCeIUeJeSG}6H#T-_zq9kWadlO?OowrIdF9Znx7Wf%OhiQMY_G7ewr5V{ ze&q+h=~!lijI0URWkFcbzBHnV18gGRoRJY38amaOmNqkcv`01D_b#I8o;t1gfPsE( z91FkKSXtojOtC{p(dlD+?c;Ng%sXFUFeIfuTp!wjRdnj(aDd|0l zm#6pUrbGXB-4&;!EA%j!?L$kr>o+b~5bcLNbBy%DgGI!UFvG>srC#E9HxXFB{oje6 ze-?s$E~OzV(?!s{fK!8d-9;Ehz~^cb4Ee0EV@Jlg5HTXd{mOkL`2`pwnf_Don`O9r zEjj9WJpn6sFin1litIBV--e8V)Da4%hbJXD9amx5v+?kOyI{V`*3ZaGG{_V_RiA

6hd4W~P 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 literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/elements/packed/elements9.png b/game/graphics/src/main/resources/elements/packed/elements9.png new file mode 100644 index 0000000000000000000000000000000000000000..4018abc572f294c6a71c2719c93f4d50b3819092 GIT binary patch literal 38851 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 literal 0 HcmV?d00001 diff --git a/game/graphics/src/main/resources/elements/unk_rec_siz_armor.png b/game/graphics/src/main/resources/elements/unk_rec_siz_armor.png deleted file mode 100644 index 7f98e1c2d1a09134f1bc500b128cb9cd33c2793c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2938 zcmV-=3x)KFP)Px#1ZP1_K>z@;j|==^1pojGBuPX;RCwCeTnkVY*BSm75CtDYL?Yq~8gN9^V&el1 z8ZcDePcll=iVJ|Fq&pF@z=YQ@h)HLD6(w8NWr7Mds%R`oHEcq-~ zSf$K$6AtY2$Xq&21h^woM zI%Z5aW&HRa6d2f+{QbSi*S8ftd{{~O`S*lmW!<8bl+)_nyZ4zFs^I@i;_q0*Qfc-? zw9pg?nd0K2tZvc5&F#%M`?*Y;)?bjIh001h9XOCjNl9PZPo4VFg_-#mYfLQvsnF~R z)dedP;>NO(B`zf7X?5q$Xr*V*r|bPCAZE#u;}GUUy<@kl2m*SecNOED3RO zp_H8bTWZzHy-{D5p8f+(n6S69w6wgGN%=KdR8y=>!c|X6_o@dWap?2*&4gK{m0fvBiY)T2j#u(S7t3s`FFvKk@nSUY|kKKvPXBe$xWfLlCp;3gbGLzbC6 z>FTf=A+uSMzWCx#GA}^;UF$IAmFLsYu9GF$iCLv zwWsKLflkrot>j+Ofp3&4@$7u=*eN?~kEz7roON*>6QX^IXQuY%k?i0sr){LZ#j2pCg zafZFLv>aLDLre@(IZmmmID-&mZBdU%=+vnV?b-8^v@Zryh8v?2PsZ&!aC+D^pS8X@R-n|#-)mQi1*()nyQU;J@!!MhVDJ<)eLf^c3 zoaV`8Wsk%ixq5XL_3i7&UQjD)+tx#f5#TL|%FF-9T6#gaz0uJ|lCbYPStiI@G--q&4dUU^EI2!RvWuQd->_ky zke62r+OZ@0$v$o*^72Yhpb}dqv=t<*T9ri~e2_`VEbA!?!|=oAF#3?Bt`=E@pgZK` z?Ae3F-L8e5J99;i;^M{WLPLy3N=lCS{&(LULKstZ;P-`vWxBT1t5-`YB;;@QM~`gB z`D3Jvg_A{yFyz;-C+NEK0s>ai%9SGwk3mXG9*AuQZY>P=FKvTxAcBI{2rWSuix%LK zAu-7aqN@HcLm`6@FZSIFM~w<;3Oa8W$xa+U4y;{F7ep0 z-6xE+4}r% zZRpTp1)V?5+4Q|y?8PR31vB}w>G|M(;3>eD_7){>Vl(b8i_}^ z$k?Wg0=nek5TH|13$RtbzDcUhrhdd9CmX$ZQX+K@40HYbTKCA$Pf)b>bxaVR76QZC zyfVZI&~AHc(!IWvrqmDU1oAlNOE)IKCDbuyhL8O10>%36Stba+WM0rwL2 z0$Up56{8c64()*b(E4s@>9fynu;=C$m9hP3PgRf6846j1i1bPS{vF*jGhfrx5=TA> zj~zJNPW%pcA__<#N=B6tE;GC< zLc|U437;GLY{)MG>3ERw&O70hkPxPMJ~G144*rSCAs#d}Tsr`ngt)o5C>g9N1JlxC z6+QlaMn*o38nvA&Dk?>q9J#QTEsY~X;n@}!KM;w>4I6Sq?4rkRV5>sM{PE*A?5e6F z1DPso(PWo!J25HWczb(z@7ovS8Xn%I))O5Cq&97u(~u!uMNR#??~3UD{YQok2AYOA z1LHu~i=K21l9kX_1fk@FZh2=kIfOGQU$UmOUb1AUg3gYbK-62kfFz@0*buF ztb$ZkWFMT;knPMyIfT@BkW)loy?eJ8T_BN>{2XDkfRE4e%94@?$M|rV*^_s`N`&~6IS=e?VVPw1 z51L318S>KR* z1FI1tid#rBHl$HOFR)#8>GC05+mrlpu-TKY4yzI3#u0s2m*SeX!@`{OKeH+Wr0&+BPV ztqweUGI#C~TS383u2l6R%tW&%RTr#I2ml7qo*M1x*~~s;#sC+*k+iNJTxbNE=#rDO z#S1W*)FLMJb&^==GYU79ij3!88{C2V@y?dD2;zXaE2J07*qoM6N<$g31rCU;qFB From 9c736ca5d4db2113a1db27be4e4628008878ee33 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Thu, 12 Oct 2023 23:21:32 +0200 Subject: [PATCH 13/37] playing around with tinting --- .../gleex/pltcmd/game/application/Pltcmd.kt | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt index 1f93e474..636ee56c 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt @@ -37,6 +37,7 @@ class FirstScreen : KtxScreen { val mountainRegions = textureAtlasTerrain.findRegions("mountain") val waterDeepRegions = textureAtlasTerrain.findRegions("water_deep") val waterShallowRegions = textureAtlasTerrain.findRegions("water_shallow") + stage.batch.setColor(255f, 0f, 0f, 1f) drawMap(0..49, 0..49, grasslandsRegions) drawMap(3..6, 2..5, forestRegions) drawMap(30..46, 20..49, forestRegions) @@ -61,35 +62,36 @@ class FirstScreen : KtxScreen { private fun placeElementIconAtRandomPosition(iconSelector: ElementIconSelector) { val imageTexture = textureAtlasElements.findRegion(iconSelector.fileName) - stage.addActor( - Image(imageTexture).apply { - val aspectRatio = imageTexture.packedWidth.toFloat() / imageTexture.packedHeight - val posCorrection = (aspectRatio - 1) / 2f - println("imageSize: ${imageTexture.packedWidth} * ${imageTexture.packedHeight}") - println("aspect = $aspectRatio posCorrection = $posCorrection") - setPosition( - Random.nextInt(19).toFloat(), - Random.nextInt(19).toFloat() - ) - setSize(1f, 1f) - setScaling(Scaling.fillY) - } + stage.addActor(Image(imageTexture).apply { + val aspectRatio = imageTexture.packedWidth.toFloat() / imageTexture.packedHeight + val posCorrection = (aspectRatio - 1) / 2f + println("imageSize: ${imageTexture.packedWidth} * ${imageTexture.packedHeight}") + println("aspect = $aspectRatio posCorrection = $posCorrection") + setPosition( + Random.nextInt(19).toFloat(), + Random.nextInt(19).toFloat() + ) + setSize(1f, 1f) + setScaling(Scaling.fillY) + } ) } private fun drawMap( xRange: IntRange, yRange: IntRange, - grasslandsRegions: Array + atlasRegions: Array ) { for (x in xRange) { for (y in yRange) { - val region = grasslandsRegions.random() + val region = atlasRegions.random() stage.addActor( Image(AtlasRegion(region)).apply { setPosition(x.toFloat(), y.toFloat()) setSize(1f, 1f) setScaling(Scaling.fill) + val tint = Random.nextDouble(0.4, 1.0).toFloat() + setColor(255f, 255f, 255f, tint) } ) } From a8fc457a114c55de765d466cea0ac43ed9468d77 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Sat, 14 Oct 2023 22:08:16 +0200 Subject: [PATCH 14/37] Writing own actors and encapsulating texture loading --- game/application-ktx/pom.xml | 5 ++ .../gleex/pltcmd/game/application/Pltcmd.kt | 21 ++++++- .../actors/terrain/TerrainHeightActor.kt | 62 +++++++++++++++++++ .../actors/terrain/TerrainTypeActor.kt | 16 +++++ .../actors/terrain/WorldTileActor.kt | 11 ++++ .../game/application/graphics/Assets.kt | 10 +++ .../graphics/elements/IconCache.kt | 8 +++ .../graphics/terrain/TerrainAssets.kt | 34 ++++++++++ 8 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/TerrainHeightActor.kt create mode 100644 game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/TerrainTypeActor.kt create mode 100644 game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt create mode 100644 game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/Assets.kt create mode 100644 game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/terrain/TerrainAssets.kt diff --git a/game/application-ktx/pom.xml b/game/application-ktx/pom.xml index 06034a61..1e5ed091 100644 --- a/game/application-ktx/pom.xml +++ b/game/application-ktx/pom.xml @@ -49,6 +49,11 @@ ${gdx.version} natives-desktop
+ + com.github.tommyettinger + colorful + 0.8.4 + diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt index 636ee56c..809ab19f 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt @@ -9,10 +9,16 @@ import com.badlogic.gdx.scenes.scene2d.ui.Image import com.badlogic.gdx.utils.Array import com.badlogic.gdx.utils.Scaling import com.badlogic.gdx.utils.viewport.FitViewport +import de.gleex.pltcmd.game.application.actors.terrain.WorldTileActor import de.gleex.pltcmd.game.application.graphics.elements.ElementIconSelector import de.gleex.pltcmd.game.application.graphics.elements.fileName import de.gleex.pltcmd.model.elements.ElementKind import de.gleex.pltcmd.model.faction.Affiliation +import de.gleex.pltcmd.model.world.WorldTile +import de.gleex.pltcmd.model.world.coordinate.Coordinate +import de.gleex.pltcmd.model.world.terrain.Terrain +import de.gleex.pltcmd.model.world.terrain.TerrainHeight +import de.gleex.pltcmd.model.world.terrain.TerrainType import ktx.app.KtxGame import ktx.app.KtxScreen import ktx.assets.disposeSafely @@ -37,7 +43,6 @@ class FirstScreen : KtxScreen { val mountainRegions = textureAtlasTerrain.findRegions("mountain") val waterDeepRegions = textureAtlasTerrain.findRegions("water_deep") val waterShallowRegions = textureAtlasTerrain.findRegions("water_shallow") - stage.batch.setColor(255f, 0f, 0f, 1f) drawMap(0..49, 0..49, grasslandsRegions) drawMap(3..6, 2..5, forestRegions) drawMap(30..46, 20..49, forestRegions) @@ -53,6 +58,18 @@ class FirstScreen : KtxScreen { drawMap(5..7, 13..13, mountainRegions) drawMap(9..13, 0..2, mountainRegions) + stage.addActor( + WorldTileActor( + WorldTile( + Coordinate(100, 123), + Terrain.Companion.of(TerrainType.MOUNTAIN, TerrainHeight.TEN) + )) + .apply { + setPosition(0f, 0f) + setSize(1f, 1f) + setScale(1f) + }) + placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Hostile, ElementKind.Armored)) placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Friendly, ElementKind.Infantry, tags = listOf("recon"))) placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Unknown, ElementKind.Aerial)) @@ -91,7 +108,7 @@ class FirstScreen : KtxScreen { setSize(1f, 1f) setScaling(Scaling.fill) val tint = Random.nextDouble(0.4, 1.0).toFloat() - setColor(255f, 255f, 255f, tint) +// setColor(255f, 255f, 255f, tint) } ) } diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/TerrainHeightActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/TerrainHeightActor.kt new file mode 100644 index 00000000..82685c58 --- /dev/null +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/TerrainHeightActor.kt @@ -0,0 +1,62 @@ +package de.gleex.pltcmd.game.application.actors.terrain + +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.graphics.GL20 +import com.badlogic.gdx.graphics.g2d.Batch +import com.badlogic.gdx.graphics.glutils.ShapeRenderer +import com.badlogic.gdx.scenes.scene2d.Actor +import de.gleex.pltcmd.model.world.terrain.TerrainHeight + +/** + * This [Actor] should be used as overlay over a [TerrainTypeActor]. It draws a transparent rectangle, tinting + * its underlying graphics. + */ +class TerrainHeightActor(terrainHeight: TerrainHeight) : Actor() { + private val tintFactor = when (terrainHeight) { + TerrainHeight.ONE -> 0.0f + TerrainHeight.TWO -> 0.1f + TerrainHeight.THREE -> 0.2f + TerrainHeight.FOUR -> 0.3f + TerrainHeight.FIVE -> 0.4f + TerrainHeight.SIX -> 0.5f + TerrainHeight.SEVEN -> 0.6f + TerrainHeight.EIGHT -> 0.7f + TerrainHeight.NINE -> 0.8f + TerrainHeight.TEN -> 0.9f + } + + private val shapeColor by lazy { + val greyScale = 255f * tintFactor + Color(greyScale, greyScale, greyScale, 0.5f) + } + + private val renderer = ShapeRenderer() + + init { + setSize(1f, 1f) + } + + override fun draw(batch: Batch?, parentAlpha: Float) { + batch?.end() + + // TODO: maybe there is a better way to enable blending, which makes the underlying image visible when alpha < 1 + Gdx.gl.glEnable(GL20.GL_BLEND) + + with(renderer) { + setProjectionMatrix(batch?.projectionMatrix) + setTransformMatrix(batch?.transformMatrix) + translate(x, y, 0f) + + begin(ShapeRenderer.ShapeType.Filled) + color = this@TerrainHeightActor.shapeColor + rect(0f, 0f, width, height) + end() + + } + + Gdx.gl.glDisable(GL20.GL_BLEND) + + batch?.begin() + } +} diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/TerrainTypeActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/TerrainTypeActor.kt new file mode 100644 index 00000000..e231b5a7 --- /dev/null +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/TerrainTypeActor.kt @@ -0,0 +1,16 @@ +package de.gleex.pltcmd.game.application.actors.terrain + +import com.badlogic.gdx.scenes.scene2d.ui.Image +import com.badlogic.gdx.utils.Scaling +import de.gleex.pltcmd.game.application.graphics.Assets +import de.gleex.pltcmd.model.world.terrain.TerrainType + +/** + * An [Image] actor that just displays the image for the given [TerrainType]. + */ +class TerrainTypeActor(terrainType: TerrainType) : Image(Assets.terrain.textureFor(terrainType)) { + init { + setSize(1f, 1f) + setScaling(Scaling.fill) + } +} \ No newline at end of file diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt new file mode 100644 index 00000000..5ba8f53c --- /dev/null +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt @@ -0,0 +1,11 @@ +package de.gleex.pltcmd.game.application.actors.terrain + +import com.badlogic.gdx.scenes.scene2d.Group +import de.gleex.pltcmd.model.world.WorldTile + +class WorldTileActor(private val tile: WorldTile): Group() { + init { + addActor(TerrainTypeActor(tile.type)) + addActor(TerrainHeightActor(tile.height)) + } +} \ No newline at end of file diff --git a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/Assets.kt b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/Assets.kt new file mode 100644 index 00000000..4433bd11 --- /dev/null +++ b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/Assets.kt @@ -0,0 +1,10 @@ +package de.gleex.pltcmd.game.application.graphics + +import de.gleex.pltcmd.game.application.graphics.terrain.TerrainAssets + +/** + * Loads graphical assets. + */ +object Assets { + val terrain by lazy { TerrainAssets() } +} \ No newline at end of file diff --git a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/elements/IconCache.kt b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/elements/IconCache.kt index 374c2062..071b9685 100644 --- a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/elements/IconCache.kt +++ b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/elements/IconCache.kt @@ -1,5 +1,8 @@ package de.gleex.pltcmd.game.application.graphics.elements +import com.badlogic.gdx.Files +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.graphics.g2d.TextureAtlas import de.gleex.pltcmd.model.elements.ElementKind import de.gleex.pltcmd.model.elements.Rung import de.gleex.pltcmd.model.faction.Affiliation @@ -15,6 +18,11 @@ import java.net.URL object IconCache { private val log = KotlinLogging.logger { } + // TODO: wrap the atlas into application logic like getTextureFor(element) + fun getTextureAtlas(): TextureAtlas { + return TextureAtlas(Gdx.files.getFileHandle("elements/packed/elements.atlas", Files.FileType.Classpath)) + } + /** * @return the URL of the icon for the given [ElementIconSelector]. * diff --git a/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/terrain/TerrainAssets.kt b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/terrain/TerrainAssets.kt new file mode 100644 index 00000000..fd9ad5c5 --- /dev/null +++ b/game/graphics/src/main/kotlin/de/gleex/pltcmd/game/application/graphics/terrain/TerrainAssets.kt @@ -0,0 +1,34 @@ +package de.gleex.pltcmd.game.application.graphics.terrain + +import com.badlogic.gdx.Files +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.graphics.g2d.TextureAtlas +import com.badlogic.gdx.graphics.g2d.TextureRegion +import de.gleex.pltcmd.model.world.terrain.TerrainType +import kotlin.random.Random + +/** + * Manages the texture atlas containing terrain type graphics. + */ +class TerrainAssets { + private val terrainAtlas by lazy { TextureAtlas(Gdx.files.getFileHandle("terrain/packed/terrain.atlas", Files.FileType.Classpath)) } + + /** + * @param terrainType to load the [TextureRegion] for + * @param seed to seed the random that is used to select one of multiple images + * @return a [TextureRegion] from the [TextureAtlas] that contains the terrain [TerrainType] images. + */ + fun textureFor(terrainType: TerrainType, seed: Long = System.currentTimeMillis()): TextureRegion { + val regionName = when(terrainType) { + TerrainType.GRASSLAND -> "grasslands" + TerrainType.FOREST -> "forest" + TerrainType.HILL -> "hills" + TerrainType.MOUNTAIN -> "mountain" + TerrainType.WATER_DEEP -> "water_deep" + TerrainType.WATER_SHALLOW -> "water_shallow" + } + val regions = terrainAtlas.findRegions(regionName) + val index = Random(seed).nextInt(regions.size) + return regions[index] + } +} From 59eb85687c24fa2a231a3b5b461e3876edac0f6a Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Sat, 14 Oct 2023 22:08:46 +0200 Subject: [PATCH 15/37] removed colorful for now (not (yet?) needed) --- game/application-ktx/pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/game/application-ktx/pom.xml b/game/application-ktx/pom.xml index 1e5ed091..06034a61 100644 --- a/game/application-ktx/pom.xml +++ b/game/application-ktx/pom.xml @@ -49,11 +49,6 @@ ${gdx.version} natives-desktop - - com.github.tommyettinger - colorful - 0.8.4 - From 25cc8e05816927ae99aad46349c53a1b52c61ac9 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Thu, 26 Oct 2023 20:51:38 +0200 Subject: [PATCH 16/37] Started to write text with a skin --- .../gleex/pltcmd/game/application/Pltcmd.kt | 4 +++ .../actors/terrain/CoordinateTileActor.kt | 25 +++++++++++++++++++ .../actors/terrain/WorldTileActor.kt | 1 + .../game/application/skin/PltcmdUiSkin.kt | 1 + 4 files changed, 31 insertions(+) create mode 100644 game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/CoordinateTileActor.kt create mode 100644 game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/skin/PltcmdUiSkin.kt diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt index 809ab19f..f3138292 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt @@ -6,6 +6,7 @@ import com.badlogic.gdx.graphics.g2d.TextureAtlas import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion import com.badlogic.gdx.scenes.scene2d.Stage import com.badlogic.gdx.scenes.scene2d.ui.Image +import com.badlogic.gdx.scenes.scene2d.ui.Skin import com.badlogic.gdx.utils.Array import com.badlogic.gdx.utils.Scaling import com.badlogic.gdx.utils.viewport.FitViewport @@ -32,11 +33,14 @@ class Pltcmd : KtxGame() { } class FirstScreen : KtxScreen { + private val skin: Skin = Skin() private val stage = Stage(FitViewport(20f, 20f)) private val textureAtlasTerrain = TextureAtlas(Gdx.files.getFileHandle("terrain/packed/terrain.atlas", Files.FileType.Classpath)) private val textureAtlasElements = TextureAtlas(Gdx.files.getFileHandle("elements/packed/elements.atlas", Files.FileType.Classpath)) override fun show() { + Gdx.input.inputProcessor = stage + val grasslandsRegions = textureAtlasTerrain.findRegions("grasslands") val forestRegions = textureAtlasTerrain.findRegions("forest") val hillsRegions = textureAtlasTerrain.findRegions("hills") diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/CoordinateTileActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/CoordinateTileActor.kt new file mode 100644 index 00000000..f275437f --- /dev/null +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/CoordinateTileActor.kt @@ -0,0 +1,25 @@ +package de.gleex.pltcmd.game.application.actors.terrain + +import com.badlogic.gdx.scenes.scene2d.Actor +import com.badlogic.gdx.scenes.scene2d.InputEvent +import com.badlogic.gdx.scenes.scene2d.ui.Label +import com.badlogic.gdx.scenes.scene2d.ui.Skin +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener +import de.gleex.pltcmd.model.world.coordinate.Coordinate + +/** + * An actor that displays the current coordinate when hovered. + */ +class CoordinateTileActor(coordinate: Coordinate) : Label(coordinate.toString(), Skin()) { + init { + addListener(object: ClickListener() { + override fun enter(event: InputEvent?, x: Float, y: Float, pointer: Int, fromActor: Actor?) { + isVisible = true + } + + override fun exit(event: InputEvent?, x: Float, y: Float, pointer: Int, toActor: Actor?) { + isVisible = false + } + }) + } +} diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt index 5ba8f53c..b3289147 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt @@ -7,5 +7,6 @@ class WorldTileActor(private val tile: WorldTile): Group() { init { addActor(TerrainTypeActor(tile.type)) addActor(TerrainHeightActor(tile.height)) + addActor(CoordinateTileActor(tile.coordinate)) } } \ No newline at end of file diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/skin/PltcmdUiSkin.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/skin/PltcmdUiSkin.kt new file mode 100644 index 00000000..e38ad5fd --- /dev/null +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/skin/PltcmdUiSkin.kt @@ -0,0 +1 @@ +package de.gleex.pltcmd.game.application.skin From 1c9fb9d8caf1d1b33a14c26809f20bf7dfbeaba9 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Thu, 26 Oct 2023 20:52:51 +0200 Subject: [PATCH 17/37] moved FirstScreen to screens package --- .../gleex/pltcmd/game/application/Pltcmd.kt | 125 +-------------- .../game/application/screens/FirstScreen.kt | 145 ++++++++++++++++++ 2 files changed, 146 insertions(+), 124 deletions(-) create mode 100644 game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/FirstScreen.kt diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt index f3138292..fc133d05 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt @@ -1,29 +1,8 @@ package de.gleex.pltcmd.game.application -import com.badlogic.gdx.Files -import com.badlogic.gdx.Gdx -import com.badlogic.gdx.graphics.g2d.TextureAtlas -import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion -import com.badlogic.gdx.scenes.scene2d.Stage -import com.badlogic.gdx.scenes.scene2d.ui.Image -import com.badlogic.gdx.scenes.scene2d.ui.Skin -import com.badlogic.gdx.utils.Array -import com.badlogic.gdx.utils.Scaling -import com.badlogic.gdx.utils.viewport.FitViewport -import de.gleex.pltcmd.game.application.actors.terrain.WorldTileActor -import de.gleex.pltcmd.game.application.graphics.elements.ElementIconSelector -import de.gleex.pltcmd.game.application.graphics.elements.fileName -import de.gleex.pltcmd.model.elements.ElementKind -import de.gleex.pltcmd.model.faction.Affiliation -import de.gleex.pltcmd.model.world.WorldTile -import de.gleex.pltcmd.model.world.coordinate.Coordinate -import de.gleex.pltcmd.model.world.terrain.Terrain -import de.gleex.pltcmd.model.world.terrain.TerrainHeight -import de.gleex.pltcmd.model.world.terrain.TerrainType +import de.gleex.pltcmd.game.application.screens.FirstScreen import ktx.app.KtxGame import ktx.app.KtxScreen -import ktx.assets.disposeSafely -import kotlin.random.Random class Pltcmd : KtxGame() { override fun create() { @@ -32,105 +11,3 @@ class Pltcmd : KtxGame() { } } -class FirstScreen : KtxScreen { - private val skin: Skin = Skin() - private val stage = Stage(FitViewport(20f, 20f)) - private val textureAtlasTerrain = TextureAtlas(Gdx.files.getFileHandle("terrain/packed/terrain.atlas", Files.FileType.Classpath)) - private val textureAtlasElements = TextureAtlas(Gdx.files.getFileHandle("elements/packed/elements.atlas", Files.FileType.Classpath)) - - override fun show() { - Gdx.input.inputProcessor = stage - - val grasslandsRegions = textureAtlasTerrain.findRegions("grasslands") - val forestRegions = textureAtlasTerrain.findRegions("forest") - val hillsRegions = textureAtlasTerrain.findRegions("hills") - val mountainRegions = textureAtlasTerrain.findRegions("mountain") - val waterDeepRegions = textureAtlasTerrain.findRegions("water_deep") - val waterShallowRegions = textureAtlasTerrain.findRegions("water_shallow") - drawMap(0..49, 0..49, grasslandsRegions) - drawMap(3..6, 2..5, forestRegions) - drawMap(30..46, 20..49, forestRegions) - drawMap(20..26, 21..25, forestRegions) - // a river - drawMap(0..10, 10..10, waterShallowRegions) - drawMap(11..15, 10..10, waterDeepRegions) - drawMap(8..15, 11..11, waterDeepRegions) - drawMap(8..15, 9..9, waterDeepRegions) - // hills and mountains - drawMap(3..12, 12..12, hillsRegions) - drawMap(4..9, 13..15, hillsRegions) - drawMap(5..7, 13..13, mountainRegions) - drawMap(9..13, 0..2, mountainRegions) - - stage.addActor( - WorldTileActor( - WorldTile( - Coordinate(100, 123), - Terrain.Companion.of(TerrainType.MOUNTAIN, TerrainHeight.TEN) - )) - .apply { - setPosition(0f, 0f) - setSize(1f, 1f) - setScale(1f) - }) - - placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Hostile, ElementKind.Armored)) - placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Friendly, ElementKind.Infantry, tags = listOf("recon"))) - placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Unknown, ElementKind.Aerial)) - placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Neutral, ElementKind.Infantry, tags = listOf("engi"))) - placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Self, ElementKind.MechanizedInfantry)) - } - - private fun placeElementIconAtRandomPosition(iconSelector: ElementIconSelector) { - val imageTexture = textureAtlasElements.findRegion(iconSelector.fileName) - stage.addActor(Image(imageTexture).apply { - val aspectRatio = imageTexture.packedWidth.toFloat() / imageTexture.packedHeight - val posCorrection = (aspectRatio - 1) / 2f - println("imageSize: ${imageTexture.packedWidth} * ${imageTexture.packedHeight}") - println("aspect = $aspectRatio posCorrection = $posCorrection") - setPosition( - Random.nextInt(19).toFloat(), - Random.nextInt(19).toFloat() - ) - setSize(1f, 1f) - setScaling(Scaling.fillY) - } - ) - } - - private fun drawMap( - xRange: IntRange, - yRange: IntRange, - atlasRegions: Array - ) { - for (x in xRange) { - for (y in yRange) { - val region = atlasRegions.random() - stage.addActor( - Image(AtlasRegion(region)).apply { - setPosition(x.toFloat(), y.toFloat()) - setSize(1f, 1f) - setScaling(Scaling.fill) - val tint = Random.nextDouble(0.4, 1.0).toFloat() -// setColor(255f, 255f, 255f, tint) - } - ) - } - } - } - - override fun render(delta: Float) { - with(stage) { - act(delta) - draw() - } - } - - override fun resize(width: Int, height: Int) { - stage.viewport.update(width, height) - } - - override fun dispose() { - stage.disposeSafely() - } -} diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/FirstScreen.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/FirstScreen.kt new file mode 100644 index 00000000..4b3cb773 --- /dev/null +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/FirstScreen.kt @@ -0,0 +1,145 @@ +package de.gleex.pltcmd.game.application.screens + +import com.badlogic.gdx.Files +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.graphics.g2d.TextureAtlas +import com.badlogic.gdx.scenes.scene2d.Stage +import com.badlogic.gdx.scenes.scene2d.ui.Image +import com.badlogic.gdx.scenes.scene2d.ui.Skin +import com.badlogic.gdx.utils.Array +import com.badlogic.gdx.utils.Scaling +import com.badlogic.gdx.utils.viewport.FitViewport +import de.gleex.pltcmd.game.application.actors.terrain.WorldTileActor +import de.gleex.pltcmd.game.application.graphics.elements.ElementIconSelector +import de.gleex.pltcmd.game.application.graphics.elements.fileName +import de.gleex.pltcmd.model.elements.ElementKind +import de.gleex.pltcmd.model.faction.Affiliation +import de.gleex.pltcmd.model.world.WorldTile +import de.gleex.pltcmd.model.world.coordinate.Coordinate +import de.gleex.pltcmd.model.world.terrain.Terrain +import de.gleex.pltcmd.model.world.terrain.TerrainHeight +import de.gleex.pltcmd.model.world.terrain.TerrainType +import ktx.app.KtxScreen +import ktx.assets.disposeSafely +import kotlin.random.Random + +/** + * First steps with libgdx/KTX. This screen is kind of a playground. + */ +class FirstScreen : KtxScreen { + private val skin: Skin = Skin() + private val stage = Stage(FitViewport(20f, 20f)) + private val textureAtlasTerrain = + TextureAtlas(Gdx.files.getFileHandle("terrain/packed/terrain.atlas", Files.FileType.Classpath)) + private val textureAtlasElements = + TextureAtlas(Gdx.files.getFileHandle("elements/packed/elements.atlas", Files.FileType.Classpath)) + + override fun show() { + Gdx.input.inputProcessor = stage + + val grasslandsRegions = textureAtlasTerrain.findRegions("grasslands") + val forestRegions = textureAtlasTerrain.findRegions("forest") + val hillsRegions = textureAtlasTerrain.findRegions("hills") + val mountainRegions = textureAtlasTerrain.findRegions("mountain") + val waterDeepRegions = textureAtlasTerrain.findRegions("water_deep") + val waterShallowRegions = textureAtlasTerrain.findRegions("water_shallow") + drawMap(0..49, 0..49, grasslandsRegions) + drawMap(3..6, 2..5, forestRegions) + drawMap(30..46, 20..49, forestRegions) + drawMap(20..26, 21..25, forestRegions) + // a river + drawMap(0..10, 10..10, waterShallowRegions) + drawMap(11..15, 10..10, waterDeepRegions) + drawMap(8..15, 11..11, waterDeepRegions) + drawMap(8..15, 9..9, waterDeepRegions) + // hills and mountains + drawMap(3..12, 12..12, hillsRegions) + drawMap(4..9, 13..15, hillsRegions) + drawMap(5..7, 13..13, mountainRegions) + drawMap(9..13, 0..2, mountainRegions) + + stage.addActor( + WorldTileActor( + WorldTile( + Coordinate(100, 123), + Terrain.of(TerrainType.MOUNTAIN, TerrainHeight.TEN) + ) + ) + .apply { + setPosition(0f, 0f) + setSize(1f, 1f) + setScale(1f) + }) + + placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Hostile, ElementKind.Armored)) + placeElementIconAtRandomPosition( + ElementIconSelector( + Affiliation.Friendly, + ElementKind.Infantry, + tags = listOf("recon") + ) + ) + placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Unknown, ElementKind.Aerial)) + placeElementIconAtRandomPosition( + ElementIconSelector( + Affiliation.Neutral, + ElementKind.Infantry, + tags = listOf("engi") + ) + ) + placeElementIconAtRandomPosition(ElementIconSelector(Affiliation.Self, ElementKind.MechanizedInfantry)) + } + + private fun placeElementIconAtRandomPosition(iconSelector: ElementIconSelector) { + val imageTexture = textureAtlasElements.findRegion(iconSelector.fileName) + stage.addActor(Image(imageTexture).apply { + val aspectRatio = imageTexture.packedWidth.toFloat() / imageTexture.packedHeight + val posCorrection = (aspectRatio - 1) / 2f + println("imageSize: ${imageTexture.packedWidth} * ${imageTexture.packedHeight}") + println("aspect = $aspectRatio posCorrection = $posCorrection") + setPosition( + Random.nextInt(19).toFloat(), + Random.nextInt(19).toFloat() + ) + setSize(1f, 1f) + setScaling(Scaling.fillY) + } + ) + } + + private fun drawMap( + xRange: IntRange, + yRange: IntRange, + atlasRegions: Array + ) { + for (x in xRange) { + for (y in yRange) { + val region = atlasRegions.random() + stage.addActor( + Image(TextureAtlas.AtlasRegion(region)).apply { + setPosition(x.toFloat(), y.toFloat()) + setSize(1f, 1f) + setScaling(Scaling.fill) + val tint = Random.nextDouble(0.4, 1.0).toFloat() +// setColor(255f, 255f, 255f, tint) + } + ) + } + } + } + + override fun render(delta: Float) { + with(stage) { + act(delta) + draw() + } + } + + override fun resize(width: Int, height: Int) { + stage.viewport.update(width, height) + } + + override fun dispose() { + stage.disposeSafely() + } +} \ No newline at end of file From 4bfe3ec4b30070a4ad7ff176f657be5536b2c680 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Thu, 26 Oct 2023 21:14:37 +0200 Subject: [PATCH 18/37] starting to try out tiledmap --- game/application-ktx/pom.xml | 9 +++++++ .../gleex/pltcmd/game/application/Pltcmd.kt | 27 ++++++++++++++++--- .../application/screens/MainGameScreen.kt | 24 +++++++++++++++++ 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt diff --git a/game/application-ktx/pom.xml b/game/application-ktx/pom.xml index 06034a61..8da09b20 100644 --- a/game/application-ktx/pom.xml +++ b/game/application-ktx/pom.xml @@ -32,6 +32,15 @@ + + de.gleex.pltcmd.model + world + + + de.gleex.pltcmd.model + mapgeneration + + com.badlogicgames.gdx diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt index fc133d05..94b9c33b 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt @@ -1,13 +1,34 @@ package de.gleex.pltcmd.game.application -import de.gleex.pltcmd.game.application.screens.FirstScreen +import de.gleex.pltcmd.game.application.screens.MainGameScreen +import de.gleex.pltcmd.model.mapgeneration.mapgenerators.WorldMapGenerator +import de.gleex.pltcmd.model.world.WorldMap import ktx.app.KtxGame import ktx.app.KtxScreen +import mu.KotlinLogging +import kotlin.time.DurationUnit +import kotlin.time.measureTimedValue + +private val log = KotlinLogging.logger { } class Pltcmd : KtxGame() { override fun create() { - addScreen(FirstScreen()) - setScreen() +// addScreen(FirstScreen()) + val worldMap: WorldMap = generateWorld() + val screen = MainGameScreen(worldMap) + log.info { "Adding $screen" } + addScreen(screen) + log.info { "Loading screen" } + setScreen() + } + + private fun generateWorld(): WorldMap { + val seed = System.currentTimeMillis() + log.info { "Generating world with seed $seed" } + val worldMapGenerator = WorldMapGenerator(seed, 100, 100) + val (worldMap, duration) = measureTimedValue { worldMapGenerator.generateWorld() } + log.info { "Generated world in ${duration.toString(DurationUnit.SECONDS, decimals = 3)}" } + return worldMap } } diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt new file mode 100644 index 00000000..043c5541 --- /dev/null +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt @@ -0,0 +1,24 @@ +package de.gleex.pltcmd.game.application.screens + +import com.badlogic.gdx.graphics.OrthographicCamera +import com.badlogic.gdx.maps.tiled.TiledMap +import com.badlogic.gdx.maps.tiled.renderers.OrthoCachedTiledMapRenderer +import de.gleex.pltcmd.model.world.WorldMap +import ktx.app.KtxScreen + +/** + * This screen is the main interface for the player. It mainly renders the given [WorldMap]. + */ +class MainGameScreen(worldMap: WorldMap): KtxScreen { + private val tiledMap: TiledMap = TiledMap() + private val camera = OrthographicCamera() + private val renderer = OrthoCachedTiledMapRenderer(tiledMap, (1f/16f)) + + override fun show() { + // set up tiledMap + + // set up renderer + + // render??? + } +} From 8ed7f562573dbacc15a7aa03c49a937e07006ba2 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Fri, 27 Oct 2023 20:47:53 +0200 Subject: [PATCH 19/37] tried to go back to mouse over coordinates but displaying text seems to be hard --- game/application-ktx/pom.xml | 5 +++ .../gleex/pltcmd/game/application/Pltcmd.kt | 10 ++++-- .../actors/terrain/CoordinateTileActor.kt | 13 ++++--- .../application/screens/MainGameScreen.kt | 34 ++++++++++++++++++- 4 files changed, 55 insertions(+), 7 deletions(-) diff --git a/game/application-ktx/pom.xml b/game/application-ktx/pom.xml index 8da09b20..69b1e773 100644 --- a/game/application-ktx/pom.xml +++ b/game/application-ktx/pom.xml @@ -75,6 +75,11 @@ ktx-graphics ${ktx.version} + + io.github.libktx + ktx-vis-style + ${ktx.version} +
\ No newline at end of file diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt index 94b9c33b..d903df67 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt @@ -1,5 +1,7 @@ package de.gleex.pltcmd.game.application +import com.kotcrab.vis.ui.VisUI +import de.gleex.pltcmd.game.application.screens.FirstScreen import de.gleex.pltcmd.game.application.screens.MainGameScreen import de.gleex.pltcmd.model.mapgeneration.mapgenerators.WorldMapGenerator import de.gleex.pltcmd.model.world.WorldMap @@ -13,13 +15,17 @@ private val log = KotlinLogging.logger { } class Pltcmd : KtxGame() { override fun create() { -// addScreen(FirstScreen()) + log.info { "loading VisUI" } + VisUI.load(VisUI.SkinScale.X1) + + addScreen(FirstScreen()) val worldMap: WorldMap = generateWorld() val screen = MainGameScreen(worldMap) log.info { "Adding $screen" } addScreen(screen) log.info { "Loading screen" } - setScreen() +// setScreen() + setScreen() } private fun generateWorld(): WorldMap { diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/CoordinateTileActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/CoordinateTileActor.kt index f275437f..78dce9a0 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/CoordinateTileActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/CoordinateTileActor.kt @@ -2,17 +2,22 @@ package de.gleex.pltcmd.game.application.actors.terrain import com.badlogic.gdx.scenes.scene2d.Actor import com.badlogic.gdx.scenes.scene2d.InputEvent +import com.badlogic.gdx.scenes.scene2d.InputListener import com.badlogic.gdx.scenes.scene2d.ui.Label -import com.badlogic.gdx.scenes.scene2d.ui.Skin -import com.badlogic.gdx.scenes.scene2d.utils.ClickListener +import com.kotcrab.vis.ui.VisUI import de.gleex.pltcmd.model.world.coordinate.Coordinate /** * An actor that displays the current coordinate when hovered. */ -class CoordinateTileActor(coordinate: Coordinate) : Label(coordinate.toString(), Skin()) { +class CoordinateTileActor(coordinate: Coordinate) : Label(coordinate.toString(), VisUI.getSkin()) { + init { - addListener(object: ClickListener() { + setScale(1.0f) + setPosition(0f, 0f) + setFontScale(1.0f) + + addListener(object: InputListener() { override fun enter(event: InputEvent?, x: Float, y: Float, pointer: Int, fromActor: Actor?) { isVisible = true } diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt index 043c5541..356ae69b 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt @@ -1,24 +1,56 @@ package de.gleex.pltcmd.game.application.screens +import com.badlogic.gdx.Files +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.graphics.GL20 import com.badlogic.gdx.graphics.OrthographicCamera +import com.badlogic.gdx.graphics.g2d.TextureAtlas import com.badlogic.gdx.maps.tiled.TiledMap +import com.badlogic.gdx.maps.tiled.TiledMapTileLayer import com.badlogic.gdx.maps.tiled.renderers.OrthoCachedTiledMapRenderer +import com.badlogic.gdx.maps.tiled.tiles.StaticTiledMapTile import de.gleex.pltcmd.model.world.WorldMap import ktx.app.KtxScreen + /** * This screen is the main interface for the player. It mainly renders the given [WorldMap]. */ class MainGameScreen(worldMap: WorldMap): KtxScreen { private val tiledMap: TiledMap = TiledMap() - private val camera = OrthographicCamera() + private var camera = OrthographicCamera() private val renderer = OrthoCachedTiledMapRenderer(tiledMap, (1f/16f)) + private val textureAtlasTerrain = + TextureAtlas(Gdx.files.getFileHandle("terrain/packed/terrain.atlas", Files.FileType.Classpath)) + override fun show() { + // set up camera + val w = Gdx.graphics.width.toFloat() + val h = Gdx.graphics.height.toFloat() + + camera = OrthographicCamera() + camera.setToOrtho(false, w, h) + camera.update() + // set up tiledMap + val layer =TiledMapTileLayer(50, 50, 16, 16).apply { + setCell(1, 1, TiledMapTileLayer.Cell().apply { tile = StaticTiledMapTile(textureAtlasTerrain.findRegion("grasslands")) }) + } + tiledMap.layers.add(layer) // set up renderer + renderer.setView(camera); // render??? } + + override fun render(delta: Float) { + Gdx.gl.glClearColor(1f, 1f, 1f, 1f); + Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + camera.update(); + + renderer.render(); + } } From ab6646d182fd2464631f738aa4a1a5197c7d158b Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Tue, 26 Dec 2023 22:48:52 +0100 Subject: [PATCH 20/37] manually rendering the world by drawing --- .../gleex/pltcmd/game/application/Pltcmd.kt | 6 +- .../actors/WorldMapRendererActor.kt | 94 +++++++++++++ .../actors/terrain/WorldTileActor.kt | 5 + .../application/screens/MainGameScreen.kt | 127 +++++++++++++----- 4 files changed, 193 insertions(+), 39 deletions(-) create mode 100644 game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt index d903df67..c0108bf3 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt @@ -24,12 +24,12 @@ class Pltcmd : KtxGame() { log.info { "Adding $screen" } addScreen(screen) log.info { "Loading screen" } -// setScreen() - setScreen() + setScreen() +// setScreen() } private fun generateWorld(): WorldMap { - val seed = System.currentTimeMillis() + val seed: Long = 23 //System.currentTimeMillis() log.info { "Generating world with seed $seed" } val worldMapGenerator = WorldMapGenerator(seed, 100, 100) val (worldMap, duration) = measureTimedValue { worldMapGenerator.generateWorld() } diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt new file mode 100644 index 00000000..cc55a02f --- /dev/null +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -0,0 +1,94 @@ +package de.gleex.pltcmd.game.application.actors + +import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.graphics.g2d.Batch +import com.badlogic.gdx.graphics.glutils.ShapeRenderer +import com.badlogic.gdx.scenes.scene2d.Actor +import de.gleex.pltcmd.model.world.WorldMap +import de.gleex.pltcmd.model.world.WorldTile +import de.gleex.pltcmd.model.world.coordinate.Coordinate +import de.gleex.pltcmd.model.world.terrain.TerrainType + +class WorldMapRendererActor(private val worldMap: WorldMap) : Actor() { + private val renderer = ShapeRenderer() + + private val bottomLeftCoordinate = worldMap.origin + + init { + color = Color.DARK_GRAY + } + + override fun draw(batch: Batch?, parentAlpha: Float) { + batch?.end() + + renderer.transformMatrix = batch?.transformMatrix + renderer.projectionMatrix = batch?.projectionMatrix + renderer.translate(x, y, 0f) + + renderer.fillBackground() + + var currentCoordinate = bottomLeftCoordinate + var currentDrawPosition: Pair + do { + if(currentCoordinate in worldMap) { + renderer.drawTile(worldMap[currentCoordinate]) + } + currentCoordinate = currentCoordinate.movedBy(1, 0) + currentDrawPosition = drawPositionOf(currentCoordinate) + if(currentDrawPosition.first >= width) { + currentCoordinate = currentCoordinate.withEasting(bottomLeftCoordinate.eastingFromLeft).movedBy(0, 1) + currentDrawPosition = drawPositionOf(currentCoordinate) + } + } while(currentDrawPosition.first < width && currentDrawPosition.second < height) + + batch?.begin() + } + + private fun ShapeRenderer.drawTile(worldTile: WorldTile) { + val (drawPosX, drawPosY) = drawPositionOf(worldTile.coordinate) + drawWithType(ShapeRenderer.ShapeType.Filled) { + // TODO: draw height + color = terrainTypeColor[worldTile.type] + rect(drawPosX, drawPosY, TILE_WIDTH, TILE_HEIGHT) + } + } + + private fun ShapeRenderer.fillBackground() { + drawWithType(ShapeRenderer.ShapeType.Filled) { + color = this@WorldMapRendererActor.color + rect(0f, 0f, width, height) + } + } + + private inline fun ShapeRenderer.drawWithType(type: ShapeRenderer.ShapeType, crossinline drawInstructions: ShapeRenderer.() -> Unit) { + begin(type) + drawInstructions() + end() + } + + /** + * Translates the given coordinate to the position inside of this actor. + */ + private fun drawPositionOf(coordinate: Coordinate): Pair { + val currentOriginCoordinate = coordinate - bottomLeftCoordinate + val drawPosX: Float = currentOriginCoordinate.eastingFromLeft.toFloat() * TILE_WIDTH + val drawPosY: Float = currentOriginCoordinate.northingFromBottom.toFloat() * TILE_HEIGHT + return drawPosX to drawPosY + } + + companion object { + private val terrainTypeColor: Map = TerrainType.entries.toTypedArray().associate { + when (it) { + TerrainType.GRASSLAND -> it to Color.GREEN + TerrainType.FOREST -> it to Color.OLIVE + TerrainType.HILL -> it to Color.GRAY + TerrainType.MOUNTAIN -> it to Color.BROWN + TerrainType.WATER_DEEP -> it to Color.BLUE + TerrainType.WATER_SHALLOW -> it to Color.CYAN + } + } + + private const val TILE_WIDTH = 16f + private const val TILE_HEIGHT = 16f + } +} \ No newline at end of file diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt index b3289147..237856d4 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt @@ -1,5 +1,6 @@ package de.gleex.pltcmd.game.application.actors.terrain +import com.badlogic.gdx.scenes.scene2d.Action import com.badlogic.gdx.scenes.scene2d.Group import de.gleex.pltcmd.model.world.WorldTile @@ -9,4 +10,8 @@ class WorldTileActor(private val tile: WorldTile): Group() { addActor(TerrainHeightActor(tile.height)) addActor(CoordinateTileActor(tile.coordinate)) } + + override fun addAction(action: Action?) { + super.addAction(action) + } } \ No newline at end of file diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt index 356ae69b..5e59bf66 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt @@ -1,56 +1,111 @@ package de.gleex.pltcmd.game.application.screens -import com.badlogic.gdx.Files import com.badlogic.gdx.Gdx -import com.badlogic.gdx.graphics.GL20 -import com.badlogic.gdx.graphics.OrthographicCamera -import com.badlogic.gdx.graphics.g2d.TextureAtlas -import com.badlogic.gdx.maps.tiled.TiledMap -import com.badlogic.gdx.maps.tiled.TiledMapTileLayer -import com.badlogic.gdx.maps.tiled.renderers.OrthoCachedTiledMapRenderer -import com.badlogic.gdx.maps.tiled.tiles.StaticTiledMapTile +import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.graphics.g2d.Batch +import com.badlogic.gdx.graphics.glutils.ShapeRenderer +import com.badlogic.gdx.scenes.scene2d.Actor +import com.badlogic.gdx.scenes.scene2d.InputEvent +import com.badlogic.gdx.scenes.scene2d.InputListener +import com.badlogic.gdx.scenes.scene2d.Stage +import com.badlogic.gdx.scenes.scene2d.actions.Actions +import com.badlogic.gdx.scenes.scene2d.actions.ColorAction +import com.badlogic.gdx.utils.viewport.StretchViewport +import de.gleex.pltcmd.game.application.actors.WorldMapRendererActor import de.gleex.pltcmd.model.world.WorldMap import ktx.app.KtxScreen +import mu.KotlinLogging +private val log = KotlinLogging.logger { } + /** * This screen is the main interface for the player. It mainly renders the given [WorldMap]. */ -class MainGameScreen(worldMap: WorldMap): KtxScreen { - private val tiledMap: TiledMap = TiledMap() - private var camera = OrthographicCamera() - private val renderer = OrthoCachedTiledMapRenderer(tiledMap, (1f/16f)) +class MainGameScreen(private val worldMap: WorldMap) : KtxScreen { + private val stage = Stage(StretchViewport(1100f, 1000f)) + override fun show() { + Gdx.input.inputProcessor = stage + // set up actors + stage.addActor(StupidClickableActor().apply { + x = 0f + y = 0f + width = 300f + height = 800f + }) + stage.addActor(StupidClickableActor().apply { + x = 0f + y = 800f + width = 1100f + height = 200f + }) + stage.addActor(WorldMapRendererActor(worldMap).apply { + x = 300f + y = 0f + width = 800f + height = 800f + }) + } - private val textureAtlasTerrain = - TextureAtlas(Gdx.files.getFileHandle("terrain/packed/terrain.atlas", Files.FileType.Classpath)) + override fun render(delta: Float) { + stage.act(delta) + stage.draw() + } - override fun show() { - // set up camera - val w = Gdx.graphics.width.toFloat() - val h = Gdx.graphics.height.toFloat() + override fun resize(width: Int, height: Int) { + stage.viewport.update(width, height) + } + + override fun dispose() { + stage.dispose() + } +} - camera = OrthographicCamera() - camera.setToOrtho(false, w, h) - camera.update() +private class StupidClickableActor : Actor() { - // set up tiledMap - val layer =TiledMapTileLayer(50, 50, 16, 16).apply { - setCell(1, 1, TiledMapTileLayer.Cell().apply { tile = StaticTiledMapTile(textureAtlasTerrain.findRegion("grasslands")) }) - } - tiledMap.layers.add(layer) + private val renderer = ShapeRenderer() - // set up renderer - renderer.setView(camera); + private val color1: Color = Color.FOREST + private val color2: Color = Color.CYAN + private var isColor1 = true - // render??? + private val currentColor: Color + get() { + return if(isColor1) { + color1 + } else { + color2 + } + } + + init { + this.color = currentColor + addListener(object : InputListener() { + override fun touchDown(event: InputEvent?, x: Float, y: Float, pointer: Int, button: Int): Boolean { + isColor1 = !isColor1 + val newColor = currentColor + addAction(Actions.color(newColor, 1f)) + return true + } + }) } - override fun render(delta: Float) { - Gdx.gl.glClearColor(1f, 1f, 1f, 1f); - Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); - camera.update(); + override fun draw(batch: Batch?, parentAlpha: Float) { + batch?.end() - renderer.render(); + renderer.transformMatrix = batch?.transformMatrix + renderer.projectionMatrix = batch?.projectionMatrix + renderer.translate(x, y, 0f) + + renderer.begin(ShapeRenderer.ShapeType.Filled) + renderer.color = if(hasActions() && actions[0]!! is ColorAction) { + (actions[0] as ColorAction).color + } else { + color + } + renderer.rect(0f, 0f, width, height) + renderer.end() + + batch?.begin() } -} +} \ No newline at end of file From 6af26e7db23e6d4ed0ce326e389a28ab640bb0d5 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Tue, 26 Dec 2023 23:03:36 +0100 Subject: [PATCH 21/37] scrollable map --- .../actors/WorldMapRendererActor.kt | 52 +++++++++++++++++-- .../application/screens/MainGameScreen.kt | 2 +- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt index cc55a02f..b291e049 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -1,21 +1,53 @@ package de.gleex.pltcmd.game.application.actors +import com.badlogic.gdx.Input import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.Batch import com.badlogic.gdx.graphics.glutils.ShapeRenderer import com.badlogic.gdx.scenes.scene2d.Actor +import com.badlogic.gdx.scenes.scene2d.InputEvent +import com.badlogic.gdx.scenes.scene2d.InputListener import de.gleex.pltcmd.model.world.WorldMap import de.gleex.pltcmd.model.world.WorldTile import de.gleex.pltcmd.model.world.coordinate.Coordinate import de.gleex.pltcmd.model.world.terrain.TerrainType +import mu.KotlinLogging + +private val log = KotlinLogging.logger { } class WorldMapRendererActor(private val worldMap: WorldMap) : Actor() { private val renderer = ShapeRenderer() - private val bottomLeftCoordinate = worldMap.origin + private var bottomLeftCoordinate = worldMap.origin init { color = Color.DARK_GRAY + addListener(object: InputListener() { + override fun keyUp(event: InputEvent?, keycode: Int): Boolean { + log.info { "Received keyDown event $event keyCode = $keycode" } + return when (keycode) { + Input.Keys.A -> { + scrollByCoordinates(-1, 0) + true + } + Input.Keys.D -> { + scrollByCoordinates(1, 0) + true + } + Input.Keys.W -> { + scrollByCoordinates(0, 1) + true + } + Input.Keys.S -> { + scrollByCoordinates(0, -1) + true + } + else -> { + false + } + } + } + }) } override fun draw(batch: Batch?, parentAlpha: Float) { @@ -30,16 +62,16 @@ class WorldMapRendererActor(private val worldMap: WorldMap) : Actor() { var currentCoordinate = bottomLeftCoordinate var currentDrawPosition: Pair do { - if(currentCoordinate in worldMap) { + if (currentCoordinate in worldMap) { renderer.drawTile(worldMap[currentCoordinate]) } currentCoordinate = currentCoordinate.movedBy(1, 0) currentDrawPosition = drawPositionOf(currentCoordinate) - if(currentDrawPosition.first >= width) { + if (currentDrawPosition.first >= width) { currentCoordinate = currentCoordinate.withEasting(bottomLeftCoordinate.eastingFromLeft).movedBy(0, 1) currentDrawPosition = drawPositionOf(currentCoordinate) } - } while(currentDrawPosition.first < width && currentDrawPosition.second < height) + } while (currentDrawPosition.first < width && currentDrawPosition.second < height) batch?.begin() } @@ -60,7 +92,10 @@ class WorldMapRendererActor(private val worldMap: WorldMap) : Actor() { } } - private inline fun ShapeRenderer.drawWithType(type: ShapeRenderer.ShapeType, crossinline drawInstructions: ShapeRenderer.() -> Unit) { + private inline fun ShapeRenderer.drawWithType( + type: ShapeRenderer.ShapeType, + crossinline drawInstructions: ShapeRenderer.() -> Unit + ) { begin(type) drawInstructions() end() @@ -76,6 +111,13 @@ class WorldMapRendererActor(private val worldMap: WorldMap) : Actor() { return drawPosX to drawPosY } + private fun scrollByCoordinates(scrollAmountEasting: Int, scrollAmountNorthing: Int) { + val newCoordinate = bottomLeftCoordinate.movedBy(scrollAmountEasting, scrollAmountNorthing) + if (newCoordinate in worldMap) { + bottomLeftCoordinate = newCoordinate + } + } + companion object { private val terrainTypeColor: Map = TerrainType.entries.toTypedArray().associate { when (it) { diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt index 5e59bf66..cc17889c 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt @@ -44,7 +44,7 @@ class MainGameScreen(private val worldMap: WorldMap) : KtxScreen { y = 0f width = 800f height = 800f - }) + }.also { stage.keyboardFocus = it }) } override fun render(delta: Float) { From 1bae93e27b8e59ce734f876984a4585c167dc79b Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Tue, 26 Dec 2023 23:24:10 +0100 Subject: [PATCH 22/37] Drawing grid lines --- .../actors/WorldMapRendererActor.kt | 62 +++++++++++++++---- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt index b291e049..f6ba96eb 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -4,12 +4,14 @@ import com.badlogic.gdx.Input import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.Batch import com.badlogic.gdx.graphics.glutils.ShapeRenderer +import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.scenes.scene2d.Actor import com.badlogic.gdx.scenes.scene2d.InputEvent import com.badlogic.gdx.scenes.scene2d.InputListener import de.gleex.pltcmd.model.world.WorldMap import de.gleex.pltcmd.model.world.WorldTile import de.gleex.pltcmd.model.world.coordinate.Coordinate +import de.gleex.pltcmd.model.world.sectorOrigin import de.gleex.pltcmd.model.world.terrain.TerrainType import mu.KotlinLogging @@ -59,29 +61,41 @@ class WorldMapRendererActor(private val worldMap: WorldMap) : Actor() { renderer.fillBackground() - var currentCoordinate = bottomLeftCoordinate - var currentDrawPosition: Pair - do { + renderer.drawTiles() + + renderer.drawGridLines() + + batch?.begin() + } + + private fun ShapeRenderer.drawTiles() { + forEachVisibleCoordinate { currentCoordinate -> if (currentCoordinate in worldMap) { - renderer.drawTile(worldMap[currentCoordinate]) + drawTile(worldMap[currentCoordinate]) } + } + } + + private fun forEachVisibleCoordinate(action: (Coordinate) -> Unit) { + var currentCoordinate = bottomLeftCoordinate + var currentDrawPosition: Vector2 + do { + action(currentCoordinate) currentCoordinate = currentCoordinate.movedBy(1, 0) currentDrawPosition = drawPositionOf(currentCoordinate) - if (currentDrawPosition.first >= width) { + if (currentDrawPosition.x >= width) { currentCoordinate = currentCoordinate.withEasting(bottomLeftCoordinate.eastingFromLeft).movedBy(0, 1) currentDrawPosition = drawPositionOf(currentCoordinate) } - } while (currentDrawPosition.first < width && currentDrawPosition.second < height) - - batch?.begin() + } while (currentDrawPosition.x < width && currentDrawPosition.y < height) } private fun ShapeRenderer.drawTile(worldTile: WorldTile) { - val (drawPosX, drawPosY) = drawPositionOf(worldTile.coordinate) + val drawPos = drawPositionOf(worldTile.coordinate) drawWithType(ShapeRenderer.ShapeType.Filled) { // TODO: draw height color = terrainTypeColor[worldTile.type] - rect(drawPosX, drawPosY, TILE_WIDTH, TILE_HEIGHT) + rect(drawPos.x, drawPos.y, TILE_WIDTH, TILE_HEIGHT) } } @@ -92,6 +106,28 @@ class WorldMapRendererActor(private val worldMap: WorldMap) : Actor() { } } + private fun ShapeRenderer.drawGridLines() { + forEachVisibleCoordinate { currentCoordinate -> + val drawPos = drawPositionOf(currentCoordinate) + drawWithType(ShapeRenderer.ShapeType.Line) { + color = if(currentCoordinate.northingFromBottom == currentCoordinate.sectorOrigin.northingFromBottom) { + Color.RED + } else { + Color.BLACK + } + val bottomRight = Vector2(drawPos).add(TILE_WIDTH, 0f) + line(drawPos, bottomRight) + color = if(currentCoordinate.eastingFromLeft == currentCoordinate.sectorOrigin.eastingFromLeft) { + Color.RED + } else { + Color.BLACK + } + val topLeft = Vector2(drawPos).add(0f, TILE_HEIGHT) + line(drawPos, topLeft) + } + } + } + private inline fun ShapeRenderer.drawWithType( type: ShapeRenderer.ShapeType, crossinline drawInstructions: ShapeRenderer.() -> Unit @@ -104,11 +140,11 @@ class WorldMapRendererActor(private val worldMap: WorldMap) : Actor() { /** * Translates the given coordinate to the position inside of this actor. */ - private fun drawPositionOf(coordinate: Coordinate): Pair { + private fun drawPositionOf(coordinate: Coordinate): Vector2 { val currentOriginCoordinate = coordinate - bottomLeftCoordinate val drawPosX: Float = currentOriginCoordinate.eastingFromLeft.toFloat() * TILE_WIDTH val drawPosY: Float = currentOriginCoordinate.northingFromBottom.toFloat() * TILE_HEIGHT - return drawPosX to drawPosY + return Vector2(drawPosX, drawPosY) } private fun scrollByCoordinates(scrollAmountEasting: Int, scrollAmountNorthing: Int) { @@ -121,7 +157,7 @@ class WorldMapRendererActor(private val worldMap: WorldMap) : Actor() { companion object { private val terrainTypeColor: Map = TerrainType.entries.toTypedArray().associate { when (it) { - TerrainType.GRASSLAND -> it to Color.GREEN + TerrainType.GRASSLAND -> it to Color.LIGHT_GRAY TerrainType.FOREST -> it to Color.OLIVE TerrainType.HILL -> it to Color.GRAY TerrainType.MOUNTAIN -> it to Color.BROWN From 29c9de8e1c079897c2c7112c3e3943e7eb5b565d Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Wed, 27 Dec 2023 21:09:54 +0100 Subject: [PATCH 23/37] Render known world that can be revealed by clicking, improved scrolling --- game/application-ktx/pom.xml | 4 + .../gleex/pltcmd/game/application/Pltcmd.kt | 3 +- .../actors/WorldMapRendererActor.kt | 80 ++++++++++++++----- .../application/screens/MainGameScreen.kt | 5 +- 4 files changed, 69 insertions(+), 23 deletions(-) diff --git a/game/application-ktx/pom.xml b/game/application-ktx/pom.xml index 69b1e773..21ec897f 100644 --- a/game/application-ktx/pom.xml +++ b/game/application-ktx/pom.xml @@ -40,6 +40,10 @@ de.gleex.pltcmd.model mapgeneration
+ + de.gleex.pltcmd.game + engine + diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt index c0108bf3..26106703 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt @@ -3,6 +3,7 @@ package de.gleex.pltcmd.game.application import com.kotcrab.vis.ui.VisUI import de.gleex.pltcmd.game.application.screens.FirstScreen import de.gleex.pltcmd.game.application.screens.MainGameScreen +import de.gleex.pltcmd.game.engine.attributes.memory.KnownWorld import de.gleex.pltcmd.model.mapgeneration.mapgenerators.WorldMapGenerator import de.gleex.pltcmd.model.world.WorldMap import ktx.app.KtxGame @@ -20,7 +21,7 @@ class Pltcmd : KtxGame() { addScreen(FirstScreen()) val worldMap: WorldMap = generateWorld() - val screen = MainGameScreen(worldMap) + val screen = MainGameScreen(KnownWorld(worldMap)) log.info { "Adding $screen" } addScreen(screen) log.info { "Loading screen" } diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt index f6ba96eb..6cf0e874 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -1,6 +1,8 @@ package de.gleex.pltcmd.game.application.actors -import com.badlogic.gdx.Input +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.Input.Buttons +import com.badlogic.gdx.Input.Keys import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.Batch import com.badlogic.gdx.graphics.glutils.ShapeRenderer @@ -8,48 +10,81 @@ import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.scenes.scene2d.Actor import com.badlogic.gdx.scenes.scene2d.InputEvent import com.badlogic.gdx.scenes.scene2d.InputListener -import de.gleex.pltcmd.model.world.WorldMap -import de.gleex.pltcmd.model.world.WorldTile +import de.gleex.pltcmd.game.engine.attributes.memory.KnownTerrain +import de.gleex.pltcmd.game.engine.attributes.memory.KnownWorld import de.gleex.pltcmd.model.world.coordinate.Coordinate +import de.gleex.pltcmd.model.world.coordinate.fillCircle import de.gleex.pltcmd.model.world.sectorOrigin import de.gleex.pltcmd.model.world.terrain.TerrainType +import de.gleex.pltcmd.util.measure.distance.Distance +import de.gleex.pltcmd.util.measure.distance.DistanceUnit.Meters import mu.KotlinLogging +import kotlin.math.floor private val log = KotlinLogging.logger { } -class WorldMapRendererActor(private val worldMap: WorldMap) : Actor() { +class WorldMapRendererActor(private val knownWorld: KnownWorld) : Actor() { private val renderer = ShapeRenderer() - private var bottomLeftCoordinate = worldMap.origin + private var bottomLeftCoordinate: Coordinate = knownWorld.origin.origin init { color = Color.DARK_GRAY - addListener(object: InputListener() { - override fun keyUp(event: InputEvent?, keycode: Int): Boolean { - log.info { "Received keyDown event $event keyCode = $keycode" } + val scrollListener = object : InputListener() { + override fun keyDown(event: InputEvent?, keycode: Int): Boolean { return when (keycode) { - Input.Keys.A -> { + Keys.A -> { scrollByCoordinates(-1, 0) true } - Input.Keys.D -> { + + Keys.D -> { scrollByCoordinates(1, 0) true } - Input.Keys.W -> { + + Keys.W -> { scrollByCoordinates(0, 1) true } - Input.Keys.S -> { + + Keys.S -> { scrollByCoordinates(0, -1) true } + else -> { false } } } - }) + } + val revealListener = object : InputListener() { + override fun touchDown(event: InputEvent?, x: Float, y: Float, pointer: Int, button: Int): Boolean { + return if(button == Buttons.LEFT) { + knownWorld.reveal(coordinateAtActorPosition(x, y).fillCircle(Distance(250, Meters)).area {true}) + true + } else { + false + } + } + + override fun touchDragged(event: InputEvent?, x: Float, y: Float, pointer: Int) { + knownWorld.reveal(coordinateAtActorPosition(x, y)) + } + } + addListener(scrollListener) + addListener(revealListener) + } + + override fun act(delta: Float) { + if(delta > 0f) { + if (Gdx.input.isKeyPressed(Keys.A)) scrollByCoordinates(-1, 0) + if (Gdx.input.isKeyPressed(Keys.D)) scrollByCoordinates(1, 0) + if (Gdx.input.isKeyPressed(Keys.W)) scrollByCoordinates(0, 1) + if (Gdx.input.isKeyPressed(Keys.S)) scrollByCoordinates(0, -1) + } + super.act(delta) } override fun draw(batch: Batch?, parentAlpha: Float) { @@ -70,13 +105,11 @@ class WorldMapRendererActor(private val worldMap: WorldMap) : Actor() { private fun ShapeRenderer.drawTiles() { forEachVisibleCoordinate { currentCoordinate -> - if (currentCoordinate in worldMap) { - drawTile(worldMap[currentCoordinate]) - } + drawTile(knownWorld[currentCoordinate]) } } - private fun forEachVisibleCoordinate(action: (Coordinate) -> Unit) { + private inline fun forEachVisibleCoordinate(action: (Coordinate) -> Unit) { var currentCoordinate = bottomLeftCoordinate var currentDrawPosition: Vector2 do { @@ -90,11 +123,11 @@ class WorldMapRendererActor(private val worldMap: WorldMap) : Actor() { } while (currentDrawPosition.x < width && currentDrawPosition.y < height) } - private fun ShapeRenderer.drawTile(worldTile: WorldTile) { + private fun ShapeRenderer.drawTile(worldTile: KnownTerrain) { val drawPos = drawPositionOf(worldTile.coordinate) drawWithType(ShapeRenderer.ShapeType.Filled) { // TODO: draw height - color = terrainTypeColor[worldTile.type] + color = worldTile.terrain?.type?.let { terrainTypeColor[it] } ?: Color.BLACK rect(drawPos.x, drawPos.y, TILE_WIDTH, TILE_HEIGHT) } } @@ -147,9 +180,16 @@ class WorldMapRendererActor(private val worldMap: WorldMap) : Actor() { return Vector2(drawPosX, drawPosY) } + /** + * Translates a point in this actor to the underlying coordinate + */ + private fun coordinateAtActorPosition(x: Float, y: Float): Coordinate { + return bottomLeftCoordinate.movedBy(floor(x / TILE_WIDTH).toInt(), floor(y / TILE_HEIGHT).toInt()) + } + private fun scrollByCoordinates(scrollAmountEasting: Int, scrollAmountNorthing: Int) { val newCoordinate = bottomLeftCoordinate.movedBy(scrollAmountEasting, scrollAmountNorthing) - if (newCoordinate in worldMap) { + if (newCoordinate in knownWorld.origin) { bottomLeftCoordinate = newCoordinate } } diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt index cc17889c..3a37712e 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt @@ -12,6 +12,7 @@ import com.badlogic.gdx.scenes.scene2d.actions.Actions import com.badlogic.gdx.scenes.scene2d.actions.ColorAction import com.badlogic.gdx.utils.viewport.StretchViewport import de.gleex.pltcmd.game.application.actors.WorldMapRendererActor +import de.gleex.pltcmd.game.engine.attributes.memory.KnownWorld import de.gleex.pltcmd.model.world.WorldMap import ktx.app.KtxScreen import mu.KotlinLogging @@ -22,7 +23,7 @@ private val log = KotlinLogging.logger { } /** * This screen is the main interface for the player. It mainly renders the given [WorldMap]. */ -class MainGameScreen(private val worldMap: WorldMap) : KtxScreen { +class MainGameScreen(private val knownWorld: KnownWorld) : KtxScreen { private val stage = Stage(StretchViewport(1100f, 1000f)) override fun show() { Gdx.input.inputProcessor = stage @@ -39,7 +40,7 @@ class MainGameScreen(private val worldMap: WorldMap) : KtxScreen { width = 1100f height = 200f }) - stage.addActor(WorldMapRendererActor(worldMap).apply { + stage.addActor(WorldMapRendererActor(knownWorld).apply { x = 300f y = 0f width = 800f From 956628a118684a658185cc148be2c9d86dc34c22 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Wed, 27 Dec 2023 22:02:58 +0100 Subject: [PATCH 24/37] trying to highlight right-clicked coordinate --- .../actors/WorldMapRendererActor.kt | 144 +++++++++++------- 1 file changed, 93 insertions(+), 51 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt index 6cf0e874..6e341e47 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -7,9 +7,11 @@ import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.Batch import com.badlogic.gdx.graphics.glutils.ShapeRenderer import com.badlogic.gdx.math.Vector2 -import com.badlogic.gdx.scenes.scene2d.Actor +import com.badlogic.gdx.scenes.scene2d.Group import com.badlogic.gdx.scenes.scene2d.InputEvent import com.badlogic.gdx.scenes.scene2d.InputListener +import com.badlogic.gdx.scenes.scene2d.ui.Label +import com.kotcrab.vis.ui.VisUI import de.gleex.pltcmd.game.engine.attributes.memory.KnownTerrain import de.gleex.pltcmd.game.engine.attributes.memory.KnownWorld import de.gleex.pltcmd.model.world.coordinate.Coordinate @@ -21,64 +23,28 @@ import de.gleex.pltcmd.util.measure.distance.DistanceUnit.Meters import mu.KotlinLogging import kotlin.math.floor -private val log = KotlinLogging.logger { } +private val log = KotlinLogging.logger { } -class WorldMapRendererActor(private val knownWorld: KnownWorld) : Actor() { +/** + * Renders the given [KnownWorld] and offers basic controls for the user like scrolling. + */ +class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { private val renderer = ShapeRenderer() private var bottomLeftCoordinate: Coordinate = knownWorld.origin.origin + private val coordinateHighlightLabel = Label(bottomLeftCoordinate.toString(), VisUI.getSkin()) + init { color = Color.DARK_GRAY - val scrollListener = object : InputListener() { - override fun keyDown(event: InputEvent?, keycode: Int): Boolean { - return when (keycode) { - Keys.A -> { - scrollByCoordinates(-1, 0) - true - } - - Keys.D -> { - scrollByCoordinates(1, 0) - true - } - - Keys.W -> { - scrollByCoordinates(0, 1) - true - } - - Keys.S -> { - scrollByCoordinates(0, -1) - true - } - - else -> { - false - } - } - } - } - val revealListener = object : InputListener() { - override fun touchDown(event: InputEvent?, x: Float, y: Float, pointer: Int, button: Int): Boolean { - return if(button == Buttons.LEFT) { - knownWorld.reveal(coordinateAtActorPosition(x, y).fillCircle(Distance(250, Meters)).area {true}) - true - } else { - false - } - } - - override fun touchDragged(event: InputEvent?, x: Float, y: Float, pointer: Int) { - knownWorld.reveal(coordinateAtActorPosition(x, y)) - } - } - addListener(scrollListener) - addListener(revealListener) + setupListeners() + log.info { "My origin: $originX | $originY on stage ${localToStageCoordinates(Vector2(originX, originY))}" } + addActor(coordinateHighlightLabel) + coordinateHighlightLabel.isVisible = false } override fun act(delta: Float) { - if(delta > 0f) { + if (delta > 0f) { if (Gdx.input.isKeyPressed(Keys.A)) scrollByCoordinates(-1, 0) if (Gdx.input.isKeyPressed(Keys.D)) scrollByCoordinates(1, 0) if (Gdx.input.isKeyPressed(Keys.W)) scrollByCoordinates(0, 1) @@ -101,6 +67,7 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Actor() { renderer.drawGridLines() batch?.begin() + coordinateHighlightLabel.draw(batch, parentAlpha) } private fun ShapeRenderer.drawTiles() { @@ -143,14 +110,14 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Actor() { forEachVisibleCoordinate { currentCoordinate -> val drawPos = drawPositionOf(currentCoordinate) drawWithType(ShapeRenderer.ShapeType.Line) { - color = if(currentCoordinate.northingFromBottom == currentCoordinate.sectorOrigin.northingFromBottom) { + color = if (currentCoordinate.northingFromBottom == currentCoordinate.sectorOrigin.northingFromBottom) { Color.RED } else { Color.BLACK } val bottomRight = Vector2(drawPos).add(TILE_WIDTH, 0f) line(drawPos, bottomRight) - color = if(currentCoordinate.eastingFromLeft == currentCoordinate.sectorOrigin.eastingFromLeft) { + color = if (currentCoordinate.eastingFromLeft == currentCoordinate.sectorOrigin.eastingFromLeft) { Color.RED } else { Color.BLACK @@ -194,6 +161,81 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Actor() { } } + private fun setupListeners() { + val scrollListener = object : InputListener() { + override fun keyDown(event: InputEvent?, keycode: Int): Boolean { + return when (keycode) { + Keys.A -> { + scrollByCoordinates(-1, 0) + true + } + + Keys.D -> { + scrollByCoordinates(1, 0) + true + } + + Keys.W -> { + scrollByCoordinates(0, 1) + true + } + + Keys.S -> { + scrollByCoordinates(0, -1) + true + } + + else -> { + false + } + } + } + } + val revealListener = object : InputListener() { + override fun touchDown(event: InputEvent?, x: Float, y: Float, pointer: Int, button: Int): Boolean { + return if (button == Buttons.LEFT) { + knownWorld.reveal(coordinateAtActorPosition(x, y).fillCircle(Distance(250, Meters)).area { true }) + true + } else { + false + } + } + + override fun touchDragged(event: InputEvent?, x: Float, y: Float, pointer: Int) { + if(event?.button == Buttons.LEFT) { + knownWorld.reveal(coordinateAtActorPosition(x, y)) + } + } + } + val highlightCoordinateListener = object : InputListener() { + override fun touchDown(event: InputEvent?, x: Float, y: Float, pointer: Int, button: Int): Boolean { + return if (button == Buttons.RIGHT) { + log.info { "My origin: $originX | $originY on stage ${localToStageCoordinates(Vector2(originX, originY))}" } + if(coordinateHighlightLabel.x == x && coordinateHighlightLabel.y == y) { + coordinateHighlightLabel.isVisible = false + } else { + val labelPosition = localToStageCoordinates(drawPositionOf(coordinateAtActorPosition(x, y))) + coordinateHighlightLabel.x = labelPosition.x + coordinateHighlightLabel.y = labelPosition.y + coordinateHighlightLabel.isVisible = true + coordinateHighlightLabel.setText(coordinateAtActorPosition(x, y).toString()) + } + true + } else { + false + } + } + + override fun touchDragged(event: InputEvent?, x: Float, y: Float, pointer: Int) { + knownWorld.reveal(coordinateAtActorPosition(x, y)) + } + } + addListener(scrollListener) + addListener(revealListener) + addListener(highlightCoordinateListener) + } + + companion object { private val terrainTypeColor: Map = TerrainType.entries.toTypedArray().associate { when (it) { From f31982cc8a5c59ba240e6053e3a09bcd88693479 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Wed, 5 Jun 2024 21:55:50 +0200 Subject: [PATCH 25/37] bump ktx from 1.12.0-rc1 to 1.12.1-rc1 --- game/application-ktx/pom.xml | 4 ++-- pom.xml | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/game/application-ktx/pom.xml b/game/application-ktx/pom.xml index 21ec897f..d80d240c 100644 --- a/game/application-ktx/pom.xml +++ b/game/application-ktx/pom.xml @@ -15,8 +15,8 @@ A frontend for the game built with KTX - 1.12.0 - 1.12.0-rc1 + 1.12.1 + 1.12.1-rc1 diff --git a/pom.xml b/pom.xml index 9d6eebca..b6bf4665 100644 --- a/pom.xml +++ b/pom.xml @@ -41,8 +41,6 @@ 2022.1.0-RELEASE 0.3.7 - 1.12.0-rc1 - 5.10.2 5.9.0 From 25ede743eed8f0b8521a5b7f1f7b057a3388611e Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Thu, 6 Jun 2024 21:55:10 +0200 Subject: [PATCH 26/37] added NeighborBitmap and DrawableWorldTile --- .../actors/terrain/model/DrawableWorldTile.kt | 13 ++ .../actors/terrain/model/NeighborBitmap.kt | 83 +++++++ .../terrain/model/NeighborBitmapTest.kt | 205 ++++++++++++++++++ 3 files changed, 301 insertions(+) create mode 100644 game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt create mode 100644 game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmap.kt create mode 100644 game/application-ktx/src/test/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmapTest.kt diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt new file mode 100644 index 00000000..e89ebef5 --- /dev/null +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt @@ -0,0 +1,13 @@ +package de.gleex.pltcmd.game.application.actors.terrain.model + +import de.gleex.pltcmd.model.world.WorldTile + +/** + * Holds a [WorldTile] and the information which of its neighbors have the same height and which have the same + * terrain type. + */ +data class DrawableWorldTile( + val tile: WorldTile, + val neighborsSameHeight: NeighborBitmap, + val neighborsSameTerrain: NeighborBitmap +) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmap.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmap.kt new file mode 100644 index 00000000..522331ff --- /dev/null +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmap.kt @@ -0,0 +1,83 @@ +package de.gleex.pltcmd.game.application.actors.terrain.model + +/** + * A bitmap with 8 bits. Each bit represents one neighbor of a coordinate. It represents a boolean + * state of the respective neighboring coordinate/tile. + */ +class NeighborBitmap private constructor(private val bitmap: UByte) { + + companion object { + /** + * Factory function that sets the bits for the given [Direction]s. + */ + fun of(vararg directions: Direction): NeighborBitmap { + return NeighborBitmap(directions.sumOf { it.byteValue.toInt() }.toUByte()) + } + + private val ZERO: UByte = 0.toUByte() + } + + fun isNorth(): Boolean { + return (bitmap and Direction.NORTH.byteValue) != ZERO + } + + fun isNorthEast(): Boolean { + return (bitmap and Direction.NORTH_EAST.byteValue) != ZERO + } + + fun isEast(): Boolean { + return (bitmap and Direction.EAST.byteValue) != ZERO + } + + fun isSouthEast(): Boolean { + return (bitmap and Direction.SOUTH_EAST.byteValue) != ZERO + } + + fun isSouth(): Boolean { + return (bitmap and Direction.SOUTH.byteValue) != ZERO + } + + fun isSouthWest(): Boolean { + return (bitmap and Direction.SOUTH_WEST.byteValue) != ZERO + } + + fun isWest(): Boolean { + return (bitmap and Direction.WEST.byteValue) != ZERO + } + + fun isNorthWest(): Boolean { + return (bitmap and Direction.NORTH_WEST.byteValue) != ZERO + } + + @OptIn(ExperimentalStdlibApi::class) + override fun toString(): String { + return "NeighborBitmap(bitmap=${bitmap.toInt().toString(2).padStart(8, '0')})" + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is NeighborBitmap) return false + + if (bitmap != other.bitmap) return false + + return true + } + + override fun hashCode(): Int { + return bitmap.hashCode() + } + + /** + * Represents the bit for one of the 8 cardinal directions of a neighboring tile. + */ + enum class Direction(val byteValue: UByte) { + NORTH(1.toUByte()), + NORTH_EAST(2.toUByte()), + EAST(4.toUByte()), + SOUTH_EAST(8.toUByte()), + SOUTH(16.toUByte()), + SOUTH_WEST(32.toUByte()), + WEST(64.toUByte()), + NORTH_WEST(128.toUByte()) + } +} diff --git a/game/application-ktx/src/test/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmapTest.kt b/game/application-ktx/src/test/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmapTest.kt new file mode 100644 index 00000000..7745103f --- /dev/null +++ b/game/application-ktx/src/test/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmapTest.kt @@ -0,0 +1,205 @@ +package de.gleex.pltcmd.game.application.actors.terrain.model + +import io.kotest.assertions.assertSoftly +import io.kotest.core.spec.style.FreeSpec +import io.kotest.matchers.shouldBe + +class NeighborBitmapTest : FreeSpec() { + init { + "Empty bitmap" { + val bitmap = NeighborBitmap.of() + + assertSoftly(bitmap) { + it.isNorth() shouldBe false + it.isNorthEast() shouldBe false + it.isEast() shouldBe false + it.isSouthEast() shouldBe false + it.isSouth() shouldBe false + it.isSouthWest() shouldBe false + it.isWest() shouldBe false + it.isNorthWest() shouldBe false + } + } + + "Single direction" - { + "north" { + val bitmap = NeighborBitmap.of(NeighborBitmap.Direction.NORTH) + assertSoftly(bitmap) { + it.isNorth() shouldBe true + it.isNorthEast() shouldBe false + it.isEast() shouldBe false + it.isSouthEast() shouldBe false + it.isSouth() shouldBe false + it.isSouthWest() shouldBe false + it.isWest() shouldBe false + it.isNorthWest() shouldBe false + } + } + "north east" { + val bitmap = NeighborBitmap.of(NeighborBitmap.Direction.NORTH_EAST) + assertSoftly(bitmap) { + it.isNorth() shouldBe false + it.isNorthEast() shouldBe true + it.isEast() shouldBe false + it.isSouthEast() shouldBe false + it.isSouth() shouldBe false + it.isSouthWest() shouldBe false + it.isWest() shouldBe false + it.isNorthWest() shouldBe false + } + } + "east" { + val bitmap = NeighborBitmap.of(NeighborBitmap.Direction.EAST) + assertSoftly(bitmap) { + it.isNorth() shouldBe false + it.isNorthEast() shouldBe false + it.isEast() shouldBe true + it.isSouthEast() shouldBe false + it.isSouth() shouldBe false + it.isSouthWest() shouldBe false + it.isWest() shouldBe false + it.isNorthWest() shouldBe false + } + } + "south east" { + val bitmap = NeighborBitmap.of(NeighborBitmap.Direction.SOUTH_EAST) + assertSoftly(bitmap) { + it.isNorth() shouldBe false + it.isNorthEast() shouldBe false + it.isEast() shouldBe false + it.isSouthEast() shouldBe true + it.isSouth() shouldBe false + it.isSouthWest() shouldBe false + it.isWest() shouldBe false + it.isNorthWest() shouldBe false + } + } + "south" { + val bitmap = NeighborBitmap.of(NeighborBitmap.Direction.SOUTH) + assertSoftly(bitmap) { + it.isNorth() shouldBe false + it.isNorthEast() shouldBe false + it.isEast() shouldBe false + it.isSouthEast() shouldBe false + it.isSouth() shouldBe true + it.isSouthWest() shouldBe false + it.isWest() shouldBe false + it.isNorthWest() shouldBe false + } + } + "south west" { + val bitmap = NeighborBitmap.of(NeighborBitmap.Direction.SOUTH_WEST) + assertSoftly(bitmap) { + it.isNorth() shouldBe false + it.isNorthEast() shouldBe false + it.isEast() shouldBe false + it.isSouthEast() shouldBe false + it.isSouth() shouldBe false + it.isSouthWest() shouldBe true + it.isWest() shouldBe false + it.isNorthWest() shouldBe false + } + } + "west" { + val bitmap = NeighborBitmap.of(NeighborBitmap.Direction.WEST) + assertSoftly(bitmap) { + it.isNorth() shouldBe false + it.isNorthEast() shouldBe false + it.isEast() shouldBe false + it.isSouthEast() shouldBe false + it.isSouth() shouldBe false + it.isSouthWest() shouldBe false + it.isWest() shouldBe true + it.isNorthWest() shouldBe false + } + } + "north west" { + val bitmap = NeighborBitmap.of(NeighborBitmap.Direction.NORTH_WEST) + assertSoftly(bitmap) { + it.isNorth() shouldBe false + it.isNorthEast() shouldBe false + it.isEast() shouldBe false + it.isSouthEast() shouldBe false + it.isSouth() shouldBe false + it.isSouthWest() shouldBe false + it.isWest() shouldBe false + it.isNorthWest() shouldBe true + } + } + } + + "Multiple directions" - { + "two" { + val bitmap = NeighborBitmap.of(NeighborBitmap.Direction.NORTH, NeighborBitmap.Direction.NORTH_EAST) + assertSoftly(bitmap) { + it.isNorth() shouldBe true + it.isNorthEast() shouldBe true + it.isEast() shouldBe false + it.isSouthEast() shouldBe false + it.isSouth() shouldBe false + it.isSouthWest() shouldBe false + it.isWest() shouldBe false + it.isNorthWest() shouldBe false + } + } + "three" { + val bitmap = NeighborBitmap.of( + NeighborBitmap.Direction.NORTH, + NeighborBitmap.Direction.WEST, + NeighborBitmap.Direction.SOUTH_WEST + ) + assertSoftly(bitmap) { + it.isNorth() shouldBe true + it.isNorthEast() shouldBe false + it.isEast() shouldBe false + it.isSouthEast() shouldBe false + it.isSouth() shouldBe false + it.isSouthWest() shouldBe true + it.isWest() shouldBe true + it.isNorthWest() shouldBe false + } + } + "five" { + val bitmap = NeighborBitmap.of( + NeighborBitmap.Direction.NORTH, + NeighborBitmap.Direction.WEST, + NeighborBitmap.Direction.SOUTH, + NeighborBitmap.Direction.EAST, + NeighborBitmap.Direction.NORTH_WEST + ) + assertSoftly(bitmap) { + it.isNorth() shouldBe true + it.isNorthEast() shouldBe false + it.isEast() shouldBe true + it.isSouthEast() shouldBe false + it.isSouth() shouldBe true + it.isSouthWest() shouldBe false + it.isWest() shouldBe true + it.isNorthWest() shouldBe true + } + } + "all" { + val bitmap = NeighborBitmap.of( + NeighborBitmap.Direction.NORTH, + NeighborBitmap.Direction.NORTH_WEST, + NeighborBitmap.Direction.SOUTH, + NeighborBitmap.Direction.SOUTH_WEST, + NeighborBitmap.Direction.SOUTH_EAST, + NeighborBitmap.Direction.WEST, + NeighborBitmap.Direction.EAST, + NeighborBitmap.Direction.NORTH_EAST + ) + assertSoftly(bitmap) { + it.isNorth() shouldBe true + it.isNorthEast() shouldBe true + it.isEast() shouldBe true + it.isSouthEast() shouldBe true + it.isSouth() shouldBe true + it.isSouthWest() shouldBe true + it.isWest() shouldBe true + it.isNorthWest() shouldBe true + } + } + } + } +} \ No newline at end of file From 04a6b5b4c421bb9895b68ff5cb0f7902f1d3dee7 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Sat, 8 Jun 2024 20:16:20 +0200 Subject: [PATCH 27/37] added NeighborBitmap.all() --- .../actors/terrain/model/NeighborBitmap.kt | 18 +++++++++++++++--- .../actors/terrain/model/NeighborBitmapTest.kt | 13 +++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmap.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmap.kt index 522331ff..8605e8da 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmap.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmap.kt @@ -7,14 +7,19 @@ package de.gleex.pltcmd.game.application.actors.terrain.model class NeighborBitmap private constructor(private val bitmap: UByte) { companion object { + private val ZERO: UByte = 0.toUByte() + + /** + * Factory function that sets the bits for the given [Direction]s. + */ + fun of(vararg directions: Direction): NeighborBitmap = of(directions.toList()) + /** * Factory function that sets the bits for the given [Direction]s. */ - fun of(vararg directions: Direction): NeighborBitmap { + fun of(directions: List): NeighborBitmap { return NeighborBitmap(directions.sumOf { it.byteValue.toInt() }.toUByte()) } - - private val ZERO: UByte = 0.toUByte() } fun isNorth(): Boolean { @@ -67,6 +72,13 @@ class NeighborBitmap private constructor(private val bitmap: UByte) { return bitmap.hashCode() } + /** + * True if all bits are set. + */ + fun all(): Boolean { + return bitmap == UByte.MAX_VALUE + } + /** * Represents the bit for one of the 8 cardinal directions of a neighboring tile. */ diff --git a/game/application-ktx/src/test/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmapTest.kt b/game/application-ktx/src/test/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmapTest.kt index 7745103f..6820b989 100644 --- a/game/application-ktx/src/test/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmapTest.kt +++ b/game/application-ktx/src/test/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmapTest.kt @@ -18,6 +18,7 @@ class NeighborBitmapTest : FreeSpec() { it.isSouthWest() shouldBe false it.isWest() shouldBe false it.isNorthWest() shouldBe false + it.all() shouldBe false } } @@ -33,6 +34,7 @@ class NeighborBitmapTest : FreeSpec() { it.isSouthWest() shouldBe false it.isWest() shouldBe false it.isNorthWest() shouldBe false + it.all() shouldBe false } } "north east" { @@ -46,6 +48,7 @@ class NeighborBitmapTest : FreeSpec() { it.isSouthWest() shouldBe false it.isWest() shouldBe false it.isNorthWest() shouldBe false + it.all() shouldBe false } } "east" { @@ -59,6 +62,7 @@ class NeighborBitmapTest : FreeSpec() { it.isSouthWest() shouldBe false it.isWest() shouldBe false it.isNorthWest() shouldBe false + it.all() shouldBe false } } "south east" { @@ -72,6 +76,7 @@ class NeighborBitmapTest : FreeSpec() { it.isSouthWest() shouldBe false it.isWest() shouldBe false it.isNorthWest() shouldBe false + it.all() shouldBe false } } "south" { @@ -85,6 +90,7 @@ class NeighborBitmapTest : FreeSpec() { it.isSouthWest() shouldBe false it.isWest() shouldBe false it.isNorthWest() shouldBe false + it.all() shouldBe false } } "south west" { @@ -98,6 +104,7 @@ class NeighborBitmapTest : FreeSpec() { it.isSouthWest() shouldBe true it.isWest() shouldBe false it.isNorthWest() shouldBe false + it.all() shouldBe false } } "west" { @@ -111,6 +118,7 @@ class NeighborBitmapTest : FreeSpec() { it.isSouthWest() shouldBe false it.isWest() shouldBe true it.isNorthWest() shouldBe false + it.all() shouldBe false } } "north west" { @@ -124,6 +132,7 @@ class NeighborBitmapTest : FreeSpec() { it.isSouthWest() shouldBe false it.isWest() shouldBe false it.isNorthWest() shouldBe true + it.all() shouldBe false } } } @@ -140,6 +149,7 @@ class NeighborBitmapTest : FreeSpec() { it.isSouthWest() shouldBe false it.isWest() shouldBe false it.isNorthWest() shouldBe false + it.all() shouldBe false } } "three" { @@ -157,6 +167,7 @@ class NeighborBitmapTest : FreeSpec() { it.isSouthWest() shouldBe true it.isWest() shouldBe true it.isNorthWest() shouldBe false + it.all() shouldBe false } } "five" { @@ -176,6 +187,7 @@ class NeighborBitmapTest : FreeSpec() { it.isSouthWest() shouldBe false it.isWest() shouldBe true it.isNorthWest() shouldBe true + it.all() shouldBe false } } "all" { @@ -198,6 +210,7 @@ class NeighborBitmapTest : FreeSpec() { it.isSouthWest() shouldBe true it.isWest() shouldBe true it.isNorthWest() shouldBe true + it.all() shouldBe true } } } From 2b66b0b914d628c9c681b312f794d42011c0d2ae Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Sat, 8 Jun 2024 22:59:30 +0200 Subject: [PATCH 28/37] on the way to contour lines (and not using potato units) --- .../actors/WorldMapRendererActor.kt | 59 ++++++++++++++++--- .../actors/terrain/CoordinateTileActor.kt | 3 +- .../actors/terrain/WorldTileActor.kt | 2 +- .../actors/terrain/model/DrawableWorldTile.kt | 16 ++++- 4 files changed, 67 insertions(+), 13 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt index 6e341e47..05b2707d 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -4,16 +4,21 @@ import com.badlogic.gdx.Gdx import com.badlogic.gdx.Input.Buttons import com.badlogic.gdx.Input.Keys import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.graphics.OrthographicCamera import com.badlogic.gdx.graphics.g2d.Batch import com.badlogic.gdx.graphics.glutils.ShapeRenderer import com.badlogic.gdx.math.Vector2 +import com.badlogic.gdx.math.Vector4 import com.badlogic.gdx.scenes.scene2d.Group import com.badlogic.gdx.scenes.scene2d.InputEvent import com.badlogic.gdx.scenes.scene2d.InputListener import com.badlogic.gdx.scenes.scene2d.ui.Label import com.kotcrab.vis.ui.VisUI +import de.gleex.pltcmd.game.application.actors.terrain.model.DrawableWorldTile +import de.gleex.pltcmd.game.application.actors.terrain.model.NeighborBitmap import de.gleex.pltcmd.game.engine.attributes.memory.KnownTerrain import de.gleex.pltcmd.game.engine.attributes.memory.KnownWorld +import de.gleex.pltcmd.model.world.WorldTile import de.gleex.pltcmd.model.world.coordinate.Coordinate import de.gleex.pltcmd.model.world.coordinate.fillCircle import de.gleex.pltcmd.model.world.sectorOrigin @@ -35,8 +40,11 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { private val coordinateHighlightLabel = Label(bottomLeftCoordinate.toString(), VisUI.getSkin()) + private val cam = OrthographicCamera(width, height) + init { color = Color.DARK_GRAY + cam.setToOrtho(false, (50 * TILE_WIDTH) / width, (50 * TILE_HEIGHT) / height) setupListeners() log.info { "My origin: $originX | $originY on stage ${localToStageCoordinates(Vector2(originX, originY))}" } addActor(coordinateHighlightLabel) @@ -56,9 +64,9 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { override fun draw(batch: Batch?, parentAlpha: Float) { batch?.end() - renderer.transformMatrix = batch?.transformMatrix - renderer.projectionMatrix = batch?.projectionMatrix - renderer.translate(x, y, 0f) + renderer.transformMatrix = cam.combined + renderer.projectionMatrix = cam.combined + //renderer.translate(x, y, 0f) renderer.fillBackground() @@ -72,7 +80,7 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { private fun ShapeRenderer.drawTiles() { forEachVisibleCoordinate { currentCoordinate -> - drawTile(knownWorld[currentCoordinate]) + drawTile(knownWorld.drawableTileFor(currentCoordinate)) } } @@ -90,13 +98,32 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { } while (currentDrawPosition.x < width && currentDrawPosition.y < height) } - private fun ShapeRenderer.drawTile(worldTile: KnownTerrain) { - val drawPos = drawPositionOf(worldTile.coordinate) + private fun ShapeRenderer.drawTile(tile: DrawableWorldTile) { + val drawPos = drawPositionOf(tile.coordinate) + // Terrain type drawWithType(ShapeRenderer.ShapeType.Filled) { // TODO: draw height - color = worldTile.terrain?.type?.let { terrainTypeColor[it] } ?: Color.BLACK + color = tile.terrain?.type?.let { terrainTypeColor[it] } ?: Color.BLACK rect(drawPos.x, drawPos.y, TILE_WIDTH, TILE_HEIGHT) } + // contour lines + val localHeight = tile.terrain?.height + if(!tile.neighborsSameHeight.all() && localHeight != null) { + var northLine: Vector4? = null + if(tile.neighborsSameHeight.isNorth().not()) { + val nHeight = knownWorld[tile.coordinate.withRelativeNorthing(1)].terrain?.height + if(nHeight != null && localHeight > nHeight) { + northLine = Vector4(drawPos.x, drawPos.y + 2.0f, drawPos.x + TILE_WIDTH, drawPos.y + 2.0f) + } + } + drawWithType(ShapeRenderer.ShapeType.Line) { + northLine?.let { + log.debug { "Drawing northLine at ${tile.coordinate} with drawPos $it" } + color = Color.RED + line(it.x, it.y, it.z, it.w) + } + } + } } private fun ShapeRenderer.fillBackground() { @@ -137,6 +164,20 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { end() } + private fun KnownWorld.drawableTileFor(coordinate: Coordinate): DrawableWorldTile { + val knowTile: KnownTerrain = get(coordinate) + val sameHeights = buildList { + knowTile.terrain?.height?.let { height -> + if(height == get(coordinate.withRelativeNorthing(1)).terrain?.height) { + log.debug { "Adding NORTH to height bitmap of $coordinate" } + add(NeighborBitmap.Direction.NORTH) + } + } + } + // TODO: add all the other bits to the bitmaps + return DrawableWorldTile(knowTile, NeighborBitmap.of(sameHeights), NeighborBitmap.of()) + } + /** * Translates the given coordinate to the position inside of this actor. */ @@ -248,7 +289,7 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { } } - private const val TILE_WIDTH = 16f - private const val TILE_HEIGHT = 16f + private val TILE_WIDTH: Float = WorldTile.edgeLength.inUnit(Meters).toFloat() + private val TILE_HEIGHT: Float = WorldTile.edgeLength.inUnit(Meters).toFloat() } } \ No newline at end of file diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/CoordinateTileActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/CoordinateTileActor.kt index 78dce9a0..597c439e 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/CoordinateTileActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/CoordinateTileActor.kt @@ -6,11 +6,12 @@ import com.badlogic.gdx.scenes.scene2d.InputListener import com.badlogic.gdx.scenes.scene2d.ui.Label import com.kotcrab.vis.ui.VisUI import de.gleex.pltcmd.model.world.coordinate.Coordinate +import de.gleex.pltcmd.model.world.terrain.TerrainHeight /** * An actor that displays the current coordinate when hovered. */ -class CoordinateTileActor(coordinate: Coordinate) : Label(coordinate.toString(), VisUI.getSkin()) { +class CoordinateTileActor(coordinate: Coordinate, height: TerrainHeight) : Label("$coordinate [${height.value}]", VisUI.getSkin()) { init { setScale(1.0f) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt index 237856d4..79a16bcb 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/WorldTileActor.kt @@ -8,7 +8,7 @@ class WorldTileActor(private val tile: WorldTile): Group() { init { addActor(TerrainTypeActor(tile.type)) addActor(TerrainHeightActor(tile.height)) - addActor(CoordinateTileActor(tile.coordinate)) + addActor(CoordinateTileActor(tile.coordinate, tile.terrain.height)) } override fun addAction(action: Action?) { diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt index e89ebef5..60bd4833 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt @@ -1,13 +1,25 @@ package de.gleex.pltcmd.game.application.actors.terrain.model +import de.gleex.pltcmd.game.engine.attributes.memory.KnownTerrain import de.gleex.pltcmd.model.world.WorldTile +import de.gleex.pltcmd.model.world.coordinate.Coordinate +import de.gleex.pltcmd.model.world.terrain.Terrain /** * Holds a [WorldTile] and the information which of its neighbors have the same height and which have the same * terrain type. */ data class DrawableWorldTile( - val tile: WorldTile, + val tile: KnownTerrain, val neighborsSameHeight: NeighborBitmap, val neighborsSameTerrain: NeighborBitmap -) +) { + /** + * The coordinate of the underlying [KnownTerrain]. + */ + val coordinate: Coordinate by tile::coordinate + /** + * The [Terrain] of the underlying [KnownTerrain] in case it is revealed. + */ + val terrain: Terrain? by tile::terrain +} From 8d2a7a5cae768660a2ba6ec23aa00f727ace1511 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Thu, 27 Jun 2024 21:19:56 +0200 Subject: [PATCH 29/37] no camera! At least for now --- .../actors/WorldMapRendererActor.kt | 65 ++++++++++++++----- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt index 05b2707d..1ab1d283 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -4,7 +4,6 @@ import com.badlogic.gdx.Gdx import com.badlogic.gdx.Input.Buttons import com.badlogic.gdx.Input.Keys import com.badlogic.gdx.graphics.Color -import com.badlogic.gdx.graphics.OrthographicCamera import com.badlogic.gdx.graphics.g2d.Batch import com.badlogic.gdx.graphics.glutils.ShapeRenderer import com.badlogic.gdx.math.Vector2 @@ -12,6 +11,7 @@ import com.badlogic.gdx.math.Vector4 import com.badlogic.gdx.scenes.scene2d.Group import com.badlogic.gdx.scenes.scene2d.InputEvent import com.badlogic.gdx.scenes.scene2d.InputListener +import com.badlogic.gdx.scenes.scene2d.Stage import com.badlogic.gdx.scenes.scene2d.ui.Label import com.kotcrab.vis.ui.VisUI import de.gleex.pltcmd.game.application.actors.terrain.model.DrawableWorldTile @@ -27,6 +27,7 @@ import de.gleex.pltcmd.util.measure.distance.Distance import de.gleex.pltcmd.util.measure.distance.DistanceUnit.Meters import mu.KotlinLogging import kotlin.math.floor +import kotlin.properties.Delegates private val log = KotlinLogging.logger { } @@ -40,17 +41,28 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { private val coordinateHighlightLabel = Label(bottomLeftCoordinate.toString(), VisUI.getSkin()) - private val cam = OrthographicCamera(width, height) + private var worldWidthInMeters by Delegates.notNull() + private var worldHeightInMeters by Delegates.notNull() init { - color = Color.DARK_GRAY - cam.setToOrtho(false, (50 * TILE_WIDTH) / width, (50 * TILE_HEIGHT) / height) setupListeners() - log.info { "My origin: $originX | $originY on stage ${localToStageCoordinates(Vector2(originX, originY))}" } addActor(coordinateHighlightLabel) coordinateHighlightLabel.isVisible = false } + override fun setStage(stage: Stage?) { + super.setStage(stage) + log.debug { "Stage has been set. Updating cam." } + color = Color.DARK_GRAY + val metersW = 50 * TILE_WIDTH + val aspectRatio = width / height + log.debug { "Setting cam to display $metersW meters, aspectRatio is $aspectRatio. And translating by $x | $y" } + worldWidthInMeters = metersW * aspectRatio + worldHeightInMeters = 50 * TILE_HEIGHT + log.debug { "My origin: $originX | $originY on stage ${localToStageCoordinates(Vector2(originX, originY))}" } + log.debug { "My size: $width * $height" } + } + override fun act(delta: Float) { if (delta > 0f) { if (Gdx.input.isKeyPressed(Keys.A)) scrollByCoordinates(-1, 0) @@ -64,9 +76,9 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { override fun draw(batch: Batch?, parentAlpha: Float) { batch?.end() - renderer.transformMatrix = cam.combined - renderer.projectionMatrix = cam.combined - //renderer.translate(x, y, 0f) + renderer.transformMatrix = batch?.transformMatrix + renderer.projectionMatrix = batch?.projectionMatrix + renderer.translate(x, y, 0f) renderer.fillBackground() @@ -129,7 +141,7 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { private fun ShapeRenderer.fillBackground() { drawWithType(ShapeRenderer.ShapeType.Filled) { color = this@WorldMapRendererActor.color - rect(0f, 0f, width, height) + rect(0f, 0f, width, width) } } @@ -183,9 +195,9 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { */ private fun drawPositionOf(coordinate: Coordinate): Vector2 { val currentOriginCoordinate = coordinate - bottomLeftCoordinate - val drawPosX: Float = currentOriginCoordinate.eastingFromLeft.toFloat() * TILE_WIDTH - val drawPosY: Float = currentOriginCoordinate.northingFromBottom.toFloat() * TILE_HEIGHT - return Vector2(drawPosX, drawPosY) + val worldPosX: Float = currentOriginCoordinate.eastingFromLeft.toFloat() * TILE_WIDTH + val worldPosY: Float = currentOriginCoordinate.northingFromBottom.toFloat() * TILE_HEIGHT + return Vector2(worldPosX, worldPosY) } /** @@ -235,7 +247,9 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { val revealListener = object : InputListener() { override fun touchDown(event: InputEvent?, x: Float, y: Float, pointer: Int, button: Int): Boolean { return if (button == Buttons.LEFT) { - knownWorld.reveal(coordinateAtActorPosition(x, y).fillCircle(Distance(250, Meters)).area { true }) + val coordinateAtActorPosition = coordinateAtActorPosition(x, y) + log.debug { "You clicked at $x | $y which results in coordinate $coordinateAtActorPosition" } + knownWorld.reveal(coordinateAtActorPosition.fillCircle(Distance(250, Meters)).area { true }) true } else { false @@ -251,15 +265,30 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { val highlightCoordinateListener = object : InputListener() { override fun touchDown(event: InputEvent?, x: Float, y: Float, pointer: Int, button: Int): Boolean { return if (button == Buttons.RIGHT) { - log.info { "My origin: $originX | $originY on stage ${localToStageCoordinates(Vector2(originX, originY))}" } + val coordinateAtActorPosition = coordinateAtActorPosition(x, y) + val drawPositionOfCoordinate = drawPositionOf(coordinateAtActorPosition) + val clickPositionOnStage = localToStageCoordinates(Vector2(x, y)) + log.debug { "My origin: $originX | $originY on stage ${localToStageCoordinates(Vector2(originX, originY))}" } + log.debug { "You RIGHT clicked at $x | $y" } + log.debug { "\tlocalToStageCoordinates=$clickPositionOnStage" } + log.debug { "\tcoordinateAtActorPosition=$coordinateAtActorPosition" } + log.debug { "\tdrawPositionOfCoordinate=$drawPositionOfCoordinate" } + val currentOriginCoordinate = coordinateAtActorPosition - bottomLeftCoordinate + log.debug { "\t\tcurrentOriginCoordinate = $coordinateAtActorPosition - $bottomLeftCoordinate = $currentOriginCoordinate" } + log.debug { "\t\t TILE_WIDTH * TILE_HEIGHT = $TILE_WIDTH * $TILE_HEIGHT meters" } + val easting = currentOriginCoordinate.eastingFromLeft.toFloat() + val worldPosX: Float = easting * TILE_WIDTH + val northing = currentOriginCoordinate.northingFromBottom.toFloat() + val worldPosY: Float = northing * TILE_HEIGHT + log.debug { "\t\teasting $easting = $worldPosX" } + log.debug { "\t\tnorthing $northing = $worldPosY" } if(coordinateHighlightLabel.x == x && coordinateHighlightLabel.y == y) { coordinateHighlightLabel.isVisible = false } else { - val labelPosition = localToStageCoordinates(drawPositionOf(coordinateAtActorPosition(x, y))) - coordinateHighlightLabel.x = labelPosition.x - coordinateHighlightLabel.y = labelPosition.y + coordinateHighlightLabel.x = clickPositionOnStage.x + coordinateHighlightLabel.y = clickPositionOnStage.y coordinateHighlightLabel.isVisible = true - coordinateHighlightLabel.setText(coordinateAtActorPosition(x, y).toString()) + coordinateHighlightLabel.setText(coordinateAtActorPosition.toString()) } true } else { From 6b911938ea3aa1fc430b3e81f926529a970bc488 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Thu, 27 Jun 2024 21:27:09 +0200 Subject: [PATCH 30/37] fixed tile scaling --- .../application/actors/WorldMapRendererActor.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt index 1ab1d283..a3f2363b 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -18,7 +18,6 @@ import de.gleex.pltcmd.game.application.actors.terrain.model.DrawableWorldTile import de.gleex.pltcmd.game.application.actors.terrain.model.NeighborBitmap import de.gleex.pltcmd.game.engine.attributes.memory.KnownTerrain import de.gleex.pltcmd.game.engine.attributes.memory.KnownWorld -import de.gleex.pltcmd.model.world.WorldTile import de.gleex.pltcmd.model.world.coordinate.Coordinate import de.gleex.pltcmd.model.world.coordinate.fillCircle import de.gleex.pltcmd.model.world.sectorOrigin @@ -195,9 +194,9 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { */ private fun drawPositionOf(coordinate: Coordinate): Vector2 { val currentOriginCoordinate = coordinate - bottomLeftCoordinate - val worldPosX: Float = currentOriginCoordinate.eastingFromLeft.toFloat() * TILE_WIDTH - val worldPosY: Float = currentOriginCoordinate.northingFromBottom.toFloat() * TILE_HEIGHT - return Vector2(worldPosX, worldPosY) + val drawPosX: Float = currentOriginCoordinate.eastingFromLeft.toFloat() * TILE_WIDTH + val drawPosY: Float = currentOriginCoordinate.northingFromBottom.toFloat() * TILE_HEIGHT + return Vector2(drawPosX, drawPosY) } /** @@ -285,8 +284,9 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { if(coordinateHighlightLabel.x == x && coordinateHighlightLabel.y == y) { coordinateHighlightLabel.isVisible = false } else { - coordinateHighlightLabel.x = clickPositionOnStage.x - coordinateHighlightLabel.y = clickPositionOnStage.y + val labelPosition = localToStageCoordinates(drawPositionOfCoordinate) + coordinateHighlightLabel.x = labelPosition.x + coordinateHighlightLabel.y = labelPosition.y coordinateHighlightLabel.isVisible = true coordinateHighlightLabel.setText(coordinateAtActorPosition.toString()) } @@ -318,7 +318,7 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { } } - private val TILE_WIDTH: Float = WorldTile.edgeLength.inUnit(Meters).toFloat() - private val TILE_HEIGHT: Float = WorldTile.edgeLength.inUnit(Meters).toFloat() + private const val TILE_WIDTH = 16f + private const val TILE_HEIGHT = 16f } } \ No newline at end of file From bc601ac942af97f5103f41d0907607d35f495192 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Sun, 30 Jun 2024 20:57:02 +0200 Subject: [PATCH 31/37] very basic contour lines --- .../actors/WorldMapRendererActor.kt | 133 ++++++++++++++---- .../actors/terrain/model/DrawableWorldTile.kt | 2 +- 2 files changed, 110 insertions(+), 25 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt index a3f2363b..43001ee1 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -112,26 +112,97 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { private fun ShapeRenderer.drawTile(tile: DrawableWorldTile) { val drawPos = drawPositionOf(tile.coordinate) // Terrain type - drawWithType(ShapeRenderer.ShapeType.Filled) { - // TODO: draw height - color = tile.terrain?.type?.let { terrainTypeColor[it] } ?: Color.BLACK - rect(drawPos.x, drawPos.y, TILE_WIDTH, TILE_HEIGHT) + terrainType(tile, drawPos) + // Terrain height + contourLines(tile, drawPos) + } + + private fun ShapeRenderer.terrainType( + tile: DrawableWorldTile, + drawPos: Vector2 + ) { + val terrainTypeColor: Color? = tile.terrain?.type?.let { terrainTypeColor[it] } + if (terrainTypeColor != null) { + drawWithType(ShapeRenderer.ShapeType.Filled) { + color = terrainTypeColor + rect(drawPos.x, drawPos.y, TILE_WIDTH, TILE_HEIGHT) + } } - // contour lines - val localHeight = tile.terrain?.height - if(!tile.neighborsSameHeight.all() && localHeight != null) { - var northLine: Vector4? = null - if(tile.neighborsSameHeight.isNorth().not()) { - val nHeight = knownWorld[tile.coordinate.withRelativeNorthing(1)].terrain?.height - if(nHeight != null && localHeight > nHeight) { - northLine = Vector4(drawPos.x, drawPos.y + 2.0f, drawPos.x + TILE_WIDTH, drawPos.y + 2.0f) + } + + private fun ShapeRenderer.contourLines( + tile: DrawableWorldTile, + drawPos: Vector2 + ) { + tile.terrain?.height?.let { localHeight -> + val contourLineColor = if(localHeight.value % 2 == 0) { Color.RED } else { Color.ORANGE } + val offsetFromEdge = 2.0f + if (tile.neighborsLower.all()) { + drawWithType(ShapeRenderer.ShapeType.Line) { + color = contourLineColor + rect( + drawPos.x + offsetFromEdge, + drawPos.y + offsetFromEdge, + TILE_WIDTH - offsetFromEdge, + TILE_HEIGHT - offsetFromEdge + ) } - } - drawWithType(ShapeRenderer.ShapeType.Line) { - northLine?.let { - log.debug { "Drawing northLine at ${tile.coordinate} with drawPos $it" } - color = Color.RED - line(it.x, it.y, it.z, it.w) + } else { + var northLine: Vector4? = null + if (tile.neighborsLower.isNorth()) { + val nHeight = knownWorld[tile.coordinate.withRelativeNorthing(1)].terrain?.height + if (nHeight != null && localHeight > nHeight) { + northLine = Vector4( + drawPos.x, + (drawPos.y + TILE_HEIGHT) - offsetFromEdge, + drawPos.x + TILE_WIDTH, + (drawPos.y + TILE_HEIGHT) - offsetFromEdge + ) + } + } + var southLine: Vector4? = null + if (tile.neighborsLower.isSouth()) { + val nHeight = knownWorld[tile.coordinate.withRelativeNorthing(-1)].terrain?.height + if (nHeight != null && localHeight > nHeight) { + southLine = Vector4( + drawPos.x, + drawPos.y + offsetFromEdge, + drawPos.x + TILE_WIDTH, + drawPos.y + offsetFromEdge + ) + } + } + var eastLine: Vector4? = null + if (tile.neighborsLower.isEast()) { + val nHeight = knownWorld[tile.coordinate.withRelativeEasting(1)].terrain?.height + if (nHeight != null && localHeight > nHeight) { + eastLine = Vector4( + (drawPos.x + TILE_WIDTH) - offsetFromEdge, + drawPos.y + TILE_HEIGHT, + (drawPos.x + TILE_WIDTH) - offsetFromEdge, + drawPos.y + ) + } + } + var westLine: Vector4? = null + if (tile.neighborsLower.isWest()) { + val nHeight = knownWorld[tile.coordinate.withRelativeEasting(-1)].terrain?.height + if (nHeight != null && localHeight > nHeight) { + westLine = Vector4( + drawPos.x + offsetFromEdge, + drawPos.y + TILE_HEIGHT, + drawPos.x + offsetFromEdge, + drawPos.y + ) + } + } + drawWithType(ShapeRenderer.ShapeType.Line) { + listOf(northLine, eastLine, southLine, westLine).forEach { + it?.let { + color = contourLineColor + line(it.x, it.y, it.z, it.w) + } + } } } } @@ -177,16 +248,30 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { private fun KnownWorld.drawableTileFor(coordinate: Coordinate): DrawableWorldTile { val knowTile: KnownTerrain = get(coordinate) - val sameHeights = buildList { + val lowerNeighbors = buildList { knowTile.terrain?.height?.let { height -> - if(height == get(coordinate.withRelativeNorthing(1)).terrain?.height) { - log.debug { "Adding NORTH to height bitmap of $coordinate" } - add(NeighborBitmap.Direction.NORTH) - } + listOf( + (0 to 1) to NeighborBitmap.Direction.NORTH, + (1 to 1) to NeighborBitmap.Direction.NORTH_EAST, + (1 to 0) to NeighborBitmap.Direction.EAST, + (1 to -1) to NeighborBitmap.Direction.SOUTH_EAST, + (-1 to 0) to NeighborBitmap.Direction.SOUTH, + (-1 to -1) to NeighborBitmap.Direction.SOUTH_WEST, + (-1 to 0) to NeighborBitmap.Direction.WEST, + (-1 to 1) to NeighborBitmap.Direction.NORTH_WEST, + ) + .forEach { (diffPair, direction) -> + val (eastingDiff, northingDiff) = diffPair + val neighborHeight = get(coordinate.movedBy(eastingDiff, northingDiff)).terrain?.height + if (neighborHeight != null && neighborHeight.value < height.value) { + log.debug { "Adding $direction to height bitmap of $coordinate" } + add(direction) + } + } } } // TODO: add all the other bits to the bitmaps - return DrawableWorldTile(knowTile, NeighborBitmap.of(sameHeights), NeighborBitmap.of()) + return DrawableWorldTile(knowTile, NeighborBitmap.of(lowerNeighbors), NeighborBitmap.of()) } /** diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt index 60bd4833..0e393983 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt @@ -11,7 +11,7 @@ import de.gleex.pltcmd.model.world.terrain.Terrain */ data class DrawableWorldTile( val tile: KnownTerrain, - val neighborsSameHeight: NeighborBitmap, + val neighborsLower: NeighborBitmap, val neighborsSameTerrain: NeighborBitmap ) { /** From 2d265c3ead87b3d315030f3c1633ba4f169d7374 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Mon, 1 Jul 2024 07:59:13 +0200 Subject: [PATCH 32/37] display height of selected tile --- .../pltcmd/game/application/actors/WorldMapRendererActor.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt index 43001ee1..a228575a 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -370,10 +370,11 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { coordinateHighlightLabel.isVisible = false } else { val labelPosition = localToStageCoordinates(drawPositionOfCoordinate) + val labelText = "$coordinateAtActorPosition${knownWorld[coordinateAtActorPosition].terrain?.height?.let{", $it"} ?: ""}" coordinateHighlightLabel.x = labelPosition.x coordinateHighlightLabel.y = labelPosition.y coordinateHighlightLabel.isVisible = true - coordinateHighlightLabel.setText(coordinateAtActorPosition.toString()) + coordinateHighlightLabel.setText(labelText) } true } else { From 3762d9ec45c2f492c5d8d6eafd17ac0328ae390b Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:24:42 +0200 Subject: [PATCH 33/37] draw a triangle on single top tiles --- .../application/actors/WorldMapRendererActor.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt index a228575a..654caba2 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -147,6 +147,23 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { TILE_HEIGHT - offsetFromEdge ) } + drawWithType(ShapeRenderer.ShapeType.Filled) { + color = contourLineColor + val triangleHeight = 5f + val triangleWidth = 4f + val centerX = TILE_WIDTH / 2f + val centerY = TILE_HEIGHT / 2f + val offsetX = triangleWidth / 2f + val offsetY = triangleHeight / 2f + triangle( + centerX - offsetX, + centerY - offsetY, + centerX + offsetX, + centerY - offsetY, + centerX, + centerY + offsetY + ) + } } else { var northLine: Vector4? = null if (tile.neighborsLower.isNorth()) { From 454a71ad80c769995c4453ae1bf17a46df8d73d9 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Wed, 3 Jul 2024 16:08:12 +0200 Subject: [PATCH 34/37] properly drawing hilltops --- .../gleex/pltcmd/game/application/Pltcmd.kt | 2 +- .../actors/WorldMapRendererActor.kt | 22 ++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt index 26106703..1d9495b0 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/Pltcmd.kt @@ -30,7 +30,7 @@ class Pltcmd : KtxGame() { } private fun generateWorld(): WorldMap { - val seed: Long = 23 //System.currentTimeMillis() + val seed: Long = 1720015570753 // System.currentTimeMillis() // another seed with a long plane area: 1720014618599 log.info { "Generating world with seed $seed" } val worldMapGenerator = WorldMapGenerator(seed, 100, 100) val (worldMap, duration) = measureTimedValue { worldMapGenerator.generateWorld() } diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt index 654caba2..e098805c 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -60,6 +60,9 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { worldHeightInMeters = 50 * TILE_HEIGHT log.debug { "My origin: $originX | $originY on stage ${localToStageCoordinates(Vector2(originX, originY))}" } log.debug { "My size: $width * $height" } +// forEachVisibleCoordinate { +// knownWorld.reveal(it) +// } } override fun act(delta: Float) { @@ -143,25 +146,25 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { rect( drawPos.x + offsetFromEdge, drawPos.y + offsetFromEdge, - TILE_WIDTH - offsetFromEdge, - TILE_HEIGHT - offsetFromEdge + TILE_WIDTH - (offsetFromEdge * 2f), + TILE_HEIGHT - (offsetFromEdge * 2f) ) } drawWithType(ShapeRenderer.ShapeType.Filled) { color = contourLineColor - val triangleHeight = 5f + val triangleHeight = 6f val triangleWidth = 4f val centerX = TILE_WIDTH / 2f val centerY = TILE_HEIGHT / 2f val offsetX = triangleWidth / 2f val offsetY = triangleHeight / 2f triangle( - centerX - offsetX, - centerY - offsetY, - centerX + offsetX, - centerY - offsetY, - centerX, - centerY + offsetY + drawPos.x + (centerX - offsetX), + drawPos.y + (centerY - offsetY), + drawPos.x + (centerX + offsetX), + drawPos.y + (centerY - offsetY), + drawPos.x + centerX, + drawPos.y + (centerY + offsetY) ) } } else { @@ -281,7 +284,6 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { val (eastingDiff, northingDiff) = diffPair val neighborHeight = get(coordinate.movedBy(eastingDiff, northingDiff)).terrain?.height if (neighborHeight != null && neighborHeight.value < height.value) { - log.debug { "Adding $direction to height bitmap of $coordinate" } add(direction) } } From 5998ab0b707dfb36b2eb12ed96b01a8e58d82e75 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Sun, 7 Jul 2024 21:00:05 +0200 Subject: [PATCH 35/37] added FPS display --- .../game/application/actors/WorldMapRendererActor.kt | 10 +++++----- .../pltcmd/game/application/screens/MainGameScreen.kt | 10 ++++++++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt index e098805c..96feda8f 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -46,12 +46,12 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { init { setupListeners() addActor(coordinateHighlightLabel) - coordinateHighlightLabel.isVisible = false } override fun setStage(stage: Stage?) { super.setStage(stage) - log.debug { "Stage has been set. Updating cam." } + log.debug { "Stage has been set. Initializing values." } + coordinateHighlightLabel.isVisible = false color = Color.DARK_GRAY val metersW = 50 * TILE_WIDTH val aspectRatio = width / height @@ -60,9 +60,9 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { worldHeightInMeters = 50 * TILE_HEIGHT log.debug { "My origin: $originX | $originY on stage ${localToStageCoordinates(Vector2(originX, originY))}" } log.debug { "My size: $width * $height" } -// forEachVisibleCoordinate { -// knownWorld.reveal(it) -// } + forEachVisibleCoordinate { + knownWorld.reveal(it) + } } override fun act(delta: Float) { diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt index 3a37712e..a6ed2bff 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/screens/MainGameScreen.kt @@ -10,7 +10,9 @@ import com.badlogic.gdx.scenes.scene2d.InputListener import com.badlogic.gdx.scenes.scene2d.Stage import com.badlogic.gdx.scenes.scene2d.actions.Actions import com.badlogic.gdx.scenes.scene2d.actions.ColorAction +import com.badlogic.gdx.scenes.scene2d.ui.Label import com.badlogic.gdx.utils.viewport.StretchViewport +import com.kotcrab.vis.ui.VisUI import de.gleex.pltcmd.game.application.actors.WorldMapRendererActor import de.gleex.pltcmd.game.engine.attributes.memory.KnownWorld import de.gleex.pltcmd.model.world.WorldMap @@ -46,6 +48,14 @@ class MainGameScreen(private val knownWorld: KnownWorld) : KtxScreen { width = 800f height = 800f }.also { stage.keyboardFocus = it }) + + // FPS display + stage.addActor(object : Label("${Gdx.graphics.framesPerSecond}", VisUI.getSkin()) { + override fun act(delta: Float) { + this.setText(Gdx.graphics.framesPerSecond) + super.act(delta) + } + }) } override fun render(delta: Float) { From 634e21ddea910003ae802a13ee622e8f2f0d472c Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Sun, 7 Jul 2024 21:14:45 +0200 Subject: [PATCH 36/37] caching fully revealed tiles, no performance improvement (still 28 fps) --- .../actors/WorldMapRendererActor.kt | 41 ++++++++++++------- .../actors/terrain/model/DrawableWorldTile.kt | 3 +- .../actors/terrain/model/NeighborBitmap.kt | 18 ++++---- 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt index 96feda8f..e51dd262 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -43,6 +43,8 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { private var worldWidthInMeters by Delegates.notNull() private var worldHeightInMeters by Delegates.notNull() + private val tileCache: MutableMap = HashMap(knownWorld.origin.allTiles.size / 8, 0.9f) + init { setupListeners() addActor(coordinateHighlightLabel) @@ -267,22 +269,15 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { } private fun KnownWorld.drawableTileFor(coordinate: Coordinate): DrawableWorldTile { + if(tileCache.containsKey(coordinate)) { + return tileCache[coordinate]!! + } val knowTile: KnownTerrain = get(coordinate) val lowerNeighbors = buildList { knowTile.terrain?.height?.let { height -> - listOf( - (0 to 1) to NeighborBitmap.Direction.NORTH, - (1 to 1) to NeighborBitmap.Direction.NORTH_EAST, - (1 to 0) to NeighborBitmap.Direction.EAST, - (1 to -1) to NeighborBitmap.Direction.SOUTH_EAST, - (-1 to 0) to NeighborBitmap.Direction.SOUTH, - (-1 to -1) to NeighborBitmap.Direction.SOUTH_WEST, - (-1 to 0) to NeighborBitmap.Direction.WEST, - (-1 to 1) to NeighborBitmap.Direction.NORTH_WEST, - ) - .forEach { (diffPair, direction) -> - val (eastingDiff, northingDiff) = diffPair - val neighborHeight = get(coordinate.movedBy(eastingDiff, northingDiff)).terrain?.height + NeighborBitmap.Direction.entries + .forEach { direction -> + val neighborHeight = get(coordinate.movedBy(direction.eastingDiff, direction.northingDiff)).terrain?.height if (neighborHeight != null && neighborHeight.value < height.value) { add(direction) } @@ -290,7 +285,25 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { } } // TODO: add all the other bits to the bitmaps - return DrawableWorldTile(knowTile, NeighborBitmap.of(lowerNeighbors), NeighborBitmap.of()) + val neighborsRevealed = buildList { + NeighborBitmap.Direction.entries + .forEach { direction -> + if(get(coordinate.movedBy(direction.eastingDiff, direction.northingDiff)).revealed) { + add(direction) + } + } + } + val drawableWorldTile = DrawableWorldTile( + knowTile, + NeighborBitmap.of(lowerNeighbors), + NeighborBitmap.of(), + NeighborBitmap.of(neighborsRevealed) + ) + if(drawableWorldTile.neighborsRevealed.all()) { + log.info { "All neighbors of $coordinate revealed, caching drawable tile." } + tileCache[coordinate] = drawableWorldTile + } + return drawableWorldTile } /** diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt index 0e393983..095a2295 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt @@ -12,7 +12,8 @@ import de.gleex.pltcmd.model.world.terrain.Terrain data class DrawableWorldTile( val tile: KnownTerrain, val neighborsLower: NeighborBitmap, - val neighborsSameTerrain: NeighborBitmap + val neighborsSameTerrain: NeighborBitmap, + val neighborsRevealed: NeighborBitmap ) { /** * The coordinate of the underlying [KnownTerrain]. diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmap.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmap.kt index 8605e8da..119cfd0f 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmap.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/NeighborBitmap.kt @@ -82,14 +82,14 @@ class NeighborBitmap private constructor(private val bitmap: UByte) { /** * Represents the bit for one of the 8 cardinal directions of a neighboring tile. */ - enum class Direction(val byteValue: UByte) { - NORTH(1.toUByte()), - NORTH_EAST(2.toUByte()), - EAST(4.toUByte()), - SOUTH_EAST(8.toUByte()), - SOUTH(16.toUByte()), - SOUTH_WEST(32.toUByte()), - WEST(64.toUByte()), - NORTH_WEST(128.toUByte()) + enum class Direction(val byteValue: UByte, val eastingDiff: Int, val northingDiff: Int) { + NORTH(1.toUByte(), 0 , 1), + NORTH_EAST(2.toUByte(), 1 ,1), + EAST(4.toUByte(), 1, 0), + SOUTH_EAST(8.toUByte(), 1, -1), + SOUTH(16.toUByte(), 0, -1), + SOUTH_WEST(32.toUByte(), -1, -1), + WEST(64.toUByte(), -1, 0), + NORTH_WEST(128.toUByte(), -1, 1) } } From 10ca2c558edc52d17c4ff6905a072e54e72272e9 Mon Sep 17 00:00:00 2001 From: Baret <450955+Baret@users.noreply.github.com> Date: Sat, 13 Jul 2024 21:09:20 +0200 Subject: [PATCH 37/37] moved contour line calculations, still 28 frames --- .../actors/WorldMapRendererActor.kt | 140 ++++++++++-------- .../actors/terrain/model/DrawableWorldTile.kt | 4 +- 2 files changed, 79 insertions(+), 65 deletions(-) diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt index e51dd262..811b8b65 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/WorldMapRendererActor.kt @@ -141,15 +141,14 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { ) { tile.terrain?.height?.let { localHeight -> val contourLineColor = if(localHeight.value % 2 == 0) { Color.RED } else { Color.ORANGE } - val offsetFromEdge = 2.0f if (tile.neighborsLower.all()) { drawWithType(ShapeRenderer.ShapeType.Line) { color = contourLineColor rect( - drawPos.x + offsetFromEdge, - drawPos.y + offsetFromEdge, - TILE_WIDTH - (offsetFromEdge * 2f), - TILE_HEIGHT - (offsetFromEdge * 2f) + drawPos.x + OFFSET_FROM_TILE_EDGE, + drawPos.y + OFFSET_FROM_TILE_EDGE, + TILE_WIDTH - (OFFSET_FROM_TILE_EDGE * 2f), + TILE_HEIGHT - (OFFSET_FROM_TILE_EDGE * 2f) ) } drawWithType(ShapeRenderer.ShapeType.Filled) { @@ -170,60 +169,12 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { ) } } else { - var northLine: Vector4? = null - if (tile.neighborsLower.isNorth()) { - val nHeight = knownWorld[tile.coordinate.withRelativeNorthing(1)].terrain?.height - if (nHeight != null && localHeight > nHeight) { - northLine = Vector4( - drawPos.x, - (drawPos.y + TILE_HEIGHT) - offsetFromEdge, - drawPos.x + TILE_WIDTH, - (drawPos.y + TILE_HEIGHT) - offsetFromEdge - ) - } - } - var southLine: Vector4? = null - if (tile.neighborsLower.isSouth()) { - val nHeight = knownWorld[tile.coordinate.withRelativeNorthing(-1)].terrain?.height - if (nHeight != null && localHeight > nHeight) { - southLine = Vector4( - drawPos.x, - drawPos.y + offsetFromEdge, - drawPos.x + TILE_WIDTH, - drawPos.y + offsetFromEdge - ) - } - } - var eastLine: Vector4? = null - if (tile.neighborsLower.isEast()) { - val nHeight = knownWorld[tile.coordinate.withRelativeEasting(1)].terrain?.height - if (nHeight != null && localHeight > nHeight) { - eastLine = Vector4( - (drawPos.x + TILE_WIDTH) - offsetFromEdge, - drawPos.y + TILE_HEIGHT, - (drawPos.x + TILE_WIDTH) - offsetFromEdge, - drawPos.y - ) - } - } - var westLine: Vector4? = null - if (tile.neighborsLower.isWest()) { - val nHeight = knownWorld[tile.coordinate.withRelativeEasting(-1)].terrain?.height - if (nHeight != null && localHeight > nHeight) { - westLine = Vector4( - drawPos.x + offsetFromEdge, - drawPos.y + TILE_HEIGHT, - drawPos.x + offsetFromEdge, - drawPos.y - ) - } - } drawWithType(ShapeRenderer.ShapeType.Line) { - listOf(northLine, eastLine, southLine, westLine).forEach { - it?.let { - color = contourLineColor - line(it.x, it.y, it.z, it.w) - } + tile.contourLines.forEach { contourLine -> + val lineStart = Vector2(drawPos.x + contourLine.x, drawPos.y + contourLine.y) + val lineEnd = Vector2(drawPos.x + contourLine.z, drawPos.y + contourLine.w) + color = contourLineColor + line(lineStart.x, lineStart.y, lineEnd.x, lineEnd.y) } } } @@ -272,9 +223,9 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { if(tileCache.containsKey(coordinate)) { return tileCache[coordinate]!! } - val knowTile: KnownTerrain = get(coordinate) + val knownTile: KnownTerrain = get(coordinate) val lowerNeighbors = buildList { - knowTile.terrain?.height?.let { height -> + knownTile.terrain?.height?.let { height -> NeighborBitmap.Direction.entries .forEach { direction -> val neighborHeight = get(coordinate.movedBy(direction.eastingDiff, direction.northingDiff)).terrain?.height @@ -284,7 +235,7 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { } } } - // TODO: add all the other bits to the bitmaps + val neighborsLower = NeighborBitmap.of(lowerNeighbors) val neighborsRevealed = buildList { NeighborBitmap.Direction.entries .forEach { direction -> @@ -293,11 +244,71 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { } } } + + // contour lines + val contourLines = mutableListOf() + if(knownTile.revealed) { + val localHeight = knownTile.terrain?.height!! + if (neighborsLower.isNorth()) { + val nHeight = knownWorld[coordinate.withRelativeNorthing(1)].terrain?.height + if (nHeight != null && localHeight > nHeight) { + contourLines.add( + Vector4( + 0f, + TILE_HEIGHT - OFFSET_FROM_TILE_EDGE, + TILE_WIDTH, + TILE_HEIGHT - OFFSET_FROM_TILE_EDGE + ) + ) + } + } + if (neighborsLower.isSouth()) { + val nHeight = knownWorld[coordinate.withRelativeNorthing(-1)].terrain?.height + if (nHeight != null && localHeight > nHeight) { + contourLines.add( + Vector4( + 0f, + OFFSET_FROM_TILE_EDGE, + TILE_WIDTH, + OFFSET_FROM_TILE_EDGE + ) + ) + } + } + if (neighborsLower.isEast()) { + val nHeight = knownWorld[coordinate.withRelativeEasting(1)].terrain?.height + if (nHeight != null && localHeight > nHeight) { + contourLines.add( + Vector4( + TILE_WIDTH - OFFSET_FROM_TILE_EDGE, + TILE_HEIGHT, + TILE_WIDTH - OFFSET_FROM_TILE_EDGE, + 0f + ) + ) + } + } + if (neighborsLower.isWest()) { + val nHeight = knownWorld[coordinate.withRelativeEasting(-1)].terrain?.height + if (nHeight != null && localHeight > nHeight) { + contourLines.add( + Vector4( + OFFSET_FROM_TILE_EDGE, + TILE_HEIGHT, + OFFSET_FROM_TILE_EDGE, + 0f + ) + ) + } + } + } + val drawableWorldTile = DrawableWorldTile( - knowTile, - NeighborBitmap.of(lowerNeighbors), + knownTile, + neighborsLower, NeighborBitmap.of(), - NeighborBitmap.of(neighborsRevealed) + NeighborBitmap.of(neighborsRevealed), + contourLines ) if(drawableWorldTile.neighborsRevealed.all()) { log.info { "All neighbors of $coordinate revealed, caching drawable tile." } @@ -438,5 +449,6 @@ class WorldMapRendererActor(private val knownWorld: KnownWorld) : Group() { private const val TILE_WIDTH = 16f private const val TILE_HEIGHT = 16f + private const val OFFSET_FROM_TILE_EDGE = 2.0f } } \ No newline at end of file diff --git a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt index 095a2295..14179ab6 100644 --- a/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt +++ b/game/application-ktx/src/main/kotlin/de/gleex/pltcmd/game/application/actors/terrain/model/DrawableWorldTile.kt @@ -1,5 +1,6 @@ package de.gleex.pltcmd.game.application.actors.terrain.model +import com.badlogic.gdx.math.Vector4 import de.gleex.pltcmd.game.engine.attributes.memory.KnownTerrain import de.gleex.pltcmd.model.world.WorldTile import de.gleex.pltcmd.model.world.coordinate.Coordinate @@ -13,7 +14,8 @@ data class DrawableWorldTile( val tile: KnownTerrain, val neighborsLower: NeighborBitmap, val neighborsSameTerrain: NeighborBitmap, - val neighborsRevealed: NeighborBitmap + val neighborsRevealed: NeighborBitmap, + val contourLines: List ) { /** * The coordinate of the underlying [KnownTerrain].