Compare commits

...

751 Commits

Author SHA1 Message Date
minjaesong
6118f30d5f async loading (hopefully?) 2026-04-04 17:05:00 +09:00
minjaesong
981418d0c7 async loading (hopefully) 2026-04-04 01:56:40 +09:00
CuriousTorvald
3cbfb5c10f Update CodeQL workflow to exclude certain languages 2026-03-29 00:22:48 +09:00
minjaesong
1a0b754cde font update, video sprite (TAV) 2026-03-15 13:26:05 +09:00
CuriousTorvald
db3a1f9a39 Modify funding configuration in FUNDING.yml
Updated funding options to include GitHub Sponsors and a PayPal link.
2026-03-13 19:20:45 +09:00
minjaesong
247fd6195f wiki update (asset archiving, building instructions) 2026-02-28 10:53:51 +09:00
minjaesong
97d22913bf custom asset archive loading 2026-02-22 00:09:48 +09:00
minjaesong
2dea82bb9c font update 2026-02-20 11:10:38 +09:00
minjaesong
7c8baa151f asset archiving wip 2026-02-20 10:39:53 +09:00
minjaesong
04b49b8a5c asset archiving wip, font update 2026-02-19 09:57:59 +09:00
minjaesong
661d516800 buildapp update 2026-02-17 05:04:27 +09:00
minjaesong
9efb800d47 alpha blending diagnostic shaders 2026-02-13 21:03:01 +09:00
minjaesong
93c5822c7b finally fixing contradictory key press handling (left+right, up+down) 2026-02-13 19:52:14 +09:00
minjaesong
4d9252dd80 world control hint 2026-02-10 20:17:43 +09:00
minjaesong
232bc0297d copyright year update 2026-02-10 16:00:41 +09:00
minjaesong
612871eb2a fix: moving platform is dragging player into the terrain again 2026-02-09 09:46:35 +09:00
minjaesong
8bbe79acfe pushing down on moving platform will dismount 2026-02-09 03:15:11 +09:00
minjaesong
54715e41b0 fix: sinking platform taking actors with it 2026-02-09 03:06:28 +09:00
minjaesong
e91b7ceb0d player can exit from sinking platform by jumping 2026-02-09 02:54:56 +09:00
minjaesong
855e0ea12a moving platforms can 'steal' actors 2026-02-09 02:34:49 +09:00
minjaesong
5394f17686 moving platform fix: double speed gain 2026-02-09 02:25:52 +09:00
minjaesong
72aae3cffd moving platform kinda working 2026-02-08 23:54:07 +09:00
minjaesong
b5b9e22091 platform wip3 2026-02-08 20:02:39 +09:00
minjaesong
5b1d0ca049 platform surface friction 2026-02-08 03:53:10 +09:00
minjaesong
623ee14d93 platform wip2 2026-02-08 03:43:37 +09:00
minjaesong
b328b609cc watchface: 'Y' is more distinguished 2026-02-08 03:12:49 +09:00
minjaesong
ff9f02322b moving platform wip 2026-02-08 02:06:29 +09:00
minjaesong
4997353f83 wtf 2026-02-07 16:39:33 +09:00
minjaesong
068d0bf1b2 control preset to be stored into separate file 2026-02-07 16:19:42 +09:00
minjaesong
e838991826 new: #if(n)def preprocessor for Terrarum-formatted CSVs 2026-01-19 17:50:44 +09:00
minjaesong
63566a507b new: world update ahchoring 2026-01-19 17:08:31 +09:00
minjaesong
104481a7d5 fix: fixture pickup mess with quickslots and needed empty hands 2026-01-17 20:50:26 +09:00
minjaesong
a4df761359 wire sim incremental graph update (partial) 2026-01-08 23:20:24 +09:00
minjaesong
aa22fe69ff wire sim refactor 2026-01-08 19:06:20 +09:00
minjaesong
e14e689dce fix: bogoflops counter being overestimated on M4 Mac due to Math.random() reliance 2025-11-27 10:41:13 +09:00
minjaesong
767aa09a17 faster block tiling hash 2025-10-13 20:08:22 +09:00
minjaesong
99bd56317d bump AirCompressor to 2.0.2 2025-09-01 17:51:52 +09:00
minjaesong
3f6f599865 1 meter is now 25 pixels 2025-08-08 01:01:45 +09:00
minjaesong
c803ddfae8 why the hell I thought circular buffering would be better, when it makes FOUR memcpy insead of TWO 2025-07-04 06:13:04 +09:00
minjaesong
f11ea557be reverting FFT changes 2025-06-29 19:29:02 +09:00
minjaesong
3f787108b2 more small optimisation of FFT 2025-06-26 19:14:39 +09:00
minjaesong
6bdf585b49 realFFT is somehow faster while everything else stays the same? 2025-06-26 19:08:16 +09:00
minjaesong
fa56fc14bf deploying new wood textures 2025-05-18 19:33:03 +09:00
minjaesong
d922aa5d67 finished wooden texture 48 2025-05-18 15:21:14 +09:00
minjaesong
0ca5e6435c better wooden plank texture wip 2025-05-18 14:54:33 +09:00
minjaesong
3b755f52da testing new wooden plank texture 2025-05-18 13:28:56 +09:00
minjaesong
b167f20935 randomised music generator for test item 2025-05-09 20:02:20 +09:00
minjaesong
41c47a0777 minor readme update 2025-05-09 19:58:04 +09:00
minjaesong
5495e017d5 more canisters 2025-04-29 22:59:26 +09:00
minjaesong
488a214a19 TODO new fluid container system 2025-04-29 21:11:36 +09:00
minjaesong
946824f861 copyright date 2024 to 2025 2025-04-07 22:54:09 +09:00
minjaesong
dabcfe03ed clipboard wip 2025-04-06 22:21:35 +09:00
minjaesong
06a8fd38d1 more computer stuffs 2025-04-01 21:03:09 +09:00
minjaesong
a4b6ad1d5f more minor codes 2025-04-01 20:50:57 +09:00
minjaesong
1c0162ec25 wire ports for computers first draught 2025-03-31 22:21:13 +09:00
minjaesong
b6ee5ee0f7 computer wires 2025-03-30 20:00:02 +09:00
minjaesong
51da0612d2 sprites 2025-03-30 18:07:02 +09:00
minjaesong
0c35faa548 external classloader from modmgr 2025-03-30 17:00:39 +09:00
minjaesong
852c0b7dcc omfg is it actually working now? 2025-03-25 17:50:10 +09:00
minjaesong
759f8a4c4e bottom parts on conveyor now works 2025-03-25 16:58:55 +09:00
minjaesong
506ca7a7b1 curved parts on conveyor now works 2025-03-25 14:15:34 +09:00
minjaesong
42eee2bba7 small steps man :p 2025-03-24 22:02:07 +09:00
minjaesong
d77e1f38dc finally code's working as intended 2025-03-23 22:12:33 +09:00
minjaesong
e5f8e3b76d curved parts are finally appearing where they should 2025-03-23 21:11:52 +09:00
minjaesong
f5744550a4 straight part of the belt now use proper maths 2025-03-23 20:34:52 +09:00
minjaesong
bbd0bc7eb2 some mac-specific codes 2025-03-22 23:40:58 +09:00
minjaesong
7188fddc7e more conveyor aesthetics 2025-03-22 23:29:23 +09:00
minjaesong
5c2d201151 more versatile weather CLUT defs 2025-03-22 19:39:35 +09:00
minjaesong
c54cafae0f more conveyor visuals 2025-03-21 15:04:43 +09:00
minjaesong
3c8f272d4a conveyor wip 2025-03-21 14:30:32 +09:00
minjaesong
bbe28903d8 more conveyor aesthetics 2025-03-17 20:58:34 +09:00
minjaesong
b19b7c7e79 btex.xml 2025-03-17 19:40:45 +09:00
minjaesong
73bf7f8793 more belt graphics 2025-03-16 21:57:04 +09:00
minjaesong
5631b8e807 more belt graphics 2025-03-16 20:17:02 +09:00
minjaesong
dba941d4de rubber coloured belts 2025-03-16 18:16:28 +09:00
minjaesong
27b4137455 belts using their own shaperenderer 2025-03-16 16:36:26 +09:00
minjaesong
9af3f3b883 fixed rendering of belts 2025-03-15 22:08:09 +09:00
minjaesong
b577df0155 partially working conveyor 2025-03-15 21:40:14 +09:00
minjaesong
18feeb1826 wip conveyor drawfun 2025-03-14 20:51:24 +09:00
minjaesong
d598ef497d wippieeee 2025-03-13 21:30:04 +09:00
minjaesong
e652ace37b conveyer belt wip 2025-03-10 21:33:47 +09:00
minjaesong
bdd00676e6 no-auto-pickup variant of droppeditem 2025-03-09 12:56:26 +09:00
minjaesong
19bc779ae1 more token ring stuff 2025-03-08 22:17:36 +09:00
minjaesong
16cac2f1ab fixing minor bugs 2025-03-04 20:56:12 +09:00
minjaesong
a362ade9af some refactoring on FixtureRingBusCore 2025-03-03 22:01:22 +09:00
minjaesong
fea4e34733 ring bus debugger ui wip 2025-03-03 21:27:35 +09:00
minjaesong
f861a2727d now with watchdogs 2025-03-02 20:42:03 +09:00
minjaesong
2bb1c8400e more token ring stuff 2025-03-02 19:47:52 +09:00
minjaesong
ef4a5d6eb9 token ring stuff and renaming things to avoid confusion 2025-03-02 15:04:53 +09:00
minjaesong
f74b7218b0 token ring stuff wip 2025-03-01 23:03:56 +09:00
minjaesong
f154b2348b token ring stuff wip 2025-02-28 22:44:57 +09:00
minjaesong
e889b397d0 token ring stuff wip 2025-02-27 20:58:14 +09:00
minjaesong
65f771e9de replacing N'gasta with random Lorem texts to avoid possible copyright issues 2025-02-24 21:48:17 +09:00
minjaesong
8a26f328c7 more postal codes 2025-02-20 19:41:41 +09:00
minjaesong
37d6d3004b fix: targeted voucher code not working 2025-02-15 23:56:53 +09:00
minjaesong
ad68e04b83 working redeem code generator 2025-02-15 23:25:30 +09:00
minjaesong
4aae0bf733 redeem code gen wip 2025-02-15 20:05:17 +09:00
minjaesong
c2d0803ee3 redeem code gen wip 2025-02-15 16:18:30 +09:00
minjaesong
3d5672bc4d redeem code gen wip 2025-02-13 21:06:13 +09:00
minjaesong
22786f9a28 better wire branching control 2025-02-09 21:56:46 +09:00
minjaesong
34d8f1504f actorvalue blob clone wip 2025-02-09 20:55:42 +09:00
minjaesong
497782b428 integration of blob and actorvalue 2025-02-09 14:58:06 +09:00
minjaesong
fd0732cd39 actorvalue: new format 'blob' 2025-02-08 22:47:01 +09:00
minjaesong
d4e81c8c06 instance info 2025-02-01 21:04:12 +09:00
minjaesong
69ebdbc542 fix: some NaNs that can be caused by scroll bars 2025-02-01 20:51:40 +09:00
minjaesong
a2006b0354 debugging thing update 2025-02-01 19:31:07 +09:00
minjaesong
150b4e6b6b 'contrast strip' for volume control 2025-02-01 19:11:59 +09:00
minjaesong
b3b86b0965 a debug item 2025-02-01 14:53:14 +09:00
minjaesong
ff2a022394 item and sprite for 'document' type items 2025-01-31 22:44:08 +09:00
minjaesong
bb1da3b1ec working ItemFileRef instantiation and serialisation 2025-01-30 11:53:21 +09:00
minjaesong
29034e2104 mediumidentifier to loosely follow MIME format 2025-01-28 23:08:39 +09:00
minjaesong
daa6c09b52 more on itemfileref 2025-01-28 21:34:11 +09:00
minjaesong
879cc79bbf code input wip 2025-01-27 23:23:27 +09:00
minjaesong
6b4b7917d9 mysterious wip 2025-01-22 21:10:21 +09:00
minjaesong
ed9d8cffd6 more codes 2025-01-19 19:54:40 +09:00
minjaesong
3d34b9162b fix: AZERTY layout was missing < key 2025-01-17 17:40:45 +09:00
minjaesong
1b69d74291 minor fixes 2025-01-15 20:39:44 +09:00
minjaesong
15e3276f46 redeem code input wip 2025-01-15 16:07:04 +09:00
minjaesong
51dd99fd80 better post definition 2025-01-15 13:23:28 +09:00
minjaesong
c14720d649 better code font 2025-01-15 10:57:07 +09:00
minjaesong
f4fb7cccfb audio compressor option is now available 2025-01-11 23:46:54 +09:00
minjaesong
c10823ddce postal system wip 2024-12-29 19:49:27 +09:00
minjaesong
c1a5624167 locales for comp 2024-12-26 12:35:20 +09:00
minjaesong
3eee0dcd62 a working compressor this time 2024-12-26 12:28:12 +09:00
minjaesong
cc3e59796f i don't know if it's even working lol 2024-12-25 15:18:07 +09:00
minjaesong
9dc2dffef9 bandpass dsp 2024-12-22 15:56:35 +09:00
minjaesong
fe4318877a shader preloading 2024-12-16 19:36:58 +09:00
minjaesong
3322878074 both outline and a shadow for 'behind' actors 2024-12-05 21:47:02 +09:00
minjaesong
869b751488 prebuild update 2024-11-30 22:49:01 +09:00
minjaesong
450129f650 better shadow for wall-stickers 2024-11-30 20:52:52 +09:00
minjaesong
bf626e35da buttons for crafting/techtree transition 2024-11-26 22:29:48 +09:00
minjaesong
e581099aec minor numbers changes 2024-11-26 08:15:55 +09:00
minjaesong
95af4e8f53 tech tree view wip 2024-11-25 23:50:28 +09:00
minjaesong
661c4cdc4d more prominent shadow around wall-sticking tiles 2024-11-24 22:41:44 +09:00
minjaesong
a24eab209b shallow shadow improvements 2024-11-24 19:13:12 +09:00
minjaesong
6ec5ba5603 no shadows against skybox 2024-11-24 18:52:44 +09:00
minjaesong
8cf4b5d9a9 shadows around actors as well as terrain 2024-11-24 17:02:00 +09:00
minjaesong
5bf60cfa82 now terrain also lives on its own framebuffer 2024-11-24 13:19:20 +09:00
minjaesong
5cc7db8ecc putting some actors into their own framebuffer for shadowing 2024-11-24 13:10:08 +09:00
minjaesong
89b12aabb4 new debug cmd ExportFBO 2024-11-24 12:53:44 +09:00
minjaesong
f5846d9bae screen blur helper class 2024-11-23 21:17:16 +09:00
minjaesong
d460447331 for alpha 2 release 2024-11-16 11:12:47 +09:00
minjaesong
63fe28eee2 wrap-up commits for "not a true Alpha 2.0 release I was hoping for" 2024-11-15 23:41:25 +09:00
minjaesong
2d7ef6e9ff fix: edge detection of electric fixture not working 2024-10-31 23:40:49 +09:00
minjaesong
fa3a129991 worldportal ui fix 2024-10-31 10:53:11 +09:00
minjaesong
4cc74a85d1 fix: prev commit was made haphazardly 2024-10-30 18:10:30 +09:00
minjaesong
3de4018d75 renaming some files 2024-10-22 11:46:20 +09:00
minjaesong
dbb0c60976 yet another tooltip stuffs 2024-10-12 11:26:29 +09:00
minjaesong
66c2ffa598 fix: hitbox for fixtureworkbench was too tall 2024-10-11 23:23:04 +09:00
minjaesong
6a8f139ad8 fix: broken thumbnail for pressure plates 2024-10-11 23:22:22 +09:00
minjaesong
2b4ff12659 a bit of btex stuffs 2024-10-11 19:09:48 +09:00
minjaesong
60e54c2bc0 tooltipmanager 2024-10-11 15:02:11 +09:00
minjaesong
048777a845 literally one letter was missing 2024-10-11 13:22:23 +09:00
minjaesong
4545ea22ea wrench axle 2024-10-10 03:06:12 +09:00
minjaesong
75249bc44b wrench axle wip 2024-10-10 02:58:35 +09:00
minjaesong
6dd633d2bf wirecutter now ignores axles 2024-10-10 00:28:47 +09:00
minjaesong
b428273fa2 more on savegame migrator and virtualdisk bugfix 2024-10-08 20:22:40 +09:00
minjaesong
e0fcd00d82 more chunk pool and savegame migration codes 2024-10-08 12:55:30 +09:00
minjaesong
b4523b8492 more chunk pool codes 2024-10-08 00:15:17 +09:00
minjaesong
07b4f3bff1 more chunk pool codes 2024-10-07 18:06:18 +09:00
minjaesong
253ca85790 fix: bad spawn pos for fixtures with spawn offsets 2024-10-07 01:06:30 +09:00
minjaesong
02db6b8fed reorientable gearbox because input and output cannot be on the same location 2024-10-06 14:06:04 +09:00
minjaesong
9a33375286 gearbox wip 2024-10-06 01:27:45 +09:00
minjaesong
41fa1e6903 slightly more robust wire sim 2024-10-04 21:46:46 +09:00
minjaesong
ad734a7561 illegal tile monitoring in-game 2024-10-04 18:55:34 +09:00
minjaesong
af0be41a82 more flexible blockbox definition and their utilisation 2024-10-04 01:22:45 +09:00
minjaesong
0e58879216 axle test with test-motor 2024-10-03 21:35:52 +09:00
minjaesong
dd643005a4 the axle item/fixture? wip 2024-10-02 23:56:06 +09:00
minjaesong
551fbcd3c2 fix: pressure plate emsv was too bright 2024-09-28 16:13:40 +09:00
minjaesong
dbd95cd2a2 pressure plates 2024-09-27 20:35:08 +09:00
minjaesong
f103d9ae0c Windows on Arm will be filtered out specifically 2024-09-27 12:46:56 +09:00
minjaesong
70f2a23354 use _cp property to load custom application 2024-09-27 12:42:35 +09:00
minjaesong
83ad86c818 pushbutton 2024-09-27 00:53:41 +09:00
minjaesong
6e1d3c3bb7 sandstone generation follows the world's sand colour 2024-09-26 14:16:19 +09:00
minjaesong
da4a850ee9 minor improvements 2024-09-26 13:10:20 +09:00
minjaesong
740e5f7b94 reverting test codes 2024-09-26 00:49:38 +09:00
minjaesong
f89c2618fd automated avatar building & fix avatar import 2024-09-26 00:44:41 +09:00
minjaesong
b344b3b161 no quartz on igneous rocks 2024-09-25 19:43:22 +09:00
minjaesong
e4634045c2 pitchblende spawning 2024-09-25 17:39:28 +09:00
minjaesong
468949a22c strata implemented 2024-09-25 15:58:17 +09:00
minjaesong
ae587beddd porting liquid pockets to Aquagen 2024-09-25 14:48:22 +09:00
minjaesong
fbd7cd8f6a buildingmaker: hold V to erase 2024-09-25 12:13:59 +09:00
minjaesong
1c54b40898 fix: missing params that caused backwards incompatibility 2024-09-25 11:53:52 +09:00
minjaesong
b4f512ddef adding faults but better 2024-09-25 00:47:42 +09:00
minjaesong
ae57e710bc adding faults 2024-09-25 00:37:11 +09:00
minjaesong
bffc9fd860 new rocks 2024-09-24 20:38:28 +09:00
minjaesong
a2dc001909 newer terragen test wip 2024-09-23 01:41:13 +09:00
minjaesong
e14c832028 WorldCamera now holds tilewise positions 2024-09-20 14:44:53 +09:00
minjaesong
f5d4caaad5 shift func on UnsafeLong2D 2024-09-20 00:15:02 +09:00
minjaesong
180cf217f8 metals to their own sprite sheet 2024-09-15 16:01:12 +09:00
minjaesong
9520b5985f better bucket textures 2024-09-15 00:55:02 +09:00
minjaesong
94f4f1980a minor changes 2024-09-14 23:59:03 +09:00
minjaesong
c42f776f81 better lang for buckets 2024-09-14 22:50:27 +09:00
minjaesong
e8eae1e961 lang for buckets 2024-09-14 22:27:46 +09:00
minjaesong
dfac9ed9a8 thermal tags for buckets and fluids 2024-09-14 21:15:46 +09:00
minjaesong
35bec7bc26 water buckets 2024-09-14 20:02:26 +09:00
minjaesong
1924ed1fbc pause using the pause key 2024-09-13 21:55:03 +09:00
minjaesong
8f34fb41ed new keyboard layout DIN 2137 2024-09-13 21:27:12 +09:00
minjaesong
35da5927c8 better brick item texture 2024-09-13 17:22:17 +09:00
minjaesong
2743198866 brick block crafting 2024-09-13 17:09:05 +09:00
minjaesong
ec59000ae9 performance improvements by disabling tile deblocking 2024-09-13 13:18:01 +09:00
minjaesong
34a7a9285d better handling of null keysymbol 2024-09-12 23:56:40 +09:00
minjaesong
831114ef15 disabling item pickup autoequip 2024-09-12 23:41:53 +09:00
minjaesong
8d9159528f font bugfix 2024-09-12 23:41:39 +09:00
minjaesong
212afae027 better fix of 4a0f740e03 2024-09-12 21:11:53 +09:00
minjaesong
3a719bcbfa removing a debug print 2024-09-12 20:53:53 +09:00
minjaesong
7ed37cf355 new ore? 2024-09-12 20:53:26 +09:00
minjaesong
4a0f740e03 fix: crafting an item could unequip any holding item 2024-09-12 20:53:04 +09:00
minjaesong
ff16ca5b1a ISO keylayout on configs 2024-09-12 13:07:19 +09:00
minjaesong
35c330d253 chg magicnum 2024-09-10 22:30:35 +09:00
minjaesong
79d0fe3572 fps aware tilemap update rate 2024-09-10 22:24:41 +09:00
minjaesong
f50c2a385b simple tooltip system for fixtures 2024-09-10 19:41:06 +09:00
minjaesong
180d36eb10 new world and worldgen load scr update 2024-09-10 18:38:39 +09:00
minjaesong
29c1a69222 fluid worldgen 2024-09-10 02:18:05 +09:00
minjaesong
b3467d538c lava texture fix 2024-09-09 19:16:40 +09:00
minjaesong
43d65fb10b crude oil prototype 2024-09-08 23:02:43 +09:00
minjaesong
e4742a40dd aquifers prototype 2024-09-08 21:48:17 +09:00
minjaesong
56c12949f8 working lava pool prototype 2024-09-08 01:51:40 +09:00
minjaesong
11cdcbe2fc actor update control by chunkAnchoring flag 2024-09-07 19:01:03 +09:00
minjaesong
ab31986cf2 TerranVirtualDisk update 2024-09-07 16:44:44 +09:00
minjaesong
e3b663b4aa actors with chunk anchoring wip 2024-09-07 16:06:15 +09:00
minjaesong
68854d3573 chunk pool wip 2024-09-07 16:05:52 +09:00
minjaesong
a9e6aab94c new worldgen test wip 2024-09-06 23:59:46 +09:00
minjaesong
1af82e4d5c water jumping works but needs onscreen instruction to educate players 2024-09-06 21:14:54 +09:00
minjaesong
bd8f455ce6 caching ime icons 2024-09-06 16:16:00 +09:00
minjaesong
694a727a3e made a patch to GDX to enable ISO keyboard keys 2024-09-06 15:51:51 +09:00
minjaesong
849271328d fix: added a missing key on Bépo layout 2024-09-06 15:36:17 +09:00
minjaesong
56b98f3086 adaptive tilemap update rate 2024-09-05 19:48:21 +09:00
minjaesong
c17d742d68 fix: jittery cam on titlescreen 2024-09-05 15:25:39 +09:00
minjaesong
eb3822553b multithreaded initial spawn chunkgen 2024-09-04 22:57:58 +09:00
minjaesong
3fcb2f9996 minor bugfixes 2024-09-03 15:39:11 +09:00
minjaesong
f5f1f536cf grass texture fixes 2024-09-03 00:59:58 +09:00
minjaesong
1615afb81b brick texture refinement 2024-09-02 20:06:03 +09:00
minjaesong
ef0c9c8447 brick sounds 2024-09-02 01:02:52 +09:00
minjaesong
5cbe96033b bricks 2024-09-01 23:58:09 +09:00
minjaesong
aef5fd307a readjusted oregen params to preserve relative depth-to-spawn-rate scale 2024-09-01 04:47:20 +09:00
minjaesong
cdfb5c4daa fix: ore and fluid layer was not being disposed of 2024-09-01 02:50:34 +09:00
minjaesong
6f48bd9f04 new worldgen for the taller world 2024-09-01 00:27:23 +09:00
minjaesong
fa03e5d14a new worldgen wip 2024-08-31 23:55:13 +09:00
minjaesong
54d1218b4a fix: wetting tile using wrong tile 2024-08-31 22:24:31 +09:00
minjaesong
84f0353f09 multithreaded tile renumbering 2024-08-31 05:29:59 +09:00
minjaesong
85c1e3ba96 new world size and generator for Alpha 2 with backwards compatibility 2024-08-31 04:03:13 +09:00
minjaesong
da14c75278 new world size is now much taller; loadscreen bar now has fixed ratio 2024-08-30 21:56:46 +09:00
minjaesong
56a1723e4f drawing tilemap 'texture' is also done once every three frames 2024-08-30 17:50:29 +09:00
minjaesong
d405302c9d tilemap update is now done once in every 3 frame 2024-08-30 13:55:37 +09:00
minjaesong
85a4c46240 trying to optimise the tiling code (its broken now) 2024-08-30 02:37:53 +09:00
minjaesong
d8922485ad dirt textures 2024-08-29 13:22:33 +09:00
minjaesong
43e8d1a8d0 working deblocking 2024-08-29 03:00:39 +09:00
minjaesong
d02282a64d deblocking wip 2 2024-08-28 18:40:21 +09:00
minjaesong
7554459281 deblocking wip 2024-08-28 01:51:55 +09:00
minjaesong
02a549c406 new tiles: sands,sandstones 2024-08-28 01:51:22 +09:00
minjaesong
e691222741 new tiles: clay,trees,gravels 2024-08-27 02:58:02 +09:00
minjaesong
45550d0444 fix: bombs may cause segfault due to out of bound referencing in Y axis 2024-08-27 00:28:54 +09:00
minjaesong
86c7f7925b breakage overlay is back 2024-08-26 23:11:34 +09:00
minjaesong
55ae0b61af subtile grass tiling 2024-08-26 19:20:51 +09:00
minjaesong
feed1ee6c0 fix: touching the bottom of the world would crash the game because setFluid did not coerce the coords 2024-08-26 01:47:41 +09:00
minjaesong
63322321ce subtiling stone blocks 2024-08-26 01:39:05 +09:00
minjaesong
472fcfc05b wood blocks update 2024-08-25 20:20:46 +09:00
minjaesong
23cae8ed73 inventory image for subtiled blocks 2024-08-25 02:50:56 +09:00
minjaesong
ccaaac03d0 more 'correct' stone brick texture 2024-08-25 01:58:55 +09:00
minjaesong
50adfc08bb more brick tiling and bugfix 2024-08-24 22:35:27 +09:00
minjaesong
96cdefb800 brick tiling 2024-08-24 01:37:31 +09:00
minjaesong
ff66b65831 confirmed: subtiling works on any atlas size 2024-08-23 00:17:35 +09:00
minjaesong
657ab2b2be working subtiling (for atlas size 2048) 2024-08-23 00:06:14 +09:00
minjaesong
5c1c526128 fliprot on subtiles 2024-08-22 18:27:24 +09:00
minjaesong
9bd1471a64 rendertags on subtile sheet 2024-08-22 14:59:14 +09:00
minjaesong
bdb1c3e1ea better rock texture maybe 2024-08-22 03:14:17 +09:00
minjaesong
a74d4bbced working subtile rendering 2024-08-22 01:43:04 +09:00
minjaesong
7b23e34907 spectrometer slope is now 10dB/decade, which makes pink noise to appear flat 2024-08-21 23:47:01 +09:00
minjaesong
b0480e6225 fliprot revived 2024-08-21 14:34:42 +09:00
minjaesong
ebcc2ef4bf old tiling is adapted to subtiling (no fliprot/breakage yet) 2024-08-20 22:01:59 +09:00
minjaesong
186733e4f8 fix: fluid not renaming on load 2024-08-20 15:37:34 +09:00
minjaesong
e12a049e70 texcoord is wrong but silhouette is correct 2024-08-20 03:58:35 +09:00
minjaesong
02f9303767 better atlas code 2024-08-19 23:00:39 +09:00
minjaesong
1867bf8de0 working subtile-to-atlantes 2024-08-19 20:10:16 +09:00
minjaesong
88680fb0fc making room for larger tile ID to accomodate subtiling 2024-08-19 02:52:32 +09:00
minjaesong
e18f6512bc subtiling wip 2024-08-18 03:33:02 +09:00
minjaesong
fc92fe6f55 random sound audio bank 2024-08-16 22:38:47 +09:00
minjaesong
1c27966322 fluid sim now marks modified chunks 2024-08-13 01:02:22 +09:00
minjaesong
81c75a762b save/load fluid layer 2024-08-12 23:18:04 +09:00
minjaesong
fdbfad9633 player sprite to turn around even when airbourne 2024-08-12 16:17:46 +09:00
minjaesong
9c9806f622 genver for World now stores the version the world has generated 2024-08-12 00:19:59 +09:00
minjaesong
ff4bf42922 fix: water stripes below raised corners 2024-08-10 12:18:32 +09:00
minjaesong
c2b624546b comment fix 2024-07-28 19:26:37 +09:00
minjaesong
036347082f slightly more concise credits 2024-07-28 01:28:33 +09:00
minjaesong
97286e7d99 even better fluid tiling 2024-07-24 19:14:24 +09:00
minjaesong
af81bb0e0f even better fluid tiling 2024-07-22 15:04:22 +09:00
minjaesong
1fddb5f0da fix: water stripes on blocksdrawer 2024-07-22 14:23:58 +09:00
minjaesong
91e25da54f better fluid render wip 2024-07-22 03:40:48 +09:00
minjaesong
3386cfbd46 swiming control 2024-07-21 20:22:54 +09:00
minjaesong
42b3b9e02f finally working buoyancy sim 2024-07-21 16:26:49 +09:00
minjaesong
082e1b7ec0 another wip 2024-07-21 11:46:59 +09:00
minjaesong
85c6b87cea more physics madness 2024-07-21 04:45:10 +09:00
minjaesong
ca4c0d0d03 option to toggle the timepiece 2024-07-20 16:12:58 +09:00
minjaesong
3cf636629e lib update 2024-07-20 03:34:58 +09:00
minjaesong
4316072bc1 typo 2024-07-19 15:19:29 +09:00
minjaesong
37b8bacd36 lib update 2024-07-19 15:15:20 +09:00
minjaesong
dcd75eb642 current session playtime measurement now uses the app's startup time 2024-07-19 03:14:28 +09:00
minjaesong
14538dd10b playtime counter on top left corner 2024-07-19 03:07:52 +09:00
minjaesong
49fb419d35 forgot to remove debug codes 2024-07-19 02:24:42 +09:00
minjaesong
3d1d38dc60 shadow backing on the fullscr bat and clocks 2024-07-19 02:21:45 +09:00
minjaesong
57b3d355ae battery complication not using shaperenderer 2024-07-19 01:30:38 +09:00
minjaesong
d7f6e253d4 getbatterystatus update (2) 2024-07-19 00:27:45 +09:00
minjaesong
22d70e0a0a getbatterystatus update 2024-07-19 00:13:34 +09:00
minjaesong
b0827ae8c8 battery complication test 2024-07-18 23:36:51 +09:00
minjaesong
b26462b248 fullscreen GUI complications wip 2024-07-18 21:30:30 +09:00
minjaesong
0757764654 macbook notch area on the overlay 2024-07-18 20:55:01 +09:00
minjaesong
d9c1cfb3b2 reviving fullscreen toggle for macos 2024-07-18 17:49:26 +09:00
minjaesong
d4ac5b887c better fullscreen handling 2024-07-18 17:41:50 +09:00
minjaesong
9f0094c371 prebuild: added macos game mode detection 2024-07-18 14:55:29 +09:00
minjaesong
d72bbb0355 better buoyancy but still wip 2024-07-17 01:41:32 +09:00
minjaesong
e77aa0c33f fluid viscosity on phys sim 2024-07-16 17:32:56 +09:00
minjaesong
6399f609a9 rudimentary fluid rendering so that I can work on it 2024-07-15 03:33:31 +09:00
minjaesong
5f1b860555 Fluid.NULL is identical to Block.AIR 2024-07-15 00:48:52 +09:00
minjaesong
bddd871c9d fluid view on F3 2024-07-14 18:19:59 +09:00
minjaesong
01ce5fb3e2 fluid wip and hopefully fixed F3 dangling ptr 2024-07-14 16:13:59 +09:00
minjaesong
23d99c0c86 varying amplitude for throwing sound 2024-07-14 02:06:58 +09:00
minjaesong
96f858fa51 item throwing sounds and better linter 2024-07-13 19:15:04 +09:00
minjaesong
4f6b66b049 mining sounds wont overlap 2024-07-13 02:18:09 +09:00
minjaesong
92f28887ec glow orbs 2024-07-12 04:21:09 +09:00
minjaesong
5a4c300612 player now equips the item picked up, if said item did not exist in their inventory 2024-07-12 03:00:42 +09:00
minjaesong
c1ca06c8e0 convolver to ignore FFT interruptedexception 2024-07-12 01:31:23 +09:00
minjaesong
836d287fa9 intellij config update 2024-07-11 20:39:11 +09:00
minjaesong
4db090aba0 worldgen estimation update 2024-07-11 18:10:12 +09:00
minjaesong
7f5f11780c partial worldgen with full worldgen near spawn point 2024-07-11 17:29:54 +09:00
minjaesong
24e43edafb not-generated marker works as intended, reducing number of chunks for initial worldgen 2024-07-11 16:17:38 +09:00
minjaesong
7b6d7f2b93 ungenerated chunks are now filled with 0xFFFF 2024-07-11 16:02:57 +09:00
minjaesong
d8e6a01735 better music player behaviour 2024-07-09 14:28:51 +09:00
minjaesong
a236f49641 is the new musicplayer working? 2024-07-09 01:27:12 +09:00
minjaesong
86c6f008f9 working arbitrary track queueing 2024-07-08 18:06:44 +09:00
minjaesong
657c8051f8 working prev/next music queueing 2024-07-08 17:30:39 +09:00
minjaesong
63070a19d5 fix: continuous album now plays again 2024-07-07 02:53:57 +09:00
minjaesong
c211f67e38 progress ring instead of play/pause 2024-07-07 01:14:01 +09:00
minjaesong
e75575228a somewhat working? 2024-07-07 00:18:13 +09:00
minjaesong
90f7e82325 more transaction-based music disk jockeying wip 2024-07-06 20:58:23 +09:00
minjaesong
ff433703f4 y u no call back :( 2024-07-06 02:04:27 +09:00
minjaesong
68ed16aa5a Kotlin 2.0 migration 2024-07-05 01:25:36 +09:00
minjaesong
69571b6a3f transaction-based music playback managing wip 2024-07-04 21:34:27 +09:00
minjaesong
7582eae1ee better makefile 2024-06-28 12:58:15 +09:00
minjaesong
86fbe65e01 build inst update 2024-06-22 00:55:41 +09:00
minjaesong
417f00117e just disabling fullscreen on macos for now 2024-06-19 12:37:27 +09:00
minjaesong
a4629c3ea8 new fullscreen method 2024-06-19 12:26:34 +09:00
minjaesong
83b539e872 build inst update 2024-06-17 23:41:19 +09:00
minjaesong
fd124062cf particle fading shader 2024-06-16 17:47:28 +09:00
minjaesong
9948566ce4 btex: better multithreaded rendering 2024-06-02 22:02:22 +09:00
minjaesong
408e976dd8 btex: font update 2024-06-02 21:22:45 +09:00
minjaesong
8c6050528d btex: deserialisation of hyperlinks 2024-06-02 16:55:31 +09:00
minjaesong
33acbcea4d font update 2024-06-01 17:23:50 +09:00
minjaesong
3137297745 font update 2024-06-01 01:28:43 +09:00
minjaesong
de38561eb2 does this fix the segfault? 2024-05-26 14:40:55 +09:00
minjaesong
4607abbbd0 btextest rendering fix 2024-05-23 23:33:32 +09:00
minjaesong
32991b7ba8 btex: serialise now saves original xml 2024-05-23 19:06:32 +09:00
minjaesong
87ff1abe96 font: better interchar handling 2024-05-23 14:27:26 +09:00
minjaesong
3896da3db9 kotlin update 2.0 2024-05-22 23:14:02 +09:00
minjaesong
17e25c9cf7 GameItem item image Pixmap 2024-05-22 17:10:50 +09:00
minjaesong
fc509de98f BTeXTest is now available thru ingame 2024-05-22 16:26:43 +09:00
minjaesong
08d18af500 const renaming 2024-05-22 14:19:10 +09:00
minjaesong
493a15c6db font update with better spacing 2024-05-22 14:05:40 +09:00
minjaesong
19095140c6 font update should enable SHYs 2024-05-22 13:21:56 +09:00
minjaesong
20922e3c4f font update never ends 2024-05-22 00:40:27 +09:00
minjaesong
5e9087f961 font update 2024-05-21 23:21:35 +09:00
minjaesong
10f3721407 wider list box 2024-05-21 17:36:49 +09:00
minjaesong
bcf13d5ec6 font fixes 2024-05-21 17:10:12 +09:00
minjaesong
d0251ffa54 update btex_ko.xml 2024-05-20 22:09:44 +09:00
minjaesong
48b6c842be font update 2024-05-20 03:37:59 +09:00
minjaesong
0682862821 btex: new macro 'resetchapterafterpart' 2024-05-20 01:24:06 +09:00
minjaesong
9979153caf font update 2024-05-20 00:56:13 +09:00
minjaesong
4401b7377f new macro parindent 2024-05-19 00:45:45 +09:00
minjaesong
49e9b6bcdc progress indicator for the tester 2024-05-18 22:22:00 +09:00
minjaesong
7d58c9f1ae btex: <a> tag underlines 2024-05-18 20:12:22 +09:00
minjaesong
48703a7c38 btex: <a> tag target if off by one on the index page 2024-05-18 19:49:39 +09:00
minjaesong
9e9ab5bfe0 btex: finally working <a> tag 2024-05-18 18:15:27 +09:00
minjaesong
1cb70c4620 btex: hyperlinks on toc and index page 2024-05-18 17:34:29 +09:00
minjaesong
82627a8ab4 btex: <a> boxing better detection of hyphenation 2024-05-18 15:21:44 +09:00
minjaesong
6857ab266b btex: test--rectangle around hyperlinks 2024-05-18 02:57:52 +09:00
minjaesong
02d1a4f5f7 still working on the <a> tag to work 2024-05-17 23:59:11 +09:00
minjaesong
297846f9ef trying to make <a> tag to work 2024-05-17 23:36:36 +09:00
minjaesong
163216707e btex: new macro 'chapteronnewpage' 2024-05-17 01:20:56 +09:00
minjaesong
c7ca5a61c8 btex: img tag with fromgame attrib 2024-05-16 22:16:46 +09:00
minjaesong
efbdc806ea btex: img tag with src attrib 2024-05-16 17:07:36 +09:00
minjaesong
e308e9a356 fix: btex toc overflow 2024-05-16 13:35:36 +09:00
minjaesong
b963e0d3f2 btex: multithreaded finalising 2024-05-16 02:01:47 +09:00
minjaesong
7320a14a4d print book without GPU 2024-05-16 01:35:58 +09:00
minjaesong
1aecfc781f fix: typo on btex doc 2024-05-14 18:04:40 +09:00
minjaesong
fc69c6f5b7 part/chapter type macros 2024-05-14 17:10:43 +09:00
minjaesong
1c86162ff8 more xml stuff 2024-05-14 16:33:26 +09:00
minjaesong
f08857530a more btex documentation; fix: pagenum for btex indices are off by one 2024-05-14 16:23:50 +09:00
minjaesong
23f4557bf2 btexbin -> btxbook; baked shadow for TinyAlphNum 2024-05-14 03:16:06 +09:00
minjaesong
ba09633b45 font update 2024-05-14 00:35:12 +09:00
minjaesong
c230f96ac2 btex: fix: hyphenation behaviour 2024-05-10 02:06:26 +09:00
minjaesong
56fa7783e0 btex: right/centre par alignment 2024-05-09 16:51:43 +09:00
minjaesong
ef7138939d btex: font upgrade and more horz margin 2024-05-09 03:57:58 +09:00
minjaesong
162b7862bc btex: ul/ol impl 2024-05-08 19:10:31 +09:00
minjaesong
35768e6c72 btex: v-series korean specific tags 2024-05-08 18:17:49 +09:00
minjaesong
68f5d5c5da btex: part page fixed 2024-05-08 17:49:46 +09:00
minjaesong
f595e44edd stateless span and such 2024-05-08 16:22:11 +09:00
minjaesong
28d303e1f2 read from ingame lang 2024-05-08 15:57:39 +09:00
minjaesong
15de0c8352 btex: macrodef 2024-05-08 03:28:21 +09:00
minjaesong
27d4466f63 more XML 2024-05-08 01:10:03 +09:00
minjaesong
c4ff23361a more XML 2024-05-07 23:23:18 +09:00
minjaesong
464fc5c404 xml changes for palata no 6 2024-05-07 23:17:03 +09:00
minjaesong
f09ac75932 pbox wip 2024-05-07 23:02:12 +09:00
minjaesong
d758c79289 more XML 2024-05-07 05:46:16 +09:00
minjaesong
4d14eeea3a parser now validates XML 2024-05-06 21:59:26 +09:00
minjaesong
b2664e309a paragraph indent is now U+FFFDF because it's not considered as a glue 2024-05-06 15:02:32 +09:00
minjaesong
f45a2ce1d9 more btex; sheet metal item 2024-05-05 02:18:00 +09:00
minjaesong
92a4084e95 DTD for btexdoc 2024-05-04 05:10:44 +09:00
minjaesong
56b7b47039 codestyle wip 2024-05-03 16:13:47 +09:00
minjaesong
6494d7c29b code tag wip 2024-05-03 14:19:56 +09:00
minjaesong
e51504f881 btex: fix: part typesetting with OBJ would not get centred correctly 2024-05-03 03:59:04 +09:00
minjaesong
f2ef4df762 btex: centered part title 2024-05-03 00:48:25 +09:00
minjaesong
51861c9a09 btex: fully working <btex /> 2024-05-02 23:40:36 +09:00
minjaesong
de7aeee351 btex: partially working <btex /> 2024-05-02 20:18:23 +09:00
minjaesong
8fe653d82f btex: part number is now roman 2024-05-02 03:52:56 +09:00
minjaesong
48dc26781d btex: wider standard size 2024-05-01 05:52:24 +09:00
minjaesong
739734732e the real btex doc 2024-05-01 04:49:44 +09:00
minjaesong
62d321b150 btex: span now works again 2024-05-01 02:22:42 +09:00
minjaesong
a68a1d29bb FPS disp on window title 2024-04-30 22:19:33 +09:00
minjaesong
1f633f5ca2 typesetting line at a time and I broke <span> again 2024-04-30 19:15:55 +09:00
minjaesong
3244ad4a8a loading and rendering btexbin 2024-04-29 23:13:26 +09:00
minjaesong
bf07a16842 font update 2024-04-29 16:49:11 +09:00
minjaesong
5dbc0e6f41 typesetter update 2024-04-29 01:40:37 +09:00
minjaesong
73f5a67c8a gitattributes update 2024-04-29 01:14:37 +09:00
minjaesong
cd51276c16 btex serialisation 2024-04-29 01:11:48 +09:00
minjaesong
fa8054adac btex: finalising option for the btexdoc 2024-04-28 22:54:45 +09:00
minjaesong
e1b577b781 btex: page numbers and toc/index pagenum fixes 2024-04-28 19:51:31 +09:00
minjaesong
45b1a344f2 btex: fixed the paragraph overflows 2024-04-28 18:23:50 +09:00
minjaesong
54663657bd more btex styling 2024-04-28 15:32:28 +09:00
minjaesong
8a1ff32fa7 more btex styling 2024-04-28 15:17:08 +09:00
minjaesong
30e9f3e2ef btex: bugfixes 2024-04-28 02:56:47 +09:00
minjaesong
6889ce34a7 btex: text colouring via emph/itemname/targetname/span 2024-04-28 01:21:29 +09:00
minjaesong
a7ea83af16 btex: toc and chapter opening position 2024-04-27 17:33:08 +09:00
minjaesong
900ce1248c btex: cover typesetting 2024-04-27 16:02:03 +09:00
minjaesong
1137afebac btex: better toc and chapter/section alt texts 2024-04-26 23:16:20 +09:00
minjaesong
6264e0d963 btex: typesetting toc 2024-04-26 19:53:23 +09:00
minjaesong
f16944d000 btex: working index page 2024-04-26 19:12:03 +09:00
minjaesong
2534ca4ff7 btex: default colour change 2024-04-26 03:51:29 +09:00
minjaesong
bb10c55739 more btex styling 2024-04-26 03:30:59 +09:00
minjaesong
6de340bde6 btex chapter and section styling 2024-04-26 02:58:59 +09:00
minjaesong
40be60865b more btex tests 2024-04-25 17:04:15 +09:00
minjaesong
f154756439 more btex tests 2024-04-25 01:29:32 +09:00
minjaesong
76dd9a98e4 btex stuffs 2024-04-24 01:13:46 +09:00
minjaesong
e2a87d0e14 OKHsv util 2024-04-18 00:51:34 +09:00
minjaesong
1ddc696e78 temporal bayer dithering for particles 2024-04-17 16:10:43 +09:00
minjaesong
5e85d560b0 bayer alpha for particles 2024-04-17 03:05:24 +09:00
minjaesong
f0f358a15c note particles 2024-04-16 23:03:37 +09:00
minjaesong
875efc883e improved test score 2024-04-16 04:05:44 +09:00
minjaesong
24b5204560 working musicbox 2024-04-15 22:18:08 +09:00
minjaesong
c19184a55f musicbox wip 2024-04-15 20:57:27 +09:00
minjaesong
96954983f0 musicbox wip 2024-04-15 04:27:16 +09:00
minjaesong
9762f38868 more audio codes 2024-04-14 23:45:34 +09:00
minjaesong
4fba0f70c9 weather in weathercodex 2024-04-14 00:18:30 +09:00
minjaesong
670a308c78 audiobank now returns samples in floats 2024-04-11 20:57:47 +09:00
minjaesong
3e12966e84 audio file reading minor improvement 2024-04-06 22:56:12 +09:00
minjaesong
cb4462b1ff music looping is now processed by the MusicContainer 2024-04-06 02:28:30 +09:00
minjaesong
3ef3f3f653 fix: RAM music should loop as they should now 2024-04-06 00:22:52 +09:00
minjaesong
7416f15def more haptic for sliders 2024-04-04 00:08:19 +09:00
minjaesong
54e38b114d fix: spinner making same sound twice 2024-04-03 21:26:41 +09:00
minjaesong
728d609268 more haptic sounds 2024-04-03 02:38:56 +09:00
minjaesong
3e396c63ed bop sound change 2024-04-03 02:04:55 +09:00
minjaesong
4094457ab9 caching for non-ram music 2024-04-03 00:28:11 +09:00
minjaesong
9a8c91562e fix: bad cacheing behaviour 2024-04-02 23:23:16 +09:00
minjaesong
94152afcac sound track cacheing by track to remove any collision 2024-04-02 17:15:23 +09:00
minjaesong
918276a1be read sound effects from RAM 2024-04-02 14:32:13 +09:00
minjaesong
53f54a450d sound on memory wip 2024-04-02 00:29:59 +09:00
minjaesong
a1a70274dd gui track should obey interface volume setting 2024-04-01 18:07:54 +09:00
minjaesong
576e868996 sound cues for buttons 2024-04-01 03:15:57 +09:00
minjaesong
f72ed0f706 panning and attenuation for pickaxe audio cue 2024-03-31 21:02:00 +09:00
minjaesong
742b63a8fa pickaxe sound cue 2024-03-31 04:35:21 +09:00
minjaesong
aa2172b396 forgot to remove snapshot info 2024-03-28 00:46:40 +09:00
minjaesong
f3e2fa8441 Alpha 1.2 release candidate 2024-03-28 00:43:18 +09:00
minjaesong
a3d132d26c itemdesc change for solder wire 2024-03-27 23:47:42 +09:00
minjaesong
a4afb0bfe9 item autoreload is restricted to tools only 2024-03-24 03:55:06 +09:00
minjaesong
67092d4ab9 alloy yield doubled; turntable now requires brass for crafting 2024-03-23 23:47:20 +09:00
minjaesong
07680592d2 fix: text pos for sign preview wouldnt match the text on the fixture 2024-03-22 23:14:57 +09:00
minjaesong
844ec6bd4f recipe for engraving workbench 2024-03-22 22:27:47 +09:00
minjaesong
c87bd182b0 fix: text cursor darting around everywhere 2024-03-22 22:15:27 +09:00
minjaesong
6d2764933f better element positioning 2024-03-22 21:49:51 +09:00
minjaesong
d4672df208 sign engraver ui 2024-03-22 21:37:56 +09:00
minjaesong
4d1ea45a0f sign engraver wip 3 2024-03-22 21:15:39 +09:00
minjaesong
8e1c586a5c sign engraver wip 2 2024-03-22 20:52:19 +09:00
minjaesong
7690d3d672 sign engraver wip 2024-03-22 18:34:34 +09:00
minjaesong
8e8c206e3a engraver sprite 2024-03-22 04:16:08 +09:00
minjaesong
d35a73c7a5 signs persisting through load/save 2024-03-21 20:57:12 +09:00
minjaesong
ec76eb2685 THE cheapest way to resolve right-sided phys bug 2024-03-21 14:25:41 +09:00
minjaesong
a1a6dc5801 more sign stuffs 2024-03-21 00:42:34 +09:00
minjaesong
708dccb015 working sign 2024-03-20 22:32:09 +09:00
minjaesong
4e739963d3 copper sign actually spawns but still wip 2024-03-20 14:44:26 +09:00
minjaesong
8bf3d9666f test copper sign and it has no sprite 2024-03-20 03:33:24 +09:00
minjaesong
b856574d20 fix: multimeter's block cursor would break fixture ghost 2024-03-19 04:55:37 +09:00
minjaesong
f696a54d2d text sign wip 2 2024-03-18 03:46:15 +09:00
minjaesong
ca766719d3 text sign wip 2024-03-18 01:01:11 +09:00
minjaesong
d027ff7d7e toned down label colour 2024-03-17 23:35:38 +09:00
minjaesong
2785a67823 fix: item desc 2024-03-17 20:26:12 +09:00
minjaesong
33671d6e52 labels for inventory side buttons 2024-03-17 19:51:40 +09:00
minjaesong
7bfff29a79 seven seg display 2024-03-17 18:01:27 +09:00
minjaesong
aef1db49d6 animated trajectory 2024-03-17 17:20:49 +09:00
minjaesong
09e5b175b8 alloying furnace gui minor changes 2024-03-16 05:12:14 +09:00
minjaesong
37b4fa1e7b forgot to update itemsprites 2024-03-15 23:22:29 +09:00
minjaesong
d63be072cc better colourblind-friendly wires 2024-03-15 23:15:54 +09:00
minjaesong
d22f421bc4 wire debugger tooltip fix/electronic components now need floor OR wall to spawn 2024-03-15 22:44:46 +09:00
minjaesong
cb756cbf3a fix: non-ensapsulated CraftingUI would not pause the game 2024-03-15 02:32:14 +09:00
minjaesong
b24a3da2ed colour changing wire cutter 2024-03-15 02:26:42 +09:00
minjaesong
b0adc9efc7 Lang: get-from-config tags 2024-03-15 01:45:35 +09:00
minjaesong
c0a8118717 variable wire cutter uisng right click (no sprite change yet) 2024-03-14 21:14:30 +09:00
minjaesong
336dfad207 five-coloured wiring 2024-03-14 05:29:03 +09:00
minjaesong
ef7199fd8b electric workbench 2024-03-14 02:49:00 +09:00
minjaesong
3481502c1a sprite for electric workbench 2024-03-14 02:12:55 +09:00
minjaesong
5b462a2559 wire colour fade by signal strength 2024-03-14 00:18:25 +09:00
minjaesong
6abb6f84ef fourth purple wire because four-colour theorem 2024-03-13 23:45:10 +09:00
minjaesong
2abc8b19b9 wire signal loss sim wip 2024-03-13 17:00:28 +09:00
minjaesong
7c2b5468bd smelter ui changes; longer music interval 2024-03-13 04:54:59 +09:00
minjaesong
c829245b41 some changes 2024-03-11 23:59:21 +09:00
minjaesong
b05ae829cc tapestry now persists after load 2024-03-11 23:54:02 +09:00
minjaesong
8aa866f040 fix: actor tooltip was repeatedly showing and hiding itself 2024-03-11 22:28:19 +09:00
minjaesong
5a18ba4b06 torch sprites to the spritesheet 2024-03-11 17:25:39 +09:00
minjaesong
707abe8c6d devcycle-based version name (alpha, beta thing) 2024-03-11 02:44:05 +09:00
minjaesong
60eeeae759 soldering wire 2024-03-11 01:57:36 +09:00
minjaesong
ef2413f33d alloying furnace gui 2024-03-10 22:05:45 +09:00
minjaesong
2943f4119c signal adder 2024-03-10 19:44:16 +09:00
minjaesong
a298d6663b alloying furnace gui wip 2024-03-10 01:36:52 +09:00
minjaesong
fa49874971 minor edit 2024-03-10 00:47:06 +09:00
minjaesong
247cf9bd33 using 'smelting dictionary' for smelter recipes 2024-03-10 00:46:46 +09:00
minjaesong
c6999e0794 more codes 2024-03-09 18:19:15 +09:00
minjaesong
877d26667b smelter gui behav is now a factory 2024-03-09 17:03:03 +09:00
minjaesong
3e81b80bb1 assets for alloying furnace 2024-03-09 02:52:08 +09:00
minjaesong
47c82aba49 fix: untranslated strings are shown as 'null' on bgBG 2024-03-08 15:01:19 +09:00
minjaesong
c627096503 wrench 2024-03-08 04:15:07 +09:00
minjaesong
9994235342 signal repeater 2024-03-08 00:52:02 +09:00
minjaesong
bfaa50aea4 wire ports view 2024-03-07 23:46:30 +09:00
minjaesong
0d09a21028 logic component recipes and strings 2024-03-07 02:13:58 +09:00
minjaesong
d480a735a0 worldsimulator moved to modulebasegame package 2024-03-07 01:06:53 +09:00
minjaesong
2340cb7419 some random shits 2024-03-06 03:30:50 +09:00
minjaesong
dbff2610ac fix: emissive blocks were not tiled correctly 2024-03-06 02:35:28 +09:00
minjaesong
9f399b8722 fix: lightmap draw was off by half block 2024-03-06 02:13:49 +09:00
minjaesong
9a6f45756b fix: fixture pickup was only working sparingly 2024-03-06 01:43:45 +09:00
minjaesong
bbbc5e22a5 FixtureInteractionBlocked on blocks, walls and wires 2024-03-06 00:59:54 +09:00
minjaesong
8d3d6242d7 successfully altered the control scheme 2024-03-06 00:46:21 +09:00
minjaesong
3182843a48 fixture clicking action is now integrated into the FixtureBase 2024-03-05 23:59:32 +09:00
minjaesong
1dcdd8867a adjusting position of the noticelet 2024-03-05 22:11:49 +09:00
minjaesong
a3bf1ed3f6 d flipflop with full sprite 2024-03-05 21:20:51 +09:00
minjaesong
10f8e4a662 d flipflop wip 2024-03-05 18:51:50 +09:00
minjaesong
bb1a45db27 fix: placing a switch also flips it up as soon as it's been placed 2024-03-05 05:50:20 +09:00
minjaesong
5b5534bcb9 LR click behav change/mouse clicks were sticky and causes unwanted behaviour on some fixture UIs 2024-03-05 05:21:17 +09:00
minjaesong
0090cc7d40 removing wall requirements to the circuit components for convenience 2024-03-05 02:10:13 +09:00
minjaesong
5014381cbd what a stupid typo 2024-03-04 22:49:44 +09:00
minjaesong
caf238d6df logic gate actually blinking sprites 2024-03-04 21:39:21 +09:00
minjaesong
4602cb5bc1 propagation delay is now consistent; cosmetic wip 2024-03-04 19:07:25 +09:00
minjaesong
1c39036cc8 signal blocker spritesheet 2024-03-04 16:04:01 +09:00
minjaesong
6c224c79bf wires are simulated every tick 2024-03-04 05:28:42 +09:00
minjaesong
88c9bc4a27 working logic circuit except for the sprite 2024-03-04 05:02:44 +09:00
minjaesong
659976b880 signal blocker wip 2024-03-04 02:39:03 +09:00
minjaesong
3959de68b1 switch glow sprite 2024-03-03 21:18:23 +09:00
minjaesong
fbe887b039 0.4.1 release 2024-03-03 17:53:35 +09:00
minjaesong
91798436cb new fixture: table 2024-03-03 17:06:10 +09:00
minjaesong
34415f720d hiding the crafting guide again 2024-03-03 14:04:01 +09:00
minjaesong
33b739f34f fix typo in crafting recipe 2024-03-03 12:32:02 +09:00
minjaesong
f3825c0bfb itemdesc for wire rolling mill 2024-03-03 03:35:23 +09:00
minjaesong
84f1c48159 did i fix the crafting-unequip bug? 2024-03-03 03:20:42 +09:00
minjaesong
514a972bcf fix: savegame playtime was calculated wrongly 2024-03-03 03:15:35 +09:00
minjaesong
f19a27065e this should track the total playtime better? 2024-03-03 02:56:43 +09:00
minjaesong
324128e86a using gpu render for savegame list wipeout eff 2024-03-03 02:47:55 +09:00
minjaesong
39fca59ea7 larger tree takes double time to chop down 2024-03-03 02:11:18 +09:00
minjaesong
f07a6f6430 scaffoldings recipe change 2024-03-02 19:41:00 +09:00
minjaesong
6c5ee14402 platforms are lighter in weight 2024-03-02 18:24:58 +09:00
minjaesong
ec7ff3199d fix: techtree button not working if craftingUI is loaded independently 2024-03-02 17:16:02 +09:00
minjaesong
f400a5afe7 multicolour storage chests 2024-03-02 03:03:31 +09:00
minjaesong
ea1702ace4 wire rolling mill 2024-03-02 02:42:31 +09:00
minjaesong
01b5569169 bulb now requires walls to spawn 2024-03-02 01:11:02 +09:00
minjaesong
374cd5d4f7 changing recipe of gunpowder 2024-03-02 00:38:30 +09:00
minjaesong
c0cf9ab17d changing recipe of gunpowder 2024-03-02 00:34:01 +09:00
minjaesong
db0d3379cc trajectory to draw at the world edge 2024-03-02 00:09:57 +09:00
minjaesong
42e7da2a4a copper ingot sprite colour adjustment 2024-03-01 23:56:16 +09:00
minjaesong
30caac283a fix: torches can be placed anywhere 2024-03-01 22:15:39 +09:00
minjaesong
5da4cee22e tools now cost 5 bars 2024-03-01 19:16:48 +09:00
minjaesong
ddfa2f5bf0 fix: zooming would not properly center the cam if streamers mode is on (2) 2024-03-01 18:21:22 +09:00
minjaesong
7d38ba866c fix: zooming would not properly center the cam if streamers mode is on 2024-03-01 18:14:12 +09:00
minjaesong
a773786c9e changed iron ore distribution 2024-03-01 16:14:03 +09:00
minjaesong
43e16bf785 copper bulbs 2024-03-01 15:29:11 +09:00
minjaesong
7906de1711 fix: two clashing signal switches confusing the wire sim 2024-03-01 03:17:16 +09:00
minjaesong
6c3ec20b3d signal switches 2024-03-01 03:05:55 +09:00
minjaesong
902a086a4f better trajectory view 2024-02-29 14:22:16 +09:00
minjaesong
91bf11a3e0 better trajectory sim 2024-02-29 13:41:14 +09:00
minjaesong
410456e173 aim helper wip 2024-02-29 00:57:57 +09:00
minjaesong
9caf2a0d7e hopefully fixed a bug where crafting item sometimes enequips an item in the quickslot? 2024-02-23 04:48:54 +09:00
minjaesong
9525441dc0 a debug print 2024-02-21 21:47:35 +09:00
minjaesong
f7b0dfb5bb fix: getFreeTrack() would return a track it just returned when the timing coincides 2024-02-21 21:43:55 +09:00
minjaesong
549c03c2b4 fianlly found the culprit of repeated audio stopping but have no idea how to fix 2024-02-21 16:53:51 +09:00
minjaesong
91c5105a12 trying to fix glitchy audio after load 2024-02-21 14:06:49 +09:00
minjaesong
063483cfda inventory encumberment now takes player scale into account 2024-02-20 15:49:11 +09:00
minjaesong
a5953b8c87 more informative 'update available' ticker 2024-02-20 04:35:07 +09:00
minjaesong
c568276df6 fix deepstones had density of 24600 instead of 2400 2024-02-20 01:30:45 +09:00
minjaesong
19405b7f8d fix: acorn were 10 kilos each 2024-02-20 01:28:43 +09:00
minjaesong
2e89dcc73a more attempts 2024-02-19 21:11:34 +09:00
minjaesong
d3fe2e2bc6 trying to debug why fullscreen is borked on macOS 2024-02-19 21:04:37 +09:00
minjaesong
5c18e03bad apparently longer sleep time doesn't hurt 2024-02-19 16:31:03 +09:00
minjaesong
11a7a1f48d slightly improved audio processing performance by giving some time to the CPU 2024-02-19 16:07:34 +09:00
minjaesong
d24ec8296f fix: paste from clipboard would crash the game if the clipboard is empty 2024-02-19 14:52:31 +09:00
minjaesong
2c1727e495 fix: config change of chat overlay would not be reflected to GUI variables 2024-02-19 03:16:50 +09:00
minjaesong
b9e7a4ba84 gems item sprite change 2024-02-19 03:16:16 +09:00
minjaesong
165a9b4e88 update release date 2024-02-19 02:03:18 +09:00
minjaesong
55cba3e16a 0.4 release 2024-02-19 01:48:30 +09:00
minjaesong
1cbf0f4582 crafting guide wip and stash for next version 2024-02-19 01:44:31 +09:00
minjaesong
0911e70a69 clickable quickslot 2024-02-18 03:19:37 +09:00
minjaesong
2bf47a2aed clicking on the player's item on the crafting Ui will show recipes using that item 2024-02-18 03:08:11 +09:00
minjaesong
f400416a7c GDX 1.12.1 update 2024-02-18 02:05:08 +09:00
minjaesong
3bee121686 dropped items should collide with the platform 2024-02-17 23:17:01 +09:00
minjaesong
4a375ec5a3 fix: tooltips were capitalised when they shouldn't 2024-02-17 22:26:07 +09:00
minjaesong
0b683f33e1 mining sounds 2024-02-17 21:27:53 +09:00
minjaesong
c9f6246cd3 Titlecasing english texts because Polyglot ain't doing it 2024-02-17 19:17:22 +09:00
minjaesong
84222f0d98 players can dig out dirts barehandedly 2024-02-17 17:04:06 +09:00
minjaesong
701edbeaff resize screen really needs full game restart... 2024-02-17 15:56:52 +09:00
minjaesong
6da155d4f3 fix: game crashes on pasting text 2024-02-17 15:26:18 +09:00
minjaesong
a7ba39a43c wider nearby crafting station detection 2024-02-17 02:47:42 +09:00
minjaesong
9caf9ab2fa fix: explosion cuts off randomly 2024-02-17 00:30:04 +09:00
minjaesong
ffd470f2b4 fix: code for staircase climbing would interfere with hold-left/right-and-jump manoeuvre 2024-02-16 17:10:53 +09:00
minjaesong
b11bbf0130 fix: damaging terrain would not queue the modified chunk for the autosave 2024-02-16 14:29:47 +09:00
minjaesong
902341bd78 fix: inventory cell quickslot indicator not readily updating 2024-02-16 05:54:07 +09:00
minjaesong
95f03c74c1 larger dropped item pickup range 2024-02-16 03:02:30 +09:00
minjaesong
cac9e947f7 better boom-job juggling 2024-02-16 02:55:36 +09:00
minjaesong
693ad05352 itemised the torch but now you can place them 2024-02-16 01:15:36 +09:00
minjaesong
26bdd2253a itemised the torch 2024-02-16 00:36:14 +09:00
minjaesong
76586baba5 fix: bomb's item drop not obeying 'drop' itemproperty 2024-02-15 23:36:56 +09:00
minjaesong
ae0a2e2564 boom with particles 2024-02-15 22:05:08 +09:00
minjaesong
a4e3474563 more booms 2024-02-15 18:24:31 +09:00
minjaesong
84dcc95fc0 fix: bombs are making NaN amount of damage 2024-02-15 17:35:56 +09:00
minjaesong
2363a5c51f bomb go boom but better 2024-02-15 04:08:37 +09:00
minjaesong
f224d0718b explosion wip 2024-02-15 02:48:57 +09:00
minjaesong
c84e01646c boom sound for the bomb 2024-02-14 16:59:01 +09:00
minjaesong
c66f5cbb54 throwable cherry bomb (no explosion yet) 2024-02-14 03:54:14 +09:00
minjaesong
d2acacb531 string for ITEM_NITRE 2024-02-14 00:41:40 +09:00
minjaesong
e5ac560966 new gem on worldgen 2024-02-13 23:42:43 +09:00
minjaesong
6e1af36a63 terrain/wall damage indicator in F3 2024-02-13 00:51:01 +09:00
minjaesong
2b8497133e fix: NPE on item removal caused by scrolling 2024-02-13 00:23:42 +09:00
minjaesong
45b141fd57 fix; default emissive layer for item sheet sprite was transparent 2024-02-12 22:32:51 +09:00
minjaesong
3e3c1078d7 uicrafting: reset scroll when opening 2024-02-12 22:11:02 +09:00
minjaesong
43a5014564 fix: smelter: clicking on the slot will reset the scroll now 2024-02-12 21:01:55 +09:00
minjaesong
0a2d15e417 fix: [bug] remaining heat on the smelter is wasted if no fuel was burning 2024-02-12 20:40:56 +09:00
minjaesong
16c52a5e11 uicanvas: updateUI/renderUI to updateImpl/renderImpl to match the naming scheme with the actor 2024-02-12 17:28:23 +09:00
minjaesong
5f1e63e370 volume randomiser for smelter and furnace 2024-02-12 16:13:23 +09:00
minjaesong
a14f2697fb actors now use 'updateImpl'; static sound for smelter and furnace 2024-02-12 05:04:52 +09:00
minjaesong
7d871c5d49 actors now use 'updateImpl'; static sound for smelter and furnace 2024-02-12 04:48:25 +09:00
minjaesong
7ac6bd6a9c bonfire audio loop 2024-02-12 03:11:01 +09:00
minjaesong
0d036bb7c0 recipe for scaffolding 2024-02-12 01:44:24 +09:00
minjaesong
1333ece2b1 increased a random chance for records to 1/4096 2024-02-12 00:44:07 +09:00
minjaesong
d3f7818710 break torch using axe 2024-02-11 23:42:36 +09:00
minjaesong
1f0a4429e3 oops 2024-02-11 23:35:11 +09:00
minjaesong
346800d356 another limitation of the gapless playback 2024-02-11 23:29:35 +09:00
minjaesong
fcee6b5be3 debug print 2024-02-11 23:09:10 +09:00
minjaesong
49c595319b autoequip consumable tool 2024-02-11 22:59:06 +09:00
minjaesong
57d25431bd disable save if autosave is within 5 seconds 2024-02-11 21:53:11 +09:00
minjaesong
93f2e706c5 axes can attack platforms and scaffoldings 2024-02-11 21:02:29 +09:00
minjaesong
77bc646991 code refactor to clarify the state of item being dynamic
fix: simple item cell not showing itemcount for stackable and canbedynamic items
2024-02-11 20:51:54 +09:00
minjaesong
8e97914834 makefile script for the lulz 2024-02-11 20:01:28 +09:00
minjaesong
9c29cbb409 musicplayer: fix: playlist not advancing on intermittent mode 2024-02-11 19:07:26 +09:00
minjaesong
273e56cb35 fix: tool durability not decreasing; smelting recipe for quartz had bad value 2024-02-11 02:09:52 +09:00
minjaesong
87081b0a33 removing modulebasegame imports from the audio engine 2024-02-10 16:14:10 +09:00
minjaesong
b93e987011 MusicContainer extracted out of the modulebasegame 2024-02-10 16:09:00 +09:00
minjaesong
ea940e93ba minor sprite change 2024-02-10 02:31:54 +09:00
minjaesong
26dac5e853 git commit -amend 2024-02-10 00:52:55 +09:00
minjaesong
afd3656302 don't put snapshot marker on the release 2024-02-10 00:38:40 +09:00
minjaesong
a1ef80b2c0 build script update 2024-02-09 00:32:17 +09:00
minjaesong
afa2aef4c6 fix: player was drawn 1px lower than they should be 2024-02-08 18:06:00 +09:00
minjaesong
9068143239 turntable wow and flutter sim wip 2024-02-08 15:04:34 +09:00
minjaesong
238dbfc3c4 turntable to play disc 2024-02-08 00:07:19 +09:00
minjaesong
ff15a3a8cf fix: title screen camera debug view is flipped 2024-02-07 17:31:53 +09:00
minjaesong
316bfbcc08 fix: cloud's age ticking not syncing with the world's timedelta 2024-02-07 17:02:05 +09:00
minjaesong
f04548f9ab holo-series item sprites 2024-02-07 15:58:01 +09:00
minjaesong
866b8fed83 gems 2024-02-07 01:32:54 +09:00
minjaesong
a143887375 drop random records when digging dirts but super-rarely 2024-02-06 14:21:09 +09:00
minjaesong
6d941a3841 music by orstphone 2024-02-06 14:12:04 +09:00
minjaesong
ae0dbbf02a forgot to add font's jarfile 2024-02-06 00:10:40 +09:00
minjaesong
b09f6ce5c5 font update 2024-02-05 22:16:36 +09:00
minjaesong
3d81d7870a smelting sand to make glass 2024-02-05 18:55:02 +09:00
minjaesong
34bc9d45a0 held item--wall is not emitting light anymore 2024-02-05 17:34:09 +09:00
minjaesong
3491926e7c revived the held item lighting 2024-02-05 17:18:28 +09:00
minjaesong
2d42525092 actors now always calls despawn() when being despawned 2024-02-05 14:39:21 +09:00
minjaesong
1685d0f045 jukebox item sprite update 2024-02-05 13:47:41 +09:00
minjaesong
90eb51e96b noticelet: better behaving against cursor 2024-02-05 13:32:10 +09:00
minjaesong
17c7571915 debug view for dynamic tracks only 2024-02-05 05:12:03 +09:00
minjaesong
23921c7f7c font update 2024-02-05 03:24:19 +09:00
minjaesong
4d14b950fe font update 2024-02-05 03:03:12 +09:00
minjaesong
839886531a fix: actors having stale musictrack reference after the audioengine reloading 2024-02-05 02:14:38 +09:00
minjaesong
cc00e1eff9 I fixed the ingamerender-not-rendering bug?? 2024-02-05 01:26:27 +09:00
minjaesong
9ec66109a1 font update 2024-02-04 19:20:57 +09:00
minjaesong
11e326ec80 font update 2024-02-04 19:13:33 +09:00
minjaesong
87e2917d48 jukebox sprite: play mechanism 2024-02-04 18:18:12 +09:00
minjaesong
09ef9717ed font update 2024-02-04 16:30:09 +09:00
minjaesong
1054360d8d item renumbering 2024-02-03 21:56:07 +09:00
minjaesong
3c6c49e493 ingot sprite update 2024-02-03 21:32:51 +09:00
minjaesong
e94ad57058 demoworld update 2024-02-03 19:22:10 +09:00
minjaesong
2cbc6fad11 noticelet to make way for the mouse cursor 2024-02-03 19:20:20 +09:00
minjaesong
360d6e9dcb tooltip show item id if ALT is down 2024-02-03 18:18:07 +09:00
minjaesong
9f8f9ceaa5 item tooltip descriptions 2024-02-03 17:10:35 +09:00
minjaesong
72d1f849dd saplings sprite update 2024-02-03 16:12:55 +09:00
minjaesong
04c54204b5 tone mapping param change 2024-02-03 15:58:12 +09:00
minjaesong
5dacbe18a3 fix: pickaxe will constantly closing the tooltip while equipped 2024-02-03 15:40:29 +09:00
minjaesong
559f5a9a9d dropped items now visible in the dark 2024-02-03 15:20:22 +09:00
minjaesong
808862c520 simpler light tone mapping 2024-02-03 15:13:33 +09:00
minjaesong
f91fbf6cf0 smelter lightbox depends on its internal temperature 2024-02-03 04:52:37 +09:00
minjaesong
8cb4709cd7 diversified tree generation 2024-02-03 02:41:02 +09:00
minjaesong
93e0c8742a saplings 2024-02-03 02:26:58 +09:00
minjaesong
d9adbda6f6 font update 2024-02-02 20:39:27 +09:00
minjaesong
40ab816dcb strings moving around 2024-02-02 19:20:40 +09:00
minjaesong
71ce4f8b20 removing temporary ore recipes 2024-02-02 17:47:38 +09:00
minjaesong
c33dae658a item dim fix 2024-02-02 17:46:59 +09:00
minjaesong
a569a34005 charcoal; smelter item sprite;
crafting-fixed navigate-ingredients-crafting-recipe behav
2024-02-02 16:48:07 +09:00
minjaesong
cfd0f0302e smelter multiplier change 2024-02-02 00:20:41 +09:00
minjaesong
0769899b55 smelter: working smelting? and working sprite change 2024-02-02 00:03:27 +09:00
minjaesong
99e17d32e1 thermal stuffs 2024-02-01 16:18:18 +09:00
minjaesong
6e1ad9f768 fix: new encumbrance limit was not applied AT ALL 2024-02-01 16:17:58 +09:00
minjaesong
55bb33b4ce world portal: autogenerating returning portal 2024-01-31 23:18:12 +09:00
minjaesong
62d30fb6e9 'flatness' is considered on choosing a spawn point 2024-01-31 21:41:08 +09:00
minjaesong
a839cc9f49 item list only wheel-scrolls when you move whell on the navbar 2024-01-31 16:40:05 +09:00
minjaesong
3c6e7665fa porting scroll behav to the storage chest 2024-01-31 02:26:17 +09:00
minjaesong
e1935fb659 smelter: scroll wheel to operate the item slots 2024-01-31 02:07:17 +09:00
minjaesong
d1a6873bc0 smelter: clicking on the navbar no longer resets the cell selection 2024-01-30 23:35:16 +09:00
minjaesong
38e60678e1 minor locale update 2024-01-30 20:08:11 +09:00
minjaesong
7fb068517a tooltip and smelter ui fixes 2024-01-30 19:57:32 +09:00
minjaesong
cbe11ce5dc new tooltip for storage chest 2024-01-30 18:16:55 +09:00
minjaesong
1aee8a963a control helpers for smelter 2024-01-30 18:00:42 +09:00
minjaesong
6fc87d9ae9 tooltip to always update 2024-01-30 13:54:34 +09:00
minjaesong
111833f5d3 fix: old tooltip managing code and revived the fading transition 2024-01-30 02:57:18 +09:00
minjaesong
9fa28760fa all the gauges for uismelter 2024-01-30 01:37:03 +09:00
minjaesong
a027506ad2 smelter ui wip 2024-01-29 22:28:33 +09:00
minjaesong
3214f11375 uiitem and template refactoring; new smelter ui wip 2024-01-29 18:51:53 +09:00
minjaesong
8aedd7c78a fix: renaming player would cause savegame load to fail as renaming would 'prettify' the json and the savegame loader was not expecting it 2024-01-29 16:15:13 +09:00
minjaesong
9c2b2c6a13 encumb bar extracted to separate function 2024-01-29 14:29:03 +09:00
minjaesong
60a1b8f76b texture for storage chest item 2024-01-29 02:02:20 +09:00
minjaesong
3781470afb font update 2024-01-28 22:51:32 +09:00
minjaesong
d3cd3465c7 lone leaves decaying 2024-01-28 20:14:48 +09:00
minjaesong
6e69fb3872 seasonal texture for leaves 2024-01-28 17:27:11 +09:00
minjaesong
9f376e93b2 font update 2024-01-28 16:43:41 +09:00
minjaesong
b5f487fe2f yet another jukebox and musicplayer patch 2024-01-28 03:49:39 +09:00
minjaesong
add263620e who knew playing around the music player can be so hard 2024-01-28 02:50:08 +09:00
minjaesong
0af1e7004d all crafting stations now use UICrafting 2024-01-27 22:46:18 +09:00
minjaesong
253ce1054f cut-down version of crafting ui wip 2024-01-27 22:05:49 +09:00
minjaesong
46b55f6303 found a bug on uiFixture and the only solution would be creating a cut-down copy of the original ui 2024-01-27 19:48:44 +09:00
minjaesong
8b1331770d dust and sound on placing fixtures 2024-01-27 17:27:20 +09:00
minjaesong
03b002126a door sound amplified 2024-01-27 16:26:52 +09:00
minjaesong
0290ff1b11 fix: leaves being too strong 2024-01-27 14:45:08 +09:00
minjaesong
0c64cea220 savegamecracker: new command 'uuid' 2024-01-27 14:24:50 +09:00
minjaesong
9849769c7b tile hiding cond now takes uv intensity into account 2024-01-27 05:20:47 +09:00
minjaesong
fd8cdb94bc more emissive and glow codes that fixes glow/emsv-seen-thru-foreground 2024-01-27 04:32:42 +09:00
minjaesong
b1ca1a9351 glow/emissive for held items, even if the actor has no glow/emissive sprites 2024-01-27 03:21:26 +09:00
minjaesong
b02f4d7703 sprite: emissive layer 2024-01-27 01:27:45 +09:00
minjaesong
3042b0659e musicplayer: buttons are now well-behaving 2024-01-25 18:16:24 +09:00
minjaesong
2832f7123d auto apply filter if screenmagnifying is not 1.0 or 2.0 2024-01-25 16:04:20 +09:00
minjaesong
54061f64a8 fix: axe not cutting large trees well 2024-01-25 04:38:26 +09:00
minjaesong
46557c0f91 locale update (restart not needed) 2024-01-25 04:03:22 +09:00
minjaesong
d71527cff1 build script update 2024-01-25 03:41:20 +09:00
1292 changed files with 111551 additions and 9005 deletions

2
.gitattributes vendored
View File

@@ -10,6 +10,8 @@
*.icns filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.bin filter=lfs diff=lfs merge=lfs -text
*.btxbook filter=lfs diff=lfs merge=lfs -text
*.btxform filter=lfs diff=lfs merge=lfs -text
*.tga binary diff=hex
*.kra binary diff=hex

2
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,2 @@
github: [curioustorvald]
custom: ["https://paypal.me/curioustorvald"]

99
.github/workflows/codeql.yml vendored Normal file
View File

@@ -0,0 +1,99 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL Advanced"
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
schedule:
- cron: '41 4 * * 0'
jobs:
analyze:
name: Analyze (${{ matrix.language }})
# Runner size impacts CodeQL analysis time. To learn more, please see:
# - https://gh.io/recommended-hardware-resources-for-running-codeql
# - https://gh.io/supported-runners-and-hardware-resources
# - https://gh.io/using-larger-runners (GitHub.com only)
# Consider using larger runners or machines with greater resources for possible analysis time improvements.
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
permissions:
# required for all workflows
security-events: write
# required to fetch internal or private CodeQL packs
packages: read
# only required for workflows in private repositories
actions: read
contents: read
strategy:
fail-fast: false
matrix:
include:
- language: java-kotlin
build-mode: none
# CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift'
# Use `c-cpp` to analyze code written in C, C++ or both
# Use 'java-kotlin' to analyze code written in Java, Kotlin or both
# Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
# To learn more about changing the languages that are analyzed or customizing the build mode for your analysis,
# see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning.
# If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
steps:
- name: Checkout repository
uses: actions/checkout@v4
# Add any setup steps before running the `github/codeql-action/init` action.
# This includes steps like installing compilers or runtimes (`actions/setup-node`
# or others). This is typically only required for manual builds.
# - name: Setup runtime (example)
# uses: actions/setup-example@v1
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
# If the analyze step fails for one of the languages you are analyzing with
# "We were unable to automatically build your code", modify the matrix above
# to set the build mode to "manual" for that language. Then modify this step
# to build your code.
# Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
- name: Run manual build steps
if: matrix.build-mode == 'manual'
shell: bash
run: |
echo 'If you are using a "manual" build mode for one or more of the' \
'languages you are analyzing, replace this with the commands to build' \
'your code, for example:'
echo ' make bootstrap'
echo ' make release'
exit 1
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
with:
category: "/language:${{matrix.language}}"

View File

@@ -1,7 +1,7 @@
<component name="ArtifactManager">
<artifact type="jar" name="SpriteAssemblerApp">
<output-path>$PROJECT_DIR$/out</output-path>
<root id="archive" name="terrarum.terrarum.jar">
<root id="archive" name="SpriteAssemblerApp.jar">
<element id="directory" name="META-INF">
<element id="file-copy" path="$PROJECT_DIR$/src/net/torvald/terrarum/spriteassembler/META-INF/MANIFEST.MF" />
</element>
@@ -31,56 +31,58 @@
<element id="extracted-dir" path="$PROJECT_DIR$/lib/js-scriptengine-22.3.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/regex-22.3.1-edit.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/truffle-api-22.3.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-1.12.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-backend-lwjgl3-1.12.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-1.12.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-backend-lwjgl3-1.12.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jlayer-1.0.1-gdx.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jorbis-0.0.17.jar" path-in-jar="/" />
</root>
</artifact>
</component>

View File

@@ -13,8 +13,6 @@
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-controllers-desktop-2.2.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/GetCpuName.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jxinput-1.0.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$KOTLIN_BUNDLED$/lib/kotlin-stdlib.jar" path-in-jar="/" />
<element id="extracted-dir" path="$KOTLIN_BUNDLED$/lib/kotlin-reflect.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/commons-csv-1.8.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/prtree.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/Terrarum_Joise.jar" path-in-jar="/" />
@@ -27,69 +25,68 @@
<element id="extracted-dir" path="$PROJECT_DIR$/lib/js-22.3.1-edit.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/graal-sdk-22.3.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/commons-math3-3.6.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-1.12.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-backend-lwjgl3-1.12.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-platform-1.12.0-natives-arm64-v8a.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-platform-1.12.0-natives-desktop.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-platform-1.12.0-natives-x86_64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/JTransforms-3.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/JLargeArrays-1.5.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/aircompressor-0.25.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.8.22/kotlin-stdlib-jdk8-1.8.22.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.8.22/kotlin-stdlib-1.8.22.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.8.22/kotlin-stdlib-common-1.8.22.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.8.22/kotlin-stdlib-jdk7-1.8.22.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-reflect/1.8.22/kotlin-reflect-1.8.22.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-test/1.8.22/kotlin-test-1.8.22.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-1.12.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-backend-lwjgl3-1.12.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-linux.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-linux-arm32.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-linux-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-macos.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-macos-arm64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-windows.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-windows-x86.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-platform-1.12.1-natives-arm64-v8a.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-platform-1.12.1-natives-desktop.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/gdx-platform-1.12.1-natives-x86_64.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/TerranVirtualDisk.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/2.0.0/kotlin-stdlib-jdk8-2.0.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/2.0.0/kotlin-stdlib-2.0.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/2.0.0/kotlin-stdlib-jdk7-2.0.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/GetBatteryStatus.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/lib/aircompressor-2.0.2.jar" path-in-jar="/" />
</root>
</artifact>
</component>

View File

@@ -1,5 +1,6 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<option name="RIGHT_MARGIN" value="999" />
<JetCodeStyleSettings>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>

23
.idea/csv-editor.xml generated Normal file
View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CsvFileAttributes">
<option name="attributeMap">
<map>
<entry key="/Terrarum.wiki/Items.md">
<value>
<Attribute>
<option name="separator" value="," />
</Attribute>
</value>
</entry>
<entry key="/Terrarum.wiki/Modules:Setup.md">
<value>
<Attribute>
<option name="separator" value="," />
</Attribute>
</value>
</entry>
</map>
</option>
</component>
</project>

8
.idea/kotlinc.xml generated
View File

@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Kotlin2JvmCompilerArguments">
<option name="jvmTarget" value="17" />
<option name="jvmTarget" value="1.8" />
</component>
<component name="KotlinCommonCompilerArguments">
<option name="apiVersion" value="1.8" />
<option name="languageVersion" value="1.8" />
<option name="apiVersion" value="2.0" />
<option name="languageVersion" value="2.0" />
</component>
<component name="KotlinJpsPluginSettings">
<option name="version" value="1.8.0" />
<option name="version" value="2.0.0" />
</component>
</project>

9
.idea/libraries/GetBatteryStatus.xml generated Normal file
View File

@@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="GetBatteryStatus">
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/GetBatteryStatus.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@@ -1,26 +1,23 @@
<component name="libraryTable">
<library name="KotlinJavaRuntime" type="repository">
<properties maven-id="org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22" />
<properties maven-id="org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.0" />
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.8.22/kotlin-stdlib-jdk8-1.8.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.8.22/kotlin-stdlib-1.8.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.8.22/kotlin-stdlib-common-1.8.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/2.0.0/kotlin-stdlib-jdk8-2.0.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/2.0.0/kotlin-stdlib-2.0.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.8.22/kotlin-stdlib-jdk7-1.8.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/2.0.0/kotlin-stdlib-jdk7-2.0.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.8.22/kotlin-stdlib-jdk8-1.8.22-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.8.22/kotlin-stdlib-1.8.22-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.8.22/kotlin-stdlib-common-1.8.22-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/2.0.0/kotlin-stdlib-jdk8-2.0.0-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/2.0.0/kotlin-stdlib-2.0.0-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.8.22/kotlin-stdlib-jdk7-1.8.22-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/2.0.0/kotlin-stdlib-jdk7-2.0.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.8.22/kotlin-stdlib-jdk8-1.8.22-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.8.22/kotlin-stdlib-1.8.22-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.8.22/kotlin-stdlib-common-1.8.22-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/2.0.0/kotlin-stdlib-jdk8-2.0.0-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/2.0.0/kotlin-stdlib-2.0.0-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.8.22/kotlin-stdlib-jdk7-1.8.22-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/2.0.0/kotlin-stdlib-jdk7-2.0.0-sources.jar!/" />
</SOURCES>
</library>
</component>

11
.idea/libraries/TerranVirtualDisk.xml generated Normal file
View File

@@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="TerranVirtualDisk">
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/TerranVirtualDisk.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$PROJECT_DIR$/lib/TerranVirtualDisk-src.jar!/" />
</SOURCES>
</library>
</component>

View File

@@ -1,16 +1,16 @@
<component name="libraryTable">
<library name="badlogicgames.gdx" type="repository">
<properties maven-id="com.badlogicgames.gdx:gdx:1.12.0" />
<properties maven-id="com.badlogicgames.gdx:gdx:1.12.1" />
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/gdx-1.12.0.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-1.12.1.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-jnigen-loader-2.3.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/lib/gdx-1.12.0-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-1.12.1-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-jnigen-loader-2.3.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/lib/gdx-1.12.0-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-1.12.1-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-jnigen-loader-2.3.1-sources.jar!/" />
</SOURCES>
</library>

View File

@@ -1,168 +1,168 @@
<component name="libraryTable">
<library name="badlogicgames.gdx.backend.lwjgl3" type="repository">
<properties maven-id="com.badlogicgames.gdx:gdx-backend-lwjgl3:1.12.0" />
<properties maven-id="com.badlogicgames.gdx:gdx-backend-lwjgl3:1.12.1" />
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/gdx-backend-lwjgl3-1.12.0.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-1.12.0.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-backend-lwjgl3-1.12.1.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-1.12.1.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-jnigen-loader-2.3.1.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-linux.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-linux-arm32.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-linux-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-macos.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-macos-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-windows.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-natives-windows-x86.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-linux.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-linux-arm32.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-linux-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-macos.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-macos-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-windows.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-natives-windows-x86.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-linux.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-linux-arm32.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-linux-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-macos.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-macos-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-windows.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-natives-windows-x86.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-linux.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-linux-arm32.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-linux-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-macos.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-macos-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-windows.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-natives-windows-x86.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-linux.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-linux-arm32.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-linux-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-macos.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-macos-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-windows.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-natives-windows-x86.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-linux.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-linux-arm32.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-linux-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-macos.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-macos-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-windows.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-natives-windows-x86.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-linux.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-linux-arm32.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-linux-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-macos.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-macos-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-windows.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-natives-windows-x86.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-linux.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-linux-arm32.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-linux-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-macos.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-macos-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-windows.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-natives-windows-x86.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-linux.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-linux-arm32.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-linux-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-macos.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-macos-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-windows.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-natives-windows-x86.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-linux.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-linux-arm32.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-linux-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-macos.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-macos-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-windows.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-natives-windows-x86.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-linux.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-linux-arm32.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-linux-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-macos.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-macos-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-windows.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-natives-windows-x86.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-linux.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-linux-arm32.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-linux-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-macos.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-macos-arm64.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-windows.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-natives-windows-x86.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/jlayer-1.0.1-gdx.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/jorbis-0.0.17.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/lib/gdx-backend-lwjgl3-1.12.0-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-1.12.0-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-backend-lwjgl3-1.12.1-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-1.12.1-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-jnigen-loader-2.3.1-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/jlayer-1.0.1-gdx-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/jorbis-0.0.17-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/lib/gdx-backend-lwjgl3-1.12.0-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-1.12.0-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-backend-lwjgl3-1.12.1-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-1.12.1-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-jnigen-loader-2.3.1-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.2-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-glfw-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-jemalloc-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-openal-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-opengl-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/lwjgl-stb-3.3.3-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/jlayer-1.0.1-gdx-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/jorbis-0.0.17-sources.jar!/" />
</SOURCES>

View File

@@ -1,11 +0,0 @@
<component name="libraryTable">
<library name="gdx-platform-1.12.0-natives">
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/gdx-platform-1.12.0-natives-arm64-v8a.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-platform-1.12.0-natives-desktop.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-platform-1.12.0-natives-x86_64.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="gdx-platform-1.12.1-natives-arm64-v8a">
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/gdx-platform-1.12.1-natives-arm64-v8a.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-platform-1.12.1-natives-desktop.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/gdx-platform-1.12.1-natives-x86_64.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@@ -1,14 +1,14 @@
<component name="libraryTable">
<library name="io.airlift.aircompressor" type="repository">
<properties maven-id="io.airlift:aircompressor:0.25" />
<properties maven-id="io.airlift:aircompressor:2.0.2" />
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/aircompressor-0.25.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/aircompressor-2.0.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/lib/aircompressor-0.25-javadoc.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/aircompressor-2.0.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/lib/aircompressor-0.25-sources.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/aircompressor-2.0.2-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@@ -1,13 +0,0 @@
<component name="libraryTable">
<library name="jetbrains.kotlin.reflect" type="repository">
<properties maven-id="org.jetbrains.kotlin:kotlin-reflect:1.8.22" />
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-reflect/1.8.22/kotlin-reflect-1.8.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.8.22/kotlin-stdlib-1.8.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.8.22/kotlin-stdlib-common-1.8.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@@ -1,26 +0,0 @@
<component name="libraryTable">
<library name="jetbrains.kotlin.test" type="repository">
<properties maven-id="org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22" />
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.8.22/kotlin-stdlib-jdk8-1.8.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.8.22/kotlin-stdlib-1.8.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.8.22/kotlin-stdlib-common-1.8.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.8.22/kotlin-stdlib-jdk7-1.8.22.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.8.22/kotlin-stdlib-jdk8-1.8.22-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.8.22/kotlin-stdlib-1.8.22-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.8.22/kotlin-stdlib-common-1.8.22-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.8.22/kotlin-stdlib-jdk7-1.8.22-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.8.22/kotlin-stdlib-jdk8-1.8.22-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.8.22/kotlin-stdlib-1.8.22-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.8.22/kotlin-stdlib-common-1.8.22-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.8.22/kotlin-stdlib-jdk7-1.8.22-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@@ -1,13 +0,0 @@
<component name="libraryTable">
<library name="jetbrains.kotlin.test1" type="repository">
<properties maven-id="org.jetbrains.kotlin:kotlin-test:1.8.22" />
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-test/1.8.22/kotlin-test-1.8.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.8.22/kotlin-stdlib-1.8.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.8.22/kotlin-stdlib-common-1.8.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

2
.idea/misc.xml generated
View File

@@ -38,7 +38,7 @@
<property name="caretWidth" class="java.lang.Integer" />
</properties>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
<component name="SuppressKotlinCodeStyleNotification">

View File

@@ -1,7 +1,6 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Build Version Number" type="Application" factoryName="Application">
<option name="ALTERNATIVE_JRE_PATH" value="17" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
<option name="MAIN_CLASS_NAME" value="net.torvald.terrarum.PrebuildKt" />
<module name="TerrarumBuild" />
<method v="2">

View File

@@ -1,7 +1,6 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="QuickDirtyLint" type="Application" factoryName="Application">
<option name="ALTERNATIVE_JRE_PATH" value="17" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
<option name="MAIN_CLASS_NAME" value="net.torvald.terrarum.QuickDirtyLintKt" />
<module name="TerrarumBuild" />
<method v="2">

View File

@@ -3,7 +3,6 @@
<option name="JAR_PATH" value="$PROJECT_DIR$/out/SpriteAssemblerApp.jar" />
<option name="VM_PARAMETERS" value="-ea" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
<option name="ALTERNATIVE_JRE_PATH" value="17" />
<module name="TerrarumBuild" />
<method v="2">

View File

@@ -3,7 +3,6 @@
<option name="JAR_PATH" value="$PROJECT_DIR$/out/TerrarumBuild.jar" />
<option name="VM_PARAMETERS" value="-ea -Dswing.aatext=true -Dawt.useSystemAAFontSettings=lcd" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
<option name="ALTERNATIVE_JRE_PATH" value="17" />
<module name="TerrarumBuild" />
<method v="2">

View File

@@ -3,14 +3,12 @@
<option name="JAR_PATH" value="$PROJECT_DIR$/out/TerrarumBuild.jar" />
<option name="VM_PARAMETERS" value="-Dswing.aatext=true -Dawt.useSystemAAFontSettings=lcd" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
<option name="ALTERNATIVE_JRE_PATH" value="17" />
<module name="TerrarumBuild" />
<method v="2">
<option name="RunConfigurationTask" enabled="true" run_configuration_name="Build Version Number" run_configuration_type="Application" />
<option name="BuildArtifacts" enabled="true">
<artifact name="ModuleComputers" />
<artifact name="MusicPlayer" />
<artifact name="TerrarumBuild" />
</option>
<option name="RunConfigurationTask" enabled="true" run_configuration_name="QuickDirtyLint" run_configuration_type="Application" />

View File

@@ -0,0 +1,16 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Terrarum (no prebuild, release-mode assets)" type="JarApplication">
<option name="JAR_PATH" value="$PROJECT_DIR$/out/TerrarumBuild.jar" />
<option name="VM_PARAMETERS" value="-ea -Dswing.aatext=true -Dawt.useSystemAAFontSettings=lcd" />
<option name="PROGRAM_PARAMETERS" value="--assets buildapp/out/assets.tevd" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="ALTERNATIVE_JRE_PATH" value="17" />
<module name="TerrarumBuild" />
<method v="2">
<option name="BuildArtifacts" enabled="true">
<artifact name="TerrarumBuild" />
</option>
<option name="RunConfigurationTask" enabled="false" run_configuration_name="QuickDirtyLint" run_configuration_type="Application" />
</method>
</configuration>
</component>

1
.idea/vcs.xml generated
View File

@@ -2,5 +2,6 @@
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$/Terrarum.wiki" vcs="Git" />
</component>
</project>

176
CLAUDE.md Normal file
View File

@@ -0,0 +1,176 @@
# Terrarum
A modular 2D side-scrolling tilemap platformer engine and game, built on LibGDX with Kotlin/Java. GPL-3.0.
## Build & Run
- **IDE**: IntelliJ IDEA (project files: `Terrarum_renewed.iml`, `TerrarumBuild.iml`)
- **JDK**: 21
- **Language**: Kotlin + Java mixed; Kotlin is primary, `App.java` and `FrameBufferManager.java` are Java
- **Dependencies**: All libraries are in `lib/` (fat-jar approach, no Maven/Gradle). Includes LibGDX, GraalVM JS (modified), dyn4j (Vector2 only), custom bitmap font lib
- **Entry point**: `net.torvald.terrarum.Principii.main()` (Java) which launches `App` (the LibGDX `ApplicationListener`)
- **Distribution**: `buildapp/` scripts produce per-platform bundles with jlink'd runtimes
- **Assets**: `assets/` for development, `assets_release/` for distribution. Custom `.tevd` archive format for release assets (`AssetCache.kt`)
## Project Structure
```
src/net/torvald/terrarum/
App.java -- Main application class (LibGDX ApplicationListener). GL thread, render loop, splash screen
CommonResourcePool.kt -- Thread-safe GL resource loading with dispatch queues
ModMgr.kt -- Module manager. Scans/loads game modules, provides getGdxFile/getJavaClass
IngameInstance.kt -- Base class for game screens (show/hide/render/resize lifecycle)
Terrarum.kt -- Game-level singleton (ingame instance management, extension functions)
GameUpdateGovernor.kt -- Update/render tick governors (ConsistentUpdateRate, Anarchy)
MusicService.kt -- Music playback management
modulebasegame/
EntryPoint.kt -- Basegame module entry point (registers items, fixtures, blocks, weather)
TitleScreen.kt -- Title screen (demo world rendering, async loading)
TerrarumIngame.kt -- Main gameplay screen
IngameRenderer.kt -- World rendering pipeline (FBO composition, lightmap, blur, shadows)
BuildingMaker.kt -- Building editor screen
worlddrawer/
WorldCamera.kt -- Camera position tracking (follows player, interpolated movement)
LightmapRenderer.kt -- Per-tile RGB+UV light calculation and rasterisation
BlocksDrawer.kt -- Tile rendering
FeaturesDrawer.kt -- Wire/feature overlay rendering
gamecontroller/
IME.kt -- Input Method Engine (GraalVM JS keyboard layouts, loaded on daemon thread)
weather/
WeatherMixer.kt -- Weather state machine, skybox rendering
SkyboxModelHosek.kt -- Physically-based sky model
```
## Architecture: Threading & GL Dispatch
All OpenGL calls (Texture, ShaderProgram, FrameBuffer creation) **must** happen on the GL thread. The codebase uses a dispatch mechanism to safely create GL resources from background threads.
### CommonResourcePool (the dispatch hub)
```
Background Thread GL Thread (App.render)
| |
|-- addToLoadingList("name", { Texture() })|
|-- loadAll() |
| | |
| +-- if on GL thread: run directly |
| +-- if not: enqueue to |
| glDispatchQueue + latch.await() |
| CommonResourcePool.update()
| |-- poll glDispatchQueue
| | run loadfun, latch.countDown()
| |-- poll glRunnableQueue
| | run block, latch.countDown()
| |-- poll slowLoadingQueue (one per tick)
| |
+-- latch released, continues <------------+
```
Key methods:
- `loadAll()` -- batch load; blocks background thread until GL thread processes
- `loadAllSlowly()` -- timesliced; one resource per tick via `update()`
- `runOnGLThread { }` -- run arbitrary block on GL thread, blocking caller
- `update()` -- called every tick from `App.render()`, processes all queues
- `getOrPut(name, loadfun, killfun)` -- thread-safe get-or-create with GL dispatch
### App.java Boot Sequence
```
create()
-> postInit() [GL thread, synchronous]
|-- load shaders, fonts, audio device, IME
|-- CommonResourcePool.setGLThread(currentThread)
|-- spawn Terrarum-PostInitLoader thread:
| ModMgr.invoke() // module entry points (dispatched to GL via runOnGLThread)
| CommonResourcePool.loadAllSlowly() // timesliced resource loading
| loadingThreadDone = true
+-- return (non-blocking)
render() loop [GL thread]
while currentScreen == null:
|-- drawSplash()
|-- CommonResourcePool.update() // process GL dispatch queues
|-- when loadingThreadDone && loaded:
| postLoadInit() // tile atlas, audio mixer, Terrarum.initialise()
| setScreen(titleScreen) // transitions to title screen
```
### TitleScreen Async Loading
`TitleScreen.show()` returns immediately after starting a background thread. The splash screen continues displaying until all loading completes.
```
show()
|-- quick GL setup (viewport, input processor, FBO, savegame list)
|-- spawn Terrarum-TitleScreenLoader thread:
| load demo world, compute camera nodes, bogoflops, audio reset
| backgroundLoadDone = true
+-- return
renderImpl() [GL thread, every frame]
if !loadDone:
|-- App.drawSplash()
|-- processGLLoadStep() // state machine, one step per frame:
| 0: wait for backgroundLoadDone
| 1: SkyboxModelHosek.loadlut()
| 2: IngameRenderer.setRenderedWorld + WeatherMixer init
| 3: load halfgrad texture
| 4: UIFakeGradOverlay
| 5: UIFakeBlurOverlay
| 6: UIRemoCon
| 7: MusicService.enterScene, gameUpdateGovernor.reset(), loadDone=true
else:
normal title screen rendering (world + UI via IngameRenderer)
```
### IME Loading
`IME.kt` object `init {}` spawns a `Terrarum-IMELoader` daemon thread for GraalVM JS context binding and key layout/IME file scanning. Icon texture loading remains synchronous (requires GL thread).
### ModMgr Class Initialisation
`ModMgr.kt` object `init {}` only does metadata loading and class instantiation (fast). The heavy `invoke()` method runs entry points wrapped in `CommonResourcePool.runOnGLThread { }` to avoid GL calls on the wrong thread. This separation prevents `<clinit>` lock deadlocks where a background thread holding the class init lock blocks on a GL dispatch latch while the GL thread tries to access the same class.
## Architecture: Rendering Pipeline
### IngameRenderer
Singleton object. Lazily initialised on first `invoke()` call via `invokeInit()`.
Render path (per frame):
1. `LightmapRenderer.recalculate()` -- every 3 frames, computes per-tile RGBA light values
2. `prepLightmapRGBA()` -- Kawase blur on lightmap into `lightmapFbo`
3. `BlocksDrawer.renderData()` -- prepare tile draw data
4. `drawToRGB()` -- render world tiles + actors into `fboRGB` (with shadow FBOs)
5. `drawToA()` -- render alpha/glow channel
6. Composite: sky -> world -> light multiply -> emissive blend -> vibrancy -> UI
7. Output to `App.renderFBO`, then `TerrarumPostProcessor.draw()` applies final effects
**Critical ordering in `resize()`**: `BlocksDrawer.resize()` and `LightmapRenderer.resize()` must be called **before** `lightmapFbo` creation, because `lightmapFbo` dimensions derive from `LightmapRenderer.lightBuffer` size.
### WorldCamera
Follows an `ActorWithBody` (player or camera actor). Position interpolated per frame. `WorldCamera.x/y` = top-left corner of visible area. `gdxCamX/Y` = centre of visible area. `moveCameraToWorldCoord()` positions the IngameRenderer camera for world-space drawing; `setCameraPosition(0,0)` positions it for screen-space drawing.
### FBO Extension Functions
- `FrameBuffer.inAction(camera, batch) { }` -- bind FBO, set camera to FBO dimensions (Y-down), run block, restore camera to screen dimensions
- `FrameBuffer.inActionF(camera, batch) { }` -- same but Y-up (for flipped FBO content)
Both save/restore `camera.position` and call `setToOrtho` with `App.scr.wf/hf` on exit.
## Key Conventions
- **GL thread safety**: Any code creating `Texture`, `TextureRegion`, `TextureRegionPack`, `ShaderProgram`, `FrameBuffer`, or `Pixmap` must run on the GL thread. Use `CommonResourcePool.runOnGLThread { }` when on a background thread.
- **Kotlin `object` singletons**: First access triggers `<clinit>`. Keep `init {}` blocks fast (no blocking, no GL dispatch). Defer heavy work to explicit `invoke()` methods.
- **`ConcurrentHashMap` cannot store null values**. Use `HashMap` for maps that need nullable values (e.g. `poolKillFun`).
- **`@Volatile`** for cross-thread boolean flags (`loadDone`, `backgroundLoadDone`, etc.)
- **`lateinit var` guards**: Use `::prop.isInitialized` checks in `resize()` and `dispose()` for properties set during async loading steps.
- **`ConsistentUpdateRate`**: Accumulates delta time; may call `updateFunction` multiple times before `renderFunction`. Call `.reset()` before transitioning to active rendering to avoid catch-up storms.
- **Textures**: Use TGA format. Images with semitransparency must be TGA; opaque images may be PNG.
- **Coordinate system**: Y-down (camera `setToOrtho(true, ...)`). `setCameraPosition(0, 0)` places origin at screen top-left.
- **ROUNDWORLD**: World wraps horizontally. `WorldCamera.x` uses `fmod worldWidth`. Lightmap and tile drawing account for wrapping.

View File

@@ -13,10 +13,9 @@
<orderEntry type="library" scope="PROVIDED" name="TerrarumSansBitmap" level="project" />
<orderEntry type="library" scope="PROVIDED" name="badlogicgames.gdx" level="project" />
<orderEntry type="library" scope="PROVIDED" name="badlogicgames.gdx.backend.lwjgl3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="KotlinJavaRuntime" level="project" />
<orderEntry type="library" scope="PROVIDED" name="jetbrains.kotlin.reflect" level="project" />
<orderEntry type="library" scope="PROVIDED" name="jetbrains.kotlin.test" level="project" />
<orderEntry type="library" scope="PROVIDED" name="io.airlift.aircompressor" level="project" />
<orderEntry type="library" scope="PROVIDED" name="jetbrains.kotlin.test1" level="project" />
<orderEntry type="library" name="gdx-platform-1.12.1-natives-arm64-v8a" level="project" />
<orderEntry type="library" name="TerranVirtualDisk" level="project" />
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
</component>
</module>

View File

@@ -1,5 +1,7 @@
package net.torvald.terrarum.modulecomputers
import net.torvald.terrarum.CommonResourcePool
import net.torvald.terrarum.ItemSheet
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.ModuleEntryPoint
@@ -11,7 +13,17 @@ class EntryPoint : ModuleEntryPoint() {
private val moduleName = "dwarventech"
override fun invoke() {
// load common resources to the AssetsManager
CommonResourcePool.addToLoadingList("$moduleName.items") {
ItemSheet(ModMgr.getGdxFile(moduleName, "items/items.tga"))
}
CommonResourcePool.loadAll()
ModMgr.GameItemLoader.invoke(moduleName)
ModMgr.GameBlockLoader.invoke(moduleName)
ModMgr.GameWatchdogLoader.register(moduleName, NetFrameWatchdog())
println("[${moduleName[0].toUpperCase()}${moduleName.substring(1)}] Dirtboard(tm) go drrrrr")
}

View File

@@ -0,0 +1,17 @@
package net.torvald.terrarum.modulecomputers
import net.torvald.terrarum.App
import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.modulebasegame.TerrarumWorldWatchdog
import net.torvald.terrarum.modulebasegame.gameworld.NetRunner
/**
* Created by minjaesong on 2025-03-02.
*/
class NetFrameWatchdog : TerrarumWorldWatchdog(App.TICK_SPEED * 60) {
override fun invoke(world: GameWorld) {
(world.extraFields["tokenring"] as? NetRunner)?.let {
it.purgeDeadFrames()
}
}
}

View File

@@ -0,0 +1,135 @@
package net.torvald.terrarum.modulecomputers.gameactors
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.modulebasegame.gameactors.BlockBox
import net.torvald.terrarum.modulebasegame.gameactors.Electric
import net.torvald.terrarum.modulebasegame.gameitems.FixtureItemBase
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
/**
* Created by minjaesong on 2025-03-30.
*/
class FixtureComputerConsole : Electric {
@Transient override val spawnNeedsStableFloor = true
@Transient override val spawnNeedsWall = false
constructor() : super(
BlockBox(BlockBox.ALLOW_MOVE_DOWN, 2, 2),
nameFun = { Lang["ITEM_COMPUTER_CONSOLE"] }
)
init {
val itemImage = FixtureItemBase.getItemImageFromSingleImage("dwarventech", "sprites/fixtures/computer_operator_terminal.tga")
makeNewSprite(TextureRegionPack(itemImage.texture, 2*TILE_SIZE, 2*TILE_SIZE)).let {
it.setRowsAndFrames(1,1)
}
setWireSinkAt(0, 1, "io_bus")
setWireSinkAt(1, 1, "power_low")
}
}
/**
* Created by minjaesong on 2025-03-30.
*/
class FixtureComputerProcessor : Electric {
@Transient override val spawnNeedsStableFloor = true
@Transient override val spawnNeedsWall = false
constructor() : super(
BlockBox(BlockBox.ALLOW_MOVE_DOWN, 2, 3),
nameFun = { Lang["ITEM_COMPUTER_PROCESSOR"] }
)
init {
val itemImage = FixtureItemBase.getItemImageFromSingleImage("dwarventech", "sprites/fixtures/computer_cpu.tga")
makeNewSprite(TextureRegionPack(itemImage.texture, 2*TILE_SIZE, 3*TILE_SIZE)).let {
it.setRowsAndFrames(1,1)
}
setWireSinkAt(0, 0, "memory_bus")
setWireSinkAt(0, 1, "serial")
setWireSinkAt(1, 1, "serial")
setWireSinkAt(0, 2, "io_bus")
setWireSinkAt(1, 2, "power_low")
}
}
/**
* Created by minjaesong on 2025-04-01.
*/
class FixtureNetworkInterface : Electric {
@Transient override val spawnNeedsStableFloor = true
@Transient override val spawnNeedsWall = false
constructor() : super(
BlockBox(BlockBox.ALLOW_MOVE_DOWN, 2, 3),
nameFun = { Lang["ITEM_NETWORK_INTERFACE"] }
)
init {
val itemImage = FixtureItemBase.getItemImageFromSingleImage("dwarventech", "sprites/fixtures/computer_network_interface.tga")
makeNewSprite(TextureRegionPack(itemImage.texture, 2*TILE_SIZE, 3*TILE_SIZE)).let {
it.setRowsAndFrames(1,1)
}
setWireSinkAt(0, 0, "token_ring")
setWireSinkAt(1, 0, "token_ring")
setWireSinkAt(0, 2, "serial")
setWireSinkAt(1, 2, "power_low")
}
}
/**
* Created by minjaesong on 2025-04-01.
*/
class FixtureNetworkBridge : Electric {
@Transient override val spawnNeedsStableFloor = true
@Transient override val spawnNeedsWall = false
constructor() : super(
BlockBox(BlockBox.ALLOW_MOVE_DOWN, 2, 3),
nameFun = { Lang["ITEM_NETWORK_BRIDGE"] }
)
init {
val itemImage = FixtureItemBase.getItemImageFromSingleImage("dwarventech", "sprites/fixtures/computer_network_bridge.tga")
makeNewSprite(TextureRegionPack(itemImage.texture, 2*TILE_SIZE, 3*TILE_SIZE)).let {
it.setRowsAndFrames(1,1)
}
setWireSinkAt(0, 0, "token_ring")
setWireSinkAt(1, 0, "token_ring")
setWireSinkAt(0, 1, "token_ring")
setWireSinkAt(1, 1, "token_ring")
setWireSinkAt(1, 2, "power_low")
}
}
/**
* Created by minjaesong on 2025-04-01.
*/
class FixtureMemoryCabinet : Electric {
@Transient override val spawnNeedsStableFloor = true
@Transient override val spawnNeedsWall = false
constructor() : super(
BlockBox(BlockBox.ALLOW_MOVE_DOWN, 2, 3),
nameFun = { Lang["ITEM_MEMORY_CABINET"] }
)
init {
val itemImage = FixtureItemBase.getItemImageFromSingleImage("dwarventech", "sprites/fixtures/computer_memory_stack_1.tga")
makeNewSprite(TextureRegionPack(itemImage.texture, 1*TILE_SIZE, 3*TILE_SIZE)).let {
it.setRowsAndFrames(1,1)
}
setWireSinkAt(0, 0, "memory_bus")
}
}

View File

@@ -0,0 +1,289 @@
package net.torvald.terrarum.modulecomputers.gameactors
import com.badlogic.gdx.utils.Queue
import net.torvald.random.HQRNG
import net.torvald.terrarum.INGAME
import net.torvald.terrarum.Point2i
import net.torvald.terrarum.modulebasegame.gameactors.BlockBox
import net.torvald.terrarum.modulebasegame.gameactors.Electric
import net.torvald.terrarum.modulebasegame.gameworld.NetFrame
import net.torvald.terrarum.modulebasegame.gameworld.NetRunner
import net.torvald.terrarum.ui.UICanvas
import org.dyn4j.geometry.Vector2
import kotlin.math.sign
/**
* Created by minjaesong on 2025-03-01.
*/
open class FixtureRingBusCore : Electric {
@Transient private val rng = HQRNG()
val mac = rng.nextInt()
companion object {
const val INITIAL_LISTENING_TIMEOUT = 300
const val SIGNAL_TOO_WEAK_THRESHOLD = 1.0 / 16.0
}
private constructor() : super()
private var portEmit = Point2i(0, 0)
private var portSink = Point2i(1, 0)
constructor(portEmit: Point2i, portSink: Point2i, blockBox: BlockBox, nameFun: () -> String) : super(
blockBox0 = blockBox,
nameFun = nameFun,
) {
this.portEmit = portEmit
this.portSink = portSink
}
private fun setEmitterAndSink() {
clearStatus()
setWireEmitterAt(portEmit.x, portEmit.y, "10base2")
setWireSinkAt(portSink.x, portSink.y, "10base2")
}
init {
setEmitterAndSink()
if (!INGAME.world.extraFields.containsKey("tokenring")) {
INGAME.world.extraFields["tokenring"] = NetRunner()
}
}
override fun reload() {
super.reload()
setEmitterAndSink()
if (!INGAME.world.extraFields.containsKey("tokenring")) {
INGAME.world.extraFields["tokenring"] = NetRunner()
}
}
internal val msgQueue = Queue<Pair<Int, ByteArray>>()
internal val msgLog = Queue<Pair<Int, NetFrame>>()
private var statusAbort = false
private var activeMonitorStatus = 0 // 0: unknown, 1: known and not me, 2: known and it's me
private var lastAccessTime = -1L
open protected val ringBusFirmware = RingBusFirmware(0)
private enum class RingBusState {
NORMAL,
ABORT, // will "eat away" any receiving frames unless the frame is a ballot frame
ELECTING,
IVE_GOT_ELECTED
}
private var currentState = RingBusState.NORMAL
override fun updateSignal() {
val time_t = INGAME.world.worldTime.TIME_T
if (lastAccessTime == -1L) lastAccessTime = time_t
// monitor the input port
val inn = getWireStateAt(1, 0, "10base2")
// if a signal is there
if (inn.x >= SIGNAL_TOO_WEAK_THRESHOLD) {
lastAccessTime = time_t
val frameNumber = (inn.y + (0.5 * inn.y.sign)).toInt()
if (frameNumber != 0) { // frame number must be non-zero
processFrameBasedOnState(frameNumber)
} else {
setWireEmissionAt(portEmit.x, portEmit.y, Vector2())
}
} else {
handleNoSignal(time_t)
}
}
private fun processFrameBasedOnState(frameNumber: Int) {
try {
val frame = getFrameByNumber(frameNumber)
when (currentState) {
RingBusState.NORMAL -> handleNormalState(frame, frameNumber)
RingBusState.ABORT -> handleAbortState(frame, frameNumber)
RingBusState.ELECTING -> handleElectingState(frame, frameNumber)
RingBusState.IVE_GOT_ELECTED -> handleIveGotElectedState(frame, frameNumber)
}
} catch (e: NullPointerException) {
handleFrameLoss()
}
}
private fun handleNormalState(frame: NetFrame, frameNumber: Int) {
if (msgQueue.notEmpty() || frame.shouldIintercept(mac)) {
val newFrame = doSomethingWithFrame(frame) ?: frameNumber
setWireEmissionAt(portEmit.x, portEmit.y, Vector2(1.0, newFrame.toDouble()))
if (newFrame != frameNumber) {
frame.discardFrame()
}
} else {
setWireEmissionAt(portEmit.x, portEmit.y, Vector2(1.0, frameNumber.toDouble()))
}
}
private fun handleAbortState(frame: NetFrame, frameNumber: Int) {
if (frame.getFrameType() == "token") {
currentState = RingBusState.NORMAL
setWireEmissionAt(portEmit.x, portEmit.y, Vector2(1.0, frameNumber.toDouble()))
} else if (frame.getFrameType() == "abort") {
setWireEmissionAt(portEmit.x, portEmit.y, Vector2(1.0, frameNumber.toDouble()))
} else {
setWireEmissionAt(portEmit.x, portEmit.y, Vector2())
}
}
private fun handleElectingState(frame: NetFrame, frameNumber: Int) {
if (frame.getFrameType() == "ballot") {
if (frame.getBallot() < mac) {
frame.setBallot(mac)
}
if (frame.getSender() == mac && frame.getBallot() == mac) {
currentState = RingBusState.IVE_GOT_ELECTED
// elected Active Monitor sends out the first token
val newFrame = emitNewFrame(NetFrame.makeToken(mac))
setWireEmissionAt(portEmit.x, portEmit.y, Vector2(1.0, newFrame.toDouble()))
} else {
setWireEmissionAt(portEmit.x, portEmit.y, Vector2(1.0, frameNumber.toDouble()))
}
} else {
setWireEmissionAt(portEmit.x, portEmit.y, Vector2(1.0, frameNumber.toDouble()))
}
}
private fun handleIveGotElectedState(frame: NetFrame, frameNumber: Int) {
if (frame.getFrameType() == "abort") {
// immediately return to normal state
val newFrame = emitNewFrame(NetFrame.makeToken(mac))
currentState = RingBusState.NORMAL
setWireEmissionAt(portEmit.x, portEmit.y, Vector2(1.0, newFrame.toDouble()))
} else {
// make sure to skip a turn after the election, even if the NIC has something to send out
currentState = RingBusState.NORMAL
setWireEmissionAt(portEmit.x, portEmit.y, Vector2())
}
}
private fun handleFrameLoss() {
emitNewFrame(NetFrame.makeAbort(mac))
currentState = RingBusState.ABORT
}
private fun handleNoSignal(time_t: Long) {
setWireEmissionAt(portEmit.x, portEmit.y, Vector2())
if (time_t - lastAccessTime > INITIAL_LISTENING_TIMEOUT) {
currentState = RingBusState.ELECTING
emitNewFrame(NetFrame.makeBallot(mac))
lastAccessTime = time_t
}
}
protected fun doSomethingWithFrame(incomingFrame: NetFrame): Int? {
return when (incomingFrame.getFrameType()) {
"token" -> doSomethingWithToken(incomingFrame)
"data" -> doSomethingWithData(incomingFrame)
"ack" -> doSomethingWithAck(incomingFrame)
"ballot" -> doSomethingWithBallot(incomingFrame)
"abort" -> 0
else -> null /* returns the frame untouched */
}
}
private fun getFrameByNumber(number: Int) = (INGAME.world.extraFields["tokenring"] as NetRunner)[number]
private fun emitNewFrame(frame: NetFrame): Int {
return (INGAME.world.extraFields["tokenring"] as NetRunner).addFrame(frame).also {
setWireEmissionAt(portEmit.x, portEmit.y, Vector2(1.0, it.toDouble()))
}
}
protected fun doSomethingWithToken(incomingFrame: NetFrame): Int? {
if (msgQueue.isEmpty) return null
val (recipient, msgByte) = msgQueue.removeFirst()
return emitNewFrame(NetFrame.makeData(mac, recipient, msgByte))
}
protected fun doSomethingWithData(incomingFrame: NetFrame): Int? {
val rec = incomingFrame.getDataRecipient()
// if the message is for me, put incoming message into queue, then send out ack
if (rec == mac) {
msgLog.addLast(rec to incomingFrame)
val datagramme = incomingFrame.getDataContents()
val (ret, nextMsg) = if (datagramme == null) (-1 to null) else ringBusFirmware.workWithDataFrame(mac, datagramme)
// make ack
return emitNewFrame(NetFrame.makeAck(mac, incomingFrame.getSender(), ret))
}
else return null
}
protected fun doSomethingWithAck(incomingFrame: NetFrame): Int? {
if (msgQueue.isEmpty) return null
val topMsg = msgQueue.first()
// if the ACK is sent to me...
if (incomingFrame.getDataRecipient() == mac && incomingFrame.getSender() == topMsg.first) {
// ack or nak?
val successful = (incomingFrame.getAckStatus() == 0)
// if successful, remove the message from the queue, then send out empty token
// if failed, keep the message, then send out empty token anyway
if (successful) {
msgQueue.removeFirst()
}
// make an empty token
return emitNewFrame(NetFrame.makeToken(mac))
}
else return null
}
protected fun doSomethingWithBallot(incomingFrame: NetFrame): Int? {
val ballotStatus = incomingFrame.getFrameNumber()
// frame is in election phase
if (ballotStatus == 0) {
// if i'm also in the election phase, participate
if (activeMonitorStatus == 0) {
if (incomingFrame.getBallot() < mac) {
incomingFrame.setBallot(mac)
}
// check if the election must be finished
if (incomingFrame.getSender() == mac && incomingFrame.getBallot() == mac) {
activeMonitorStatus = 2
// send out first empty token
return emitNewFrame(NetFrame.makeToken(mac))
}
}
// if i'm in the winner announcement phase, kill the frame
else {
incomingFrame.discardFrame()
return 0
}
}
// frame is in winner announcement phase
else if (ballotStatus == 1) {
activeMonitorStatus = 1
}
return null
}
}

View File

@@ -0,0 +1,62 @@
package net.torvald.terrarum.modulecomputers.gameactors
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.App
import net.torvald.terrarum.Point2i
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.modulebasegame.gameactors.BlockBox
import net.torvald.terrarum.modulebasegame.gameworld.NetFrame.Companion.toMAC
import net.torvald.terrarum.modulecomputers.ui.UIRingBusAnalyser
import net.torvald.terrarum.modulecomputers.ui.UIRingBusExerciser
/**
* Created by minjaesong on 2025-03-03.
*/
class FixtureRingBusExerciser : FixtureRingBusCore {
constructor() : super(
portEmit = Point2i(0, 0),
portSink = Point2i(1, 0),
blockBox = BlockBox(BlockBox.NO_COLLISION, 2, 2),
nameFun = { Lang["ITEM_DEBUG_RING_BUS_EXERCISER"] }
) {
this.mainUI = UIRingBusExerciser(this)
}
override fun drawBody(frameDelta: Float, batch: SpriteBatch) {
super.drawBody(frameDelta, batch)
// draw its own MAC address
drawUsingDrawFunInGoodPosition(frameDelta) { x, y ->
App.fontSmallNumbers.draw(batch, super.mac.toMAC(), x, y + 2*TILE_SIZE - 12)
}
}
}
/**
* Created by minjaesong on 2025-03-03.
*/
class FixtureRingBusAnalyser : FixtureRingBusCore {
constructor() : super(
portEmit = Point2i(0, 0),
portSink = Point2i(1, 0),
blockBox = BlockBox(BlockBox.NO_COLLISION, 2, 1),
nameFun = { Lang["ITEM_DEBUG_RING_BUS_ANALYSER"] },
) {
this.mainUI = UIRingBusAnalyser(this)
}
override fun drawBody(frameDelta: Float, batch: SpriteBatch) {
super.drawBody(frameDelta, batch)
// draw its own MAC address
drawUsingDrawFunInGoodPosition(frameDelta) { x, y ->
App.fontSmallNumbers.draw(batch, super.mac.toMAC(), x, y + 1*TILE_SIZE - 12)
}
}
}

View File

@@ -0,0 +1,60 @@
package net.torvald.terrarum.modulecomputers.gameactors
import net.torvald.terrarum.serialise.*
open class RingBusFirmware(val devtype: Int) {
fun workWithDataFrame(hostMAC: Int, datagramme: ByteArray): Pair<Int, ByteArray?> {
if (datagramme.size < 12) return -1 to null
val protocol = datagramme[0].toUint()
val mode = datagramme[1].toUint()
val arg1 = datagramme.toBigInt16(2)
val recipient = datagramme.toBigInt32(4)
val sender = datagramme.toBigInt32(8)
val body = datagramme.sliceArray(12 until datagramme.size)
return invoke(hostMAC, protocol, mode, arg1, recipient, sender, body, datagramme)
}
open fun invoke(hostMAC: Int, protocol: Int, mode: Int, arg1: Int, recipient: Int, sender: Int, body: ByteArray, datagramme: ByteArray): Pair<Int, ByteArray?> {
return when (protocol) {
1 -> 0 to echo(recipient, sender, body)
2 -> 0 to blockTransfer(arg1, recipient, sender, body)
4 -> 0 to deviceDiscovery(hostMAC, datagramme)
else -> -1 to null
}
}
open fun echo(recipient: Int, sender: Int, body: ByteArray): ByteArray {
return ByteArray(8 + body.size).makeEmptyPacket(1, 1, 0, recipient, sender).also {
it.writeBigInt48(System.currentTimeMillis(), 12)
System.arraycopy(body, 6, this, 6, body.size - 6)
}
}
open fun blockTransfer(sequence: Int, recipient: Int, sender: Int, body: ByteArray): ByteArray {
return ByteArray(12).makeEmptyPacket(2, 1, sequence, recipient, sender) // always ACK
}
open fun deviceDiscovery(host: Int, wholeMessage: ByteArray): ByteArray {
return ByteArray(wholeMessage.size + 6).also {
System.arraycopy(wholeMessage, 0, it, 0, wholeMessage.size)
it[it.size - 5] = devtype.toByte()
it.writeBigInt32(host, it.size - 4)
}
}
private fun ByteArray.makeEmptyPacket(protocol: Int, mode: Int, arg1: Int, recipient: Int, sender: Int): ByteArray {
this[0] = protocol.toByte()
this[1] = mode.toByte()
this.writeBigInt16(arg1, 2)
this.writeBigInt32(recipient, 4)
this.writeBigInt32(sender, 8)
return this
}
}

View File

@@ -0,0 +1,89 @@
package net.torvald.terrarum.modulecomputers.gameitems
import net.torvald.terrarum.gameitems.ItemID
import net.torvald.terrarum.modulebasegame.gameitems.FixtureItemBase
/**
* Created by minjaesong on 2025-03-30.
*/
class ItemComputerConsole(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulecomputers.gameactors.FixtureComputerConsole") {
override var dynamicID: ItemID = originalID
override var baseMass = 80.0
override val canBeDynamic = false
override val materialId = "STAL"
init {
itemImage = FixtureItemBase.getItemImageFromSingleImage("dwarventech", "sprites/fixtures/computer_operator_terminal.tga")
}
override var baseToolSize: Double? = baseMass
override var originalName = "ITEM_COMPUTER_CONSOLE"
}
/**
* Created by minjaesong on 2025-03-30.
*/
class ItemComputerProcessor(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulecomputers.gameactors.FixtureComputerProcessor") {
override var dynamicID: ItemID = originalID
override var baseMass = 200.0
override val canBeDynamic = false
override val materialId = "STAL"
init {
itemImage = FixtureItemBase.getItemImageFromSingleImage("dwarventech", "sprites/fixtures/computer_cpu.tga")
}
override var baseToolSize: Double? = baseMass
override var originalName = "ITEM_COMPUTER_PROCESSOR"
}
/**
* Created by minjaesong on 2025-04-01.
*/
class ItemNetworkInterface(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulecomputers.gameactors.FixtureNetworkInterface") {
override var dynamicID: ItemID = originalID
override var baseMass = 200.0
override val canBeDynamic = false
override val materialId = "STAL"
init {
itemImage = FixtureItemBase.getItemImageFromSingleImage("dwarventech", "sprites/fixtures/computer_network_interface.tga")
}
override var baseToolSize: Double? = baseMass
override var originalName = "ITEM_NETWORK_INTERFACE"
}
/**
* Created by minjaesong on 2025-04-01.
*/
class ItemNetworkBridge(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulecomputers.gameactors.FixtureNetworkBridge") {
override var dynamicID: ItemID = originalID
override var baseMass = 200.0
override val canBeDynamic = false
override val materialId = "STAL"
init {
itemImage = FixtureItemBase.getItemImageFromSingleImage("dwarventech", "sprites/fixtures/computer_network_bridge.tga")
}
override var baseToolSize: Double? = baseMass
override var originalName = "ITEM_NETWORK_BRIDGE"
}
/**
* Created by minjaesong on 2025-04-01.
*/
class ItemMemoryCabinet(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulecomputers.gameactors.FixtureMemoryCabinet") {
override var dynamicID: ItemID = originalID
override var baseMass = 80.0
override val canBeDynamic = false
override val materialId = "STAL"
init {
itemImage = FixtureItemBase.getItemImageFromSingleImage("dwarventech", "sprites/fixtures/computer_memory_stack_1.tga")
}
override var baseToolSize: Double? = baseMass
override var originalName = "ITEM_MEMORY_CABINET"
}

View File

@@ -19,10 +19,11 @@ class ItemHomeComputer(originalID: ItemID) : FixtureItemBase(originalID, "net.to
override var dynamicID: ItemID = originalID
override var baseMass = 20.0
override val isDynamic = false
override val canBeDynamic = false
override val materialId = ""
override val itemImage: TextureRegion
get() = FixtureItemBase.getItemImageFromSheet("dwarventech", "sprites/fixtures/desktop_computer.tga", TerrarumAppConfiguration.TILE_SIZE, TerrarumAppConfiguration.TILE_SIZE)
init {
itemImage = FixtureItemBase.getItemImageFromSheet("dwarventech", "sprites/fixtures/desktop_computer.tga", TerrarumAppConfiguration.TILE_SIZE, TerrarumAppConfiguration.TILE_SIZE)
}
override var baseToolSize: Double? = baseMass
override var originalName = "ITEM_DESKTOP_COMPUTER"
}

View File

@@ -34,8 +34,9 @@ class ItemWearableWorldRadar(originalID: String) {// : GameItem(originalID) {
override val isUnique = false
override val isDynamic = true
override val materialId = ""
override val itemImage: TextureRegion
get() = FixtureItemBase.getItemImageFromSingleImage("basegame", "sprites/fixtures/signal_source.tga")
init {
itemImage = FixtureItemBase.getItemImageFromSingleImage("basegame", "sprites/fixtures/signal_source.tga")
}
override var baseToolSize: Double? = baseMass
@@ -115,11 +116,11 @@ class WearableWorldRadarUI(val device: VM) : UICanvas() {
override var height = 140
override var openCloseTime = 0f
override fun updateUI(delta: Float) {
override fun updateImpl(delta: Float) {
device.update(delta)
}
override fun renderUI(frameDelta: Float, batch: SpriteBatch, camera: OrthographicCamera) {
override fun renderImpl(frameDelta: Float, batch: SpriteBatch, camera: OrthographicCamera) {
batch.end()
batch.color = Color.WHITE

View File

@@ -0,0 +1,79 @@
package net.torvald.terrarum.modulecomputers.gameitems
import net.torvald.terrarum.CommonResourcePool
import net.torvald.terrarum.WireCodex
import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.gameitems.FixtureInteractionBlocked
import net.torvald.terrarum.gameitems.GameItem
import net.torvald.terrarum.gameitems.ItemID
import net.torvald.terrarum.modulebasegame.gameitems.BlockBase
/**
* Created by minjaesong on 2025-03-30.
*/
class WirePieceNetworkBus(originalID: ItemID, private val atlasID: String, private val sheetX: Int, private val sheetY: Int)
: GameItem(originalID), FixtureInteractionBlocked {
override var dynamicID: ItemID = originalID
override var baseMass = 0.001
override var baseToolSize: Double? = null
override var inventoryCategory = Category.WIRE
override val canBeDynamic = false
override val materialId = ""
init {
itemImage = CommonResourcePool.getAsItemSheet(atlasID).get(sheetX, sheetY)
}
init {
equipPosition = GameItem.EquipPosition.HAND_GRIP
originalName = "ITEM_NETWORK_BUS_WIRE"
tags.addAll(WireCodex[originalID].tags)
}
override fun startPrimaryUse(actor: ActorWithBody, delta: Float): Long {
return BlockBase.wireStartPrimaryUse(actor,this, delta)
}
override fun effectWhileEquipped(actor: ActorWithBody, delta: Float) {
BlockBase.wireEffectWhenEquipped(this, delta)
}
override fun effectOnUnequip(actor: ActorWithBody) {
BlockBase.wireEffectWhenUnequipped(this)
}
}
/**
* Created by minjaesong on 2025-03-30.
*/
class WirePieceIOBus(originalID: ItemID, private val atlasID: String, private val sheetX: Int, private val sheetY: Int)
: GameItem(originalID), FixtureInteractionBlocked {
override var dynamicID: ItemID = originalID
override var baseMass = 0.001
override var baseToolSize: Double? = null
override var inventoryCategory = Category.WIRE
override val canBeDynamic = false
override val materialId = ""
init {
itemImage = CommonResourcePool.getAsItemSheet(atlasID).get(sheetX, sheetY)
}
init {
equipPosition = GameItem.EquipPosition.HAND_GRIP
originalName = "ITEM_IO_BUS_WIRE"
tags.addAll(WireCodex[originalID].tags)
}
override fun startPrimaryUse(actor: ActorWithBody, delta: Float): Long {
return BlockBase.wireStartPrimaryUse(actor,this, delta)
}
override fun effectWhileEquipped(actor: ActorWithBody, delta: Float) {
BlockBase.wireEffectWhenEquipped(this, delta)
}
override fun effectOnUnequip(actor: ActorWithBody) {
BlockBase.wireEffectWhenUnequipped(this)
}
}

View File

@@ -47,10 +47,10 @@ internal class UIHomeComputer : UICanvas(
"$KEYCAP_CTRL$KEYCAP_SHIFT$KEYCAP_R$KEYCAP_S Reset\u3000" +
"$KEYCAP_CTRL$KEYCAP_SHIFT$KEYCAP_R$KEYCAP_Q SysRq"
override fun updateUI(delta: Float) {
override fun updateImpl(delta: Float) {
}
override fun renderUI(frameDelta: Float, otherBatch: SpriteBatch, otherCamera: OrthographicCamera) {
override fun renderImpl(frameDelta: Float, otherBatch: SpriteBatch, otherCamera: OrthographicCamera) {
otherBatch.end()
fbo.inAction(camera, batch) {

View File

@@ -0,0 +1,101 @@
package net.torvald.terrarum.modulecomputers.ui
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.OrthographicCamera
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.App
import net.torvald.terrarum.ifNaN
import net.torvald.terrarum.modulecomputers.gameactors.FixtureRingBusCore
import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.ui.UIItemVertSlider
import net.torvald.terrarum.ui.Toolkit
import kotlin.math.roundToInt
class UIRingBusAnalyser(val host: FixtureRingBusCore) : UICanvas() {
override var width = Toolkit.drawWidth
override var height = App.scr.height
private val analyserPosX = 10
private val analyserPosY = 10
private val analyserWidth = width - 20
private val analyserHeight = height - 20
private val TEXT_LINE_HEIGHT = 24
private var analysisTextBuffer = ArrayList<String>()
private val analyserScroll = UIItemVertSlider(this,
analyserPosX - 18,
analyserPosY + 1,
0.0, 0.0, 1.0, analyserHeight - 2, analyserHeight - 2
)
init {
addUIitem(analyserScroll)
refreshAnalysis()
}
private fun refreshAnalysis() {
analysisTextBuffer.clear()
host.msgLog.forEach { frame ->
analysisTextBuffer.add(frame.toString())
}
// update scrollbar
analyserScroll.handleHeight = if (analysisTextBuffer.isEmpty())
analyserHeight
else
(analyserHeight.toFloat() / analysisTextBuffer.size.times(TEXT_LINE_HEIGHT))
.times(analyserHeight)
.roundToInt()
.coerceIn(12, analyserHeight)
}
private fun drawAnalysis(batch: SpriteBatch) {
val scroll = (analyserScroll.value * analysisTextBuffer.size.times(TEXT_LINE_HEIGHT)
.minus(analyserHeight - 3))
.ifNaN(0.0)
.roundToInt()
.coerceAtLeast(0)
analysisTextBuffer.forEachIndexed { index, s ->
App.fontGame.draw(batch, s,
analyserPosX + 6f,
analyserPosY + 3f + index * TEXT_LINE_HEIGHT - scroll
)
}
}
override fun updateImpl(delta: Float) {
refreshAnalysis()
uiItems.forEach { it.update(delta) }
}
override fun renderImpl(frameDelta: Float, batch: SpriteBatch, camera: OrthographicCamera) {
// Draw background box
batch.color = Color(0x7F)
Toolkit.fillArea(batch, analyserPosX, analyserPosY, analyserWidth, analyserHeight)
batch.color = Toolkit.Theme.COL_INACTIVE
Toolkit.drawBoxBorder(batch, analyserPosX, analyserPosY, analyserWidth, analyserHeight)
// Draw text content
batch.color = Color.WHITE
drawAnalysis(batch)
// Draw UI elements
uiItems.forEach { it.render(frameDelta, batch, camera) }
}
override fun doOpening(delta: Float) {
refreshAnalysis()
}
override fun doClosing(delta: Float) {
// nothing needed
}
override fun dispose() {
}
}

View File

@@ -0,0 +1,101 @@
package net.torvald.terrarum.modulecomputers.ui
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.OrthographicCamera
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.App
import net.torvald.terrarum.ifNaN
import net.torvald.terrarum.modulecomputers.gameactors.FixtureRingBusCore
import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.ui.UIItemVertSlider
import net.torvald.terrarum.ui.Toolkit
import kotlin.math.roundToInt
class UIRingBusExerciser(val host: FixtureRingBusCore) : UICanvas() {
override var width = Toolkit.drawWidth
override var height = App.scr.height
private val analyserPosX = 10
private val analyserPosY = 10
private val analyserWidth = width - 20
private val analyserHeight = height - 20
private val TEXT_LINE_HEIGHT = 24
private var analysisTextBuffer = ArrayList<String>()
private val analyserScroll = UIItemVertSlider(this,
analyserPosX - 18,
analyserPosY + 1,
0.0, 0.0, 1.0, analyserHeight - 2, analyserHeight - 2
)
init {
addUIitem(analyserScroll)
refreshAnalysis()
}
private fun refreshAnalysis() {
analysisTextBuffer.clear()
host.msgLog.forEach { frame ->
analysisTextBuffer.add(frame.toString())
}
// update scrollbar
analyserScroll.handleHeight = if (analysisTextBuffer.isEmpty())
analyserHeight
else
(analyserHeight.toFloat() / analysisTextBuffer.size.times(TEXT_LINE_HEIGHT))
.times(analyserHeight)
.roundToInt()
.coerceIn(12, analyserHeight)
}
private fun drawAnalysis(batch: SpriteBatch) {
val scroll = (analyserScroll.value * analysisTextBuffer.size.times(TEXT_LINE_HEIGHT)
.minus(analyserHeight - 3))
.ifNaN(0.0)
.roundToInt()
.coerceAtLeast(0)
analysisTextBuffer.forEachIndexed { index, s ->
App.fontGame.draw(batch, s,
analyserPosX + 6f,
analyserPosY + 3f + index * TEXT_LINE_HEIGHT - scroll
)
}
}
override fun updateImpl(delta: Float) {
refreshAnalysis()
uiItems.forEach { it.update(delta) }
}
override fun renderImpl(frameDelta: Float, batch: SpriteBatch, camera: OrthographicCamera) {
// Draw background box
batch.color = Color(0x7F)
Toolkit.fillArea(batch, analyserPosX, analyserPosY, analyserWidth, analyserHeight)
batch.color = Toolkit.Theme.COL_INACTIVE
Toolkit.drawBoxBorder(batch, analyserPosX, analyserPosY, analyserWidth, analyserHeight)
// Draw text content
batch.color = Color.WHITE
drawAnalysis(batch)
// Draw UI elements
uiItems.forEach { it.render(frameDelta, batch, camera) }
}
override fun doOpening(delta: Float) {
refreshAnalysis()
}
override fun doClosing(delta: Float) {
// nothing needed
}
override fun dispose() {
}
}

View File

@@ -7,12 +7,12 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" scope="PROVIDED" name="jetbrains.kotlin.test" level="project" />
<orderEntry type="module" module-name="TerrarumBuild" scope="PROVIDED" />
<orderEntry type="library" scope="PROVIDED" name="badlogicgames.gdx" level="project" />
<orderEntry type="library" scope="PROVIDED" name="io.airlift.aircompressor" level="project" />
<orderEntry type="library" scope="PROVIDED" name="TerrarumSansBitmap" level="project" />
<orderEntry type="library" scope="PROVIDED" name="apache.commons.math3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="jetbrains.kotlin.test1" level="project" />
<orderEntry type="library" name="gdx-platform-1.12.1-natives-arm64-v8a" level="project" />
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
</component>
</module>

View File

@@ -1,17 +1,16 @@
package net.torvald.terrarum.musicplayer
import net.torvald.terrarum.IngameInstance
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.ModuleEntryPoint
import net.torvald.terrarum.modulebasegame.TerrarumIngame
import net.torvald.terrarum.musicplayer.gui.MusicPlayer
import net.torvald.terrarum.musicplayer.gui.MusicPlayerControl
/**
* Created by minjaesong on 2023-12-23.
*/
class EntryPoint : ModuleEntryPoint() {
override fun invoke() {
ModMgr.GameExtraGuiLoader.register { ingame: TerrarumIngame -> MusicPlayer(ingame) }
ModMgr.GameExtraGuiLoader.register { ingame: TerrarumIngame -> MusicPlayerControl(ingame) }
}
override fun dispose() {

View File

@@ -10,13 +10,13 @@ import com.badlogic.gdx.utils.JsonValue
import com.jme3.math.FastMath
import net.torvald.reflection.extortField
import net.torvald.terrarum.*
import net.torvald.terrarum.App.printdbg
import net.torvald.terrarum.audio.*
import net.torvald.terrarum.audio.audiobank.MusicContainer
import net.torvald.terrarum.gameworld.fmod
import net.torvald.terrarum.modulebasegame.MusicContainer
import net.torvald.terrarum.modulebasegame.TerrarumIngame
import net.torvald.terrarum.modulebasegame.gameactors.PlaysMusic
import net.torvald.terrarum.ui.BasicDebugInfoWindow
import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.toIntAndFrac
import net.torvald.terrarum.ui.MouseLatch
import net.torvald.terrarum.ui.Toolkit
import net.torvald.terrarum.ui.UICanvas
@@ -33,7 +33,7 @@ import kotlin.math.*
*
* Created by minjaesong on 2023-12-23.
*/
class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
class MusicPlayerControl(private val ingame: TerrarumIngame) : UICanvas() {
private val STRIP_W = 9f
private val METERS_WIDTH = 2 * STRIP_W
@@ -60,6 +60,9 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
private val controlButtons = ModMgr.getGdxFile("musicplayer", "gui/control_buttons.tga").let {
TextureRegionPack(it, BUTTON_WIDTH, BUTTON_HEIGHT)
}
private val progressSheet = ModMgr.getGdxFile("musicplayer", "gui/progress.tga").let {
TextureRegionPack(it, BUTTON_WIDTH, BUTTON_HEIGHT)
}
private val MODE_IDLE = 0
private val MODE_PLAYING = 1
@@ -95,21 +98,19 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
private var currentlySelectedAlbum: AlbumProp? = null
/** Returns the internal playlist of the MusicGovernor */
private val songsInGovernor: List<MusicContainer>
get() = ingame.musicGovernor.extortField<List<MusicContainer>>("songs")!!
private val songsInGovernorrrrrrrrrr: List<MusicContainer>
get() = ingame.musicStreamer.extortField<List<MusicContainer>>("songs")!!
private val shouldPlayerBeDisabled: Boolean
// the value must be "latched" to stay consistent
private fun getCurrentPlaylist() = MusicService.currentPlaylist
/*private val shouldPlayerBeDisabled: Boolean
get() {
return App.audioMixer.dynamicTracks.any { it.isPlaying && it.trackingTarget is PlaysMusic }
}
return MusicService.transactionLocked
//return App.audioMixer.dynamicTracks.any { it.isPlaying && it.trackingTarget is PlaysMusic }
}*/
/** Returns the playlist name from the MusicGovernor. Getting the value from the MusicGovernor
* is recommended as an ingame interaction may cancel the playback from the playlist from the MusicPlayer
* (e.g. interacting with a jukebox) */
private val internalPlaylistName: String
get() = ingame.musicGovernor.playlistName
fun registerPlaylist(path: String, fileToName: JsonValue?, shuffled: Boolean, diskJockeyingMode: String) {
private fun registerPlaylist(path: String, fileToName: JsonValue?, shuffled: Boolean, diskJockeyingMode: String): TerrarumMusicPlaylist {
fun String.isNum(): Boolean {
try {
this.toInt()
@@ -120,7 +121,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
}
}
ingame.musicGovernor.queueDirectory(path, shuffled, diskJockeyingMode) { filename ->
val playlist = TerrarumMusicPlaylist.fromDirectory(path, shuffled, diskJockeyingMode) { filename ->
fileToName?.get(filename).let {
if (it == null)
filename.substringBeforeLast('.').replace('_', ' ').split(" ").map { it.capitalize() }.let {
@@ -136,19 +137,9 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
}
}
ingame.musicGovernor.addMusicStartHook { music ->
setMusicName(music.name)
if (mode <= MODE_PLAYING)
transitionRequest = MODE_PLAYING
}
setPlaylistDisplayVars(playlist)
ingame.musicGovernor.addMusicStopHook { music ->
setIntermission()
if (mode <= MODE_PLAYING)
transitionRequest = MODE_IDLE
}
setPlaylistDisplayVars(songsInGovernor)
return playlist
}
private var currentMusicName = ""
@@ -185,8 +176,11 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
private var mouseOnButton: Int? = null
private var mouseOnList: Int? = null
override fun updateUI(delta: Float) {
val shouldPlayerBeDisabled = shouldPlayerBeDisabled
private var transactionLocked = MusicService.transactionLocked
override fun updateImpl(delta: Float) {
transactionLocked = MusicService.transactionLocked // the value need to be "latched"
val currentPlaylist = getCurrentPlaylist()
// process transition request
if (transitionRequest != null) {
@@ -305,9 +299,13 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
else {
mouseOnButton = null
}
//// manually nullify the buttons that does nothing when locked
if (transactionLocked && mode < MODE_SHOW_LIST && (mouseOnButton == 1 || mouseOnButton == 3)) {
mouseOnButton = null
}
// mouse is over which list
mouseOnList = if (mode >= MODE_SHOW_LIST &&
mouseOnList = if (!transactionLocked && mode >= MODE_SHOW_LIST &&
relativeMouseY.toFloat() in _posY + 9.._posY + 9 + PLAYLIST_LINES*PLAYLIST_LINE_HEIGHT &&
relativeMouseX.toFloat() in _posX.._posX + width) {
@@ -316,7 +314,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
else null
// make button work
// make buttons work
if (mouseUp) mouseLatch.latch {
if (mouseOnButton != null) {
when (mouseOnButton) {
@@ -327,8 +325,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
if (mode < MODE_SHOW_LIST) {
if (!transitionOngoing) {
transitionRequest = MODE_SHOW_LIST
currentListMode =
0 // no list transition anim is needed this time, just set the variable
currentListMode = 0 // no list transition anim is needed this time, just set the variable
resetAlbumlistScroll()
}
}
@@ -338,16 +335,18 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
}
else {
if (!transitionOngoing)
transitionRequest = App.audioMixer.musicTrack.isPlaying.toInt() * MODE_MOUSE_UP
transitionRequest = MODE_MOUSE_UP
}
}
1 -> { // prev
// prev song
if (mode < MODE_SHOW_LIST) {
getPrevSongFromPlaylist()?.let { ingame.musicGovernor.unshiftPlaylist(it) }
App.audioMixer.requestFadeOut(App.audioMixer.musicTrack, AudioMixer.DEFAULT_FADEOUT_LEN / 3f) {
ingame.musicGovernor.startMusic() // required for "intermittent" mode
if (!transactionLocked) {
MusicService.playPrevSongInPlaylist(true) {
iHitTheStopButton = false
stopRequested = false
}
}
}
// prev page in the playlist
@@ -364,25 +363,48 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
}
2 -> { // stop
if (mode < MODE_SHOW_LIST) { // disable stop button entirely on MODE_SHOW_LIST
/*if (mode < MODE_SHOW_LIST) { // disable stop button entirely on MODE_SHOW_LIST
// when the button is STOP
if (App.audioMixer.musicTrack.isPlaying) {
val thisMusic = App.audioMixer.musicTrack.currentTrack
// FIXME the olde way -- must be replaced with one that utilises MusicService
/*val thisMusic = App.audioMixer.musicTrack.currentTrack
App.audioMixer.requestFadeOut(App.audioMixer.musicTrack, AudioMixer.DEFAULT_FADEOUT_LEN / 3f)
App.audioMixer.musicTrack.nextTrack = null
ingame.musicGovernor.stopMusic()
thisMusic?.let { ingame.musicGovernor.queueMusicToPlayNext(it) }
ingame.backgroundMusicPlayer.stopMusic(this)
if (thisMusic is MusicContainer) thisMusic.let { ingame.backgroundMusicPlayer.queueMusicToPlayNext(it) }
iHitTheStopButton = true*/
MusicService.stopPlaylistPlayback(true) {
iHitTheStopButton = true
}
}
else if (!shouldPlayerBeDisabled) {
ingame.musicGovernor.startMusic()
// when the button is PLAY
else if (!App.audioMixer.musicTrack.isPlaying) {
// FIXME the olde way -- must be replaced with one that utilises MusicService
/*ingame.backgroundMusicPlayer.startMusic(this)
iHitTheStopButton = false
stopRequested = false*/
MusicService.resumePlaylistPlayback(
/* onSuccess: () -> Unit */{
iHitTheStopButton = false
stopRequested = false
},
/* onFailure: (Throwable) -> Unit */ {
}
)
}
}
}*/
}
3 -> { // next
// next song
if (mode < MODE_SHOW_LIST) {
App.audioMixer.requestFadeOut(App.audioMixer.musicTrack, AudioMixer.DEFAULT_FADEOUT_LEN / 3f) {
ingame.musicGovernor.startMusic() // required for "intermittent" mode, does seemingly nothing on "continuous" mode
if (!transactionLocked) {
MusicService.playNextSongInPlaylist(true) {
iHitTheStopButton = false
stopRequested = false
}
}
}
// next page in the playlist
@@ -402,8 +424,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
if (mode < MODE_SHOW_LIST) {
if (!transitionOngoing) {
transitionRequest = MODE_SHOW_LIST
currentListMode =
1 // no list transition anim is needed this time, just set the variable
currentListMode = 1 // no list transition anim is needed this time, just set the variable
resetPlaylistScroll()
}
}
@@ -413,31 +434,29 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
}
else {
if (!transitionOngoing)
transitionRequest = App.audioMixer.musicTrack.isPlaying.toInt() * MODE_MOUSE_UP
transitionRequest = MODE_MOUSE_UP
}
}
}
}
// make playlist clicking work
// make playlist clicking (change song within the playlist) work
else if (listViewPanelScroll == 1f && mouseOnList != null) {
val index = playlistScroll + mouseOnList!!
val list = songsInGovernor
if (index < list.size) {
// if selected song != currently playing
if (App.audioMixer.musicTrack.currentTrack == null || list[index] != App.audioMixer.musicTrack.currentTrack) {
// rebuild playlist
ingame.musicGovernor.queueIndexFromPlaylist(index)
// fade out
App.audioMixer.requestFadeOut(App.audioMixer.musicTrack, AudioMixer.DEFAULT_FADEOUT_LEN / 3f) {
if (!shouldPlayerBeDisabled) {
ingame.musicGovernor.startMusic() // required for "intermittent" mode
if (currentPlaylist != null) {
if (index < currentPlaylist.musicList.size) {
// if selected song != currently playing
if (App.audioMixer.musicTrack.currentTrack == null || currentPlaylist.musicList[index] != App.audioMixer.musicTrack.currentTrack) {
if (!transactionLocked) {
MusicService.playNthSongInPlaylist(index, true) {
iHitTheStopButton = false
stopRequested = false
}
}
}
}
}
}
// make album list clicking work
// make album list clicking (send new playlist to the MusicService) work
else if (listViewPanelScroll == 0f && mouseOnList != null) {
val index = albumlistScroll + mouseOnList!!
val list = albumsList//.map { albumPropCache[it] }
@@ -445,14 +464,12 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
if (index < list.size) {
// if selected album is not the same album currently playing, queue that album immediately
// (navigating into the selected album involves too much complication :p)
if (ingame.musicGovernor.playlistSource != albumsList[index].canonicalPath) {
// fade out
App.audioMixer.requestFadeOut(App.audioMixer.musicTrack, AudioMixer.DEFAULT_FADEOUT_LEN / 3f) {
loadNewAlbum(albumsList[index])
if (!shouldPlayerBeDisabled) {
ingame.musicGovernor.startMusic() // required for "intermittent" mode
if (MusicService.currentPlaylist?.source != albumsList[index].canonicalPath) {
if (!transactionLocked) {
val playlist = loadNewAlbum(albumsList[index])
MusicService.putNewPlaylistAndResumePlayback(playlist, true) {
resetPlaylistScroll(App.audioMixer.musicTrack.nextTrack as? MusicContainer)
}
resetPlaylistScroll(App.audioMixer.musicTrack.nextTrack)
}
}
}
@@ -466,22 +483,32 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
// printdbg(this, "mode = $mode; req = $transitionRequest")
if (shouldPlayerBeDisabled) {
ingame.musicGovernor.stopMusic()
// update music name disp
val musicTrack = App.audioMixer.musicTrack
val musicTrackPlaying = musicTrack.isPlaying
val musicNow = musicTrack.currentTrack
//// music changed, do something
if ((oldMusicTrackPlaying && !musicTrack.isPlaying) || (oldSong != null && musicNow == null)) {
setIntermission()
if (mode <= MODE_PLAYING && !transitionOngoing) transitionRequest = MODE_IDLE
}
else if (!jukeboxStopMonitorAlert && !App.audioMixer.musicTrack.isPlaying) {
jukeboxStopMonitorAlert = true
ingame.musicGovernor.stopMusic(false, Math.random().toFloat() * 30f + 30f)
}
else if (App.audioMixer.musicTrack.isPlaying) {
jukeboxStopMonitorAlert = false
else if ((!oldMusicTrackPlaying && musicTrack.isPlaying && musicNow != null) || (oldSong == null && musicNow != null) || (musicNow != oldSong && musicNow != null)) {
setMusicName(musicNow.name)
if (mode <= MODE_PLAYING && !transitionOngoing) transitionRequest = MODE_PLAYING
}
oldSong = musicNow
oldMusicTrackPlaying = musicTrackPlaying
}
private var jukeboxStopMonitorAlert = true
private var oldSong: AudioBank? = null
private var oldMusicTrackPlaying = false
private var iHitTheStopButton = false
private var stopRequested = false
private fun resetAlbumlistScroll() {
val currentlyPlaying = albumsList.indexOfFirst { it.canonicalPath.replace('\\', '/') == ingame.musicGovernor.playlistSource }
val currentlyPlaying = albumsList.indexOfFirst { it.canonicalPath.replace('\\', '/') == MusicService.currentPlaylist?.source }
if (currentlyPlaying >= 0) {
albumlistScroll = (currentlyPlaying / PLAYLIST_LINES) * PLAYLIST_LINES
}
@@ -491,27 +518,21 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
}
private fun resetPlaylistScroll(song: MusicContainer? = null) {
val currentlyPlaying = songsInGovernor.indexOf(song ?: App.audioMixer.musicTrack.currentTrack)
if (currentlyPlaying >= 0) {
playlistScroll = (currentlyPlaying / PLAYLIST_LINES) * PLAYLIST_LINES
val currentPlaylist = getCurrentPlaylist()
if (currentPlaylist != null) {
val currentlyPlaying = currentPlaylist.musicList.indexOf(song ?: App.audioMixer.musicTrack.currentTrack)
if (currentlyPlaying >= 0) {
playlistScroll = (currentlyPlaying / PLAYLIST_LINES) * PLAYLIST_LINES
}
else {
playlistScroll = 0
}
}
else {
playlistScroll = 0
}
}
private fun getPrevSongFromPlaylist(): MusicContainer? {
val list = songsInGovernor.slice(songsInGovernor.indices) // make copy of the list
val nowPlaying = App.audioMixer.musicTrack.currentTrack ?: return null
// find current index
val currentIndex = list.indexOfFirst { it == nowPlaying }
if (currentIndex < 0) return null
val prevIndex = (currentIndex - 1).fmod(list.size)
return list[prevIndex]
}
// private fun smoothstep(x: Float) = (x*x*(3f-2f*x)).coerceIn(0f, 1f)
// private fun smootherstep(x: Float) = (x*x*x*(x*(6f*x-15f)+10f)).coerceIn(0f, 1f)
@@ -629,7 +650,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
get() = relativeMouseX.toFloat() in _posX-capsuleMosaicSize .. _posX+width+capsuleMosaicSize &&
relativeMouseY.toFloat() in _posY .. _posY+height
override fun renderUI(frameDelta: Float, batch: SpriteBatch, camera: OrthographicCamera) {
override fun renderImpl(frameDelta: Float, batch: SpriteBatch, camera: OrthographicCamera) {
widthForFreqMeter = if (transitionOngoing && modeNext >= MODE_MOUSE_UP || mode >= MODE_MOUSE_UP)
uiWidthFromTextWidth(nameLength)
else
@@ -671,6 +692,39 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
drawControls(frameDelta, batch, _posX, posYforControls)
drawList(camera, frameDelta, batch, _posX, _posY)
// debug codes
//// transaction state
/*if (transactionLocked) {
batch.color = Color.RED
Toolkit.drawTextCentered(batch, App.fontSmallNumbers, "LOCKED", Toolkit.drawWidth, 0, _posY.toInt() + height + 5)
}
else {
batch.color = Color.WHITE
Toolkit.drawTextCentered(batch, App.fontSmallNumbers, "UNLOCKED", Toolkit.drawWidth, 0, _posY.toInt() + height + 5)
}
//// MusicService internal state
batch.color = Color.WHITE
val musicState = MusicService.currentPlaybackState.get()
val str = "State: $musicState Wait: ${MusicService.waitAkku.toIntAndFrac(2)}/${MusicService.waitTime}"
Toolkit.drawTextCentered(batch, App.fontSmallNumbers, str, Toolkit.drawWidth, 0, _posY.toInt() + height + 18)
//// playlist internal indices
MusicService.currentPlaylist?.let {
val indices = it.extortField<ArrayList<Int>>("internalIndices")!!
val currentIndex = it.extortField<Int>("currentIndexCursor")!!
for (k in 0 until indices.size) {
batch.color = if (k == currentIndex) Color.RED else Color.WHITE
App.fontSmallNumbers.draw(batch, "${indices[k]+1}", 28f + 18f * (k), App.scr.hf - 16f)
}
}
batch.color = Color.LIGHT_GRAY
App.fontSmallNumbers.draw(batch, "Playlist InternalIndices", 10f, App.scr.hf - 30f)
App.fontSmallNumbers.draw(batch, "..", 10f, App.scr.hf - 16f)
*/
// end of debug codes
batch.color = Color.WHITE
@@ -760,9 +814,9 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
albumlistNameOverflown.clear()
}
private fun setPlaylistDisplayVars(plist: List<MusicContainer>) {
private fun setPlaylistDisplayVars(plist: TerrarumMusicPlaylist) {
resetPlaylistDisplay()
plist.forEachIndexed { i, music ->
plist.musicList.forEachIndexed { i, music ->
val len = App.fontGameFBO.getWidth(music.name)
val overflown = (len >= playlistNameLenMax)
playlistRealNameLen[i] = len
@@ -784,26 +838,47 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
private fun drawPlayList(camera: OrthographicCamera, delta: Float, batch: SpriteBatch, x: Float, y: Float, alpha: Float, scale: Float) {
batch.end()
playlistFBOs.forEachIndexed { i, it ->
val pnum = i + playlistScroll
it.inAction(camera, batch) {
batch.inUse {
batch.color = Color.WHITE
gdxClearAndEnableBlend(0f, 0f, 0f, 0f)
blendNormalStraightAlpha(batch)
val currentPlaylist = getCurrentPlaylist()
// draw text
App.fontGameFBO.draw(batch, if (pnum in songsInGovernor.indices) songsInGovernor[pnum].name else "", maskOffWidth - playlistNameScrolls[pnum], (PLAYLIST_LINE_HEIGHT - 24) / 2)
if (currentPlaylist != null) {
playlistFBOs.forEachIndexed { i, it ->
val pnum = i + playlistScroll
it.inAction(camera, batch) {
batch.inUse {
batch.color = Color.WHITE
gdxClearAndEnableBlend(0f, 0f, 0f, 0f)
blendNormalStraightAlpha(batch)
// mask off the area
batch.color = Color.WHITE
blendAlphaMask(batch)
batch.draw(textmask.get(0, 0), 0f, 0f, maskOffWidth.toFloat(), PLAYLIST_LINE_HEIGHT)
batch.draw(textmask.get(1, 0), maskOffWidth.toFloat(), 0f, PLAYLIST_NAME_LEN - 2f * maskOffWidth, PLAYLIST_LINE_HEIGHT)
batch.draw(textmask.get(2, 0), PLAYLIST_NAME_LEN - maskOffWidth.toFloat(), 0f, maskOffWidth.toFloat(), PLAYLIST_LINE_HEIGHT)
// draw text
App.fontGameFBO.draw(
batch,
if (pnum in currentPlaylist.musicList.indices) currentPlaylist.musicList[pnum].name else "",
maskOffWidth - playlistNameScrolls[pnum],
(PLAYLIST_LINE_HEIGHT - 24) / 2
)
blendNormalStraightAlpha(batch) // qnd hack to make sure this line gets called, otherwise the screen briefly goes blank when the playlist view is closed
Toolkit.fillArea(batch, 999f, 999f, 1f, 1f)
// mask off the area
batch.color = Color.WHITE
blendAlphaMask(batch)
batch.draw(textmask.get(0, 0), 0f, 0f, maskOffWidth.toFloat(), PLAYLIST_LINE_HEIGHT)
batch.draw(
textmask.get(1, 0),
maskOffWidth.toFloat(),
0f,
PLAYLIST_NAME_LEN - 2f * maskOffWidth,
PLAYLIST_LINE_HEIGHT
)
batch.draw(
textmask.get(2, 0),
PLAYLIST_NAME_LEN - maskOffWidth.toFloat(),
0f,
maskOffWidth.toFloat(),
PLAYLIST_LINE_HEIGHT
)
blendNormalStraightAlpha(batch) // qnd hack to make sure this line gets called, otherwise the screen briefly goes blank when the playlist view is closed
Toolkit.fillArea(batch, 999f, 999f, 1f, 1f)
}
}
}
}
@@ -812,37 +887,40 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
blendNormalStraightAlpha(batch)
if (alpha > 0f) {
playlistFBOs.forEachIndexed { i, it ->
val alpha2 = alpha + (playListAnimAkku[i] * 0.2f)
val pnum = i + playlistScroll
val m1 = songsInGovernor.getOrNull(pnum)
val m2 = App.audioMixer.musicTrack.currentTrack
val currentlyPlaying = if (m1 == null || m2 == null) false else (m1 == m2)
if (currentPlaylist != null) {
val alpha2 = alpha + (playListAnimAkku[i] * 0.2f)
val pnum = i + playlistScroll
// print number
val m1 = currentPlaylist.musicList.getOrNull(pnum)
val m2 = App.audioMixer.musicTrack.currentTrack
val currentlyPlaying = if (m1 == null || m2 == null) false else (m1 == m2)
// print bars instead of numbers if the song is currently being played
if (currentlyPlaying) {
val xoff = 6
val yoff = 5 + 7 + (PLAYLIST_LINE_HEIGHT - 24) / 2
// it will set the colour on its own
drawFreqMeter(batch, x + xoff, y + yoff + PLAYLIST_LINE_HEIGHT * i * scale, alpha)
// print number
// print bars instead of numbers if the song is currently being played
if (currentlyPlaying) {
val xoff = 6
val yoff = 5 + 7 + (PLAYLIST_LINE_HEIGHT - 24) / 2
// it will set the colour on its own
drawFreqMeter(batch, x + xoff, y + yoff + PLAYLIST_LINE_HEIGHT * i * scale, alpha)
}
else {
val xoff = maskOffWidth + (if (pnum < 9) 3 else 0)
val yoff = 7 + (PLAYLIST_LINE_HEIGHT - 24) / 2
batch.color = Color(1f, 1f, 1f, alpha * 0.75f)
App.fontSmallNumbers.draw(
batch,
if (pnum in currentPlaylist.musicList.indices) "${pnum + 1}" else "",
x + xoff,
y + yoff + PLAYLIST_LINE_HEIGHT * i * scale
)
}
// print the name
batch.color = Color(1f, 1f, 1f, alpha2)
batch.draw(it.colorBufferTexture, x + PLAYLIST_LEFT_GAP * scale, y + PLAYLIST_LINE_HEIGHT * i * scale, it.width * scale, it.height * scale)
}
else {
val xoff = maskOffWidth + (if (pnum < 9) 3 else 0)
val yoff = 7 + (PLAYLIST_LINE_HEIGHT - 24) / 2
batch.color = Color(1f, 1f, 1f, alpha * 0.75f)
App.fontSmallNumbers.draw(
batch,
if (pnum in songsInGovernor.indices) "${pnum + 1}" else "",
x + xoff,
y + yoff + PLAYLIST_LINE_HEIGHT * i * scale
)
}
// print the name
batch.color = Color(1f, 1f, 1f, alpha2)
batch.draw(it.colorBufferTexture, x + PLAYLIST_LEFT_GAP * scale, y + PLAYLIST_LINE_HEIGHT * i * scale, it.width * scale, it.height * scale)
// separator
batch.color = Color(1f, 1f, 1f, alpha * 0.25f)
@@ -851,7 +929,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
// print the album name
batch.color = Color(1f, 1f, 1f, alpha * 0.75f)
Toolkit.drawTextCentered(batch, App.fontGame, internalPlaylistName, width, x.roundToInt(), 3 + (y + PLAYLIST_LINE_HEIGHT * PLAYLIST_LINES * scale).roundToInt())
Toolkit.drawTextCentered(batch, App.fontGame, MusicService.currentPlaylist?.name ?: "(null)", width, x.roundToInt(), 3 + (y + PLAYLIST_LINE_HEIGHT * PLAYLIST_LINES * scale).roundToInt())
}
}
@@ -892,7 +970,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
val pnum = i + albumlistScroll
val currentlyPlaying = if (pnum in albumsList.indices) {
val m1 = ingame.musicGovernor.playlistSource
val m1 = MusicService.currentPlaylist?.source
val m2 = albumsList[pnum].canonicalPath.replace('\\', '/')
(m1 == m2)
}
@@ -957,7 +1035,9 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
}
private val playControlAnimAkku = FloatArray(5) // how many control buttons?
private val playControlAnimLength = 0.2f
private val playControlAnimLength = 0.16f
private val colInactive = Color(0xaaaaaaff.toInt())
private fun drawControls(delta: Float, batch: SpriteBatch, posX: Float, posY: Float) {
val (alpha, reverse) = if (mode < MODE_MOUSE_UP && modeNext == MODE_MOUSE_UP)
@@ -978,20 +1058,21 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
else
0f
val baseCol = if (transactionLocked) colInactive else Color.WHITE
if (alpha > 0f) {
val alpha0 = alpha.coerceIn(0f, 1f).organicOvershoot().coerceAtMost(1f)
val internalWidth =minOf(widthForMouseUp.toFloat(), width - 20f)
val separation = internalWidth / 5f
val anchorX = Toolkit.hdrawWidthf
val posY = posY + 12f
val alphaBase2 = 0.75f * (if (reverse) 1f - alpha0 else alpha0).pow(3f)
for (i in 0..4) {
val alphaBase = 0.75f * (if (reverse) 1f - alpha0 else alpha0).pow(3f) + (playControlAnimAkku[i] * 0.2f)
val alphaBase2 = 0.75f * (if (reverse) 1f - alpha0 else alpha0).pow(3f)
val animAkku = if (i == 2) 0f else playControlAnimAkku[i] // disable mouseUp for the progress ring
val alphaBase = 0.75f * (if (reverse) 1f - alpha0 else alpha0).pow(3f) + (animAkku * 0.2f)
val offset = i - 2
val posX = anchorX + offset * separation
val btnX = (posX - BUTTON_WIDTH / 2).roundToFloat()
val btnY = posY.roundToFloat()
@@ -999,10 +1080,10 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
// prev/next button
if (i == 1 || i == 3) {
// prev/next song button
batch.color = Color(1f, 1f, 1f, alphaBase * (1f - buttonFadePerc))
batch.color = baseCol * Color(1f, 1f, 1f, alphaBase * (1f - buttonFadePerc))
batch.draw(controlButtons.get(i, 0), btnX, btnY)
// prev/next page button
batch.color = Color(1f, 1f, 1f, alphaBase * buttonFadePerc)
batch.color = baseCol * Color(1f, 1f, 1f, alphaBase * buttonFadePerc)
batch.draw(controlButtons.get(i, 1), btnX, btnY)
}
// stop button
@@ -1010,13 +1091,24 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
// get correct stop/play button
val iconY = if (!App.audioMixer.musicTrack.isPlaying) 1 else 0
// fade if avaliable
batch.color = Color(1f, 1f, 1f, alphaBase * (1f - buttonFadePerc))
batch.color = baseCol * Color(1f, 1f, 1f, alphaBase * (1f - buttonFadePerc))
batch.draw(controlButtons.get(i, iconY), btnX, btnY)
// page number with fade
// progress ring
val perc = ((App.audioMixer.musicTrack.currentTrack?.currentPositionInSamples()?.toFloat() ?: 0f) /
(App.audioMixer.musicTrack.currentTrack?.totalSizeInSamples ?: Long.MAX_VALUE)).coerceAtMost(1f)
val progress = (perc * 64).roundToInt() - 1
if (progress >= 0) {
val prx = progress % 8
val pry = progress / 8
batch.color = baseCol * Color(1f, 1f, 1f, alphaBase * (1f - buttonFadePerc))
batch.draw(progressSheet.get(prx, pry), btnX, btnY)
}
// page number with fade
for (mode in 0..1) {
val alphaNum = if (mode == 0) 1f - listViewPanelScroll else listViewPanelScroll
batch.color = Color(1f, 1f, 1f, alphaBase2 * buttonFadePerc * alphaNum) // don't use mouse-up effect
batch.color = baseCol * Color(1f, 1f, 1f, alphaBase2 * buttonFadePerc * alphaNum) // don't use mouse-up effect
val (thisPage, totalPage) = if (mode == 0)
albumlistScroll.div(PLAYLIST_LINES).plus(1) to albumsList.size.toFloat().div(PLAYLIST_LINES).ceilToInt()
else
@@ -1032,11 +1124,10 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
}
// else button
else {
batch.color = Color(1f, 1f, 1f, alphaBase)
batch.color = baseCol * Color(1f, 1f, 1f, alphaBase)
batch.draw(controlButtons.get(i, 0), btnX, btnY)
}
// update playControlAnimAkku
if (mouseOnButton == i && mode >= MODE_MOUSE_UP && modeNext >= MODE_MOUSE_UP)
playControlAnimAkku[i] = (playControlAnimAkku[i] + (delta / playControlAnimLength)).coerceIn(0f, 1f)
@@ -1044,6 +1135,9 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
playControlAnimAkku[i] = (playControlAnimAkku[i] - (delta / playControlAnimLength)).coerceIn(0f, 1f)
}
// printdbg(this, "playControlAnimAkku=${playControlAnimAkku.joinToString()}")
}
}
@@ -1109,7 +1203,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
// apply slope to the fft bins, also converts fullscale to decibels
for (bin in binHeights.indices) {
val freqR = (TerrarumAudioMixerTrack.SAMPLING_RATED / FFTSIZE) * (bin + 1)
val magn0 = fftOut.reim[2 * bin].absoluteValue / FFTSIZE * (freqR / 20.0) // apply slope
val magn0 = fftOut.reim[2 * bin].absoluteValue / FFTSIZE * freqR.sqrt() // apply slope
val magn = FastMath.interpolateLinear(FFT_SMOOTHING_FACTOR, magn0, oldFFTmagn[bin])
val magnLog = fullscaleToDecibels(magn) - dbOffset
@@ -1252,22 +1346,12 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
val albumArt: TextureRegion? = null
)
private fun loadNewAlbum(albumDir: File) {
private fun loadNewAlbum(albumDir: File): TerrarumMusicPlaylist {
val albumProp = albumPropCache[albumDir]
App.audioMixer.musicTrack.let { track ->
track.doGaplessPlayback = (albumProp.diskJockeyingMode == "continuous")
if (track.doGaplessPlayback) {
track.pullNextTrack = {
track.currentTrack = ingame.musicGovernor.pullNextMusicTrack(true)
setMusicName(track.currentTrack?.name ?: "")
}
}
}
currentlySelectedAlbum = albumProp
registerPlaylist(albumDir.absolutePath, albumProp.fileToName, albumProp.shuffled, albumProp.diskJockeyingMode)
return registerPlaylist(albumDir.absolutePath, albumProp.fileToName, albumProp.shuffled, albumProp.diskJockeyingMode)
// scroll playlist to the page current song is
}
@@ -1281,4 +1365,13 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
}
}
}
}
}
private operator fun Color.times(other: Color): Color {
return Color(
this.r * other.r,
this.g * other.g,
this.b * other.b,
this.a * other.a,
)
}

View File

@@ -1,6 +1,6 @@
## Aperçu ##
This project is to create a modular game engine that accommodates a 2D side-scrolling tilemap platformer, and a game that runs on top of it.
The goal of this project is to create a modular game engine that accommodates a 2D side-scrolling tilemap platformer, and a game that runs on top of it.
The project is divided into two parts: **Terrarum the Game Engine** and **Terrarum the actual game**.

View File

@@ -17,17 +17,16 @@
<orderEntry type="library" name="gdx-controllers-core-2.2.1" level="project" />
<orderEntry type="library" name="gdx-controllers-desktop-2.2.1" level="project" />
<orderEntry type="library" name="jxinput-1.0.0" level="project" />
<orderEntry type="library" name="gdx-platform-1.12.0-natives" level="project" />
<orderEntry type="library" name="graalvm-js 22.3.1" level="project" />
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
<orderEntry type="library" name="badlogicgames.gdx" level="project" />
<orderEntry type="library" name="badlogicgames.gdx.backend.lwjgl3" level="project" />
<orderEntry type="library" name="jetbrains.kotlin.reflect" level="project" />
<orderEntry type="library" name="jetbrains.kotlin.test" level="project" />
<orderEntry type="library" name="io.github.classgraph" level="project" />
<orderEntry type="library" name="apache.commons.math3" level="project" />
<orderEntry type="library" name="github.wendykierp.JTransforms" level="project" />
<orderEntry type="library" name="io.airlift.aircompressor" level="project" />
<orderEntry type="library" name="jetbrains.kotlin.test1" level="project" />
<orderEntry type="library" name="gdx-platform-1.12.1-natives-arm64-v8a" level="project" />
<orderEntry type="library" name="TerranVirtualDisk" level="project" />
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
<orderEntry type="library" name="GetBatteryStatus" level="project" />
</component>
</module>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More