this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

convert AssetHandle to Kotlin and don't extend File

+725 -306
+7
.idea/kotlinc.xml
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <project version="4"> 3 + <component name="KotlinJpsPluginSettings"> 4 + <option name="externalSystemId" value="Gradle" /> 5 + <option name="version" value="2.2.20" /> 6 + </component> 7 + </project>
+4 -1
.idea/misc.xml
··· 1 1 <?xml version="1.0" encoding="UTF-8"?> 2 2 <project version="4"> 3 3 <component name="ExternalStorageConfigurationManager" enabled="true" /> 4 - <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK" /> 4 + <component name="FrameworkDetectionExcludesConfiguration"> 5 + <file type="web" url="file://$PROJECT_DIR$" /> 6 + </component> 7 + <component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-21" project-jdk-type="JavaSDK" /> 5 8 </project>
+3 -2
build.gradle.kts
··· 16 16 17 17 plugins { 18 18 id("java") 19 - id("org.jetbrains.kotlin.jvm") version "2.1.0" 20 - id("org.jetbrains.kotlin.plugin.serialization") version "2.1.0" 19 + id("org.jetbrains.kotlin.jvm") version "2.2.20" 20 + id("org.jetbrains.kotlin.plugin.serialization") version "2.2.20" 21 21 id("com.github.johnrengelman.shadow") version "8.1.1" 22 22 id("net.nemerosa.versioning") version "3.1.0" 23 23 id("com.cmgapps.licenses") version "4.8.0" ··· 111 111 implementation("org.ahocorasick:ahocorasick:0.6.3") 112 112 113 113 // Kotlin 114 + implementation("org.jetbrains.kotlin:kotlin-reflect:2.2.20") 114 115 implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0") 115 116 implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.9.0") 116 117 implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
+438
gradle/verification-metadata.xml
··· 86 86 <sha256 value="5d462f32da4f85f14644a848de326e4098d59a0e1a59395ece8845df62941b65" origin="Generated by Gradle"/> 87 87 </artifact> 88 88 </component> 89 + <component group="com.github.ben-manes.caffeine" name="caffeine" version="2.9.3"> 90 + <artifact name="caffeine-2.9.3.jar"> 91 + <sha256 value="1e0a7bbef1dd791653143f3f05d0e489934bf5481e58a87c9e619cd46b68729b" origin="Generated by Gradle"/> 92 + </artifact> 93 + <artifact name="caffeine-2.9.3.module"> 94 + <sha256 value="27dfd34ad6656990d3c73176344b0991f2c82709fab30709b3ddea8fa3003070" origin="Generated by Gradle"/> 95 + </artifact> 96 + </component> 89 97 <component group="com.github.johnrengelman" name="shadow" version="8.1.1"> 90 98 <artifact name="shadow-8.1.1.jar"> 91 99 <sha256 value="084197555590a53bb21b59508a3330559f536ddb448eafd1ec675f5462036fcf" origin="Generated by Gradle"/> ··· 136 144 <sha256 value="d2b115634f5c085db4b9c9ffc2658e89e231fdbfbe2242121a1cd95d4d948dd7" origin="Generated by Gradle"/> 137 145 </artifact> 138 146 </component> 147 + <component group="com.google.code.gson" name="gson" version="2.11.0"> 148 + <artifact name="gson-2.11.0.jar"> 149 + <sha256 value="57928d6e5a6edeb2abd3770a8f95ba44dce45f3b23b7a9dc2b309c581552a78b" origin="Generated by Gradle"/> 150 + </artifact> 151 + <artifact name="gson-2.11.0.pom"> 152 + <sha256 value="c0e547bea998888e6e25c5886a90e762272bc88b5275343dd2c05ded6ca2e360" origin="Generated by Gradle"/> 153 + </artifact> 154 + </component> 139 155 <component group="com.google.code.gson" name="gson" version="2.8.9"> 140 156 <artifact name="gson-2.8.9.jar"> 141 157 <sha256 value="d3999291855de495c94c743761b8ab5176cfeabe281a5ab0d8e8d45326fd703e" origin="Generated by Gradle"/> ··· 149 165 <sha256 value="4248e0882426c615182385d6086c3ef3262e769957189e29306280b85482b833" origin="Generated by Gradle"/> 150 166 </artifact> 151 167 </component> 168 + <component group="com.google.code.gson" name="gson-parent" version="2.11.0"> 169 + <artifact name="gson-parent-2.11.0.pom"> 170 + <sha256 value="8acb1f3b72a6f026916ac0735bad9aab0293d527edb7b365327def13a9367b7a" origin="Generated by Gradle"/> 171 + </artifact> 172 + </component> 152 173 <component group="com.google.code.gson" name="gson-parent" version="2.8.9"> 153 174 <artifact name="gson-parent-2.8.9.pom"> 154 175 <sha256 value="b16e026e63427c1972ad0fc68703ec379b1576e411ba49c32fa9a31ab0bbcffb" origin="Generated by Gradle"/> 176 + </artifact> 177 + </component> 178 + <component group="com.google.errorprone" name="error_prone_annotations" version="2.27.0"> 179 + <artifact name="error_prone_annotations-2.27.0.jar"> 180 + <sha256 value="24c923372c58e35d0b9f16a028929bb9aedc77521867c274f2bd0735df5ba1f5" origin="Generated by Gradle"/> 181 + </artifact> 182 + <artifact name="error_prone_annotations-2.27.0.pom"> 183 + <sha256 value="4ca5a35d61235e16549ac346d1e34551cdf0fe27e84aa57e03cbeb255ea4e5da" origin="Generated by Gradle"/> 184 + </artifact> 185 + </component> 186 + <component group="com.google.errorprone" name="error_prone_annotations" version="2.28.0"> 187 + <artifact name="error_prone_annotations-2.28.0.jar"> 188 + <sha256 value="f3fc8a3a0a4020706a373b00e7f57c2512dd26d1f83d28c7d38768f8682b231e" origin="Generated by Gradle"/> 189 + </artifact> 190 + <artifact name="error_prone_annotations-2.28.0.pom"> 191 + <sha256 value="0ce909f13a568148476e5ee200f380f98c75ba08971aaf15db295eb77598ef3a" origin="Generated by Gradle"/> 192 + </artifact> 193 + </component> 194 + <component group="com.google.errorprone" name="error_prone_parent" version="2.27.0"> 195 + <artifact name="error_prone_parent-2.27.0.pom"> 196 + <sha256 value="fa81829d049559df6927f9c9a6fd6bbd09f8b50e6d4736ae72c8300b6c3d7654" origin="Generated by Gradle"/> 197 + </artifact> 198 + </component> 199 + <component group="com.google.errorprone" name="error_prone_parent" version="2.28.0"> 200 + <artifact name="error_prone_parent-2.28.0.pom"> 201 + <sha256 value="accefdbb5416cef5fcd2ddc37db4f1fcb34a2193cc1a55dfe5970a131b3e7683" origin="Generated by Gradle"/> 155 202 </artifact> 156 203 </component> 157 204 <component group="com.googlecode.javaewah" name="JavaEWAH" version="1.1.13"> ··· 310 357 <sha256 value="ac70288786a902e17909e62f7fb772ae421c460ab10e7200b5021f58e348136c" origin="Generated by Gradle"/> 311 358 </artifact> 312 359 </component> 360 + <component group="io.github.java-diff-utils" name="java-diff-utils" version="4.12"> 361 + <artifact name="java-diff-utils-4.12.jar"> 362 + <sha256 value="9990a2039778f6b4cc94790141c2868864eacee0620c6c459451121a901cd5b5" origin="Generated by Gradle"/> 363 + </artifact> 364 + <artifact name="java-diff-utils-4.12.pom"> 365 + <sha256 value="c26e097edc8ec6805d1319817d23d4e496cc1015cc55dc5202112d8f6a9165fc" origin="Generated by Gradle"/> 366 + </artifact> 367 + </component> 368 + <component group="io.github.java-diff-utils" name="java-diff-utils-parent" version="4.12"> 369 + <artifact name="java-diff-utils-parent-4.12.pom"> 370 + <sha256 value="d811cf9f118cc2cad130c9427ad55c174d4c0a6f1a00ac1ae1c9bcbec5c44b19" origin="Generated by Gradle"/> 371 + </artifact> 372 + </component> 313 373 <component group="io.netty" name="netty-bom" version="4.1.86.Final"> 314 374 <artifact name="netty-bom-4.1.86.Final.pom"> 315 375 <sha256 value="12716c1fe64cf5bdaa7044d37d13aae3a88821b91d4798420c46a74769178afd" origin="Generated by Gradle"/> 376 + </artifact> 377 + </component> 378 + <component group="io.opentelemetry" name="opentelemetry-api" version="1.41.0"> 379 + <artifact name="opentelemetry-api-1.41.0.jar"> 380 + <sha256 value="9336668f388de68a0a2c3e114154febd29db19a7644f27c4eba548f5de852258" origin="Generated by Gradle"/> 381 + </artifact> 382 + <artifact name="opentelemetry-api-1.41.0.module"> 383 + <sha256 value="261468589c993b88f7ccad9338ffd8166b9df4cc34de308066932b2a5c9de956" origin="Generated by Gradle"/> 384 + </artifact> 385 + </component> 386 + <component group="io.opentelemetry" name="opentelemetry-context" version="1.41.0"> 387 + <artifact name="opentelemetry-context-1.41.0.jar"> 388 + <sha256 value="5e3432a4464a432abfdab73be7142e516d25a84aa8426fce1192ffb0532faa35" origin="Generated by Gradle"/> 389 + </artifact> 390 + <artifact name="opentelemetry-context-1.41.0.module"> 391 + <sha256 value="174dcda3e840226138adb8ce9043576ddc43c286b612d3dbf64531f67bd8d987" origin="Generated by Gradle"/> 316 392 </artifact> 317 393 </component> 318 394 <component group="jakarta.annotation" name="jakarta.annotation-api" version="3.0.0"> ··· 583 659 <sha256 value="b477dc18545f3c26c82a3c8557ffca48a81f20dc9a7da08c2b542a4b08934e91" origin="Generated by Gradle"/> 584 660 </artifact> 585 661 </component> 662 + <component group="org.bouncycastle" name="bcpg-jdk18on" version="1.80"> 663 + <artifact name="bcpg-jdk18on-1.80.jar"> 664 + <sha256 value="3799a0d53511b860780af43c44ae8e0519afabb263195af40174f46312cd58bd" origin="Generated by Gradle"/> 665 + </artifact> 666 + <artifact name="bcpg-jdk18on-1.80.pom"> 667 + <sha256 value="07a246c2adafb628783a1ae84ac18d4df4025df06ae3634dfe9387ab94f9ea74" origin="Generated by Gradle"/> 668 + </artifact> 669 + </component> 670 + <component group="org.bouncycastle" name="bcpkix-jdk18on" version="1.80"> 671 + <artifact name="bcpkix-jdk18on-1.80.jar"> 672 + <sha256 value="4f4ba6a92617ea19dc183f0fa5db492eee426fdde2a0a2d6c94777ffd1af6413" origin="Generated by Gradle"/> 673 + </artifact> 674 + <artifact name="bcpkix-jdk18on-1.80.pom"> 675 + <sha256 value="a4a122113467b728e18f26fb0cfd57f0b1a0d7c4a53b86718ace70bf8b86ed47" origin="Generated by Gradle"/> 676 + </artifact> 677 + </component> 678 + <component group="org.bouncycastle" name="bcprov-jdk18on" version="1.80"> 679 + <artifact name="bcprov-jdk18on-1.80.jar"> 680 + <sha256 value="e8ad209f8c58d291a37ca9750e9e9fac60596956c983e49dd8282381dd8b3249" origin="Generated by Gradle"/> 681 + </artifact> 682 + <artifact name="bcprov-jdk18on-1.80.pom"> 683 + <sha256 value="a0a75c76d91c421eea56d0f6062fb8f63edf7fac7ec724fd420ccdcad7181d43" origin="Generated by Gradle"/> 684 + </artifact> 685 + </component> 686 + <component group="org.bouncycastle" name="bcutil-jdk18on" version="1.80"> 687 + <artifact name="bcutil-jdk18on-1.80.jar"> 688 + <sha256 value="22eca687f7955411f456af33e6ea8e68fc73cd80cb8b32aa5f7a8b1827d7c678" origin="Generated by Gradle"/> 689 + </artifact> 690 + <artifact name="bcutil-jdk18on-1.80.pom"> 691 + <sha256 value="421a7de4bfeb9c5b38b1fc47c426a087d90878955d4107f5b7a82eb1d7b747b6" origin="Generated by Gradle"/> 692 + </artifact> 693 + </component> 694 + <component group="org.checkerframework" name="checker-qual" version="3.43.0"> 695 + <artifact name="checker-qual-3.43.0.jar"> 696 + <sha256 value="3fbc2e98f05854c3df16df9abaa955b91b15b3ecac33623208ed6424640ef0f6" origin="Generated by Gradle"/> 697 + </artifact> 698 + <artifact name="checker-qual-3.43.0.module"> 699 + <sha256 value="f8163327245ab8625532948c72a930548cd97f34d6c3fe860fa6aec5a34d79b4" origin="Generated by Gradle"/> 700 + </artifact> 701 + </component> 586 702 <component group="org.codehaus.groovy" name="groovy-bom" version="3.0.14"> 587 703 <artifact name="groovy-bom-3.0.14.pom"> 588 704 <sha256 value="24e0e9b738de7118de9e73560ffd06034bb5cf07ca13a7e03459e88ba9d1ae27" origin="Generated by Gradle"/> ··· 674 790 <sha256 value="87721cbaa65a3c97d8b1ba9d207840f164c9fe38759fc9ea10ffe26565f8d3e9" origin="Generated by Gradle"/> 675 791 </artifact> 676 792 </component> 793 + <component group="org.jetbrains.kotlin" name="abi-tools" version="2.2.20"> 794 + <artifact name="abi-tools-2.2.20.jar"> 795 + <sha256 value="a5a637ab821704991cf70616b64e02b9a4f820c82019f93c0d26f0cdfb226633" origin="Generated by Gradle"/> 796 + </artifact> 797 + <artifact name="abi-tools-2.2.20.pom"> 798 + <sha256 value="7df180284535dfaa60ab78e8e69344882e5cdcda7d725535b110e03aee8c5850" origin="Generated by Gradle"/> 799 + </artifact> 800 + </component> 801 + <component group="org.jetbrains.kotlin" name="abi-tools-api" version="2.2.20"> 802 + <artifact name="abi-tools-api-2.2.20.jar"> 803 + <sha256 value="f1c866eac5dc088f3fd081100843409bf4f1612bbb998fbaa1f685325cae0d55" origin="Generated by Gradle"/> 804 + </artifact> 805 + <artifact name="abi-tools-api-2.2.20.pom"> 806 + <sha256 value="1ce2fb35ccd83fcbc90ae5c598dfdbb22952d08547804944a5b21f2c46cac0bd" origin="Generated by Gradle"/> 807 + </artifact> 808 + </component> 809 + <component group="org.jetbrains.kotlin" name="fus-statistics-gradle-plugin" version="2.2.20"> 810 + <artifact name="fus-statistics-gradle-plugin-2.2.20-gradle86.jar"> 811 + <sha256 value="3a69595b6c75fbf92d320168745c698ff7114b8607841050d48498823006e871" origin="Generated by Gradle"/> 812 + </artifact> 813 + <artifact name="fus-statistics-gradle-plugin-2.2.20.module"> 814 + <sha256 value="9fe6955b37fe290b651625cf9c681e6ba20a8f12c4658cce5026e593505a3129" origin="Generated by Gradle"/> 815 + </artifact> 816 + </component> 677 817 <component group="org.jetbrains.kotlin" name="kotlin-build-common" version="2.1.0"> 678 818 <artifact name="kotlin-build-common-2.1.0.jar"> 679 819 <sha256 value="3a5d34e8b1ed8b80ee22d54488c2a425cf7b685481916d726ffb9994088d2cb9" origin="Generated by Gradle"/> ··· 690 830 <sha256 value="2c8c6ac4cf534eacaba9ff5ed3fa45d8029d3a31b211e9e002dfce79fc7a21ca" origin="Generated by Gradle"/> 691 831 </artifact> 692 832 </component> 833 + <component group="org.jetbrains.kotlin" name="kotlin-build-statistics" version="2.2.20"> 834 + <artifact name="kotlin-build-statistics-2.2.20.jar"> 835 + <sha256 value="fb654a4f5bc56368759173129df49107ad09dc5b4172b01775afb3fa72579dd5" origin="Generated by Gradle"/> 836 + </artifact> 837 + <artifact name="kotlin-build-statistics-2.2.20.pom"> 838 + <sha256 value="b5d5364f57d21ff14182205e8b695fd6864d9d8aa5780a6edc4209584047c115" origin="Generated by Gradle"/> 839 + </artifact> 840 + </component> 693 841 <component group="org.jetbrains.kotlin" name="kotlin-build-tools-api" version="2.1.0"> 694 842 <artifact name="kotlin-build-tools-api-2.1.0.jar"> 695 843 <sha256 value="f145b814f9c01328c2c369a6b8fc77434cac02a7d68f0e05d0dd4cada78bbac7" origin="Generated by Gradle"/> ··· 698 846 <sha256 value="e3cfc8da8ddf3bbd3f0ca07183a51feb4893e8bcb8fee801f4b8ce05ef9443a9" origin="Generated by Gradle"/> 699 847 </artifact> 700 848 </component> 849 + <component group="org.jetbrains.kotlin" name="kotlin-build-tools-api" version="2.2.20"> 850 + <artifact name="kotlin-build-tools-api-2.2.20.jar"> 851 + <sha256 value="fd9947b3a17621a86fabd953af87f34bd2bb7f8b26dae92c1ed7be7472f44c3b" origin="Generated by Gradle"/> 852 + </artifact> 853 + <artifact name="kotlin-build-tools-api-2.2.20.pom"> 854 + <sha256 value="02d47d4877ec324b496d93133245cd4d348b652303cf27efa63e38af2fb3cf2a" origin="Generated by Gradle"/> 855 + </artifact> 856 + </component> 701 857 <component group="org.jetbrains.kotlin" name="kotlin-build-tools-impl" version="2.1.0"> 702 858 <artifact name="kotlin-build-tools-impl-2.1.0.jar"> 703 859 <sha256 value="958827bc3711fc3c3491fc77f367a999ad558352b1a2b32d18f5916cce15ed39" origin="Generated by Gradle"/> ··· 706 862 <sha256 value="58ee953420c53e1ea3ab896aaef9964960b444ca8e0a07f76e951e05c62102f9" origin="Generated by Gradle"/> 707 863 </artifact> 708 864 </component> 865 + <component group="org.jetbrains.kotlin" name="kotlin-build-tools-impl" version="2.2.20"> 866 + <artifact name="kotlin-build-tools-impl-2.2.20.jar"> 867 + <sha256 value="64789a7f00565927f2f3f2d109f230574d3d9308ed5d6e86bfca843da6487cf7" origin="Generated by Gradle"/> 868 + </artifact> 869 + <artifact name="kotlin-build-tools-impl-2.2.20.pom"> 870 + <sha256 value="e2f435e7baf01de2ff90d0a8737af8f9bf97fc152e595b86a760ba64e8e69df6" origin="Generated by Gradle"/> 871 + </artifact> 872 + </component> 709 873 <component group="org.jetbrains.kotlin" name="kotlin-compiler-embeddable" version="2.1.0"> 710 874 <artifact name="kotlin-compiler-embeddable-2.1.0.jar"> 711 875 <sha256 value="c1b139a6f251c3b99e92befa326cb75d93a001d74c3ac601155a8cdb0d253783" origin="Generated by Gradle"/> ··· 714 878 <sha256 value="0044fa45046fba7ca808d98f9895f25b16510edb53c1e282107db006d126d67f" origin="Generated by Gradle"/> 715 879 </artifact> 716 880 </component> 881 + <component group="org.jetbrains.kotlin" name="kotlin-compiler-embeddable" version="2.2.20"> 882 + <artifact name="kotlin-compiler-embeddable-2.2.20.jar"> 883 + <sha256 value="1c6c3f810bfe6a41abcbc34b3a2ef639f1e3f4aeed3a953a4b0974eea4f41889" origin="Generated by Gradle"/> 884 + </artifact> 885 + <artifact name="kotlin-compiler-embeddable-2.2.20.pom"> 886 + <sha256 value="05ff025f7fb0932fb11fa1e1ccaef528f76027d956680f8835d438542762e20a" origin="Generated by Gradle"/> 887 + </artifact> 888 + </component> 717 889 <component group="org.jetbrains.kotlin" name="kotlin-compiler-runner" version="2.1.0"> 718 890 <artifact name="kotlin-compiler-runner-2.1.0.jar"> 719 891 <sha256 value="915872c85112df5bc08ec25a1af5d86a2d3f82b1d845310eee62be5508c13497" origin="Generated by Gradle"/> ··· 722 894 <sha256 value="13ad1bfcea4778db8336d30bd8edf02239354475f2c4d3289ddffb5a183205d5" origin="Generated by Gradle"/> 723 895 </artifact> 724 896 </component> 897 + <component group="org.jetbrains.kotlin" name="kotlin-compiler-runner" version="2.2.20"> 898 + <artifact name="kotlin-compiler-runner-2.2.20.jar"> 899 + <sha256 value="faf96834fa2004d78bd8e4420f5828de3d4272427d6474798024ea6e9cf85cdd" origin="Generated by Gradle"/> 900 + </artifact> 901 + <artifact name="kotlin-compiler-runner-2.2.20.pom"> 902 + <sha256 value="91bb15248f4ea944b6330f3103f1eb545d13bdd8ad4aec437b747a586e7b17a9" origin="Generated by Gradle"/> 903 + </artifact> 904 + </component> 725 905 <component group="org.jetbrains.kotlin" name="kotlin-daemon-client" version="2.1.0"> 726 906 <artifact name="kotlin-daemon-client-2.1.0.jar"> 727 907 <sha256 value="1751dabfcd76b58f878b90df6a602241ec4e4cd6fed60e2d5c2201c5068451e3" origin="Generated by Gradle"/> ··· 730 910 <sha256 value="43aebe513576d51f48129cd85c860d0813de6a1cc7591aca7c28e5432cf8df1b" origin="Generated by Gradle"/> 731 911 </artifact> 732 912 </component> 913 + <component group="org.jetbrains.kotlin" name="kotlin-daemon-client" version="2.2.20"> 914 + <artifact name="kotlin-daemon-client-2.2.20.jar"> 915 + <sha256 value="70ef7cdcdc301077b9b3ba21aa9e9c55a76afb3ffbdfef4ab562a677d18dfa4c" origin="Generated by Gradle"/> 916 + </artifact> 917 + <artifact name="kotlin-daemon-client-2.2.20.pom"> 918 + <sha256 value="8a136d0f13eb983a6be34ff1e163c9ce79855e4ba2174f45cb42aaa67553f754" origin="Generated by Gradle"/> 919 + </artifact> 920 + </component> 733 921 <component group="org.jetbrains.kotlin" name="kotlin-daemon-embeddable" version="2.1.0"> 734 922 <artifact name="kotlin-daemon-embeddable-2.1.0.jar"> 735 923 <sha256 value="6aa581bd53c3500e380e4bb6b2407f6d233910012f425349c2ed5a8ddbe29eac" origin="Generated by Gradle"/> ··· 738 926 <sha256 value="c85b7aec38f0a3e53cd221265d08233d9ab1f0600902b7d3d74754def84abf18" origin="Generated by Gradle"/> 739 927 </artifact> 740 928 </component> 929 + <component group="org.jetbrains.kotlin" name="kotlin-daemon-embeddable" version="2.2.20"> 930 + <artifact name="kotlin-daemon-embeddable-2.2.20.jar"> 931 + <sha256 value="7c5c8cd2f8beadd3283239bb9ca219a0cafa1af02682b407b181e1179718f2f7" origin="Generated by Gradle"/> 932 + </artifact> 933 + <artifact name="kotlin-daemon-embeddable-2.2.20.pom"> 934 + <sha256 value="f58866bfbc9867c6d647579cff70d428779972dbddd8de4c257879cb43741489" origin="Generated by Gradle"/> 935 + </artifact> 936 + </component> 741 937 <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin" version="2.1.0"> 742 938 <artifact name="kotlin-gradle-plugin-2.1.0-gradle85.jar"> 743 939 <sha256 value="caafc71157634bf7864f44026f5a63d256881c1cd9711456325266a53bafe728" origin="Generated by Gradle"/> ··· 746 942 <sha256 value="0a846b51225d2a0443f005316cbb1318591f5855ae6e955f7860c25bee9d2b17" origin="Generated by Gradle"/> 747 943 </artifact> 748 944 </component> 945 + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin" version="2.2.20"> 946 + <artifact name="kotlin-gradle-plugin-2.2.20-gradle86.jar"> 947 + <sha256 value="cf74a9dbdceb888119a8c69129e902302c6e7a68bffb65aecfa88203c27ebbf2" origin="Generated by Gradle"/> 948 + </artifact> 949 + <artifact name="kotlin-gradle-plugin-2.2.20.module"> 950 + <sha256 value="dc24bfa47e0442283290e21f069a056141d1f088d6cb9ecaa2eaace1b47b6b8c" origin="Generated by Gradle"/> 951 + </artifact> 952 + </component> 749 953 <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-annotations" version="2.1.0"> 750 954 <artifact name="kotlin-gradle-plugin-annotations-2.1.0.jar"> 751 955 <sha256 value="d53e97f0e13a37d8fa98fb44cd67e45d3bcf8b4278fdbe1acd1ddbccc740f74b" origin="Generated by Gradle"/> ··· 754 958 <sha256 value="6c1ca8596963f1cd12951aee50e34c47b3c0a58893d20f138240f5786c68e4bf" origin="Generated by Gradle"/> 755 959 </artifact> 756 960 </component> 961 + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-annotations" version="2.2.20"> 962 + <artifact name="kotlin-gradle-plugin-annotations-2.2.20.jar"> 963 + <sha256 value="4fc32a1be645ca7404e21b24452088f93e8e993eaffd26f36bd35dbf75c60752" origin="Generated by Gradle"/> 964 + </artifact> 965 + <artifact name="kotlin-gradle-plugin-annotations-2.2.20.pom"> 966 + <sha256 value="b1b6e011792d7ca92fecafbffac4a508f76f039c9f7ae8a323d189288825f4fe" origin="Generated by Gradle"/> 967 + </artifact> 968 + </component> 757 969 <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-api" version="2.1.0"> 758 970 <artifact name="kotlin-gradle-plugin-api-2.1.0-gradle85.jar"> 759 971 <sha256 value="bf03d64ecffcb66d73fea0991768dd75cbeb1192d47c7a48b61ba7f7ca258858" origin="Generated by Gradle"/> ··· 765 977 <sha256 value="9ad196cf9a5c7d8840ad974d697a3af94990ecf16df681e755a90bf42a3ea410" origin="Generated by Gradle"/> 766 978 </artifact> 767 979 </component> 980 + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-api" version="2.2.20"> 981 + <artifact name="kotlin-gradle-plugin-api-2.2.20-gradle86.jar"> 982 + <sha256 value="7607ee5c7a0ca53fa592ee7c540ee808962a7bad8fee9ed78fe674841463d95d" origin="Generated by Gradle"/> 983 + </artifact> 984 + <artifact name="kotlin-gradle-plugin-api-2.2.20.jar"> 985 + <sha256 value="7607ee5c7a0ca53fa592ee7c540ee808962a7bad8fee9ed78fe674841463d95d" origin="Generated by Gradle"/> 986 + </artifact> 987 + <artifact name="kotlin-gradle-plugin-api-2.2.20.module"> 988 + <sha256 value="4fcbf1fc7e54cebfe90b9a5e0fb46962fed5c22d37239da235f5e2dfbc6d5288" origin="Generated by Gradle"/> 989 + </artifact> 990 + </component> 768 991 <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-idea" version="2.1.0"> 769 992 <artifact name="kotlin-gradle-plugin-idea-2.1.0.jar"> 770 993 <sha256 value="1a7e8d40f5498649e7b1995e87bd73504875254ad9cad093b86b81347e80151c" origin="Generated by Gradle"/> ··· 773 996 <sha256 value="cb206888b337cc56acba00bded11942b03b463333fedf25cccd741ef73a8c3e9" origin="Generated by Gradle"/> 774 997 </artifact> 775 998 </component> 999 + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-idea" version="2.2.20"> 1000 + <artifact name="kotlin-gradle-plugin-idea-2.2.20.jar"> 1001 + <sha256 value="ec969c5f0b099f823846232238f9bd64f3d3741e62ea9050ad2e432fad79d0a0" origin="Generated by Gradle"/> 1002 + </artifact> 1003 + <artifact name="kotlin-gradle-plugin-idea-2.2.20.module"> 1004 + <sha256 value="fc85bb29496cc3f5f90c78c7a277a3930ef1160f0843f8aed647b74c67a3b494" origin="Generated by Gradle"/> 1005 + </artifact> 1006 + </component> 776 1007 <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-idea-proto" version="2.1.0"> 777 1008 <artifact name="kotlin-gradle-plugin-idea-proto-2.1.0.jar"> 778 1009 <sha256 value="96d0c169ae7e8191935f748146b9f64a1f6f25d121941e29714faaab089da910" origin="Generated by Gradle"/> ··· 781 1012 <sha256 value="0ec74e3cc7c7a20ca4d8860f9d2cd965670ec419b389ead09d712c81d1bc6047" origin="Generated by Gradle"/> 782 1013 </artifact> 783 1014 </component> 1015 + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-idea-proto" version="2.2.20"> 1016 + <artifact name="kotlin-gradle-plugin-idea-proto-2.2.20.jar"> 1017 + <sha256 value="76d16ee59cde1e6a70556b5d40486ef9f11c1643a87493c19c4df331653837d9" origin="Generated by Gradle"/> 1018 + </artifact> 1019 + <artifact name="kotlin-gradle-plugin-idea-proto-2.2.20.pom"> 1020 + <sha256 value="c51ba149c7f29359d25a4ed1212e28b6934e1a4756f552c0007bf1144d289c1d" origin="Generated by Gradle"/> 1021 + </artifact> 1022 + </component> 784 1023 <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-model" version="2.1.0"> 785 1024 <artifact name="kotlin-gradle-plugin-model-2.1.0.jar"> 786 1025 <sha256 value="306832bc994a061f3bf3f1be592b23945057080499e7dc33c52cb69e33d19164" origin="Generated by Gradle"/> 787 1026 </artifact> 788 1027 <artifact name="kotlin-gradle-plugin-model-2.1.0.module"> 789 1028 <sha256 value="fdb78fa159a111bf9cd0c08023b728c77aebddcb95cfdc505f926a9218adc6a1" origin="Generated by Gradle"/> 1029 + </artifact> 1030 + </component> 1031 + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-model" version="2.2.20"> 1032 + <artifact name="kotlin-gradle-plugin-model-2.2.20.jar"> 1033 + <sha256 value="53a32152826320601852049a0b6f7538ca8bb57fd09d87accd118bc68d43f8e4" origin="Generated by Gradle"/> 1034 + </artifact> 1035 + <artifact name="kotlin-gradle-plugin-model-2.2.20.module"> 1036 + <sha256 value="11974a54f48e0825e977130bf6ef6ac99a7fdb5eb2af9de265af624c763683e5" origin="Generated by Gradle"/> 790 1037 </artifact> 791 1038 </component> 792 1039 <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugins-bom" version="2.1.0"> ··· 797 1044 <sha256 value="9216b199d987cab680450aac715caa57571f8a67800e36e37026f8f453c1feb1" origin="Generated by Gradle"/> 798 1045 </artifact> 799 1046 </component> 1047 + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugins-bom" version="2.2.20"> 1048 + <artifact name="kotlin-gradle-plugins-bom-2.2.20.module"> 1049 + <sha256 value="3fbb4575ae37c4a776aeb86d8ff93c6aa11b0cf2da75749c5320e25850b0229e" origin="Generated by Gradle"/> 1050 + </artifact> 1051 + <artifact name="kotlin-gradle-plugins-bom-2.2.20.pom"> 1052 + <sha256 value="3c6d469e915fbb3096ac4cb8c2f46c79d027c3c590e658a10688a1571eb578d8" origin="Generated by Gradle"/> 1053 + </artifact> 1054 + </component> 800 1055 <component group="org.jetbrains.kotlin" name="kotlin-klib-commonizer-api" version="2.1.0"> 801 1056 <artifact name="kotlin-klib-commonizer-api-2.1.0.jar"> 802 1057 <sha256 value="05fcb427938d6e2379a8430bb6613ab2fe2089d057e064530e7225b864cf9e37" origin="Generated by Gradle"/> ··· 805 1060 <sha256 value="6ee261b9393ccd649ef39efea73bef2e98e46caed5622008dedd769e4cd877eb" origin="Generated by Gradle"/> 806 1061 </artifact> 807 1062 </component> 1063 + <component group="org.jetbrains.kotlin" name="kotlin-klib-commonizer-api" version="2.2.20"> 1064 + <artifact name="kotlin-klib-commonizer-api-2.2.20.jar"> 1065 + <sha256 value="3982be45b12930e21819b589db3707c8e84ce257bf2ace7fc62fc8df368f5b3e" origin="Generated by Gradle"/> 1066 + </artifact> 1067 + <artifact name="kotlin-klib-commonizer-api-2.2.20.pom"> 1068 + <sha256 value="0b3009b49426bfa177aad94b48109b8ca54c724ea2e6c506826a3a95cf5910e1" origin="Generated by Gradle"/> 1069 + </artifact> 1070 + </component> 808 1071 <component group="org.jetbrains.kotlin" name="kotlin-klib-commonizer-embeddable" version="2.1.0"> 809 1072 <artifact name="kotlin-klib-commonizer-embeddable-2.1.0.jar"> 810 1073 <sha256 value="d937f731886937ba369a46b2263294cf1170989d3321d07153c91d9cb86a99d9" origin="Generated by Gradle"/> ··· 813 1076 <sha256 value="67ec3e97100b876dd2b805c9d30fd96d000e56661979a976c483d20a900f29bd" origin="Generated by Gradle"/> 814 1077 </artifact> 815 1078 </component> 1079 + <component group="org.jetbrains.kotlin" name="kotlin-klib-commonizer-embeddable" version="2.2.20"> 1080 + <artifact name="kotlin-klib-commonizer-embeddable-2.2.20.jar"> 1081 + <sha256 value="5de13b49bf1d44109915ea75b638966693695df40cd5b21e6e12aeeb67dc2924" origin="Generated by Gradle"/> 1082 + </artifact> 1083 + <artifact name="kotlin-klib-commonizer-embeddable-2.2.20.pom"> 1084 + <sha256 value="64f9fa9d196319c38e2fae82e9dce99b9ab79f1a3a492bfd04ea1cd06c4a8566" origin="Generated by Gradle"/> 1085 + </artifact> 1086 + </component> 1087 + <component group="org.jetbrains.kotlin" name="kotlin-metadata-jvm" version="2.2.20"> 1088 + <artifact name="kotlin-metadata-jvm-2.2.20.jar"> 1089 + <sha256 value="8524eac90f7e8e0f1366883f2c6c820c93bfa61df3d76857c8d3e803cf67315d" origin="Generated by Gradle"/> 1090 + </artifact> 1091 + <artifact name="kotlin-metadata-jvm-2.2.20.pom"> 1092 + <sha256 value="7b6a80b6a2d2676a0422f69683813231542551f61b320c68721cfb9e1f5909d0" origin="Generated by Gradle"/> 1093 + </artifact> 1094 + </component> 816 1095 <component group="org.jetbrains.kotlin" name="kotlin-native-utils" version="2.1.0"> 817 1096 <artifact name="kotlin-native-utils-2.1.0.jar"> 818 1097 <sha256 value="c4396feba6d0a24ab717426b36418e945b7cd0f50d77c866524f26676f968439" origin="Generated by Gradle"/> ··· 821 1100 <sha256 value="e8d410f736cfaca2fb277b98e4a2796f0e544e1e096a004385c7befce531ee01" origin="Generated by Gradle"/> 822 1101 </artifact> 823 1102 </component> 1103 + <component group="org.jetbrains.kotlin" name="kotlin-native-utils" version="2.2.20"> 1104 + <artifact name="kotlin-native-utils-2.2.20.jar"> 1105 + <sha256 value="5017774a2aea41ff8712137116cd4d8003fe9aba1200c106e65730feb5bb7442" origin="Generated by Gradle"/> 1106 + </artifact> 1107 + <artifact name="kotlin-native-utils-2.2.20.pom"> 1108 + <sha256 value="53efbee05a7122189060f5ee5eca687639ceafe29f5e5996de9862a29c672725" origin="Generated by Gradle"/> 1109 + </artifact> 1110 + </component> 824 1111 <component group="org.jetbrains.kotlin" name="kotlin-reflect" version="1.6.10"> 825 1112 <artifact name="kotlin-reflect-1.6.10.jar"> 826 1113 <sha256 value="3277ac102ae17aad10a55abec75ff5696c8d109790396434b496e75087854203" origin="Generated by Gradle"/> ··· 829 1116 <sha256 value="57905524274a00ae028aaccc27283f6bc5925a934a046c1cc5d06c8ee4d6d5a9" origin="Generated by Gradle"/> 830 1117 </artifact> 831 1118 </component> 1119 + <component group="org.jetbrains.kotlin" name="kotlin-reflect" version="1.9.22"> 1120 + <artifact name="kotlin-reflect-1.9.22.jar"> 1121 + <sha256 value="77f311ca1384811d519fda389fcb1268bdaa058d605046e0ede76c03b0df3e97" origin="Generated by Gradle"/> 1122 + </artifact> 1123 + <artifact name="kotlin-reflect-1.9.22.pom"> 1124 + <sha256 value="c712e358df7b9318b68f5463971b088673837fc0ca4285d1c382c8102edd6b5f" origin="Generated by Gradle"/> 1125 + </artifact> 1126 + </component> 1127 + <component group="org.jetbrains.kotlin" name="kotlin-reflect" version="2.2.20"> 1128 + <artifact name="kotlin-reflect-2.2.20.jar"> 1129 + <sha256 value="8209083a4a7c4e476d9842b078308fa96a96f07a6bd99f05f3586ee13289ab26" origin="Generated by Gradle"/> 1130 + </artifact> 1131 + <artifact name="kotlin-reflect-2.2.20.pom"> 1132 + <sha256 value="4e27474066db83fba2c59074289ba712be8c85157cde0b905029a445c275f5ba" origin="Generated by Gradle"/> 1133 + </artifact> 1134 + </component> 832 1135 <component group="org.jetbrains.kotlin" name="kotlin-script-runtime" version="2.1.0"> 833 1136 <artifact name="kotlin-script-runtime-2.1.0.jar"> 834 1137 <sha256 value="15a2b82119e9f145ea028029bd31166584648a419157c20948c124fa33d40e50" origin="Generated by Gradle"/> ··· 837 1140 <sha256 value="f3332fc0f5e962f6aefe0a2c08d3c4d7ab35b13a05dac84c4bc6914e26ed27cd" origin="Generated by Gradle"/> 838 1141 </artifact> 839 1142 </component> 1143 + <component group="org.jetbrains.kotlin" name="kotlin-script-runtime" version="2.2.20"> 1144 + <artifact name="kotlin-script-runtime-2.2.20.jar"> 1145 + <sha256 value="5c8bd5dd7ae1ea2eeb2778fdbeaa19a562184975f6cab8a0bb6779e4190731ae" origin="Generated by Gradle"/> 1146 + </artifact> 1147 + <artifact name="kotlin-script-runtime-2.2.20.pom"> 1148 + <sha256 value="2293a141e9da80a7e98d85ed2a492e95db0c0165bceab0b72a5ce9e2d92b0807" origin="Generated by Gradle"/> 1149 + </artifact> 1150 + </component> 840 1151 <component group="org.jetbrains.kotlin" name="kotlin-scripting-common" version="2.1.0"> 841 1152 <artifact name="kotlin-scripting-common-2.1.0.jar"> 842 1153 <sha256 value="d3ebe15699ec1a7fb6c3b5fa939eb6b888b3273e6c0597d2c2e3aaa0e46afa45" origin="Generated by Gradle"/> ··· 845 1156 <sha256 value="ab2b23f0cb72ec042c2b808fb18985a7ebe75a65aaa00527969e94325c6c006b" origin="Generated by Gradle"/> 846 1157 </artifact> 847 1158 </component> 1159 + <component group="org.jetbrains.kotlin" name="kotlin-scripting-common" version="2.2.20"> 1160 + <artifact name="kotlin-scripting-common-2.2.20.jar"> 1161 + <sha256 value="fb99ff7f0cd952da68d548d3f3d644ae5078b0b96fc9baf065ec1466a293b805" origin="Generated by Gradle"/> 1162 + </artifact> 1163 + <artifact name="kotlin-scripting-common-2.2.20.pom"> 1164 + <sha256 value="8938c62052975bbb96dcea2da9a78d4b6b24daf2f09d358c1a7a841f168cb73a" origin="Generated by Gradle"/> 1165 + </artifact> 1166 + </component> 848 1167 <component group="org.jetbrains.kotlin" name="kotlin-scripting-compiler-embeddable" version="2.1.0"> 849 1168 <artifact name="kotlin-scripting-compiler-embeddable-2.1.0.jar"> 850 1169 <sha256 value="b2abc6d959c915af92a289aed14a530eaf09e48613f283da0a4e8d3444340fc3" origin="Generated by Gradle"/> ··· 853 1172 <sha256 value="cbfaecdb0693983ab5b6aeab5e70813969f99a239c731c46f8f7404c055d7227" origin="Generated by Gradle"/> 854 1173 </artifact> 855 1174 </component> 1175 + <component group="org.jetbrains.kotlin" name="kotlin-scripting-compiler-embeddable" version="2.2.20"> 1176 + <artifact name="kotlin-scripting-compiler-embeddable-2.2.20.jar"> 1177 + <sha256 value="d862610c003342e5088ca21c440422c7d8a3700e199d603f7a10278c44884761" origin="Generated by Gradle"/> 1178 + </artifact> 1179 + <artifact name="kotlin-scripting-compiler-embeddable-2.2.20.pom"> 1180 + <sha256 value="3d6f6f1591fa3f7af5e23165c68c2ee01725158645434f5e301745e647c75611" origin="Generated by Gradle"/> 1181 + </artifact> 1182 + </component> 856 1183 <component group="org.jetbrains.kotlin" name="kotlin-scripting-compiler-impl-embeddable" version="2.1.0"> 857 1184 <artifact name="kotlin-scripting-compiler-impl-embeddable-2.1.0.jar"> 858 1185 <sha256 value="8a900406012ba5eda8925856253f72235451db387f0ce50ed31d655c9e5c66d6" origin="Generated by Gradle"/> ··· 861 1188 <sha256 value="8b549ab2aadab49d369bfe8f1806f71ff98ffafa1570672ad8f7a8b01b236c7b" origin="Generated by Gradle"/> 862 1189 </artifact> 863 1190 </component> 1191 + <component group="org.jetbrains.kotlin" name="kotlin-scripting-compiler-impl-embeddable" version="2.2.20"> 1192 + <artifact name="kotlin-scripting-compiler-impl-embeddable-2.2.20.jar"> 1193 + <sha256 value="7b79123592fffebf35c616a0ff104332c71cde637a657e09adb5df6c3f9c03ce" origin="Generated by Gradle"/> 1194 + </artifact> 1195 + <artifact name="kotlin-scripting-compiler-impl-embeddable-2.2.20.pom"> 1196 + <sha256 value="fa5fb027ee2a49b3dbff3877541b42fb70aeccc37ba02e1d3ad862a5c67254b7" origin="Generated by Gradle"/> 1197 + </artifact> 1198 + </component> 864 1199 <component group="org.jetbrains.kotlin" name="kotlin-scripting-jvm" version="2.1.0"> 865 1200 <artifact name="kotlin-scripting-jvm-2.1.0.jar"> 866 1201 <sha256 value="c5a21b6d07ef677970b328f9ebff115282285e62c85fa1866e84e4d7be3a44a3" origin="Generated by Gradle"/> 867 1202 </artifact> 868 1203 <artifact name="kotlin-scripting-jvm-2.1.0.pom"> 869 1204 <sha256 value="f0dd3c1c8a8b1dc258b566668a2dbd777ed9ad48ccafa60ec1752480b54d347a" origin="Generated by Gradle"/> 1205 + </artifact> 1206 + </component> 1207 + <component group="org.jetbrains.kotlin" name="kotlin-scripting-jvm" version="2.2.20"> 1208 + <artifact name="kotlin-scripting-jvm-2.2.20.jar"> 1209 + <sha256 value="a91fb9049634a32ba6d3d2e91a0cb9983e0aa4e71c0c2e1b283838a8e061631f" origin="Generated by Gradle"/> 1210 + </artifact> 1211 + <artifact name="kotlin-scripting-jvm-2.2.20.pom"> 1212 + <sha256 value="d1d7fc4564819deeafe8ebdd71f6f21817ffc558ebd14f47a56e8dc93696dd19" origin="Generated by Gradle"/> 870 1213 </artifact> 871 1214 </component> 872 1215 <component group="org.jetbrains.kotlin" name="kotlin-serialization" version="2.1.0"> ··· 877 1220 <sha256 value="a7a3cb25c0ade4ddf5d665d78994e6933a05e4a65ecb2cc3437abd695cec832e" origin="Generated by Gradle"/> 878 1221 </artifact> 879 1222 </component> 1223 + <component group="org.jetbrains.kotlin" name="kotlin-serialization" version="2.2.20"> 1224 + <artifact name="kotlin-serialization-2.2.20-gradle86.jar"> 1225 + <sha256 value="74113e86718e26a3a5a5af35efbb9769ada505c55aac42e9d78c686040b7bd46" origin="Generated by Gradle"/> 1226 + </artifact> 1227 + <artifact name="kotlin-serialization-2.2.20.module"> 1228 + <sha256 value="8ae53a305b18c42062cb3b7ea8d45dd00bca1260d97c9648af54a56879e1cfd8" origin="Generated by Gradle"/> 1229 + </artifact> 1230 + </component> 880 1231 <component group="org.jetbrains.kotlin" name="kotlin-serialization-compiler-plugin-embeddable" version="2.1.0"> 881 1232 <artifact name="kotlin-serialization-compiler-plugin-embeddable-2.1.0.jar"> 882 1233 <sha256 value="c6032f2f87a9ae8ae7ad301987be1732c6cacfacb60eb89a77408fe5b2de7fc5" origin="Generated by Gradle"/> ··· 885 1236 <sha256 value="8415ed8f5bdc71482ad604e9be14c984eec0f7947e1756b4453d1c8a6643a02c" origin="Generated by Gradle"/> 886 1237 </artifact> 887 1238 </component> 1239 + <component group="org.jetbrains.kotlin" name="kotlin-serialization-compiler-plugin-embeddable" version="2.2.20"> 1240 + <artifact name="kotlin-serialization-compiler-plugin-embeddable-2.2.20.jar"> 1241 + <sha256 value="8d8f93620184ac876cba8d3dfda17c25d403f90d2469ca87acd7efa31d84799f" origin="Generated by Gradle"/> 1242 + </artifact> 1243 + <artifact name="kotlin-serialization-compiler-plugin-embeddable-2.2.20.pom"> 1244 + <sha256 value="7c96b79a882c700d01281af5893d1d92e927657d803879068d8310b0d5791bc1" origin="Generated by Gradle"/> 1245 + </artifact> 1246 + </component> 888 1247 <component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="1.9.22"> 889 1248 <artifact name="kotlin-stdlib-1.9.22.jar"> 890 1249 <sha256 value="6abe146c27864138b874ccccfe5f534e3eb923c99a1b7b5d45494ee5694f3e0a" origin="Generated by Gradle"/> ··· 904 1263 <sha256 value="dcfbc8e8bf32cd67a7efadd91d31152bce9870911d6ec50878f4fdb6e03e70e2" origin="Generated by Gradle"/> 905 1264 </artifact> 906 1265 </component> 1266 + <component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="2.2.20"> 1267 + <artifact name="kotlin-stdlib-2.2.20-all.jar"> 1268 + <sha256 value="555cdb4c884a584c1b5d59f696fb76cd660917fab36b8ae8032bcd62c750efe5" origin="Generated by Gradle"/> 1269 + </artifact> 1270 + <artifact name="kotlin-stdlib-2.2.20.jar"> 1271 + <sha256 value="8836ccffd3585fadda9901244b20d42901d2f3cd581058d8434e2ffabcf3a3e7" origin="Generated by Gradle"/> 1272 + </artifact> 1273 + <artifact name="kotlin-stdlib-2.2.20.module"> 1274 + <sha256 value="c918f5214d021a72e3767f2756e97d103a526e04f1423da3663efdfb5847db95" origin="Generated by Gradle"/> 1275 + </artifact> 1276 + </component> 907 1277 <component group="org.jetbrains.kotlin" name="kotlin-stdlib-common" version="2.0.0"> 908 1278 <artifact name="kotlin-stdlib-common-2.0.0.module"> 909 1279 <sha256 value="2335187440c51d0d69e1b906fefc31f6169691c8598177b0e610c9b9a92ce6b5" origin="Generated by Gradle"/> ··· 914 1284 <sha256 value="2b9a5ae785f8513a93f8cec3f6e5e07f8b1766f8497b3a487f3441a251d67563" origin="Generated by Gradle"/> 915 1285 </artifact> 916 1286 </component> 1287 + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-common" version="2.2.20"> 1288 + <artifact name="kotlin-stdlib-common-2.2.20.module"> 1289 + <sha256 value="343d99467fcb44d3efb12a2ba703664ca43f3a3f26fff93c8d31b22683adb57e" origin="Generated by Gradle"/> 1290 + </artifact> 1291 + </component> 917 1292 <component group="org.jetbrains.kotlin" name="kotlin-tooling-core" version="2.1.0"> 918 1293 <artifact name="kotlin-tooling-core-2.1.0.jar"> 919 1294 <sha256 value="4176c612098cb92df38a485ff8b10aaa24abb400f610d48f5088aeb07c8002c8" origin="Generated by Gradle"/> ··· 922 1297 <sha256 value="a5a4e9f54a413cdb2c1d140c349b559f684b0da8b0216a0a5645206f3fc581af" origin="Generated by Gradle"/> 923 1298 </artifact> 924 1299 </component> 1300 + <component group="org.jetbrains.kotlin" name="kotlin-tooling-core" version="2.2.20"> 1301 + <artifact name="kotlin-tooling-core-2.2.20.jar"> 1302 + <sha256 value="74014ec4f3ef78ce7da7e3e6964f2c526a3121d5c58fef8ca2979e5f344582f4" origin="Generated by Gradle"/> 1303 + </artifact> 1304 + <artifact name="kotlin-tooling-core-2.2.20.pom"> 1305 + <sha256 value="8ef7a9d9062ce7dc3fc655715dd028a9944b7849613e011847c5d6b3b9928171" origin="Generated by Gradle"/> 1306 + </artifact> 1307 + </component> 925 1308 <component group="org.jetbrains.kotlin" name="kotlin-util-io" version="2.1.0"> 926 1309 <artifact name="kotlin-util-io-2.1.0.jar"> 927 1310 <sha256 value="001a50db3da0a89a954db615fcb0e3f4a81a5341d407060ea88c9356f10f23e1" origin="Generated by Gradle"/> ··· 930 1313 <sha256 value="ec557203d9248a3701e1665a256cf1e91691733d95fdf2f18f39e8a8ec93c7a1" origin="Generated by Gradle"/> 931 1314 </artifact> 932 1315 </component> 1316 + <component group="org.jetbrains.kotlin" name="kotlin-util-io" version="2.2.20"> 1317 + <artifact name="kotlin-util-io-2.2.20.jar"> 1318 + <sha256 value="d431af6bea6e2dc9889c4fe26b073ce157f111c8608fe95a18bfe08b817cff74" origin="Generated by Gradle"/> 1319 + </artifact> 1320 + <artifact name="kotlin-util-io-2.2.20.pom"> 1321 + <sha256 value="c6a5d01848cd040cfc8f7bae6232d792d705c293a2da7266ae626ccdb35d6a03" origin="Generated by Gradle"/> 1322 + </artifact> 1323 + </component> 933 1324 <component group="org.jetbrains.kotlin" name="kotlin-util-klib" version="2.1.0"> 934 1325 <artifact name="kotlin-util-klib-2.1.0.jar"> 935 1326 <sha256 value="6260a30e876a162d8268faaff6aa2d451e7bba008a03522075792a4e71a61c29" origin="Generated by Gradle"/> ··· 938 1329 <sha256 value="9ebfbbc73137f4d19883df909255adbfc6d13d8fa7ec9ef47066a3b688c96cdc" origin="Generated by Gradle"/> 939 1330 </artifact> 940 1331 </component> 1332 + <component group="org.jetbrains.kotlin" name="kotlin-util-klib" version="2.2.20"> 1333 + <artifact name="kotlin-util-klib-2.2.20.jar"> 1334 + <sha256 value="ed7c8096b2bbe477ad17c3178deba8c83af5328bab36bfe210910bd5b419234c" origin="Generated by Gradle"/> 1335 + </artifact> 1336 + <artifact name="kotlin-util-klib-2.2.20.pom"> 1337 + <sha256 value="da6c22477aaf42dda16d859adae9e3ed8abc921ccba7ff516134cc8bd359aa92" origin="Generated by Gradle"/> 1338 + </artifact> 1339 + </component> 941 1340 <component group="org.jetbrains.kotlin" name="kotlin-util-klib-metadata" version="2.1.0"> 942 1341 <artifact name="kotlin-util-klib-metadata-2.1.0.jar"> 943 1342 <sha256 value="1a8a58974132dbf08193336a45c9350749a1af489667a199da3ebb3a8849907d" origin="Generated by Gradle"/> ··· 946 1345 <sha256 value="e329322576dc1ca8cbe20a3afe4fd1f5724da3b95349b5538cd03b184ff971c2" origin="Generated by Gradle"/> 947 1346 </artifact> 948 1347 </component> 1348 + <component group="org.jetbrains.kotlin" name="kotlin-util-klib-metadata" version="2.2.20"> 1349 + <artifact name="kotlin-util-klib-metadata-2.2.20.jar"> 1350 + <sha256 value="bee4901ca53a5a21c0db645901d2b070aff682402417dd5788e0e3593645713b" origin="Generated by Gradle"/> 1351 + </artifact> 1352 + <artifact name="kotlin-util-klib-metadata-2.2.20.pom"> 1353 + <sha256 value="bed0065122065fae77dbc0c46ffc4146a685cbb18b8a3029abd5da3bfaa11027" origin="Generated by Gradle"/> 1354 + </artifact> 1355 + </component> 1356 + <component group="org.jetbrains.kotlin" name="swift-export-embeddable" version="2.2.20"> 1357 + <artifact name="swift-export-embeddable-2.2.20.jar"> 1358 + <sha256 value="c4080acb4502a26a1a29d8f171b2e304824aa220c2aed4af4043877f2f2d4448" origin="Generated by Gradle"/> 1359 + </artifact> 1360 + <artifact name="swift-export-embeddable-2.2.20.pom"> 1361 + <sha256 value="0a235558a10784df95aaa5535e4144a6c71f49fa6a0aa18e2fcb0129b68b1b76" origin="Generated by Gradle"/> 1362 + </artifact> 1363 + </component> 949 1364 <component group="org.jetbrains.kotlin.jvm" name="org.jetbrains.kotlin.jvm.gradle.plugin" version="2.1.0"> 950 1365 <artifact name="org.jetbrains.kotlin.jvm.gradle.plugin-2.1.0.pom"> 951 1366 <sha256 value="df8026dca84edbee58086307b72bd1cb58cc4b2324989d832e2201997e5c5ff7" origin="Generated by Gradle"/> 952 1367 </artifact> 953 1368 </component> 1369 + <component group="org.jetbrains.kotlin.jvm" name="org.jetbrains.kotlin.jvm.gradle.plugin" version="2.2.20"> 1370 + <artifact name="org.jetbrains.kotlin.jvm.gradle.plugin-2.2.20.pom"> 1371 + <sha256 value="4eb87defec3e7c2fece0e1a1ecdf22a70cdd61898262555b1d92e7c7b3f3b95d" origin="Generated by Gradle"/> 1372 + </artifact> 1373 + </component> 954 1374 <component group="org.jetbrains.kotlin.plugin.serialization" name="org.jetbrains.kotlin.plugin.serialization.gradle.plugin" version="2.1.0"> 955 1375 <artifact name="org.jetbrains.kotlin.plugin.serialization.gradle.plugin-2.1.0.pom"> 956 1376 <sha256 value="0e13653b69c937acff74f2d076f52f095855273a74fb92fa1fbabfc38ac078aa" origin="Generated by Gradle"/> 1377 + </artifact> 1378 + </component> 1379 + <component group="org.jetbrains.kotlin.plugin.serialization" name="org.jetbrains.kotlin.plugin.serialization.gradle.plugin" version="2.2.20"> 1380 + <artifact name="org.jetbrains.kotlin.plugin.serialization.gradle.plugin-2.2.20.pom"> 1381 + <sha256 value="80aa32a61137d505c44bb1e135d9289593a6f944cec8083ab595c071debac5d8" origin="Generated by Gradle"/> 957 1382 </artifact> 958 1383 </component> 959 1384 <component group="org.jetbrains.kotlinx" name="atomicfu" version="0.23.1"> ··· 964 1389 <sha256 value="7db8660ebe4b91bb478edb3616c4e3a50ba59c07dca517d1e1284c03fe86ac57" origin="Generated by Gradle"/> 965 1390 </artifact> 966 1391 </component> 1392 + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-bom" version="1.8.0"> 1393 + <artifact name="kotlinx-coroutines-bom-1.8.0.pom"> 1394 + <sha256 value="1239e9dbe1397cd5971342956b2511bc3ace7b641842e4372a088dcfa8b9ad55" origin="Generated by Gradle"/> 1395 + </artifact> 1396 + </component> 967 1397 <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-bom" version="1.9.0"> 968 1398 <artifact name="kotlinx-coroutines-bom-1.9.0.pom"> 969 1399 <sha256 value="bea5511e9001f2c593ab5080df131b219ab5e2085cc5979ce583eacd4946fd78" origin="Generated by Gradle"/> ··· 983 1413 </artifact> 984 1414 <artifact name="kotlinx-coroutines-core-jvm-1.6.4.module"> 985 1415 <sha256 value="0d94c8a41483e7c2707ebd693e1b1357a84152998ce85550ebbc54ca4321a3a7" origin="Generated by Gradle"/> 1416 + </artifact> 1417 + </component> 1418 + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core-jvm" version="1.8.0"> 1419 + <artifact name="kotlinx-coroutines-core-jvm-1.8.0.jar"> 1420 + <sha256 value="9860906a1937490bf5f3b06d2f0e10ef451e65b95b269f22daf68a3d1f5065c5" origin="Generated by Gradle"/> 1421 + </artifact> 1422 + <artifact name="kotlinx-coroutines-core-jvm-1.8.0.module"> 1423 + <sha256 value="ff6a22da40040938751db0ae21177e76517dbf126a76796f5426727bf76c1228" origin="Generated by Gradle"/> 986 1424 </artifact> 987 1425 </component> 988 1426 <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core-jvm" version="1.9.0">
+3 -3
src/main/java/app/StarRodMain.java
··· 469 469 break; 470 470 } 471 471 472 - Map map = Map.loadMap(mapAsset); 472 + Map map = Map.loadMap(mapAsset.getFile()); 473 473 try { 474 474 if (args[i].equalsIgnoreCase("-CompileMap")) { 475 475 new GeometryCompiler(map); ··· 503 503 File buildDir = AssetManager.getMapBuildDir(); 504 504 for (AssetHandle ah : AssetManager.getMapSources()) { 505 505 // get existing compiled binaries 506 - String mapName = Map.deriveName(ah); 506 + String mapName = Map.deriveName(ah.getFile()); 507 507 File binShape = new File(buildDir, mapName + "_shape.bin"); 508 508 File binHit = new File(buildDir, mapName + "_hit.bin"); 509 509 ··· 516 516 } 517 517 518 518 try { 519 - Map map = Map.loadMap(ah); 519 + Map map = Map.loadMap(ah.getFile()); 520 520 if (buildShape) { 521 521 new GeometryCompiler(map); 522 522 }
+1 -1
src/main/java/app/pane/explorer/AssetItem.java
··· 15 15 16 16 AssetItem(Tab explorer, AssetHandle asset) 17 17 { 18 - super(explorer, asset.getAssetName(), ThemedIcon.PACKAGE_24, false); 18 + super(explorer, asset.getName(), ThemedIcon.PACKAGE_24, false); 19 19 this.asset = asset; 20 20 21 21 new SwingWorker<Image, Void>() {
+1 -1
src/main/java/app/pane/explorer/DirectoryItem.java
··· 56 56 57 57 File targetDir = new File(AssetManager.getTopLevelAssetDir(), targetPath); 58 58 targetDir.mkdirs(); 59 - boolean ok = asset.moveAsset(targetDir); 59 + boolean ok = asset.move(targetDir); 60 60 dtde.dropComplete(ok); 61 61 62 62 if (!ok) {
+4 -5
src/main/java/app/pane/explorer/Item.java
··· 41 41 42 42 import app.SwingUtils; 43 43 import assets.AssetHandle; 44 - import util.Logger; 45 44 46 45 abstract class Item extends JPanel 47 46 { ··· 183 182 if (asset == null || renameField != null) 184 183 return; 185 184 186 - String currentName = asset.getAssetName(); 185 + String currentName = asset.getName(); 187 186 188 187 Insets ins = getInsets(); 189 188 int x = ins.left; ··· 232 231 || newName.contains("/") || newName.contains("\\")) 233 232 return; 234 233 235 - if (!asset.renameAsset(newName)) { 234 + if (!asset.rename(newName)) { 236 235 SwingUtils.getErrorDialog() 237 236 .setTitle("Rename Failed") 238 237 .setMessage("Could not rename " + currentName + " to " + newName + ".") ··· 270 269 if (asset == null) 271 270 return; 272 271 273 - String assetName = asset.getAssetName(); 272 + String assetName = asset.getName(); 274 273 int result = SwingUtils.getConfirmDialog() 275 274 .setTitle("Delete") 276 275 .setMessage("Delete " + assetName + "?") ··· 280 279 if (result != JOptionPane.YES_OPTION) 281 280 return; 282 281 283 - if (!asset.deleteAsset()) { 282 + if (!asset.delete()) { 284 283 SwingUtils.getErrorDialog() 285 284 .setTitle("Delete Failed") 286 285 .setMessage("Could not delete " + assetName + ".")
+2 -2
src/main/java/app/pane/explorer/Tab.java
··· 217 217 dtde.acceptDrop(DnDConstants.ACTION_MOVE); 218 218 var asset = (AssetHandle) dtde.getTransferable().getTransferData(AssetHandle.FLAVOUR); 219 219 220 - if (asset.assetPath.startsWith(targetPath) && !asset.assetPath.substring(targetPath.length()).contains("/")) { 220 + if (asset.getRelativePath().toString().startsWith(targetPath) && !asset.getRelativePath().toString().substring(targetPath.length()).contains("/")) { 221 221 dtde.dropComplete(false); 222 222 return; 223 223 } 224 224 225 225 File targetDir = new File(AssetManager.getTopLevelAssetDir(), targetPath); 226 226 targetDir.mkdirs(); 227 - boolean ok = asset.moveAsset(targetDir); 227 + boolean ok = asset.move(targetDir); 228 228 dtde.dropComplete(ok); 229 229 230 230 if (!ok) {
-179
src/main/java/assets/AssetHandle.java
··· 1 - package assets; 2 - 3 - import java.awt.Graphics2D; 4 - import java.awt.Image; 5 - import java.awt.RenderingHints; 6 - import java.awt.datatransfer.DataFlavor; 7 - import java.awt.image.BaseMultiResolutionImage; 8 - import java.awt.image.BufferedImage; 9 - import java.io.File; 10 - import java.io.IOException; 11 - import java.nio.file.Files; 12 - 13 - import org.apache.commons.io.FileUtils; 14 - 15 - import assets.ui.BackgroundAsset; 16 - import assets.ui.MapAsset; 17 - import assets.ui.TexturesAsset; 18 - 19 - public class AssetHandle extends File 20 - { 21 - public static final int THUMBNAIL_WIDTH = 74; 22 - public static final int THUMBNAIL_HEIGHT = 60; 23 - 24 - public static final DataFlavor FLAVOUR; 25 - static { 26 - try { 27 - FLAVOUR = new DataFlavor( 28 - DataFlavor.javaJVMLocalObjectMimeType + ";class=\"" + AssetHandle.class.getName() + "\""); 29 - } 30 - catch (ClassNotFoundException e) { 31 - throw new RuntimeException(e); 32 - } 33 - } 34 - 35 - public final File assetDir; 36 - public final String assetPath; // relative path from assetDir 37 - 38 - private Image cachedThumbnail; 39 - private boolean thumbnailLoaded; 40 - 41 - public AssetHandle(AssetHandle other) 42 - { 43 - this(other.assetDir, other.assetPath); 44 - } 45 - 46 - public AssetHandle(File assetDir, String path) 47 - { 48 - super(assetDir, path); 49 - 50 - this.assetDir = assetDir; 51 - assetPath = path.replaceAll("\\\\", "/"); // resolve all paths with '/' as separator 52 - } 53 - 54 - public String getAssetName() 55 - { 56 - String name = getName(); 57 - int dot = name.lastIndexOf('.'); 58 - return dot > 0 ? name.substring(0, dot) : name; 59 - } 60 - 61 - public String getAssetDescription() 62 - { 63 - return null; 64 - } 65 - 66 - /** Deletes this asset from disk. */ 67 - public boolean deleteAsset() 68 - { 69 - return FileUtils.deleteQuietly(this); 70 - } 71 - 72 - /** Renames this asset within its current directory. */ 73 - public boolean renameAsset(String newAssetName) 74 - { 75 - // Preserve file extension 76 - String oldName = getName(); 77 - int dot = oldName.lastIndexOf('.'); 78 - if (dot > 0) 79 - newAssetName += oldName.substring(dot); 80 - 81 - File newFile = new File(getParentFile(), newAssetName); 82 - if (newFile.exists()) 83 - return false; 84 - try { 85 - Files.move(toPath(), newFile.toPath()); 86 - return true; 87 - } 88 - catch (IOException e) { 89 - return false; 90 - } 91 - } 92 - 93 - /** Moves this asset to a different directory. */ 94 - public boolean moveAsset(File targetDir) 95 - { 96 - File targetFile = new File(targetDir, getName()); 97 - if (targetFile.exists()) 98 - return false; 99 - try { 100 - Files.move(toPath(), targetFile.toPath()); 101 - return true; 102 - } 103 - catch (IOException e) { 104 - return false; 105 - } 106 - } 107 - 108 - /** Whether to paint a checkerboard behind the thumbnail for transparency. */ 109 - public boolean thumbnailHasCheckerboard() 110 - { 111 - return true; 112 - } 113 - 114 - /** Override in subclasses to provide a high-resolution thumbnail image. */ 115 - protected Image loadThumbnail() 116 - { 117 - return null; 118 - } 119 - 120 - /** Returns a cached multi-resolution thumbnail, downsized from loadThumbnail. */ 121 - public final Image getThumbnail() 122 - { 123 - if (!thumbnailLoaded) { 124 - thumbnailLoaded = true; 125 - Image raw = loadThumbnail(); 126 - if (raw != null) 127 - cachedThumbnail = createMultiResThumbnail(raw); 128 - } 129 - return cachedThumbnail; 130 - } 131 - 132 - private static Image createMultiResThumbnail(Image src) 133 - { 134 - var img1x = resizeImage(src, THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT); 135 - var img2x = resizeImage(src, THUMBNAIL_WIDTH * 2, THUMBNAIL_HEIGHT * 2); 136 - return new BaseMultiResolutionImage(img1x, img2x); 137 - } 138 - 139 - private static BufferedImage resizeImage(Image src, int maxW, int maxH) 140 - { 141 - int srcW = src.getWidth(null); 142 - int srcH = src.getHeight(null); 143 - 144 - int dstW, dstH; 145 - boolean scalingUp = srcW <= maxW && srcH <= maxH; 146 - if (scalingUp) { 147 - // Integer scaling with nearest neighbour 148 - int scale = Math.max(1, Math.min(maxW / srcW, maxH / srcH)); 149 - dstW = srcW * scale; 150 - dstH = srcH * scale; 151 - } 152 - else { 153 - // Fit within bounds, preserving aspect ratio 154 - float ratio = Math.min((float) maxW / srcW, (float) maxH / srcH); 155 - dstW = Math.max(1, Math.round(srcW * ratio)); 156 - dstH = Math.max(1, Math.round(srcH * ratio)); 157 - } 158 - 159 - var bi = new BufferedImage(dstW, dstH, BufferedImage.TYPE_INT_ARGB); 160 - Graphics2D g = bi.createGraphics(); 161 - g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 162 - scalingUp ? RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR 163 - : RenderingHints.VALUE_INTERPOLATION_BILINEAR); 164 - g.drawImage(src, 0, 0, dstW, dstH, null); 165 - g.dispose(); 166 - assert bi.getWidth() <= maxW && bi.getHeight() <= maxH; 167 - return bi; 168 - } 169 - 170 - /** Upgrades a plain AssetHandle to a typed subclass based on file extension. */ 171 - public static AssetHandle upgrade(AssetHandle handle) 172 - { 173 - String name = handle.getName(); 174 - if (name.endsWith(".xml")) return new MapAsset(handle); 175 - if (name.endsWith(".png")) return new BackgroundAsset(handle); 176 - if (name.endsWith(".json")) return new TexturesAsset(handle); 177 - return null; 178 - } 179 - }
+163
src/main/java/assets/AssetHandle.kt
··· 1 + package assets 2 + 3 + import assets.ui.BackgroundAsset 4 + import assets.ui.MapAsset 5 + import assets.ui.TexturesAsset 6 + import org.apache.commons.io.FileUtils 7 + import java.awt.Image 8 + import java.awt.RenderingHints 9 + import java.awt.datatransfer.DataFlavor 10 + import java.awt.image.BaseMultiResolutionImage 11 + import java.awt.image.BufferedImage 12 + import java.io.File 13 + import java.nio.file.Path 14 + import kotlin.io.path.* 15 + 16 + /** An asset on disk, but not yet loaded because it may be expensive to load. */ 17 + open class AssetHandle( 18 + val root: Path, 19 + var relativePath: Path, 20 + ) { 21 + init { 22 + require(relativePath.isAbsolute.not()) { 23 + "path must be relative: $relativePath" 24 + } 25 + } 26 + 27 + constructor(root: Path, relativePath: String) : this(root, Path(relativePath)) 28 + constructor(root: File, relativePath: String) : this(root.toPath(), relativePath) 29 + constructor(other: AssetHandle) : this(other.root, other.relativePath) 30 + 31 + /** Full path on disk. May be a directory. */ 32 + var path: Path 33 + get() = root / relativePath 34 + protected set(value) { 35 + require(value.startsWith(root)) { "path must be within root: $value" } 36 + relativePath = root.relativize(value) 37 + } 38 + 39 + val name: String get() = relativePath.nameWithoutExtension 40 + 41 + private var cachedThumbnail: Image? = null 42 + private var thumbnailLoaded = false 43 + 44 + fun getFile(): File = path.toFile() 45 + 46 + fun exists(): Boolean = path.exists() 47 + 48 + fun lastModified(): Long = path.getLastModifiedTime().toMillis() 49 + 50 + open fun getAssetDescription(): String? = null 51 + 52 + /** Deletes this asset from disk. */ 53 + open fun delete(): Boolean = FileUtils.deleteQuietly(path.toFile()) 54 + 55 + /** Renames this asset within its current directory. */ 56 + open fun rename(newAssetName: String): Boolean { 57 + // Preserve file extension 58 + var finalName = newAssetName 59 + val oldName = path.name 60 + val dot = oldName.lastIndexOf('.') 61 + if (dot > 0) 62 + finalName += oldName.substring(dot) 63 + 64 + val newPath = path.parent?.resolve(finalName) ?: return false 65 + if (newPath.exists()) 66 + return false 67 + 68 + return runCatching { 69 + path = path.moveTo(newPath) 70 + true 71 + }.getOrDefault(false) 72 + } 73 + 74 + /** Moves this asset to a different directory. */ 75 + open fun move(targetDir: File): Boolean { 76 + val targetPath = targetDir.toPath().resolve(path.name) 77 + if (targetPath.exists()) 78 + return false 79 + 80 + return runCatching { 81 + path = path.moveTo(targetPath) 82 + true 83 + }.getOrDefault(false) 84 + } 85 + 86 + /** Whether to paint a checkerboard behind the thumbnail for transparency. */ 87 + open fun thumbnailHasCheckerboard(): Boolean = true 88 + 89 + /** Override in subclasses to provide a high-resolution thumbnail image. */ 90 + protected open fun loadThumbnail(): Image? = null 91 + 92 + /** Returns a cached multi-resolution thumbnail, downsized from loadThumbnail. */ 93 + fun getThumbnail(): Image? { 94 + if (!thumbnailLoaded) { 95 + thumbnailLoaded = true 96 + val raw = loadThumbnail() 97 + if (raw != null) 98 + cachedThumbnail = createMultiResThumbnail(raw) 99 + } 100 + return cachedThumbnail 101 + } 102 + 103 + override fun toString(): String = "AssetHandle($root / $relativePath})" 104 + 105 + companion object { 106 + const val THUMBNAIL_WIDTH = 74 107 + const val THUMBNAIL_HEIGHT = 60 108 + 109 + @JvmField 110 + val FLAVOUR: DataFlavor = DataFlavor( 111 + DataFlavor.javaJVMLocalObjectMimeType + ";class=\"${AssetHandle::class.java.name}\"" 112 + ) 113 + 114 + private fun createMultiResThumbnail(src: Image): Image { 115 + val img1x = resizeImage(src, THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT) 116 + val img2x = resizeImage(src, THUMBNAIL_WIDTH * 2, THUMBNAIL_HEIGHT * 2) 117 + return BaseMultiResolutionImage(img1x, img2x) 118 + } 119 + 120 + private fun resizeImage(src: Image, maxW: Int, maxH: Int): BufferedImage { 121 + val srcW = src.getWidth(null) 122 + val srcH = src.getHeight(null) 123 + 124 + val scalingUp = srcW <= maxW && srcH <= maxH 125 + val (dstW, dstH) = if (scalingUp) { 126 + // Integer scaling with nearest neighbour 127 + val scale = maxOf(1, minOf(maxW / srcW, maxH / srcH)) 128 + srcW * scale to srcH * scale 129 + } else { 130 + // Fit within bounds, preserving aspect ratio 131 + val ratio = minOf(maxW.toFloat() / srcW, maxH.toFloat() / srcH) 132 + maxOf(1, (srcW * ratio).toInt()) to maxOf(1, (srcH * ratio).toInt()) 133 + } 134 + 135 + val bi = BufferedImage(dstW, dstH, BufferedImage.TYPE_INT_ARGB) 136 + val g = bi.createGraphics() 137 + g.setRenderingHint( 138 + RenderingHints.KEY_INTERPOLATION, 139 + if (scalingUp) RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR 140 + else RenderingHints.VALUE_INTERPOLATION_BILINEAR 141 + ) 142 + g.drawImage(src, 0, 0, dstW, dstH, null) 143 + g.dispose() 144 + assert(bi.width <= maxW && bi.height <= maxH) 145 + return bi 146 + } 147 + 148 + /** Upgrades a plain AssetHandle to a typed subclass based on file extension. */ 149 + @JvmStatic 150 + fun upgrade(handle: AssetHandle): AssetHandle? { 151 + val name = handle.path.name 152 + return when { 153 + name.endsWith(".xml") -> MapAsset(handle) 154 + name.endsWith(".png") -> BackgroundAsset(handle) 155 + name.endsWith(".json") -> TexturesAsset(handle) 156 + else -> null 157 + } 158 + } 159 + } 160 + } 161 + 162 + /** Exception thrown when an AssetHandle is created for a non-existent path. */ 163 + class AssetMissingException(message: String) : IllegalArgumentException(message)
+2 -2
src/main/java/assets/AssetManager.java
··· 49 49 50 50 public static AssetHandle getTopLevel(AssetHandle source) 51 51 { 52 - return new AssetHandle(getTopLevelAssetDir(), source.assetPath); 52 + return new AssetHandle(getTopLevelAssetDir(), source.getRelativePath().toString()); 53 53 } 54 54 55 55 public static AssetHandle getBase(AssetSubdir subdir, String path) ··· 64 64 public static void deleteAll(AssetHandle asset) 65 65 { 66 66 for (File assetDir : Environment.assetDirectories) { 67 - File f = new File(assetDir, asset.assetPath); 67 + File f = new File(assetDir, asset.getRelativePath().toString()); 68 68 if (f.exists()) 69 69 FileUtils.deleteQuietly(f); 70 70 }
+8 -8
src/main/java/assets/AssetSubdir.java
··· 5 5 public enum AssetSubdir 6 6 { 7 7 // @formatter:off 8 - MAPFS ( "/mapfs/"), 8 + MAPFS ( "mapfs/"), 9 9 MAP_GEOM (MAPFS, "/geom/"), 10 10 MAP_TEX (MAPFS, "/tex/"), 11 11 MAP_BG (MAPFS, "/bg/"), 12 12 13 - ENTITY ( "/entity/"), 13 + ENTITY ( "entity/"), 14 14 15 - MSG ( "/msg/"), 15 + MSG ( "msg/"), 16 16 17 - SPRITE ( "/sprite/"), 17 + SPRITE ( "sprite/"), 18 18 PLR_SPRITE (SPRITE, "/player/"), 19 19 PLR_SPRITE_IMG (PLR_SPRITE, "/rasters/"), 20 20 PLR_SPRITE_PAL (PLR_SPRITE, "/palettes/"), 21 21 NPC_SPRITE (SPRITE, "/npc/"), 22 22 23 - CHARSET ( "/charset/"), 23 + CHARSET ( "charset/"), 24 24 STANDARD_CHARS (CHARSET, "/standard/"), 25 25 STANDARD_CHARS_PAL (STANDARD_CHARS, "/palette/"), 26 26 TITLE_CHARS (CHARSET, "/title/"), 27 27 SUBTITLE_CHARS (CHARSET, "/subtitle/"), 28 28 29 - UI ( "/ui/"), 29 + UI ( "ui/"), 30 30 UI_MSG (UI, "/msg/"), 31 31 UI_PAUSE (UI, "/pause/"), 32 32 33 - PAUSE ( "/pause/"), 33 + PAUSE ( "pause/"), 34 34 35 - ICON ( "/icon/"); 35 + ICON ( "icon/"); 36 36 // @formatter:on 37 37 38 38 private final String path;
+2 -2
src/main/java/assets/ExpectedAsset.java
··· 40 40 public File getFile() 41 41 { 42 42 if (useBase) { 43 - return AssetManager.getBase(subdir, path); 43 + return AssetManager.getBase(subdir, path).getFile(); 44 44 } 45 45 else { 46 - return AssetManager.get(subdir, path); 46 + return AssetManager.get(subdir, path).getFile(); 47 47 } 48 48 } 49 49
+1 -3
src/main/java/assets/ui/AssetCellRenderer.java
··· 47 47 } 48 48 49 49 if (asset != null) { 50 - String assetDirName = asset.assetDir.getName(); 51 - String mapFileName = FilenameUtils.getBaseName(asset.assetPath); 52 - nameLabel.setText(assetDirName + " / " + mapFileName); 50 + nameLabel.setText(asset.getName()); 53 51 nameLabel.setForeground(null); 54 52 } 55 53 else {
+1 -1
src/main/java/assets/ui/BackgroundAsset.java
··· 17 17 super(asset); 18 18 19 19 try { 20 - bimg = ImageIO.read(asset); 20 + bimg = ImageIO.read(asset.getFile()); 21 21 } 22 22 catch (IOException e) { 23 23 bimg = null;
+1 -3
src/main/java/assets/ui/BackgroundAssetCellRenderer.java
··· 49 49 } 50 50 51 51 if (bg != null) { 52 - String assetDirName = bg.assetDir.getName(); 53 - String mapFileName = FilenameUtils.getBaseName(bg.assetPath); 54 - nameLabel.setText(assetDirName + " / " + mapFileName); 52 + nameLabel.setText(bg.getName()); 55 53 previewPanel.setImage(bg.bimg); 56 54 } 57 55 else {
+12 -18
src/main/java/assets/ui/MapAsset.java
··· 16 16 import app.Environment; 17 17 import assets.AssetHandle; 18 18 import assets.AssetManager; 19 - import game.map.Map; 20 19 import game.map.editor.MapEditor; 21 20 import util.Logger; 22 21 import util.Priority; ··· 48 47 super(asset); 49 48 50 49 // need to read Map tag quickly, do not parse whole XML file 51 - try (BufferedReader in = new BufferedReader(new FileReader(asset))) { 50 + try (BufferedReader in = new BufferedReader(new FileReader(asset.getFile()))) { 52 51 String line; 53 52 54 53 while (true) { ··· 72 71 Logger.logError(e.getMessage()); 73 72 desc = "READ ERROR"; 74 73 } 75 - } 76 - 77 - @Override 78 - public String getAssetName() { 79 - return Map.deriveName(this); 80 74 } 81 75 82 76 @Override ··· 85 79 } 86 80 87 81 @Override 88 - public boolean deleteAsset() 82 + public boolean delete() 89 83 { 90 - File thumbFile = new File(PROJ_THUMBNAIL + assetPath + ".png"); 84 + File thumbFile = new File(PROJ_THUMBNAIL + getRelativePath().toString() + ".png"); 91 85 if (thumbFile.exists()) 92 86 thumbFile.delete(); 93 - return super.deleteAsset(); 87 + return super.delete(); 94 88 } 95 89 96 90 @Override 97 - public boolean renameAsset(String newFileName) 91 + public boolean rename(String newFileName) 98 92 { 99 - File oldThumb = new File(PROJ_THUMBNAIL + assetPath + ".png"); 93 + File oldThumb = new File(PROJ_THUMBNAIL + getRelativePath().toString() + ".png"); 100 94 if (oldThumb.exists()) { 101 95 try { 102 - String newAssetPath = assetPath.substring(0, assetPath.lastIndexOf('/') + 1) + newFileName; 96 + String newAssetPath = getRelativePath().toString().substring(0, getRelativePath().toString().lastIndexOf('/') + 1) + newFileName; 103 97 File newThumb = new File(PROJ_THUMBNAIL + newAssetPath + ".png"); 104 98 newThumb.getParentFile().mkdirs(); 105 99 Files.move(oldThumb.toPath(), newThumb.toPath()); ··· 108 102 return false; 109 103 } 110 104 } 111 - return super.renameAsset(newFileName); 105 + return super.rename(newFileName); 112 106 } 113 107 114 108 @Override ··· 119 113 @Override 120 114 protected Image loadThumbnail() 121 115 { 122 - File thumbFile = new File(PROJ_THUMBNAIL + assetPath + ".png"); 116 + File thumbFile = new File(PROJ_THUMBNAIL + getRelativePath().toString() + ".png"); 123 117 if (thumbFile.exists()) { 124 118 try { 125 119 return ImageIO.read(thumbFile); ··· 140 134 141 135 try { 142 136 for (AssetHandle asset : AssetManager.getMapSources()) { 143 - File thumbFile = new File(PROJ_THUMBNAIL + asset.assetPath + ".png"); 137 + File thumbFile = new File(PROJ_THUMBNAIL + asset.getRelativePath().toString() + ".png"); 144 138 if (thumbFile.exists()) 145 139 continue; 146 - Logger.log("Capturing thumbnail for " + asset.assetPath + "...", Priority.MILESTONE); 140 + Logger.log("Capturing thumbnail for " + asset.getRelativePath().toString() + "...", Priority.MILESTONE); 147 141 if (editor == null) 148 142 editor = new MapEditor(false); 149 - editor.generateThumbnail(asset, thumbFile, THUMBNAIL_WIDTH * 2, THUMBNAIL_HEIGHT * 2); 143 + editor.generateThumbnail(asset.getFile(), thumbFile, AssetHandle.THUMBNAIL_WIDTH * 2, AssetHandle.THUMBNAIL_HEIGHT * 2); 150 144 } 151 145 } 152 146 catch (Exception e) {
+1 -3
src/main/java/assets/ui/MapAssetCellRenderer.java
··· 49 49 } 50 50 51 51 if (map != null) { 52 - String assetDirName = map.assetDir.getName(); 53 - String mapFileName = FilenameUtils.getBaseName(map.assetPath); 54 - nameLabel.setText(assetDirName + " / " + mapFileName); 52 + nameLabel.setText(map.getName()); 55 53 56 54 String s = map.desc.toString(); 57 55 int maxChars = 32;
+4 -4
src/main/java/assets/ui/SelectBackgroundDialog.java
··· 71 71 listModel.addElement(null); 72 72 for (AssetHandle ah : assets) { 73 73 // ignore .alt background 74 - if (ah.assetPath.endsWith("_bg.png")) { 74 + if (ah.getRelativePath().toString().endsWith("_bg.png")) { 75 75 listModel.addElement(new BackgroundAsset(ah)); 76 76 } 77 77 } ··· 167 167 } 168 168 } 169 169 else if (bg != null) { 170 - if (initialSelection.equals(FilenameUtils.getBaseName(bg.assetPath))) { 170 + if (initialSelection.equals(FilenameUtils.getBaseName(bg.getRelativePath().toString()))) { 171 171 list.setSelectedValue(bg, true); 172 172 break; 173 173 } ··· 183 183 { 184 184 filteredListModel.setFilter(element -> { 185 185 BackgroundAsset bg = (BackgroundAsset) element; 186 - String bgName = bg.assetPath.toUpperCase(); 186 + String bgName = bg.getRelativePath().toString().toUpperCase(); 187 187 String filterText = filterTextField.getText().toUpperCase(); 188 188 189 189 return bgName.contains(filterText); ··· 197 197 198 198 private File getSelectedFile() 199 199 { 200 - return selectedObject; 200 + return selectedObject.getFile(); 201 201 } 202 202 }
+3 -3
src/main/java/assets/ui/SelectMapDialog.java
··· 62 62 63 63 switch (chooser.result) { 64 64 case DUPLICATE: 65 - newMapFile = promptCopyMap(selectedFile); 65 + newMapFile = promptCopyMap(selectedFile.getFile()); 66 66 if (newMapFile == null) { 67 67 chooser.result = SelectMapResult.CANCEL; 68 68 } ··· 74 74 } 75 75 return newMapFile; 76 76 case OPEN: 77 - return selectedFile; 77 + return selectedFile.getFile(); 78 78 case CANCEL: 79 79 break; 80 80 } ··· 305 305 { 306 306 filteredListModel.setFilter(element -> { 307 307 MapAsset map = (MapAsset) element; 308 - String mapName = map.assetPath.toUpperCase(); 308 + String mapName = map.getRelativePath().toString().toUpperCase(); 309 309 String mapDesc = map.desc.toUpperCase(); 310 310 String filterText = filterTextField.getText().toUpperCase(); 311 311
+3 -3
src/main/java/assets/ui/SelectTexDialog.java
··· 179 179 } 180 180 } 181 181 else if (tex != null) { 182 - if (initialSelection.equals(FilenameUtils.getBaseName(tex.assetPath))) { 182 + if (initialSelection.equals(FilenameUtils.getBaseName(tex.getRelativePath().toString()))) { 183 183 list.setSelectedValue(tex, true); 184 184 break; 185 185 } ··· 195 195 { 196 196 filteredListModel.setFilter(element -> { 197 197 TexturesAsset bg = (TexturesAsset) element; 198 - String bgName = bg.assetPath.toUpperCase(); 198 + String bgName = bg.getRelativePath().toString().toUpperCase(); 199 199 String filterText = filterTextField.getText().toUpperCase(); 200 200 201 201 return bgName.contains(filterText); ··· 209 209 210 210 private File getSelectedFile() 211 211 { 212 - return selectedObject; 212 + return selectedObject.getFile(); 213 213 } 214 214 }
+2 -3
src/main/java/assets/ui/TexArchiveAssetCellRenderer.java
··· 56 56 } 57 57 58 58 if (bg != null) { 59 - String assetDirName = bg.assetDir.getName(); 60 - String mapFileName = FilenameUtils.getBaseName(bg.assetPath); 61 - nameLabel.setText(assetDirName + " / " + mapFileName); 59 + String mapFileName = FilenameUtils.getBaseName(bg.getRelativePath().toString()); 60 + nameLabel.setText(mapFileName); 62 61 nameLabel.setForeground(null); 63 62 previewPanel1.setImage(bg.getPreview(0)); 64 63 previewPanel2.setImage(bg.getPreview(1));
+8 -8
src/main/java/assets/ui/TexturesAsset.java
··· 41 41 super(asset); 42 42 43 43 String dirName = FilenameUtils.getBaseName(asset.getName()) + "/"; 44 - File dir = new File(asset.assetDir, AssetSubdir.MAP_TEX + dirName); 44 + File dir = new File(asset.getRoot().toFile(), AssetSubdir.MAP_TEX + dirName); 45 45 46 46 try { 47 47 List<File> images = new ArrayList<>(); ··· 69 69 private File getCompanionDir() 70 70 { 71 71 String dirName = FilenameUtils.getBaseName(getName()) + "/"; 72 - File dir = new File(assetDir, AssetSubdir.MAP_TEX + dirName); 72 + File dir = new File(getRoot().toFile(), AssetSubdir.MAP_TEX + dirName); 73 73 return dir.isDirectory() ? dir : null; 74 74 } 75 75 76 76 @Override 77 - public boolean deleteAsset() 77 + public boolean delete() 78 78 { 79 79 File dir = getCompanionDir(); 80 80 if (dir != null) 81 81 FileUtils.deleteQuietly(dir); 82 - return super.deleteAsset(); 82 + return super.delete(); 83 83 } 84 84 85 85 @Override 86 - public boolean renameAsset(String newFileName) 86 + public boolean rename(String newFileName) 87 87 { 88 88 File dir = getCompanionDir(); 89 89 if (dir != null) { ··· 96 96 return false; 97 97 } 98 98 } 99 - return super.renameAsset(newFileName); 99 + return super.rename(newFileName); 100 100 } 101 101 102 102 @Override 103 - public boolean moveAsset(File targetDir) 103 + public boolean move(File targetDir) 104 104 { 105 105 File dir = getCompanionDir(); 106 106 if (dir != null) { ··· 111 111 return false; 112 112 } 113 113 } 114 - return super.moveAsset(targetDir); 114 + return super.move(targetDir); 115 115 } 116 116 117 117 @Override
+1 -1
src/main/java/game/SimpleItem.java
··· 38 38 Tile tile = null; 39 39 40 40 try { 41 - tile = Tile.load(ah, TileFormat.CI_4); 41 + tile = Tile.load(ah.getFile(), TileFormat.CI_4); 42 42 } 43 43 catch (IOException e) { 44 44 Logger.logfWarning("Exception while loading icon: %s%n%s", name, e.getMessage());
+2 -2
src/main/java/game/globals/IconRecord.java
··· 37 37 38 38 public IconRecord(AssetHandle source) throws IOException 39 39 { 40 - String base = FilenameUtils.removeExtension(source.assetPath); 40 + String base = FilenameUtils.removeExtension(source.getRelativePath().toString()); 41 41 name = base.substring("/icon/".length()); 42 42 exists = source.exists(); 43 43 44 44 if (exists) { 45 - BufferedImage bimg = ImageIO.read(source); 45 + BufferedImage bimg = ImageIO.read(source.getFile()); 46 46 fullsize = bimg; 47 47 48 48 if (bimg.getWidth() > 32 || bimg.getHeight() > 32)
+1 -1
src/main/java/game/globals/editor/GlobalsData.java
··· 66 66 { 67 67 icons.clear(); 68 68 try { 69 - File xmlFile = AssetManager.get(AssetSubdir.ICON, "Icons.xml"); 69 + File xmlFile = AssetManager.get(AssetSubdir.ICON, "Icons.xml").getFile(); 70 70 icons.addAll(IconRecord.readXML(xmlFile)); 71 71 /* 72 72 for(AssetHandle ah : AssetManager.getIcons()) {
+5 -5
src/main/java/game/map/editor/MapEditor.java
··· 1003 1003 AssetHandle ah = AssetManager.getMap(lastMapName); 1004 1004 if (ah.exists()) { 1005 1005 options = new String[] { "Browse Maps", "Reopen " + lastMapName }; 1006 - lastMap = ah; 1006 + lastMap = ah.getFile(); 1007 1007 } 1008 1008 } 1009 1009 } ··· 3173 3173 3174 3174 case CHOSE_MAP: 3175 3175 changeMapState = ChangeMapState.LOADING_MAP; 3176 - destMapFile = AssetManager.getMap(destMapName); 3176 + destMapFile = AssetManager.getMap(destMapName).getFile(); 3177 3177 if (!destMapFile.exists()) { 3178 3178 changeMapState = ChangeMapState.LOADING_FAILED; 3179 3179 break; ··· 3823 3823 try { 3824 3824 if (map.hasBackground) { 3825 3825 Logger.log("Map background is " + map.bgName); 3826 - map.bgImage = ImageIO.read(AssetManager.getBackground(map.bgName)); 3826 + map.bgImage = ImageIO.read(AssetManager.getBackground(map.bgName).getFile()); 3827 3827 map.glBackgroundTexID = TextureManager.bindBufferedImage(map.bgImage); 3828 3828 } 3829 3829 else ··· 3998 3998 Logger.logError("Couldn't find map: " + overrideName + Directories.EXT_MAP); 3999 3999 return; 4000 4000 } 4001 - shapeOverride = Map.loadMap(ah); 4001 + shapeOverride = Map.loadMap(ah.getFile()); 4002 4002 TextureManager.assignModelTextures(shapeOverride); 4003 4003 Logger.log("Loaded override geometry: " + shapeOverride.getName()); 4004 4004 } ··· 4019 4019 Logger.logError("Couldn't find map: " + overrideName + Directories.EXT_MAP); 4020 4020 return; 4021 4021 } 4022 - hitOverride = Map.loadMap(ah); 4022 + hitOverride = Map.loadMap(ah.getFile()); 4023 4023 Logger.log("Loaded override collision: " + hitOverride.getName()); 4024 4024 } 4025 4025 }
+2 -2
src/main/java/game/map/editor/render/TextureManager.java
··· 141 141 if (!ah.exists()) 142 142 return false; 143 143 if (FilenameUtils.getExtension(ah.getName()).equals(Directories.EXT_OLD_TEX)) { 144 - ta = TextureArchive.loadLegacy(ah); 144 + ta = TextureArchive.loadLegacy(ah.getFile()); 145 145 } 146 146 else { 147 - ta = TextureArchive.load(ah); 147 + ta = TextureArchive.load(ah.getFile()); 148 148 } 149 149 } 150 150 catch (IOException e) {
+1 -1
src/main/java/game/map/editor/ui/SwingGUI.java
··· 1306 1306 AssetHandle ah = AssetManager.getMap(mapName); 1307 1307 if (ah.exists()) { 1308 1308 editor.doNextFrame(() -> { 1309 - editor.action_OpenMap(ah); 1309 + editor.action_OpenMap(ah.getFile()); 1310 1310 }); 1311 1311 } 1312 1312 }
+1 -1
src/main/java/game/map/impex/ObjExporter.java
··· 34 34 35 35 public void writeModels(Iterable<Model> models, String texName) 36 36 { 37 - File textureFile = AssetManager.get(AssetSubdir.MAP_TEX, texName + "/" + texName + ".mtl"); 37 + File textureFile = AssetManager.get(AssetSubdir.MAP_TEX, texName + "/" + texName + ".mtl").getFile(); 38 38 if (textureFile.exists()) { 39 39 pw.println("mtllib " + texName); 40 40 pw.println("");
+1 -1
src/main/java/game/map/scripts/extract/Extractor.java
··· 89 89 { 90 90 Logger.log("Extracting data from " + mapName, Priority.IMPORTANT); 91 91 92 - File mapFile = AssetManager.getMap(mapName); 92 + File mapFile = AssetManager.getMap(mapName).getFile(); 93 93 if (!mapFile.exists()) { 94 94 throw new StarRodException("Couldn't find map file for " + mapName); 95 95 }
+1 -1
src/main/java/game/map/scripts/extract/StageExtractor.java
··· 71 71 if (suffix == null) 72 72 suffix = ""; 73 73 74 - File mapFile = AssetManager.getMap(baseName); 74 + File mapFile = AssetManager.getMap(baseName).getFile(); 75 75 if (!mapFile.exists()) { 76 76 Logger.logWarning("Couldn't find map file for stage: " + baseName); 77 77 return;
+2 -2
src/main/java/game/map/shading/SpriteShadingEditor.java
··· 25 25 public static void saveShadingProfiles(SpriteShadingData data) throws IOException 26 26 { 27 27 AssetHandle ah = AssetManager.get(AssetSubdir.SPRITE, FN_SPRITE_SHADING); 28 - saveShadingProfiles(ah, data); 28 + saveShadingProfiles(ah.getFile(), data); 29 29 } 30 30 31 31 private static void saveShadingProfiles(File xmlFile, SpriteShadingData data) throws IOException ··· 64 64 SpriteShadingData profileData; 65 65 66 66 try { 67 - profileData = SpriteShadingEditor.readJSON(ah); 67 + profileData = SpriteShadingEditor.readJSON(ah.getFile()); 68 68 profileData.validateNames(); 69 69 profileData.assignCustomKeys(); 70 70 Logger.logf("Loaded %d shading profiles.", profileData.listModel.getSize());
+3 -3
src/main/java/game/message/MessageBoxes.java
··· 66 66 67 67 public File getFile() 68 68 { 69 - return AssetManager.get(AssetSubdir.UI_MSG, filename + ".png"); 69 + return AssetManager.get(AssetSubdir.UI_MSG, filename + ".png").getFile(); 70 70 } 71 71 72 72 public Color[] getColors() ··· 140 140 141 141 public File getFile() 142 142 { 143 - return AssetManager.get(AssetSubdir.UI_MSG, filename + ".png"); 143 + return AssetManager.get(AssetSubdir.UI_MSG, filename + ".png").getFile(); 144 144 } 145 145 146 146 public void drawBasicQuad(float x, float y) ··· 253 253 254 254 public File getFile() 255 255 { 256 - return AssetManager.get(subdir, filename + ".png"); 256 + return AssetManager.get(subdir, filename + ".png").getFile(); 257 257 } 258 258 259 259 public void drawBasicQuad(float x, float y)
+1 -1
src/main/java/game/message/StringEncoder.java
··· 112 112 { 113 113 List<Message> messages = new ArrayList<>(); 114 114 115 - List<Line> lines = IOUtils.readPlainInputFile(group.asset); 115 + List<Line> lines = IOUtils.readPlainInputFile(group.asset.getFile()); 116 116 List<PatchUnit> units = PatchFileParser.parse(lines); 117 117 118 118 for (PatchUnit unit : units) {
+4 -4
src/main/java/game/message/editor/MessageAsset.java
··· 36 36 messages = StringEncoder.parseMessages(this); 37 37 } 38 38 catch (IOException e) { 39 - throw new InputFileException(asset, e.getMessage()); 39 + throw new InputFileException(asset.getFile(), e.getMessage()); 40 40 } 41 41 42 42 int msgIndex = 0; ··· 56 56 } 57 57 58 58 try { 59 - linesIn = IOUtils.readPlainInputFile(asset); 59 + linesIn = IOUtils.readPlainInputFile(asset.getFile()); 60 60 } 61 61 catch (IOException e) { 62 62 Logger.logError("Failed to save " + asset.getName()); ··· 101 101 102 102 AssetHandle saveAsset = AssetManager.getTopLevel(asset); 103 103 try { 104 - FileUtils.touch(saveAsset); 104 + FileUtils.touch(saveAsset.getFile()); 105 105 106 - try (PrintWriter pw = IOUtils.getBufferedPrintWriter(saveAsset)) { 106 + try (PrintWriter pw = IOUtils.getBufferedPrintWriter(saveAsset.getFile())) { 107 107 for (String line : linesOut) { 108 108 pw.println(line); 109 109 }
+2 -2
src/main/java/game/message/editor/MessageEditor.java
··· 478 478 479 479 JButton button = new JButton(); 480 480 try { 481 - button.setIcon(getButtonIcon(ah, false)); 481 + button.setIcon(getButtonIcon(ah.getFile(), false)); 482 482 if (sc.name.startsWith("~")) { 483 483 addButtonTextInsert(button, sc.name.substring(1)); 484 484 } ··· 510 510 for (int palIndex = 0; palIndex < paletteIcons.length; palIndex++) { 511 511 String imgName = String.format("%02X", palIndex) + ".png"; 512 512 try { 513 - File imgFile = AssetManager.get(AssetSubdir.STANDARD_CHARS_PAL, imgName); 513 + File imgFile = AssetManager.get(AssetSubdir.STANDARD_CHARS_PAL, imgName).getFile(); 514 514 paletteIcons[palIndex] = getButtonIcon(imgFile, false); 515 515 } 516 516 catch (IOException e) {
+2 -2
src/main/java/game/message/font/CharSet.java
··· 122 122 for (int i = 0; i < chars.numPals; i++) { 123 123 String palName = String.format("%02X", i) + ".png"; 124 124 try { 125 - File palFile = AssetManager.get(AssetSubdir.STANDARD_CHARS_PAL, palName); 125 + File palFile = AssetManager.get(AssetSubdir.STANDARD_CHARS_PAL, palName).getFile(); 126 126 Tile img = Tile.load(palFile, CI_4); 127 127 chars.palettes[i] = img.palette; 128 128 } ··· 134 134 for (int i = 0; i < chars.numChars; i++) { 135 135 String charName = String.format("%02X", i) + ".png"; 136 136 try { 137 - File imgFile = AssetManager.get(AssetSubdir.STANDARD_CHARS, charName); 137 + File imgFile = AssetManager.get(AssetSubdir.STANDARD_CHARS, charName).getFile(); 138 138 chars.images[i] = Tile.load(imgFile, CI_4); 139 139 } 140 140 catch (IOException e) {
+1 -1
src/main/java/game/sprite/ImgAsset.java
··· 27 27 public ImgAsset(AssetHandle ah) throws IOException 28 28 { 29 29 source = ah; 30 - img = Tile.load(ah, CI_4); 30 + img = Tile.load(ah.getFile(), CI_4); 31 31 preview = new ImgPreview(); 32 32 } 33 33
+2 -2
src/main/java/game/sprite/PalAsset.java
··· 33 33 public PalAsset(AssetHandle ah) throws IOException 34 34 { 35 35 source = ah; 36 - sourceImg = Tile.load(source, CI_4); 36 + sourceImg = Tile.load(source.getFile(), CI_4); 37 37 pal = sourceImg.palette; 38 38 } 39 39 ··· 46 46 public void save() throws IOException 47 47 { 48 48 source = AssetManager.getTopLevel(source); 49 - sourceImg.savePNG(source.getAbsolutePath()); 49 + sourceImg.savePNG(source.getFile().getAbsolutePath()); 50 50 } 51 51 52 52 public AssetHandle getSource()
+1 -1
src/main/java/game/sprite/Sprite.java
··· 177 177 return AssetManager.getNpcSprite(name); 178 178 } 179 179 180 - public AssetHandle getAssetDir(boolean modDir) 180 + public AssetHandle getRoot(boolean modDir) 181 181 { 182 182 AssetHandle ah; 183 183
+7 -7
src/main/java/game/sprite/SpriteLoader.java
··· 324 324 try { 325 325 AssetHandle xmlHandle = AssetManager.get(AssetSubdir.SPRITE, "npc.xml"); 326 326 if (!xmlHandle.exists()) { 327 - throw new IOException(xmlHandle.assetPath + " does not exist!"); 327 + throw new IOException(xmlHandle + " does not exist!"); 328 328 } 329 329 330 - XmlReader xmr = new XmlReader(xmlHandle); 330 + XmlReader xmr = new XmlReader(xmlHandle.getFile()); 331 331 Element rootElem = xmr.getRootElement(); 332 332 333 333 int curID = 1; ··· 343 343 continue; 344 344 } 345 345 346 - npcSpriteData.put(curID, new SpriteMetadata(curID, name, ah, false, false)); 346 + npcSpriteData.put(curID, new SpriteMetadata(curID, name, ah.getFile(), false, false)); 347 347 curID++; 348 348 } 349 349 } ··· 355 355 try { 356 356 AssetHandle xmlHandle = AssetManager.get(AssetSubdir.SPRITE, "player.xml"); 357 357 if (!xmlHandle.exists()) { 358 - throw new IOException(xmlHandle.assetPath + " does not exist!"); 358 + throw new IOException(xmlHandle + " does not exist!"); 359 359 } 360 360 361 - XmlReader xmr = new XmlReader(xmlHandle); 361 + XmlReader xmr = new XmlReader(xmlHandle.getFile()); 362 362 Element rootElem = xmr.getRootElement(); 363 363 364 364 int curID = 1; ··· 374 374 continue; 375 375 } 376 376 377 - XmlReader spriteXmr = new XmlReader(ah); 377 + XmlReader spriteXmr = new XmlReader(ah.getFile()); 378 378 Element spriteRoot = spriteXmr.getRootElement(); 379 379 380 380 boolean hasBack = false; ··· 382 382 hasBack = spriteXmr.readBoolean(spriteRoot, ATTR_SPRITE_HAS_BACK); 383 383 } 384 384 385 - playerSpriteData.put(curID, new SpriteMetadata(curID, name, ah, true, hasBack)); 385 + playerSpriteData.put(curID, new SpriteMetadata(curID, name, ah.getFile(), true, hasBack)); 386 386 curID++; 387 387 if (hasBack) { 388 388 curID++; // consume extra ID for back sprite
+1 -1
src/main/java/game/sprite/editor/PalettesTab.java
··· 152 152 153 153 File copy; 154 154 do { 155 - copy = new File(sprite.getPalettesDir(true), curName + "." + ext); 155 + copy = new File(sprite.getPalettesDir(true).getFile(), curName + "." + ext); 156 156 157 157 // form the next name to try 158 158 iter++;
+1 -1
src/main/java/game/sprite/editor/RastersTab.java
··· 89 89 90 90 File copy; 91 91 do { 92 - copy = new File(sprite.getRastersDir(true), curName + "." + ext); 92 + copy = new File(sprite.getRastersDir(true).getFile(), curName + "." + ext); 93 93 94 94 // form the next name to try 95 95 iter++;
+6 -6
src/main/java/game/sprite/editor/SpriteEditor.java
··· 1396 1396 item.addActionListener((evt) -> { 1397 1397 if (sprite != null) { 1398 1398 try { 1399 - AssetHandle ah = sprite.getAssetDir(true); 1400 - ah.mkdirs(); 1401 - Desktop.getDesktop().open(ah); 1399 + AssetHandle ah = sprite.getRoot(true); 1400 + ah.getFile().mkdirs(); 1401 + Desktop.getDesktop().open(ah.getFile()); 1402 1402 } 1403 1403 catch (IOException e) { 1404 1404 Logger.logError(e.getMessage()); ··· 1411 1411 item.addActionListener((evt) -> { 1412 1412 if (sprite != null) { 1413 1413 try { 1414 - AssetHandle ah = sprite.getAssetDir(false); 1415 - Desktop.getDesktop().open(ah); 1414 + AssetHandle ah = sprite.getRoot(false); 1415 + Desktop.getDesktop().open(ah.getFile()); 1416 1416 } 1417 1417 catch (IOException e) { 1418 1418 Logger.printStackTrace(e); ··· 1980 1980 1981 1981 sprite.reindex(); 1982 1982 1983 - try (XmlWriter xmw = new XmlWriter(ah)) { 1983 + try (XmlWriter xmw = new XmlWriter(ah.getFile())) { 1984 1984 sprite.savePalettes(); 1985 1985 sprite.toXML(xmw); 1986 1986 xmw.save();
+3 -3
src/main/java/game/texture/Texture.java
··· 311 311 312 312 AssetHandle mainAsset = AssetManager.get(AssetSubdir.MAP_TEX, texName + "/" + tx.name + ".png"); 313 313 314 - tx.main = Tile.load(mainAsset, imgFormat); 314 + tx.main = Tile.load(mainAsset.getFile(), imgFormat); 315 315 316 316 if (tx.hasAux) { 317 317 AssetHandle auxAsset = AssetManager.get(AssetSubdir.MAP_TEX, texName + "/" + tx.name + "_AUX.png"); 318 - tx.aux = Tile.load(auxAsset, auxFormat); 318 + tx.aux = Tile.load(auxAsset.getFile(), auxFormat); 319 319 } 320 320 321 321 if (tx.hasMipmaps) { ··· 330 330 331 331 String mmName = tx.name + "_MM" + (tx.mipmapList.size() + 1); 332 332 AssetHandle mmAsset = AssetManager.get(AssetSubdir.MAP_TEX, texName + "/" + mmName + ".png"); 333 - Tile mipmap = Tile.load(mmAsset, imgFormat); 333 + Tile mipmap = Tile.load(mmAsset.getFile(), imgFormat); 334 334 335 335 if (mipmap.height != mmHeight) 336 336 throw new InputFileException(source, "%s has incorrect height: %s instead of %s", mmName, mipmap.height, mmHeight);