Compare commits

..

255 Commits

Author SHA1 Message Date
MagicBot 9a6a131bbf PowerActionEntry parsing work. 2024-08-19 20:50:45 -04:00
MagicBot 3909ddb3ba PowerActionEntry parsing work. 2024-08-19 20:49:43 -04:00
MagicBot dbc26b8243 PowerActionEntry parsing work. 2024-08-19 20:41:30 -04:00
MagicBot 93a4acb108 init moved to configmanager. 2024-08-19 20:38:38 -04:00
MagicBot 9c1c4e02a9 init moved to configmanager. 2024-08-19 20:38:09 -04:00
MagicBot 00aa06c5f1 Condition fix 2024-08-19 15:24:28 -04:00
MagicBot f3578f82e6 PowerAction work started. 2024-08-19 15:20:15 -04:00
MagicBot 85ee1faf4a PowerAction work started. 2024-08-19 15:18:19 -04:00
MagicBot b72c8e8ce3 PowerAction work started. 2024-08-19 13:17:44 -04:00
MagicBot 77a89b8f8a PowerAction work started. 2024-08-19 13:15:33 -04:00
MagicBot a9a9b6a8ac PowerAction work started. 2024-08-19 13:13:54 -04:00
MagicBot fab77a0dbb PowerAction work started. 2024-08-19 13:13:31 -04:00
MagicBot e83e0def2e PowerAction work started. 2024-08-19 13:05:32 -04:00
MagicBot ebcc721d43 Class renamed 2024-08-19 11:24:37 -04:00
MagicBot ff6d236ea7 Power Conditions parsed 2024-08-19 11:10:55 -04:00
MagicBot 41a9c19001 More PowerEntry parsing work. 2024-08-19 08:29:07 -04:00
MagicBot 187ef18ac2 More PowerEntry parsing work. 2024-08-19 08:27:39 -04:00
MagicBot 93304e3eb7 More PowerEntry parsing work. 2024-08-19 08:25:42 -04:00
MagicBot b1f14c4beb More PowerEntry parsing work. 2024-08-19 08:23:17 -04:00
MagicBot 1b2c073886 More PowerEntry parsing work. 2024-08-19 08:21:38 -04:00
MagicBot f20a5bb881 More PowerEntry parsing work. 2024-08-19 08:20:35 -04:00
MagicBot 394ba5a165 More PowerEntry parsing work. 2024-08-19 08:19:29 -04:00
MagicBot c35e689d1b More PowerEntry parsing work. 2024-08-19 08:16:31 -04:00
MagicBot a9b6fcb9ee More PowerEntry parsing work. 2024-08-19 08:12:45 -04:00
MagicBot 8eeb539f16 More PowerEntry parsing work. 2024-08-19 08:12:18 -04:00
MagicBot a863902370 More PowerEntry parsing work. 2024-08-19 08:10:13 -04:00
MagicBot 12f8139d1e More PowerEntry parsing work. 2024-08-19 08:08:32 -04:00
MagicBot 4f25e7e24f More PowerEntry parsing work. 2024-08-19 08:06:09 -04:00
MagicBot 5860a263d9 More PowerEntry parsing work. 2024-08-19 08:02:35 -04:00
MagicBot 1460ddb975 More PowerEntry parsing work. 2024-08-19 08:00:53 -04:00
MagicBot 5326126dcb More PowerEntry parsing work. 2024-08-19 07:57:32 -04:00
MagicBot e6a8cdd5e2 More PowerEntry parsing work. 2024-08-19 07:56:04 -04:00
MagicBot 0dc8eeee90 More PowerEntry parsing work. 2024-08-19 07:54:14 -04:00
MagicBot e719d13c8c More PowerEntry parsing work. 2024-08-19 07:53:19 -04:00
MagicBot 9ee2592ec7 Regex update 2024-08-19 07:45:26 -04:00
MagicBot 720b97dc69 Regex updated to include spaces only in a line. 2024-08-19 07:40:07 -04:00
MagicBot 177917a8c8 EffectPreReq pojo created 2024-08-19 07:32:25 -04:00
MagicBot a1323e5d17 EffectPreReq pojo created 2024-08-19 07:15:20 -04:00
MagicBot 760b2c3df1 Debug string updated 2024-08-19 07:12:06 -04:00
MagicBot 31f8b5a294 One or more whitspaces 2024-08-19 07:08:09 -04:00
MagicBot 3498cc370f More PowerEntry work. 2024-08-19 06:51:30 -04:00
MagicBot 66dd7b5f90 More PowerEntry work. 2024-08-19 06:49:13 -04:00
MagicBot 5cc979e2f3 More PowerEntry work. 2024-08-19 06:45:37 -04:00
MagicBot 1bcf307f94 More PowerEntry work. 2024-08-19 06:33:30 -04:00
MagicBot cdf67f4ce5 More PowerEntry work. 2024-08-19 06:30:27 -04:00
MagicBot 67f2dce2fd More PowerEntry work. 2024-08-19 06:26:59 -04:00
MagicBot 162f28d874 More PowerEntry work. 2024-08-19 06:26:06 -04:00
MagicBot c6ab1b5468 More PowerEntry work. 2024-08-19 06:25:03 -04:00
MagicBot d17db3a1fd More PowerEntry work. 2024-08-19 06:15:50 -04:00
MagicBot 9428436883 More PowerEntry work. 2024-08-19 06:07:17 -04:00
MagicBot 62dfb8a42e More PowerEntry work. 2024-08-19 06:05:11 -04:00
MagicBot c6647a99b8 More PowerEntry work. 2024-08-19 06:04:01 -04:00
MagicBot a11797c5e4 More PowerEntry work. 2024-08-19 06:01:52 -04:00
MagicBot 84a124bb52 More PowerEntry work. 2024-08-19 05:58:24 -04:00
MagicBot b296742de0 More PowerEntry work. 2024-08-19 05:56:24 -04:00
MagicBot c0560ece47 More PowerEntry work. 2024-08-19 05:55:49 -04:00
MagicBot 89fd647870 More PowerEntry work. 2024-08-19 05:44:35 -04:00
MagicBot 07da5cb77c More PowerEntry work. 2024-08-19 05:44:03 -04:00
MagicBot aaf84d13f8 More PowerEntry work. 2024-08-19 05:42:04 -04:00
MagicBot fd1bb0def7 More PowerEntry work. 2024-08-19 05:39:57 -04:00
MagicBot 3223eae7b6 More PowerEntry work. 2024-08-19 05:39:24 -04:00
MagicBot d836f80805 More PowerEntry work. 2024-08-19 05:38:25 -04:00
MagicBot 1a6dcf3f57 More PowerEntry work. 2024-08-19 05:36:51 -04:00
MagicBot dce48f3d66 More PowerEntry work. 2024-08-19 05:34:38 -04:00
MagicBot 10d98f32b6 More PowerEntry work. 2024-08-19 05:28:23 -04:00
MagicBot acdf6db91a More PowerEntry work. 2024-08-18 16:38:06 -04:00
MagicBot 0ee7269c8f More PowerEntry work. 2024-08-18 16:28:07 -04:00
MagicBot 4b888b3d92 More PowerEntry work. 2024-08-18 16:27:13 -04:00
MagicBot f0ed15baf0 More PowerEntry work. 2024-08-18 16:21:50 -04:00
MagicBot 6c882a7788 More PowerEntry work. 2024-08-18 16:20:58 -04:00
MagicBot 11e03e0051 More PowerEntry work. 2024-08-18 16:18:45 -04:00
MagicBot 6e47b80d23 More powerAction work. 2024-08-18 16:09:40 -04:00
MagicBot a3d3c32b07 More powerAction work. 2024-08-18 16:01:31 -04:00
MagicBot 3a27f2f4c8 More powerAction work. 2024-08-18 15:57:37 -04:00
MagicBot 1638804f1f More powerAction work. 2024-08-18 15:51:30 -04:00
MagicBot 362958c0f1 More powerAction work. 2024-08-18 15:47:22 -04:00
MagicBot 74720956a1 More powerAction work. 2024-08-18 15:35:01 -04:00
MagicBot 58e1f4d70b More powerAction work. 2024-08-18 15:01:29 -04:00
MagicBot c871c253b1 More powerAction work. 2024-08-18 15:01:05 -04:00
MagicBot 547b101c60 More powerAction work. 2024-08-18 15:00:18 -04:00
MagicBot b9ccbe219f More powerAction work. 2024-08-18 14:56:41 -04:00
MagicBot c31409d26f Enum updated from .exe 2024-08-18 14:13:27 -04:00
MagicBot 00d6e4f819 Enum added for CategoryToPower 2024-08-18 14:10:20 -04:00
MagicBot dc9f33dc7b PowerAction pojo created 2024-08-18 13:00:03 -04:00
MagicBot 3d45f26611 PowerAction pojo created 2024-08-18 12:38:22 -04:00
MagicBot 8554bad731 Package restructure 2024-08-17 16:33:20 -04:00
MagicBot b2a8fe357e More enum work. 2024-08-17 16:24:25 -04:00
MagicBot 08ac0b8d8d More enum work. 2024-08-17 16:20:21 -04:00
MagicBot 23bf491d4b More enum work. 2024-08-17 16:16:00 -04:00
MagicBot 76d22abd0b Debug code removed 2024-08-17 16:08:39 -04:00
MagicBot e4e8086e41 More Enum work 2024-08-17 16:07:47 -04:00
MagicBot 63116551bc Enum work 2024-08-17 16:02:44 -04:00
MagicBot d06ce44bd5 Enum work 2024-08-17 15:58:48 -04:00
MagicBot 387f75766f Debug output 2024-08-17 15:36:03 -04:00
MagicBot 2a18b96d23 Reformat 2024-08-17 15:31:45 -04:00
MagicBot bf2174fbe5 Sometimes bad floats. 2024-08-17 15:29:11 -04:00
MagicBot 462f6725b6 Sometimes bad floats. 2024-08-17 15:26:59 -04:00
MagicBot ed09bffc87 Values are floats 2024-08-17 15:23:12 -04:00
MagicBot 218de2bb70 Support for multiple power enrties. 2024-08-17 15:13:32 -04:00
MagicBot c90961b691 Support for multiple power enrties. 2024-08-17 14:51:30 -04:00
MagicBot 1b5b904a8f Support for multiple power enrties. 2024-08-17 14:51:18 -04:00
MagicBot ed219efb92 22 fields 2024-08-17 14:37:49 -04:00
MagicBot 4d704d3ab0 Variables mirror executable 2024-08-16 13:09:22 -04:00
MagicBot 11076ff586 Variables mirror executable 2024-08-16 12:36:54 -04:00
MagicBot 6b22e624f6 Debug code added 2024-08-16 12:01:13 -04:00
MagicBot a81f90238b Debug code added 2024-08-15 16:31:04 -04:00
MagicBot e7c2e827b9 Filename updated 2024-08-15 16:20:33 -04:00
MagicBot 82aa2f9b77 Parsing powers at bootstrap 2024-08-15 16:16:59 -04:00
MagicBot d9cc2d2a56 More PowerEntry parsing work. 2024-08-15 16:08:33 -04:00
MagicBot 28e3769d1e Parm changed to float. 2024-08-15 16:01:50 -04:00
MagicBot e092d764bd More PowerEntry parsing work. 2024-08-14 17:33:06 -04:00
MagicBot 27c0a852e9 More PowerEntry parsing work. 2024-08-14 17:32:45 -04:00
MagicBot bf6ad69d4c More PowerEntry parsing work. 2024-08-14 17:29:13 -04:00
MagicBot 0b4b270d2f Strip quotes from names 2024-08-14 17:21:26 -04:00
MagicBot 4b63493b73 Formatting 2024-08-14 17:19:39 -04:00
MagicBot 9b6c8af171 Cannot be null 2024-08-14 17:18:36 -04:00
MagicBot 4c7421cd62 More PowerEntry parsing work 2024-08-14 17:11:38 -04:00
MagicBot 7662069100 More PowerEntry parsing work 2024-08-14 17:00:19 -04:00
MagicBot adb10e34f3 Naming convention update 2024-08-14 16:57:34 -04:00
MagicBot bd0d814142 Moved comment to declaration 2024-08-14 16:55:11 -04:00
MagicBot 06364a2b9e More power parsing work. 2024-08-14 16:53:07 -04:00
MagicBot afb6d3e8a3 Needs group 0 2024-08-14 16:46:02 -04:00
MagicBot a48ff5851c PowerEntry parsing work 2024-08-14 16:36:07 -04:00
MagicBot ede21f8d54 PowerEntry parsing work 2024-08-14 16:34:20 -04:00
MagicBot d08190cbff PowerEntry parsing work 2024-08-14 16:29:21 -04:00
MagicBot cd50ca4309 PowerEntry parsing work 2024-08-14 16:27:51 -04:00
MagicBot 97c118ae1a PowerEntry parsing work 2024-08-13 12:20:27 -04:00
MagicBot 8878f07628 PowerEntry data class created 2024-08-13 12:06:24 -04:00
MagicBot dee30d8121 Header added to new files 2024-08-13 12:05:09 -04:00
MagicBot 5087465ecb Power parsing work 2024-08-13 12:04:18 -04:00
MagicBot 39844251b0 wpak package for wpak code 2024-08-13 11:58:41 -04:00
MagicBot 8c983eadff Declaration order follows execution order. 2024-08-13 11:29:37 -04:00
MagicBot 7efe5209aa Comment update 2024-08-13 11:28:34 -04:00
MagicBot 95cf5fa209 Comment update 2024-08-13 11:28:07 -04:00
MagicBot adde3fc3a8 Comment update 2024-08-12 16:05:36 -04:00
MagicBot b7089e88d3 Comment update 2024-08-12 11:20:28 -04:00
MagicBot da63d9d926 Can't be null 2024-08-12 11:19:53 -04:00
MagicBot c8a5224c75 Parsing conditions 2024-08-12 11:15:21 -04:00
MagicBot d4618ae4b9 Parsing conditions 2024-08-12 11:13:54 -04:00
MagicBot 0591b9d41f Parsing conditions 2024-08-12 11:10:52 -04:00
MagicBot 52c5f51613 Parsing conditions 2024-08-12 11:03:45 -04:00
MagicBot f8b9c97730 Parsing conditions 2024-08-12 11:01:27 -04:00
MagicBot c7fa537cfb More effectmod parser work. 2024-08-12 10:50:00 -04:00
MagicBot e0e8296339 More effectmod parser work. 2024-08-12 10:47:37 -04:00
MagicBot e677ca9f33 More effectmod parser work. 2024-08-12 10:46:35 -04:00
MagicBot c19f6df690 More effectmod parser work. 2024-08-12 10:45:19 -04:00
MagicBot 3ed7f7c3fb More effectmod parser work. 2024-08-12 10:43:45 -04:00
MagicBot 6b10374adb More effectmod parser work. 2024-08-12 10:42:30 -04:00
MagicBot 0a65ea61e7 More effectmod parser work. 2024-08-12 10:41:11 -04:00
MagicBot 6500659c1f More effectmod parser work. 2024-08-12 10:39:46 -04:00
MagicBot 480887a78f More effectmod parser work. 2024-08-12 10:38:23 -04:00
MagicBot 05ac2d0a90 More effectmod parser work. 2024-08-12 10:36:55 -04:00
MagicBot bbac9ce6b9 More effectmod parser work. 2024-08-12 10:28:37 -04:00
MagicBot 5b9866f704 More effectmod parser work. 2024-08-12 10:26:49 -04:00
MagicBot 4a6e4d2a85 More effectmod parser work. 2024-08-12 10:25:10 -04:00
MagicBot b7ef3de527 More effectmod parser work. 2024-08-12 10:23:56 -04:00
MagicBot 4bfb866abe More effectmod parser work. 2024-08-12 10:22:19 -04:00
MagicBot 23d2b595d9 More effectmod parser work. 2024-08-12 10:21:37 -04:00
MagicBot 7d30fd2b96 More effectmod parser work. 2024-08-12 10:20:48 -04:00
MagicBot 93d5976c1e More effectmod parser work. 2024-08-12 10:19:20 -04:00
MagicBot 260bc453d1 More effectmod parser work. 2024-08-12 10:15:04 -04:00
MagicBot 5a619db9bd More effectmod parser work. 2024-08-12 10:12:28 -04:00
MagicBot d622406912 More effectmod parser work. 2024-08-12 10:09:54 -04:00
MagicBot a5e2b69ae3 More effectmod parser work. 2024-08-12 10:05:49 -04:00
MagicBot 56686944af More effectmod parser work. 2024-08-12 10:03:55 -04:00
MagicBot aa957f41af More effectmod parser work. 2024-08-12 10:02:24 -04:00
MagicBot 9336305334 More effectmod parser work. 2024-08-12 09:59:17 -04:00
MagicBot bc9c5224d0 More effectmod parser work. 2024-08-12 09:57:19 -04:00
MagicBot eda27b2e9c min/max are floats 2024-08-12 09:55:22 -04:00
MagicBot c5d6b382f8 More effectmod parser work. 2024-08-12 09:45:26 -04:00
MagicBot ae0d182e2e More effectmod parser work. 2024-08-12 09:40:43 -04:00
MagicBot ad78d152f7 More effectmod parser work. 2024-08-12 09:39:01 -04:00
MagicBot 000ccdaf0a More effectmod parser work. 2024-08-12 09:32:58 -04:00
MagicBot 57249727de More effectmod parser work. 2024-08-12 09:27:19 -04:00
MagicBot d6c49d0793 More effectmod parser work. 2024-08-12 09:25:17 -04:00
MagicBot 2fa58c4f38 More effectmod parser work. 2024-08-12 09:16:17 -04:00
MagicBot c361c2a78a More effectmod parser work. 2024-08-12 09:13:29 -04:00
MagicBot 4d862355be More effectmod parser work. 2024-08-12 09:09:44 -04:00
MagicBot 52028e0e97 More effectmod parser work. 2024-08-12 09:01:49 -04:00
MagicBot 3e4e13a8ae More effectmod parser work. 2024-08-12 09:00:59 -04:00
MagicBot 0ceea002d5 More effectmod parser work. 2024-08-12 08:52:24 -04:00
MagicBot 7d8f4049b9 More effectmod parser work. 2024-08-12 08:47:57 -04:00
MagicBot dbefaa7ead More effectmod parser work. 2024-08-12 08:45:42 -04:00
MagicBot 9c1ec1069f More effectmod parser work. 2024-08-12 08:14:52 -04:00
MagicBot f36c980eb9 More effectmod parser work. 2024-08-11 17:07:56 -04:00
MagicBot cb1a7f014d More effectmod parser work. 2024-08-11 12:48:56 -04:00
MagicBot e729bc9541 More effectmod parser work. 2024-08-11 12:44:54 -04:00
MagicBot c97a6f555a min/scale/slope for group of types 2024-08-11 12:01:18 -04:00
MagicBot 95a104e397 Effect Modifier parsing work. 2024-08-10 18:56:31 -04:00
MagicBot e7ad83cc60 Effect Modifier parsing work. 2024-08-10 18:55:26 -04:00
MagicBot 821b7264ec Effect Modifier parsing work. 2024-08-10 18:50:28 -04:00
MagicBot 0bf3456119 Effect Modifier parsing work. 2024-08-10 18:45:23 -04:00
MagicBot ff7bd7a699 Effect Modifier parsing work. 2024-08-10 18:33:08 -04:00
MagicBot a028bebafd Effect Modifier parsing work. 2024-08-10 18:27:17 -04:00
MagicBot 789d9a3bb6 Effect Modifier parsing work. 2024-08-10 18:23:40 -04:00
MagicBot 8e19b66a9b Effect Modifier parsing work. 2024-08-10 18:13:56 -04:00
MagicBot 975845375f Effect Modifier parsing work. 2024-08-10 18:13:15 -04:00
MagicBot 74b37063bf Effect Modifier parsing work. 2024-08-10 18:07:54 -04:00
MagicBot c2fee2290d Update to mods regex 2024-08-10 18:02:22 -04:00
MagicBot f7c8c44ebb EffectModifier parsing 2024-08-10 17:54:29 -04:00
MagicBot 91b2ff6e62 EffectModifier parsing 2024-08-10 16:30:43 -04:00
MagicBot 8293f552b1 EffectModifier parsing 2024-08-10 16:29:55 -04:00
MagicBot a84336fc31 Quotes stripped from names. 2024-08-10 16:18:33 -04:00
MagicBot 3951114eb7 Some entries have no icon 2024-08-08 13:14:21 -04:00
MagicBot f24877e9ce Some entries have no icon 2024-08-08 13:14:07 -04:00
MagicBot b81b83570a Some entries have no icon 2024-08-08 13:11:10 -04:00
MagicBot 2417073a4d Regex handles empty strings 2024-08-08 13:07:20 -04:00
MagicBot ebc0b7a89e Debugging 2024-08-08 13:02:01 -04:00
MagicBot 3d6bfcf48f Trim fields before adding to array 2024-08-08 12:57:03 -04:00
MagicBot a5864b74f8 Regex split update 2024-08-08 12:54:58 -04:00
MagicBot de8896ff4e Debugging 2024-08-08 12:29:01 -04:00
MagicBot e579912733 Debugging 2024-08-08 12:28:35 -04:00
MagicBot c7b4404c36 Regex used for strsplit 2024-08-08 12:19:53 -04:00
MagicBot f1de7d413a Hashset initialized 2024-08-08 11:59:10 -04:00
MagicBot cc6f5f5f25 Regex updated with lookahead 2024-08-08 11:56:31 -04:00
MagicBot 19bf75ade8 Regex updated 2024-08-08 11:47:45 -04:00
MagicBot 73eacc3779 Regex updated 2024-08-08 11:38:09 -04:00
MagicBot 69f3504ee9 Regex updated 2024-08-08 11:36:00 -04:00
MagicBot bd89b5e975 Assign result 2024-08-08 11:28:58 -04:00
MagicBot 186eea3099 Regex updated 2024-08-08 11:26:01 -04:00
MagicBot 5e0badef17 EffectModifier pojo work. 2024-08-08 11:21:39 -04:00
MagicBot ea24d493fd Parsing of effect description 2024-08-06 17:18:46 -04:00
MagicBot d12d040def Parsing of effect description 2024-08-06 17:17:57 -04:00
MagicBot 491a9dbae9 Sanitize input 2024-08-06 17:07:07 -04:00
MagicBot 1e0372c40d HashSets for starters. 2024-08-06 16:56:41 -04:00
MagicBot d2f6344846 Regex driven parsing. 2024-08-06 16:52:06 -04:00
FatBoy 47cb824b3f parsing multi worded names 2024-07-24 19:44:29 -05:00
FatBoy 7d8117173f parsing multi worded names 2024-07-24 19:38:28 -05:00
FatBoy 2f076d3215 parsing multi worded names 2024-07-24 19:33:42 -05:00
FatBoy 1a0b8c1d35 parsing multi worded names 2024-07-24 19:31:27 -05:00
FatBoy 887db109c1 parsing multi worded names 2024-07-24 19:31:00 -05:00
FatBoy d8b7f74cd1 attempt to parse 2 worded values 2024-07-24 19:23:18 -05:00
FatBoy b81b4f0e0a attempt to parse 2 worded values 2024-07-24 19:23:04 -05:00
FatBoy 0b4e0d65a9 attempt to parse 2 worded values 2024-07-24 19:14:15 -05:00
FatBoy 2f837ace1e attempt to parse 2 worded values 2024-07-24 19:13:07 -05:00
FatBoy 319d68d15e attempt to parse 2 worded values 2024-07-24 19:09:41 -05:00
FatBoy 2224d811eb attempt to parse 2 worded values 2024-07-24 19:08:41 -05:00
FatBoy 9ec97ce448 attempt to parse 2 worded values 2024-07-24 19:03:49 -05:00
FatBoy f13b8b5d3e attempt to parse 2 worded values 2024-07-24 18:56:29 -05:00
FatBoy 633f5837dc attempt to parse 2 worded values 2024-07-24 18:55:20 -05:00
FatBoy 3238cfa0ff attempt to parse 2 worded values 2024-07-24 18:54:01 -05:00
FatBoy 83b1503cee attempt to parse 2 worded values 2024-07-24 18:51:27 -05:00
MagicBot 6854fad222 Class cleanup 2024-07-24 12:56:24 -04:00
FatBoy 56dd3cfa95 Effects.cfg parser 2024-07-23 21:18:12 -05:00
FatBoy f81a1acb20 Effects.cfg parser 2024-07-23 21:15:37 -05:00
FatBoy 4ed5744707 Effects.cfg parser 2024-07-23 21:11:17 -05:00
FatBoy 085f2816a9 Effects.cfg parser 2024-07-23 21:09:01 -05:00
FatBoy 0526fdef2f Effects.cfg parser 2024-07-23 21:07:29 -05:00
FatBoy 093ee9f59a Effects.cfg parser 2024-07-23 21:02:41 -05:00
FatBoy 1d56b138a5 Effects.cfg parser 2024-07-23 20:57:40 -05:00
FatBoy 419ce3f49c Effects.cfg parser 2024-07-23 20:56:25 -05:00
FatBoy a27f257f80 Effects.cfg parser 2024-07-23 20:53:26 -05:00
FatBoy 8eee7ca23e Effects.cfg parser 2024-07-23 20:51:58 -05:00
FatBoy 28cf0d2232 Effects.cfg parser 2024-07-23 20:48:41 -05:00
FatBoy e12a8a3c7c Effects.cfg parser 2024-07-23 20:47:39 -05:00
18 changed files with 1020 additions and 120 deletions
+1 -1
View File
@@ -798,7 +798,7 @@ public enum BuildingManager {
// Attempt to write to database or delete the building
// if we are destroying it.
if (rank <= -1)
if (rank == -1)
success = DbManager.BuildingQueries.DELETE_FROM_DATABASE(building);
else
success = DbManager.BuildingQueries.updateBuildingRank(building, rank);
+10
View File
@@ -11,6 +11,8 @@ package engine.gameManager;
import engine.mbEnums;
import engine.server.login.LoginServer;
import engine.server.world.WorldServer;
import engine.wpak.EffectsParser;
import engine.wpak.PowersParser;
import org.pmw.tinylog.Logger;
import java.io.BufferedReader;
@@ -164,6 +166,14 @@ public enum ConfigManager {
Logger.info("Compiling regex");
regex.put(MB_LOGIN_FNAME_REGEX, Pattern.compile(MB_LOGIN_FNAME_REGEX.getValue()));
Logger.info("Loading WPAK data");
EffectsParser.parseWpakFile();
PowersParser.parseWpakFile();
return true;
}
+57
View File
@@ -3022,5 +3022,62 @@ public class mbEnums {
PREFIX,
SUFFIX;
}
public enum PowerType {
None,
SPELL,
SKILL;
}
public enum CostType {
NONE,
HEALTH,
MANA,
STAMINA;
}
public enum AreaType {
NONE,
SPHERE,
POINTBLANK,
LINE,
CONE,
WALL;
}
public enum ExcludeType {
NONE,
CASTER,
GROUP,
GUILD,
NATION,
PLAYERS,
ALLBUTGROUP,
ALLBUTPETS;
}
public enum CastingModeType {
NONE,
COMBAT,
NONCOMBAT,
BOTH;
}
public enum TargetSelectType {
NONE,
CLICK,
GROUP,
GUILD,
NEARBYMOBS,
NAME;
}
public enum CategoryToPowerType {
None,
GreaterThanOrEqualTo,
GreaterThan,
Always
}
}
+2 -5
View File
@@ -505,11 +505,6 @@ public class Building extends AbstractWorldObject {
return;
}
if (this.isDeranking.compareAndSet(false, true) == false) {
Logger.error("Attempt to derank tol twice");
return;
}
bane = city.getBane();
// We need to collect the spires and shrines on the citygrid in case
@@ -605,6 +600,8 @@ public class Building extends AbstractWorldObject {
newOwner = Guild.GetGL(bane.getOwner().getGuild());
this.isDeranking.compareAndSet(false, true);
if ((bane.getOwner().getGuild().getGuildState() == GuildState.Sovereign) ||
(bane.getOwner().getGuild().getGuildState() == GuildState.Protectorate) ||
(bane.getOwner().getGuild().getGuildState() == GuildState.Province) ||
+2 -9
View File
@@ -41,7 +41,6 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class City extends AbstractWorldObject {
@@ -81,7 +80,6 @@ public class City extends AbstractWorldObject {
private String hash;
public Warehouse warehouse;
public Realm realm;
public AtomicBoolean isDestroyed = new AtomicBoolean();
/**
* ResultSet Constructor
@@ -1104,14 +1102,9 @@ public class City extends AbstractWorldObject {
public final void destroy() {
if (this.isDestroyed.compareAndSet(false, true) == false) {
Logger.error("Attempt to destroy tol twice");
return;
}
Thread destroyCityThread = new Thread(new DestroyCityThread(this));
destroyCityThread.setName("destroyCity: " + this.getParent().zoneName);
destroyCityThread.setName("destroyCity:" + this.getName());
destroyCityThread.start();
}
@@ -1119,7 +1112,7 @@ public class City extends AbstractWorldObject {
Thread transferCityThread = new Thread(new TransferCityThread(this, newOwner));
transferCityThread.setName("TransferCity:" + this.getParent().zoneName);
transferCityThread.setName("TransferCity:" + this.getName());
transferCityThread.start();
}
+1 -1
View File
@@ -76,7 +76,7 @@ public class WorldServer {
super();
}
public static void main(String[] args) {
public static void main(String[] args) throws IOException {
WorldServer worldServer;
+109 -104
View File
@@ -31,7 +31,6 @@ import engine.objects.Zone;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
import java.util.EnumSet;
public class DestroyCityThread implements Runnable {
@@ -52,116 +51,122 @@ public class DestroyCityThread implements Runnable {
Vector3fImmutable localCoords;
ArrayList<Guild> subGuildList;
Logger.info("Destroy city routine started");
// Member variable assignment
try {
cityZone = city.getParent();
newParent = cityZone.parent;
formerGuild = city.getTOL().getGuild();
// Member variable assignment
// Former guild loses it's tree!
cityZone = city.getParent();
newParent = cityZone.parent;
formerGuild = city.getTOL().getGuild();
if (DbManager.GuildQueries.SET_GUILD_OWNED_CITY(formerGuild.getObjectUUID(), 0)) {
// Build list of buildings within this parent zone
//Successful Update of guild
for (Building cityBuilding : cityZone.zoneBuildingSet) {
// Sanity Check in case player deletes the building
// before this thread can get to it
if (cityBuilding == null)
continue;
// Do nothing with the banestone. It will be removed elsewhere
if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.BANESTONE))
continue;
// All buildings are moved to a location relative
// to their new parent zone
localCoords = ZoneManager.worldToLocal(cityBuilding.getLoc(), newParent);
DbManager.BuildingQueries.MOVE_BUILDING(cityBuilding.getObjectUUID(), newParent.getObjectUUID(), localCoords.x, localCoords.y, localCoords.z);
// All buildings are re-parented to a zone one node
// higher in the tree (continent) as we will be
// deleting the city zone very shortly.
if (cityBuilding.getParentZoneID() != newParent.getParentZoneID())
cityBuilding.setParentZone(newParent);
// No longer a tree, no longer any protection contract!
cityBuilding.setProtectionState(mbEnums.ProtectionState.NONE);
// Remove warehouse entry if one exists.
if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.WAREHOUSE)) {
DbManager.WarehouseQueries.DELETE_WAREHOUSE(city.warehouse);
city.warehouse = null;
}
// Destroy all remaining auto-protected city assets
EnumSet<mbEnums.BuildingGroup> autoProtectFilter = EnumSet.of(mbEnums.BuildingGroup.TOL, mbEnums.BuildingGroup.BARRACK,
mbEnums.BuildingGroup.SPIRE, mbEnums.BuildingGroup.SHRINE, mbEnums.BuildingGroup.WAREHOUSE);
if (autoProtectFilter.contains(cityBuilding.getBlueprint().getBuildingGroup())) {
if (cityBuilding.getRank() > -1)
BuildingManager.setRank(cityBuilding, -1);
}
// Former guild loses tree!
if (city.realm != null)
city.realm.removeCity(city.getObjectUUID());
city.getTOL().setOwner(null);
if (DbManager.GuildQueries.SET_GUILD_OWNED_CITY(formerGuild.getObjectUUID(), 0)) {
//Successful Update of guild
formerGuild.setGuildState(mbEnums.GuildState.Errant);
formerGuild.setNation(null);
formerGuild.setCityUUID(0);
GuildManager.updateAllGuildTags(formerGuild);
GuildManager.updateAllGuildBinds(formerGuild, null);
}
// And all of it's sub guilds
if (formerGuild.getSubGuildList().isEmpty() == false) {
subGuildList = new ArrayList<>();
for (Guild subGuild : formerGuild.getSubGuildList()) {
subGuildList.add(subGuild);
}
for (Guild subGuild : subGuildList) {
formerGuild.removeSubGuild(subGuild);
}
}
}
// It's now safe to delete the city zone from the database
// which will cause a cascade delete of everything else
if (DbManager.ZoneQueries.DELETE_ZONE(cityZone) == false) {
Logger.error("DestroyCityThread", "Error when deleting city zone: " + cityZone.getObjectUUID());
return;
}
// Refresh the city for map requests
City.lastCityUpdate = System.currentTimeMillis();
} catch (Exception e) {
Logger.error(e);
formerGuild.setGuildState(mbEnums.GuildState.Errant);
formerGuild.setNation(null);
formerGuild.setCityUUID(0);
GuildManager.updateAllGuildTags(formerGuild);
GuildManager.updateAllGuildBinds(formerGuild, null);
}
// By losing the tree, the former owners lose all of their subguilds.
if (!formerGuild.getSubGuildList().isEmpty()) {
subGuildList = new ArrayList<>();
subGuildList.addAll(formerGuild.getSubGuildList());
for (Guild subGuild : subGuildList) {
formerGuild.removeSubGuild(subGuild);
}
}
Building tol = null;
// Build list of buildings within this parent zone
for (Building cityBuilding : cityZone.zoneBuildingSet) {
// Sanity Check in case player deletes the building
// before this thread can get to it
if (cityBuilding == null)
continue;
// Do nothing with the banestone. It will be removed elsewhere
if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.BANESTONE))
continue;
// TOL is processed after all other structures in the city zone
if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.TOL)) {
tol = cityBuilding;
continue;
}
// All buildings are moved to a location relative
// to their new parent zone
localCoords = ZoneManager.worldToLocal(cityBuilding.getLoc(), newParent);
DbManager.BuildingQueries.MOVE_BUILDING(cityBuilding.getObjectUUID(), newParent.getObjectUUID(), localCoords.x, localCoords.y, localCoords.z);
// All buildings are re-parented to a zone one node
// higher in the tree (continent) as we will be
// deleting the city zone very shortly.
if (cityBuilding.getParentZoneID() != newParent.getParentZoneID())
cityBuilding.setParentZone(newParent);
// No longer a tree, no longer any protection contract!
cityBuilding.setProtectionState(mbEnums.ProtectionState.NONE);
// Remove warehouse entry if one exists.
if (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE) {
DbManager.WarehouseQueries.DELETE_WAREHOUSE(city.warehouse);
city.warehouse = null;
}
// Destroy all remaining city assets
if ((cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.BARRACK)
|| (cityBuilding.getBlueprint().isWallPiece())
|| (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.SHRINE)
|| (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.TOL)
|| (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.SPIRE)
|| (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE)) {
if (cityBuilding.getRank() != -1)
BuildingManager.setRank(cityBuilding, -1);
}
}
// Destroy the tol
if (tol != null)
BuildingManager.setRank(tol, -1);
if (city.realm != null)
city.realm.removeCity(city.getObjectUUID());
// It's now safe to delete the city zone from the database
// which will cause a cascade delete of everything else
if (DbManager.ZoneQueries.DELETE_ZONE(cityZone) == false) {
Logger.error("DestroyCityThread", "Database error when deleting city zone: " + cityZone.getObjectUUID());
return;
}
// Refresh the city for map requests
City.lastCityUpdate = System.currentTimeMillis();
// Zone and city should vanish upon next reboot
// if the codebase reaches here.
+259
View File
@@ -0,0 +1,259 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2024
// www.magicbane.com
package engine.wpak;
import engine.gameManager.ConfigManager;
import engine.mbEnums;
import engine.wpak.data.EffectEntry;
import engine.wpak.data.EffectModifier;
import org.pmw.tinylog.Logger;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class EffectsParser {
public static String effectsPath = ConfigManager.DEFAULT_DATA_DIR + "wpak/Effects.cfg";
public static HashMap<String, EffectEntry> effect_data = new HashMap<>();
private static final Pattern EFFECT_REGEX = Pattern.compile("(?<=EFFECTBEGIN)(.+?)(?=EFFECTEND)", Pattern.DOTALL);
private static final Pattern SOURCE_REGEX = Pattern.compile("(?<=SOURCEBEGIN)(.+?)(?=SOURCEEND)", Pattern.DOTALL);
private static final Pattern MODS_REGEX = Pattern.compile("(?<=MODSBEGIN)(.+?)(?=MODSEND)", Pattern.DOTALL);
private static final Pattern CONDITIONS_REGEX = Pattern.compile("(?<=CONDITIONBEGIN)(.+?)(?=CONDITIONEND)", Pattern.DOTALL);
private static final Pattern STRSPLIT_REGEX = Pattern.compile("([^\"]\\S*|\"[^\"]*\")\\s*"); // Regex ignores spaces within quotes
public static void parseWpakFile() {
// Read .wpak file from disk
byte[] fileData = null;
try {
fileData = Files.readAllBytes(Paths.get(effectsPath));
} catch (IOException e) {
throw new RuntimeException(e);
}
String fileContents = new String(fileData);
// Iterate over effect entries from .wpak data
Matcher matcher = EFFECT_REGEX.matcher(fileContents);
while (matcher.find()) {
EffectEntry effectEntry = parseEffectEntry(matcher.group());
effect_data.put(effectEntry.effect_id, effectEntry);
}
}
private static EffectEntry parseEffectEntry(String effectData) {
EffectEntry effectEntry = new EffectEntry();
// Remove all lines that contain a # and leading/trailing blank lines
effectData = effectData.replaceAll("(?m)^(\\s*#.*|\\s*)\r?\n?", "");
effectData = effectData.trim();
// Parse effect entry header
String firstLine;
ArrayList<String> effectHeader = new ArrayList<>();
// Some effects exist without sources/mods or conditions
// (ACID "MOB" 0)
if (effectData.indexOf('\n') > 0)
firstLine = effectData.substring(0, effectData.indexOf('\n'));
else
firstLine = effectData;
Matcher matcher = STRSPLIT_REGEX.matcher(firstLine);
while (matcher.find())
effectHeader.add(matcher.group().trim());
effectEntry.effect_id = effectHeader.get(0);
effectEntry.effect_name = effectHeader.get(1);
effectEntry.effect_name = effectEntry.effect_name.replaceAll("\"", "");
// Some effect mods have no icon
// (SEEINVIS-SHADE "See Invis")
if (effectHeader.size() == 3)
effectEntry.icon = Integer.parseInt(effectHeader.get(2));
else
effectEntry.icon = 0;
// Parse source entries
matcher = SOURCE_REGEX.matcher(effectData);
while (matcher.find())
effectEntry.sources.add(matcher.group().trim());
// Parse modifier entries
matcher = MODS_REGEX.matcher(effectData);
// Iterate effect entries from .wpak config data
while (matcher.find()) {
EffectModifier effectModifier = parseModEntry(matcher.group());
effectEntry.mods.add(effectModifier);
}
// Parse Conditions
matcher = CONDITIONS_REGEX.matcher(effectData);
while (matcher.find()) {
String[] conditions = matcher.group().trim().split("\n");
for (String condition : conditions) {
String[] parameters = condition.trim().split("\\s+");
effectEntry.conditions.put(parameters[0], Float.parseFloat(parameters[1]));
}
}
return effectEntry;
}
private static EffectModifier parseModEntry(String modData) {
EffectModifier effectModifier = new EffectModifier();
String[] modEntries = modData.trim().split("\n");
for (String modEntry : modEntries) {
ArrayList<String> modValues = new ArrayList<>();
Matcher matcher = STRSPLIT_REGEX.matcher(modEntry.trim());
while (matcher.find())
modValues.add(matcher.group().trim());
effectModifier.type = mbEnums.ModType.valueOf(modValues.get(0).trim());
switch (effectModifier.type) {
case BladeTrails: // No parm modifiers
case ImmuneToAttack:
case ImmuneToPowers:
case Ambidexterity:
case Silenced:
case IgnorePassiveDefense:
case Stunned:
case PowerCostHealth:
case Charmed:
case Fly:
case CannotMove:
case CannotTrack:
case CannotAttack:
case CannotCast:
case SpireBlock:
case Invisible:
case SeeInvisible:
break;
case AnimOverride:
effectModifier.min = Float.parseFloat(modValues.get(1).trim());
effectModifier.max = Float.parseFloat(modValues.get(2).trim());
break;
case Health:
case Mana:
case Stamina:
effectModifier.min = Float.parseFloat(modValues.get(1).trim());
effectModifier.max = Float.parseFloat(modValues.get(2).trim());
effectModifier.scale = Float.parseFloat(modValues.get(3).trim());
// Parameter 4 is always 0.
effectModifier.compoundCurveType = mbEnums.CompoundCurveType.valueOf(modValues.get(5).trim());
effectModifier.arg1 = modValues.get(6).trim();
break;
case Attr:
case Resistance:
case Skill:
case HealthRecoverRate:
case ManaRecoverRate:
case StaminaRecoverRate:
case DamageShield:
case HealthFull:
case ManaFull:
case StaminaFull:
case Slay:
case Fade:
case Durability:
effectModifier.min = Float.parseFloat(modValues.get(1).trim());
effectModifier.scale = Float.parseFloat(modValues.get(2).trim());
effectModifier.compoundCurveType = mbEnums.CompoundCurveType.valueOf(modValues.get(3).trim());
if (modValues.size() > 4)
effectModifier.arg1 = modValues.get(4).trim(); // Some HeathFull entries do not have an argument
break;
case MeleeDamageModifier:
case OCV:
case DCV:
case AttackDelay:
case AdjustAboveDmgCap:
case DamageCap:
case ArmorPiercing:
case Speed:
case PowerDamageModifier:
case DR:
case PassiveDefense:
case MaxDamage:
case Value:
case WeaponSpeed:
case MinDamage:
case PowerCost:
case Block:
case Parry:
case Dodge:
case ScanRange:
case ScaleHeight:
case ScaleWidth:
case WeaponRange:
effectModifier.min = Float.parseFloat(modValues.get(1).trim());
effectModifier.scale = Float.parseFloat(modValues.get(2).trim());
effectModifier.compoundCurveType = mbEnums.CompoundCurveType.valueOf(modValues.get(3).trim());
break;
case ItemName:
case BlockedPowerType:
case ImmuneTo:
case BlackMantle:
effectModifier.arg1 = modValues.get(1).trim();
// Some BlockedPowerType entries have only one argument
if (modValues.size() > 2)
effectModifier.arg2 = modValues.get(2).trim();
break;
case NoMod:
case ConstrainedAmbidexterity:
case ProtectionFrom:
case ExclusiveDamageCap:
case IgnoreDamageCap:
effectModifier.arg1 = modValues.get(1).trim();
break;
case WeaponProc:
effectModifier.min = Float.parseFloat(modValues.get(1).trim());
effectModifier.arg1 = modValues.get(2).trim();
effectModifier.scale = Float.parseFloat(modValues.get(3).trim());
break;
default:
Logger.error("Unhandled type: " + effectModifier.type);
break;
}
}
return effectModifier;
}
}
+57
View File
@@ -0,0 +1,57 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2024
// www.magicbane.com
package engine.wpak;
import engine.gameManager.ConfigManager;
import engine.wpak.data.PowerActionEntry;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PowerActionParser {
private static final Pattern STRSPLIT_REGEX = Pattern.compile("([^\"]\\S*|\"[^\"]*\")\\s*");
private static final Pattern POWER_ACTION_REGEX = Pattern.compile("(?<=POWERACTIONBEGIN)(.+?)(?=POWERACTIONEND)", Pattern.DOTALL);
private static final String powerActionPath = ConfigManager.DEFAULT_DATA_DIR + "wpak/PowerActions.cfg";
public static void parseWpakFile() {
// Read .wpak file from disk
byte[] fileData;
try {
fileData = Files.readAllBytes(Paths.get(powerActionPath));
} catch (
IOException e) {
throw new RuntimeException(e);
}
String fileContents = new String(fileData);
// Iterate over power entries from .wpak data
Matcher matcher = POWER_ACTION_REGEX.matcher(fileContents);
while (matcher.find()) {
PowerActionEntry powerActionEntry = parsePowerActionEntry(matcher.group().trim());
}
}
private static PowerActionEntry parsePowerActionEntry(String powerActionData) {
PowerActionEntry powerActionEntry = new PowerActionEntry();
return powerActionEntry;
}
}
+316
View File
@@ -0,0 +1,316 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2024
// www.magicbane.com
package engine.wpak;
import engine.gameManager.ConfigManager;
import engine.mbEnums;
import engine.wpak.data.*;
import org.pmw.tinylog.Logger;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PowersParser {
private static final Pattern POWER_REGEX = Pattern.compile("(?<=POWERBEGIN)(.+?)(?=POWEREND)", Pattern.DOTALL);
private static final Pattern STRSPLIT_REGEX = Pattern.compile("([^\"]\\S*|\"[^\"]*\")\\s*");
private static final Pattern CONDITION_REGEX = Pattern.compile("(?<=CONDITIONBEGIN)(.+?)(?=CONDITIONEND)", Pattern.DOTALL);
private static final String powersPath = ConfigManager.DEFAULT_DATA_DIR + "wpak/Powers.cfg";
public static void parseWpakFile() {
// Read .wpak file from disk
byte[] fileData;
try {
fileData = Files.readAllBytes(Paths.get(powersPath));
} catch (IOException e) {
throw new RuntimeException(e);
}
String fileContents = new String(fileData);
// Iterate over power entries from .wpak data
Matcher matcher = POWER_REGEX.matcher(fileContents);
while (matcher.find()) {
PowerEntry powerEntry = parsePowerEntry(matcher.group().trim());
}
}
private static PowerEntry parsePowerEntry(String powerData) {
PowerEntry powerEntry = new PowerEntry();
try {
StringBuilder conditionString = new StringBuilder();
StringBuilder powerString = new StringBuilder();
int endPos = 0;
// Separate out any conditions from the power data
Matcher matcher = CONDITION_REGEX.matcher(powerData);
while (matcher.find()) {
conditionString.append(matcher.group().trim());
powerString.append(powerData, endPos, matcher.start());
endPos = matcher.end();
}
powerString.append(powerData.substring(endPos));
// Cleanup dangling tags and lines that contain a # and leading/trailing blank lines
powerString = new StringBuilder(powerString.toString().replaceAll("CONDITIONBEGINCONDITIONEND", ""));
powerString = new StringBuilder(powerString.toString().replaceAll("(?m)^(\\s*#.*|\\s*)\r?\n?", ""));
conditionString = new StringBuilder(conditionString.toString().replaceAll("(?m)^(\\s*#.*|\\s*)\r?\n?", ""));
// Parse header line in power data
String[] lineData = powerString.toString().trim().split("\n");
ArrayList<String> powerHeader = new ArrayList<>();
String headerString = lineData[0];
headerString = headerString.replace("\n", " ");
matcher = STRSPLIT_REGEX.matcher(headerString);
while (matcher.find())
powerHeader.add(matcher.group().trim());
java.util.Iterator<String> iterator = powerHeader.iterator();
powerEntry.power_id = iterator.next();
powerEntry.power = iterator.next().replaceAll("\"", "");
PowerData power = new PowerData();
power.power_type = mbEnums.PowerType.valueOf(iterator.next());
power.icon = Integer.parseInt(iterator.next());
power.powerBase = iterator.next().replaceAll("\"", "");
powerEntry.powers.add(power);
String nextValue = iterator.next();
// Account for second definition
if (nextValue.equals("SPELL") || nextValue.equals("SKILL")) {
power = new PowerData();
power.power_type = mbEnums.PowerType.valueOf(nextValue);
power.icon = Integer.parseInt(iterator.next());
power.powerBase = iterator.next().replaceAll("\"", "");
powerEntry.powers.add(power);
powerEntry.target_type = mbEnums.PowerTargetType.valueOf(iterator.next());
} else
powerEntry.target_type = mbEnums.PowerTargetType.valueOf(nextValue);
powerEntry.range = Integer.parseInt(iterator.next());
powerEntry.areaType = mbEnums.AreaType.valueOf(iterator.next());
powerEntry.areaRange = Integer.parseInt(iterator.next());
powerEntry.excludeType = mbEnums.ExcludeType.valueOf(iterator.next());
powerEntry.costType = mbEnums.CostType.valueOf(iterator.next());
powerEntry.cost = Float.parseFloat(iterator.next());
powerEntry.difficulty = Float.parseFloat(iterator.next());
powerEntry.precision = Float.parseFloat(iterator.next());
powerEntry.init_time = Float.parseFloat(iterator.next().replaceAll("(\\.0)+$", ""));
powerEntry.release_time = Float.parseFloat(iterator.next());
powerEntry.recycle_time = Float.parseFloat(iterator.next());
powerEntry.hitRollYN = Integer.parseInt(iterator.next());
powerEntry.castingMode = mbEnums.CastingModeType.valueOf(iterator.next());
powerEntry.initAmin = Integer.parseInt(iterator.next());
powerEntry.releaseAnim = Integer.parseInt(iterator.next());
powerEntry.targetSelect = mbEnums.TargetSelectType.valueOf(iterator.next());
// Process key value pairs after header
iterator = Arrays.stream(lineData).iterator();
iterator.next(); // Ignore header
while (iterator.hasNext()) {
String lineValue = iterator.next();
String[] lineValues = lineValue.split("=");
String key = lineValues[0].trim();
ActionEntry actionEntry;
String[] arguments;
Matcher matcher1;
ArrayList<String> args;
switch (key) {
case "ACTION":
actionEntry = new ActionEntry();
arguments = lineValues[1].trim().split("\\s+");
if (powerEntry.power_id.equals("HNT-050"))
Logger.error("debug");
actionEntry.effect_id = arguments[0];
actionEntry.minTrains = Integer.parseInt(arguments[1]);
actionEntry.maxTrains = Integer.parseInt(arguments[2]);
actionEntry.duration = Float.parseFloat(arguments[3]);
actionEntry.curve = mbEnums.CompoundCurveType.valueOf(arguments[4]);
actionEntry.stackingCategory = arguments[5];
actionEntry.stackingPriority = Integer.parseInt(arguments[6]);
actionEntry.categoryToPower = mbEnums.CategoryToPowerType.valueOf(arguments[7]);
powerEntry.actionEntries.add(actionEntry);
break;
case "MaxLevel":
powerEntry.maxLevel = Integer.parseInt(lineValues[1].trim());
break;
case "HateValue":
arguments = lineValues[1].trim().split("\\s+");
powerEntry.hateValue = Integer.parseInt(arguments[0]);
// Not all entries have a curve. Defaults to DefaultFlat;
if (arguments.length > 1)
powerEntry.hateCurve = mbEnums.CompoundCurveType.valueOf(arguments[1]);
break;
case "LOOPANIMID":
powerEntry.loopAnimID = Integer.parseInt(lineValues[1].trim());
break;
case "GRANTOVERRIDEVAR":
powerEntry.grantOverrideVar = lineValues[1].trim();
break;
case "DESCRIPTION":
powerEntry.description.add(lineValues[1].trim());
break;
case "CATEGORY":
powerEntry.category = lineValues[1].trim();
break;
case "CURVE":
arguments = lineValues[1].trim().split("\\s+");
powerEntry.curves.put(arguments[0], mbEnums.CompoundCurveType.valueOf(arguments[1]));
break;
case "EQPREREQ":
EquipmentPreReq equipmentPreReq = new EquipmentPreReq();
matcher1 = STRSPLIT_REGEX.matcher(lineValues[1].trim());
args = new ArrayList<>();
while (matcher1.find())
args.add(matcher1.group().trim());
equipmentPreReq.slot = mbEnums.EquipSlotType.valueOf(args.get(0));
equipmentPreReq.skill = args.get(1).replaceAll("\"", "");
equipmentPreReq.level = Integer.parseInt(args.get(2));
powerEntry.equipmentPreReq = equipmentPreReq;
break;
case "CANCASTWHILEMOVING":
powerEntry.canCastWhileMoving = Boolean.parseBoolean(lineValues[1].trim());
break;
case "CANCASTWHILEFLYING":
powerEntry.canCastWhileFlying = Boolean.parseBoolean(lineValues[1].trim());
break;
case "BLADETRAILS":
powerEntry.bladeTrails = Boolean.parseBoolean(lineValues[1].trim());
break;
case "EFFECTPREREQ":
EffectDescription effectPreReq = new EffectDescription();
arguments = lineValues[1].trim().split("\\s+");
effectPreReq.effect_id = arguments[9];
effectPreReq.level = Integer.parseInt(arguments[1]);
effectPreReq.message = arguments[2];
powerEntry.effectPreReqs.add(effectPreReq);
break;
case "MONSTERTYPERESTRICTS":
arguments = lineValues[1].trim().split("\\s+");
for (String restriction : arguments)
powerEntry.monsterRestricts.add(mbEnums.MonsterType.valueOf(restriction.trim()));
break;
case "MONSTERTYPEPREREQS":
arguments = lineValues[1].trim().split("\\s+");
for (String restriction : arguments)
powerEntry.monsterPrereqs.add(mbEnums.MonsterType.valueOf(restriction.trim()));
break;
case "SHOULDCHECKPATH":
powerEntry.shouldCheckPath = Boolean.parseBoolean(lineValues[1].trim());
break;
case "STICKY":
powerEntry.sticky = Boolean.parseBoolean(lineValues[1].trim());
break;
case "PULSEINFO":
arguments = lineValues[1].trim().split("\\s+");
powerEntry.pulseCycle = Integer.parseInt(arguments[0]);
powerEntry.pulseDuration = Integer.parseInt(arguments[1]);
break;
case "MAXNUMMOBTARGETS":
powerEntry.maxMobTargets = Integer.parseInt(lineValues[1].trim());
break;
case "MAXNUMPLAYERTARGETS":
powerEntry.maxPlayerTargets = Integer.parseInt(lineValues[1].trim());
break;
case "ISADMINPOWER":
powerEntry.isAdminPower = Boolean.parseBoolean(lineValues[1].trim());
break;
case "ISPROJECTILE":
powerEntry.isProjectile = Boolean.parseBoolean(lineValues[1].trim());
break;
case "CASTERSPULSEPARTICLE":
powerEntry.casterPulseParticle = Integer.parseInt(lineValues[1].trim());
break;
case "TARGETEFFECTPREREQS_ORED":
EffectDescription preReq = new EffectDescription();
arguments = lineValues[1].trim().split("\\s+");
preReq.effect_id = arguments[0];
preReq.level = Integer.parseInt(arguments[1]);
powerEntry.targetEffectPrereqs.add(preReq);
break;
case "SOUNDS": // Values not parsed
case "APPLYDAMAGESELF":
case "APPLYDAMAGECASTER":
case "APPLYDAMAGEOTHER":
case "APPLYDAMAGETARGET":
case "APPLYEFFECTSELF":
case "APPLYEFFECTOTHER":
case "APPLYEFFECTCASTER":
case "APPLYEFFECTTARGET":
case "FIZZLEOTHER":
case "FIZZLESELF":
case "INITSTRING":
case "SUCCESSOTHER":
case "SUCCESSSELF":
case "WEAROFFEFFECTOTHER":
case "WEAROFFEFFECTSELF":
break;
default:
Logger.error("Unhandled variable type:" + key + " for power: " + powerEntry.power_id);
}
}
// Parse power conditions
if (conditionString.toString().isEmpty() == false) {
String[] conditions = conditionString.toString().split("\n");
for (String condition : conditions) {
String[] parameters = condition.trim().split("\\s+");
powerEntry.conditions.put(parameters[0], Float.parseFloat(parameters[1]));
}
}
} catch (Exception e) {
Logger.error(powerEntry.power_id + " " + e);
}
return powerEntry;
}
}
+24
View File
@@ -0,0 +1,24 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2024
// www.magicbane.com
package engine.wpak.data;
import engine.mbEnums;
public class ActionEntry {
public String effect_id;
public int minTrains;
public int maxTrains;
public float duration;
public String stackingCategory;
public mbEnums.CompoundCurveType curve;
public int stackingPriority;
public mbEnums.CategoryToPowerType categoryToPower;
}
@@ -0,0 +1,15 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2024
// www.magicbane.com
package engine.wpak.data;
public class EffectDescription {
public String effect_id;
public int level;
public String message;
}
+22
View File
@@ -0,0 +1,22 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2024
// www.magicbane.com
package engine.wpak.data;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
public class EffectEntry {
public String effect_id;
public String effect_name;
public int icon;
public HashSet<String> sources = new HashSet<>();
public ArrayList<EffectModifier> mods = new ArrayList<>();
public HashMap<String, Float> conditions = new HashMap<>();
}
+22
View File
@@ -0,0 +1,22 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2024
// www.magicbane.com
package engine.wpak.data;
import engine.mbEnums;
public class EffectModifier {
public mbEnums.ModType type;
public float min;
public float max;
public float scale;
public mbEnums.CompoundCurveType compoundCurveType;
public String arg1; // ItemName "Masterwork" ""
public String arg2; // ItemName "" "of the Defender"
}
+19
View File
@@ -0,0 +1,19 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2024
// www.magicbane.com
package engine.wpak.data;
import engine.mbEnums;
public class EquipmentPreReq {
public mbEnums.EquipSlotType slot;
public String skill;
public int level;
}
@@ -0,0 +1,18 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2024
// www.magicbane.com
package engine.wpak.data;
import java.util.ArrayList;
public class PowerActionEntry {
public String action_id;
public String action_type;
public ArrayList<EffectDescription> effects;
}
+17
View File
@@ -0,0 +1,17 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2024
// www.magicbane.com
package engine.wpak.data;
import engine.mbEnums;
public class PowerData {
public mbEnums.PowerType power_type;
public int icon;
public String powerBase;
}
+69
View File
@@ -0,0 +1,69 @@
// ·. · · · · .
// · ·
// · ·
//
// · · ·
// Magicbane Emulator Project © 2013 - 2024
// www.magicbane.com
package engine.wpak.data;
import engine.mbEnums;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashMap;
public class PowerEntry {
public String power_id;
public String power;
public ArrayList<PowerData> powers = new ArrayList<>();
public mbEnums.PowerTargetType target_type;
public int range;
public mbEnums.AreaType areaType;
public int areaRange;
public mbEnums.ExcludeType excludeType;
public mbEnums.CostType costType;
public float cost;
public float difficulty;
public float precision;
public float init_time;
public float release_time;
public float recycle_time;
public int hitRollYN;
public mbEnums.CastingModeType castingMode;
public int initAmin;
public int releaseAnim;
public mbEnums.TargetSelectType targetSelect;
// Additional key/value type power entries
public ArrayList<ActionEntry> actionEntries = new ArrayList<>();
public int maxLevel;
public int hateValue;
public mbEnums.CompoundCurveType hateCurve = mbEnums.CompoundCurveType.DefaultFlat;
public int loopAnimID;
public String grantOverrideVar;
public ArrayList<String> description = new ArrayList<>();
public HashMap<String, mbEnums.CompoundCurveType> curves = new HashMap<>();
public String category;
public boolean canCastWhileMoving = false;
public boolean bladeTrails = false;
public ArrayList<EffectDescription> effectPreReqs = new ArrayList<>();
public EquipmentPreReq equipmentPreReq;
public EnumSet<mbEnums.MonsterType> monsterRestricts = EnumSet.noneOf(mbEnums.MonsterType.class);
public EnumSet<mbEnums.MonsterType> monsterPrereqs = EnumSet.noneOf(mbEnums.MonsterType.class);
public boolean shouldCheckPath = false;
public boolean sticky = false;
public int pulseCycle;
public int pulseDuration;
public int maxMobTargets;
public int maxPlayerTargets;
public boolean isAdminPower = false;
public int casterPulseParticle;
public ArrayList<EffectDescription> targetEffectPrereqs = new ArrayList<>();
public boolean canCastWhileFlying = false;
public boolean isProjectile = false;
public HashMap<String, Float> conditions = new HashMap<>();
}