Compare commits

..

1992 Commits
v104.6 ... v105

Author SHA1 Message Date
Anuken
23c56974b2 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	core/assets/bundles/bundle_uk_UA.properties
2020-09-15 19:28:57 -04:00
Anuken
a5ce57e56d Deployment fixes 2020-09-15 19:28:38 -04:00
Prosta4okua
7e2b3a6e2d Ukrainian translation (#2492)
* Український переклад :flag_ua:

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties

* Оновлення перекладу до стану 10.09.2020

* Update bundle_uk_UA.properties

* Оновлення на 15.09.2020

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties
2020-09-15 18:21:11 -04:00
Anuken
234649bd68 Weather tweaks 2020-09-15 18:20:56 -04:00
Anuken
d655f95b67 Random weather wind direction 2020-09-15 18:15:26 -04:00
Anuken
a3abad34e3 arc 2020-09-15 18:00:49 -04:00
Anuken
903a2c069e Merge remote-tracking branch 'origin/master' 2020-09-15 18:00:39 -04:00
Anuken
306a660e87 Custom map weather definition 2020-09-15 18:00:29 -04:00
Petr Gašparík
e624c42026 Czech translation - up-to-date! (#2393)
* Czech translation - up-to-date!

* fix
2020-09-15 16:44:54 -04:00
Felix Corvus
76ed066a95 [Bundle][RU] actual L10n (#2381)
* Update bundle_ru.properties

* Update bundle_ru.properties

* Update bundle_ru.properties

* *Командный центр*

* Update bundle_ru.properties

* Update bundle_ru.properties

Новые (нет) юниты, Scepter и Reign

* Забыл про Toxopid

* [ru l10n] Обходчик -> Ползун

* Update bundle_ru.properties

* Update bundle_ru.properties

* Update bundle_ru.properties

* BasedUser was trolled by Anuke

* Update bundle_ru.properties

* Ого, вот это обновление окружения!

* *Ы*

* Update bundle_ru.properties

* Update bundle_ru.properties

* Update achievements.vdf

* Update bundle_ru.properties

* Пункт снаряжения -> Пункт снабжения

Co-authored-by: TheSlaylord <62336673+TheSlaylord@users.noreply.github.com>
2020-09-15 16:44:29 -04:00
Anuken
24baa77c47 Merge remote-tracking branch 'origin/master' 2020-09-15 14:01:23 -04:00
Anuken
b06a9cbf16 Query V6 servers on non-BE instead of standard servers 2020-09-15 14:01:20 -04:00
Anuken
c53bb52d94 Added list for v6 servers (currently empty) 2020-09-15 13:59:32 -04:00
Anuken
f609ee77a4 Bridge align fix 2020-09-15 13:56:42 -04:00
Anuken
d1b5b7eb3c Fixed #2556 2020-09-15 13:47:00 -04:00
Anuken
2e8d6b56df arc 2020-09-15 13:19:17 -04:00
Anuken
b3d7515dcd Line optimization & cleanup 2020-09-15 13:19:02 -04:00
Anuken
1327a2bef4 Mega repair AI 2020-09-15 10:39:45 -04:00
Anuken
757e0fbda0 Cleanup 2020-09-14 16:56:32 -04:00
Anuken
b603409f74 arc 2020-09-14 14:09:33 -04:00
Anuken
50816deb9e Smarter payload routers / 2x display / Campaign tweaks 2020-09-14 14:09:15 -04:00
Anuken
d6447cb31a Fixed #2553 2020-09-14 11:13:27 -04:00
Anuken
8901838c19 Fixed #2551 2020-09-14 09:41:54 -04:00
Anuken
5c63ff889a what 2020-09-13 23:30:51 -04:00
Anuken
3f1ed6d4a4 Bugfixes 2020-09-13 23:11:24 -04:00
Anuken
bbb9b3ef62 Bugfixes & unit status polish 2020-09-13 22:30:05 -04:00
Anuken
0e78751c6c Turret ammo display 2020-09-13 21:22:39 -04:00
Anuken
7ce93c7f85 Prototype health/ammo indication 2020-09-13 21:08:24 -04:00
Anuken
be229f441e click fix 2020-09-13 14:32:15 -04:00
Anuken
30c45e6a43 arc 2020-09-13 14:30:45 -04:00
Anuken
f3921e3dcc Minor optimization 2020-09-13 14:30:31 -04:00
Anuken
48391219fd Packed sprites for cliff removal 2020-09-13 12:18:41 -04:00
Anuken
27e9b5aeb9 Removed cliffs / Nerfed explosion bombing 2020-09-13 12:13:42 -04:00
Anuken
bab43859f5 Bugfixes 2020-09-13 10:02:10 -04:00
Anuken
1fd98fe07c Bugfixes (2) 2020-09-12 23:43:03 -04:00
Anuken
4d6c8ade98 Bugfixes 2020-09-12 23:41:25 -04:00
Anuken
8234f31e83 Various tweaks 2020-09-12 21:41:43 -04:00
Anuken
e5ff429241 ??? 2020-09-12 15:32:35 -04:00
Anuken
b58b6c7361 Fixed #2544 2020-09-12 14:57:00 -04:00
Anuken
640a45ea66 Rhino update 2020-09-12 13:03:36 -04:00
Anuken
5ce8e6339d Merge remote-tracking branch 'origin/master' 2020-09-12 12:47:29 -04:00
Anuken
fa9611e28c Bugfixes 2020-09-12 12:47:18 -04:00
Sunny Kim
b5b75656d1 Block Fields for Modding (#2538)
* quickRotate

* quickRotate and rotateArrow

* rotateArrow

* rotateArrow

* Update contributors

* quickRotate

* removed rotateArrow

* remove rotateArrow

* removal
2020-09-12 10:11:10 -04:00
Anuken
197b67f8c1 Fixed #2543 2020-09-12 09:51:57 -04:00
Anuken
c95f0674b6 Fixed outdated fuse schematic 2020-09-11 23:28:22 -04:00
Anuken
1c6fed8df8 Many things that won't fit in a commit message 2020-09-11 23:04:19 -04:00
Anuken
3feb9e76f0 Allowed Steam name change / T4+5 reconstructor cost increase 2020-09-11 19:57:46 -04:00
Anuken
3d8fb1b6ca Bridge fixes 2020-09-11 13:36:10 -04:00
Anuken
83d9bd7d81 Difficulty indicator for sectors / Power sense FPS scale 2020-09-11 10:42:16 -04:00
Anuken
5373011058 Merge remote-tracking branch 'origin/master' 2020-09-10 22:20:27 -04:00
Anuken
c0ca134c5d Fixed #2537 (mostly) 2020-09-10 22:20:20 -04:00
LordChrom
007a0da40a Bugfix for Logic Ops (#2535)
Performing some operations on larger numbers gave erroneous results when converting from doubles to ints. Now uses longs instead, which should help.
2020-09-10 19:14:03 -04:00
Anuken
e6eb847d81 Fixed #2536 2020-09-10 19:09:00 -04:00
Anuken
7c1d035977 Bugfixes 2020-09-10 16:45:48 -04:00
Anuken
260a6bac6d arc 2020-09-10 15:17:49 -04:00
Anuken
74cefb3ec9 Dacite decoration block / Environmental renaming 2020-09-10 15:17:10 -04:00
Anuken
88e3022db0 files that intelliJ missed despite me hitting refresh 2020-09-10 12:14:12 -04:00
Anuken
0e61d61dd2 Saner naming scheme of wall blocks 2020-09-10 12:09:25 -04:00
Anuken
aec4a07aec Fixed steam-generator bundle name 2020-09-10 10:29:54 -04:00
Anuken
55b6abffd1 Fixed #2530 2020-09-10 09:24:25 -04:00
Anuken
3e2fcfa30f Fixed #2529 2020-09-10 09:20:54 -04:00
Anuken
3b5d6860d6 Bugfixes 2020-09-09 23:39:00 -04:00
Anuken
2260e6824c Fixed minGameVersion / Crawler command / New rules 2020-09-09 22:17:26 -04:00
Anuken
c5cb2d8683 Miner unit bugfixes 2020-09-09 19:09:56 -04:00
Anuken
5259969384 Object sense support / Bugfixes 2020-09-09 19:02:40 -04:00
Anuken
c03e3f56aa Added min-game-version 105 enforcement 2020-09-09 16:40:08 -04:00
Anuken
6787bbdc05 Better builder AI / Various tweaks 2020-09-09 10:39:18 -04:00
Anuken
d9a067b4d2 Small sprite tweaks & bugfixes 2020-09-08 21:40:50 -04:00
Anuken
ac88d84322 Various base generation tweaks 2020-09-08 16:25:01 -04:00
Anuken
ef617b7fd2 New base parts 2020-09-08 15:46:24 -04:00
Anuken
905f1608de Merge remote-tracking branch 'origin/master' 2020-09-08 11:54:32 -04:00
Anuken
fdca6771fb Better attack-mode core spawning limits 2020-09-08 11:54:23 -04:00
Aryan Pawar
66038b77c4 Hindi Translations for the Google Play page (Updated) (#2518)
Removed the Images so that fastlane uses default images as Anuke suggested.
2020-09-08 10:21:06 -04:00
Anuken
27565cfe1c Merge remote-tracking branch 'origin/master' 2020-09-08 10:05:45 -04:00
Anuken
b66c29e12c Cleanup 2020-09-08 10:05:41 -04:00
Recessive
1f41a2e8c0 Update servers.json (#2327)
* Update servers.json

Add AA assimilation server to global listing

* Update servers.json
2020-09-08 09:36:09 -04:00
zethnest
1439f9d14b [QOL] Quick Copy Implementation (#2097)
* quick copy implementation

* quick copy implementation

* limit break + copy to schematic size

changed default

added comments

* fix error

* fix cannot copy schematic after placing

Co-authored-by: Anuken <arnukren@gmail.com>
2020-09-08 09:27:41 -04:00
Anuken
b6912254c4 Translations for startup message 2020-09-07 18:00:25 -04:00
Anuken
1b5a338e1e Merge remote-tracking branch 'origin/master' 2020-09-07 17:07:01 -04:00
Anuken
fe76490418 Fixed #2515 2020-09-07 17:06:56 -04:00
DeltaNedas
29b31daba7 ignore indentation in imported assembly (#2511)
* ignore indentation in imported assembly

* oop

* Update LAssembler.java
2020-09-07 11:13:28 -04:00
Anuken
15bb01fd22 Slight steam generator nerf + differential buff 2020-09-07 09:40:22 -04:00
Anuken
93d1904978 Fixed payload calculations not using squares 2020-09-06 22:19:30 -04:00
Anuken
010a1594fa Name fixes 2020-09-06 19:09:41 -04:00
Anuken
1d191f1914 Merge remote-tracking branch 'origin/master' 2020-09-06 17:13:18 -04:00
Anuken
7b18389d45 Payload system rework (#2485) 2020-09-06 17:13:14 -04:00
Somka000
7f874f87c4 Second pvp server 6.0 (#2510)
Because players like pvp and attack, but i cant host 2 gamemodes in one server.
2020-09-06 17:05:53 -04:00
Anuken
27d9f965be Fixed #2507 2020-09-06 14:54:10 -04:00
Anuken
0a3193f1d6 Merge remote-tracking branch 'origin/master' 2020-09-06 13:26:30 -04:00
Anuken
2a995efa2a Fixed default campaign core spawning units in blocks 2020-09-06 13:26:23 -04:00
Anuken
f5fa737867 Update CONTRIBUTING.md 2020-09-06 12:09:52 -04:00
Sunny Kim
8a6b5668fa Distribution/PowerNode/TractorBeamTurret fields for modding (#2498)
* Effect stuff for quezler conveyors

* shootSound for mass driver

* *color intensifies*

* Update TractorBeamTurret.java

* Update MassDriver.java

Co-authored-by: Anuken <arnukren@gmail.com>
2020-09-06 11:55:24 -04:00
Anuken
cbce04f70f Fixed #2502 2020-09-06 10:05:10 -04:00
Anuken
e5674b1b1e Fixed #2501 2020-09-06 09:41:48 -04:00
Anuken
50a94af0d1 Fixed #2500 2020-09-06 09:07:51 -04:00
Anuken
9bdf27fe3e Merge remote-tracking branch 'origin/master' 2020-09-05 22:58:11 -04:00
Anuken
e267519c6d Balance & bugfixes 2020-09-05 22:58:07 -04:00
Anuken
e4078b1c2f Update README.md 2020-09-05 20:46:02 -04:00
Anuken
f87bd78674 Placement config code cleanup 2020-09-05 20:41:50 -04:00
Anuken
c483ae2c23 Fixed certain teams not attacking other units 2020-09-05 15:03:13 -04:00
Anuken
09e34da880 Bugfixes 2020-09-05 13:35:36 -04:00
Anuken
9fb570f965 Merge remote-tracking branch 'origin/master' 2020-09-05 11:52:00 -04:00
Anuken
ad7692b110 Added debug logging for erroneous rate limit
I still don't know what causes this and I can't reproduce it locally
2020-09-05 11:51:50 -04:00
Sunny Kim
ec447fa2c0 More defense fields for modding(fixed) (#2490)
* lightningColor for Shock Mines

Because various colored lightning is widely used in 6.0, this would be neat for modders.

* doorSound

* just...in case

* oh no
2020-09-05 10:15:33 -04:00
Anuken
bc74208c8c Merge remote-tracking branch 'origin/master' 2020-09-05 10:14:53 -04:00
Anuken
631b0a7761 Fixed #2491 2020-09-05 10:14:46 -04:00
Sunny Kim
f447aeff3e More wall fields for modding (#2486)
* More wall fields for mods

- `flashColor` (`flashWhite` is renamed to `flashHit` since it isn't white anymore)
- `lightningColor`

* Update Blocks.java
2020-09-05 08:50:46 -04:00
Anuken
12f1ee9537 Overdriveable bridges 2020-09-05 08:47:38 -04:00
Anuken
68f00a8983 Bugfixes 2020-09-04 22:36:38 -04:00
Anuken
d77830ebf0 Added boss mechs to reconstructors 2020-09-04 22:17:28 -04:00
Anuken
739c4f2de2 Final mech boss unit (unfinished) 2020-09-04 22:05:15 -04:00
Anuken
3127bb54b2 Merge remote-tracking branch 'origin/master' 2020-09-04 14:28:04 -04:00
Anuken
ee2b099799 Initial Vestige mech implementation 2020-09-04 14:27:55 -04:00
Anuken
be962d6e2e jenkins is gone 2020-09-04 11:12:05 -04:00
Anuken
c7522ff89f Fixed more unit warp 2020-09-04 11:07:01 -04:00
Anuken
af47e7662f Reduced ridiculous wave spacing in campaign 2020-09-03 21:23:36 -04:00
Anuken
ba1363895e Fixed projector clipping 2020-09-03 19:17:49 -04:00
Anuken
07305aecf4 Unit bugfixes 2020-09-03 16:02:14 -04:00
Anuken
90247e3b27 Fixed #2472 2020-09-03 15:23:08 -04:00
Anuken
686d922119 arc 2020-09-03 14:06:08 -04:00
Anuken
90aed50ca8 Many various fixes 2020-09-03 14:04:30 -04:00
Anuken
13a2319416 Merge branch 'master' of https://github.com/Anuken/Mindustry into refactor-paths
 Conflicts:
	core/src/mindustry/ai/types/GroundAI.java
2020-09-03 09:18:06 -04:00
Anuken
a6ee946024 Pathfinder progress 2020-09-03 09:17:21 -04:00
Anuken
d4166c4f1f Merge remote-tracking branch 'origin/master' 2020-09-02 18:27:06 -04:00
Anuken
ed02eadb76 Bugfixes 2020-09-02 18:27:02 -04:00
Anuken
c0c2d2da35 Update servers.json 2020-09-02 17:45:02 -04:00
Anuken
eac99d30f9 Update servers_be.json 2020-09-02 16:37:34 -04:00
Anuken
439c9c5599 Bugfixes 2020-09-02 16:24:05 -04:00
Anuken
0cc3bcb121 Fixed #2477 2020-09-02 14:39:02 -04:00
Anuken
b3e7b9e65b Cleanup 2020-09-02 14:30:56 -04:00
Anuken
6f6e9f4cc2 Initial Toxopid implementation 2020-09-02 13:32:08 -04:00
Anuken
6de1920042 Fixed #2476 2020-09-02 09:35:03 -04:00
Anuken
c1cc11c7cb Initial toxopid sprites, WIP 2020-09-02 00:13:25 -04:00
Anuken
f1772418f2 Bugfixes 2020-09-01 16:11:54 -04:00
Anuken
8e17571824 Fixed #2449 / Fixed #2456 / Fixed #2458 / Fixed #2459 / Fixed #2466 / Fixed #2474 2020-09-01 11:34:03 -04:00
Anuken
6e3162aec2 Update README.md 2020-08-31 21:53:42 -04:00
Anuken
c9b37419c7 Fixed #2455 2020-08-31 07:43:53 -05:00
Anuken
b1e39b1bcb Update BuildBlock.java 2020-08-30 09:58:47 -05:00
Anuken
899b2f6aac Update bug_report.md 2020-08-30 09:56:31 -05:00
Anuken
540a5f30cb Update Turret.java 2020-08-30 09:34:30 -05:00
Anuken
f2cc56ddc8 Fixed #2452 2020-08-30 09:02:44 -05:00
Anuken
e41b17543f Update LiquidModule.java 2020-08-30 08:58:53 -05:00
Anuken
d40cff0741 Update CoreBlock.java 2020-08-30 08:19:28 -05:00
Anuken
02a9e2cd57 ??? 2020-08-29 11:54:20 -05:00
DeltaNedas
1f543f6c18 fix #2460 (#2461) 2020-08-29 11:18:40 -05:00
Anuken
d1094492bd Update settings.gradle 2020-08-28 21:05:07 -05:00
Sunny Kim
7f1fdf035e 블럭 -> 블록 (#2445)
A common mistake; 블록 is right and 블럭 is wrong. See #1912
2020-08-28 21:03:43 -05:00
Anuken
44b0ef408f testing BE builds 2020-08-27 20:21:20 -04:00
Anuken
a575ad2d99 Cleanup 2020-08-27 20:09:40 -04:00
Anuken
92aba83450 Cleanup 2020-08-27 13:45:07 -04:00
Anuken
fba7f7592b Fixed captured sectors being lost 2020-08-27 11:42:45 -04:00
Anuken
3f0dd7264d Removed useless menu button for desktop 2020-08-27 11:38:12 -04:00
Anuken
b7ec90e7c0 Launch/map buttons for mobile campaign / Bugfixes 2020-08-27 11:35:58 -04:00
Anuken
89c007fcdb Merge branch '16bititemtest' 2020-08-27 11:12:44 -04:00
Anuken
a5b27dc339 Merge remote-tracking branch 'origin/master' 2020-08-27 09:31:53 -04:00
Anuken
390367f253 Fixed #2440 2020-08-27 09:31:49 -04:00
Anuken
7ea558a187 Merge pull request #2438 from BasedUser/master
Add routerchain.ddns.net to BE server list
2020-08-26 20:29:27 -04:00
Anuken
c3fbecf858 Merge branch 'master' into master 2020-08-26 20:29:05 -04:00
BasedUser
5ecfb7c51d Add routerchain.ddns.net to BE server list 2020-08-27 03:21:11 +03:00
Anuken
bac8c20b0b literally nothing 2020-08-26 20:10:22 -04:00
Anuken
480a9e38b4 when your internet cuts out in the middle of a commit 2020-08-26 16:53:20 -04:00
Anuken
97fc46cffe #2434 2020-08-26 16:48:12 -04:00
Anuken
6a7d2303a4 Fixed disconnected players not being removed 2020-08-26 14:55:07 -04:00
Anuken
5bf7401139 Fixed a crash 2020-08-26 14:50:43 -04:00
Anuken
8a36b3e590 Bugfixes 2020-08-26 14:35:43 -04:00
Anuken
1c12740006 arc 2020-08-26 13:57:20 -04:00
Anuken
fa9deece91 Fixed #2433 2020-08-26 13:56:58 -04:00
Anuken
0b6ef1c57c Fixed ghost units appearing in certain situations 2020-08-26 12:25:27 -04:00
Anuken
9735e18acf Fixed server NaN contamination 2020-08-26 11:51:42 -04:00
Anuken
20eb7bc05b Merge remote-tracking branch 'origin/master' 2020-08-26 09:21:26 -04:00
Anuken
be74e954fa Fixed #2427 / Fixed #2429 2020-08-26 09:21:18 -04:00
Anuken
cc45e063cd Merge pull request #2428 from Phlosioneer/eclipse-gitignore-update
Update Eclipse section of gitignore
2020-08-26 09:18:34 -04:00
Phlosioneer
f8a3db6b99 Update Eclipse section of gitignore
The various /bin directories were out of date
2020-08-26 02:03:16 -04:00
Anuken
1461673168 Fixed #2425 (probably) 2020-08-25 23:14:11 -04:00
Anuken
71b55317c1 Balance 2020-08-25 22:24:46 -04:00
Anuken
bce85ded79 Added arkyid boss 2020-08-25 22:01:46 -04:00
Anuken
58182fe040 16bit items 2020-08-25 20:56:44 -04:00
Anuken
6a23439fce Fixed #2424 2020-08-25 19:46:14 -04:00
Anuken
c191dd8855 Cleanup 2020-08-25 15:06:09 -04:00
Anuken
898867db8f Merge pull request #2412 from DeltaNedas/input
make input fields public
2020-08-25 15:05:13 -04:00
Anuken
ea9ebe26a3 Fixed air units spawning on wrong end of map / Fixed kick message spam 2020-08-25 14:38:07 -04:00
Anuken
8143b8d80a Fixed mobile crash 2020-08-25 13:03:19 -04:00
Anuken
51e4b10437 Fire rule 2020-08-25 12:59:15 -04:00
Anuken
a98dc0b31f Rule tweaks 2020-08-25 12:52:13 -04:00
Anuken
da360f54e9 Block explosion damage rule 2020-08-25 12:46:41 -04:00
Anuken
7239c2cf08 Balance 2020-08-25 12:32:05 -04:00
Anuken
9fc42dec6a Fixed fire not syncing 2020-08-25 12:10:16 -04:00
Anuken
7b2b9b3988 Fixed #2416 / Fixed #2417 2020-08-25 09:24:49 -04:00
Anuken
174e4b8632 Bugfixes 2020-08-24 23:55:19 -04:00
Anuken
91569596d8 arc 2020-08-24 23:16:45 -04:00
Anuken
de6cde6ddd Bugfixes 2020-08-24 23:16:24 -04:00
Anuken
77911385e1 Fixed ground units walking into exclusion zone 2020-08-24 21:21:31 -04:00
Anuken
b207d05d4b Re-added command center 2020-08-24 19:49:49 -04:00
Anuken
6b7debbba7 Added logic to tech tree 2020-08-24 17:35:52 -04:00
Anuken
d902878f63 Bugfixes 2020-08-24 13:12:58 -04:00
DeltaNedas
668120577d more publiv fields 2020-08-24 17:35:50 +01:00
Anuken
02263f1eb7 Fixed tech tree panning not working on mobile 2020-08-24 11:15:49 -04:00
DeltaNedas
3d18b7f4e3 make input fields public 2020-08-24 11:30:27 +01:00
Anuken
521b4fb4d7 Increased antumbra cost 2020-08-23 23:31:38 -04:00
Anuken
02ccdd2d67 Fixed #2411 2020-08-23 18:46:03 -04:00
Anuken
fefef3bc47 Decreased throughput of instant transfer blocks chained to routers 2020-08-23 17:08:07 -04:00
Anuken
2f19cab144 Fixed conduits not reacting with each other 2020-08-23 13:25:47 -04:00
Anuken
5e6465e8f3 nope, --release 8 is broken 2020-08-23 12:08:09 -04:00
Anuken
a92d143788 another gradle test 2020-08-23 12:05:54 -04:00
Anuken
d9aa4eb9c9 an attempt to make the javadoc shut up 2020-08-23 12:02:45 -04:00
Anuken
399b24ed8b Merge remote-tracking branch 'origin/master' 2020-08-23 11:40:01 -04:00
Anuken
0c1594d659 Fixed shield ability effect spam 2020-08-23 11:39:57 -04:00
Anuken
cee0a09a88 Update .travis.yml 2020-08-23 11:31:58 -04:00
Anuken
4b0c977e73 java 8's compiler is stupid apparently 2020-08-23 11:30:56 -04:00
Anuken
c1258b75d5 Logic edge autoscroll & jump highlighting on hover 2020-08-23 11:24:23 -04:00
Anuken
dac24e8bf1 Replaced redundant 'negate' operator with *= -1 2020-08-23 10:20:34 -04:00
Anuken
90b8910935 Merged UnaryOp and BinaryOp 2020-08-23 10:14:04 -04:00
Anuken
92764c8389 Fixed #2408 2020-08-23 09:40:06 -04:00
Anuken
315693251d Fixed some mod layout dialog issues 2020-08-22 14:12:38 -04:00
Anuken
ac21c620fe Many new modding improvements 2020-08-22 14:05:41 -04:00
Anuken
b128155615 Added T3 logic processor 2020-08-22 11:16:15 -04:00
Anuken
a76da8e488 Fixed payload routers not outputting to reconstructors 2020-08-22 09:40:10 -04:00
Anuken
29e0d4f2c2 arc 2020-08-22 09:08:27 -04:00
Anuken
9224120f5b Merge remote-tracking branch 'origin/master' 2020-08-22 09:01:03 -04:00
Anuken
c1cd27b9da Fixed #2402 / Fixed #2403 2020-08-22 09:00:55 -04:00
Anuken
5d1e96cf50 this is very boring 2020-08-21 22:49:50 -04:00
Anuken
1e7f28f309 Path progress 2020-08-21 20:45:47 -04:00
Anuken
b23d35797b Fixed #2396 2020-08-21 20:45:29 -04:00
Anuken
43f7bd1cdb Path progress 2020-08-21 14:57:54 -04:00
Anuken
526f1106fb Initial path refactor 2020-08-21 14:32:35 -04:00
Anuken
467d995aed Bugfixes 2020-08-21 10:28:05 -04:00
Anuken
e49ebecffa Merge remote-tracking branch 'origin/master' 2020-08-21 10:03:45 -04:00
Anuken
3b85dc27d7 Fixed "waiting for players" being shown after PvP end 2020-08-21 10:03:40 -04:00
Anuken
d6bf6de924 Merge pull request #2391 from gen-NA-owl/ready-to-merge-phase-walls
Phase Walls: more bullet dmg = less reflect chance
2020-08-20 23:42:32 -04:00
Anuken
28d2243abc Bugfixes, balancing 2020-08-20 23:36:27 -04:00
Leonwang4234
a17dfb820e Update Wall.java 2020-08-20 20:30:04 -07:00
Anuken
48d1c2038e Fixed players trying to control dead units 2020-08-20 20:04:53 -04:00
Anuken
52489ef777 Bugfixes 2020-08-20 18:37:15 -04:00
Anuken
c946b42360 Fixed conveyors not moving units 2020-08-20 16:34:41 -04:00
Anuken
b9ff4ba9c5 Bugfixes 2020-08-20 16:21:40 -04:00
Anuken
b86cdb52be Typo fix 2020-08-20 16:15:36 -04:00
Anuken
dac2264ac7 Smoother mobile player movement / Cleanup 2020-08-20 15:56:40 -04:00
Anuken
562c41c288 Fixed #2389 / Fixed #2388 / Fixed #2387 / Fixed #2386 2020-08-20 15:11:00 -04:00
Anuken
6d20e354b1 Merge remote-tracking branch 'origin/master' 2020-08-20 14:00:36 -04:00
Anuken
cee0ddce56 Cleanup 2020-08-20 14:00:32 -04:00
Anuken
1237b14b7a Merge pull request #2374 from DeltaNedas/patch-7
use 6.0 branch for github import
2020-08-20 12:26:26 -04:00
Anuken
3498a34c56 Bugfixes 2020-08-20 09:46:08 -04:00
DeltaNedas
6e4cac413b use master as fallback for 6.0 mods 2020-08-20 00:19:48 +01:00
Anuken
5df2a3e625 Added ping marker to servers 2020-08-19 17:11:37 -04:00
Anuken
7251fa4a03 Updated sector cache 2020-08-19 16:25:43 -04:00
Anuken
b827176bc4 Various fixes 2020-08-19 16:21:30 -04:00
Anuken
bbe6c5017a Removed synthetic accessors / Sector sanity tests 2020-08-19 15:13:29 -04:00
Anuken
e9f72180e6 Config fix 2020-08-19 11:15:54 -04:00
Anuken
8fcab2d637 Fixed #2379 2020-08-19 11:15:19 -04:00
Anuken
9470f1f99f Unit control null checks 2020-08-19 11:03:04 -04:00
Anuken
e81385a8e6 Merge remote-tracking branch 'origin/master' 2020-08-19 10:35:28 -04:00
Anuken
819835fbc0 Fixed #2373 / Fixed #2378 2020-08-19 10:35:24 -04:00
Anuken
55d6a617e7 Merge pull request #2375 from DeltaNedas/loadtime
print mod load time to log
2020-08-19 10:33:15 -04:00
DeltaNedas
d8cd07127c print mod load time to log 2020-08-19 07:07:56 +01:00
DeltaNedas
361eb6a7e2 use 6.0 branch for github import 2020-08-19 06:00:50 +00:00
Anuken
7ebe84cc0e Fixed save incompatibility with missing types 2020-08-18 23:42:05 -04:00
Anuken
b551af6bcf trails are terrible 2020-08-18 23:15:12 -04:00
Anuken
f31b1ed8d0 Bugfixes 2020-08-18 19:30:11 -04:00
Anuken
3d5236dfd3 Removed unnecessary events from global script 2020-08-18 17:04:01 -04:00
Anuken
26acf7cbbc Bugfixes 2020-08-18 16:56:30 -04:00
Anuken
e96fcb3cb7 Fixed json-related crash 2020-08-18 16:24:43 -04:00
Anuken
4ed888bde5 Significantly increased arc power usage 2020-08-18 14:54:11 -04:00
Anuken
a814b799e0 Fixed logic scrolling lock 2020-08-18 14:47:57 -04:00
Anuken
ca864655d1 More bugfixes 2020-08-18 13:22:06 -04:00
Anuken
4d83221c76 Bugfixes 2020-08-18 13:09:12 -04:00
Anuken
fffdd1ca86 Merge remote-tracking branch 'origin/master' 2020-08-18 11:52:42 -04:00
Anuken
9efdb0af5d Bugfixes 2020-08-18 11:52:38 -04:00
Anuken
65de36ab41 Merge pull request #2263 from Prosta4okua/patch-2
Update bundle_uk_UA.properties
2020-08-18 11:45:12 -04:00
Anuken
cb6fe97a87 Merge pull request #2268 from Prosta4okua/master
[Bundle][RU] actual l10n
2020-08-18 11:44:50 -04:00
Anuken
55c1d8043e Merge pull request #2273 from BaseModMaker/patch-1
Update bundle_fr_BE.properties
2020-08-18 11:43:02 -04:00
Anuken
92d6c7fb3b Merge pull request #2276 from HAJDog247/master
Filipino (Tagalog) Translation -- patch 1
2020-08-18 11:42:53 -04:00
Anuken
b0fc855b57 Merge pull request #2369 from TheSlaylord/revert-2368-patch-13
Revert "Update bundle_ru.properties"
2020-08-18 11:42:21 -04:00
Anuken
82ba151d81 Merge pull request #2296 from grimsoul10/patch-4
Update bundle_in_ID.properties
2020-08-18 11:42:07 -04:00
Anuken
50631807dd Merge pull request #2342 from Penta0308/master
Update bundle_ko.properties
2020-08-18 11:41:59 -04:00
TheSlaylord
4c83aba918 Revert "Update bundle_ru.properties" 2020-08-18 18:41:49 +03:00
Anuken
47f5127bf8 Merge pull request #2368 from TheSlaylord/patch-13
Update bundle_ru.properties
2020-08-18 11:34:29 -04:00
TheSlaylord
47e5895a18 Update bundle_ru.properties 2020-08-18 18:30:27 +03:00
Anuken
1007667f9a Bugfixes 2020-08-18 11:23:17 -04:00
Anuken
065a8e712c Fixed BE client potentially segfaulting on startup 2020-08-18 11:07:38 -04:00
Anuken
88dba65593 Added stat for consecutive chains of overflows/sorters 2020-08-18 11:02:44 -04:00
Anuken
ec2593f3d5 Less instant transfer block chaining 2020-08-18 10:17:07 -04:00
Anuken
00f7f57c46 Bugfixes 2020-08-18 10:01:53 -04:00
Anuken
623e3924ed Middle-click selection for building blocks 2020-08-18 01:11:04 -04:00
Anuken
14ac712214 Non-final units 2020-08-18 01:01:25 -04:00
Anuken
0638b1f951 Added missing sort field to radar 2020-08-18 00:52:29 -04:00
Anuken
0b407c7c1f Bugfixes 2020-08-18 00:37:09 -04:00
Anuken
0bd122c570 Various tweaks 2020-08-18 00:04:57 -04:00
Anuken
7e0391a8a0 Bugfixes 2020-08-17 23:47:39 -04:00
Anuken
69c04ea90d a 2020-08-17 20:49:24 -04:00
Anuken
7ec6e64c18 Fixed tab cycling not working 2020-08-17 20:02:56 -04:00
Anuken
7ecf5aa26d Disable naval units on ground / Mobile payload input 2020-08-17 16:15:51 -04:00
Anuken
9a48028508 Fixed #2363 2020-08-17 09:35:12 -04:00
Anuken
2701bd3de2 arc 2020-08-16 23:31:02 -04:00
Anuken
0fe8836db4 Fixed #2360 2020-08-16 23:30:49 -04:00
Anuken
91c1c004c7 Formation tweaks 2020-08-16 18:51:17 -04:00
Anuken
2bb2964790 Progress on new unit control block 2020-08-16 16:34:14 -04:00
Anuken
8dd4e9feb0 Formation cleanup 2020-08-16 15:54:41 -04:00
Anuken
01bd8d5148 Merge remote-tracking branch 'origin/master' 2020-08-16 10:13:37 -04:00
Anuken
8234eec7fc Fixed crux units being deactivated in sandbox 2020-08-16 10:13:33 -04:00
Anuken
d9bfe88ddf Merge pull request #2358 from Somka000/patch-3
Public server on 6.0
2020-08-16 10:01:56 -04:00
Anuken
2526224820 Bugfixes 2020-08-15 18:54:57 -04:00
Somka000
78e92b1027 Public server on 6.0
Attack/PvP server on 6.0, tomorrow I will add attack maps adapted to the bot AI. Hosted in VPS.
2020-08-15 21:22:15 +02:00
Anuken
0cc5945331 Better mod dialog layout / Less obnoxious button sound 2020-08-15 10:12:34 -04:00
Anuken
97aca84b26 arc 2020-08-14 22:22:28 -04:00
Anuken
98844d752c Better spore trees 2020-08-14 22:21:47 -04:00
Anuken
91e5fa5409 Merge remote-tracking branch 'origin/master' 2020-08-14 19:45:51 -04:00
Anuken
b57fb47855 Compilation for Android on Java 9+ 2020-08-14 19:45:22 -04:00
Felix Corvus
891c449e6b Update bundle_ru.properties
Некорректно переводить memory-cell как "Ячейка памяти", потому что по факту блок ею не является.
Ячейка памяти это *минимальный* элемент памяти, в то время как у блока есть своя адресация.
2020-08-14 23:30:23 +03:00
Anuken
53e1cf55c4 Merge pull request #2355 from Redstonneur1256/patch-1
Fix duplicated default settings
2020-08-14 15:31:47 -04:00
Redstonneur1256
af3c88e606 Fix duplicated default settings 2020-08-14 20:59:15 +02:00
Anuken
75606baf6a Cleanup 2020-08-14 14:32:03 -04:00
Anuken
fa8a6d001a Made logic blocks solid 2020-08-14 11:31:38 -04:00
Anuken
67e32ce880 arc 2020-08-14 10:48:47 -04:00
Anuken
44a86ef2e7 Merge remote-tracking branch 'origin/master' 2020-08-14 10:48:40 -04:00
Anuken
ffb2d6eeaa Better logic UI 2020-08-14 10:48:29 -04:00
Anuken
0cac9f379e Merge pull request #2325 from Neba-MD/master
Add TWS Attack server
2020-08-13 22:41:28 -04:00
Anuken
4a8a7a9d8f Update gradle.yml 2020-08-13 20:56:28 -04:00
Anuken
05b2b18f69 Update gradle.yml 2020-08-13 20:49:02 -04:00
Anuken
73dd7ba21a Test fixes 2020-08-13 20:28:36 -04:00
Anuken
1d95980066 Bugfixes / Team access 2020-08-13 19:57:45 -04:00
Anuken
c2f71e5788 Merge remote-tracking branch 'origin/master' 2020-08-13 14:59:34 -04:00
Anuken
f361ac27e0 Optional custom displayed gamemode 2020-08-13 14:59:27 -04:00
Anuken
ebceee0a5c Merge pull request #2348 from Quezler/patch-43
Remove trailing space in connected log message
2020-08-13 14:22:16 -04:00
Patrick 'Quezler' Mounier
765aa15473 Remove trailing space in connected log message 2020-08-13 20:19:30 +02:00
Anuken
e1f0564d0b More instruction limits 2020-08-13 14:02:11 -04:00
Anuken
af6ed6ea89 Fixed poly instructions not allowing full 360 degree range 2020-08-13 12:25:49 -04:00
Anuken
1de3217738 GetLink instruction 2020-08-13 10:20:29 -04:00
Anuken
54dcf06722 Bugfixes 2020-08-13 09:26:45 -04:00
Anuken
9ba98ed4b4 Fixed #2346 2020-08-13 09:18:47 -04:00
Anuken
1249eb3b00 Bugfixes 2020-08-12 21:24:00 -04:00
Anuken
fb511a4eef Bugfixes 2020-08-12 19:47:43 -04:00
Anuken
a8c4e9f567 Logic bugfixes & tweaks 2020-08-12 18:51:50 -04:00
Anuken
0aabe9bbe0 Fixed arbitrary logic string limit 2020-08-12 18:40:25 -04:00
Anuken
799fc6029d Logic connection names 2020-08-12 17:45:34 -04:00
Anuken
3dd814f0b8 arc 2020-08-12 13:39:52 -04:00
Anuken
5b727ac6fd Fixed #2344 2020-08-12 13:39:20 -04:00
Anuken
1c17c38e15 Fixed string write errors in long logic programs [schematics break] 2020-08-12 11:13:32 -04:00
Penta0308
5b6ab30eb9 Update bundle_ko.properties 2020-08-12 16:57:54 +09:00
Anuken
925b1e3057 Simple mining AI 2020-08-12 00:08:23 -04:00
Anuken
8810cf037e . 2020-08-11 13:08:44 -04:00
Anuken
25e04ca3e5 Triangle draw command 2020-08-11 12:54:39 -04:00
Anuken
188171ec03 Bugfixes 2020-08-11 12:48:17 -04:00
Anuken
d85f6c72eb Cleanup 2020-08-11 11:18:32 -04:00
Anuken
2b96d30255 Correct names for buildings 2020-08-11 11:12:18 -04:00
Anuken
bb3c80c055 Dedicated memory cells 2020-08-11 10:50:12 -04:00
Anuken
7e8326a3af Logic tweaks 2020-08-10 23:21:14 -04:00
Anuken
75ada3cca1 Turret-based radar 2020-08-10 23:04:52 -04:00
Anuken
4f7d6fc018 Bugfixes / Logic category (no icon) / Switch block 2020-08-10 17:09:54 -04:00
Anuken
c560de9c53 purple 2020-08-10 16:10:18 -04:00
Anuken
c4e8fef8d0 Fixed #2335 (probably) 2020-08-10 14:28:43 -04:00
Anuken
6ab24ccefd arc 2020-08-10 14:19:50 -04:00
Anuken
ea8dccdfb2 Many various logic changes 2020-08-10 14:19:24 -04:00
Anuken
b28e7de1db More sensors / Logic tweaks 2020-08-09 20:47:35 -04:00
Anuken
f00510a508 Bugfixes / Power capacity sensor 2020-08-09 20:18:47 -04:00
Anuken
15572cdd7a Optional asm parameters for text 2020-08-09 18:33:59 -04:00
Anuken
eb4a2a2da1 arc 2020-08-09 18:27:11 -04:00
Anuken
73d9348c83 Clipboard export / Conditional jumps / Saving of state 2020-08-09 18:26:54 -04:00
BasedUser
d828b280af Merge pull request #4 from Anuken/master
e
2020-08-09 23:36:12 +03:00
Anuken
4efba475de functional scrolling 2020-08-09 15:35:52 -04:00
Anuken
6dca449b08 Better logic UI 2020-08-09 15:10:13 -04:00
Anuken
1d5a25ce75 Graphics 2020-08-09 12:46:44 -04:00
Anuken
1b7159647e Sensor selection 2020-08-09 10:03:02 -04:00
Felix Corvus
f4e666bce8 Update bundle_ru.properties 2020-08-09 10:19:02 +03:00
Anuken
4dc90d4074 Less terrible logic UI / Unary operations 2020-08-08 20:36:45 -04:00
Anuken
2042dafb73 Merge pull request #2324 from DeltaNedas/water
deep water is 2x better to pump
2020-08-08 18:48:57 -04:00
DeltaNedas
cb4c916ed7 oops 2020-08-08 23:25:02 +01:00
Anuken
da19c5ae19 Sensor types 2020-08-08 18:01:54 -04:00
Anuken
4008d88f0b arc 2020-08-08 14:14:58 -04:00
Anuken
0fc246cfdc Merge remote-tracking branch 'origin/master' 2020-08-08 14:14:43 -04:00
Anuken
ac46b77380 Logic progress 2020-08-08 14:14:33 -04:00
DeltaNedas
76e21fbd19 deep water is 2x better to pump 2020-08-08 18:45:25 +01:00
Anuken
1988958c4a Merge pull request #2323 from DeltaNedas/router
make distribution block fields/funcs public/protected
2020-08-08 13:38:09 -04:00
DeltaNedas
5e5aadc4ac make distribution block fields/funcs public/protected 2020-08-08 18:23:54 +01:00
Anuken
3fbeb33390 Update CONTRIBUTING.md 2020-08-08 12:17:20 -04:00
Neba-MD
d08f9bf819 Add TWS server 2020-08-09 00:01:52 +08:00
Felix Corvus
dce253e146 Update bundle_ru.properties 2020-08-08 07:31:39 +03:00
Anuken
8411cc16f1 Logic stuff 2020-08-07 23:01:40 -04:00
Anuken
51af6eeec9 Barely functional logic 2020-08-07 18:30:03 -04:00
Anuken
090e0f35dc aa 2020-08-07 17:50:54 -04:00
Anuken
33fdea7b7d Merge remote-tracking branch 'origin/master' 2020-08-07 16:11:16 -04:00
Anuken
a12211587c More logic 2020-08-07 16:11:02 -04:00
Anuken
44912c0fa9 Merge pull request #2318 from Quezler/patch-42
Update servers_be.json
2020-08-07 10:52:26 -04:00
Patrick 'Quezler' Mounier
ee0b946ea6 Update servers_be.json 2020-08-07 13:47:13 +02:00
Anuken
5040eacda7 a rc 2020-08-07 00:24:54 -04:00
Anuken
ec99daaefb logic 2 2020-08-07 00:24:14 -04:00
Anuken
176e4a3bb9 Many things 2020-08-06 20:00:02 -04:00
Anuken
ac3106728f arc 2020-08-06 12:31:42 -04:00
Anuken
5dc78a24e0 Logic progress 2020-08-06 12:31:04 -04:00
Anuken
7482e2a988 Bugfixes 2020-08-05 19:52:09 -04:00
Anuken
f4a838df98 Bugfixes 2020-08-05 09:59:50 -04:00
Anuken
54d37b63b3 Bugfixes 2020-08-05 09:47:11 -04:00
Anuken
75eed2926a Start of work on logic stuff 2020-08-04 23:37:12 -04:00
Anuken
03b5bc9449 Weather status effects 2020-08-04 21:26:24 -04:00
Anuken
55903576b6 Fixed #2312 2020-08-04 17:18:19 -04:00
Anuken
d9ea17baca Fixed #2311 2020-08-04 16:49:20 -04:00
Anuken
b11908f509 Event things 2020-08-04 15:14:01 -04:00
Anuken
0d4e75fc42 Re-added remote effect methods 2020-08-04 13:38:40 -04:00
Anuken
3038862af5 '$' symbol removal 2020-08-04 10:45:55 -04:00
Anuken
f60afc39f1 Replaced '$' formatting with '@' 2020-08-04 10:18:01 -04:00
Anuken
8dd4839f53 Anuken/Mindustry-Suggestions/issues/375 2020-08-04 10:00:24 -04:00
Anuken
8b83360fe5 Fixed #2307 2020-08-04 09:10:55 -04:00
Anuken
b268e8ca58 Rand rename 2020-08-04 09:10:22 -04:00
Anuken
7ecd8b3169 Merge remote-tracking branch 'origin/master' 2020-08-03 22:53:45 -04:00
Anuken
2466267b1c Multi-target AI 2020-08-03 22:53:35 -04:00
Anuken
49f6b9bb05 Update README.md 2020-08-03 21:57:20 -04:00
Anuken
10cacf71ae Merge pull request #2305 from DeltaNedas/modsuifix
fix some issues with mods ui
2020-08-03 21:11:50 -04:00
DeltaNedas
1589b8a72b grow each mod 2020-08-04 01:46:26 +01:00
DeltaNedas
e78948e548 fix some issues with mods ui 2020-08-04 01:44:05 +01:00
Anuken
b1da2faa04 Flying boss tweaks 2020-08-03 10:51:10 -04:00
Anuken
3966ff6817 Boss weapon tweaks 2020-08-02 21:54:33 -04:00
HAJDog247
b1bf96bfff Update bundle_fil.properties 2020-08-03 07:51:22 +08:00
Anuken
f97d1eedee Fixed #2300 2020-08-02 10:35:50 -04:00
Anuken
a7c0f9e73c Antumbra weapons 2020-08-01 21:52:12 -04:00
grimsoul10
8c3c671dcd Update bundle_in_ID.properties
A Little bit update 5%
2020-08-01 23:41:23 +00:00
Anuken
a2df243387 "Fixed" #2294 2020-08-01 11:28:55 -04:00
Anuken
ef757f4563 Removed arbitrary preset selection requirements 2020-07-31 22:19:24 -04:00
Anuken
5d3f48d0eb Cleanup 2020-07-31 21:07:28 -04:00
Felix Corvus
b3977d43b0 Update bundle_ru.properties 2020-08-01 01:27:26 +03:00
Felix Corvus
5a4ba149cf Update bundle_ru.properties 2020-08-01 01:09:23 +03:00
Anuken
d658367be7 Fixed #2290 2020-07-31 16:29:53 -04:00
Anuken
bb3b4d4415 arc 2020-07-31 14:07:01 -04:00
Anuken
e4cdf20030 Preset capture waves / More tooltips 2020-07-31 14:06:15 -04:00
Anuken
caf5d37d98 Bugfixes / Auto-strip color codes from meta 2020-07-31 12:31:00 -04:00
Anuken
acfd18ab7b Bugfixes 2020-07-31 11:34:53 -04:00
Anuken
2510b09201 Bugfixes / Default capture waves 2020-07-31 10:40:27 -04:00
Anuken
658079fab6 Bugfixes 2020-07-31 09:51:03 -04:00
Anuken
a4ddf90ef5 Added sectors to tech tree / Bugfixes 2020-07-30 23:13:06 -04:00
Anuken
ff990925f0 Bugfixes 2020-07-30 21:41:17 -04:00
Anuken
b12c25bc0b Updated sector data 2020-07-30 20:19:51 -04:00
Anuken
40edbe785c More bugfixes 2020-07-30 20:07:49 -04:00
Anuken
5ad2807958 Fixed #2287 2020-07-30 19:59:31 -04:00
Anuken
a297d11023 Bugfixes 2020-07-30 19:00:19 -04:00
Anuken
01e3599c7d arc 2020-07-30 17:01:12 -04:00
Anuken
06b08c80c2 BitmapFont -> Font / Bugfixes 2020-07-30 16:59:53 -04:00
Anuken
f39609d1ef Named the starter planet 2020-07-30 16:14:15 -04:00
Anuken
99fafc47f2 Bugfixes 2020-07-30 14:24:23 -04:00
Anuken
b46a8263ba perhaps ground zero was a bit too hard 2020-07-30 11:16:47 -04:00
Anuken
c3a073fbbf Bugfixes 2020-07-30 10:51:43 -04:00
Anuken
bc8f02666a Minor UI tweaks 2020-07-30 09:40:46 -04:00
Anuken
c9316bd9fa Merge branch 'master' of https://github.com/Anuken/Mindustry 2020-07-30 08:48:14 -04:00
Anuken
6e88a665a0 Reset revisions 2020-07-30 08:48:10 -04:00
Anuken
f0f4c77d4f Merge pull request #2283 from Dexapnow/patch-9
Update bundle_pl.properties
2020-07-30 08:45:36 -04:00
Dexapnow
7cb2b75802 Update bundle_pl.properties
Ready to merge.
2020-07-30 13:28:19 +02:00
Anuken
66c0c9baa2 Autopan to last sector 2020-07-29 23:36:59 -04:00
Anuken
9bf3074aee AI bugfixes / Balance 2020-07-29 21:09:58 -04:00
Anuken
1e7aaac3d4 Merge remote-tracking branch 'origin/master' 2020-07-29 19:04:24 -04:00
Anuken
e127df3aed Changed startup reminder 2020-07-29 19:04:20 -04:00
Anuken
418f598d26 Merge pull request #2281 from Summet-V/delete-all-saves
[QOL] Button to clear all saves.
2020-07-29 14:29:03 -04:00
Anuken
5d266174af Fixed #2282 2020-07-29 14:24:42 -04:00
Summet-V
c34bf78ab6 Moved to the game data section 2020-07-29 21:05:58 +03:00
Anuken
f840b007ed Costs for item/liquid research (very much WIP) 2020-07-29 13:52:30 -04:00
Anuken
b672d79dd7 Door chaining / p l a s t a n i u m b l e n d i n g 2020-07-29 13:22:13 -04:00
Summet-V
8c310e38ff Add button 2020-07-29 19:02:40 +03:00
Anuken
b8d1f66653 Bugfixes 2020-07-29 11:02:39 -04:00
Anuken
a0459191d6 Different crash saving mechanism on Android 2020-07-29 10:44:32 -04:00
Anuken
6263c11ce5 Ground zero wave balance 2020-07-29 10:35:40 -04:00
Anuken
d292f954a6 arc 2020-07-29 10:19:45 -04:00
Anuken
63ed322d62 Merge remote-tracking branch 'origin/master' 2020-07-29 10:19:18 -04:00
Anuken
8729410cd8 Moved rotation to Building 2020-07-29 10:19:07 -04:00
Anuken
881929c569 Merge pull request #2280 from Dexapnow/patch-8
Small suggestion
2020-07-29 10:10:47 -04:00
Dexapnow
31f89df5b9 Small suggestion
Since Spiroct and Atrax can't fly why don't give them more cargo capacity?
2020-07-29 16:03:05 +02:00
Anuken
749b9f5b30 Plastanium conveyor buff (40/s) + description 2020-07-29 08:44:53 -04:00
Anuken
7d2b7197d6 Fixed #2277 2020-07-29 08:19:39 -04:00
Base
7f9e32a74c Update bundle_fr_BE.properties 2020-07-29 14:04:33 +02:00
Summet-V
6236819f67 Bundles 2020-07-29 14:31:00 +03:00
HAJDog247
45aa43e62e Filipino (Tagalog) Translation -- patch 1
[UNDER DEVELOPMENT]
This project may take a week or so.
2020-07-29 15:30:08 +08:00
Felix Corvus
4951f1f0b7 2020-07-29 01:08:39 +03:00
Felix Corvus
2765b8d47c editor waves stats RU translation 2020-07-29 00:58:04 +03:00
Anuken
81265500a5 Bugfixes 2020-07-28 17:19:57 -04:00
Anuken
3251dde4a8 Spore storms / Weather attribute effects 2020-07-28 17:13:21 -04:00
Anuken
7cc94057a1 Display modes for waves 2020-07-28 15:27:43 -04:00
Anuken
be530abd4b Merge remote-tracking branch 'origin/master' 2020-07-28 14:29:14 -04:00
Anuken
c6826a6c7e Initial implementation of Anuken/Mindustry-Suggestions/issues/327 2020-07-28 14:28:58 -04:00
Anuken
101a4c2f65 Merge pull request #2271 from Dexapnow/patch-6
Remove "sortersnek"
2020-07-28 11:14:42 -04:00
Base
d7ea50f2ad Update bundle_fr_BE.properties
i translated some text that wasn't translated yet
2020-07-28 16:44:49 +02:00
Anuken
578d5b7a71 Merge pull request #2269 from DeltaNedas/strict
add 'use strict' to mod scripts
2020-07-28 08:43:44 -04:00
Prosta4okua
5c73168c4d Update bundle_uk_UA.properties 2020-07-28 15:38:51 +03:00
DeltaNedas
6c6640f6c6 semicolon 2020-07-28 11:57:02 +00:00
Felix Corvus
10f3fbf87b Update bundle_ru.properties 2020-07-28 04:59:24 +03:00
Anuken
1100803af4 Global sector items / Mod file reading 2020-07-27 20:18:07 -04:00
Dexapnow
c21a0a2516 Remove "sortersnek"
There is many reasons behind it, but most important (that let to removing other "sneks") is infinite throughput/teleporter like mechanic.
I know that most of players like it and they will never change their mind, so this might be better solution.
2020-07-27 20:27:27 +02:00
Anuken
44e150638d Research % indicator 2020-07-27 14:11:44 -04:00
Anuken
8360d60ee8 Fractional research 2020-07-27 14:04:03 -04:00
DeltaNedas
3bf2e18e85 add 'use strict' to mod scripts 2020-07-27 03:55:59 +01:00
Felix Corvus
78fb3fc22f Merge remote-tracking branch 'upstream/master' 2020-07-26 23:47:21 +03:00
Felix Corvus
7f811403df Press **F** to feathub.com 2020-07-26 23:29:41 +03:00
Anuken
95f7fc1b3b Rounding of research amounts 2020-07-26 10:35:47 -04:00
Anuken
42d7eb4e05 Bugfixes 2020-07-25 19:08:25 -04:00
Felix Corvus
8980275f0a Update bundle_ru.properties 2020-07-25 22:07:48 +03:00
Anuken
8f8117e94b Merge remote-tracking branch 'origin/master' 2020-07-25 14:38:13 -04:00
Anuken
d6d2e88b71 Saving of rotation of static blocks 2020-07-25 14:38:09 -04:00
Anuken
86ef6dc9d7 Merge pull request #2233 from Prosta4okua/master
[Bundle][RU] actual translation
2020-07-25 14:34:23 -04:00
Anuken
c3881b57de More research tweaks / Balancing 2020-07-25 13:29:50 -04:00
Anuken
ef381cb970 Fixed #2265 2020-07-25 10:59:18 -04:00
Anuken
b180462c45 Better tree layout 2020-07-25 10:25:48 -04:00
Felix Corvus
a0bdeb2649 Будем получать по куполу 2020-07-25 15:28:21 +03:00
Anuken
20077738d2 Research fixes 2020-07-24 23:56:14 -04:00
Anuken
38e55ab541 Added most things to tech tree 2020-07-24 23:38:33 -04:00
Felix Corvus
da4f042fa4 Я СКАЗАЛ РИССО 2020-07-25 03:12:21 +03:00
Anuken
17f86c5f77 Added missing tech tree blocks 2020-07-24 19:15:09 -04:00
Prosta4okua
1f6c2df476 Update bundle_uk_UA.properties 2020-07-25 00:23:30 +03:00
Prosta4okua
6be58ecb8d Update bundle_uk_UA.properties 2020-07-24 23:49:58 +03:00
Anuken
961e2a2490 Merge remote-tracking branch 'origin/master' 2020-07-24 13:51:00 -04:00
Anuken
1c8fd4cc38 https://github.com/Anuken/Mindustry-Suggestions/issues/336 2020-07-24 13:50:57 -04:00
Felix Corvus
43a0b6486a РИССО 2020-07-24 20:50:03 +03:00
Anuken
f1cf8b2849 Merge pull request #2262 from Quezler/patch-41
Remove some spaces
2020-07-24 13:49:34 -04:00
Patrick 'Quezler' Mounier
7bf299bcc0 Remove some spaces 2020-07-24 19:44:26 +02:00
Anuken
f41212b4d7 plastanium balancing 2020-07-24 13:42:11 -04:00
Felix Corvus
38a2ae0db2 Merge branch 'master' into master 2020-07-24 20:37:08 +03:00
Felix Corvus
07b5999b13 Merge branch 'master' into master 2020-07-24 20:34:49 +03:00
Anuken
58c39e14d6 risse -> risso 2020-07-24 13:27:15 -04:00
Felix Corvus
7c0080ee65 Russian translation of units 2020-07-24 20:20:35 +03:00
Anuken
8db4f88ecc Plastanium conveyor blend fix 2020-07-24 12:56:30 -04:00
Anuken
0372ec7c9f Bugfixes, balancing 2020-07-24 12:42:59 -04:00
Anuken
a48efd971c Removed "naval" sector requirement 2020-07-24 10:53:17 -04:00
Anuken
c1283b856b Some initial air boss stats 2020-07-23 21:50:07 -04:00
Anuken
d6af9a6671 arc 2020-07-23 17:39:28 -04:00
Anuken
72fc103e16 UI cleanup 2020-07-23 17:37:45 -04:00
Anuken
69f6154894 Updated bundles 2020-07-23 17:12:55 -04:00
Felix Corvus
91d54dfad3 Прочность 2020-07-23 19:46:46 +03:00
Felix Corvus
8c495a3f57 Update bundle_ru.properties 2020-07-23 19:30:48 +03:00
Anuken
3892cf2283 Merge remote-tracking branch 'origin/master' 2020-07-23 10:27:28 -04:00
Anuken
c93431ecc6 Bugfixes 2020-07-23 10:27:24 -04:00
Anuken
c8f3e26f44 Merge pull request #2247 from leweii/patch-1
Update bundle_zh_CN.properties
2020-07-23 09:23:31 -04:00
Anuken
565bac1e2b Merge pull request #2254 from Remint32/master
Textures micro fixes and improvements
2020-07-23 09:23:06 -04:00
Anuken
7e306d476d Merge pull request #2236 from Dexapnow/patch-5
PvP server hosted in Poland
2020-07-23 08:56:34 -04:00
Anuken
dc30ac4069 Merge remote-tracking branch 'origin/master' 2020-07-23 08:47:34 -04:00
Anuken
9e0bd49f04 Fixed #2255 2020-07-23 08:47:30 -04:00
Anuken
fbc79d5d6f Merge pull request #2240 from L0615T1C5-216AC-9437/patch-3
Add chaotic-Neutral Attack server to the Community List
2020-07-22 21:40:12 -04:00
Anuken
b9ff9b7ee4 Merge branch 'master' into patch-3 2020-07-22 21:40:05 -04:00
Anuken
1b17944901 Merge pull request #2165 from L0615T1C5-216AC-9437/patch-2
Add Chaotic-Neutral PvP Server to Community Server List
2020-07-22 21:38:28 -04:00
Anuken
701aa840b3 Nondestructive unit cap enforcement 2020-07-22 14:31:44 -04:00
Anuken
b4594b2274 Hard enforcement of unit cap 2020-07-22 13:27:54 -04:00
Anuken
a4a3f6f8c5 Merge remote-tracking branch 'origin/master' 2020-07-22 11:03:42 -04:00
Anuken
988da3b8e9 Balancing / Bugfixes 2020-07-22 11:03:38 -04:00
Anuken
769fc93940 Merge pull request #2250 from AydenRennaker/patch-4
Add Atanner Hexed PVP to Community Servers List
2020-07-22 09:43:17 -04:00
Felix Corvus
4157e3c74d Update bundle_ru.properties 2020-07-22 04:02:57 +03:00
Felix Corvus
916a00b6ff textures micro fixes and improvements 2020-07-22 03:40:58 +03:00
Anuken
43ca3ca210 Correct flow rate scaling 2020-07-21 19:51:57 -04:00
Anuken
93371b1cd0 Merge remote-tracking branch 'origin/master' 2020-07-21 19:49:50 -04:00
Anuken
973d907218 Balancing & bugfixes 2020-07-21 19:49:46 -04:00
Anuken
efaba522cd Merge pull request #2253 from Remint32/master
spore-press frames sprites 6.0-ed
2020-07-21 19:25:53 -04:00
Felix Corvus
2ef0e33227 spore-press frames sprites 6.0-ed 2020-07-22 02:18:55 +03:00
Anuken
5cfd784501 Merge remote-tracking branch 'origin/master' 2020-07-21 15:43:10 -04:00
Anuken
5c9e005397 Per-unit cap (still broken) 2020-07-21 15:43:02 -04:00
AydenRennaker
6b52c64b6f Add Atanner Hexed Survival to Community Servers List
Added hexed game server with core spawns on hex capture.
Banned ripple and hail.
2020-07-20 18:27:47 -06:00
Anuken
30f2fd0b7e Moved server to middle of list for fairness 2020-07-20 13:32:13 -04:00
leweii
c9da9754ef Update bundle_zh_CN.properties
In Chinese properties, add some words, and try to make some sentences more fluent.
2020-07-20 14:05:30 +08:00
Felix Corvus
69dae20275 ru translation respawn line fix 2020-07-20 05:16:57 +03:00
Anuken
07b3991fdf Merge pull request #2242 from XZimur/patch-1
Update bundle_uk_UA.properties
2020-07-19 21:37:07 -04:00
Anuken
4ef0143928 typo 2020-07-19 21:35:32 -04:00
Anuken
7a2a436a52 Fixed #2246 2020-07-19 21:34:31 -04:00
Anuken
6547a38567 Cached Block#offset() 2020-07-19 16:34:06 -04:00
Anuken
c398b89284 Changed mouse_move to use forward mouse button by default 2020-07-19 13:04:26 -04:00
Anuken
9521af7be5 Input fixes 2020-07-19 13:00:55 -04:00
Anuken
c2d6076407 arc 2020-07-19 12:21:56 -04:00
Anuken
a074010eb7 Time.delta cleanup / Basic mobile input 2020-07-19 12:21:21 -04:00
Anuken
f9ed74c15a Fixed #2243 2020-07-19 09:32:57 -04:00
XZimur
4dec69fca7 Update bundle_uk_UA.properties
I did found several errors in this translation:
1 - Container and Vault are both traslated as "Соховище", so i fixed this by translating Vault as "Вмістилище"
2 - Bridge conduit is translated like "Мостовий водопровід" with means Bridge water pipe, so i changed that to "Мостовий трубопровід" with mens Bridge conduit
2020-07-19 10:15:14 +03:00
Anuken
c772e1fcc6 Bugfixes 2020-07-18 22:50:05 -04:00
Felix Corvus
f0acfb3cf3 бесконечные правки 2020-07-18 17:43:20 +03:00
Anuken
870f06218b Bugfixes 2020-07-18 09:36:43 -04:00
Anuken
6b3039dba2 Modifier reordering 2020-07-17 19:00:39 -04:00
LOGISTICAL NIGHTMARE
b291c09b73 Add chaotic-Neutral Attack server to the Community List 2020-07-17 18:12:19 -04:00
Anuken
521e3c773f Weapon occlusion / Balancing 2020-07-17 16:57:27 -04:00
Anuken
60ce8ca935 Naval unit sprites complete 2020-07-17 16:41:46 -04:00
Anuken
d02268d347 Additional pyratite balancing 2020-07-17 15:25:17 -04:00
Anuken
54e5d6a302 Fixed #2238 2020-07-17 13:20:31 -04:00
Anuken
1bb621bbd5 Naval unit tweaks 2020-07-17 11:15:07 -04:00
Anuken
b2b6ddb5b2 arc 2020-07-17 08:48:13 -04:00
Anuken
660abe188b Fixed #2237 2020-07-17 08:46:11 -04:00
Dexapnow
49a43a4308 PvP server hosted in Poland 2020-07-17 13:57:32 +02:00
Anuken
208105f21d Prototype T1 naval unit 2020-07-16 21:09:42 -04:00
Anuken
a193351bd7 Merge remote-tracking branch 'origin/master' 2020-07-16 14:32:43 -04:00
Anuken
e3f40cd968 Cleanup 2020-07-16 14:32:38 -04:00
Anuken
0c54417a11 Merge pull request #2234 from Remint32/patch-4
bruh trails -> pretty trails fix
2020-07-16 12:11:25 -04:00
Felix Corvus
4e3226ee3d bruh trails -> pretty trails fix 2020-07-16 18:41:22 +03:00
Felix Corvus
22ff8e2b9b hmm 2020-07-16 17:44:24 +03:00
Felix Corvus
df7285a1f5 Update bundle_ru.properties 2020-07-16 15:10:36 +03:00
Felix Corvus
6d55285b62 Update bundle_ru.properties 2020-07-16 14:23:34 +03:00
Anuken
4c0062e967 Merge pull request #2230 from Paulao17/patch-2
French fastlane metadata corrections
2020-07-15 13:26:48 -04:00
Anuken
67cd8ccae4 Merge pull request #2229 from Kieaer/patch-4
ko bundle update
2020-07-15 11:46:17 -04:00
Paulao17
42a63daf00 Language and meaning corrections (French translation)
This translation uses the second person singular whereas the steam translation uses second person plural. The latter is more formal, potentially less adapted for a mobile user-base.
2020-07-15 17:21:21 +02:00
키에르
3d26e461c2 Update bundle_ko.properties
block.segment - block.silicon-curcible, setting.mapcenter.name
2020-07-16 00:13:37 +09:00
Paulao17
49736a37c9 Plurals and various (French translation) 2020-07-15 17:04:07 +02:00
Anuken
874aa6cf4a Merge remote-tracking branch 'origin/master' 2020-07-15 10:19:56 -04:00
Anuken
0f6629718d Minor test fixes 2020-07-15 10:19:53 -04:00
Anuken
b9de9e5a0c Merge pull request #2068 from Kieaer/patch-4
[Following] Update bundle_ko.properties
2020-07-15 10:16:36 -04:00
Anuken
61b99f04e9 Merge remote-tracking branch 'origin/master' 2020-07-15 10:01:09 -04:00
Anuken
fd89911dd4 Text field dialog cleanup 2020-07-15 10:01:01 -04:00
Anuken
6a5900d745 Merge pull request #2195 from Prosta4okua/master
Ru translation
2020-07-15 09:49:11 -04:00
Anuken
a6593e3572 Merge pull request #2142 from Math2128/patch-5
Update bundle_fr.properties
2020-07-15 09:44:36 -04:00
Anuken
c25853dc3e Merge pull request #2211 from stuffyAI/patch-4
Create achievements.vdf for german steam achievements
2020-07-14 20:53:57 -04:00
Anuken
16873c6086 Merge pull request #2221 from T1NT4/patch-2
Update bundle_pt_BR.properties
2020-07-14 20:41:24 -04:00
Anuken
23e1d0998a Merge pull request #2093 from zethnest/map-center
[QOL] Center Map to Player Implementation
2020-07-14 20:41:03 -04:00
Anuken
6e08b67817 Merge pull request #2164 from Cyberman-42/patch-1
Update bundle_nl.properties
2020-07-14 15:30:33 -04:00
Anuken
7a60339c5d Update bundle_nl.properties 2020-07-14 15:30:16 -04:00
Anuken
7f6026bd52 Implemented #2153 2020-07-14 15:27:58 -04:00
Anuken
e0f1242ca7 Merge branch 'master' of https://github.com/Anuken/Mindustry 2020-07-14 15:04:04 -04:00
Anuken
bd95d81b40 nah 2020-07-14 15:03:59 -04:00
Anuken
d5b71e2773 Merge pull request #2210 from xerus2000/patch-1
Unify tower terminology in german translation of tutorial
2020-07-14 15:03:08 -04:00
Anuken
c21b02b1ec Merge pull request #2187 from Catchears/patch-1
Improved german translation.
2020-07-14 15:02:33 -04:00
Anuken
c1cd84593d Merge pull request #2194 from driver1748/patch-1
Corrected some translations
2020-07-14 14:58:35 -04:00
Anuken
85d67db1ed Merge pull request #2175 from AlbertCerfeda/patch-2
Minor changes
2020-07-14 14:58:13 -04:00
Anuken
fe0d3cfe22 Merge pull request #2140 from soytheLB/patch-5
Update bundle_es.properties
2020-07-14 14:56:30 -04:00
Anuken
1661905d9b Merge pull request #2106 from PetrGasparik/v105
Czech translation - up to date!
2020-07-14 14:56:09 -04:00
Anuken
06f2330295 Merge pull request #2226 from Ubuntu8406/patch-2
A small update of the finnish translation
2020-07-14 14:52:34 -04:00
Anuken
ca1e43d79c Merge branch 'master' into patch-2 2020-07-14 14:52:28 -04:00
Anuken
43676b68bf Merge pull request #2105 from TheJaaju/patch-4
Update bundle_fi.properties
2020-07-14 14:49:27 -04:00
Anuken
752cccb588 Merge pull request #2062 from GioIacca9/patch-11
Minor changes
2020-07-14 14:45:51 -04:00
Anuken
3eca6b770e <added missing sprites IntelliJ missed> 2020-07-14 14:39:11 -04:00
Anuken
a1a72ee713 <added missing sprites IntelliJ missed> 2020-07-14 13:21:12 -04:00
Anuken
9dc49743e8 Implemented #1335 2020-07-14 13:20:50 -04:00
Anuken
fb08a3638b NetClient cleanup 2020-07-14 13:04:22 -04:00
Anuken
3d353b414c arc 2020-07-14 11:17:10 -04:00
Anuken
f9b6b8e5b7 recieve -> receive 2020-07-14 11:16:32 -04:00
Anuken
da577a0db2 Merge remote-tracking branch 'origin/master' 2020-07-14 11:11:56 -04:00
Anuken
fbd55a341e Implemented server autosave config (#1296) 2020-07-14 11:11:49 -04:00
Anuken
064a0545a8 Merge pull request #1941 from bluet-it/master
add bundle_hu
2020-07-14 10:41:34 -04:00
Anuken
a33ac30a01 Merge pull request #1595 from andreasgamborg/patch-1
Create bundle_da.properties
2020-07-14 10:41:28 -04:00
Anuken
6d7d4bcba1 Merge pull request #2028 from burunduk/patch-2
Update bundle_uk_UA.properties
2020-07-14 10:40:34 -04:00
Anuken
b541cfcc75 Update bundle_zh_TW.properties (#2081)
* Update bundle_zh_TW.properties

* Update bundle_zh_TW.properties

* Update bundle_zh_TW.properties

* Update bundle_zh_TW.properties

* Update bundle_zh_TW.properties
2020-07-14 10:37:54 -04:00
Ali-C-Ila
6c52812a0d Update bundle_zh_TW.properties (#2054) 2020-07-14 10:37:41 -04:00
Lapis
360494af50 Update bundle_ja.properties (#2046)
* update bundle_ja.properties

* update bundle_ja.properties

* update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* removed experimental tag

* Small fix

* fix typo

* bundle_ja.properties

* Small fix

* Small fix

* Update bundle_ja.properties

* Update bundle_ja.properties

* add waves.guardian

* Fixed setting.atmosphere.name translation

* translation of waves.shields

* Update bundle_ja.properties
2020-07-14 10:37:22 -04:00
Anuken
b48e6d0e2f Illuminator tweaks 2020-07-14 10:25:56 -04:00
Felix Corvus
83d334582b Update bundle_ru.properties
Changes from https://github.com/Anuken/Mindustry/pull/2225
2020-07-14 07:24:40 +03:00
Anuken
250d982d99 Internal unit name finalizations 2020-07-13 20:39:43 -04:00
Ubuntu8406
982b7f33bc A small update of the finnish translation 2020-07-13 19:10:40 +03:00
Anuken
103ebc009d Fixed #2224 2020-07-13 08:50:19 -04:00
Petr Gašparík
a0ef83fb62 Czech translation - small improvement 2020-07-13 10:43:31 +02:00
Petr Gašparík
682bfcc8e8 Merge branch 'master' of https://github.com/Anuken/Mindustry into v105 2020-07-13 10:42:30 +02:00
Anuken
d31a530d6e Minor unit production balancing 2020-07-12 23:25:36 -04:00
Anuken
f5f495b9b8 Leg unit movement fixes 2020-07-12 11:34:19 -04:00
Anuken
dad5b186db Bugfixes / Negative knockback / Unit progress 2020-07-11 23:35:58 -04:00
Anuken
430eef02e2 Multi-legged unit implementations 2020-07-11 22:41:26 -04:00
Anuken
0555e4dfa7 Various palette changes 2020-07-11 14:44:50 -04:00
Anuken
6188250605 Unit tweaks 2020-07-11 13:20:23 -04:00
Anuken
064172e1f1 Bugfixes 2020-07-11 10:26:27 -04:00
Anuken
0752076bf2 Bullet cleanup 2020-07-11 09:08:17 -04:00
Anuken
a8d5198ca6 IntelliJ still refusing to add new files 2020-07-10 20:05:10 -04:00
Anuken
9cb4645b11 More unit progress 2020-07-10 20:04:45 -04:00
T1NT4
b81de5ebe4 Update bundle_pt_BR.properties
changed the revenant factory description to match the revenant unit description on the database, and also fixed the revenant factory description so it no longer says that revenant are ground units
2020-07-10 18:00:12 -03:00
Anuken
d7e432f730 Unit name changes 2020-07-10 16:38:19 -04:00
Anuken
2eb27d156d Removed useless files
These have not been updated in years
2020-07-10 13:41:09 -04:00
Anuken
d1485e3e65 IntelliJ has failed to commit this file 3 times
It's been checked in my version control UI for my last 3 commits, and was invisible in my first commit despite me refreshing the list
2020-07-10 13:26:05 -04:00
Anuken
21170634bd More unit abilities 2020-07-10 13:22:45 -04:00
Anuken
baa9f22a0b Ground support unit implementations 2020-07-10 12:14:24 -04:00
Anuken
f39702e1cc Core unit balance 2020-07-10 09:43:59 -04:00
Anuken
b94f883f39 More multiplayer fixes 2020-07-09 20:58:49 -04:00
Anuken
7c5f3762dd Bugfixes 2020-07-09 16:48:36 -04:00
Anuken
938ae6e80a Merge remote-tracking branch 'origin/master' 2020-07-09 13:14:05 -04:00
Anuken
2584197a02 Multiplayer bugfixes 2020-07-09 13:13:57 -04:00
zethnest
2a81370c66 fix power produce & consumption (#2217) 2020-07-09 09:23:49 -04:00
Anuken
29e9d064df Unit wreck visuals 2020-07-08 23:48:12 -04:00
Anuken
b0f69263c7 Bugfixes 2020-07-08 19:17:08 -04:00
Anuken
c15aec641a Environmental lights / Bugfixes 2020-07-08 12:40:17 -04:00
Anuken
a9333baa78 Research tweaks 2020-07-08 12:11:27 -04:00
Anuken
26e70fa585 Many various campaign mechanic changes 2020-07-07 21:13:03 -04:00
Anuken
b95206cf87 Support for jar mods on desktop 2020-07-07 09:34:52 -04:00
stuffyAI
2c982213b9 Update achievements.vdf 2020-07-07 08:04:58 +02:00
stuffyAI
45488947ef Fixes from above comments
Sbeve
2020-07-07 08:02:34 +02:00
Anuken
56ffe5aea8 Campaign mechanics 2020-07-06 21:53:34 -04:00
Anuken
a6523630bf Unit sprite cleanup 2020-07-06 11:05:37 -04:00
stuffyAI
0da19d54bb Create achievements.vdf 2020-07-06 15:16:18 +02:00
Catchears
8a5f19e4f9 Changes from stuffAI 2020-07-06 13:08:48 +02:00
Janek
14f975bde7 Unify Tutorial terminology in german translation
A friend of mine was playing through the tutorial and was confused by the term "Turm", since the duo is translated as "Geschütz", so he didn't quite know what the tutorial wanted. This unifies the terminology, since in the beginning you only have one "Geschütz" choice anyways.
2020-07-05 17:54:48 +02:00
Anuken
9b285e6b21 Removed references to "phantom" 2020-07-05 11:15:46 -04:00
Anuken
403597f860 Unit cleanup 2020-07-05 10:39:54 -04:00
Anuken
add0d0cd86 Unit naming / Fixed #2209 2020-07-04 23:53:22 -04:00
Anuken
685275237a Updated older annotation processors 2020-07-03 20:26:23 -04:00
Anuken
8576d535bd Removed "on" prefix from all remote methods 2020-07-03 18:48:31 -04:00
Anuken
7ff2e98420 Cleanup 2020-07-03 16:41:06 -04:00
Anuken
843a8c3e56 Fixed crashes with team IDs above 127 2020-07-03 12:36:12 -04:00
Anuken
3772b04c6b Miner unit fixes 2020-07-03 09:30:08 -04:00
Anuken
fb7633cb07 Cyclone hits ground targets again 2020-07-02 23:35:36 -04:00
Anuken
efa8d8a0d7 Minor weapon fixes 2020-07-02 23:19:44 -04:00
Anuken
f4a7108382 Weapon system refactoring 2020-07-02 22:48:37 -04:00
Anuken
d59aab1a7d Air/ground bullet cleanup 2020-07-02 15:52:21 -04:00
Anuken
ee3aedc75f Implemented core item display (WIP) 2020-07-02 15:27:02 -04:00
Anuken
cecb5cf4b4 Added tractor beam turret 2020-07-02 14:02:33 -04:00
Anuken
0a7e40bd23 Merged wall classes 2020-07-02 10:44:31 -04:00
Anuken
fd2deb0a82 Moved pref saving to specific locations 2020-07-02 10:20:16 -04:00
Anuken
5f6c71b9d3 Replaced concept of "turns" with raw seconds 2020-07-01 11:50:33 -04:00
Anuken
3cf5adc278 Merge remote-tracking branch 'origin/master' 2020-06-30 19:14:40 -04:00
Anuken
e907c2045c Cleanup 2020-06-30 19:14:32 -04:00
Katsute
5740c2b6d0 hideme (#2201)
Co-authored-by: Katsute <Katsute@users.noreply.github.com>
2020-06-30 11:53:14 -04:00
Anuken
c2c0c3fd08 Fixed #2197 2020-06-29 21:22:12 -04:00
Anuken
df4278a646 Removed item core restrictions 2020-06-29 19:32:15 -04:00
Anuken
810a59f146 Mass driver resprite 2020-06-29 16:23:25 -04:00
Anuken
9ec23940b9 Merge remote-tracking branch 'origin/master' 2020-06-29 15:58:57 -04:00
Anuken
bf5dd7386e Reduced garbage allocation 2020-06-29 15:58:48 -04:00
Anuken
5f7e25b65e Updated README with JDK 14 suggestion 2020-06-29 15:30:31 -04:00
Anuken
d58e3ac235 Implemented more sector launch mechanics 2020-06-29 11:58:43 -04:00
WinterUnderTheSnow
679aab18ee *Phantom is now Phenom too
XD
2020-06-29 10:07:53 +08:00
Anuken
fb032eb763 Enforce sector core capacity 2020-06-28 20:16:36 -04:00
Anuken
0d6657a1e8 Idle sector resource production 2020-06-28 18:55:42 -04:00
Anuken
fceac4c1a1 Don't show launch animation for existing bases 2020-06-28 13:35:08 -04:00
Anuken
b3f29f100d Custom launch items 2020-06-28 13:33:53 -04:00
Prosta4okua
24071ed23b Merge branch 'master' into master 2020-06-28 19:41:37 +03:00
Prosta4okua
e1e9b28bf1 Ненужная большая буква + обновление с master.
1. Вы -> вы
2. Ваш -> ваш
«Вы» используется только в деловом общении.
2020-06-28 19:34:12 +03:00
Anuken
6386cae19a Launching dialog bugfixes & requirement display 2020-06-28 11:40:03 -04:00
WinterUnderTheSnow
b12d3ae0ba Corrected some translations
4,5 Noticed that using discord in China need some unusual ways.
19 ‘Gameover’ not ‘Your core has been destroyed!’
105 Mod guide is actually guiding you how to make a mod 
116 ‘dependences’refers to ‘mods needed’,not ‘condition needed’
126 ‘import mod from GitHub’sounds better than’import github mod’
151 I think ‘Your are not invited to play on this server’ sounds better than ‘You are not in the whitelist’.This will stop noobs spamming everywhere.
155 ‘Server admin’ but not ‘Room owner’
156,193,203,206 ‘ban’ is better than ‘blacklist’
195 added one this server’
1000 phantom?Why not Phenom(Yes that CPU) XD (In fact ‘神魂修理机’ is a joke too)
2020-06-28 21:40:17 +08:00
Anuken
bd274f804a Loadout selection + custom loadout schematics 2020-06-27 23:04:38 -04:00
Anuken
63356e96ec Merge remote-tracking branch 'origin/master' 2020-06-27 19:16:47 -04:00
Anuken
80332e37d5 Upgradeable cores 2020-06-27 19:16:39 -04:00
Summet
63717bdf51 Small Colored Shields Improvement. (#2193)
When a player places a force projector, the color of its edges will be the color of the player.
2020-06-27 11:06:13 -04:00
Anuken
313cadb763 Minor cleanup / Trail experiment 2020-06-27 09:20:52 -04:00
Anuken
0847b20401 Cleanup 2020-06-26 18:50:30 -04:00
Anuken
7401c16ded Team-colored shields 2020-06-26 18:42:29 -04:00
Anuken
0df4e26736 Cleanup 2020-06-26 15:59:54 -04:00
Anuken
fdf7c88083 argh 2020-06-26 14:27:26 -04:00
Anuken
eabc5c15c7 Codegen for an inheritance tree 2020-06-26 11:58:35 -04:00
Catchears
bec394abbc Fix translations 2020-06-26 08:43:39 +01:00
Anuken
96f41b0cf3 Cleanup 2020-06-25 22:34:38 -04:00
Anuken
c12865eabc Removed reload, forced mandatory mod restart 2020-06-25 22:31:47 -04:00
Anuken
ecfac00c30 Arc 2020-06-25 12:54:55 -04:00
Anuken
d90807b29c Bugfixes 2020-06-25 12:51:30 -04:00
Catchears
f4f5658fee Revert "Revert "Small comma fix""
This reverts commit 62399d0f2b.
2020-06-25 13:22:50 +01:00
Catchears
62399d0f2b Revert "Small comma fix"
This reverts commit 47ec565316.
2020-06-25 13:22:39 +01:00
Catchears
47ec565316 Small comma fix 2020-06-25 11:06:28 +01:00
Catchears
0f224c7780 Add / improve translations again 2020-06-25 11:02:48 +01:00
Catchears
946ac8eefb Change capitalisation due to a mistake 2020-06-25 09:45:21 +01:00
Anuken
19cb144cdb Minor GL fixes 2020-06-24 20:37:49 -04:00
Anuken
b204074690 More multiplayer fixes 2020-06-24 10:07:05 -04:00
Anuken
d5c758c18a arc 2020-06-23 22:47:40 -04:00
Anuken
843be42568 More multiplayer bugfixes 2020-06-23 22:46:28 -04:00
Anuken
db2f61ec29 less instant disconnect, more broken multiplayer 2020-06-23 21:07:20 -04:00
Anuken
d095008e7c Some initial multiplayer bugfixes 2020-06-23 20:01:55 -04:00
Anuken
fc8e1d5b6d Bugfixes 2020-06-23 16:27:32 -04:00
Anuken
ba78eab30a Proper player icons 2020-06-23 15:40:24 -04:00
Anuken
7b7e803011 Cleanup 2020-06-22 23:08:59 -04:00
Anuken
7dfd20d020 Core launch cost 2020-06-22 21:02:53 -04:00
Petr Gašparík
f0882d8d5e Czech translation - up to date 2020-06-22 23:19:57 +02:00
Petr Gašparík
e3735ffa9c Merge branch 'master' of https://github.com/Anuken/Mindustry into v105 2020-06-22 22:54:57 +02:00
Math2128
185e4334f6 Update bundle_fr.properties
Update to the main bundle
2020-06-22 13:52:06 -04:00
Anuken
58d8e22b40 Added smooth camera option 2020-06-22 13:40:04 -04:00
Anuken
47b06d0eac Added sandstorm weather 2020-06-22 11:10:12 -04:00
Anuken
42c323365a Removed CoreLauncher 2020-06-21 20:22:20 -04:00
Anuken
9c69e3a1a0 Bugfixes / Sector preset cleanup 2020-06-21 16:00:26 -04:00
Catchears
af7b7ef2b1 Improved german translation. 2020-06-21 20:03:46 +01:00
Anuken
4a8be42258 Lowercase enums 2020-06-21 12:38:59 -04:00
Anuken
6f1a64db78 Updated atlas with correct enum names 2020-06-21 12:25:11 -04:00
Anuken
934db24d3b Renamed Texture enums with correct case 2020-06-21 12:20:02 -04:00
Anuken
93ae73abb6 Sprite cleanup 2020-06-21 10:38:13 -04:00
Anuken
71ea9b3bd9 (IntelliJ refuses to add new files after refresh) 2020-06-21 10:34:00 -04:00
Anuken
6517eaf62f Implemented #2177 2020-06-21 10:33:08 -04:00
Anuken
a0f0640729 Testing liquids/items in tech tree 2020-06-20 22:21:43 -04:00
Anuken
2082976783 Merge remote-tracking branch 'origin/master' 2020-06-20 12:28:31 -04:00
Anuken
25338ff1cf Removed CampaignData.java/GlobalData.java 2020-06-20 12:28:24 -04:00
Patrick 'Quezler' Mounier
e41d2d66c5 Make room for a space (#2179) 2020-06-20 11:35:26 -04:00
Anuken
ec4a5880b7 Fixed #2178 2020-06-20 09:07:35 -04:00
Anuken
f419de0fad Fixed some tech tree layout issues 2020-06-19 23:36:21 -04:00
Anuken
6bcc103cf7 Research system progress 2020-06-19 19:31:14 -04:00
Anuken
08ac91359b Sprite cleanup 2020-06-19 12:26:58 -04:00
Anuken
63eee99aba Merge remote-tracking branch 'origin/master' 2020-06-19 12:26:48 -04:00
Anuken
2280ed6071 Research block tweaks / Merged in #1927 2020-06-19 12:26:41 -04:00
Albert Cerfeda
5a1c9ce785 Minor changes 2020-06-19 15:53:21 +02:00
Albert Cerfeda
2ee518c9fc Uppercase initial of 'Trello' (#2174) 2020-06-19 08:06:31 -04:00
Anuken
15623fbe5c Support for local server discovery on Steam 2020-06-18 19:23:42 -04:00
Anuken
daefe6bc1f Cleanup 2020-06-18 18:47:50 -04:00
Anuken
31708b9af7 Exception parsing cleanup 2020-06-18 18:47:34 -04:00
Anuken
fa2df57021 Sector preset shadow fixes 2020-06-18 14:43:53 -04:00
Anuken
d38abe95f9 Editor bugfixes / Arbitrary map resizing 2020-06-18 14:24:22 -04:00
Anuken
ae47f37b27 Added campaign target wave 2020-06-17 21:41:39 -04:00
Anuken
e88ff1a358 Minor UI tweaks 2020-06-17 15:07:20 -04:00
Anuken
bce8a61390 Switched to ES6 language level 2020-06-17 14:35:47 -04:00
Anuken
2bfe0c30ec Cleanup 2020-06-17 12:17:29 -04:00
Anuken
3c02234a3b Ammo resupply point implementation 2020-06-17 10:41:26 -04:00
Anuken
de16c95dd6 Some simplification 2020-06-16 23:01:58 -04:00
Anuken
5da0267df9 Hover unit display 2020-06-16 22:56:51 -04:00
zethnest
0aa313e37c fixed-hotkey implementation (#2170) 2020-06-16 16:29:44 -04:00
Anuken
a7ca632c09 AI in custom game attack mode 2020-06-16 16:04:25 -04:00
Anuken
d1de976dc4 arc 2020-06-16 14:15:10 -04:00
Anuken
2e42526e90 Fixed up Discord RPC 2020-06-16 14:13:43 -04:00
Anuken
918c9492df Changing discord RPC system 2020-06-16 13:43:00 -04:00
Anuken
6e162d91e5 Fixed #2169 2020-06-16 10:08:33 -04:00
Anuken
1eaa1a05ac Switched to rhino fork 2020-06-15 23:22:14 -04:00
Anuken
caea5c7df2 Cleanup 2020-06-15 21:52:51 -04:00
Anuken
b789394efc TextField fixes 2020-06-15 19:26:03 -04:00
Anuken
89aec3ac51 Cleanup 2020-06-15 18:35:21 -04:00
Anuken
405d6cf33f Per-team infinite building resources 2020-06-15 15:33:14 -04:00
Math2128
cecfe77e95 Update bundle_fr.properties
Translated new stuffs + fixed two mistakes.
2020-06-15 15:06:42 -04:00
Anuken
7001ad09cb Support for team-only lighting 2020-06-15 13:54:02 -04:00
Anuken
b5660a50ca Certain team-specific rules 2020-06-15 12:00:32 -04:00
LOGISTICAL NIGHTMARE
c8d59cea6d Add Chaotic-Neutral PvP Server to Community Server List 2020-06-15 11:43:23 -04:00
Anuken
90b0650af9 Merge remote-tracking branch 'origin/master' 2020-06-15 09:58:54 -04:00
Anuken
d04ce2a750 Block damage multiplier rule 2020-06-15 09:58:46 -04:00
Cyberman
3dfad51e93 Update bundle_nl.properties
Just a few things I had time for.
2020-06-15 15:49:10 +02:00
ILiekMelons
dbe482d494 Fixed disassembler and overdrive projector (#2163)
I misspelt disassembler and forgot to put a .name somewhere 😅
2020-06-15 09:44:38 -04:00
Math2128
db77cfa3b5 Update bundle_fr.properties
added the new stuff from the main bundle + fixed a typo
2020-06-15 02:02:04 -04:00
Math2128
ac14f43107 Update bundle_fr.properties
1125
2020-06-14 20:45:10 -04:00
ILiekMelons
2a7da8c80e Add names for new drones and machines (#2162)
* Add in names for drone-related things

* Various machines added

* extra newline that i removed
2020-06-14 20:43:25 -04:00
Anuken
0a40991c75 Update README.md 2020-06-14 19:58:19 -04:00
Anuken
9dffbde8c8 Update README.md 2020-06-14 19:58:08 -04:00
Anuken
0968f0be59 Testing doc script [2] 2020-06-14 18:51:38 -04:00
Math2128
baa0d5a951 Update bundle_fr.properties
1030
2020-06-14 18:46:32 -04:00
Anuken
5f79040faa Testing doc script 2020-06-14 18:41:42 -04:00
Anuken
126b54b981 Better built-in shuffle 2020-06-14 14:50:04 -04:00
Math2128
9e105dbce5 Update bundle_fr.properties
971
2020-06-14 14:13:15 -04:00
Anuken
5370874686 Client debug info 2020-06-14 11:21:50 -04:00
Anuken
84693f5073 ? 2020-06-14 11:16:52 -04:00
Anuken
1823bc8f15 Support for compiling on Java 14 2020-06-14 11:10:54 -04:00
Math2128
a7a31f6c35 Update bundle_fr.properties
837
2020-06-14 00:33:57 -04:00
Anuken
b4573861a8 h i g h precision shaders
(I shouldn't need to do this)
2020-06-13 20:58:41 -04:00
Anuken
1f48daa4ed arc 2020-06-13 18:20:37 -04:00
Anuken
f365d8519b Reconstructor fixes 2020-06-13 18:20:10 -04:00
Anuken
c74d2f8cf2 Merge remote-tracking branch 'origin/master' 2020-06-13 16:27:22 -04:00
Anuken
b48736e771 Reconstructor sprites / Bugfixes 2020-06-13 16:27:15 -04:00
Summet
26f0a627d5 Unnecessary Draw.z (#2160) 2020-06-13 15:19:27 -04:00
Anuken
f55fb48ea7 Slightly higher contrast black palette 2020-06-13 12:24:50 -04:00
Anuken
9e96954eaa Fixed colorswap 2020-06-13 12:18:18 -04:00
Anuken
186ae4e2a2 why 2020-06-13 12:13:57 -04:00
Anuken
fef4882c15 Turbine generator tweaks 2020-06-13 12:08:03 -04:00
Anuken
c8f2362b7e Merge remote-tracking branch 'origin/master' 2020-06-13 10:54:50 -04:00
Anuken
0869db6eb6 testing to see if Java 14 CI fixes anything 2020-06-13 10:54:47 -04:00
Anuken
8237d901e4 Update gradle.yml 2020-06-13 10:48:59 -04:00
Anuken
f76b349d3f Merge remote-tracking branch 'origin/master' 2020-06-13 10:42:18 -04:00
Anuken
d7fcb65b4e CI test 2020-06-13 10:42:14 -04:00
Anuken
8769b9bf0e CI test 2020-06-13 10:41:59 -04:00
Anuken
dc8cb09013 Update gradle.yml 2020-06-13 10:40:50 -04:00
Anuken
348b379490 Update gradle.yml 2020-06-13 10:38:42 -04:00
Anuken
0601a2a90b Update gradle.yml 2020-06-13 10:36:24 -04:00
Anuken
bb7da46301 Merge remote-tracking branch 'origin/master' 2020-06-13 10:33:26 -04:00
Anuken
3b3a1dd496 Editor map fix / Crafter renderer system 2020-06-13 10:33:19 -04:00
DeltaNedas
e025f94200 make FPS/Ping and position untouchable (#2159) 2020-06-12 21:32:19 -04:00
Anuken
27522ae494 Icon generation improvements 2020-06-12 19:41:06 -04:00
Anuken
2bd3bc0e13 Reconstructor fixes 2020-06-12 18:41:35 -04:00
Anuken
d85a7338ea Batch cleanup 2020-06-12 17:20:50 -04:00
Anuken
a47e300297 Cleanup 2020-06-12 14:57:57 -04:00
Anuken
a76cb3cb1a Scrapped reaper segments 2020-06-12 13:32:00 -04:00
Anuken
ce9f515543 Fallback atlas / Bugfixes / Cleanup 2020-06-11 15:25:46 -04:00
Anuken
1e954dc2be Cleanup 2020-06-11 14:09:06 -04:00
Anuken
e247b092dc cleaning up mistakes 2020-06-11 13:42:22 -04:00
Anuken
732769524c 🔥🔥🔥 2020-06-11 12:03:27 -04:00
Math2128
917db20e76 Update bundle_fr.properties 2020-06-10 23:10:00 -04:00
Anuken
2a9008f042 Transition to Framebuffer#blit 2020-06-10 21:07:21 -04:00
Math2128
c5df9aa814 Update bundle_fr.properties
Ligne 644: Le jeu ne se met pas en pause pendant que l'on construit, même avec cette option de cocher. En fait, cela met la construction sur pause et attend que l'on appuie sur la touche E (par défaut) pour confirmer la construction. Je trouvais l'ancien nom assez trompeur, et je l'ai donc changer comme cela. 

I'm at line 762
2020-06-10 19:20:31 -04:00
Anuken
6648a9ff1a Cleanup 2020-06-10 19:19:19 -04:00
Anuken
c66c3590b1 Batch cleanup 2020-06-10 17:42:45 -04:00
Anuken
a7bdd6c856 Improved shader preprocessing 2020-06-10 16:58:56 -04:00
Anuken
6ae8247a02 arc 2020-06-10 15:32:14 -04:00
Anuken
2662228bec Use GL3.0 for all platforms 2020-06-10 15:31:43 -04:00
Anuken
2b1bd90dfa Out of atlas space / GL30 progress 2020-06-10 12:55:01 -04:00
Math2128
61d212128a Update bundle_fr.properties
line 709
2020-06-09 23:47:13 -04:00
Anuken
a51a8d7473 Added cool new reconstructors™️ 2020-06-09 23:11:02 -04:00
Anuken
9fbe421905 Sprites 2020-06-09 17:04:38 -04:00
Math2128
778b61914a Update bundle_fr.properties
Correction de quelques fautes de frappe lors des modifications des descriptions des tourelles.
Fixed some typos about turret descriptions.
2020-06-09 14:04:00 -04:00
Anuken
d0565420ef Sprites 2020-06-09 11:08:22 -04:00
Anuken
b346b9114a Updated Gradle 2020-06-09 08:46:28 -04:00
Anuken
99518f4e1d Functioning 5x5 reconstructor 2020-06-08 21:34:08 -04:00
Anuken
6501071510 Cleanup, renaming 2020-06-08 21:03:29 -04:00
Anuken
6dd9369066 Cleanup 2020-06-08 17:31:02 -04:00
Anuken
5be5d11c8e Hash updated 2020-06-08 17:20:43 -04:00
Anuken
8ea28e1ced Seq. 2020-06-08 17:19:47 -04:00
Anuken
87ab895253 Sprites moved 2020-06-08 17:10:55 -04:00
Anuken
43762e82a8 Unit tweaks 2020-06-08 16:33:21 -04:00
Math2128
758b327639 Update bundle_fr.properties
Quelques changements aux descriptions des tourelles pour s'ajuster aux définitions anglaises et dans le but d'homogénéiser les descriptions. Je ne suis pas sur au niveau du Cyclone.
Some changes about the turret descriptions to fit more the english description.
2020-06-08 15:07:50 -04:00
Anuken
bb9855e830 Merge remote-tracking branch 'origin/master' 2020-06-08 11:52:27 -04:00
Anuken
cac6041583 tweaks 2020-06-08 11:52:14 -04:00
Anuken
1f905790e7 kinematic lerp 2020-06-08 11:45:48 -04:00
Anuken
427cf8e594 cleanup 2 2020-06-08 11:06:04 -04:00
Anuken
5c6a155d75 cleanup 2020-06-08 10:57:52 -04:00
EyeOfDarkness
b9ccc528e9 Updated Chaos Array and Eradicator sprites (#2155)
* updated sprite

* lich

* Add files via upload

* Add files via upload

* ground

* Add files via upload
2020-06-08 10:57:02 -04:00
Anuken
4537c4ea57 no IK 2020-06-08 10:46:19 -04:00
Summet
af3423d94a Add newline to contributors file (#2156) 2020-06-08 10:20:59 -04:00
Anuken
5869b7d27e leg 1 2020-06-08 10:03:46 -04:00
Math2128
be50ededcd Update bundle_fr.properties
Because I made typos translating the tutorial
2020-06-07 21:35:00 -04:00
Math2128
f7a7521120 Update bundle_fr.properties
Worked on the « may be subject to a lot of changes» tutorial.
2020-06-07 21:09:40 -04:00
Math2128
5ca1d66755 Update bundle_fr.properties 2020-06-07 20:01:36 -04:00
Anuken
36ce04e8f0 fuse fix 2020-06-07 18:26:45 -04:00
Petr Gašparík
cd1918e337 Czech translation - update with cleanups 2020-06-08 00:00:56 +02:00
Petr Gašparík
269a92a723 Merge branch 'master' of https://github.com/Anuken/Mindustry into v105 2020-06-07 23:56:42 +02:00
Anuken
06f3e8ca7a Merge remote-tracking branch 'origin/master' 2020-06-07 17:22:25 -04:00
Anuken
210971fedb Bugfixes 2020-06-07 17:22:17 -04:00
Summet
66f7198c7c [Small Fix] Cursor On Enemy Block. (#2152)
* cursor fix

* mistake
2020-06-07 14:56:41 -04:00
Anuken
6c00b2a0ff Merge remote-tracking branch 'origin/master' 2020-06-07 14:17:46 -04:00
Anuken
42a6b0e369 Unit cleanup 2020-06-07 14:17:42 -04:00
Math2128
68cfd1790a Update bundle_fr.properties
Line 633
2020-06-07 13:44:12 -04:00
LOGISTICAL NIGHTMARE
465a8af03e add Chaotic-Neutral to Community Server List (#2144) 2020-06-07 13:30:41 -04:00
Anuken
8993c1db04 Fixed editor crash 2020-06-07 13:28:22 -04:00
Anuken
9574f742e1 Eruptor legs 2020-06-07 11:15:25 -04:00
Anuken
fb9670d0ad Merge remote-tracking branch 'origin/master' 2020-06-07 09:58:36 -04:00
Anuken
737e32e447 Bugfixes 2020-06-07 09:58:29 -04:00
키에르
09d42773a6 Match 69d0751e65 2020-06-07 22:29:03 +09:00
키에르
b9b57f7908 Finish 2020-06-07 22:03:43 +09:00
Math2128
409cc219f1 Update bundle_fr.properties
Line 476
2020-06-07 00:45:57 -04:00
Anuken
c479a3482d Update CONTRIBUTING.md 2020-06-06 22:36:19 -04:00
Anuken
bf125c92d3 Merge remote-tracking branch 'origin/master' 2020-06-06 17:15:12 -04:00
Anuken
b4cecbc3b9 Plastanium laser blocking 2020-06-06 17:15:08 -04:00
Math2128
f940f96a14 Update bundle_fr.properties
Fixed some more typos and added a few translation lines (259 to 462)
2020-06-06 15:16:02 -04:00
ThePythonGuy
f81529c005 Reduce the screen shake generated by salvos (#2148)
It becomes very difficult to try and build things precisely around salvos, specifically in attack maps, because they shoot very fast and cause a lot of camera shake, which makes very difficult to place conveyors or turrets around them.
2020-06-06 14:03:10 -04:00
Anuken
182d8e2daf Bugfixes 2020-06-06 12:55:21 -04:00
Anuken
0f76aeba05 More intelligent suicide units / Bugfixes 2020-06-06 11:36:14 -04:00
Anuken
1e3a190d5a Balance 2020-06-06 09:33:25 -04:00
Anuken
93fe794f63 Sprite tweaks 2020-06-05 22:38:41 -04:00
Anuken
890e84ab62 Somewhat functional base building AI 2020-06-05 22:38:27 -04:00
Anuken
65e94850ca Sprite tweaks 2020-06-05 20:59:30 -04:00
Anuken
28fb6a7d2a Merge remote-tracking branch 'origin/master' 2020-06-05 20:41:12 -04:00
Anuken
0b4de1a4fa Foundation for building AI 2020-06-05 20:41:05 -04:00
EyeOfDarkness
305c19496e Updated Segment and Lich sprite (#2143)
* updated sprite

* lich
2020-06-05 20:39:58 -04:00
Anuken
685f915656 Various fixes 2020-06-05 18:03:57 -04:00
Anuken
1ef546b578 Base tweaks 2020-06-05 16:42:52 -04:00
Anuken
50422aaac5 Base bugfixes 2020-06-05 16:33:55 -04:00
Anuken
597d58e843 Power network base support 2020-06-05 14:23:57 -04:00
Anuken
b3ff616af2 Better generation 2020-06-05 13:42:48 -04:00
Anuken
cf02a75846 Support for schematic random rotation 2020-06-05 13:23:24 -04:00
Math2128
fa665468d3 Update bundle_fr.properties
Fixed some typos here and there (line 1 to 258)
2020-06-05 12:02:56 -04:00
Anuken
d9e05907af Basic schematic based generation 2020-06-05 10:45:57 -04:00
Anuken
17b1eaf1b6 Merge remote-tracking branch 'origin/master' 2020-06-04 14:50:16 -04:00
Anuken
803f9e8eb6 Made save format support removed blocks 2020-06-04 14:50:08 -04:00
키에르
733713c9a2 Features for Hub/Lobby Servers (#2136)
* Features for Hub/Lobby Servers

* Update NetworkIO.java

* upper
2020-06-04 11:10:03 -04:00
Anuken
f112226178 Direct block payload pickup 2020-06-04 10:19:25 -04:00
Anuken
95354f6d11 Slight balancing of turrets/ammo 2020-06-04 09:32:00 -04:00
Ali-C-Ila
0e7c70fe3c Update bundle_zh_TW.properties 2020-06-04 18:44:30 +08:00
soytheLB
d2d0be7759 Update bundle_es.properties
added line 275 respawn
changed  waves.boss to waves.guardian

added bar.units
removed bar.
2020-06-04 05:16:04 -03:00
Anuken
c25ea81926 Better UI for certain dialogs 2020-06-03 22:40:43 -04:00
Anuken
5bcaed54c6 3x3 separator 2020-06-03 19:42:42 -04:00
Anuken
45c2cd7ac3 Large overdrive projector 2020-06-03 17:23:45 -04:00
Anuken
6fff4ad8a1 Point defense blocks 2020-06-03 16:22:07 -04:00
Anuken
3d98de34eb Thermal -> AttributeSmelter 2020-06-03 12:19:27 -04:00
Anuken
9b65151718 Merge remote-tracking branch 'origin/master' 2020-06-03 12:11:47 -04:00
Anuken
3c89ccf7c3 Added silicon crucible 2020-06-03 12:11:40 -04:00
AydenRennaker
973dc5fe3e Add Atanner Gaming Survival Server (#2133)
Seems like there is a lot of interest in the survival game mode so we want to add a new survival exclusive server.
2020-06-03 10:57:44 -04:00
Anuken
b786260f89 Save last github mod imported 2020-06-03 10:57:24 -04:00
Anuken
7f6dcbd75a Cleanup 2020-06-03 01:27:40 -04:00
Anuken
0382d40dcc Payload router 2020-06-03 01:13:44 -04:00
Anuken
140e1fa53e 🚮Upgrade cleanup 2020-06-02 23:45:39 -04:00
Anuken
34568f12d6 🚮 2020-06-02 23:01:47 -04:00
Anuken
c7bfba7a23 Merge remote-tracking branch 'origin/master' 2020-06-02 22:09:54 -04:00
Anuken
5e7d9f8119 Awful enemy base generation 2020-06-02 22:09:41 -04:00
키에르
86b769bd27 Remove kr server (#2134) 2020-06-02 19:00:43 -04:00
Anuken
789cc3cdb9 Launch animation 2020-06-01 23:17:55 -04:00
Anuken
69d0751e65 Cleanup 2020-06-01 18:55:19 -04:00
Anuken
68f1efdbdd Sector launch impl 2020-06-01 16:00:36 -04:00
Anuken
ba788bac7a Planet rendering refactoring 2020-06-01 13:55:52 -04:00
Anuken
b314e38c0e Cleanup 2020-06-01 12:57:27 -04:00
Anuken
bb6230966f Fixed #2131 2020-06-01 12:54:46 -04:00
Anuken
e2d016f318 Merge remote-tracking branch 'origin/master' 2020-06-01 11:12:17 -04:00
Anuken
8273198c56 Bugfixes 2020-06-01 11:12:06 -04:00
zethnest
0c6b7aa934 fix export icon (#2130) 2020-06-01 09:05:49 -04:00
zethnest
b6c0e92c2c readability and redundant (#2129) 2020-05-31 22:56:23 -04:00
Anuken
d984862c69 Merge remote-tracking branch 'origin/master' 2020-05-31 20:16:39 -04:00
Anuken
5b4a22e219 Implemented #1329 2020-05-31 20:16:32 -04:00
Anuken
6a24a82345 Update bug_report.md 2020-05-31 18:12:44 -04:00
Anuken
23b2170c66 Update config.yml 2020-05-31 18:11:07 -04:00
Anuken
f6f0d6c1be Delete feature_request.md 2020-05-31 18:10:29 -04:00
Anuken
3cc89156a7 Create config.yml 2020-05-31 18:10:16 -04:00
Anuken
8598b0a23a Fixed bizzare planet render bugs 2020-05-31 16:45:03 -04:00
Anuken
bd349803d3 Moved some blocks around 2020-05-31 14:39:10 -04:00
Anuken
0842c3f0a0 Progress on sector state 2020-05-30 21:04:41 -04:00
Anuken
8a4824e72d Fixed compilation 2020-05-30 12:14:24 -04:00
Anuken
e1dfb68cfd Preparation for moving planet dialog 2020-05-30 12:12:04 -04:00
Anuken
73b25c103c Merge remote-tracking branch 'origin/master' 2020-05-30 12:11:11 -04:00
Anuken
d988b4b5c9 Method refactoring / Cleanup 2020-05-30 12:11:00 -04:00
AydenRennaker
30af729f93 Add Atanner Gaming Mindustry Attack Server (#2128)
Lot of interest in this game mode decided to add another server to support it.
2020-05-30 09:22:09 -04:00
Anuken
8d0486d425 Fixes wave being an item turret for some reason 2020-05-30 09:06:39 -04:00
Ali-C-Ila
95ade7f32a Update bundle_zh_TW.properties 2020-05-30 19:48:14 +08:00
Anuken
9e7a97b780 Minor fixes 2020-05-29 20:47:00 -04:00
Anuken
b08eafc78e Revenant 2020-05-29 20:08:23 -04:00
Anuken
42252fa217 Updated travis build-tools 2020-05-29 14:08:36 -04:00
Anuken
be5ba03142 Cleaned up schematic dialog code 2020-05-29 14:01:27 -04:00
Anuken
35679925d2 Merge branch 'master' of https://github.com/Anuken/Mindustry 2020-05-29 13:58:57 -04:00
Anuken
780c4208bb Cleanup 2020-05-29 13:58:53 -04:00
zethnest
b3590134ab [QOL] Search Ignore Symbols (#2079)
* autofocus implementation

* fuzzy match schematic search implementation

* enter to select first schematic implementation

* fix duplicate variable

fix setting check

* no fuzzy match

* Update SchematicsDialog.java

useless t.update

* fix no schematic match
2020-05-29 13:58:44 -04:00
Anuken
d851a09944 Cleanup 2020-05-29 13:52:42 -04:00
Anuken
5275599baf Removed player damage/speed rules
these didn't work anyway, since units are player-controlled
2020-05-29 13:49:29 -04:00
Anuken
402fe88cf6 Bugfixes / Direct payload support 2020-05-29 10:44:08 -04:00
Anuken
a89d2025e3 Merged some turret classes 2020-05-29 09:59:08 -04:00
Anuken
a7f86b2ba6 Cleanup 2020-05-28 21:13:25 -04:00
Anuken
c5c8d646f7 Cleanup 2020-05-28 12:16:35 -04:00
Anuken
fbc2d13435 Bugfixes 2020-05-28 12:13:06 -04:00
Anuken
ed795076f0 Dynamic pathfinding 2020-05-28 11:27:42 -04:00
Petr Gašparík
5119959b0f Merge branch 'master' of https://github.com/Anuken/Mindustry into v105 2020-05-28 08:23:37 +02:00
Anuken
638343d25e Variable mass driver bullets 2020-05-27 19:57:07 -04:00
Anuken
55f0aa6d3b Bugfixes 2020-05-27 18:23:20 -04:00
Anuken
49c7984c8c Merge remote-tracking branch 'origin/master' 2020-05-27 18:11:45 -04:00
Anuken
92d265402b Payload support 2020-05-27 18:11:42 -04:00
Petr Gašparík
6a8d66c169 Merge branch 'master' of https://github.com/Anuken/Mindustry into v105 2020-05-27 15:41:18 +02:00
zethnest
0d0450e3d1 Icon.upload for schematic upload (#2116) 2020-05-26 22:58:53 -04:00
Anuken
bcadcb18bc Merge remote-tracking branch 'origin/master' 2020-05-26 22:04:20 -04:00
Anuken
da2a8aaf26 this is necessary again 2020-05-26 22:03:40 -04:00
Anuken
aaf7911735 Fixed weather not triggering serverside 2020-05-26 20:03:03 -04:00
Anuken
a375dd3fc2 Cleanup 2020-05-26 19:39:50 -04:00
Petr Gašparík
645e66fe71 Czech translation - color correction 2020-05-26 22:20:15 +02:00
Anuken
ddb3afc255 Cleanup 2020-05-26 13:20:08 -04:00
Anuken
5c4ce00dec Sprites 2020-05-26 13:00:20 -04:00
Anuken
a7c7295893 Various tweaks 2020-05-26 12:59:05 -04:00
Anuken
c1d4a4851f Better leg sprite support 2020-05-26 10:57:02 -04:00
Petr Gašparík
671162e700 Czech translation - type 2020-05-26 13:43:35 +02:00
Petr Gašparík
6ccc555047 Czech translation - Steam update 2020-05-26 13:37:43 +02:00
Petr Gašparík
34d9193cd8 Merge branch 'master' of https://github.com/Anuken/Mindustry into v105 2020-05-26 13:33:21 +02:00
Anuken
90f38fd135 Cleanup 2020-05-25 23:56:03 -04:00
Anuken
39e3ae931c more legs 2020-05-25 22:19:31 -04:00
Anuken
60684b4ef9 Legs -> Mech 2020-05-25 16:41:55 -04:00
Anuken
08af9aaa02 Replacement method bugfixes 2020-05-25 15:41:07 -04:00
Anuken
aae6d2038b Payload API changes 2020-05-25 15:03:31 -04:00
Anuken
732d90635f Removed pad sprites 2020-05-25 14:36:52 -04:00
Anuken
9292f62a20 Merge remote-tracking branch 'origin/master' 2020-05-25 14:36:45 -04:00
Anuken
1ae9d04f47 Experimental: block loader/unloaders 2020-05-25 14:36:40 -04:00
Summet
803b5328f5 show restricted build area when using schematic (#2109) 2020-05-25 13:25:31 -04:00
asl97
56afe6a10b Hide "Boost Effect" when liquidBoostIntensity == 1 (#2108) 2020-05-25 13:03:43 -04:00
Ali-C-Ila
d636242b6f Update bundle_zh_TW.properties 2020-05-25 18:37:57 +08:00
Petr Gašparík
b2382ac429 Czech translation - up to date! 2020-05-25 10:25:21 +02:00
TheJaaju
de42cd6250 Update bundle_fi.properties
- Fixed typos
- Added translations
2020-05-25 10:52:44 +03:00
Anuken
0e59a22cbe Respawn key 2020-05-24 22:27:14 -04:00
Anuken
e8869c07fe Removed respawn time rule 2020-05-24 17:05:31 -04:00
Anuken
3051598b92 Various sync fixes 2020-05-24 17:01:17 -04:00
Anuken
d202c6ebdd Hide block types 2020-05-24 15:42:14 -04:00
Anuken
e16aa5a74a Sync progress 2020-05-24 15:38:40 -04:00
Anuken
7c06ba94c1 Autogenerated interpolation 2020-05-24 14:00:53 -04:00
Anuken
1acb5fc56c Manual turret control 2020-05-24 10:11:28 -04:00
Anuken
503b947fb7 Sprite tweaks 2020-05-24 08:38:47 -04:00
Anuken
65f63fd4d2 Re-added Tau 2020-05-23 21:53:11 -04:00
Anuken
df08498d70 Bugfixes 2020-05-23 19:14:48 -04:00
Anuken
46bc2207ff Initial reconstructor impl 2020-05-23 18:49:28 -04:00
Anuken
d8ee862125 Functional payload factories 2020-05-23 11:53:49 -04:00
Anuken
39b0051b73 Directional unit factories (unfinished) 2020-05-23 10:39:44 -04:00
Anuken
f250008db3 Cleanup 2020-05-22 20:00:02 -04:00
Anuken
76aa201a99 Name changes / Bugfixes 2020-05-22 17:37:38 -04:00
Anuken
12d9479184 Added dart as default starter 2020-05-22 14:35:25 -04:00
Anuken
795bd84d06 Fixed multiplayer 2020-05-22 11:06:56 -04:00
Anuken
598c7235b4 Merge remote-tracking branch 'origin/master' 2020-05-22 09:37:22 -04:00
Anuken
46d15e0aab Auto-despawn core units 2020-05-22 09:37:19 -04:00
zethnest
8e0fa30439 [QOL] Search Schematic (#2089)
* autofocus implementation

* enter to select first schematic implementation

* fix undeclared variable

* fix import
2020-05-22 09:37:08 -04:00
Anuken
88608b3f88 Added support for server pausing 2020-05-21 22:55:40 -04:00
Anuken
c980e72f52 Fixed homing PR 2020-05-21 21:17:34 -04:00
Anuken
807d7c2084 Merge branch 'master' of https://github.com/Anuken/Mindustry 2020-05-21 21:15:44 -04:00
Anuken
b683c3f8d5 ... 2020-05-21 21:15:39 -04:00
MEEP of Faith
c07c872ad5 Homing Power Functionality (#2096)
Homing Power should probably actually affect how strong homing is.
2020-05-21 21:15:13 -04:00
Anuken
4787a68a08 Cleanup 2020-05-21 19:20:37 -04:00
Anuken
55effc54bb Fixed compilation errors 2020-05-21 16:59:38 -04:00
Anuken
c225291790 a r c 2020-05-21 16:53:30 -04:00
Anuken
14e79b50d2 Removed legacy IO code 2020-05-21 16:50:49 -04:00
Anuken
61d9fd3d72 Cleanup / Armor support 2020-05-21 14:57:15 -04:00
Anuken
b562c30381 Merge remote-tracking branch 'origin/master' 2020-05-21 11:04:59 -04:00
Anuken
684b84310b Balancing 2020-05-21 11:04:48 -04:00
zethnest
1c9ad2266d fix lowercase colorname (#2094) 2020-05-21 09:32:48 -04:00
Ali-C-Ila
ee288fbd3b Update bundle_zh_TW.properties 2020-05-21 20:32:37 +08:00
Izzat Nasrun
196a79a10c togglable in settings.game
fix zoom independency
2020-05-21 12:26:20 +08:00
Anuken
42ba97f872 Bugfixes 2020-05-20 20:28:52 -04:00
Anuken
5b445c59c1 Implemented ground mech boosting 2020-05-20 18:48:04 -04:00
Anuken
78f24b8840 Support for wave shields 2020-05-20 17:16:18 -04:00
Izzat Nasrun
f598ccb79b remove unnecessary imports 2020-05-21 04:49:46 +08:00
Izzat Nasrun
befae9a7c2 center map to player when opened implementation 2020-05-21 04:46:22 +08:00
Anuken
dc58626602 Removed zone files 2020-05-20 14:11:40 -04:00
Anuken
e8eecf8a1f Merge remote-tracking branch 'origin/master' 2020-05-20 13:56:23 -04:00
Anuken
aa19c80567 Targeting bugfixes 2020-05-20 13:56:17 -04:00
zethnest
7030f69bc6 Chat on Minimap Implementation (#2092)
* chat on minimap implementation

* add braces
2020-05-20 11:34:49 -04:00
Anuken
daa80955ac Update CONTRIBUTING.md 2020-05-20 11:34:00 -04:00
Anuken
611115e55b Better flying unit support 2020-05-19 21:19:04 -04:00
Anuken
371debceb7 Unit tweaks 2020-05-19 21:06:07 -04:00
Anuken
31e2e05e30 Merge remote-tracking branch 'origin/master' 2020-05-19 21:05:41 -04:00
Anuken
1bc7454146 Unit tweaks 2020-05-19 21:05:34 -04:00
Przemyslaw Paluch
f1ff904b66 More updates for Polish translation + provided Polish changelogs for 104.3+ versions for Android (#2088)
* Fixed typos in Polish translation

* Update Polish translation + provide changelogs for latest versions in Polish
2020-05-19 20:06:22 -04:00
Anuken
945be0c524 Various tweaks 2020-05-19 17:49:25 -04:00
Anuken
4edd024015 Merge remote-tracking branch 'origin/master' 2020-05-19 14:58:08 -04:00
Anuken
77c0163a79 Re-implemented some units / Bugfixes 2020-05-19 14:58:04 -04:00
Przemyslaw Paluch
0af1e549f8 Fixed typos in Polish translation (#2083) 2020-05-18 20:24:21 -04:00
Anuken
8c6e8d8bcb Merge remote-tracking branch 'origin/master' 2020-05-18 20:17:06 -04:00
Anuken
c3ad3a9823 Lock state implementation 2020-05-18 20:17:02 -04:00
zethnest
e63053f0f0 fix lowercase colorname (#2082) 2020-05-18 19:25:34 -04:00
Anuken
a9ece49c0d Shale biome implementation 2020-05-18 17:25:50 -04:00
Anuken
530ff9761b Fixed core selection in preset sectors 2020-05-18 15:38:56 -04:00
Anuken
a12ff624e5 ??? 2020-05-18 11:12:07 -04:00
Ali-C-Ila
255edd94f8 Update bundle_zh_TW.properties 2020-05-18 23:11:18 +08:00
Anuken
dcbe4072dc ??? 2020-05-18 11:10:56 -04:00
Anuken
3784251108 Initial support for arbitrary types of content in tech tree 2020-05-18 09:40:38 -04:00
Anuken
f290f688d0 Merge remote-tracking branch 'origin/master' 2020-05-18 08:46:09 -04:00
Anuken
b05a10b114 Crash fix 2020-05-18 08:46:05 -04:00
zethnest
dafe629c1d fix coloring (#2077) 2020-05-18 08:37:10 -04:00
Anuken
12174bcdbf Native fixes 2020-05-17 22:22:37 -04:00
Anuken
4254de01e4 Bugfixes 2020-05-17 16:17:08 -04:00
Anuken
7b3a5ad227 Functional presets 2020-05-17 13:07:46 -04:00
Anuken
d9751dbc6d Sector preset support / Per-player votekick cooldown 2020-05-17 11:12:22 -04:00
Anuken
9a32b1a35a Merge remote-tracking branch 'origin/master' 2020-05-17 08:58:39 -04:00
Anuken
4ce15416fb Fixed #2071 (in arc) 2020-05-17 08:58:35 -04:00
zethnest
4bb7d007f8 Schematic Drill Indicator (#2069)
* schematic drill indicator

* temp comment clarity

* more implementations

* implementation as suggested Anuke

implementation as suggested Anuke

* Update core/src/mindustry/world/blocks/production/Drill.java

Co-authored-by: Anuken <arnukren@gmail.com>

* suggested check & fix display

Co-authored-by: Anuken <arnukren@gmail.com>
2020-05-17 08:49:02 -04:00
키에르
3a62bfa8ce Update bundle_ko.properties 2020-05-17 16:07:21 +09:00
Anuken
7ffc170b76 Merge remote-tracking branch 'origin/master' 2020-05-16 22:44:45 -04:00
Anuken
a796fc1dce various tweaks 2020-05-16 22:44:41 -04:00
Neba-MD
44f826cc14 Add TWS (Hong Kong server) to server.json (#2070)
- A Co-op server based in Hong Kong.
- The server is also known as (ggg.sytes.net), renamed the domain name for easier identification
- Been stable and regularly maintained since 4 Feb.
- Have moderators across different timezone.
- Map pool focused on uniqueness.
2020-05-16 19:21:58 -04:00
Anuken
23b431acae Sector fixes 2020-05-16 17:02:43 -04:00
Anuken
2b46659daf Turn notification 2020-05-16 16:40:24 -04:00
Anuken
bdbc8ab6d2 Many campaign changes 2020-05-16 16:11:53 -04:00
키에르
d61da30c15 Update bundle_ko.properties 2020-05-17 02:05:33 +09:00
Anuken
d110fe5ea3 Removed usage of Core.settings#save 2020-05-16 10:23:06 -04:00
Anuken
d390484ea4 Fixed #2067 2020-05-16 09:02:07 -04:00
Anuken
6938c69d97 Minor planet dialog polish 2020-05-15 22:24:01 -04:00
Anuken
4c85864260 Direction bugfixes 2020-05-15 20:10:03 -04:00
Anuken
1cefaf28db Edge tweaks 2020-05-15 19:59:42 -04:00
Anuken
381df23bf2 Fixed #2066 2020-05-15 19:54:04 -04:00
Anuken
6a0dc4c965 fixed gradle messing everything up again 2020-05-15 17:42:59 -04:00
Anuken
94651897b2 Tweaks 2020-05-15 16:21:47 -04:00
Anuken
bc28dd392b Bugfixes / Built-in rate limits 2020-05-15 15:45:23 -04:00
Anuken
9f20de427e Bugfix 2020-05-15 11:11:03 -04:00
Anuken
b68e0a8562 Turn logic / Cross-sector production / Pad tweaks 2020-05-15 11:03:21 -04:00
GioIacca9
898c07c4af Minor changes 2020-05-15 16:21:39 +02:00
Anuken
603cb4295a Tweaks 2020-05-15 00:11:50 -04:00
Anuken
931882fb6a arc 2020-05-14 23:23:36 -04:00
Anuken
b84ec4ff8e Merge remote-tracking branch 'origin/master' 2020-05-14 23:16:34 -04:00
Anuken
434a754c9a Better pad animations / Balancing 2020-05-14 23:16:26 -04:00
sk7725
8c501fa10b [KO] Small Revert (#2059)
Readd translator credits(Kieaer said he removed it temporarily, and also https://discord.com/channels/391020510269669376/395414970793459714/710497552071655484)
2020-05-14 22:00:24 -04:00
Anuken
a4987f864f Refactoring / Launch pad tweaks 2020-05-14 22:00:04 -04:00
Anuken
3fd677b3e6 Merge remote-tracking branch 'origin/master' 2020-05-14 17:40:57 -04:00
Anuken
6d23963e98 Entity IO fixes 2020-05-14 17:40:49 -04:00
Anuken
759068b82a Update bug_report.md 2020-05-14 17:36:53 -04:00
Anuken
12f4d5a9a4 Save on exit 2020-05-14 15:18:04 -04:00
Anuken
d54d8a25af Added shield effects 2020-05-14 12:07:33 -04:00
Olexandr Nesterenko
b99dba808e Merge branch 'master' into patch-2 2020-05-14 08:54:42 +03:00
Olexandr Nesterenko
89f3511082 Update bundle_uk_UA.properties 2020-05-14 08:53:13 +03:00
Anuken
a06f6f0b2d Refactoring 2020-05-13 22:29:27 -04:00
Anuken
6e62936458 Refactoring 2020-05-13 18:11:28 -04:00
Anuken
e64122bbbb Moved MessageBlock
it *technically* stores text
2020-05-13 17:07:47 -04:00
Anuken
8abe6c4270 Merge remote-tracking branch 'origin/master' 2020-05-13 17:05:10 -04:00
Anuken
04dc701c25 Various campaign-related tweaks 2020-05-13 17:04:59 -04:00
zethnest
2dfa334ba6 Lowercases ColorNames (#2053)
* lowercase colornames

* change yellow to accent
2020-05-13 14:38:26 -04:00
ian
b758b69243 Partially add to and fix swedish translations (#2052) 2020-05-13 14:37:05 -04:00
Anuken
c432639dfa Bugfixes 2020-05-12 21:41:45 -04:00
Anuken
ab49825d35 Merge remote-tracking branch 'origin/master' 2020-05-12 21:34:40 -04:00
Anuken
6a22d45320 Prototype unit cap mechanic 2020-05-12 21:34:27 -04:00
Summet
fea5142955 Replaced all upper-case colors to lower-case (#2044) 2020-05-12 20:03:35 -04:00
Alberto Galera
4910afbc82 Fix translation typo (#2045)
* Fix translation typo

* typo
2020-05-12 20:03:23 -04:00
Anuken
2990013b8e Updated Gradle 2020-05-12 12:49:26 -04:00
Anuken
c3524794c6 Arc 2020-05-12 12:32:53 -04:00
Anuken
fe9df51721 Upgraded to 'implementation' / 'api' 2020-05-12 12:31:09 -04:00
Anuken
0663d8067a Merge remote-tracking branch 'origin/master' 2020-05-12 09:41:12 -04:00
Anuken
27ffefa0cd Added sprites 2020-05-12 09:41:07 -04:00
zethnest
3c4c046e1f align opacity check with ItemBridge (#2036)
* align opacity check with ItemBridge

* align opacity check with ItemBridge
2020-05-12 09:38:27 -04:00
Anuken
f6d8658ee2 Fixed #2040 / Fixed #2039 / Fixed #2038 / Fixed #2037 / Fixed #2035 2020-05-12 09:34:26 -04:00
Anuken
7f3f1d7d76 Merge remote-tracking branch 'origin/master' 2020-05-11 23:40:34 -04:00
Anuken
43642ff546 Bugfixes / Cleanup 2020-05-11 23:40:23 -04:00
sk7725
911424b2e2 Changed [lighthray] to [lightgray] (#2033)
If somehow the color [lighthray] will be added, ignore this pull request!
2020-05-11 21:23:50 -04:00
Anuken
8e50228df2 Merge remote-tracking branch 'origin/master' 2020-05-11 13:20:38 -04:00
Anuken
9cca79adaa Fixed #2032 2020-05-11 13:20:27 -04:00
Lapis
130eee35ec Update bundle_ja.properties (#2029)
* update bundle_ja.properties

* update bundle_ja.properties

* update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* removed experimental tag

* Small fix

* fix typo

* bundle_ja.properties

* Small fix

* Small fix
2020-05-11 10:46:34 -04:00
Olexandr Nesterenko
37c92302f0 Fix build (#2030) 2020-05-11 09:16:43 -04:00
Olexandr Nesterenko
709d3751d1 Update bundle_uk_UA.properties 2020-05-11 12:20:46 +03:00
Olexandr Nesterenko
4545033f12 Update bundle_uk_UA.properties 2020-05-11 11:20:48 +03:00
Anuken
03d0849538 Merge remote-tracking branch 'origin/master' 2020-05-11 00:41:39 -04:00
Anuken
3ea2360290 Removal of unused assets/classes 2020-05-11 00:41:35 -04:00
TheMainOne
a5b235d829 Fixed "Restart required" (#2025) 2020-05-10 22:56:24 -04:00
Lapis
1514f9f7ec Update bundle_ja.properties (#2026)
* update bundle_ja.properties

* update bundle_ja.properties

* update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* removed experimental tag

* Small fix

* fix typo

* bundle_ja.properties
2020-05-10 22:48:14 -04:00
Summet
289c653574 Gradle shortcut (#2027) 2020-05-10 21:35:25 -04:00
Anuken
a344c1a5d0 Better sun 2020-05-10 19:17:08 -04:00
Anuken
686c451ea6 Minor tweaks 2020-05-10 17:22:13 -04:00
Anuken
c0ea4737fd Merge remote-tracking branch 'origin/master' 2020-05-10 13:58:08 -04:00
Anuken
c7d2be5a7f Selection tweaks 2020-05-10 13:58:04 -04:00
Alex Wilson
b09517066f Added Australian Servers (#2005)
https://kbni.net.au/posts/2020/05/04/australian-mindustry-servers/
2020-05-10 13:37:13 -04:00
Anuken
07701f8c01 Merge remote-tracking branch 'origin/master' 2020-05-10 13:34:57 -04:00
Anuken
2cb9cfb097 Cleanup 2020-05-10 13:34:52 -04:00
DLJ-345
11d2ed06cd Update bundle_fi.properties (#2020) 2020-05-10 12:27:44 -04:00
Summet
c62a87e81a Deleting a block in the editor by right-clicking (#2021)
* Deleting a block in the editor by right-clicking

* Small fix

Co-authored-by: Anuken <arnukren@gmail.com>

Co-authored-by: Anuken <arnukren@gmail.com>
2020-05-10 10:44:54 -04:00
Anuken
dabc891791 Cleanup 2020-05-10 10:37:36 -04:00
Anuken
0adc2811bb Bugfixes 2020-05-10 09:14:13 -04:00
Anuken
d6412bf19c Static cleanup 2020-05-09 22:25:19 -04:00
Anuken
fce89d4db5 Fixed #2015 2020-05-09 22:24:13 -04:00
Anuken
1fdd9dd124 Merge remote-tracking branch 'origin/master' 2020-05-09 16:29:07 -04:00
Anuken
f0d2f7b728 "grabage struct" 2020-05-09 16:29:01 -04:00
Lapis
53d60e9cf6 Update bundle_ja.properties (#2013)
* update bundle_ja.properties

* update bundle_ja.properties

* update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* removed experimental tag

* Small fix

* fix typo
2020-05-09 10:21:34 -04:00
Anuken
bc658f9f45 Synced weather 2020-05-08 21:55:40 -04:00
Anuken
95a1d84eb9 Support for weather in rules / Sector weather 2020-05-08 21:51:17 -04:00
Anuken
d7eb365446 Merge remote-tracking branch 'origin/master' 2020-05-08 20:22:16 -04:00
Anuken
8d5cd7b814 Serialization that makes more sense 2020-05-08 20:22:11 -04:00
valtsu41
dcaf0dded5 Better zone naming in finnish (#2008) 2020-05-08 18:28:20 -04:00
cinnx
21e446e6f0 Update bundle_pl.properties (#2010)
updated, fixed and translated some phrases.
thanks @Kubek0212 for reporting old description of power nodes ❤
2020-05-08 16:43:11 -04:00
Anuken
aab97fefc8 Fixed puddles not appearing / Overdrive tweaks
- Bridges, routers and junctions can (probably) be overdrived now, untested
2020-05-08 16:41:59 -04:00
Anuken
bcec6261d1 Added rain, better snow implementation 2020-05-08 16:13:49 -04:00
Anuken
cda3c3743b Merge remote-tracking branch 'origin/master' 2020-05-08 09:30:48 -04:00
Anuken
4f3cf9466e Less water 2020-05-08 09:30:40 -04:00
laohuaji233
e5e325b25b Update bundle_zh_CN.properties (#2007) 2020-05-08 09:20:44 -04:00
MEEP of Faith
739ce75154 Customizable Fragging Angle (#2006)
* Customizable Fragging Angle

* I did it wrong.

* Undo that last change.

* Anuke told me to make it just forwards

* Thanks Anuke

My inexperience is very evident.
2020-05-07 21:53:00 -04:00
Anuken
d94427b4ee Updated version info 2020-05-07 21:46:26 -04:00
Anuken
639738754a Removed startup dialog 2020-05-07 21:40:18 -04:00
Anuken
372b1311f7 Merge remote-tracking branch 'origin/master' 2020-05-07 21:37:54 -04:00
Anuken
2b9d618bd2 Implemented various suggestions
- Pathfinding weighs walls more
- C disables all HUD
- Unloader doesn't store items
- Some bugfixes
2020-05-07 21:37:41 -04:00
Lapis
1fd22f6d10 Small fix bundle_ja.properties (#1992)
* update bundle_ja.properties

* update bundle_ja.properties

* update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* removed experimental tag

* Small fix
2020-05-07 20:17:29 -04:00
TheSlaylord
a0c747407f Update bundle_ru.properties (#2004)
Removed experimental tag
2020-05-07 20:17:21 -04:00
Anuken
2ca7f553bb Native fixes 2020-05-07 16:55:45 -04:00
Anuken
128c3625e2 fixed incorrect property 2020-05-07 14:35:24 -04:00
Anuken
d51a8611c3 Better exception output 2020-05-07 14:33:01 -04:00
Anuken
047652154e Cleanup 2020-05-07 14:08:27 -04:00
Anuken
542555d721 Merge remote-tracking branch 'origin/master' 2020-05-07 14:05:31 -04:00
Anuken
6ea8a0f583 cleanup 2020-05-07 14:04:58 -04:00
Anuken
561e94617c Better screen res support 2020-05-07 14:04:22 -04:00
Anuken
5aa2860fa4 Mobile support 2020-05-07 12:51:52 -04:00
Patrick 'Quezler' Mounier
018ef5daf4 Change baseunit pred variable from b to u (#2002) 2020-05-07 11:28:42 -04:00
Patrick 'Quezler' Mounier
8a48a8bf3d Fix only the output of the last chat filter mattering (#1997) 2020-05-07 09:41:16 -04:00
Anuken
5aec051d9b progress 2020-05-06 19:07:37 -04:00
Anuken
8b5adca750 Early prototype loading screen 2020-05-05 23:01:12 -04:00
AydenRennaker
98f012feb8 Update servers.json (#1989)
* Update servers.json

* added a record to server name.

Server has moderation, logging of user actions with /history, custom maps. Ready for players.
2020-05-05 14:46:53 -04:00
Anuken
346ac88009 Merge remote-tracking branch 'origin/master' 2020-05-05 14:28:51 -04:00
Anuken
07074046e6 Cleanup 2020-05-05 14:28:37 -04:00
LFlicker
735187e78a Update bundle_ko.properties (#1986)
* Update bundle_ko.properties

Typo correction

* Update bundle_ko.properties

* Update bundle_ko.properties

Typo Correction
2020-05-05 11:06:32 -04:00
Anuken
4161698bb8 Removed quote requirement for events 2020-05-04 18:05:47 -04:00
Anuken
a4bd1dcc6d Mod event support 2020-05-04 17:57:08 -04:00
Anuken
8876c673f7 Bullet fix 2020-05-04 17:06:53 -04:00
Anuken
40bb0ddf39 Cleanup / Updated arc 2020-05-04 12:08:02 -04:00
Anuken
25178d0531 Merge remote-tracking branch 'origin/master' 2020-05-04 10:58:04 -04:00
Anuken
ea2adbd63b Editor fixes 2020-05-04 10:57:57 -04:00
Patrick 'Quezler' Mounier
f10bdbf775 Swap bottom & top liquid block regions (#1982) 2020-05-04 10:07:29 -04:00
Patrick 'Quezler' Mounier
19649104a7 Fix pump ohno liquid texture (#1979) 2020-05-04 10:04:18 -04:00
Patrick 'Quezler' Mounier
8280d11054 Move pump fluid sprite from production to liquid (#1980) 2020-05-04 10:04:00 -04:00
Patrick 'Quezler' Mounier
440226fecc Scale stack conveyor edge regions for requests (#1981) 2020-05-04 10:03:50 -04:00
Koteyka_by
c920902481 Update bundle_be.properties (#1977)
Fix a errors in a translate
2020-05-04 09:09:58 -04:00
Anuken
90505a8e19 Fixed #1978 2020-05-04 09:09:40 -04:00
Anuken
23cb249c19 Possible scroll fix 2020-05-04 08:59:56 -04:00
Anuken
07a4b64b8a Removed unnecessary functional methods / Script cleanup 2020-05-04 00:01:45 -04:00
Anuken
834c15a808 client/server separation 2020-05-03 21:45:46 -04:00
Anuken
bdb1e29c85 Mod packet support 2020-05-03 21:28:51 -04:00
Anuken
becc23ca42 Cleaner formatting 2020-05-03 21:18:25 -04:00
Anuken
45d8188ba4 Fixed tests not compiling 2020-05-03 18:30:18 -04:00
Anuken
bd4f3c039c Merge remote-tracking branch 'origin/master' 2020-05-03 18:14:25 -04:00
Anuken
b399ed1ed6 cleanup 2020-05-03 18:01:56 -04:00
xetrov05
c83ae5d34c Translation to ZH_TW (#1974) 2020-05-03 17:50:57 -04:00
Anuken
ea753f2f83 cleanup 2020-05-03 17:49:21 -04:00
Anuken
85503a7a95 Fixed item bridges 2020-05-03 12:56:14 -04:00
Anuken
80a13237f4 Merge remote-tracking branch 'origin/master' 2020-05-03 12:08:15 -04:00
Anuken
f188fbb567 Config previews 2020-05-03 12:08:11 -04:00
Summet
63d2d32fd8 Update bundle_ru.properties (#1972) 2020-05-03 11:45:41 -04:00
Anuken
de77d80dab Save config when picking blocks 2020-05-03 11:35:58 -04:00
Anuken
5c00ced1e3 Better API for saving block configs 2020-05-03 11:32:46 -04:00
Anuken
8eeb668945 Merge remote-tracking branch 'origin/master' 2020-05-03 10:06:51 -04:00
Anuken
53e7c03730 Enabled flow rates by default 2020-05-03 10:06:47 -04:00
zethnest
9af3cf7a13 double-click disconnect mass driver (#1970) 2020-05-03 09:48:07 -04:00
Anuken
50e8586dc2 cleanup 2020-05-03 00:49:34 -04:00
Anuken
dd68241d1f Bugfixes 2020-05-02 23:15:36 -04:00
Anuken
cb6920b8be Commander unit component 2020-05-02 21:34:37 -04:00
Anuken
dce8b8faa1 Cleanup / Functioning formation 2020-05-02 17:58:12 -04:00
Anuken
3e87fff9db Cleanup 2020-05-02 14:54:01 -04:00
Anuken
b9aa8edf78 Added steering AI classes 2020-05-02 14:13:47 -04:00
Anuken
25f07e7bcb Docs 2020-05-02 12:58:54 -04:00
Anuken
fed4d10ec6 Cleanup 2020-05-02 12:30:29 -04:00
Anuken
fd62125862 Implementation of new region system 2020-05-02 12:28:50 -04:00
Anuken
069d572a97 New region loading system for blocks 2020-05-02 11:47:27 -04:00
Anuken
f9129170a1 Merge remote-tracking branch 'origin/master' 2020-05-02 10:53:52 -04:00
Anuken
342523a7de Fixed #1959 / Indication of selected units 2020-05-02 10:53:48 -04:00
Patrick 'Quezler' Mounier
969eb4c57f Add missing super load call to StackConveyor (#1964) 2020-05-02 10:13:12 -04:00
Ali-C-Ila
e7c3c3f199 Update bundle_zh_TW.properties (#1965)
* Update bundle_zh_TW.properties

* Update bundle_zh_TW.properties

* Update bundle_zh_TW.properties

* Update bundle_zh_TW.properties

* Update bundle_zh_TW.properties
2020-05-02 10:13:01 -04:00
Anuken
5f27261cb1 Cleanup of cleanup 2020-05-02 00:52:12 -04:00
Anuken
b9d16d9fd9 Merge remote-tracking branch 'origin/master' 2020-05-02 00:51:49 -04:00
Anuken
ef42f022c7 Cleanup 2020-05-02 00:51:42 -04:00
Lapis
33d9501dd2 Update bundle_ja.properties (#1963)
* update bundle_ja.properties

* update bundle_ja.properties

* update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* removed experimental tag
2020-05-01 23:55:22 -04:00
Anuken
c16c64b049 Trail experiment 2020-05-01 21:15:34 -04:00
Anuken
cc04537355 Merge remote-tracking branch 'origin/master' 2020-05-01 20:38:46 -04:00
Anuken
39f6bc30b7 Unit factory tweaks / AI fixes 2020-05-01 20:38:12 -04:00
MEEP of Faith
9e9776971f I was told I made a mistake (#1962) 2020-05-01 20:32:16 -04:00
키에르
85eb62110d Add kr server (#1951) 2020-05-01 18:29:57 -04:00
MEEP of Faith
9def4eaba4 Unjank Plated Conduit Background Transparency (#1961)
The background transparent part was for some reason 3-6 different colors. Invisible, but still there.
2020-05-01 18:09:39 -04:00
MEEP of Faith
941d2d0f39 Support custom bottom color (#1960)
Should work similarly to flameColor on the GenericSmelter.
2020-05-01 18:08:49 -04:00
Anuken
35bd6a40c5 Better unit factory implementation 2020-05-01 18:07:37 -04:00
Anuken
676ee8beda Merge remote-tracking branch 'origin/master' 2020-05-01 16:49:10 -04:00
Anuken
df63ce411d Cleanup / Removed collision process 2020-05-01 16:48:36 -04:00
Anuken
41754fc100 Minor optimization 2020-05-01 16:46:38 -04:00
Anuken
135b87fdb2 Cleanup, optimization 2020-05-01 16:35:18 -04:00
Anuken
3101fc8056 a performance disaster, part 2 2020-05-01 14:49:58 -04:00
Anuken
64bacea3c7 a performance disaster, part 1 2020-05-01 14:36:33 -04:00
zethnest
1608bfd038 Clear Selection with Double Click (#1958)
* add onConfigureTileTapped method

* code cleanup

* Update ItemSource.java

Co-authored-by: Anuken <arnukren@gmail.com>
2020-05-01 12:30:07 -04:00
키에르
211be67e0e Update bundle_ko.properties (#1948) 2020-05-01 12:24:01 -04:00
Anuken
cdc8d2bfe4 Removed experimental tag 2020-05-01 11:31:25 -04:00
Anuken
c1e1e3c25b Merge remote-tracking branch 'origin/master' 2020-05-01 11:23:44 -04:00
Anuken
e75d1a51a6 More accurate resource display / Server fix 2020-05-01 11:23:36 -04:00
Patrick 'Quezler' Mounier
c0e149f5f3 Finetune itemsmoved stat on stack conveyors (#1954) 2020-05-01 10:17:14 -04:00
DarkenWizMan
f8a24bc3a1 fixed more misspells, added new words (#1956)
unit factory and drone changed to lithuanian counterparts
2020-05-01 10:06:16 -04:00
Anuken
d99946df77 Fixed daggers not shooting 2020-04-30 23:54:04 -04:00
Anuken
07835bb76d arc 2020-04-30 23:16:20 -04:00
Anuken
52a3e17ec5 Natives 2020-04-30 22:56:43 -04:00
Anuken
ea1e137a00 Server physics 2020-04-30 22:10:59 -04:00
Anuken
3b340f7164 Better physics 2020-04-30 22:09:42 -04:00
Anuken
273f4590df Physics 2020-04-30 21:58:48 -04:00
Anuken
8de0ca7d6e Async logic framework, box2D dependencies 2020-04-30 20:03:11 -04:00
Anuken
626a06ca00 Bugfixes / Better titan sprite 2020-04-30 18:21:50 -04:00
Anuken
c5859eb03a Fixed #1947 2020-04-30 17:34:29 -04:00
Anuken
3397557737 Sprites 2020-04-30 16:04:43 -04:00
Patrick 'Quezler' Mounier
a226cd390c Cleanup stack conveyor code (#1946)
- removes now obsolete adhoc boosteffect listing
- clarrify comments a bit more
- monospace align some code
- retexture to avoid shadow conflict
2020-04-30 15:16:19 -04:00
Anuken
d50092e9a2 Merge remote-tracking branch 'origin/master' 2020-04-30 14:46:30 -04:00
Anuken
2dbb099d79 AI tweaks / Control tweaks / Plastanium conveyor tweaks / Unit factories 2020-04-30 14:46:22 -04:00
DarkenWizMan
864d6977ff fixed mispels, added new words (#1945)
Removed some capital letters, because in lithuanian names of things don't have capital letters in all words, only first word (unless each word gets it's own row). I was too unsure if I should change machine name capital letters.
Also changed uncorrectly used words.
Added new words.
NOTE: I haven't looked through all stuff, so, I may have missed something.
2020-04-30 12:34:02 -04:00
Anuken
5887169f90 Cleanup 2020-04-29 19:54:20 -04:00
Anuken
289e8bb394 iOS backend refactoring 2020-04-29 18:44:09 -04:00
Anuken
f4604f2207 Cleanup 2020-04-29 18:36:20 -04:00
Anuken
6b55b64775 arc 2020-04-29 18:32:33 -04:00
Anuken
ec5c060574 Merge remote-tracking branch 'origin/master' 2020-04-29 18:29:27 -04:00
Anuken
b66c1c2649 Many buildscript changes 2020-04-29 18:29:19 -04:00
Ali-C-Ila
d3c9689fff Update bundle_zh_TW.properties (#1940) 2020-04-29 10:21:50 -04:00
bluet-it
7bffc66b3d added incomplete hungarian translation 2020-04-29 15:58:35 +02:00
Anuken
414b538e6b Merge remote-tracking branch 'origin/master' 2020-04-28 19:34:03 -04:00
Anuken
2ee99b3290 Cleanup 2020-04-28 19:33:59 -04:00
TheSlaylord
ae472fb03d Update bundle_ru.properties (#1931)
* Update bundle_ru.properties

* Update bundle_ru.properties

* Update bundle_ru.properties

* Update bundle_ru.properties
2020-04-28 15:05:41 -04:00
Kittiskov
58cbfa599a Update(Not complete yet) (#1381)
I didn't update all these yet, because I have to sleep (yawn).

Co-authored-by: Anuken <arnukren@gmail.com>
2020-04-28 14:16:40 -04:00
Anuken
d4163f2d1c Merge remote-tracking branch 'origin/master' 2020-04-28 13:15:45 -04:00
Anuken
3ccf2ecc24 Projector visualization 2020-04-28 13:15:40 -04:00
Daan Breur
40ea1c865d [LANG] NL Some Small Changes (#1546) 2020-04-28 12:32:09 -04:00
Lapis
1836cf9582 Update bundle_ja.properties (#1930)
* update bundle_ja.properties

* update bundle_ja.properties

* update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties

* Update bundle_ja.properties
2020-04-28 12:27:07 -04:00
GioIacca9
eef4137a59 Updated bundle_it to dfcf11f (#1929) 2020-04-28 12:27:00 -04:00
Prosta4okua
ab0cb0c019 Ukrainian translation (#1924)
* Update bundle_ru.properties

* Felix alive (phantom description)

* RU bundle Phantom description fix

* 2 lines changed

wave.enemies
wave.enemy

* 6 lines changed

editor.overwrite.confirm
confirmban
confirmkick
confirmvotekick
confirmadmin
confirmunadmin

* 5 lines changed (fixed)

confirmban
confirmkick
confirmvotekick
confirmadmin
confirmunadmin

* 5 lines changed (yet again)

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties

* Стан з гілки master взято

* Оновлено на 26.04.2020

* Update bundle_ru.properties

* Update bundle_uk_UA.properties

Co-authored-by: Felix Corvus <remint32@yandex.ru>
Co-authored-by: Vanguard <55051135+XEN0PHIL@users.noreply.github.com>
2020-04-28 12:26:52 -04:00
sk7725
14de9d7f5f 6.0 unit and block Korean Translation #1 (#1936) 2020-04-28 12:25:31 -04:00
Wina
621fa7862c Updated Spanish Bundle (#1937)
* Minor fixes

* Added Plastanium Conveyor Translation
2020-04-28 12:25:11 -04:00
Anuken
2504fd536b Autopack sprites when running 2020-04-27 17:35:10 -04:00
Anuken
a4d49f5d17 Automatic assignment of entities 2020-04-27 01:31:41 -04:00
Anuken
2f3c098b50 Unit status cleanup 2020-04-26 23:24:05 -04:00
Anuken
f6bf229b0a Cleanup 2020-04-26 21:59:49 -04:00
Prosta4okua
3fd5f3f986 Merge pull request #15 from Prosta4okua/revert-14-master
Revert "Update bundle_ru.properties"
2020-04-27 00:50:31 +03:00
Prosta4okua
f905245b71 Revert "Update bundle_ru.properties" 2020-04-27 00:50:15 +03:00
Prosta4okua
a6acd1bed2 Merge pull request #14 from Summet-V/master
Rename "Целостность" to "Здоровье"
2020-04-27 00:43:18 +03:00
Summet
8860dab37a Update bundle_ru.properties
Rename "Целостность" to "Здоровье"
2020-04-26 21:15:38 +03:00
Anuken
1941b0fa8a Merge remote-tracking branch 'origin/master' 2020-04-26 11:24:56 -04:00
Anuken
dfcf11fb07 Removed mech-related bundle entries 2020-04-26 11:24:52 -04:00
Patrick 'Quezler' Mounier
5fc8901e0b Fix plastanium conveyor icon generation (#1920) 2020-04-26 11:08:27 -04:00
Lapis
02fbc56137 Update bundle_ja.properties (#1917)
* update bundle_ja.properties

* update bundle_ja.properties

* update bundle_ja.properties

* Update bundle_ja.properties
2020-04-26 11:08:05 -04:00
Patrick 'Quezler' Mounier
0589290380 Prevent colored map author name from tainting gameover (#1922) 2020-04-26 10:59:27 -04:00
Anuken
fa62336096 Cleanup 2020-04-25 23:14:12 -04:00
Anuken
08f8323465 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	core/assets-raw/sprites/units/phantom-cell.png
2020-04-25 22:49:38 -04:00
Anuken
9b74b69950 Unit tweaks 2020-04-25 22:49:30 -04:00
MEEP of Faith
46762ab0e1 New power cells for everything (#1915)
* Ground Unit Power Cells

* Flying Unit Cells

* Player/Mech Cells
2020-04-25 22:48:58 -04:00
Anuken
8b7d75c5ba Unit tweaks 2020-04-25 22:48:25 -04:00
MEEP of Faith
c7c638caa6 Copy code from UnitType.java (#1916)
Support custom bottom region without scripting.
2020-04-25 21:10:36 -04:00
Anuken
c875bb3f55 Merge remote-tracking branch 'origin/master' 2020-04-25 17:34:39 -04:00
Anuken
ceee1d36e6 Bugfixes 2020-04-25 17:34:35 -04:00
Gdeft
9260cdee95 Update in bundle_in_ID.properties (#1913)
Translated few words to Bahasa and revised some of them too so they sound more standard.
2020-04-25 13:38:06 -04:00
Lapis
d97d971cf6 Update bundle_ja.properties (#1908)
* update bundle_ja.properties

* update bundle_ja.properties

* update bundle_ja.properties
2020-04-25 13:38:00 -04:00
Patrick 'Quezler' Mounier
efc1d9040b Add nydus 6.0 server entry (#1909) 2020-04-25 12:53:58 -04:00
Anuken
30d8737f67 Bugfixes 2020-04-25 12:49:19 -04:00
Anuken
9e0af97cee Merge remote-tracking branch 'origin/master' 2020-04-25 12:30:22 -04:00
Anuken
838e12cc0a stop 2020-04-25 12:30:18 -04:00
sk7725
02394973b0 Fix inconsistencies in Korean Translation (#1912)
For block, the national institute of korean language(https://www.korean.go.kr/front/onlineQna/onlineQnaView.do?mn_id=216&qna_seq=81761) specifies that the correct translation is 블록, not 블럭. Both translations, despite 블럭 being the wrong translation, are being used. All 블럭 have been changed to 블록.
2020-04-25 12:24:56 -04:00
Patrick 'Quezler' Mounier
14c9050103 Remove power usage from phase bridge endpoints (#1910) 2020-04-25 10:32:00 -04:00
Anuken
81af481d3a Removed sleep 2020-04-25 10:12:37 -04:00
Anuken
2e2c8ceab4 Bugfixes 2020-04-25 00:04:14 -04:00
Anuken
09e08a474b Plastanium conveyor + bugfixes 2020-04-24 20:17:24 -04:00
Anuken
21946cafd1 Merge branch 'crater' of https://github.com/Quezler/Mindustry into Quezler-crater 2020-04-24 15:46:32 -04:00
Anuken
32a182cd01 Unit parsing cleanup 2020-04-24 15:45:57 -04:00
Anuken
6041e238a6 Bugfixes 2020-04-24 12:01:08 -04:00
Anuken
5d4ca753a7 Light cleanup 2020-04-24 11:08:02 -04:00
Anuken
1b2e10d355 Cleanup, re-implementations 2020-04-24 11:01:17 -04:00
Anuken
018fe5dea2 Added lights for laser turret projectiles 2020-04-24 09:50:40 -04:00
Anuken
eeb88df5f6 Bugfixes 2020-04-23 17:45:12 -04:00
Patrick 'Quezler' Mounier
cf186e0219 Merge branch 'master' into crater
# Conflicts:
#	core/assets/sprites/sprites2.png
2020-04-23 21:15:11 +02:00
Patrick 'Quezler' Mounier
39266d23c8 Merge branch 'master' into crater
# Conflicts:
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/sprites/sprites2.png
#	core/assets/sprites/sprites3.png
2020-04-23 21:10:48 +02:00
Anuken
cafd076f9c Fixed water animation conflict 2020-04-23 15:08:32 -04:00
Anuken
87ed405916 Bugfixes 2020-04-23 14:50:30 -04:00
Anuken
7091cad704 Merge branches '6.0' and 'master' of https://github.com/Anuken/Mindustry into 6.0 2020-04-23 14:05:09 -04:00
Anuken
b68b3a1837 Layer tweaks 2020-04-23 14:04:31 -04:00
Anuken
2aa05f989b Merged in sprite sorting 2020-04-23 14:00:55 -04:00
Anuken
cec5c24d69 progress 2020-04-23 13:58:06 -04:00
Anuken
c738dcb42e progress 2020-04-23 12:52:16 -04:00
Anuken
1bf5b19889 progress 2020-04-23 12:35:49 -04:00
laohuaji233
37240478b8 Update bundle_zh_CN.properties (#1900)
* Update bundle_zh_CN.properties

* Update bundle_zh_CN.properties
2020-04-23 11:08:33 -04:00
Rayfulrand
9e8dae8cd6 Update summary (#1901)
more accurate translation of Tower Defence genre
2020-04-23 11:07:06 -04:00
Anuken
c6e4bf1fa4 progress 2020-04-23 11:06:58 -04:00
Anuken
71e8c088a6 progress 2020-04-23 11:01:14 -04:00
Anuken
989ee895e8 Functional sorting 2020-04-23 10:25:46 -04:00
Anuken
2538273402 progress 2020-04-23 00:41:18 -04:00
Anuken
18b68fefed how did this compile 2020-04-23 00:16:41 -04:00
Anuken
362846bd68 progress 2020-04-23 00:03:03 -04:00
Anuken
6cf422eebf progress 2020-04-22 17:23:30 -04:00
Álvaro Manzanas
cf69fa1d7c Update bundle_es.properties (#1899)
* Update bundle_es.properties

* Update bundle_es.properties
2020-04-22 16:20:07 -04:00
Anuken
fc4f8619f8 progress (purge) 2020-04-22 16:17:43 -04:00
Anuken
c5f93139bd progress 2020-04-22 16:06:26 -04:00
Anuken
9beb23b0e4 progress 2020-04-22 15:19:39 -04:00
Anuken
d154361e75 Merge branch '6.0' of https://github.com/Anuken/Mindustry into sprite-sorting 2020-04-22 14:34:34 -04:00
Anuken
67d87f023b Cleanup 2020-04-22 14:22:33 -04:00
Anuken
da7c393096 progress 2020-04-22 12:47:29 -04:00
Anuken
b3f936acb8 Fixed tests not compiling 2020-04-22 11:18:19 -04:00
Anuken
2ca62831e3 Revert "Cleaned up tests" (wrong branch) 2020-04-22 11:17:47 -04:00
Anuken
cb601b729e Merge remote-tracking branch 'origin/master' 2020-04-22 10:48:54 -04:00
Anuken
cc4e9c5ba1 Cleaned up tests 2020-04-22 10:48:50 -04:00
Anuken
a592144291 Catching of schematic preview errors / Fixes #1886 2020-04-22 09:49:04 -04:00
Kaio Duarte Costa
390b5e3b60 Update bundle_pt_BR.properties (#1881) 2020-04-21 11:03:25 -04:00
sk7725
05cfe7a80a Fixed inconsistencies with the word 'schematic' (#1892)
설계도 and 회로도 are both schematic.
2020-04-21 11:03:09 -04:00
Anuken
58e9e0c0de Merged #1882 with some tweaks 2020-04-21 11:02:44 -04:00
Patrick 'Quezler' Mounier
561198f517 Fix issue with uneven dumping 2020-04-18 13:39:12 +02:00
Patrick 'Quezler' Mounier
16a1483f55 Require 4 loading docks to saturate a belt
Which encourages using them right from the factory, instead of simply connecting it up to a full titanium belt.
2020-04-18 13:28:32 +02:00
Anuken
eeb8d5ef9c Renamed key fields and table methods 2020-04-17 11:26:59 -04:00
Anuken
c5c63c24d5 Update bug_report.md 2020-04-16 17:00:07 -04:00
Patrick 'Quezler' Mounier
32e32ecae2 Merge branch '6.0' into crater
# Conflicts:
#	core/assets/icons/icons.properties
#	core/assets/sprites/block_colors.png
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/sprites/sprites2.png
#	core/assets/sprites/sprites4.png
#	core/assets/sprites/sprites6.png
2020-04-16 22:38:51 +02:00
Anuken
280f3dd428 Added experimental package 2020-04-16 16:31:43 -04:00
Patrick 'Quezler' Mounier
1acc6461e6 Grow the circle slightly inward 2020-04-16 22:05:55 +02:00
Patrick 'Quezler' Mounier
9864383300 Revert 〃 2020-04-16 21:15:49 +02:00
Patrick 'Quezler' Mounier
41eb51a340 Experiment with visible ports 2020-04-16 21:11:59 +02:00
Felix Corvus
07ae854dec A:b:uke fixes
see: https://github.com/Anuken/Mindustry/pull/1877#issuecomment-614645700
2020-04-16 22:02:40 +03:00
Patrick 'Quezler' Mounier
da99286826 Remove obsolete valid check 2020-04-16 20:33:52 +02:00
Patrick 'Quezler' Mounier
79a095faa8 Merge branch '6.0' into crater 2020-04-16 20:30:13 +02:00
Anuken
2f3a842f2e isValid() workaround 2020-04-16 14:26:09 -04:00
Patrick 'Quezler' Mounier
a05f4338c5 Waspify the crater 🐝 2020-04-16 20:24:07 +02:00
Anuken
2693f9c176 Implemented some PR features 2020-04-16 13:46:45 -04:00
Corby
15750b5eb0 Korean localization fixes and changes. (#1874) 2020-04-16 13:33:38 -04:00
Patrick 'Quezler' Mounier
361a540ed3 Merge branch '6.0' into crater 2020-04-16 19:10:10 +02:00
Patrick 'Quezler' Mounier
a83546bc9d Call bumps & upstreams from the objects themselves 2020-04-16 19:01:27 +02:00
Patrick 'Quezler' Mounier
e66a1a92c3 Phase out the need for isSleeping
Thanks to knowledge gained from the previous commit.
2020-04-16 18:56:00 +02:00
Patrick 'Quezler' Mounier
b599bafd5e Override isvalid for sleeping craters 2020-04-16 18:48:38 +02:00
Patrick 'Quezler' Mounier
589d4c92d1 Scale crater from 16x16 to 20x20 2020-04-16 18:39:24 +02:00
Patrick 'Quezler' Mounier
b9b8a4a2f7 Move update function up
It felt wrong to put it down below.
2020-04-16 18:17:00 +02:00
Patrick 'Quezler' Mounier
7df44ec060 Implement anuke’s size calculation 2020-04-16 18:12:51 +02:00
Patrick 'Quezler' Mounier
83511368f6 Stash shadow draft 2020-04-16 17:44:43 +02:00
Anuken
c6bbdfdc9b Fixed compilation 2020-04-16 11:35:35 -04:00
Anuken
713dbccf74 Bugfixes 2020-04-16 11:30:42 -04:00
Patrick 'Quezler' Mounier
a1d4804fae Merge branch '6.0' into crater
# Conflicts:
#	core/assets/sprites/block_colors.png
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/sprites/sprites2.png
#	core/assets/sprites/sprites4.png
#	core/assets/sprites/sprites6.png
#	core/src/mindustry/ui/fragments/PlayerListFragment.java
2020-04-16 17:13:18 +02:00
Anuken
a8f4df8030 Merge branches '6.0' and 'master' of https://github.com/Anuken/Mindustry into 6.0
# Conflicts:
#	core/src/mindustry/ui/fragments/PlayerListFragment.java
2020-04-16 10:14:13 -04:00
Anuken
256f805754 Payload fixes 2020-04-16 09:55:57 -04:00
Anuken
ea0358d570 Merge remote-tracking branch 'origin/6.0' into 6.0 2020-04-16 09:44:36 -04:00
Anuken
42f227195c Better payload framework 2020-04-16 09:44:31 -04:00
Ali-C-Ila
7d6e8fdcd1 Update bundle_zh_TW.properties (#1876)
* Update bundle_zh_TW.properties

* Update bundle_zh_TW.properties
2020-04-16 09:14:36 -04:00
Patrick 'Quezler' Mounier
7254204ae5 [6.0] fix build requirement check for sandbox (#1873)
* Fix not being able to start building in 6.0 sandbox

* Make 〃 more logical
2020-04-16 09:11:23 -04:00
Vanguard
0cde4a9778 Merge branch 'master' into master 2020-04-16 15:44:04 +03:00
Vanguard
bfe701bd08 5 lines changed (yet again) 2020-04-16 15:17:35 +03:00
Vanguard
2a47c22607 5 lines changed (fixed)
confirmban
confirmkick
confirmvotekick
confirmadmin
confirmunadmin
2020-04-16 15:15:25 +03:00
Patrick 'Quezler' Mounier
5c28985ee6 Merge branch '6.0' into crater
# Conflicts:
#	core/assets/icons/icons.properties
#	core/assets/sprites/block_colors.png
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/sprites/sprites3.png
#	core/assets/sprites/sprites5.png
#	core/src/mindustry/content/Blocks.java
#	core/src/mindustry/ui/fragments/PlayerListFragment.java
#	core/src/mindustry/world/BlockStorage.java
2020-04-16 12:39:52 +02:00
Patrick 'Quezler' Mounier
424e58ff7d Merge branch 'master' into crater 2020-04-16 11:20:16 +02:00
Anuken
8a01b87c99 Cleanup 2020-04-15 23:12:18 -04:00
Anuken
79c8548171 Better conveyor animations 2020-04-15 19:05:18 -04:00
Anuken
a234949b8c Visual tweaks 2020-04-15 13:03:37 -04:00
Anuken
0eaf9bc9c6 Various prototypes 2020-04-15 12:44:53 -04:00
Prosta4okua
305632c002 Update bundle_uk_UA.properties (#1871) 2020-04-15 10:36:38 -04:00
Anuken
51226d6c88 Arc compat 2020-04-14 20:29:59 -04:00
clfer
73e53a7766 [WIP]Translate steam metadata in french (#771)
* Steam french translation

* Paulao17 feedback

* Steam french translation adjustments

Co-authored-by: clfer <clement.ferrier+github@gmail.com>
2020-04-14 13:59:55 -04:00
Vanguard
18e92f5abf RU updates (#1866)
* Update bundle_ru.properties

* Felix alive (phantom description)

* RU bundle Phantom description fix

* 2 lines changed

wave.enemies
wave.enemy

* 6 lines changed

editor.overwrite.confirm
confirmban
confirmkick
confirmvotekick
confirmadmin
confirmunadmin

Co-authored-by: Prosta4okua <31485341+Prosta4okua@users.noreply.github.com>
Co-authored-by: Felix Corvus <remint32@yandex.ru>
2020-04-14 10:04:29 -04:00
Miguel de Dios Matias
a10235d6b0 I18n es tiny fix (#1865)
* Update some translations into spanish.

* Need a white space between #wave_number and wave word (in spanish).

* Added translation for 'search'.

* Fix translate of 'bleeding edge' is https://www.urbandictionary.com/define.php?term=Bleeding%20edge . It is not a name.

* Fixed some spanish strings about schematic.

* Fixed some translations in spanish.
2020-04-14 10:04:13 -04:00
Olexandr Nesterenko
95d603a035 Separate the use of map name and player name (#1863)
* change use 'name'

* remove schematic.name
2020-04-14 10:04:05 -04:00
Vanguard
32199ac307 6 lines changed
editor.overwrite.confirm
confirmban
confirmkick
confirmvotekick
confirmadmin
confirmunadmin
2020-04-14 15:17:33 +03:00
GioIacca9
25bc6ebaf0 Minor changes (#1858) 2020-04-13 21:22:49 -04:00
Wina
9a0292268e Minor changes in bundle_es.properties (#1861)
Added some clarifications in the tutorial and corrected multiple spelling and grammar errors.
2020-04-13 21:21:20 -04:00
Lapis
91f9ce3098 update (#1862) 2020-04-13 21:21:10 -04:00
Anuken
c717084cb9 Cleanup 2020-04-13 18:07:00 -04:00
Anuken
2af12a632a Added basic multi-unit factories 2020-04-13 16:56:33 -04:00
Olexandr Nesterenko
474ddcf989 Update bundle_uk_UA.properties (#1811) 2020-04-12 18:06:09 -04:00
Anuken
d860977144 Disabled asset copying on non-iOS platforms 2020-04-12 17:53:19 -04:00
Fernando
8093f69b6a Update bundle_pt_BR.properties (#1839)
* Update bundle_pt_BR.properties

* Update bundle_pt_BR.properties

* Update bundle_pt_BR.properties

* Update bundle_pt_BR.properties
2020-04-12 17:43:51 -04:00
Anuken
a240c00ebf Set cleanup 2020-04-12 17:42:09 -04:00
Lapis
bc20967262 Update bundle_ja.properties (#1848)
* update

* update

* update
2020-04-12 13:36:01 -04:00
Blockzilla101
501253d13a added name of player to ban/kick/vote-kick/un-admin/admin confirmation dialog (#1846)
* added name of player to baning/kicking/vote-kicking/admining

* slight tweaks

* fixed redundant things
2020-04-12 10:52:05 -04:00
Anuken
603d8b16d0 Various tweaks 2020-04-12 10:26:18 -04:00
Patrick 'Quezler' Mounier
9e811be477 Name which map name has a conflict when importing (#1844) 2020-04-12 09:56:36 -04:00
MWestfall
e47dcd75ff Update servers.json (#1837)
Splitting Co-Op into attack and survival
2020-04-11 16:21:44 -04:00
Anuken
f163601262 Better unit control effects 2020-04-11 11:34:51 -04:00
Anuken
b1f32d241b Merge branches '6.0' and 'master' of https://github.com/Anuken/Mindustry into 6.0
# Conflicts:
#	core/assets/bundles/bundle_uk_UA.properties
#	core/src/mindustry/core/NetClient.java
#	core/src/mindustry/ui/fragments/PlayerListFragment.java
#	core/src/mindustry/world/blocks/power/ImpactReactor.java
#	gradle.properties
2020-04-11 10:37:52 -04:00
Anuken
3bb2b646db Networked unit control / Mimic AI prototype 2020-04-11 10:03:47 -04:00
Anuken
7dca6b2a30 Other tweaks 2020-04-10 19:17:40 -04:00
Anuken
758ace353e Laser turret behavior changes 2020-04-10 19:15:14 -04:00
Petr Gašparík
9c1730685c Czech translation - up to date (#1836) 2020-04-10 18:45:01 -04:00
Anuken
67a084a5e7 Cleanup 2020-04-10 13:49:36 -04:00
Anuken
2395bc9308 Bugfixes / Testing reaper sprite 2020-04-10 12:55:58 -04:00
Anuken
00f3353976 ... 2020-04-10 11:51:35 -04:00
Anuken
aedd047c6f Slightly improved mod dialog 2020-04-10 11:49:22 -04:00
OverChock
4ec85ae72b Update bundle_pt_BR.properties (#1833)
Some changes on turrets description.
2020-04-10 08:34:17 -04:00
Miguel de Dios Matias
5ac8ae2a00 I18n es tiny fix (#1835)
* Update some translations into spanish.

* Need a white space between #wave_number and wave word (in spanish).
2020-04-10 08:34:09 -04:00
Anuken
b4739e6036 Simpler sun shader 2020-04-09 21:15:42 -04:00
Anuken
dedb63e9b6 tweaks 2020-04-09 21:03:16 -04:00
Anuken
803538d5be Better detail 2020-04-09 20:55:59 -04:00
Anuken
1efbd9dcf2 Faster shaders (?) 2020-04-09 20:50:11 -04:00
Fernando
0a2ff97eb0 Update bundle_pt_BR.properties (#1830) 2020-04-09 09:59:03 -04:00
Gdeft
2c3e473b0f Updated translation for bundle_in_ID.properties (#1824)
* New translation added for Bahasa

I will add more translation and also review it soon again.

* Update bundle_in_ID.properties

* Update bundle_in_ID.properties

Updated ID translation for the description in campaign mode.

* Update bundle_in_ID.properties

More update for the Indonesian language including :
▪Even more translation (of course)
▪Fixed captialization and spelling
▪Fixed already existing translation
(almost finished)

* Finished translation for Bahasa 

• Fixed few missed spellings
• Added new translation
• Finished translation (I'm not sure for the items)

This the last commit for this pull request :)
2020-04-09 09:37:34 -04:00
Anuken
2a74bb742b Added landing sound 2020-04-08 22:06:43 -04:00
Vanguard
f7fcc0528e 2 lines changed
wave.enemies
wave.enemy
2020-04-09 02:39:52 +03:00
Anuken
a241d6f5bb Minor cleanup 2020-04-08 10:54:45 -04:00
Anuken
7b25b09c18 Bugfixes 2020-04-07 14:08:42 -04:00
Anuken
5fbe925429 Revert "Moved launch button"
This reverts commit 83bc3e4e
2020-04-07 11:29:23 -04:00
VKLowe
18aa9fc15e Update bundle_ru.properties (#1827) 2020-04-07 09:13:38 -04:00
Anuken
83bc3e4e8d Moved launch button 2020-04-05 14:26:15 -04:00
Olivier
3b0bff1a9b Revised french translation, corrected syntax errors (grammar, spelling), coherence with names. (#1822) 2020-04-05 13:56:17 -04:00
Anuken
a7b80f025c Bugfixes 2020-04-04 15:08:08 -04:00
laohuaji233
7227180707 Update bundle_zh_CN.properties (#1815) 2020-04-04 09:16:25 -04:00
Anuken
85e4270536 New water textures 2020-04-04 00:31:29 -04:00
Anuken
54a2bf1ba8 Smoother/faster water shader 2020-04-03 22:42:46 -04:00
Fernando
0d2bef90f2 Update bundle_pt_BR.properties (#1813) 2020-04-03 19:48:01 -04:00
Anuken
191d7fe1ef Cleanup 2020-04-03 19:40:45 -04:00
Anuken
e17052a452 Bugfixes / Builder changes / Planning layer changes 2020-04-03 13:37:35 -04:00
shadowpazzo
b3cd492a13 little fix to surge things and more understandable words (#1778)
i think lega supercarica is better than lega di sovratensione for italians and more
2020-04-03 11:04:41 -04:00
Patrick 'Quezler' Mounier
68c20ae728 Complete me senpai (#1810) 2020-04-03 10:48:51 -04:00
Vanguard
4c9b034153 Updated Phantom description (#1809)
Added info "Rebuilds destroyed blocks"
2020-04-03 08:21:39 -04:00
TheSlaylord
41510d4574 Update bundle_ru.properties (#1808) 2020-04-03 08:21:16 -04:00
Anuken
d611dd107a Bugfixes 2020-04-02 22:45:13 -04:00
Anuken
d0b2f63553 Tweaks 2020-04-02 14:56:53 -04:00
Anuken
a26cd46a7e Reflective planet water 2020-04-02 12:32:55 -04:00
Patrick 'Quezler' Mounier
74e94e5344 Merge branch 'master' into crater 2020-04-02 12:05:04 +02:00
Felix Corvus
5f49f23aa0 RU bundle Phantom description fix 2020-04-02 05:13:33 +03:00
Felix Corvus
a7e86aeee8 Felix alive (phantom description) 2020-04-02 05:07:05 +03:00
Anuken
1dcaa44e9b Merge remote-tracking branch 'origin/master' 2020-04-01 14:44:31 -04:00
Anuken
c1b225a3b0 Fixed issue in #1804 2020-04-01 14:44:17 -04:00
KeviTV
e253f5b0bd Create bundle_be.properties (#1797)
* Create bundle_be.properties

Full translation for the game into Belarusian

* Update bundle_be.properties

Small fix
2020-04-01 01:19:44 -04:00
Azathoth
8d784f616f Update bundle_pt_BR.properties (#1796)
some fixes at translation, better and more fluid translation in some words and a big fix at a weapon name that a lot of people was complaining about
2020-03-31 23:36:09 -04:00
Anuken
19239a6890 More cleanup 2020-03-31 19:39:14 -04:00
Anuken
77447c59f6 Cleanup 2020-03-31 15:01:22 -04:00
Anuken
f1fd072400 Game state cleanup 2020-03-31 14:16:38 -04:00
Anuken
b06d517084 Fixed #1793 2020-03-31 12:02:27 -04:00
Ali-C-Ila
e31061a546 Update bundle_zh_TW.properties (#1792) 2020-03-31 09:32:50 -04:00
Patrick 'Quezler' Mounier
dcb27eb9ba Turn bug report brackets into checkbox (#1790) 2020-03-31 09:32:34 -04:00
Lapis
c90a206a3a update bundle_ja.properties (#1787) 2020-03-30 14:29:19 -04:00
Anuken
9081f3ff03 Fixed antialiasing 2020-03-30 12:00:08 -04:00
Anuken
084c90ba9f Improved atmosphere shader performance 2020-03-30 11:35:22 -04:00
TheSlaylord
dd932c91b4 Update bundle_ru.properties (#1776)
* Update bundle_ru.properties

* Update bundle_ru.properties

* Update bundle_ru.properties
2020-03-30 11:13:06 -04:00
Prosta4okua
7de0da28cd Update bundle_ru.properties (#1777) 2020-03-30 11:12:58 -04:00
Olexandr Nesterenko
81ffd3fd3c chenge size for ok button (#1786) 2020-03-30 11:11:38 -04:00
Anuken
115e3a737b Cleanup 2020-03-29 23:06:58 -04:00
Anuken
fc65812263 Added cubemap stars 2020-03-29 19:39:29 -04:00
Anuken
7ba7e14282 Atmosphere tweaks 2020-03-29 18:34:00 -04:00
Anuken
f22e1bdeb3 Added planet atmosphere shader 2020-03-29 17:08:25 -04:00
Lapis
4740350ec5 update bundle_ja.properties (#1782)
* update bundle_ja.properties

* update bundle_ja.properties

* update bundle_ja.properties

* update bundle_ja.properties

* update bundle_ja.properties

* update bundle_ja.properties
2020-03-29 15:24:52 -04:00
Anuken
60a2a53973 Update bug_report.md 2020-03-29 13:29:45 -04:00
laohuaji233
924532f600 Update contributors (#1780) 2020-03-28 22:14:05 -04:00
GioIacca9
e983fde30f :) (#1779)
Anuke can I add my nick?
2020-03-28 18:11:09 -04:00
Anuken
65bf97bc03 Removed need for local.properties file 2020-03-28 17:03:52 -04:00
Prosta4okua
075cfd6eb0 Update bundle_ru.properties 2020-03-28 18:39:37 +02:00
Anuken
73f7681f59 Slight fade-in improvements 2020-03-28 08:54:29 -04:00
Anuken
48715d0311 Merge pull request #1769 from NickZhYT/patch-8
Update bundle_ru.properties
2020-03-28 08:52:46 -04:00
Anuken
cd99a0e1a7 Merge pull request #1770 from GioIacca9/patch-7
Update bundle_it.properties
2020-03-28 08:52:17 -04:00
Anuken
f1c254d6db Merge pull request #1771 from Lapis256/master
update bundle_ja.properties
2020-03-28 08:52:10 -04:00
Lapis256
43ef64bb2f update bundle_ja.properties 2020-03-28 20:12:34 +09:00
Lapis256
81bc6c6ce7 update bundle_ja.properties 2020-03-28 20:04:22 +09:00
NickZhYT
101744a710 Update bundle_ru.properties
Some description changes
2020-03-28 11:15:23 +03:00
GioIacca9
b37ea872a8 Update bundle_it.properties 2020-03-28 08:51:56 +01:00
Anuken
e32e9df1ab Merge pull request #1696 from unakiritan/patch-2
Create short-description.txt
2020-03-27 23:24:23 -04:00
Anuken
3bdd6e04ca cleanup 2020-03-27 15:34:46 -04:00
Anuken
50c6b0b1bd Cleanup 2020-03-27 10:07:42 -04:00
Anuken
cb4ecbd4b8 Implemented % tile efficiency display 2020-03-26 18:25:10 -04:00
Anuken
0573160b2f Added sorter cross (#1566) 2020-03-26 17:39:23 -04:00
Anuken
152a987c3a Experimental flow display 2020-03-26 17:19:18 -04:00
Patrick 'Quezler' Mounier
975221f4cc Revert "Revert "Revert "Revert "Revert "Repurpose branch to be played"""""
This reverts commit 164dd0c405.
2020-03-26 16:53:34 +01:00
Anuken
f966489298 Various tweaks 2020-03-25 23:28:20 -04:00
Anuken
e7ffb0214f Fixed some invalid sectors 2020-03-25 16:04:19 -04:00
Anuken
51b03725a2 Oregen fixes 2020-03-25 10:41:26 -04:00
Anuken
4fb74d1e39 Cleanup 2020-03-25 00:18:40 -04:00
Anuken
7d5ceafff2 Implemented #1129 / Bugfixes 2020-03-24 12:02:26 -04:00
Anuken
74b6bc5dd3 Added distributed ore gen 2020-03-23 14:08:37 -04:00
Patrick 'Quezler' Mounier
104fd78966 Collapse while 2020-03-23 17:07:11 +01:00
Patrick 'Quezler' Mounier
6b27d19057 Alter comments 2020-03-23 17:05:03 +01:00
Patrick 'Quezler' Mounier
6228b5353f Pack dump into conveyor rotation 2020-03-23 17:01:47 +01:00
Anuken
2165a2af7d Better enemy spawn selection 2020-03-22 23:12:58 -04:00
Anuken
289cca3bf0 Cleanup 2020-03-22 13:16:11 -04:00
Anuken
53a6297b59 Better naval check 2020-03-22 11:30:15 -04:00
Anuken
ea3e16ee16 Added water check 2020-03-22 09:44:38 -04:00
Anuken
ad45bebbdc Better spawn selection 2020-03-22 09:28:55 -04:00
Anuken
196a9dd77e Fixed incorrect plane projection 2020-03-21 19:11:13 -04:00
Anuken
148abaccd9 Cleanup 2020-03-21 16:40:39 -04:00
Anuken
4813d6c8ff More reasonable AI behavior 2020-03-21 14:29:00 -04:00
Anuken
3563c929af Cleanup 2020-03-21 12:08:21 -04:00
Anuken
d831fa7ba3 Added basic flying AI 2020-03-21 11:48:10 -04:00
Anuken
d673167477 Added basic ground AI 2020-03-21 10:49:38 -04:00
Anuken
d91ff744f2 Fixed color methods 2020-03-19 20:14:37 -04:00
Anuken
d2a2311cce Merge branches '6.0' and 'master' of https://github.com/Anuken/Mindustry into 6.0
# Conflicts:
#	core/src/mindustry/core/ContentLoader.java
#	core/src/mindustry/core/NetClient.java
#	core/src/mindustry/entities/type/Player.java
#	core/src/mindustry/io/MapIO.java
#	core/src/mindustry/io/TypeIO.java
#	core/src/mindustry/ui/dialogs/HostDialog.java
#	core/src/mindustry/ui/dialogs/JoinDialog.java
#	core/src/mindustry/world/LegacyColorMapper.java
2020-03-19 20:07:45 -04:00
Anuken
6cbc42d9de Fixed unnecessary Color rgba methods 2020-03-19 20:00:04 -04:00
Anuken
c7bc05f560 Unlock tweaks 2020-03-19 12:45:21 -04:00
Anuken
e9994794aa Sector lock state 2020-03-19 11:29:18 -04:00
Anuken
6bf031d0f5 Planet render cleanup 2020-03-18 13:32:23 -04:00
Anuken
436c76fd2f Merge branch 'master' of https://github.com/Anuken/Mindustry into 6.0
# Conflicts:
#	core/src/mindustry/world/blocks/BuildBlock.java
2020-03-17 20:03:12 -04:00
Anuken
12d4aab48a Tweaks 2020-03-17 20:02:38 -04:00
Anuken
0ed21a1d5f Bugfixes, cleanup / Created stub processor class 2020-03-17 11:51:33 -04:00
Anuken
08488857da Removed DoubleTurret, merged functionality 2020-03-17 11:02:10 -04:00
Anuken
2c7ff64511 Fixed some variable shadowing 2020-03-17 10:28:18 -04:00
Anuken
24f5921863 Bugfixes 2020-03-17 09:07:31 -04:00
Anuken
32ffacf8f6 Added sector deployment UI 2020-03-16 23:09:07 -04:00
Anuken
928812142a Bugfixes & liquid unit tests 2020-03-16 10:41:32 -04:00
Patrick 'Quezler' Mounier
164dd0c405 Revert "Revert "Revert "Revert "Repurpose branch to be played""""
This reverts commit 8caa9ed548.
2020-03-16 09:15:44 +01:00
Patrick 'Quezler' Mounier
8caa9ed548 Revert "Revert "Revert "Repurpose branch to be played"""
This reverts commit 4b08cfd2b7.
2020-03-15 22:04:10 +01:00
Patrick 'Quezler' Mounier
4f195b72d1 Merge branch 'master' into crater 2020-03-15 22:00:51 +01:00
Patrick 'Quezler' Mounier
4b08cfd2b7 Revert "Revert "Repurpose branch to be played""
This reverts commit 9df875354a.
2020-03-15 22:00:45 +01:00
Anuken
1e3326fb8a Cleanup 2020-03-15 09:02:14 -04:00
Anuken
cd019ab329 More bugfixes 2020-03-14 18:19:07 -04:00
Anuken
7e781d9ff8 Bugfixes 2020-03-14 12:29:12 -04:00
Anuken
808615a77c Bugfixes 2020-03-13 22:33:37 -04:00
Anuken
06e94b1800 Cleaned up weather class 2020-03-11 10:08:27 -04:00
Anuken
930c342fb6 Shader cleanup 2020-03-10 19:48:38 -04:00
Anuken
25bbce2e10 Fixed a crash 2020-03-10 15:13:28 -04:00
Anuken
9398ac5088 GL fixes 2020-03-10 12:40:24 -04:00
Anuken
860efdc052 GL Optimization 2020-03-10 12:10:53 -04:00
Anuken
ade989aecb Removed Shader#end 2020-03-10 10:32:40 -04:00
unakiritan
12380f54d2 Create short-description.txt
Japanese Steam metadata.
2020-03-10 14:51:43 +09:00
Anuken
876d193379 Bugfixes 2020-03-09 11:16:57 -04:00
Anuken
1dc4fd0800 FX cleanup and installation 2020-03-08 22:45:32 -04:00
Anuken
0ff3c1ee78 Cleanup 2020-03-08 21:53:19 -04:00
Anuken
863c7ae2bc Removed unit factory limit 2020-03-08 17:49:19 -04:00
Anuken
7ae0192a09 Crash fix 2020-03-08 12:12:06 -04:00
Anuken
12c4395508 Added basic respawning 2020-03-07 23:24:22 -05:00
Anuken
7b144cbec6 Attribute tweaks 2020-03-07 13:56:57 -05:00
Anuken
1e0067d64b Bugfixes 2020-03-07 10:27:29 -05:00
Anuken
7655b65363 Bugfixes / Fixed #1680 2020-03-06 17:06:21 -05:00
Anuken
ae0b84cef0 Increased max block size 2020-03-06 16:31:09 -05:00
Anuken
a02c7989b4 Bugfixes 2020-03-06 16:10:13 -05:00
Anuken
60d28fb01b Bugfixes 2020-03-06 16:07:07 -05:00
Anuken
f8b554aff8 Fixed some basic crashes 2020-03-06 15:30:51 -05:00
Anuken
77f406e9b8 Fixed core errors 2020-03-06 15:22:13 -05:00
Anuken
4358658889 Down to less than 100 errors 2020-03-06 14:55:06 -05:00
Anuken
73c0ebb75f Fixed most errors in block package 2020-03-06 14:41:38 -05:00
Anuken
4744465986 More cleanup, nearing completion of block refactor 2020-03-06 12:19:26 -05:00
Patrick 'Quezler' Mounier
f931469132 This does ¬ seem nececary anymore somehow 2020-03-06 18:08:18 +01:00
Patrick 'Quezler' Mounier
afdb0aa8c2 Fix sleep visualizer 2020-03-06 17:21:17 +01:00
Patrick 'Quezler' Mounier
73414d7c2a Collapse if 2020-03-06 14:59:12 +01:00
Patrick 'Quezler' Mounier
c1f025db52 Rename reload to cooldown 2020-03-06 14:57:11 +01:00
Patrick 'Quezler' Mounier
087aef6b85 Move capacity into crater 2020-03-06 11:06:35 +01:00
Patrick 'Quezler' Mounier
7ddcd93a57 Use extended position 2020-03-06 10:28:49 +01:00
Patrick 'Quezler' Mounier
caa25b811b Condense single use rotation 2020-03-06 10:22:37 +01:00
Patrick 'Quezler' Mounier
5a60ab1d2a Privatize drawer 2020-03-06 10:20:47 +01:00
Patrick 'Quezler' Mounier
8a25d57c83 This looks good to 2020-03-06 10:17:02 +01:00
Patrick 'Quezler' Mounier
c5de6706e0 Eyecandyfi 2020-03-06 10:14:52 +01:00
Patrick 'Quezler' Mounier
f50ee2ecf2 Try to clean up the end of tile logic 2020-03-06 09:52:28 +01:00
Patrick 'Quezler' Mounier
11fc494284 Clean up transfer code 2020-03-06 09:34:09 +01:00
Anuken
1c48c1a43e Cleanup 2020-03-05 23:23:10 -05:00
Anuken
2e19504b65 it begins 2020-03-05 20:27:42 -05:00
Anuken
5a0d079a78 oh no 2020-03-05 18:05:59 -05:00
Patrick 'Quezler' Mounier
e05f755a4e Remove unused import 2020-03-05 21:30:18 +01:00
Patrick 'Quezler' Mounier
44bff5b7cf Remove conveyor integration remnants 2020-03-05 21:29:19 +01:00
Patrick 'Quezler' Mounier
e2b9977ebc Remove omnidirectional due to issues 2020-03-05 21:27:28 +01:00
Patrick 'Quezler' Mounier
3e51abf6eb Try to fix blending with omnidirectional 2020-03-05 21:24:51 +01:00
Patrick 'Quezler' Mounier
c1f765a467 Bodge in a rotational blend bypass 2020-03-05 20:26:34 +01:00
Patrick 'Quezler' Mounier
e67667e4a3 Remove preemtive unload 2020-03-05 20:09:09 +01:00
Patrick 'Quezler' Mounier
14a97976cc Realign pixels
Bothered me for ages.
2020-03-05 19:48:36 +01:00
Anuken
2dfbbdfd5b Beginning work on respawning 2020-03-05 12:12:03 -05:00
Patrick 'Quezler' Mounier
4a3e00f822 Fix early return 2020-03-05 15:21:41 +01:00
Anuken
39ee31d748 Fixed #1673 2020-03-05 08:45:14 -05:00
Patrick 'Quezler' Mounier
3ac50a3f3e , 2020-03-05 14:42:37 +01:00
Patrick 'Quezler' Mounier
6fb4c79f82 Fix sleeping while reloading 2020-03-05 14:29:27 +01:00
Patrick 'Quezler' Mounier
9c75133fc8 Blend tripod dumper with conveyors 2020-03-05 14:21:41 +01:00
Patrick 'Quezler' Mounier
fd61add2e4 Cleanup update loop 2020-03-05 14:10:28 +01:00
Patrick 'Quezler' Mounier
acd695a469 Messy cleanup 2020-03-05 13:40:44 +01:00
Patrick 'Quezler' Mounier
5036506547 Rotate smoother 2020-03-05 13:28:23 +01:00
Patrick 'Quezler' Mounier
b0becbad38 Fix unloading prematurely 2020-03-05 13:22:50 +01:00
Patrick 'Quezler' Mounier
bcb87f8f76 Update description accordingly 2020-03-05 12:15:38 +01:00
Patrick 'Quezler' Mounier
ecb09c0f04 Dump like bridges do 2020-03-05 12:11:55 +01:00
Patrick 'Quezler' Mounier
e7298702a1 Delete drafts 2020-03-05 10:50:21 +01:00
Patrick 'Quezler' Mounier
b74cf71f40 Come up with a new description 2020-03-05 10:50:08 +01:00
Patrick 'Quezler' Mounier
2025c7c669 Fix mech dropoff ¬ working 2020-03-05 10:35:48 +01:00
Patrick 'Quezler' Mounier
00249f62b6 Cleanup if chains 2020-03-05 10:28:10 +01:00
Patrick 'Quezler' Mounier
9df875354a Revert "Repurpose branch to be played"
This reverts commit ff578c8540.

# Conflicts:
#	tools/crater-deploy.sh
2020-03-05 10:10:00 +01:00
Patrick 'Quezler' Mounier
9bc340ba17 Fix end ¬ rendering 2020-03-05 10:08:22 +01:00
Patrick 'Quezler' Mounier
79c965bf8d Move sleep detector to renderer 2020-03-05 10:08:15 +01:00
Patrick 'Quezler' Mounier
e5e4884448 Merge branch 'master' into crater
# Conflicts:
#	core/assets/sprites/block_colors.png
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/sprites/sprites3.png
#	core/assets/sprites/sprites5.png
#	core/src/mindustry/world/modules/ItemModule.java
2020-03-05 10:00:02 +01:00
Anuken
882076030d Added back tapping 2020-03-04 19:58:48 -05:00
Anuken
c02c00cdfb Schematic tweaks and improvements 2020-03-04 19:21:40 -05:00
Anuken
3eea0ea065 Bugfixes, tweaks 2020-03-04 13:48:00 -05:00
Anuken
fbbec816e8 Merged in object configuration 2020-03-04 13:33:14 -05:00
Anuken
cf31293d7b Many internal changes 2020-03-04 13:32:31 -05:00
Anuken
aeae286273 Merge branch '6.0' of https://github.com/Anuken/Mindustry into object-config
# Conflicts:
#	core/src/mindustry/entities/traits/BuilderTrait.java
#	core/src/mindustry/entities/type/TileEntity.java
#	core/src/mindustry/game/EventType.java
#	core/src/mindustry/game/Schematics.java
#	core/src/mindustry/input/InputHandler.java
#	core/src/mindustry/io/TypeIO.java
#	core/src/mindustry/world/Block.java
#	core/src/mindustry/world/blocks/distribution/Sorter.java
2020-03-04 08:38:36 -05:00
Anuken
2581353c5e Merge branch '6.0' of https://github.com/Anuken/Mindustry into object-config
# Conflicts:
#	core/src/mindustry/entities/traits/BuilderTrait.java
#	core/src/mindustry/entities/type/TileEntity.java
#	core/src/mindustry/game/EventType.java
#	core/src/mindustry/game/Schematics.java
#	core/src/mindustry/input/InputHandler.java
#	core/src/mindustry/io/TypeIO.java
#	core/src/mindustry/world/Block.java
#	core/src/mindustry/world/blocks/distribution/Sorter.java
2020-03-03 21:33:03 -05:00
Anuken
087f8129b9 Tile code cleanup 2020-03-03 19:29:41 -05:00
Anuken
bac1648d4b Added support for changing cached floor/terrain 2020-03-03 17:01:09 -05:00
Anuken
f1aadd97a8 Merge branch 'master' of https://github.com/Anuken/Mindustry into 6.0
# Conflicts:
#	core/src/mindustry/core/Logic.java
#	gradle.properties
2020-03-03 12:12:25 -05:00
Anuken
3858cdd4c5 Added map region class 2020-03-03 12:08:31 -05:00
Anuken
182a8837be Save satellite presence 2020-03-01 20:58:33 -05:00
Anuken
a31de609ce BufferUtils -> Buffers 2020-03-01 16:19:04 -05:00
Anuken
9ddd76d6cb Cleanup 2020-03-01 15:41:10 -05:00
Anuken
c6fc103bff Merge branches '6.0' and 'master' of https://github.com/Anuken/Mindustry into 6.0 2020-03-01 12:55:51 -05:00
Anuken
3ed5282e14 Better sector null checks 2020-03-01 12:15:38 -05:00
Anuken
51cec64118 Merge remote-tracking branch 'origin/6.0' into 6.0 2020-03-01 00:09:07 -05:00
Anuken
a2a9cffdee Moved some methods around 2020-03-01 00:09:03 -05:00
Prosta4okua
057f3aead7 Update bundle_uk_UA.properties (#1644) 2020-02-29 21:46:38 -05:00
Anuken
4b36a6d5bd Bugfixes 2020-02-29 19:37:14 -05:00
Anuken
26c328ae34 Bugfixes and cleanup 2020-02-29 12:43:37 -05:00
Anuken
7a01719816 Real-time lighting + solar system rendering 2020-02-29 11:58:10 -05:00
Anuken
f0857fa22d Universe time + Progress on solar system framework 2020-02-28 20:21:00 -05:00
Anuken
04f8282821 Better lighting 2020-02-28 13:44:03 -05:00
Anuken
120d96c775 Sun + dynamic lighting 2020-02-28 13:18:06 -05:00
Anuken
21bd7a75f0 Added icosphere generator 2020-02-27 20:39:41 -05:00
Anuken
dcf75222d9 Cleanup 2020-02-27 10:04:56 -05:00
Anuken
1e53ea50b0 Added support for export/import of all basic terrain as image 2020-02-26 19:37:22 -05:00
Anuken
fdaac290ac Better previews 2020-02-26 14:44:06 -05:00
Anuken
a1fd621eb6 Fast sector save access, structural changes 2020-02-25 23:40:26 -05:00
Anuken
8b7f439ef5 Unfinished sector selection 2020-02-24 23:03:33 -05:00
Anuken
3211b5da01 Added plane batch 2020-02-24 15:58:36 -05:00
Anuken
cfbe631e66 Merge 2020-02-23 20:14:38 -05:00
Anuken
7f53328f52 Refactored planet rendering to different classes 2020-02-23 19:05:25 -05:00
Anuken
9af93dc44d Slightly larger sectors 2020-02-22 22:40:16 -05:00
Anuken
68b9bfe907 Cleanup 2020-02-22 19:30:39 -05:00
Anuken
966fff70ed 2 2020-02-22 17:28:48 -05:00
Anuken
9788f9b981 Tweaks 2020-02-22 17:28:13 -05:00
Anuken
6e4b02db5a Correctly seeded sectors 2020-02-22 15:28:56 -05:00
Anuken
2afb175560 Generation tweaks 2020-02-22 12:05:31 -05:00
Anuken
4a40172782 Cleaned up bullet sprites 2020-02-22 00:28:03 -05:00
Anuken
baa0eb1149 Added cliffs as separate block 2020-02-21 23:45:25 -05:00
Anuken
6871db7155 Visual tweaks 2020-02-21 22:58:18 -05:00
Anuken
a5e469e96c Complete planet panning 2020-02-21 13:48:50 -05:00
Anuken
99d3e9ae7c Generator cleanup 2020-02-20 20:28:23 -05:00
Anuken
97f342aceb . 2020-02-20 10:34:17 -05:00
Anuken
1d1c73fd6f Merge 2020-02-19 13:10:25 -05:00
Anuken
71f1fb5d66 Cleanup 2020-02-19 10:17:56 -05:00
Anuken
65800a51c6 Sector darkness boundaries 2020-02-19 00:29:48 -05:00
Anuken
48c04bda8c Map tweaks 2020-02-18 20:07:07 -05:00
Anuken
afd31c2b42 Merge remote-tracking branch 'origin/6.0' into 6.0 2020-02-18 19:34:17 -05:00
Anuken
53996d8a8d Circular sector maps 2020-02-18 19:34:07 -05:00
Anuken
8b14219bab Merge pull request #1583 from Prosta4okua/patch-9
6.0
2020-02-18 10:39:22 -05:00
Anuken
da2cc292c3 Wall generation 2020-02-17 20:33:01 -05:00
Anuken
e215772f30 Added backwards compatibility for legacy saves 2020-02-17 11:13:46 -05:00
Anuken
18d4efa315 Merge 2020-02-17 09:30:36 -05:00
Anuken
6d68e10804 Bugfixes, cleanup 2020-02-16 22:22:10 -05:00
Anuken
e71230755d Fixed omnidirectional shooting with ignored rotation 2020-02-16 13:49:29 -05:00
Anuken
7a8bd82f8e Improved controls / Re-added engine sprite 2020-02-16 13:16:18 -05:00
Andreas Gamborg
35c130c4ff Create bundle_da.properties
Added file for danish translated.
I have translated the first 200 lines.
2020-02-16 16:42:39 +01:00
Anuken
e677538c53 Fixed a crash 2020-02-15 15:55:37 -05:00
Anuken
8b4fcf99a6 Building / Fixed some tests 2020-02-15 14:51:31 -05:00
Anuken
03d0f54083 class IDs 2020-02-15 12:39:22 -05:00
Anuken
1f65ba185a Fixed unit drowning effects 2020-02-15 12:39:13 -05:00
Anuken
024f2d62e2 Planet sector metadata 2020-02-14 20:08:07 -05:00
Anuken
7f56cdc1e9 Better planet terrain 2020-02-14 14:12:22 -05:00
Anuken
abaa462645 Added entity revisions 2020-02-14 12:54:44 -05:00
Prosta4okua
ff74a212c5 Update bundle_uk_UA.properties 2020-02-14 12:38:58 +02:00
Prosta4okua
a4d42ea22c 6.0 2020-02-14 12:35:17 +02:00
Anuken
c4d4dcb9db TypeIO resolution 2020-02-13 23:10:18 -05:00
Anuken
c4464e67fd Fixed IO issues 2020-02-13 22:26:24 -05:00
Anuken
09c57c32d6 Better IO 2020-02-13 22:11:59 -05:00
Anuken
e3621f44da Barely functional IO 2020-02-13 19:26:36 -05:00
Anuken
ad248e2e20 Autogeneration of some IO code 2020-02-13 13:30:30 -05:00
Anuken
47f075133f Merge 2020-02-13 11:22:29 -05:00
Anuken
6fd0205495 Merge 2020-02-11 19:55:02 -05:00
Anuken
47023af3d5 cleanup 2020-02-10 15:51:01 -05:00
Anuken
86d5842868 Testing new quadtree 2020-02-10 11:29:58 -05:00
Anuken
81990cf16c Optimizations 2020-02-10 11:07:10 -05:00
Anuken
6c6861a97a Cleanup 2020-02-10 10:47:21 -05:00
Anuken
0ad8408ba9 Collisions, lots of bugfixes 2020-02-10 09:58:00 -05:00
Anuken
fbadb9f4aa Group collisions 2020-02-10 09:22:19 -05:00
Patrick 'Quezler' Mounier
4bb9a93ff9 Do as i say, ¬ do as i do 2020-02-10 13:14:48 +01:00
Patrick 'Quezler' Mounier
ac3ab6971d Undo the last 5 2020-02-10 13:11:49 +01:00
Patrick 'Quezler' Mounier
66c81246b6 Fix single tile check if blendbit is 0 2020-02-10 13:02:21 +01:00
Patrick 'Quezler' Mounier
656c37372d Wrap upstream tile thingie 2020-02-10 12:57:21 +01:00
Patrick 'Quezler' Mounier
b89078733e Revert "Stash revertable"
This reverts commit 158241b8e2.
2020-02-10 12:49:44 +01:00
Patrick 'Quezler' Mounier
158241b8e2 Stash revertable 2020-02-10 12:49:36 +01:00
Patrick 'Quezler' Mounier
2bd7c92b9e Allow sideloading the unloader
Main reason for blendbits > 1 & 2
2020-02-10 12:38:48 +01:00
Patrick 'Quezler' Mounier
562fa07755 Merge branch 'master' into crater 2020-02-10 12:09:14 +01:00
Anuken
e9b066b866 Fires, puddles, feature reimplementations 2020-02-09 23:43:08 -05:00
Anuken
3feca9bbf8 Minor tweaks 2020-02-09 22:27:16 -05:00
Anuken
d89189debd Fixed server 2020-02-09 15:40:03 -05:00
Anuken
ae7a8e1f65 Minor tweaks 2020-02-09 14:35:22 -05:00
Anuken
c23e923ffb Merged with master 2020-02-09 12:32:29 -05:00
Anuken
a2706a80b1 Merged with master 2020-02-09 12:27:44 -05:00
Anuken
d2ab316072 ?? 2020-02-09 12:25:13 -05:00
Anuken
f9bc4a30f0 Merge 2020-02-09 12:16:12 -05:00
Anuken
d45d7f21b6 Procedural scorch marks / Bugfixes 2020-02-09 12:07:36 -05:00
Anuken
8e976c20a1 Hitbox fixes 2020-02-08 23:00:26 -05:00
Anuken
e23119e330 Feature re-implementations 2020-02-08 21:54:41 -05:00
Anuken
5169e197b6 Bugfixes 2020-02-08 16:00:54 -05:00
Anuken
ba1f59aa71 Better physics 2020-02-08 15:39:27 -05:00
Anuken
8814dbe29a Sprite cleanup / Bullets 2020-02-08 14:48:04 -05:00
Anuken
f46be924b9 Effects, collisions, method overrides 2020-02-08 13:14:23 -05:00
Anuken
659bfea8cf Cleanup 2020-02-07 23:12:39 -05:00
Anuken
c8455ddbc8 Added message for non-building units 2020-02-07 21:56:55 -05:00
Anuken
8a9c92227d More movement 2020-02-07 18:55:53 -05:00
Anuken
4265d40024 Movement 2020-02-07 13:02:24 -05:00
Anuken
861b3ac3f4 Tweaks 2020-02-07 11:46:10 -05:00
Anuken
007a1bd1d2 Unit definitions 2020-02-07 11:04:58 -05:00
Anuken
b9841f9cfa a mess 2020-02-07 10:47:58 -05:00
Anuken
33e818a757 Entity name mapping 2020-02-07 09:36:51 -05:00
Patrick 'Quezler' Mounier
d7e8a8e4f4 Add comment to 〃 2020-02-07 11:02:42 +01:00
Patrick 'Quezler' Mounier
b66e03d2a8 Revert "Cache upstream"
This reverts commit 908018b97c.
2020-02-07 10:59:51 +01:00
Patrick 'Quezler' Mounier
908018b97c Cache upstream
But i do ¬ like how this turned out, so reverting :(
2020-02-07 10:59:45 +01:00
Patrick 'Quezler' Mounier
9abb08152b Prettify upsteam calculator 2020-02-07 10:51:36 +01:00
Patrick 'Quezler' Mounier
94dc220924 Finish 〃 2020-02-07 10:32:43 +01:00
Patrick 'Quezler' Mounier
3d8e83850e Refractor inputs to upstream 2020-02-07 08:41:34 +01:00
Anuken
eeae5149a1 Basic unit rendering 2020-02-06 22:08:31 -05:00
Anuken
f83b6728cf ? 2020-02-06 20:24:30 -05:00
Anuken
e3136e9e09 more rendering 2020-02-06 14:58:12 -05:00
Patrick 'Quezler' Mounier
4147d8a512 Cleanup 〃 2020-02-06 20:23:42 +01:00
Patrick 'Quezler' Mounier
8c7b688f78 Add layered blendbitz 2020-02-06 20:19:00 +01:00
Anuken
ddecb2d831 Actual updating and rendering 2020-02-06 13:40:07 -05:00
Patrick 'Quezler' Mounier
99d1a2829f Merge branch 'master' into crater 2020-02-06 19:33:57 +01:00
Patrick 'Quezler' Mounier
c0d250560a 🐍 is kil 2020-02-06 19:33:42 +01:00
Anuken
6fe5663f79 Autogenerated render layer groups 2020-02-06 13:20:03 -05:00
Anuken
6a99a3922e Cleanup 2020-02-06 11:37:22 -05:00
Patrick 'Quezler' Mounier
502e8f78ce Move some stuff around 2020-02-06 17:25:54 +01:00
Anuken
a11f6efe0a Rudimentary rendering 2020-02-05 23:04:48 -05:00
Anuken
8172e69f8c it launches 2020-02-05 22:08:57 -05:00
Anuken
65857d77c4 .... 2020-02-05 21:14:53 -05:00
Anuken
dfecfa3964 . 2020-02-05 20:11:49 -05:00
Anuken
f6b1420103 c l e a n u p 2020-02-05 18:28:19 -05:00
Anuken
84748afc55 the errors are back 2020-02-05 15:00:35 -05:00
Anuken
eb0ea9030b ? 2020-02-05 13:08:48 -05:00
Anuken
da97aee8e4 it never ends 2020-02-05 13:03:22 -05:00
Patrick 'Quezler' Mounier
05ccdfd51b Merge branch 'master' into crater
# Conflicts:
#	core/assets/sprites/block_colors.png
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/sprites/sprites3.png
#	core/assets/sprites/sprites5.png
#	core/src/mindustry/world/modules/ItemModule.java
2020-02-05 10:26:34 +01:00
Anuken
a7b39e56bd Cleanup continues 2020-02-04 18:00:32 -05:00
Anuken
012421afcb Class ID mapping 2020-02-04 13:57:42 -05:00
Anuken
be50997f94 Merge branches '6.0' and 'splinterface-impl' of https://github.com/Anuken/Mindustry into splinterface-impl
# Conflicts:
#	core/assets/sprites/block_colors.png
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/sprites/sprites3.png
#	core/assets/sprites/sprites5.png
#	core/src/mindustry/Vars.java
#	core/src/mindustry/entities/traits/SaveTrait.java
#	core/src/mindustry/maps/generators/MapGenerator.java
#	core/src/mindustry/ui/dialogs/DeployDialog.java
#	core/src/mindustry/world/blocks/Floor.java
#	desktop/src/mindustry/desktop/DesktopLauncher.java
#	gradle.properties
2020-02-04 12:25:18 -05:00
Anuken
878f570472 Cleanup 2020-02-04 12:23:38 -05:00
Anuken
36b9451e01 Read-only component fields / Removed get/set prefix 2020-02-04 12:14:09 -05:00
Anuken
1d0cfd4435 UnitType cleanup 2020-02-04 11:40:56 -05:00
Anuken
006004fd70 Decal cleanup 2020-02-04 09:39:12 -05:00
Anuken
a07e275e11 Entity groups 2020-02-04 01:03:34 -05:00
Anuken
a942ed2cad More cleanup 2020-02-03 20:24:49 -05:00
Anuken
88d2ec5be8 Cleanup 2020-02-03 15:59:54 -05:00
Anuken
141cf518a2 Refactoring 2020-02-03 14:07:06 -05:00
Anuken
f937cb30f0 More components, less entities 2020-02-02 23:38:16 -05:00
Anuken
f2f31120a0 Gradual component conversion 2020-02-02 20:17:22 -05:00
Anuken
63fa50d111 Implementation begins 2020-02-02 18:33:59 -05:00
Patrick 'Quezler' Mounier
55932d03c9 Do ¬ bump empty conveyors 2020-01-29 10:33:39 +01:00
Patrick 'Quezler' Mounier
93faf128b7 Bump up the chain to update in unison 2020-01-29 10:12:18 +01:00
Patrick 'Quezler' Mounier
56b2cc2745 Fix unloading on a corner 2020-01-29 09:05:00 +01:00
Patrick 'Quezler' Mounier
d2869b976d Fix comment in 〃 2020-01-29 09:04:46 +01:00
Patrick 'Quezler' Mounier
432b555f1b Optimize with sleeps
Ehmm i meant recharge cycles, beep boop.
2020-01-29 09:02:53 +01:00
Patrick 'Quezler' Mounier
db1a2ddc64 Move start & end logic into entity snek bits 2020-01-29 08:03:53 +01:00
Patrick 'Quezler' Mounier
88282a8c0b Prevent turns from being considered the end 2020-01-29 07:48:14 +01:00
Patrick 'Quezler' Mounier
4674e5ad68 Merge branch 'master' into crater 2020-01-28 20:06:16 +01:00
Patrick 'Quezler' Mounier
babe00245a Comment on crater-deploy.sh 2020-01-28 14:52:09 +01:00
Patrick 'Quezler' Mounier
ff578c8540 Repurpose branch to be played
When anuke shows more interest in this branch the changes that stem from this can be reversed and squashed, but people want to play it, and keeping 2 crater related branches in sync is frankly a pain 😗
2020-01-28 14:31:32 +01:00
Patrick 'Quezler' Mounier
445126ea65 Rename Track to CraterConveyor
though it does not extend the conveyor class.
2020-01-28 11:41:20 +01:00
Patrick 'Quezler' Mounier
2683c74800 Avoid assigning new object? 2020-01-28 11:10:23 +01:00
Patrick 'Quezler' Mounier
61197fe974 Remove duplicate code between first & take 2020-01-28 11:08:40 +01:00
Patrick 'Quezler' Mounier
89d143af8f Undo part of 〃 2020-01-28 11:00:08 +01:00
Patrick 'Quezler' Mounier
0f92f77b55 Draw crater unto plastanium conveyor icon
And remove whitespaces from the emoji one.
2020-01-28 10:57:51 +01:00
Patrick 'Quezler' Mounier
683211cb1f Untangle conveyor entanglement
Made track a standalone block due to the influx of conveyor code changes, and if it were ever to return it would make sense to also include the conduits in one form or another, like a 🐍 class/trait/abstract/method/etc
2020-01-28 10:41:30 +01:00
Patrick 'Quezler' Mounier
af83d08fb1 FIx inconsistencies in the diff 2020-01-28 07:59:11 +01:00
Patrick 'Quezler' Mounier
28765ef909 Merge branch 'master' into crater 2020-01-28 07:45:03 +01:00
Anuken
ad6e0bcd0f Merge branches 'master' and 'mech-rework' of https://github.com/Anuken/Mindustry into mech-rework
# Conflicts:
#	android/src/mindustry/android/AndroidLauncher.java
#	annotations/src/main/java/mindustry/annotations/SerializeAnnotationProcessor.java
#	annotations/src/main/java/mindustry/annotations/impl/AssetsAnnotationProcessor.java
#	build.gradle
#	core/assets-raw/fontgen/config.json
#	core/assets/bundles/bundle_cs.properties
#	core/assets/bundles/bundle_it.properties
#	core/assets/fonts/font.ttf
#	core/assets/fonts/icon.ttf
#	core/assets/icons/icons.properties
#	core/assets/sprites/block_colors.png
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/sprites/sprites3.png
#	core/assets/sprites/sprites5.png
#	core/src/mindustry/content/UnitTypes.java
#	core/src/mindustry/core/NetClient.java
#	core/src/mindustry/core/NetServer.java
#	core/src/mindustry/entities/bullet/BulletType.java
#	core/src/mindustry/entities/type/TileEntity.java
#	core/src/mindustry/maps/filters/FilterOption.java
#	core/src/mindustry/mod/Scripts.java
#	core/src/mindustry/ui/Fonts.java
#	core/src/mindustry/ui/dialogs/DeployDialog.java
#	core/src/mindustry/ui/fragments/HudFragment.java
#	core/src/mindustry/ui/fragments/MenuFragment.java
#	core/src/mindustry/world/blocks/production/Cultivator.java
#	core/src/mindustry/world/blocks/units/CommandCenter.java
#	gradle.properties
#	tools/src/mindustry/tools/FontGenerator.java
2020-01-27 15:51:02 -05:00
Patrick 'Quezler' Mounier
8edcebd3a6 Undo moving other bundle keys into their place
Should be a different commit/pull
2020-01-27 19:42:27 +01:00
Patrick 'Quezler' Mounier
6eb6870bb6 Register crater emoji via ui folder
#1458
2020-01-27 19:33:36 +01:00
Patrick 'Quezler' Mounier
038fc72d7b Merge branch 'master' into crater 2020-01-27 19:17:22 +01:00
Patrick 'Quezler' Mounier
2e3f7d8db2 Merge branch 'master' into crater 2020-01-27 18:40:51 +01:00
Patrick 'Quezler' Mounier
883a2a9b59 Bruteforce crater emoji 2020-01-27 18:40:40 +01:00
Patrick 'Quezler' Mounier
9a289c83e6 Fuse with conveyor optimization
# Conflicts:
#	core/src/mindustry/world/blocks/distribution/ItemConveyor.java
2020-01-27 18:06:48 +01:00
Patrick 'Quezler' Mounier
6e970cb84d Fix tech tree entry 2020-01-24 20:26:49 +01:00
Patrick 'Quezler' Mounier
58a79d8631 Update to v103
# Conflicts:
#	core/assets/sprites/block_colors.png
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/sprites/sprites3.png
#	core/assets/sprites/sprites5.png
#	core/src/mindustry/content/Blocks.java
#	core/src/mindustry/content/TechTree.java
#	core/src/mindustry/world/blocks/distribution/ItemConveyor.java
2020-01-24 20:25:03 +01:00
Anuken
26e93c2f06 Cleanup 2020-01-22 11:36:13 -05:00
Anuken
2fe3fea7f4 Cleanup 2020-01-20 16:16:02 -05:00
Anuken
2c4dcff72d Cleanup 2020-01-20 16:15:15 -05:00
Anuken
f6595937f4 Cleanup 2020-01-20 16:14:45 -05:00
Anuken
df1a102021 Cleanup 2020-01-20 16:14:29 -05:00
Anuken
be0b13e27d Tweaks 2020-01-20 14:04:43 -05:00
Anuken
27d6bf067e Added prototype planet sector land system 2020-01-20 12:05:26 -05:00
Anuken
01e7397df5 Added preview projection 2020-01-20 11:13:20 -05:00
Anuken
b9dd6cc4b5 Cleanup 2020-01-19 21:06:45 -05:00
Anuken
4f144c8f3d Merge remote-tracking branch 'origin/mech-rework' into mech-rework
# Conflicts:
#	core/src/mindustry/entities/Weapons.java
#	gradle.properties
2020-01-19 11:11:10 -05:00
Anuken
c0844304a6 Merge 2020-01-19 11:10:14 -05:00
Anuken
b2f9b2ef77 Planet cleanup 2020-01-18 17:03:03 -05:00
Anuken
47695f1f8c Added accurate planet generation 2020-01-18 13:24:14 -05:00
Anuken
f044f30829 Merge 2020-01-18 11:16:03 -05:00
Anuken
f7c4ea3e58 Weapon mount cleanup 2020-01-16 10:52:20 -05:00
Anuken
651d0f5162 Cleanup 2020-01-15 13:55:52 -05:00
Anuken
e5856cf73b More objects 2020-01-15 11:28:44 -05:00
Anuken
2dd95a62ca Configuration 2020-01-14 16:18:26 -05:00
Anuken
ae2dd5732a Objectification 2020-01-14 13:32:19 -05:00
Anuken
b20e0967fd Structural changes 2020-01-13 16:10:17 -05:00
Anuken
899a12eddb Elevation 2020-01-13 07:45:11 -05:00
Anuken
c637ec15ff Deployment dialog replaced 2020-01-12 20:01:32 -05:00
Anuken
e6f1d194ae Improved planet generation 2020-01-12 14:11:47 -05:00
Anuken
18ce4b6bde Cleanup 2020-01-12 12:16:08 -05:00
Anuken
c2cb308081 Object cleanup / Planet mesh class 2020-01-12 00:24:35 -05:00
Anuken
bbf87df373 a revelation 2020-01-11 23:41:12 -05:00
Anuken
432a40c656 Cleanup 2020-01-11 17:02:38 -05:00
Anuken
fbedc95ad9 Mesh-based rendering 2020-01-11 10:44:07 -05:00
Anuken
f26e0b4609 Hexagonal planet 2020-01-11 00:39:37 -05:00
Anuken
f918cdeced More rendering stuff 2020-01-10 20:27:10 -05:00
Anuken
6f3c771d73 Refactoring 2020-01-10 17:28:37 -05:00
Anuken
49137d4f58 an actual planet 2020-01-10 15:54:39 -05:00
Anuken
eebbf9bbf4 Merge branches '6.0' and 'master' of https://github.com/Anuken/Mindustry into 6.0 2020-01-10 15:23:19 -05:00
Anuken
e45df98f26 Merge branch 'master' of https://github.com/Anuken/Mindustry into 6.0
# Conflicts:
#	core/src/mindustry/graphics/Bloom.java
#	gradle.properties
2020-01-10 15:19:07 -05:00
Anuken
b123b8b074 Removed Mech/UnitType 2020-01-10 15:08:13 -05:00
Anuken
f7791a2bb2 Merge; internal changes 2020-01-10 11:30:42 -05:00
Patrick 'Quezler' Mounier
ed765ad10a Merge branch 'master' into crater
# Conflicts:
#	core/assets/sprites/block_colors.png
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/sprites/sprites3.png
#	core/assets/sprites/sprites5.png
2020-01-10 12:02:07 +01:00
Patrick 'Quezler' Mounier
5f047603bf Revert "Blend prototype"
This reverts commit 35afc94d34.

# Conflicts:
#	core/assets/sprites/sprites.png
2020-01-08 12:17:28 +01:00
Patrick 'Quezler' Mounier
5c485eff04 Ressurect OG corner 2020-01-08 10:58:05 +01:00
Patrick 'Quezler' Mounier
0f2f8f2411 Revert "Stash cursed loading dock"
This reverts commit 9bdf475049.
2020-01-08 10:42:34 +01:00
Patrick 'Quezler' Mounier
9bdf475049 Stash cursed loading dock 2020-01-08 10:41:09 +01:00
Patrick 'Quezler' Mounier
35afc94d34 Blend prototype 2020-01-08 10:27:06 +01:00
Anuken
cf5e8c6463 Point planet renderer 2020-01-07 20:09:21 -05:00
Anuken
6f25ba4541 squares. 2020-01-07 13:55:45 -05:00
Anuken
c611ce9d58 Removed old Matrix4 class 2020-01-07 11:16:04 -05:00
Anuken
c8980163e9 3D progress 2020-01-07 10:32:00 -05:00
Patrick 'Quezler' Mounier
8fc84fad0a Scale foobar correctly with different capacities 2020-01-07 10:48:31 +01:00
Patrick 'Quezler' Mounier
12c3b22b7c Fix poofing ¬ working if conveyor was backed up 2020-01-07 10:44:37 +01:00
Patrick 'Quezler' Mounier
252817abb7 Bar 2020-01-07 10:33:58 +01:00
Patrick 'Quezler' Mounier
781fbb6255 Foo 2020-01-07 10:33:04 +01:00
Patrick 'Quezler' Mounier
add19ed7f1 Start rotating 50% through reload 2020-01-07 10:17:24 +01:00
Anuken
c474b082cd Cleanup 2020-01-07 00:24:37 -05:00
Anuken
3ae8065cf1 Merge 2020-01-06 17:20:16 -05:00
Patrick 'Quezler' Mounier
ecae603f50 Prevent (world border) crash
Learned my lesson from the diode :)
2020-01-06 18:13:40 +01:00
Patrick 'Quezler' Mounier
0b3d4da92d Block trading 2020-01-06 18:12:10 +01:00
Patrick 'Quezler' Mounier
6e8ba927dd Final cleanup before the draft phase ends ❤️ 2020-01-06 18:09:19 +01:00
Patrick 'Quezler' Mounier
9b55eeaa38 Rename batches to something simpler 2020-01-06 18:04:56 +01:00
Patrick 'Quezler' Mounier
1a177ef239 Rephase dotted 2020-01-06 18:00:43 +01:00
Patrick 'Quezler' Mounier
207d95dbd8 Refractor away throughput stat 2020-01-06 17:57:14 +01:00
Patrick 'Quezler' Mounier
78951113d6 Remove maxunits stat entry 2020-01-06 17:55:02 +01:00
Patrick 'Quezler' Mounier
58e5931b83 Fix caveat of 〃 2020-01-06 17:51:12 +01:00
Patrick 'Quezler' Mounier
9891e971ea Only unload if its ¬ the tile it spawned on
¬ loading if it both start & end plays weird
¬ unloading if it both start & end plays weird
——
so only unloading if the origin tile is ¬ the unload tile is the only smooth option

sadly this does block player feeding the conveyor at the last tile in the chain
2020-01-06 17:47:22 +01:00
Patrick 'Quezler' Mounier
6b3dc669eb Merge branch 'master' into crater 2020-01-06 17:37:47 +01:00
Patrick 'Quezler' Mounier
c6299c8f2c Add throughput stat entry 2020-01-05 15:28:28 +01:00
Patrick 'Quezler' Mounier
76fa8bef81 Add fixme 2020-01-05 10:37:32 +01:00
Patrick 'Quezler' Mounier
2ce30ece6c Prevent smoke while placing 2020-01-05 10:35:15 +01:00
Patrick 'Quezler' Mounier
2b4401c753 Prevent accepting items from the front 2020-01-05 10:32:58 +01:00
Patrick 'Quezler' Mounier
4494503e6b Get rid of computed boolean 2020-01-05 10:31:51 +01:00
Patrick 'Quezler' Mounier
2948738e33 Refractor away overhead 2020-01-05 10:28:43 +01:00
Patrick 'Quezler' Mounier
095c65f36c Remove crater from bundle 2020-01-04 21:10:09 +01:00
Patrick 'Quezler' Mounier
7adf8cfdef Merge branch 'master' into crater 2020-01-04 20:05:50 +01:00
Patrick 'Quezler' Mounier
2666b564c2 Revamp comment 2020-01-03 20:19:44 +01:00
Patrick 'Quezler' Mounier
0ae627c56b Revert "Tweak next tile treshold"
This reverts commit a629aeef75.
2020-01-03 19:03:34 +01:00
Patrick 'Quezler' Mounier
81de3d2c7d Fix typo 2020-01-03 18:49:33 +01:00
Patrick 'Quezler' Mounier
57cd03c0c2 Remove crater inactivity 2020-01-03 18:43:06 +01:00
Patrick 'Quezler' Mounier
a629aeef75 Tweak next tile treshold 2020-01-03 18:35:51 +01:00
Patrick 'Quezler' Mounier
b8e32304a3 Purge newline 2020-01-03 17:45:29 +01:00
Patrick 'Quezler' Mounier
e2d0ab5161 Move bundle entries around 2020-01-03 17:42:05 +01:00
Patrick 'Quezler' Mounier
73040de839 Change bundle description 2020-01-03 17:41:05 +01:00
Patrick 'Quezler' Mounier
097334726d Change respawn & idle from frames to integers 2020-01-03 17:36:05 +01:00
Patrick 'Quezler' Mounier
6efcbe69a0 Get rid of compressable 2020-01-03 17:29:08 +01:00
Patrick 'Quezler' Mounier
f6af699428 Revert "🎩"
This reverts commit 10e4268dd5.

# Conflicts:
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
2020-01-03 17:26:19 +01:00
Patrick 'Quezler' Mounier
5a21387762 Add inb4 2020-01-03 17:23:57 +01:00
Patrick 'Quezler' Mounier
1f6d3dca0e Give craters surfboards to stream 2020-01-03 17:18:48 +01:00
Patrick 'Quezler' Mounier
0b0007502f Revert "Differentiate texture from armored conveyor"
This reverts commit 59451fcc0b.
2020-01-03 17:09:13 +01:00
Patrick 'Quezler' Mounier
59451fcc0b Differentiate texture from armored conveyor
By removing the turtleshell it looks less armored while still somewhat high-tech (ish)
2020-01-03 17:09:06 +01:00
Patrick 'Quezler' Mounier
12b034d16b Tweak default conveyor stats 2020-01-03 16:47:37 +01:00
Patrick 'Quezler' Mounier
68dca82ab8 Refractor for readability 2020-01-03 16:42:28 +01:00
Patrick 'Quezler' Mounier
edbe50d8c4 Get rid of track enum 2020-01-03 16:20:23 +01:00
Patrick 'Quezler' Mounier
644d54c3f1 Move drawer back from crater to tile 2020-01-03 16:12:38 +01:00
Patrick 'Quezler' Mounier
f4a7f98b0b Fix blending 2020-01-03 16:00:58 +01:00
Patrick 'Quezler' Mounier
315bb483f2 Replace headless check with inactivity 2020-01-03 12:30:55 +01:00
Patrick 'Quezler' Mounier
d843f29e09 Make crater speed configurable 2020-01-03 12:19:33 +01:00
Patrick 'Quezler' Mounier
0807e1bd25 List boostable item capacity in stats 2020-01-03 12:13:33 +01:00
Patrick 'Quezler' Mounier
4aaaf3292e Add cooldown after crater moved 2020-01-03 11:56:29 +01:00
Patrick 'Quezler' Mounier
8c7d8abddd Inflate crater properties 2020-01-03 11:40:45 +01:00
Patrick 'Quezler' Mounier
aa64dcfe27 Update target before launch
So it has the chance to make room before it receives the crater from the caller.
2020-01-03 11:28:46 +01:00
Patrick 'Quezler' Mounier
f94c7e6105 Move launch checks 2020-01-03 11:23:47 +01:00
Patrick 'Quezler' Mounier
7b0456a227 Launch only when full 2020-01-03 11:11:54 +01:00
Patrick 'Quezler' Mounier
cad13b61bb Merge branch 'master' into crater
# Conflicts:
#	core/src/mindustry/mod/ClassAccess.java
2020-01-03 08:01:22 +01:00
Patrick 'Quezler' Mounier
4a238cff77 Begone 🔭 2020-01-02 22:09:12 +01:00
Patrick 'Quezler' Mounier
3f754116d8 Tweak crater movement 2020-01-02 22:06:41 +01:00
Patrick 'Quezler' Mounier
13e378c7d3 Birth base conveyor class 2020-01-02 22:06:18 +01:00
Patrick 'Quezler' Mounier
e289f13d27 - newline 2020-01-02 21:40:04 +01:00
Patrick 'Quezler' Mounier
f0bfe24008 Remove crater bundle entry 2020-01-02 21:34:56 +01:00
Patrick 'Quezler' Mounier
0ae6527584 Sacrifice hivemind to convert craters to drawings
Sad, yes, but crater units would never sync well over the net in its current state, so faking them unto conveyors is the only real option.

Forgive me future ai overlord <3
2020-01-02 21:29:19 +01:00
Patrick 'Quezler' Mounier
10e4268dd5 🎩
Leaving this here until it gets merged or something :)
2020-01-02 09:02:37 +01:00
Patrick 'Quezler' Mounier
317f40eecd Use tree score instead of looping each crater twice 2020-01-02 08:51:49 +01:00
Patrick 'Quezler' Mounier
ec32f65646 Avoid recursion 2020-01-02 08:11:37 +01:00
Patrick 'Quezler' Mounier
f1a455d7f1 Uproot the way the update order works 2020-01-02 07:57:32 +01:00
Patrick 'Quezler' Mounier
481c5753e7 Fixes a crash somehow 2020-01-01 22:23:10 +01:00
Patrick 'Quezler' Mounier
7f434fb625 ❤️
https://youtu.be/gzkItR1jkKY?t=105
2020-01-01 20:55:20 +01:00
Patrick 'Quezler' Mounier
5c31009495 Remove unused alteration 2020-01-01 20:54:29 +01:00
Patrick 'Quezler' Mounier
549efa472a Always keep moving towards its purpose 2020-01-01 20:51:26 +01:00
Patrick 'Quezler' Mounier
70b43ee31c Keep unloading if it succeeds 2020-01-01 20:45:22 +01:00
Patrick 'Quezler' Mounier
2fcdae4c7e Dirty, but works even better <3 2020-01-01 20:32:09 +01:00
Patrick 'Quezler' Mounier
15311fa4ed This looks acceptable 2020-01-01 20:31:01 +01:00
Patrick 'Quezler' Mounier
0ce1164ffa Brainstorm dibs logic 2020-01-01 20:29:14 +01:00
Patrick 'Quezler' Mounier
12f51d477e Purge anti collision 2020-01-01 20:17:52 +01:00
Patrick 'Quezler' Mounier
00933f0e30 Merge branch 'master' into crater 2020-01-01 20:13:21 +01:00
Patrick 'Quezler' Mounier
197118e16e Doesn’t really close the gap 2020-01-01 20:13:07 +01:00
Patrick 'Quezler' Mounier
b8cede1cf5 Start reworking tile assigner 2020-01-01 20:07:22 +01:00
Patrick 'Quezler' Mounier
163bf15930 Rework dibs into hivemind
Imperfect, will require tweaking.
2020-01-01 20:06:47 +01:00
Patrick 'Quezler' Mounier
1bcfc69206 Tweak stat pages 2020-01-01 14:01:54 +01:00
Patrick 'Quezler' Mounier
c3186b63ce Rename compression to plastanium
Breaking change.
2020-01-01 13:43:14 +01:00
Patrick 'Quezler' Mounier
8cd03c8a06 Add techtree entry 2020-01-01 13:34:08 +01:00
Patrick 'Quezler' Mounier
fd5f914845 Holy sh*t this looks smooth 2020-01-01 11:47:36 +01:00
Patrick 'Quezler' Mounier
07d23b4489 Merge branch 'master' into crater 2020-01-01 11:40:55 +01:00
Patrick 'Quezler' Mounier
6f2dd3b708 Make its movement a bit more robotic
Far from smooth, but its better than a mass suicide orgy.
2019-12-31 22:32:41 +01:00
Patrick 'Quezler' Mounier
c6c3357979 Stash revised 〃 2019-12-31 21:28:59 +01:00
Patrick 'Quezler' Mounier
ed0809515e Revert "Experiment with reserving tiles"
This reverts commit b46455642a.
2019-12-31 21:10:17 +01:00
Patrick 'Quezler' Mounier
b46455642a Experiment with reserving tiles 2019-12-31 21:10:12 +01:00
Patrick 'Quezler' Mounier
9c1eca6d31 Merge remote-tracking branch 'anuken/master' into crater 2019-12-31 18:55:06 +01:00
Patrick 'Quezler' Mounier
7726d94566 Revert "Stash failed collision preventer"
This reverts commit 0383d3b8d7.
2019-12-31 18:54:45 +01:00
Patrick 'Quezler' Mounier
0383d3b8d7 Stash failed collision preventer 2019-12-31 18:54:38 +01:00
Patrick 'Quezler' Mounier
830f67e001 Merge branch 'master' into crater 2019-12-31 17:31:09 +01:00
Patrick 'Quezler' Mounier
296f195a7e Unload only in facing direction 2019-12-30 14:24:09 +01:00
Patrick 'Quezler' Mounier
f52fe3052e Fix overflowing craters 2019-12-30 13:14:00 +01:00
Patrick 'Quezler' Mounier
744d863fe9 Move crater critter creator 2019-12-30 13:03:48 +01:00
Patrick 'Quezler' Mounier
0582382778 Refracor track with comments 2019-12-30 12:48:02 +01:00
Patrick 'Quezler' Mounier
4cbd11a213 Refracor crater with comments 2019-12-30 12:17:21 +01:00
Patrick 'Quezler' Mounier
bf9207fe4e Merge branch 'master' into crater 2019-12-30 10:55:06 +01:00
Patrick 'Quezler' Mounier
56351b427b Revert "Attempt to remove unused regions"
This reverts commit 4f5b737f7c.
2019-12-30 10:53:50 +01:00
Patrick 'Quezler' Mounier
4f5b737f7c Attempt to remove unused regions
Failed, conveyor code depends to much on it, gonna revert this.
2019-12-30 10:53:45 +01:00
Patrick 'Quezler' Mounier
20a511d940 Merge branch 'master' into crater 2019-12-29 20:50:55 +01:00
Patrick 'Quezler' Mounier
d99f163cac Fix crash when fed directly by a conveyor 2019-12-29 20:49:06 +01:00
Patrick 'Quezler' Mounier
899137fbf7 Fix blending 2019-12-29 20:46:57 +01:00
Patrick 'Quezler' Mounier
971b1542ba Balance capacity 2019-12-29 20:38:44 +01:00
Patrick 'Quezler' Mounier
6b091b4d31 Make craters affected by overdrive projectors 2019-12-29 20:31:11 +01:00
Patrick 'Quezler' Mounier
326f75cbda Merge branch 'master' into crater 2019-12-29 19:09:27 +01:00
Anuken
c250b1d24a Fixes 2019-12-28 11:16:35 -05:00
Patrick 'Quezler' Mounier
5d62b1b318 Merge branch 'master' into crater 2019-12-28 09:39:21 +01:00
Patrick 'Quezler' Mounier
e0cfbc7609 All hail the cuteness of this crater roomba critter 2019-12-27 20:45:27 +01:00
Anuken
186a2aaa45 Merge branches 'master' and 'mech-rework' of https://github.com/Anuken/Mindustry into mech-rework
# Conflicts:
#	core/assets/sprites/block_colors.png
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/sprites/sprites3.png
#	core/assets/sprites/sprites5.png
#	core/src/mindustry/ai/BlockIndexer.java
#	core/src/mindustry/core/World.java
#	core/src/mindustry/entities/traits/Entity.java
#	core/src/mindustry/entities/type/BaseEntity.java
#	core/src/mindustry/entities/type/TileEntity.java
#	core/src/mindustry/world/blocks/defense/MendProjector.java
#	core/src/mindustry/world/blocks/defense/OverdriveProjector.java
#	core/src/mindustry/world/blocks/production/Drill.java
#	gradle.properties
2019-12-27 01:41:06 -05:00
Anuken
c307fc02cf Full merge 2019-12-25 13:34:27 -05:00
Anuken
c681cc5cf8 Compile fixes 2019-12-25 13:25:44 -05:00
Anuken
1e7c83f0c9 Partial merge 2019-12-25 13:22:36 -05:00
Anuken
48daf12810 three dee 2019-12-24 21:45:53 -05:00
Anuken
32d28a4070 Merge branches '6.0' and 'master' of https://github.com/Anuken/Mindustry into 6.0
# Conflicts:
#	core/assets/sprites/block_colors.png
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/sprites/sprites2.png
#	core/assets/sprites/sprites3.png
#	core/assets/sprites/sprites5.png
#	core/src/io/anuke/mindustry/ctype/ContentType.java
#	core/src/io/anuke/mindustry/ctype/UnlockableContent.java
#	core/src/io/anuke/mindustry/io/LegacyMapIO.java
#	core/src/io/anuke/mindustry/type/WeatherEvent.java
#	gradle.properties
2019-12-24 12:40:23 -05:00
Anuken
8445c8e974 speed 2019-12-03 00:21:11 -05:00
Anuken
9e3870acbe Merge branches 'master' and 'mech-rework' of https://github.com/Anuken/Mindustry into mech-rework
# Conflicts:
#	core/assets/sprites/block_colors.png
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/sprites/sprites3.png
#	core/assets/sprites/sprites5.png
#	core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java
#	gradle.properties
2019-12-02 22:45:05 -05:00
Anuken
78f146fbcf Merge branches '6.0' and 'master' of https://github.com/Anuken/Mindustry into 6.0
# Conflicts:
#	core/assets/sprites/block_colors.png
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/sprites/sprites3.png
#	core/assets/sprites/sprites5.png
#	core/src/io/anuke/mindustry/graphics/Shaders.java
#	gradle.properties
2019-12-01 17:42:56 -05:00
Anuken
0c0573a7b1 Filter fixes 2019-11-16 13:07:40 -05:00
Anuken
aa6229be4b Fixed spawn/core select filters 2019-11-16 13:04:04 -05:00
Anuken
94cf054312 Fixed unit tests 2019-11-16 12:40:26 -05:00
Anuken
edfe58cb38 Refactoring of tile storage, filters 2019-11-16 12:34:29 -05:00
Anuken
8798fa101a Merge 2019-11-16 00:15:45 -05:00
Anuken
e6647484bd Prototyping mechs 2019-11-12 23:01:10 -05:00
Anuken
4b70b2fbcc Cleanup & refactor of projectors 2019-11-12 17:18:27 -05:00
Anuken
7d9963d542 Merge 2019-11-11 19:09:37 -05:00
Anuken
8952dd7f56 Begin work on 6.0 2019-11-10 14:05:29 -05:00
BasedUser
ccc1f6296c Merge pull request #3 from Anuken/master
a
2019-10-25 08:55:14 +03:00
Anuken
4c7259843c Merge branch 'master' of https://github.com/Anuken/Mindustry into mech-rework
# Conflicts:
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
2019-10-20 10:21:35 -04:00
Anuken
ddf2ce353f Merge branches 'master' and 'mech-rework' of https://github.com/Anuken/Mindustry into mech-rework 2019-10-16 19:46:20 -04:00
Anuken
9f9e838a3a Alpha stuff 2019-10-16 18:57:19 -04:00
Anuken
0f52fc1f4f Alpha sprite 2019-10-16 18:36:02 -04:00
Anuken
71be99ad6d Tweaks 2019-10-16 17:30:47 -04:00
Anuken
4b5d3ba4d8 Added laser bullet type 2019-10-16 16:33:09 -04:00
Anuken
b2ea1b7ca5 Some refactoring 2019-10-16 14:22:54 -04:00
Anuken
47f423540d Vanguard mech visuals 2019-10-15 20:35:43 -04:00
Anuken
a3871cca90 Added correctly named mech pads for alpha/dart 2019-10-15 18:32:47 -04:00
Anuken
923b3eba96 h 2019-10-15 14:26:11 -04:00
Anuken
cee9c8fa01 Merge remote-tracking branch 'origin/mech-rework' into mech-rework
# Conflicts:
#	gradle.properties
2019-10-15 09:19:06 -04:00
BasedUser
36edbbe2df Merge pull request #1 from Anuken/master
merge with Anuken/Mindustry
2019-10-14 13:51:32 +03:00
Anuken
8366dfcece Vanguard starter mech 2019-10-13 12:38:14 -04:00
Anuken
4b7b07460a Nestable set iteration 2019-10-13 12:09:49 -04:00
Anuken
35c13d38a4 Base mech 2019-10-12 18:12:28 -04:00
1393 changed files with 94072 additions and 48206 deletions

View File

@@ -2,7 +2,7 @@
name: Bug report name: Bug report
about: Create a report to help fix an issue. about: Create a report to help fix an issue.
title: '' title: ''
labels: '' labels: bug
assignees: '' assignees: ''
--- ---
@@ -13,4 +13,15 @@ assignees: ''
**Issue**: *Explain your issue in detail.* **Issue**: *Explain your issue in detail.*
**Steps to reproduce**: *How you happened across the issue, and what you were doing at the time.* **Steps to reproduce**: *How you happened across the issue, and what exactly you did to make the bug happen.*
**Link(s) to mod(s) used**: *The mod repositories or zip files that are related to the issue, if applicable.*
**Save file**: *The save file you were playing on when the bug happened, if applicable.*
**Crash report**: *The contents of relevant crash report files. REQUIRED if you are reporting a crash.*
---
*Place an X (no spaces) between the brackets to confirm that you have read the line below.*
- [ ] **I have searched the closed and open issues to make sure that this problem has not already been reported.**

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Feature request
url: https://github.com/Anuken/Mindustry-Suggestions/issues/new/choose
about: Do not make a new issue for feature requests! Instead, post it in suggestions repository.
- name: Question
url: https://discord.com/invite/mindustry
about: Questions about the game should be asked in the Discord, not in the issue tracker.

View File

@@ -1,11 +0,0 @@
---
name: Feature request
about: Do not make a new issue for feature requests! Instead, post in the suggestions
repository. See the README.
title: ''
labels: invalid
assignees: ''
---
**Do not make a new issue for feature requests!** Instead, post it in suggestions repository: https://github.com/Anuken/Mindustry-Suggestions/issues/new/choose

View File

@@ -3,15 +3,26 @@ name: Java CI
on: [push] on: [push]
jobs: jobs:
build: buildJava8:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v1 - uses: actions/checkout@v1
- name: Set up JDK 1.8 - name: Set up JDK 8
uses: actions/setup-java@v1 uses: actions/setup-java@v1
with: with:
java-version: 1.8 java-version: 8
#- name: Run unit tests with gradle - name: Run unit tests with gradle and Java 8
# run: ./gradlew test run: ./gradlew compileJava
buildJava14:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up JDK 14
uses: actions/setup-java@v1
with:
java-version: 14
- name: Run unit tests with gradle and Java 14
run: ./gradlew compileJava

13
.gitignore vendored
View File

@@ -10,6 +10,7 @@ logs/
/desktop/mindustry-saves/ /desktop/mindustry-saves/
/desktop/mindustry-maps/ /desktop/mindustry-maps/
/desktop/gifexport/ /desktop/gifexport/
/gifs/
/core/lib/ /core/lib/
/ios/assets/ /ios/assets/
/core/assets-raw/sprites/generated/ /core/assets-raw/sprites/generated/
@@ -18,6 +19,7 @@ logs/
/annotations/out/ /annotations/out/
/net/build/ /net/build/
/tools/build/ /tools/build/
/core/build/
/tests/build/ /tests/build/
/server/build/ /server/build/
changelog changelog
@@ -27,7 +29,6 @@ core/assets/saves/
/core/assets/saves/ /core/assets/saves/
steam_appid.txt steam_appid.txt
/test_files/ /test_files/
/annotations/build/
/android/assets/mindustry-maps/ /android/assets/mindustry-maps/
/android/assets/mindustry-saves/ /android/assets/mindustry-saves/
/core/assets/gifexport/ /core/assets/gifexport/
@@ -39,11 +40,9 @@ steam_appid.txt
ios/robovm.properties ios/robovm.properties
packr-out/ packr-out/
config/ config/
changelog
*.gif *.gif
/core/assets/saves/
/out/
/core/assets/basepartnames
version.properties version.properties
.attach_* .attach_*
@@ -80,9 +79,11 @@ com_crashlytics_export_strings.xml
/android/bin/ /android/bin/
/core/bin/ /core/bin/
/desktop/bin/ /desktop/bin/
/html/bin/
/ios/bin/ /ios/bin/
/ios-moe/bin/ /annotations/bin/
/server/bin/
/tests/bin/
/tools/bin/
*.tmp *.tmp
*.bak *.bak
*.swp *.swp

View File

@@ -1,10 +1,10 @@
jdk: jdk:
- openjdk8 - openjdk14
dist: trusty dist: xenial
android: android:
components: components:
- android-29 - android-29
- build-tools-29.0.2 - build-tools-29.0.3
script: script:
- git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds - git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
@@ -20,6 +20,12 @@ script:
- "./gradlew test" - "./gradlew test"
- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}" - "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}"
- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}" - "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}"
- "./gradlew core:javadoc"
- cd ../
- git clone --depth=1 https://github.com/MindustryGame/docs.git
- cp -a Mindustry/core/build/docs/javadoc/. docs/
- cd docs
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git add .; git commit -m "Update ${TRAVIS_BUILD_NUMBER}"; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/MindustryGame/docs; fi
deploy: deploy:
- provider: releases - provider: releases
skip_cleanup: true skip_cleanup: true

View File

@@ -26,11 +26,12 @@ This means:
- 4 spaces indentation - 4 spaces indentation
- `camelCase`, **even for constants or enums**. Why? Because `SCREAMING_CASE` is ugly, annoying to type and does not achieve anything useful. Constants are *less* dangerous than variables, not more. - `camelCase`, **even for constants or enums**. Why? Because `SCREAMING_CASE` is ugly, annoying to type and does not achieve anything useful. Constants are *less* dangerous than variables, not more.
- No underscores for anything. (Yes, I know `Bindings` violates this principle, but that's for legacy reasons and really should be cleaned up some day) - No underscores for anything. (Yes, I know `Bindings` violates this principle, but that's for legacy reasons and really should be cleaned up some day)
- Do not use braceless `if/else` statements. `if(x) statement else statement2` should **never** be done. In very specific situations, having braceless if-statements on one line is allowed: `if(cond) return;` would be valid.
Import [this style file](.github/Mindustry-CodeStyle-IJ.xml) into IntelliJ to get correct formatting when developing Mindustry. Import [this style file](.github/Mindustry-CodeStyle-IJ.xml) into IntelliJ to get correct formatting when developing Mindustry.
#### Do not use incompatible Java features (java.util.function, java.awt). #### Do not use incompatible Java features (java.util.function, java.awt).
Android [does not support](https://developer.android.com/studio/write/java8-support#supported_features) many of Java 8's features, such as the packages `java.util.function`, `java.util.stream` or `forEach` in collections. Do not use these in your code. Android and RoboVM (iOS) do not support many of Java 8's features, such as the packages `java.util.function`, `java.util.stream` or `forEach` in collections. Do not use these in your code.
If you need to use functional interfaces, use the ones in `arc.func`, which are more or less the same with different naming schemes. If you need to use functional interfaces, use the ones in `arc.func`, which are more or less the same with different naming schemes.
The same applies to any class *outside* of the standard `java.[n]io` / `java.net` / `java.util` packages: Most of them are not supported. The same applies to any class *outside* of the standard `java.[n]io` / `java.net` / `java.util` packages: Most of them are not supported.
@@ -39,20 +40,20 @@ In general, if you are using IntelliJ, you should be warned about platform incom
#### Use `arc` collections and classes when possible. #### Use `arc` collections and classes when possible.
Instead of using `java.util.List`, `java.util.HashMap`, and other standard Java collections, use `Array`, `ObjectMap` and other equivalents from `arc.struct`. Instead of using `java.util.List`, `java.util.HashMap`, and other standard Java collections, use `Seq`, `ObjectMap` and other equivalents from `arc.struct`.
Why? Because that's what the rest of the codebase uses, and the standard collections have a lot of cruft and usability issues associated with them. Why? Because that's what the rest of the codebase uses, and the standard collections have a lot of cruft and usability issues associated with them.
In the rare case that concurrency is required, you may use the standard Java classes for that purpose (e.g. `CopyOnWriteArrayList`). In the rare case that concurrency is required, you may use the standard Java classes for that purpose (e.g. `CopyOnWriteArrayList`).
What you'll usually need to change: What you'll usually need to change:
- `HashSet` -> `ObjectSet` - `HashSet` -> `ObjectSet`
- `HashMap` -> `ObjectMap` - `HashMap` -> `ObjectMap`
- `List` / `ArrayList` / `Stack` -> `Array` - `List` / `ArrayList` / `Stack` -> `Seq`
- `java.util.Queue` -> `arc.struct.Queue` - `java.util.Queue` -> `arc.struct.Queue`
- *Many others* - *Many others*
#### Avoid boxed types (Integer, Boolean) #### Avoid boxed types (Integer, Boolean)
Never create variables or collections with boxed types `Array<Integer>` or `ObjectMap<Integer, ...>`. Use the collections specialized for this task, e.g. `IntArray` and `IntMap`. Never create variables or collections with boxed types `Seq<Integer>` or `ObjectMap<Integer, ...>`. Use the collections specialized for this task, e.g. `IntSeq` and `IntMap`.
#### Do not allocate anything if possible. #### Do not allocate anything if possible.
@@ -67,3 +68,6 @@ If something needs to be encapsulated in the future, IntelliJ can handle it with
#### Do not create methods unless necessary. #### Do not create methods unless necessary.
Unless a block of code is very large or used in more than 1-2 places, don't split it up into a separate method. Making unnecessary methods only creates confusion, and may slightly decrease performance. Unless a block of code is very large or used in more than 1-2 places, don't split it up into a separate method. Making unnecessary methods only creates confusion, and may slightly decrease performance.
## Other Notes
If you would like your name to appear in the game's credits, add it to the [list of contributors](https://github.com/Anuken/Mindustry/blob/master/core/assets/contributors) as part of your PR.

View File

@@ -7,6 +7,7 @@ A sandbox tower defense game written in Java.
_[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_ _[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_
_[Wiki](https://mindustrygame.github.io/wiki)_ _[Wiki](https://mindustrygame.github.io/wiki)_
_[Javadoc](https://mindustrygame.github.io/docs/)_
### Contributing ### Contributing
@@ -14,10 +15,10 @@ See [CONTRIBUTING](CONTRIBUTING.md).
### Building ### Building
Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). Old builds might still be on [jenkins](https://jenkins.hellomouse.net/job/mindustry/). Bleeding-edge builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases).
If you'd rather compile on your own, follow these instructions. If you'd rather compile on your own, follow these instructions.
First, make sure you have [JDK 8](https://adoptopenjdk.net/) installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands: First, make sure you have [JDK 14](https://adoptopenjdk.net/) installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands:
#### Windows #### Windows
@@ -38,9 +39,10 @@ Server builds are bundled with each released build (in Releases). If you'd rathe
#### Android #### Android
1. Install the Android SDK [here.](https://developer.android.com/studio#downloads) Make sure you're downloading the "Command line tools only", as Android Studio is not required. 1. Install the Android SDK [here.](https://developer.android.com/studio#downloads) Make sure you're downloading the "Command line tools only", as Android Studio is not required.
2. Create a file named `local.properties` inside the Mindustry directory, with its contents looking like this: `sdk.dir=<Path to Android SDK you just downloaded, without these bracket>`. For example, if you're on Windows and installed the tools to C:\\tools, your local.properties would contain `sdk.dir=C:\\tools` (*note the double backslashes are required instead of single ones!*). 2. Set the `ANDROID_HOME` environment variable to point to your unzipped Android SDK directory.
3. Run `gradlew android:assembleDebug` (or `./gradlew` if on linux/mac). This will create an unsigned APK in `android/build/outputs/apk`. 3. Run `gradlew android:assembleDebug` (or `./gradlew` if on linux/mac). This will create an unsigned APK in `android/build/outputs/apk`.
4. (Optional) To debug the application on a connected phone, do `gradlew android:installDebug android:run`. It is **highly recommended** to use IntelliJ for this instead, however.
To debug the application on a connected phone, run `gradlew android:installDebug android:run`.
##### Troubleshooting ##### Troubleshooting

View File

@@ -17,7 +17,7 @@
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"
android:appCategory="game" android:appCategory="game"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/GdxTheme" android:fullBackupContent="@xml/backup_rules"> android:theme="@style/ArcTheme" android:fullBackupContent="@xml/backup_rules">
<meta-data android:name="android.max_aspect" android:value="2.1"/> <meta-data android:name="android.max_aspect" android:value="2.1"/>
<activity <activity
android:name="mindustry.android.AndroidLauncher" android:name="mindustry.android.AndroidLauncher"

View File

@@ -8,6 +8,8 @@ buildscript{
} }
dependencies{ dependencies{
//IMPORTANT NOTICE: any version of the plugin after 3.4.1 will break builds
//it appears abstract methods don't get desugared properly (if at all)
classpath 'com.android.tools.build:gradle:3.4.1' classpath 'com.android.tools.build:gradle:3.4.1'
} }
} }
@@ -19,9 +21,7 @@ configurations{ natives }
repositories{ repositories{
mavenCentral() mavenCentral()
jcenter() jcenter()
maven{ maven{ url "https://maven.google.com" }
url "https://maven.google.com"
}
} }
dependencies{ dependencies{
@@ -29,16 +29,13 @@ dependencies{
implementation arcModule("backends:backend-android") implementation arcModule("backends:backend-android")
implementation 'com.jakewharton.android.repackaged:dalvik-dx:9.0.0_r3' implementation 'com.jakewharton.android.repackaged:dalvik-dx:9.0.0_r3'
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" natives "com.github.Anuken.Arc:natives-android:${getArcHash()}"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a" natives "com.github.Anuken.Arc:natives-freetype-android:${getArcHash()}"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" natives "com.github.Anuken.Arc:natives-box2d-android:${getArcHash()}"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi" //android dependencies magically disappear during compilation, thanks gradle!
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a" if(new File(projectDir.parent, '../Arc').exists()) compileOnly fileTree(dir: '../../Arc/backends/backend-android/libs', include: ['*.jar'])
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64"
} }
task deploy(type: Copy){ task deploy(type: Copy){
@@ -50,7 +47,7 @@ task deploy(type: Copy){
} }
android{ android{
buildToolsVersion '29.0.2' buildToolsVersion '29.0.3'
compileSdkVersion 29 compileSdkVersion 29
sourceSets{ sourceSets{
main{ main{
@@ -119,25 +116,11 @@ android{
// the natives configuration, and extracts them to the proper libs/ folders // the natives configuration, and extracts them to the proper libs/ folders
// so they get packed with the APK. // so they get packed with the APK.
task copyAndroidNatives(){ task copyAndroidNatives(){
file("libs/armeabi/").mkdirs()
file("libs/armeabi-v7a/").mkdirs()
file("libs/arm64-v8a/").mkdirs()
file("libs/x86_64/").mkdirs()
file("libs/x86/").mkdirs()
configurations.natives.files.each{ jar -> configurations.natives.files.each{ jar ->
def outputDir = null
if(jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a")
if(jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")
if(jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi")
if(jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64")
if(jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86")
if(outputDir != null){
copy{ copy{
from zipTree(jar) from zipTree(jar)
into outputDir into file("libs/")
include "*.so" include "**"
}
} }
} }
} }

View File

@@ -1,29 +0,0 @@
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
-verbose
-verbose
-ignorewarnings
-keep class mindustry.game.Rules
-keep class mindustry.desktop.DesktopLauncher
-keepclasseswithmembers public class * {
public static void main(java.lang.String[]);
}

View File

@@ -1,13 +0,0 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-19

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="GdxTheme" parent="android:Theme.Material.NoActionBar"> <style name="ArcTheme" parent="android:Theme.Material.NoActionBar">
<item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item> <item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation</item> <item name="android:windowAnimationStyle">@android:style/Animation</item>

View File

@@ -1,6 +1,6 @@
<resources> <resources>
<style name="GdxTheme" parent="android:Theme"> <style name="ArcTheme" parent="android:Theme">
<item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item> <item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation</item> <item name="android:windowAnimationStyle">@android:style/Animation</item>

View File

@@ -24,6 +24,7 @@ import mindustry.ui.dialogs.*;
import java.io.*; import java.io.*;
import java.lang.System; import java.lang.System;
import java.lang.Thread.*;
import java.util.*; import java.util.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -37,6 +38,20 @@ public class AndroidLauncher extends AndroidApplication{
@Override @Override
protected void onCreate(Bundle savedInstanceState){ protected void onCreate(Bundle savedInstanceState){
UncaughtExceptionHandler handler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler((thread, error) -> {
CrashSender.log(error);
//try to forward exception to system handler
if(handler != null){
handler.uncaughtException(thread, error);
}else{
error.printStackTrace();
System.exit(1);
}
});
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
if(doubleScaleTablets && isTablet(this.getContext())){ if(doubleScaleTablets && isTablet(this.getContext())){
Scl.setAddition(0.5f); Scl.setAddition(0.5f);
@@ -50,25 +65,7 @@ public class AndroidLauncher extends AndroidApplication{
} }
@Override @Override
public String getUUID(){ public rhino.Context getScriptContext(){
try{
String s = Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);
int len = s.length();
byte[] data = new byte[len / 2];
for(int i = 0; i < len; i += 2){
data[i / 2] = (byte)((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i + 1), 16));
}
String result = new String(Base64Coder.encode(data));
if(result.equals("AAAAAAAAAOA=")) throw new RuntimeException("Bad UUID.");
return result;
}catch(Exception e){
return super.getUUID();
}
}
@Override
public org.mozilla.javascript.Context getScriptContext(){
return AndroidRhinoContext.enter(getContext().getCacheDir()); return AndroidRhinoContext.enter(getContext().getCacheDir());
} }
@@ -111,7 +108,7 @@ public class AndroidLauncher extends AndroidApplication{
}); });
}else if(VERSION.SDK_INT >= VERSION_CODES.M && !(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && }else if(VERSION.SDK_INT >= VERSION_CODES.M && !(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){ checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
chooser = new FileChooser(open ? "$open" : "$save", file -> file.extension().equalsIgnoreCase(extension), open, file -> { chooser = new FileChooser(open ? "@open" : "@save", file -> file.extension().equalsIgnoreCase(extension), open, file -> {
if(!open){ if(!open){
cons.get(file.parent().child(file.nameWithoutExtension() + "." + extension)); cons.get(file.parent().child(file.nameWithoutExtension() + "." + extension));
}else{ }else{
@@ -144,9 +141,8 @@ public class AndroidLauncher extends AndroidApplication{
}, new AndroidApplicationConfiguration(){{ }, new AndroidApplicationConfiguration(){{
useImmersiveMode = true; useImmersiveMode = true;
depth = 0;
hideStatusBar = true; hideStatusBar = true;
errorHandler = CrashSender::log; stencil = 8;
}}); }});
checkFiles(getIntent()); checkFiles(getIntent());
@@ -220,10 +216,10 @@ public class AndroidLauncher extends AndroidApplication{
SaveSlot slot = control.saves.importSave(file); SaveSlot slot = control.saves.importSave(file);
ui.load.runLoadSave(slot); ui.load.runLoadSave(slot);
}catch(IOException e){ }catch(IOException e){
ui.showException("$save.import.fail", e); ui.showException("@save.import.fail", e);
} }
}else{ }else{
ui.showErrorMessage("$save.import.invalid"); ui.showErrorMessage("@save.import.invalid");
} }
}else if(map){ //open map }else if(map){ //open map
Fi file = Core.files.local("temp-map." + mapExtension); Fi file = Core.files.local("temp-map." + mapExtension);

View File

@@ -13,7 +13,7 @@ import com.android.dx.dex.cf.*;
import com.android.dx.dex.file.DexFile; import com.android.dx.dex.file.DexFile;
import com.android.dx.merge.*; import com.android.dx.merge.*;
import dalvik.system.*; import dalvik.system.*;
import org.mozilla.javascript.*; import rhino.*;
import java.io.*; import java.io.*;
import java.nio.*; import java.nio.*;
@@ -41,6 +41,11 @@ public class AndroidRhinoContext{
public Object getDynamicSecurityDomain(Object o){ public Object getDynamicSecurityDomain(Object o){
return null; return null;
} }
@Override
public Object callWithDomain(Object o, Context context, Callable callable, Scriptable scriptable, Scriptable scriptable1, Object[] objects){
return null;
}
}); });
AndroidContextFactory factory; AndroidContextFactory factory;
@@ -121,7 +126,7 @@ public class AndroidRhinoContext{
} }
return loadClass(dex, name); return loadClass(dex, name);
}catch(IOException | ClassNotFoundException e){ }catch(IOException | ClassNotFoundException e){
throw new FatalLoadingException(e); throw new RuntimeException("Failed to define class", e);
} }
} }
@@ -151,14 +156,6 @@ public class AndroidRhinoContext{
} }
} }
/** Might be thrown in any Rhino method that loads bytecode if the loading failed. */
public static class FatalLoadingException extends RuntimeException{
FatalLoadingException(Throwable t){
super("Failed to define class", t);
}
}
static class FileAndroidClassLoader extends BaseAndroidClassLoader{ static class FileAndroidClassLoader extends BaseAndroidClassLoader{
private static int instanceCounter = 0; private static int instanceCounter = 0;
private final File dexFile; private final File dexFile;

View File

@@ -1,6 +1,2 @@
apply plugin: "java"
sourceCompatibility = 1.8
sourceSets.main.java.srcDirs = ["src/main/java/"] sourceSets.main.java.srcDirs = ["src/main/java/"]
sourceSets.main.resources.srcDirs = ["src/main/resources/"] sourceSets.main.resources.srcDirs = ["src/main/resources/"]

View File

@@ -5,11 +5,67 @@ import java.lang.annotation.*;
public class Annotations{ public class Annotations{
//region entity interfaces //region entity interfaces
/** Indicates that a method overrides other methods. */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface Replace{
}
/** Indicates that a method should be final in all implementing classes. */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface Final{
}
/** Indicates that a field will be interpolated when synced. */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
public @interface SyncField{
/** If true, the field will be linearly interpolated. If false, it will be interpolated as an angle. */
boolean value();
/** If true, the field is clamped to 0-1. */
boolean clamped() default false;
}
/** Indicates that a field will not be read from the server when syncing the local player state. */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
public @interface SyncLocal{
}
/** Indicates that a component field is imported from other components. This means it doesn't actually exist. */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
public @interface Import{
}
/** Indicates that a component field is read-only. */
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface ReadOnly{
}
/** Indicates multiple inheritance on a component type. */ /** Indicates multiple inheritance on a component type. */
@Target(ElementType.TYPE) @Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface Depends{ public @interface Component{
Class[] value(); /** Whether to generate a base class for this components.
* An entity cannot have two base classes, so only one component can have base be true. */
boolean base() default false;
}
/** Indicates that a method is implemented by the annotation processor. */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface InternalImpl{
}
/** Indicates priority of a method in an entity. Methods with higher priority are done last. */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface MethodPriority{
float value();
} }
/** Indicates that a component def is present on all entities. */ /** Indicates that a component def is present on all entities. */
@@ -18,11 +74,30 @@ public class Annotations{
public @interface BaseComponent{ public @interface BaseComponent{
} }
/** Creates a group that only examines entities that have all the components listed. */
@Retention(RetentionPolicy.SOURCE)
public @interface GroupDef{
Class[] value();
boolean collide() default false;
boolean spatial() default false;
boolean mapping() default false;
}
/** Indicates an entity definition. */ /** Indicates an entity definition. */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface EntityDef{ public @interface EntityDef{
/** List of component interfaces */
Class[] value(); Class[] value();
/** Whether the class is final */
boolean isFinal() default true;
/** If true, entities are recycled. */
boolean pooled() default false;
/** Whether to serialize (makes the serialize method return this value).
* If true, this entity is automatically put into save files.
* If false, no serialization code is generated at all. */
boolean serialize() default true;
/** Whether to generate IO code. This is for advanced usage only. */
boolean genio() default true;
} }
/** Indicates an internal interface for entity components. */ /** Indicates an internal interface for entity components. */
@@ -34,6 +109,32 @@ public class Annotations{
//endregion //endregion
//region misc. utility //region misc. utility
/** Automatically loads block regions annotated with this. */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface Load{
/**
* The region name to load. Variables can be used:
* "@" -> block name
* "$size" -> block size
* "#" "#1" "#2" -> index number, for arrays
* */
String value();
/** 1D Array length, if applicable. */
int length() default 1;
/** 2D array lengths. */
int[] lengths() default {};
/** Fallback string used to replace "@" (the block name) if the region isn't found. */
String fallback() default "error";
}
/** Registers a statement for auto serialization. */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface RegisterStatement{
String value();
}
@Target(ElementType.TYPE) @Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface StyleDefaults{ public @interface StyleDefaults{
@@ -52,13 +153,6 @@ public class Annotations{
public @interface OverrideCallSuper{ public @interface OverrideCallSuper{
} }
/** Marks a class as serializable. */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Serialize{
}
//endregion //endregion
//region struct //region struct
@@ -140,7 +234,7 @@ public class Annotations{
/** The local locations where this method is called locally, when invoked. */ /** The local locations where this method is called locally, when invoked. */
Loc called() default Loc.none; Loc called() default Loc.none;
/** Whether to forward this packet to all other clients upon recieval. Client only. */ /** Whether to forward this packet to all other clients upon receival. Client only. */
boolean forward() default false; boolean forward() default false;
/** /**
@@ -153,26 +247,9 @@ public class Annotations{
PacketPriority priority() default PacketPriority.normal; PacketPriority priority() default PacketPriority.normal;
} }
/** @Target(ElementType.TYPE)
* Specifies that this method will be used to write classes of the type returned by {@link #value()}.<br>
* This method must return void and have two parameters, the first being of type {@link java.nio.ByteBuffer} and the second
* being the type returned by {@link #value()}.
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface WriteClass{ public @interface TypeIOHandler{
Class<?> value();
}
/**
* Specifies that this method will be used to read classes of the type returned by {@link #value()}. <br>
* This method must return the type returned by {@link #value()},
* and have one parameter, being of type {@link java.nio.ByteBuffer}.
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface ReadClass{
Class<?> value();
} }
//endregion //endregion

View File

@@ -1,19 +1,28 @@
package mindustry.annotations; package mindustry.annotations;
import arc.files.*;
import arc.struct.*; import arc.struct.*;
import arc.util.Log;
import arc.util.Log.*;
import arc.util.*; import arc.util.*;
import com.squareup.javapoet.*; import com.squareup.javapoet.*;
import com.sun.source.util.*; import com.sun.source.util.*;
import com.sun.tools.javac.model.*;
import com.sun.tools.javac.processing.*;
import com.sun.tools.javac.tree.*;
import com.sun.tools.javac.util.*;
import mindustry.annotations.util.*; import mindustry.annotations.util.*;
import javax.annotation.processing.*; import javax.annotation.processing.*;
import javax.lang.model.*; import javax.lang.model.*;
import javax.lang.model.element.*; import javax.lang.model.element.*;
import javax.lang.model.type.*;
import javax.lang.model.util.*; import javax.lang.model.util.*;
import javax.tools.Diagnostic.*; import javax.tools.Diagnostic.*;
import javax.tools.*; import javax.tools.*;
import java.io.*; import java.io.*;
import java.lang.annotation.*; import java.lang.annotation.*;
import java.util.List;
import java.util.*; import java.util.*;
@SupportedSourceVersion(SourceVersion.RELEASE_8) @SupportedSourceVersion(SourceVersion.RELEASE_8)
@@ -22,14 +31,18 @@ public abstract class BaseProcessor extends AbstractProcessor{
public static final String packageName = "mindustry.gen"; public static final String packageName = "mindustry.gen";
public static Types typeu; public static Types typeu;
public static Elements elementu; public static JavacElements elementu;
public static Filer filer; public static Filer filer;
public static Messager messager; public static Messager messager;
public static Trees trees; public static Trees trees;
public static TreeMaker maker;
protected int round; protected int round;
protected int rounds = 1; protected int rounds = 1;
protected RoundEnvironment env; protected RoundEnvironment env;
protected Fi rootDirectory;
protected Context context;
public static String getMethodName(Element element){ public static String getMethodName(Element element){
return ((TypeElement)element.getEnclosingElement()).getQualifiedName().toString() + "." + element.getSimpleName(); return ((TypeElement)element.getEnclosingElement()).getQualifiedName().toString() + "." + element.getSimpleName();
@@ -40,16 +53,90 @@ public abstract class BaseProcessor extends AbstractProcessor{
|| type.equals("long") || type.equals("float") || type.equals("double") || type.equals("char"); || type.equals("long") || type.equals("float") || type.equals("double") || type.equals("char");
} }
public static boolean instanceOf(String type, String other){
TypeElement a = elementu.getTypeElement(type);
TypeElement b = elementu.getTypeElement(other);
return a != null && b != null && typeu.isSubtype(a.asType(), b.asType());
}
public static String getDefault(String value){
switch(value){
case "float":
case "double":
case "int":
case "long":
case "short":
case "char":
case "byte":
return "0";
case "boolean":
return "false";
default:
return "null";
}
}
//in bytes
public static int typeSize(String kind){
switch(kind){
case "boolean":
case "byte":
return 1;
case "short":
return 2;
case "float":
case "char":
case "int":
return 4;
case "long":
return 8;
default:
throw new IllegalArgumentException("Invalid primitive type: " + kind + "");
}
}
public static String simpleName(String str){
return str.contains(".") ? str.substring(str.lastIndexOf('.') + 1) : str;
}
public static TypeName tname(String pack, String simple){
return ClassName.get(pack, simple );
}
public static TypeName tname(String name){
if(!name.contains(".")) return ClassName.get(packageName, name);
String pack = name.substring(0, name.lastIndexOf("."));
String simple = name.substring(name.lastIndexOf(".") + 1);
return ClassName.get(pack, simple);
}
public static TypeName tname(Class<?> c){
return ClassName.get(c).box();
}
public static TypeVariableName getTVN(TypeParameterElement element) {
String name = element.getSimpleName().toString();
List<? extends TypeMirror> boundsMirrors = element.getBounds();
List<TypeName> boundsTypeNames = new ArrayList<>();
for (TypeMirror typeMirror : boundsMirrors) {
boundsTypeNames.add(TypeName.get(typeMirror));
}
return TypeVariableName.get(name, boundsTypeNames.toArray(new TypeName[0]));
}
public static void write(TypeSpec.Builder builder) throws Exception{ public static void write(TypeSpec.Builder builder) throws Exception{
write(builder, null); write(builder, null);
} }
public static void write(TypeSpec.Builder builder, Array<String> imports) throws Exception{ public static void write(TypeSpec.Builder builder, Seq<String> imports) throws Exception{
JavaFile file = JavaFile.builder(packageName, builder.build()).skipJavaLangImports(true).build(); JavaFile file = JavaFile.builder(packageName, builder.build()).skipJavaLangImports(true).build();
if(imports != null){ if(imports != null){
String rawSource = file.toString(); String rawSource = file.toString();
Array<String> result = new Array<>(); Seq<String> result = new Seq<>();
for (String s : rawSource.split("\n", -1)) { for (String s : rawSource.split("\n", -1)) {
result.add(s); result.add(s);
if (s.startsWith("package ")) { if (s.startsWith("package ")) {
@@ -70,27 +157,31 @@ public abstract class BaseProcessor extends AbstractProcessor{
} }
} }
public Array<Stype> types(Class<? extends Annotation> type){ public Seq<Selement> elements(Class<? extends Annotation> type){
return Array.with(env.getElementsAnnotatedWith(type)).select(e -> e instanceof TypeElement) return Seq.with(env.getElementsAnnotatedWith(type)).map(Selement::new);
}
public Seq<Stype> types(Class<? extends Annotation> type){
return Seq.with(env.getElementsAnnotatedWith(type)).select(e -> e instanceof TypeElement)
.map(e -> new Stype((TypeElement)e)); .map(e -> new Stype((TypeElement)e));
} }
public Array<Svar> fields(Class<? extends Annotation> type){ public Seq<Svar> fields(Class<? extends Annotation> type){
return Array.with(env.getElementsAnnotatedWith(type)).select(e -> e instanceof VariableElement) return Seq.with(env.getElementsAnnotatedWith(type)).select(e -> e instanceof VariableElement)
.map(e -> new Svar((VariableElement)e)); .map(e -> new Svar((VariableElement)e));
} }
public Array<Smethod> methods(Class<? extends Annotation> type){ public Seq<Smethod> methods(Class<? extends Annotation> type){
return Array.with(env.getElementsAnnotatedWith(type)).select(e -> e instanceof ExecutableElement) return Seq.with(env.getElementsAnnotatedWith(type)).select(e -> e instanceof ExecutableElement)
.map(e -> new Smethod((ExecutableElement)e)); .map(e -> new Smethod((ExecutableElement)e));
} }
public void err(String message){ public static void err(String message){
messager.printMessage(Kind.ERROR, message); messager.printMessage(Kind.ERROR, message);
Log.err("[CODEGEN ERROR] " +message); Log.err("[CODEGEN ERROR] " +message);
} }
public void err(String message, Element elem){ public static void err(String message, Element elem){
messager.printMessage(Kind.ERROR, message, elem); messager.printMessage(Kind.ERROR, message, elem);
Log.err("[CODEGEN ERROR] " + message + ": " + elem); Log.err("[CODEGEN ERROR] " + message + ": " + elem);
} }
@@ -103,20 +194,41 @@ public abstract class BaseProcessor extends AbstractProcessor{
public synchronized void init(ProcessingEnvironment env){ public synchronized void init(ProcessingEnvironment env){
super.init(env); super.init(env);
JavacProcessingEnvironment javacProcessingEnv = (JavacProcessingEnvironment)env;
trees = Trees.instance(env); trees = Trees.instance(env);
typeu = env.getTypeUtils(); typeu = env.getTypeUtils();
elementu = env.getElementUtils(); elementu = javacProcessingEnv.getElementUtils();
filer = env.getFiler(); filer = env.getFiler();
messager = env.getMessager(); messager = env.getMessager();
context = ((JavacProcessingEnvironment)env).getContext();
maker = TreeMaker.instance(javacProcessingEnv.getContext());
Log.setLogLevel(LogLevel.info);
if(System.getProperty("debug") != null){
Log.setLogLevel(LogLevel.debug);
}
} }
@Override @Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
if(round++ >= rounds) return false; //only process 1 round if(round++ >= rounds) return false; //only process 1 round
if(rootDirectory == null){
try{
String path = Fi.get(filer.getResource(StandardLocation.CLASS_OUTPUT, "no", "no")
.toUri().toURL().toString().substring(OS.isWindows ? 6 : "file:".length()))
.parent().parent().parent().parent().parent().parent().parent().toString().replace("%20", " ");
rootDirectory = Fi.get(path);
}catch(IOException e){
throw new RuntimeException(e);
}
}
this.env = roundEnv; this.env = roundEnv;
try{ try{
process(roundEnv); process(roundEnv);
}catch(Exception e){ }catch(Throwable e){
e.printStackTrace(); e.printStackTrace();
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View File

@@ -0,0 +1,346 @@
package mindustry.annotations.entity;
import arc.files.*;
import arc.math.*;
import arc.struct.*;
import arc.util.*;
import arc.util.serialization.*;
import com.squareup.javapoet.*;
import mindustry.annotations.Annotations.*;
import mindustry.annotations.*;
import mindustry.annotations.util.*;
import mindustry.annotations.util.TypeIOResolver.*;
import javax.lang.model.element.*;
import static mindustry.annotations.BaseProcessor.instanceOf;
public class EntityIO{
final static Json json = new Json();
//suffixes for sync fields
final static String targetSuf = "_TARGET_", lastSuf = "_LAST_";
//replacements after refactoring
final static StringMap replacements = StringMap.of("mindustry.entities.units.BuildRequest", "mindustry.entities.units.BuildPlan");
final ClassSerializer serializer;
final String name;
final TypeSpec.Builder type;
final Fi directory;
final Seq<Revision> revisions = new Seq<>();
boolean write;
MethodSpec.Builder method;
ObjectSet<String> presentFields = new ObjectSet<>();
EntityIO(String name, TypeSpec.Builder type, Seq<FieldSpec> typeFields, ClassSerializer serializer, Fi directory){
this.directory = directory;
this.type = type;
this.serializer = serializer;
this.name = name;
directory.mkdirs();
//load old revisions
for(Fi fi : directory.list()){
revisions.add(json.fromJson(Revision.class, fi));
}
//next revision to be used
int nextRevision = revisions.isEmpty() ? 0 : revisions.max(r -> r.version).version + 1;
//resolve preferred field order based on fields that fit
Seq<FieldSpec> fields = typeFields.select(spec ->
!spec.hasModifier(Modifier.TRANSIENT) &&
!spec.hasModifier(Modifier.STATIC) &&
!spec.hasModifier(Modifier.FINAL)/* &&
(spec.type.isPrimitive() || serializer.has(spec.type.toString()))*/);
//sort to keep order
fields.sortComparing(f -> f.name);
//keep track of fields present in the entity
presentFields.addAll(fields.map(f -> f.name));
//add new revision if it doesn't match or there are no revisions
if(revisions.isEmpty() || !revisions.peek().equal(fields)){
revisions.add(new Revision(nextRevision,
fields.map(f -> new RevisionField(f.name, f.type.toString(),
f.type.isPrimitive() ? BaseProcessor.typeSize(f.type.toString()) : -1))));
//write revision
directory.child(nextRevision + ".json").writeString(json.toJson(revisions.peek()));
}
}
void write(MethodSpec.Builder method, boolean write) throws Exception{
this.method = method;
this.write = write;
//subclasses *have* to call this method
method.addAnnotation(CallSuper.class);
if(write){
//write short revision
st("write.s($L)", revisions.peek().version);
//write uses most recent revision
for(RevisionField field : revisions.peek().fields){
io(field.type, "this." + field.name);
}
}else{
//read revision
st("short REV = read.s()");
for(int i = 0; i < revisions.size; i++){
//check for the right revision
Revision rev = revisions.get(i);
if(i == 0){
cont("if(REV == $L)", rev.version);
}else{
ncont("else if(REV == $L)", rev.version);
}
//add code for reading revision
for(RevisionField field : rev.fields){
//if the field doesn't exist, the result will be an empty string, it won't get assigned
io(field.type, presentFields.contains(field.name) ? "this." + field.name + " = " : "");
}
}
//throw exception on illegal revisions
ncont("else");
st("throw new IllegalArgumentException(\"Unknown revision '\" + REV + \"' for entity type '" + name + "'\")");
econt();
}
}
void writeSync(MethodSpec.Builder method, boolean write, Seq<Svar> syncFields, Seq<Svar> allFields) throws Exception{
this.method = method;
this.write = write;
if(write){
//write uses most recent revision
for(RevisionField field : revisions.peek().fields){
io(field.type, "this." + field.name);
}
}else{
Revision rev = revisions.peek();
//base read code
st("if(lastUpdated != 0) updateSpacing = $T.timeSinceMillis(lastUpdated)", Time.class);
st("lastUpdated = $T.millis()", Time.class);
st("boolean islocal = isLocal()");
//add code for reading revision
for(RevisionField field : rev.fields){
Svar var = allFields.find(s -> s.name().equals(field.name));
boolean sf = var.has(SyncField.class), sl = var.has(SyncLocal.class);
if(sl) cont("if(!islocal)");
if(sf){
st(field.name + lastSuf + " = this." + field.name);
}
io(field.type, "this." + (sf ? field.name + targetSuf : field.name) + " = ");
if(sl){
ncont("else" );
io(field.type, "");
//just assign the two values so jumping does not occur on de-possession
if(sf){
st(field.name + lastSuf + " = this." + field.name);
st(field.name + targetSuf + " = this." + field.name);
}
econt();
}
}
st("afterSync()");
}
}
void writeSyncManual(MethodSpec.Builder method, boolean write, Seq<Svar> syncFields) throws Exception{
this.method = method;
this.write = write;
if(write){
for(Svar field : syncFields){
st("buffer.put(this.$L)", field.name());
}
}else{
//base read code
st("if(lastUpdated != 0) updateSpacing = $T.timeSinceMillis(lastUpdated)", Time.class);
st("lastUpdated = $T.millis()", Time.class);
//just read the field
for(Svar field : syncFields){
//last
st("this.$L = this.$L", field.name() + lastSuf, field.name());
//assign target
st("this.$L = buffer.get()", field.name() + targetSuf);
}
}
}
void writeInterpolate(MethodSpec.Builder method, Seq<Svar> fields) throws Exception{
this.method = method;
cont("if(lastUpdated != 0 && updateSpacing != 0)");
//base calculations
st("float timeSinceUpdate = Time.timeSinceMillis(lastUpdated)");
st("float alpha = Math.min(timeSinceUpdate / updateSpacing, 2f)");
//write interpolated data, using slerp / lerp
for(Svar field : fields){
String name = field.name(), targetName = name + targetSuf, lastName = name + lastSuf;
st("$L = $L($T.$L($L, $L, alpha))", name, field.annotation(SyncField.class).clamped() ? "arc.math.Mathf.clamp" : "", Mathf.class, field.annotation(SyncField.class).value() ? "lerp" : "slerp", lastName, targetName);
}
ncont("else if(lastUpdated != 0)"); //check if no meaningful data has arrived yet
//write values directly to targets
for(Svar field : fields){
String name = field.name(), targetName = name + targetSuf;
st("$L = $L", name, targetName);
}
econt();
}
private void io(String type, String field) throws Exception{
type = type.replace("mindustry.gen.", "");
type = replacements.get(type, type);
if(BaseProcessor.isPrimitive(type)){
s(type.equals("boolean") ? "bool" : type.charAt(0) + "", field);
}else if(instanceOf(type, "mindustry.ctype.Content")){
if(write){
s("s", field + ".id");
}else{
st(field + "mindustry.Vars.content.getByID(mindustry.ctype.ContentType.$L, read.s())", BaseProcessor.simpleName(type).toLowerCase().replace("type", ""));
}
}else if(serializer.writers.containsKey(type) && write){
st("$L(write, $L)", serializer.writers.get(type), field);
}else if(serializer.mutatorReaders.containsKey(type) && !write && !field.replace(" = ", "").contains(" ") && !field.isEmpty()){
st("$L$L(read, $L)", field, serializer.mutatorReaders.get(type), field.replace(" = ", ""));
}else if(serializer.readers.containsKey(type) && !write){
st("$L$L(read)", field, serializer.readers.get(type));
}else if(type.endsWith("[]")){ //it's a 1D array
String rawType = type.substring(0, type.length() - 2);
if(write){
s("i", field + ".length");
cont("for(int INDEX = 0; INDEX < $L.length; INDEX ++)", field);
io(rawType, field + "[INDEX]");
}else{
String fieldName = field.replace(" = ", "").replace("this.", "");
String lenf = fieldName + "_LENGTH";
s("i", "int " + lenf + " = ");
if(!field.isEmpty()){
st("$Lnew $L[$L]", field, type.replace("[]", ""), lenf);
}
cont("for(int INDEX = 0; INDEX < $L; INDEX ++)", lenf);
io(rawType, field.replace(" = ", "[INDEX] = "));
}
econt();
}else if(type.startsWith("arc.struct") && type.contains("<")){ //it's some type of data structure
String struct = type.substring(0, type.indexOf("<"));
String generic = type.substring(type.indexOf("<") + 1, type.indexOf(">"));
if(struct.equals("arc.struct.Queue") || struct.equals("arc.struct.Seq")){
if(write){
s("i", field + ".size");
cont("for(int INDEX = 0; INDEX < $L.size; INDEX ++)", field);
io(generic, field + ".get(INDEX)");
}else{
String fieldName = field.replace(" = ", "").replace("this.", "");
String lenf = fieldName + "_LENGTH";
s("i", "int " + lenf + " = ");
if(!field.isEmpty()){
st("$L.clear()", field.replace(" = ", ""));
}
cont("for(int INDEX = 0; INDEX < $L; INDEX ++)", lenf);
io(generic, field.replace(" = ", "_ITEM = ").replace("this.", generic + " "));
if(!field.isEmpty()){
String temp = field.replace(" = ", "_ITEM").replace("this.", "");
st("if($L != null) $L.add($L)", temp, field.replace(" = ", ""), temp);
}
}
econt();
}else{
Log.warn("Missing serialization code for collection '@' in '@'", type, name);
}
}else{
Log.warn("Missing serialization code for type '@' in '@'", type, name);
}
}
private void cont(String text, Object... fmt){
method.beginControlFlow(text, fmt);
}
private void econt(){
method.endControlFlow();
}
private void ncont(String text, Object... fmt){
method.nextControlFlow(text, fmt);
}
private void st(String text, Object... args){
method.addStatement(text, args);
}
private void s(String type, String field){
if(write){
method.addStatement("write.$L($L)", type, field);
}else{
method.addStatement("$Lread.$L()", field, type);
}
}
public static class Revision{
int version;
Seq<RevisionField> fields;
Revision(int version, Seq<RevisionField> fields){
this.version = version;
this.fields = fields;
}
Revision(){}
/** @return whether these two revisions are compatible */
boolean equal(Seq<FieldSpec> specs){
if(fields.size != specs.size) return false;
for(int i = 0; i < fields.size; i++){
RevisionField field = fields.get(i);
FieldSpec spec = specs.get(i);
//TODO when making fields, their primitive size may be overwritten by an annotation; check for that
if(!(field.type.equals(spec.type.toString()) && (!spec.type.isPrimitive() || BaseProcessor.typeSize(spec.type.toString()) == field.size))){
return false;
}
}
return true;
}
}
public static class RevisionField{
String name, type;
int size; //in bytes
RevisionField(String name, String type, int size){
this.name = name;
this.size = size;
this.type = type;
}
RevisionField(){}
}
}

View File

@@ -0,0 +1,946 @@
package mindustry.annotations.entity;
import arc.*;
import arc.files.*;
import arc.func.*;
import arc.struct.*;
import arc.util.ArcAnnotate.*;
import arc.util.*;
import arc.util.io.*;
import arc.util.pooling.Pool.*;
import arc.util.pooling.*;
import com.squareup.javapoet.*;
import com.squareup.javapoet.TypeSpec.*;
import com.sun.source.tree.*;
import mindustry.annotations.Annotations.*;
import mindustry.annotations.*;
import mindustry.annotations.util.*;
import mindustry.annotations.util.TypeIOResolver.*;
import javax.annotation.processing.*;
import javax.lang.model.element.*;
import javax.lang.model.type.*;
import java.lang.annotation.*;
@SupportedAnnotationTypes({
"mindustry.annotations.Annotations.EntityDef",
"mindustry.annotations.Annotations.GroupDef",
"mindustry.annotations.Annotations.EntityInterface",
"mindustry.annotations.Annotations.BaseComponent",
"mindustry.annotations.Annotations.TypeIOHandler"
})
public class EntityProcess extends BaseProcessor{
Seq<EntityDefinition> definitions = new Seq<>();
Seq<GroupDefinition> groupDefs = new Seq<>();
Seq<Stype> baseComponents;
ObjectMap<String, Stype> componentNames = new ObjectMap<>();
ObjectMap<Stype, Seq<Stype>> componentDependencies = new ObjectMap<>();
ObjectMap<Selement, Seq<Stype>> defComponents = new ObjectMap<>();
ObjectMap<String, String> varInitializers = new ObjectMap<>();
ObjectMap<String, String> methodBlocks = new ObjectMap<>();
ObjectMap<Stype, ObjectSet<Stype>> baseClassDeps = new ObjectMap<>();
ObjectSet<String> imports = new ObjectSet<>();
Seq<Selement> allGroups = new Seq<>();
Seq<Selement> allDefs = new Seq<>();
Seq<Stype> allInterfaces = new Seq<>();
Seq<TypeSpec.Builder> baseClasses = new Seq<>();
ClassSerializer serializer;
{
rounds = 3;
}
@Override
public void process(RoundEnvironment env) throws Exception{
allGroups.addAll(elements(GroupDef.class));
allDefs.addAll(elements(EntityDef.class));
allInterfaces.addAll(types(EntityInterface.class));
//round 1: generate component interfaces
if(round == 1){
serializer = TypeIOResolver.resolve(this);
baseComponents = types(BaseComponent.class);
Seq<Stype> allComponents = types(Component.class);
//store code
for(Stype component : allComponents){
for(Svar f : component.fields()){
VariableTree tree = f.tree();
//add initializer if it exists
if(tree.getInitializer() != null){
String init = tree.getInitializer().toString();
varInitializers.put(f.descString(), init);
}
}
for(Smethod elem : component.methods()){
if(elem.is(Modifier.ABSTRACT) || elem.is(Modifier.NATIVE)) continue;
//get all statements in the method, store them
methodBlocks.put(elem.descString(), elem.tree().getBody().toString());
}
}
//store components
for(Stype type : allComponents){
componentNames.put(type.name(), type);
}
//add component imports
for(Stype comp : allComponents){
imports.addAll(getImports(comp.e));
}
//create component interfaces
for(Stype component : allComponents){
TypeSpec.Builder inter = TypeSpec.interfaceBuilder(interfaceName(component))
.addModifiers(Modifier.PUBLIC).addAnnotation(EntityInterface.class);
inter.addJavadoc("Interface for {@link $L}", component.fullName());
//implement extra interfaces these components may have, e.g. position
for(Stype extraInterface : component.interfaces().select(i -> !isCompInterface(i))){
//javapoet completely chokes on this if I add `addSuperInterface` or create the type name with TypeName.get
inter.superinterfaces.add(tname(extraInterface.fullName()));
}
//implement super interfaces
Seq<Stype> depends = getDependencies(component);
for(Stype type : depends){
inter.addSuperinterface(ClassName.get(packageName, interfaceName(type)));
}
ObjectSet<String> signatures = new ObjectSet<>();
//add utility methods to interface
for(Smethod method : component.methods()){
//skip private methods, those are for internal use.
if(method.isAny(Modifier.PRIVATE, Modifier.STATIC)) continue;
//keep track of signatures used to prevent dupes
signatures.add(method.e.toString());
inter.addMethod(MethodSpec.methodBuilder(method.name())
.addJavadoc(method.doc() == null ? "" : method.doc())
.addExceptions(method.thrownt())
.addTypeVariables(method.typeVariables().map(TypeVariableName::get))
.returns(method.ret().toString().equals("void") ? TypeName.VOID : method.retn())
.addParameters(method.params().map(v -> ParameterSpec.builder(v.tname(), v.name())
.build())).addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT).build());
}
for(Svar field : component.fields().select(e -> !e.is(Modifier.STATIC) && !e.is(Modifier.PRIVATE) && !e.has(Import.class))){
String cname = field.name();
//getter
if(!signatures.contains(cname + "()")){
inter.addMethod(MethodSpec.methodBuilder(cname).addModifiers(Modifier.ABSTRACT, Modifier.PUBLIC)
.addAnnotations(Seq.with(field.annotations()).select(a -> a.toString().contains("Null")).map(AnnotationSpec::get))
.addJavadoc(field.doc() == null ? "" : field.doc())
.returns(field.tname()).build());
}
//setter
if(!field.is(Modifier.FINAL) && !signatures.contains(cname + "(" + field.mirror().toString() + ")") &&
!field.annotations().contains(f -> f.toString().equals("@mindustry.annotations.Annotations.ReadOnly"))){
inter.addMethod(MethodSpec.methodBuilder(cname).addModifiers(Modifier.ABSTRACT, Modifier.PUBLIC)
.addJavadoc(field.doc() == null ? "" : field.doc())
.addParameter(ParameterSpec.builder(field.tname(), field.name())
.addAnnotations(Seq.with(field.annotations())
.select(a -> a.toString().contains("Null")).map(AnnotationSpec::get)).build()).build());
}
}
write(inter);
//generate base class if necessary
//SPECIAL CASE: components with EntityDefs don't get a base class! the generated class becomes the base class itself
if(component.annotation(Component.class).base()){
Seq<Stype> deps = depends.copy().and(component);
baseClassDeps.get(component, ObjectSet::new).addAll(deps);
//do not generate base classes when the component will generate one itself
if(!component.has(EntityDef.class)){
TypeSpec.Builder base = TypeSpec.classBuilder(baseName(component)).addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT);
//go through all the fields.
for(Stype type : deps){
//add public fields
for(Svar field : type.fields().select(e -> !e.is(Modifier.STATIC) && !e.is(Modifier.PRIVATE) && !e.has(Import.class) && !e.has(ReadOnly.class))){
FieldSpec.Builder builder = FieldSpec.builder(field.tname(),field.name(), Modifier.PUBLIC);
//keep transience
if(field.is(Modifier.TRANSIENT)) builder.addModifiers(Modifier.TRANSIENT);
//keep all annotations
builder.addAnnotations(field.annotations().map(AnnotationSpec::get));
//add initializer if it exists
if(varInitializers.containsKey(field.descString())){
builder.initializer(varInitializers.get(field.descString()));
}
base.addField(builder.build());
}
}
//add interfaces
for(Stype type : deps){
base.addSuperinterface(tname(packageName, interfaceName(type)));
}
//add to queue to be written later
baseClasses.add(base);
}
}
//LOGGING
Log.debug("&gGenerating interface for " + component.name());
for(TypeName tn : inter.superinterfaces){
Log.debug("&g> &lbimplements @", simpleName(tn.toString()));
}
//log methods generated
for(MethodSpec spec : inter.methodSpecs){
Log.debug("&g> > &c@ @(@)", simpleName(spec.returnType.toString()), spec.name, Seq.with(spec.parameters).toString(", ", p -> simpleName(p.type.toString()) + " " + p.name));
}
Log.debug("");
}
}else if(round == 2){ //round 2: get component classes and generate interfaces for them
//parse groups
//this needs to be done before the entity interfaces are generated, as the entity classes need to know which groups to add themselves to
for(Selement<?> group : allGroups){
GroupDef an = group.annotation(GroupDef.class);
Seq<Stype> types = types(an, GroupDef::value).map(stype -> {
Stype result = interfaceToComp(stype);
if(result == null) throw new IllegalArgumentException("Interface " + stype + " does not have an associated component!");
return result;
});
//representative component type
Stype repr = types.first();
String groupType = repr.annotation(Component.class).base() ? baseName(repr) : interfaceName(repr);
boolean collides = an.collide();
groupDefs.add(new GroupDefinition(group.name().startsWith("g") ? group.name().substring(1) : group.name(),
ClassName.bestGuess(packageName + "." + groupType), types, an.spatial(), an.mapping(), collides));
}
ObjectMap<String, Selement> usedNames = new ObjectMap<>();
ObjectMap<Selement, ObjectSet<String>> extraNames = new ObjectMap<>();
//look at each definition
for(Selement<?> type : allDefs){
EntityDef ann = type.annotation(EntityDef.class);
boolean isFinal = ann.isFinal();
//all component classes (not interfaces)
Seq<Stype> components = allComponents(type);
Seq<GroupDefinition> groups = groupDefs.select(g -> (!g.components.isEmpty() && !g.components.contains(s -> !components.contains(s))) || g.manualInclusions.contains(type));
ObjectMap<String, Seq<Smethod>> methods = new ObjectMap<>();
ObjectMap<FieldSpec, Svar> specVariables = new ObjectMap<>();
ObjectSet<String> usedFields = new ObjectSet<>();
//make sure there's less than 2 base classes
Seq<Stype> baseClasses = components.select(s -> s.annotation(Component.class).base());
if(baseClasses.size > 2){
err("No entity may have more than 2 base classes. Base classes: " + baseClasses, type);
}
//get base class type name for extension
Stype baseClassType = baseClasses.any() ? baseClasses.first() : null;
@Nullable TypeName baseClass = baseClasses.any() ? tname(packageName + "." + baseName(baseClassType)) : null;
//whether the main class is the base itself
boolean typeIsBase = baseClassType != null && type.has(Component.class) && type.annotation(Component.class).base();
if(type.isType() && (!type.name().endsWith("Def") && !type.name().endsWith("Comp"))){
err("All entity def names must end with 'Def'/'Comp'", type.e);
}
String name = type.isType() ?
type.name().replace("Def", "").replace("Comp", "") :
createName(type);
//check for type name conflicts
if(!typeIsBase && baseClass != null && name.equals(baseName(baseClassType))){
name += "Entity";
}
//skip double classes
if(usedNames.containsKey(name)){
extraNames.get(usedNames.get(name), ObjectSet::new).add(type.name());
continue;
}
usedNames.put(name, type);
extraNames.get(type, ObjectSet::new).add(name);
if(!type.isType()){
extraNames.get(type, ObjectSet::new).add(type.name());
}
TypeSpec.Builder builder = TypeSpec.classBuilder(name).addModifiers(Modifier.PUBLIC);
//add serialize() boolean
builder.addMethod(MethodSpec.methodBuilder("serialize").addModifiers(Modifier.PUBLIC).returns(boolean.class).addStatement("return " + ann.serialize()).build());
//all SyncField fields
Seq<Svar> syncedFields = new Seq<>();
Seq<Svar> allFields = new Seq<>();
Seq<FieldSpec> allFieldSpecs = new Seq<>();
boolean isSync = components.contains(s -> s.name().contains("Sync"));
//add all components
for(Stype comp : components){
//whether this component's fields are defined in the base class
boolean isShadowed = baseClass != null && !typeIsBase && baseClassDeps.get(baseClassType).contains(comp);
//write fields to the class; ignoring transient/imported ones
Seq<Svar> fields = comp.fields().select(f -> !f.has(Import.class));
for(Svar f : fields){
if(!usedFields.add(f.name())){
err("Field '" + f.name() + "' of component '" + comp.name() + "' redefines a field in entity '" + type.name() + "'");
continue;
}
FieldSpec.Builder fbuilder = FieldSpec.builder(f.tname(), f.name());
//keep statics/finals
if(f.is(Modifier.STATIC)){
fbuilder.addModifiers(Modifier.STATIC);
if(f.is(Modifier.FINAL)) fbuilder.addModifiers(Modifier.FINAL);
}
//add transient modifier for serialization
if(f.is(Modifier.TRANSIENT)){
fbuilder.addModifiers(Modifier.TRANSIENT);
}
//add initializer if it exists
if(varInitializers.containsKey(f.descString())){
fbuilder.initializer(varInitializers.get(f.descString()));
}
fbuilder.addModifiers(f.has(ReadOnly.class) ? Modifier.PROTECTED : Modifier.PUBLIC);
fbuilder.addAnnotations(f.annotations().map(AnnotationSpec::get));
FieldSpec spec = fbuilder.build();
//whether this field would be added to the superclass
boolean isVisible = !f.is(Modifier.STATIC) && !f.is(Modifier.PRIVATE) && !f.has(ReadOnly.class);
//add the field only if it isn't visible or it wasn't implemented by the base class
if(!isShadowed || !isVisible){
builder.addField(spec);
}
specVariables.put(spec, f);
allFieldSpecs.add(spec);
allFields.add(f);
//add extra sync fields
if(f.has(SyncField.class) && isSync){
if(!f.tname().toString().equals("float")) err("All SyncFields must be of type float", f);
syncedFields.add(f);
//a synced field has 3 values:
//- target state
//- last state
//- current state (the field itself, will be written to)
//target
builder.addField(FieldSpec.builder(float.class, f.name() + EntityIO.targetSuf).addModifiers(Modifier.TRANSIENT, Modifier.PRIVATE).build());
//last
builder.addField(FieldSpec.builder(float.class, f.name() + EntityIO.lastSuf).addModifiers(Modifier.TRANSIENT, Modifier.PRIVATE).build());
}
}
//get all methods from components
for(Smethod elem : comp.methods()){
methods.get(elem.toString(), Seq::new).add(elem);
}
}
syncedFields.sortComparing(Selement::name);
//override toString method
builder.addMethod(MethodSpec.methodBuilder("toString")
.addAnnotation(Override.class)
.returns(String.class)
.addModifiers(Modifier.PUBLIC)
.addStatement("return $S + $L", name + "#", "id").build());
EntityIO io = new EntityIO(type.name(), builder, allFieldSpecs, serializer, rootDirectory.child("annotations/src/main/resources/revisions").child(name));
//entities with no sync comp and no serialization gen no code
boolean hasIO = ann.genio() && (components.contains(s -> s.name().contains("Sync")) || ann.serialize());
//add all methods from components
for(ObjectMap.Entry<String, Seq<Smethod>> entry : methods){
if(entry.value.contains(m -> m.has(Replace.class))){
//check replacements
if(entry.value.count(m -> m.has(Replace.class)) > 1){
err("Type " + type + " has multiple components replacing method " + entry.key + ".");
}
Smethod base = entry.value.find(m -> m.has(Replace.class));
entry.value.clear();
entry.value.add(base);
}
//check multi return
if(entry.value.count(m -> !m.isAny(Modifier.NATIVE, Modifier.ABSTRACT) && !m.isVoid()) > 1){
err("Type " + type + " has multiple components implementing non-void method " + entry.key + ".");
}
entry.value.sort(Structs.comps(Structs.comparingFloat(m -> m.has(MethodPriority.class) ? m.annotation(MethodPriority.class).value() : 0), Structs.comparing(Selement::name)));
//representative method
Smethod first = entry.value.first();
//skip internal impl
if(first.has(InternalImpl.class)){
continue;
}
//build method using same params/returns
MethodSpec.Builder mbuilder = MethodSpec.methodBuilder(first.name()).addModifiers(first.is(Modifier.PRIVATE) ? Modifier.PRIVATE : Modifier.PUBLIC);
//if(isFinal || entry.value.contains(s -> s.has(Final.class))) mbuilder.addModifiers(Modifier.FINAL);
if(entry.value.contains(s -> s.has(CallSuper.class))) mbuilder.addAnnotation(CallSuper.class); //add callSuper here if necessary
if(first.is(Modifier.STATIC)) mbuilder.addModifiers(Modifier.STATIC);
mbuilder.addTypeVariables(first.typeVariables().map(TypeVariableName::get));
mbuilder.returns(first.retn());
mbuilder.addExceptions(first.thrownt());
for(Svar var : first.params()){
mbuilder.addParameter(var.tname(), var.name());
}
//only write the block if it's a void method with several entries
boolean writeBlock = first.ret().toString().equals("void") && entry.value.size > 1;
if((entry.value.first().is(Modifier.ABSTRACT) || entry.value.first().is(Modifier.NATIVE)) && entry.value.size == 1 && !entry.value.first().has(InternalImpl.class)){
err(entry.value.first().up().getSimpleName() + "#" + entry.value.first() + " is an abstract method and must be implemented in some component", type);
}
//SPECIAL CASE: inject group add/remove code
if(first.name().equals("add") || first.name().equals("remove")){
mbuilder.addStatement("if(added == $L) return", first.name().equals("add"));
for(GroupDefinition def : groups){
//remove/add from each group, assume imported
mbuilder.addStatement("Groups.$L.$L(this)", def.name, first.name());
}
}
if(hasIO){
//SPECIAL CASE: I/O code
//note that serialization is generated even for non-serializing entities for manual usage
if((first.name().equals("read") || first.name().equals("write"))){
io.write(mbuilder, first.name().equals("write"));
}
//SPECIAL CASE: sync I/O code
if((first.name().equals("readSync") || first.name().equals("writeSync"))){
io.writeSync(mbuilder, first.name().equals("writeSync"), syncedFields, allFields);
}
//SPECIAL CASE: sync I/O code for writing to/from a manual buffer
if((first.name().equals("readSyncManual") || first.name().equals("writeSyncManual"))){
io.writeSyncManual(mbuilder, first.name().equals("writeSyncManual"), syncedFields);
}
//SPECIAL CASE: interpolate method implementation
if(first.name().equals("interpolate")){
io.writeInterpolate(mbuilder, syncedFields);
}
//SPECIAL CASE: method to snap to target position after being read for the first time
if(first.name().equals("snapSync")){
mbuilder.addStatement("updateSpacing = 16");
mbuilder.addStatement("lastUpdated = $T.millis()", Time.class);
for(Svar field : syncedFields){
//reset last+current state to target position
mbuilder.addStatement("$L = $L", field.name() + EntityIO.lastSuf, field.name() + EntityIO.targetSuf);
mbuilder.addStatement("$L = $L", field.name(), field.name() + EntityIO.targetSuf);
}
}
//SPECIAL CASE: method to snap to current position so interpolation doesn't go wild
if(first.name().equals("snapInterpolation")){
mbuilder.addStatement("updateSpacing = 16");
mbuilder.addStatement("lastUpdated = $T.millis()", Time.class);
for(Svar field : syncedFields){
//reset last+current state to target position
mbuilder.addStatement("$L = $L", field.name() + EntityIO.lastSuf, field.name());
mbuilder.addStatement("$L = $L", field.name() + EntityIO.targetSuf, field.name());
}
}
}
for(Smethod elem : entry.value){
String descStr = elem.descString();
if(elem.is(Modifier.ABSTRACT) || elem.is(Modifier.NATIVE) || !methodBlocks.containsKey(descStr)) continue;
//get all statements in the method, copy them over
String str = methodBlocks.get(descStr);
//name for code blocks in the methods
String blockName = elem.up().getSimpleName().toString().toLowerCase().replace("comp", "");
//skip empty blocks
if(str.replace("{", "").replace("\n", "").replace("}", "").replace("\t", "").replace(" ", "").isEmpty()){
continue;
}
//wrap scope to prevent variable leakage
if(writeBlock){
//replace return; with block break
str = str.replace("return;", "break " + blockName + ";");
mbuilder.addCode(blockName + ": {\n");
}
//trim block
str = str.substring(2, str.length() - 1);
//make sure to remove braces here
mbuilder.addCode(str);
//end scope
if(writeBlock) mbuilder.addCode("}\n");
}
//add free code to remove methods - always at the end
//this only gets called next frame.
if(first.name().equals("remove") && ann.pooled()){
mbuilder.addStatement("$T.app.post(() -> $T.free(this))", Core.class, Pools.class);
}
builder.addMethod(mbuilder.build());
}
//add pool reset method and implement Poolable
if(ann.pooled()){
builder.addSuperinterface(Poolable.class);
//implement reset()
MethodSpec.Builder resetBuilder = MethodSpec.methodBuilder("reset").addModifiers(Modifier.PUBLIC);
for(FieldSpec spec : allFieldSpecs){
@Nullable Svar variable = specVariables.get(spec);
if(variable != null && variable.isAny(Modifier.STATIC, Modifier.FINAL)) continue;
String desc = variable.descString();
if(spec.type.isPrimitive()){
//set to primitive default
resetBuilder.addStatement("$L = $L", spec.name, variable != null && varInitializers.containsKey(desc) ? varInitializers.get(desc) : getDefault(spec.type.toString()));
}else{
//set to default null
if(!varInitializers.containsKey(desc)){
resetBuilder.addStatement("$L = null", spec.name);
} //else... TODO reset if poolable
}
}
builder.addMethod(resetBuilder.build());
}
//make constructor private
builder.addMethod(MethodSpec.constructorBuilder().addModifiers(Modifier.PROTECTED).build());
//add create() method
builder.addMethod(MethodSpec.methodBuilder("create").addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(tname(packageName + "." + name))
.addStatement(ann.pooled() ? "return Pools.obtain($L.class, " +name +"::new)" : "return new $L()", name).build());
definitions.add(new EntityDefinition(packageName + "." + name, builder, type, typeIsBase ? null : baseClass, components, groups, allFieldSpecs));
}
//generate groups
TypeSpec.Builder groupsBuilder = TypeSpec.classBuilder("Groups").addModifiers(Modifier.PUBLIC);
MethodSpec.Builder groupInit = MethodSpec.methodBuilder("init").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
for(GroupDefinition group : groupDefs){
//class names for interface/group
ClassName itype = group.baseType;
ClassName groupc = ClassName.bestGuess("mindustry.entities.EntityGroup");
//add field...
groupsBuilder.addField(ParameterizedTypeName.get(
ClassName.bestGuess("mindustry.entities.EntityGroup"), itype), group.name, Modifier.PUBLIC, Modifier.STATIC);
groupInit.addStatement("$L = new $T<>($L.class, $L, $L)", group.name, groupc, itype, group.spatial, group.mapping);
}
//write the groups
groupsBuilder.addMethod(groupInit.build());
MethodSpec.Builder groupClear = MethodSpec.methodBuilder("clear").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
for(GroupDefinition group : groupDefs){
groupClear.addStatement("$L.clear()", group.name);
}
//write clear
groupsBuilder.addMethod(groupClear.build());
//add method for resizing all necessary groups
MethodSpec.Builder groupResize = MethodSpec.methodBuilder("resize")
.addParameter(TypeName.FLOAT, "x").addParameter(TypeName.FLOAT, "y").addParameter(TypeName.FLOAT, "w").addParameter(TypeName.FLOAT, "h")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC);
MethodSpec.Builder groupUpdate = MethodSpec.methodBuilder("update")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC);
//method resize
for(GroupDefinition group : groupDefs){
if(group.spatial){
groupResize.addStatement("$L.resize(x, y, w, h)", group.name);
groupUpdate.addStatement("$L.updatePhysics()", group.name);
}
}
groupUpdate.addStatement("all.update()");
for(GroupDefinition group : groupDefs){
if(group.collides){
groupUpdate.addStatement("$L.collide()", group.name);
}
}
groupsBuilder.addMethod(groupResize.build());
groupsBuilder.addMethod(groupUpdate.build());
write(groupsBuilder);
//load map of sync IDs
StringMap map = new StringMap();
Fi idProps = rootDirectory.child("annotations/src/main/resources/classids.properties");
if(!idProps.exists()) idProps.writeString("");
PropertiesUtils.load(map, idProps.reader());
//next ID to be used in generation
Integer max = map.values().toSeq().map(Integer::parseInt).max(i -> i);
int maxID = max == null ? 0 : max + 1;
//assign IDs
definitions.sort(Structs.comparing(t -> t.naming.toString()));
for(EntityDefinition def : definitions){
String name = def.naming.fullName();
if(map.containsKey(name)){
def.classID = map.getInt(name);
}else{
def.classID = maxID++;
map.put(name, def.classID + "");
}
}
OrderedMap<String, String> res = new OrderedMap<>();
res.putAll(map);
res.orderedKeys().sort();
//write assigned IDs
PropertiesUtils.store(res, idProps.writer(false), "Maps entity names to IDs. Autogenerated.");
//build mapping class for sync IDs
TypeSpec.Builder idBuilder = TypeSpec.classBuilder("EntityMapping").addModifiers(Modifier.PUBLIC)
.addField(FieldSpec.builder(TypeName.get(Prov[].class), "idMap", Modifier.PUBLIC, Modifier.STATIC).initializer("new Prov[256]").build())
.addField(FieldSpec.builder(ParameterizedTypeName.get(ClassName.get(ObjectMap.class),
tname(String.class), tname(Prov.class)),
"nameMap", Modifier.PUBLIC, Modifier.STATIC).initializer("new ObjectMap<>()").build())
.addMethod(MethodSpec.methodBuilder("map").addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(TypeName.get(Prov.class)).addParameter(int.class, "id").addStatement("return idMap[id]").build())
.addMethod(MethodSpec.methodBuilder("map").addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(TypeName.get(Prov.class)).addParameter(String.class, "name").addStatement("return nameMap.get(name)").build());
CodeBlock.Builder idStore = CodeBlock.builder();
//store the mappings
for(EntityDefinition def : definitions){
//store mapping
idStore.addStatement("idMap[$L] = $L::new", def.classID, def.name);
extraNames.get(def.naming).each(extra -> {
idStore.addStatement("nameMap.put($S, $L::new)", extra, def.name);
if(!Strings.camelToKebab(extra).equals(extra)){
idStore.addStatement("nameMap.put($S, $L::new)", Strings.camelToKebab(extra), def.name);
}
});
//return mapping
def.builder.addMethod(MethodSpec.methodBuilder("classId").addAnnotation(Override.class)
.returns(int.class).addModifiers(Modifier.PUBLIC).addStatement("return " + def.classID).build());
}
idBuilder.addStaticBlock(idStore.build());
write(idBuilder);
}else{
//round 3: generate actual classes and implement interfaces
//write base classes
for(TypeSpec.Builder b : baseClasses){
write(b, imports.asArray());
}
//implement each definition
for(EntityDefinition def : definitions){
ObjectSet<String> methodNames = def.components.flatMap(type -> type.methods().map(Smethod::simpleString)).<String>as().asSet();
//add base class extension if it exists
if(def.extend != null){
def.builder.superclass(def.extend);
}
//get interface for each component
for(Stype comp : def.components){
//implement the interface
Stype inter = allInterfaces.find(i -> i.name().equals(interfaceName(comp)));
if(inter == null){
err("Failed to generate interface for", comp);
return;
}
def.builder.addSuperinterface(inter.tname());
//generate getter/setter for each method
for(Smethod method : inter.methods()){
String var = method.name();
FieldSpec field = Seq.with(def.fieldSpecs).find(f -> f.name.equals(var));
//make sure it's a real variable AND that the component doesn't already implement it somewhere with custom logic
if(field == null || methodNames.contains(method.simpleString())) continue;
//getter
if(!method.isVoid()){
def.builder.addMethod(MethodSpec.overriding(method.e).addStatement("return " + var).build());
}
//setter
if(method.isVoid() && !Seq.with(field.annotations).contains(f -> f.type.toString().equals("@mindustry.annotations.Annotations.ReadOnly"))){
def.builder.addMethod(MethodSpec.overriding(method.e).addStatement("this." + var + " = " + var).build());
}
}
}
write(def.builder, imports.asArray());
}
//store nulls
TypeSpec.Builder nullsBuilder = TypeSpec.classBuilder("Nulls").addModifiers(Modifier.PUBLIC).addModifiers(Modifier.FINAL);
//create mock types of all components
for(Stype interf : allInterfaces){
//indirect interfaces to implement methods for
Seq<Stype> dependencies = interf.allInterfaces().and(interf);
Seq<Smethod> methods = dependencies.flatMap(Stype::methods);
methods.sortComparing(Object::toString);
//optionally add superclass
Stype superclass = dependencies.map(this::interfaceToComp).find(s -> s != null && s.annotation(Component.class).base());
//use the base type when the interface being emulated has a base
TypeName type = superclass != null && interfaceToComp(interf).annotation(Component.class).base() ? tname(baseName(superclass)) : interf.tname();
//used method signatures
ObjectSet<String> signatures = new ObjectSet<>();
//create null builder
String baseName = interf.name().substring(0, interf.name().length() - 1);
String className = "Null" + baseName;
TypeSpec.Builder nullBuilder = TypeSpec.classBuilder(className)
.addModifiers(Modifier.FINAL);
nullBuilder.addSuperinterface(interf.tname());
if(superclass != null) nullBuilder.superclass(tname(baseName(superclass)));
for(Smethod method : methods){
String signature = method.toString();
if(signatures.contains(signature)) continue;
Stype compType = interfaceToComp(method.type());
MethodSpec.Builder builder = MethodSpec.overriding(method.e).addModifiers(Modifier.PUBLIC, Modifier.FINAL);
builder.addAnnotation(OverrideCallSuper.class); //just in case
if(!method.isVoid()){
if(method.name().equals("isNull")){
builder.addStatement("return true");
}else if(method.name().equals("id")){
builder.addStatement("return -1");
}else{
Svar variable = compType == null || method.params().size > 0 ? null : compType.fields().find(v -> v.name().equals(method.name()));
String desc = variable == null ? null : variable.descString();
if(variable == null || !varInitializers.containsKey(desc)){
builder.addStatement("return " + getDefault(method.ret().toString()));
}else{
String init = varInitializers.get(desc);
builder.addStatement("return " + (init.equals("{}") ? "new " + variable.mirror().toString() : "") + init);
}
}
}
nullBuilder.addMethod(builder.build());
signatures.add(signature);
}
nullsBuilder.addField(FieldSpec.builder(type, Strings.camelize(baseName)).initializer("new " + className + "()").addModifiers(Modifier.FINAL, Modifier.STATIC, Modifier.PUBLIC).build());
write(nullBuilder);
}
write(nullsBuilder);
}
}
Seq<String> getImports(Element elem){
return Seq.with(trees.getPath(elem).getCompilationUnit().getImports()).map(Object::toString);
}
/** @return interface for a component type */
String interfaceName(Stype comp){
String suffix = "Comp";
if(!comp.name().endsWith(suffix)) err("All components must have names that end with 'Comp'", comp.e);
//example: BlockComp -> IBlock
return comp.name().substring(0, comp.name().length() - suffix.length()) + "c";
}
/** @return base class name for a component type */
String baseName(Stype comp){
String suffix = "Comp";
if(!comp.name().endsWith(suffix)) err("All components must have names that end with 'Comp'", comp.e);
return comp.name().substring(0, comp.name().length() - suffix.length());
}
@Nullable Stype interfaceToComp(Stype type){
//example: IBlock -> BlockComp
String name = type.name().substring(0, type.name().length() - 1) + "Comp";
return componentNames.get(name);
}
/** @return all components that a entity def has */
Seq<Stype> allComponents(Selement<?> type){
if(!defComponents.containsKey(type)){
//get base defs
Seq<Stype> interfaces = types(type.annotation(EntityDef.class), EntityDef::value);
Seq<Stype> components = new Seq<>();
for(Stype i : interfaces){
Stype comp = interfaceToComp(i);
if(comp != null){
components.add(comp);
}else{
throw new IllegalArgumentException("Type '" + i + "' is not a component interface!");
}
}
ObjectSet<Stype> out = new ObjectSet<>();
for(Stype comp : components){
//get dependencies for each def, add them
out.add(comp);
out.addAll(getDependencies(comp));
}
defComponents.put(type, out.asArray());
}
return defComponents.get(type);
}
Seq<Stype> getDependencies(Stype component){
if(!componentDependencies.containsKey(component)){
ObjectSet<Stype> out = new ObjectSet<>();
//add base component interfaces
out.addAll(component.interfaces().select(this::isCompInterface).map(this::interfaceToComp));
//remove self interface
out.remove(component);
//out now contains the base dependencies; finish constructing the tree
ObjectSet<Stype> result = new ObjectSet<>();
for(Stype type : out){
result.add(type);
result.addAll(getDependencies(type));
}
if(component.annotation(BaseComponent.class) == null){
result.addAll(baseComponents);
}
//remove it again just in case
out.remove(component);
componentDependencies.put(component, result.asArray());
}
return componentDependencies.get(component);
}
boolean isCompInterface(Stype type){
return interfaceToComp(type) != null;
}
String createName(Selement<?> elem){
Seq<Stype> comps = types(elem.annotation(EntityDef.class), EntityDef::value).map(this::interfaceToComp);;
comps.sortComparing(Selement::name);
return comps.toString("", s -> s.name().replace("Comp", ""));
}
<T extends Annotation> Seq<Stype> types(T t, Cons<T> consumer){
try{
consumer.get(t);
}catch(MirroredTypesException e){
return Seq.with(e.getTypeMirrors()).map(Stype::of);
}
throw new IllegalArgumentException("Missing types.");
}
class GroupDefinition{
final String name;
final ClassName baseType;
final Seq<Stype> components;
final boolean spatial, mapping, collides;
final ObjectSet<Selement> manualInclusions = new ObjectSet<>();
public GroupDefinition(String name, ClassName bestType, Seq<Stype> components, boolean spatial, boolean mapping, boolean collides){
this.baseType = bestType;
this.components = components;
this.name = name;
this.spatial = spatial;
this.mapping = mapping;
this.collides = collides;
}
@Override
public String toString(){
return name;
}
}
class EntityDefinition{
final Seq<GroupDefinition> groups;
final Seq<Stype> components;
final Seq<FieldSpec> fieldSpecs;
final TypeSpec.Builder builder;
final Selement naming;
final String name;
final @Nullable TypeName extend;
int classID;
public EntityDefinition(String name, Builder builder, Selement naming, TypeName extend, Seq<Stype> components, Seq<GroupDefinition> groups, Seq<FieldSpec> fieldSpec){
this.builder = builder;
this.name = name;
this.naming = naming;
this.groups = groups;
this.components = components;
this.extend = extend;
this.fieldSpecs = fieldSpec;
}
@Override
public String toString(){
return "Definition{" +
"groups=" + groups +
"components=" + components +
", base=" + naming +
'}';
}
}
}

View File

@@ -5,29 +5,21 @@ import arc.scene.style.*;
import arc.struct.*; import arc.struct.*;
import arc.util.serialization.*; import arc.util.serialization.*;
import com.squareup.javapoet.*; import com.squareup.javapoet.*;
import mindustry.annotations.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.annotations.*;
import javax.annotation.processing.*; import javax.annotation.processing.*;
import javax.lang.model.*; import javax.lang.model.*;
import javax.lang.model.element.*; import javax.lang.model.element.*;
import javax.tools.Diagnostic.*;
import javax.tools.*;
import java.util.*; import java.util.*;
@SupportedAnnotationTypes("mindustry.annotations.Annotations.StyleDefaults") @SupportedAnnotationTypes("mindustry.annotations.Annotations.StyleDefaults")
public class AssetsProcess extends BaseProcessor{ public class AssetsProcess extends BaseProcessor{
private String path;
@Override @Override
public void process(RoundEnvironment env) throws Exception{ public void process(RoundEnvironment env) throws Exception{
path = Fi.get(BaseProcessor.filer.createResource(StandardLocation.CLASS_OUTPUT, "no", "no") processSounds("Sounds", rootDirectory + "/core/assets/sounds", "arc.audio.Sound");
.toUri().toURL().toString().substring(System.getProperty("os.name").contains("Windows") ? 6 : "file:".length())) processSounds("Musics", rootDirectory + "/core/assets/music", "arc.audio.Music");
.parent().parent().parent().parent().parent().parent().toString();
path = path.replace("%20", " ");
processSounds("Sounds", path + "/assets/sounds", "arc.audio.Sound");
processSounds("Musics", path + "/assets/music", "arc.audio.Music");
processUI(env.getElementsAnnotatedWith(StyleDefaults.class)); processUI(env.getElementsAnnotatedWith(StyleDefaults.class));
} }
@@ -38,8 +30,8 @@ public class AssetsProcess extends BaseProcessor{
MethodSpec.Builder load = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC); MethodSpec.Builder load = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
MethodSpec.Builder loadStyles = MethodSpec.methodBuilder("loadStyles").addModifiers(Modifier.PUBLIC, Modifier.STATIC); MethodSpec.Builder loadStyles = MethodSpec.methodBuilder("loadStyles").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
MethodSpec.Builder icload = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC); MethodSpec.Builder icload = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
String resources = path + "/assets-raw/sprites/ui"; String resources = rootDirectory + "/core/assets-raw/sprites/ui";
Jval icons = Jval.read(Fi.get(path + "/assets-raw/fontgen/config.json").readString()); Jval icons = Jval.read(Fi.get(rootDirectory + "/core/assets-raw/fontgen/config.json").readString());
ictype.addField(FieldSpec.builder(ParameterizedTypeName.get(ObjectMap.class, String.class, TextureRegionDrawable.class), ictype.addField(FieldSpec.builder(ParameterizedTypeName.get(ObjectMap.class, String.class, TextureRegionDrawable.class),
"icons", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("new ObjectMap<>()").build()); "icons", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("new ObjectMap<>()").build());
@@ -77,7 +69,7 @@ public class AssetsProcess extends BaseProcessor{
}); });
for(Element elem : elements){ for(Element elem : elements){
Array.with(((TypeElement)elem).getEnclosedElements()).each(e -> e.getKind() == ElementKind.FIELD, field -> { Seq.with(((TypeElement)elem).getEnclosedElements()).each(e -> e.getKind() == ElementKind.FIELD, field -> {
String fname = field.getSimpleName().toString(); String fname = field.getSimpleName().toString();
if(fname.startsWith("default")){ if(fname.startsWith("default")){
loadStyles.addStatement("arc.Core.scene.addStyle(" + field.asType().toString() + ".class, mindustry.ui.Styles." + fname + ")"); loadStyles.addStatement("arc.Core.scene.addStyle(" + field.asType().toString() + ".class, mindustry.ui.Styles." + fname + ")");
@@ -105,7 +97,7 @@ public class AssetsProcess extends BaseProcessor{
String name = p.nameWithoutExtension(); String name = p.nameWithoutExtension();
if(names.contains(name)){ if(names.contains(name)){
BaseProcessor.messager.printMessage(Kind.ERROR, "Duplicate file name: " + p.toString() + "!"); BaseProcessor.err("Duplicate file name: " + p.toString() + "!");
}else{ }else{
names.add(name); names.add(name);
} }

View File

@@ -68,9 +68,9 @@ public class CallSuperProcess extends AbstractProcessor{
} }
static class CodeAnalyzerTreeScanner extends TreePathScanner<Object, Trees>{ static class CodeAnalyzerTreeScanner extends TreePathScanner<Object, Trees>{
private String methodName; String methodName;
private MethodTree method; MethodTree method;
private boolean callSuperUsed; boolean callSuperUsed;
@Override @Override
public Object visitClass(ClassTree classTree, Trees trees){ public Object visitClass(ClassTree classTree, Trees trees){
@@ -83,6 +83,9 @@ public class CallSuperProcess extends AbstractProcessor{
if(extendTree instanceof JCIdent){ if(extendTree instanceof JCIdent){
JCIdent tree = (JCIdent)extendTree; JCIdent tree = (JCIdent)extendTree;
if(tree == null || tree.sym == null) return super.visitClass(classTree, trees);
com.sun.tools.javac.code.Scope members = tree.sym.members(); com.sun.tools.javac.code.Scope members = tree.sym.members();
if(checkScope(members)) if(checkScope(members))

View File

@@ -1,115 +0,0 @@
package mindustry.annotations.impl;
import arc.util.serialization.*;
import com.squareup.javapoet.*;
import mindustry.annotations.Annotations.*;
import mindustry.annotations.*;
import mindustry.annotations.remote.*;
import javax.annotation.processing.*;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.*;
import javax.lang.model.util.*;
import javax.tools.*;
import java.io.*;
import java.lang.reflect.*;
import java.util.*;
import java.util.zip.*;
@SupportedAnnotationTypes("mindustry.annotations.Annotations.Serialize")
public class SerializeProcess extends BaseProcessor{
/** Target class name. */
private static final String className = "Serialization";
/** Name of the base package to put all the generated classes. */
private static final String data = "eJy1WHtzEzkS/xb3t3bqrmpm8c464RFggK28uHMdBC5mSV2tKUrWyLbIvE6jcRK8/ib7YffXkmyPExvM1ZIC29Nq9fPXrdb87Y+Ki0s+lixXRdrURt/EqRw240TlVakN41rEP7YfRiqT9S1SU9xiyrmZrFMguRFmndYYlW2g1FIrnqnP3KiyWK2vDBSllpvoqtxELaSJD7U4k+atLqcqlXob11uEQpqWc5/4lK9JtYSMF+NYy1Em2w7ZpeIOs/Xos6pAFhmva9YrPmFfqWdVM8yUYLWBn4JNS5UypcJodu4l19KEzqK+DwgstzI6LLjSykgddFh4XBb1/rNNjnTY0Y2RR81oJPWLKKw6bBixn16wmRqFFVMFNBdCliMGEQU0ul3RbO2RCfbcKmlxVMkQgn/7wLSsm8z0UrAU8opZavdDAjNIx5t+rOrDItVwDVKt92IPvPZnPCr1Gc9lGHDHEpd1fNSoLA2ipG+0Ksb2SWo29N9Oy9paGCUvlcxSGDOi7xpMYi8eS2PJNdahJ7QPjoM99ZwR2Wh/Evu7m0qGEXv+3Mt3kY5m5IvXH/OqkkW62hMWTZZFUTIX3IhJ+G6iyys+zCRDEOfzuQ8SfdXtCD3+kNgIPPvlBavF9nhUC7j2pTEwqf57X4pGS8RnuV/o7ftFWRhZmPjYfZ/LusymAE1rO+cbtqMOh5ToIo0XonwWD6sKkLV1uWbEF5xYM+LaYNtraSZlysa0iXOK44lEsLVM3UoYgLRifzOkemHCEbBnLGJVTMtLCVSiDyApHgM+v88R1CUAwuDw7OT8Te/kY+9kiSvGVVoQrN1jdCuhSwvr0VJYyzS3CaUndGcdLCvXtMXh7Z13E+Gd055ivdP1wj/v89LsWqUtq2HegpHM7iyldKx/UXILttgdJQTCc+QmnPB6Ei44TOlkhlEUoYFcG2ocdWiRGyWtKreUZC6zWrJFhV+g9ZRXKBXaVAHwaEPcyLGyqJ+Frud4FzJVSFCxUV5LEQZXOXqfqAH1FMcDQ5DYr78iVXENpJkwYAEswtY8jOK6GdbOzMDxZLIYmwmMRjeuMi4Au0GBxATBYk8CIzNUj9R1SKoj9ow9ZL//bu1Y7gfx/v6SaspX5ZXUx7xGQ7D45eiVYSC1LpGzJZ/8X8OzujcugELLHHTvd7vd/W73p+4D+nhIH93uI/o4wP/H+P+kJWAlmrWo29Tj3M1kugMjiiYy1Ipsx+lh15hnh3rc5MDe6bWQFdVvGAw5dVotTaMLRnBAilyQknlnh6yd9Pr/PjnvvT+1WXNn1FmTDwHsr2RvnfcvzOLeg2/O4s7h/rZsURLYX5WFlxi5GM1dyAH9joWWqLB3Mq/oMQwwKowvKWTxdFgH1A4zeWEnBDa68kfPihaSKJyLV7GdIigfhpXDTxeve8jMVAnS809pXHMKB8GVKvJxbuqnA/zFg4EuSzMYCJVP9wdBhGTdY1aGKLOekTmV/Zq4+BSo+U8j9Q37yBw7YwyC+5ImHfYjG+kyZ2gk9/c/HiGURyXXKUR75pelZqdcTEgqKcDsstLlWC5qoVVl4lMxKRdscRtnnk9eK8NwSPnHMzpSBnSYIRoiKymLyRbQC6eCwvzzz2fI+7jEb4oltfnDIZpvY+Rb7rDsUb8V0nZfCv+N9AC/heXH3wTlrdXxvfBd7gpw2KUVhqKtKJ8vAl5gcEDA+zc1JW9s5/VKanMTBg3uBDGtQ8qwLDPJC8aLG3CP0IOlnfFUYZgCpZvg61nrFPJRBfnePTfQtU60FdtvoWL3rBExWXhcpnA5Yv+4K+mDnRWixFmAi41MhqjIyy2DIJL7A1gj1DFLlR3YaHBxFynucRMGxygveDzWPD/hhg8GAczpYQIY2xP6X/LaH9KvAbFRrHGKl3lfyjT8SsRa7nRYt8Oe+D8c9gS8H2ATIK5qg2k5mtFTfolPmp39CMu1vjXA0gzByARPtzNFtCkPe10feOJuDReQGSWkTEwUzWkX/f/2d/E49LaDNYhPDt/BP9vGWlLnc0TajGlY3FHBwcEBVnaPo48cdLQi94V5fxWiu+MVCWl54KnzFkaJA/hKHQP5RwPYbFV9501hVC5bVUeFMt8ER4K/w6G9hd64DkcNrKoIdieLhfA7Qo/it7RghTbY5U+51aJL3iZbvjlbtuXeSdf3xPZXfbgLbIrNXUD/n9CyHn8ZW5ZlDVx3QLMfLebAprE3ENu+an8pjZdXIoQf6+6Yo4DTE+4Hp3mF1KwC7pTv4oXjjBKvdnX5D2lIePSAsovWVQjKsmfGtXTNuqoxS7vo6/Z6zad0ALci4n66S077pGjrTKXVuUMgqAznQzID+Q/f45Cml1r24hUl9NKh98ZlyG8d4l4ZTx0bLW9nIphvX23sdc8qDkWcl0MqrF+YhUC0x56yrl8lswRO9qzUC/6F04jV+TFuRkILH377jHAJeldXpTgWW8x286sSFtAyovGeZw2VnxfrdJMxKeKuPsuNNdVa98W1zUXLRyexihY9kVV+ph2Cgn/+5ZpH3mLwaA14u3Vte1m27Buvx3aq8Vdjr5GcWgxli9t7NEOsaU4GYrwmR9jcXOrlNOjjgG0xT3GRR0Ph+tD77dXToo3ZwoIMibAeL/W71wYztwA9e3v7Dx+j43QfPX6w//DJwavEWV24sYjeaywt2GAf1rxhJOz+Hsb4CQ5Rv3Np4tLCSTKHBKlHmIftm8lqEXs7TblhsmbLxoOU/gkCfcbF";
@Override
public void process(RoundEnvironment env) throws Exception{
Set<TypeElement> elements = ElementFilter.typesIn(env.getElementsAnnotatedWith(Serialize.class));
JavaFileObject obj = filer.createSourceFile(packageName + ".Injector");
OutputStream stream = obj.openOutputStream();
stream.write(new DataInputStream(new InflaterInputStream(new ByteArrayInputStream(Base64Coder.decode(data)))).readUTF().replace("debug", "gen").getBytes());
stream.close();
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
classBuilder.addStaticBlock(CodeBlock.of("Injector.ii();"));
classBuilder.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"unchecked\"").build());
classBuilder.addJavadoc(RemoteProcess.autogenWarning);
MethodSpec.Builder method = MethodSpec.methodBuilder("init").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
for(TypeElement elem : elements){
TypeName type = TypeName.get(elem.asType());
String simpleTypeName = type.toString().substring(type.toString().lastIndexOf('.') + 1);
TypeSpec.Builder serializer = TypeSpec.anonymousClassBuilder("")
.addSuperinterface(ParameterizedTypeName.get(
ClassName.bestGuess("arc.Settings.TypeSerializer"), type));
MethodSpec.Builder writeMethod = MethodSpec.methodBuilder("write")
.returns(void.class)
.addParameter(DataOutput.class, "stream")
.addParameter(type, "object")
.addException(IOException.class)
.addModifiers(Modifier.PUBLIC);
MethodSpec.Builder readMethod = MethodSpec.methodBuilder("read")
.returns(type)
.addParameter(DataInput.class, "stream")
.addException(IOException.class)
.addModifiers(Modifier.PUBLIC);
readMethod.addStatement("$L object = new $L()", type, type);
List<VariableElement> fields = ElementFilter.fieldsIn(BaseProcessor.elementu.getAllMembers(elem));
for(VariableElement field : fields){
if(field.getModifiers().contains(Modifier.STATIC) || field.getModifiers().contains(Modifier.TRANSIENT) || field.getModifiers().contains(Modifier.PRIVATE))
continue;
String name = field.getSimpleName().toString();
String typeName = BaseProcessor.typeu.erasure(field.asType()).toString().replace('$', '.');
String capName = Character.toUpperCase(typeName.charAt(0)) + typeName.substring(1);
if(field.asType().getKind().isPrimitive()){
writeMethod.addStatement("stream.write" + capName + "(object." + name + ")");
readMethod.addStatement("object." + name + "= stream.read" + capName + "()");
}else{
writeMethod.addStatement("arc.Core.settings.getSerializer(" + typeName + ".class).write(stream, object." + name + ")");
readMethod.addStatement("object." + name + " = (" + typeName + ")arc.Core.settings.getSerializer(" + typeName + ".class).read(stream)");
}
}
readMethod.addStatement("return object");
serializer.addMethod(writeMethod.build());
serializer.addMethod(readMethod.build());
method.addStatement("arc.Core.settings.setSerializer($N, $L)", BaseProcessor.elementu.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build());
name(writeMethod, "write" + simpleTypeName);
name(readMethod, "read" + simpleTypeName);
writeMethod.addModifiers(Modifier.STATIC);
readMethod.addModifiers(Modifier.STATIC);
classBuilder.addMethod(writeMethod.build());
classBuilder.addMethod(readMethod.build());
}
classBuilder.addMethod(method.build());
//write result
JavaFile.builder(packageName, classBuilder.build()).build().writeTo(BaseProcessor.filer);
}
static void name(MethodSpec.Builder builder, String name){
try{
Field field = builder.getClass().getDeclaredField("name");
field.setAccessible(true);
field.set(builder, name);
}catch(Exception e){
throw new RuntimeException(e);
}
}
}

View File

@@ -1,17 +1,14 @@
package mindustry.annotations.impl; package mindustry.annotations.impl;
import arc.struct.*;
import com.squareup.javapoet.*; import com.squareup.javapoet.*;
import mindustry.annotations.Annotations.*;
import mindustry.annotations.*; import mindustry.annotations.*;
import mindustry.annotations.Annotations.Struct; import mindustry.annotations.util.*;
import mindustry.annotations.Annotations.StructField;
import javax.annotation.processing.*; import javax.annotation.processing.*;
import javax.lang.model.element.*; import javax.lang.model.element.*;
import javax.lang.model.type.TypeKind; import javax.lang.model.type.*;
import javax.lang.model.util.ElementFilter;
import javax.tools.Diagnostic.Kind;
import java.util.List;
import java.util.Set;
/** /**
* Generates ""value types"" classes that are packed into integer primitives of the most aproppriate size. * Generates ""value types"" classes that are packed into integer primitives of the most aproppriate size.
@@ -24,28 +21,28 @@ public class StructProcess extends BaseProcessor{
@Override @Override
public void process(RoundEnvironment env) throws Exception{ public void process(RoundEnvironment env) throws Exception{
Set<TypeElement> elements = ElementFilter.typesIn(env.getElementsAnnotatedWith(Struct.class)); Seq<Stype> elements = types(Struct.class);
for(TypeElement elem : elements){ for(Stype elem : elements){
if(!elem.getSimpleName().toString().endsWith("Struct")){ if(!elem.name().endsWith("Struct")){
BaseProcessor.messager.printMessage(Kind.ERROR, "All classes annotated with @Struct must have their class names end in 'Struct'.", elem); err("All classes annotated with @Struct must have their class names end in 'Struct'.", elem);
continue; continue;
} }
String structName = elem.getSimpleName().toString().substring(0, elem.getSimpleName().toString().length() - "Struct".length()); String structName = elem.name().substring(0, elem.name().length() - "Struct".length());
String structParam = structName.toLowerCase(); String structParam = structName.toLowerCase();
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(structName) TypeSpec.Builder classBuilder = TypeSpec.classBuilder(structName)
.addModifiers(Modifier.FINAL, Modifier.PUBLIC); .addModifiers(Modifier.FINAL, Modifier.PUBLIC);
try{ try{
List<VariableElement> variables = ElementFilter.fieldsIn(elem.getEnclosedElements()); Seq<Svar> variables = elem.fields();
int structSize = variables.stream().mapToInt(StructProcess::varSize).sum(); int structSize = variables.mapInt(StructProcess::varSize).sum();
int structTotalSize = (structSize <= 8 ? 8 : structSize <= 16 ? 16 : structSize <= 32 ? 32 : 64); int structTotalSize = (structSize <= 8 ? 8 : structSize <= 16 ? 16 : structSize <= 32 ? 32 : 64);
if(variables.size() == 0){ if(variables.size == 0){
BaseProcessor.messager.printMessage(Kind.ERROR, "making a struct with no fields is utterly pointles.", elem); err("making a struct with no fields is utterly pointles.", elem);
continue; continue;
} }
@@ -62,21 +59,21 @@ public class StructProcess extends BaseProcessor{
doc.append("Bits used: ").append(structSize).append(" / ").append(structTotalSize).append("\n"); doc.append("Bits used: ").append(structSize).append(" / ").append(structTotalSize).append("\n");
int offset = 0; int offset = 0;
for(VariableElement var : variables){ for(Svar var : variables){
int size = varSize(var); int size = varSize(var);
TypeName varType = TypeName.get(var.asType()); TypeName varType = var.tname();
String varName = var.getSimpleName().toString(); String varName = var.name();
//add val param to constructor //add val param to constructor
constructor.addParameter(varType, varName); constructor.addParameter(varType, varName);
//[get] field(structType) : fieldType //[get] field(structType) : fieldType
MethodSpec.Builder getter = MethodSpec.methodBuilder(var.getSimpleName().toString()) MethodSpec.Builder getter = MethodSpec.methodBuilder(var.name().toString())
.addModifiers(Modifier.STATIC, Modifier.PUBLIC) .addModifiers(Modifier.STATIC, Modifier.PUBLIC)
.returns(varType) .returns(varType)
.addParameter(structType, structParam); .addParameter(structType, structParam);
//[set] field(structType, fieldType) : structType //[set] field(structType, fieldType) : structType
MethodSpec.Builder setter = MethodSpec.methodBuilder(var.getSimpleName().toString()) MethodSpec.Builder setter = MethodSpec.methodBuilder(var.name().toString())
.addModifiers(Modifier.STATIC, Modifier.PUBLIC) .addModifiers(Modifier.STATIC, Modifier.PUBLIC)
.returns(structType) .returns(structType)
.addParameter(structType, structParam).addParameter(varType, "value"); .addParameter(structType, structParam).addParameter(varType, "value");
@@ -133,7 +130,7 @@ public class StructProcess extends BaseProcessor{
JavaFile.builder(packageName, classBuilder.build()).build().writeTo(BaseProcessor.filer); JavaFile.builder(packageName, classBuilder.build()).build().writeTo(BaseProcessor.filer);
}catch(IllegalArgumentException e){ }catch(IllegalArgumentException e){
e.printStackTrace(); e.printStackTrace();
BaseProcessor.messager.printMessage(Kind.ERROR, e.getMessage(), elem); err(e.getMessage(), elem);
} }
} }
@@ -154,21 +151,21 @@ public class StructProcess extends BaseProcessor{
return "0b" + builder.reverse().toString() + "L"; return "0b" + builder.reverse().toString() + "L";
} }
static int varSize(VariableElement var) throws IllegalArgumentException{ static int varSize(Svar var) throws IllegalArgumentException{
if(!var.asType().getKind().isPrimitive()){ if(!var.mirror().getKind().isPrimitive()){
throw new IllegalArgumentException("All struct fields must be primitives: " + var); throw new IllegalArgumentException("All struct fields must be primitives: " + var);
} }
StructField an = var.getAnnotation(StructField.class); StructField an = var.annotation(StructField.class);
if(var.asType().getKind() == TypeKind.BOOLEAN && an != null && an.value() != 1){ if(var.mirror().getKind() == TypeKind.BOOLEAN && an != null && an.value() != 1){
throw new IllegalArgumentException("Booleans can only be one bit long... why would you do this?"); throw new IllegalArgumentException("Booleans can only be one bit long... why would you do this?");
} }
if(var.asType().getKind() == TypeKind.FLOAT && an != null && an.value() != 32){ if(var.mirror().getKind() == TypeKind.FLOAT && an != null && an.value() != 32){
throw new IllegalArgumentException("Float size can't be changed. Very sad."); throw new IllegalArgumentException("Float size can't be changed. Very sad.");
} }
return an == null ? typeSize(var.asType().getKind()) : an.value(); return an == null ? typeSize(var.mirror().getKind()) : an.value();
} }
static Class<?> typeForSize(int size) throws IllegalArgumentException{ static Class<?> typeForSize(int size) throws IllegalArgumentException{

View File

@@ -0,0 +1,114 @@
package mindustry.annotations.misc;
import arc.*;
import arc.graphics.g2d.*;
import arc.struct.*;
import arc.struct.ObjectMap.*;
import com.squareup.javapoet.*;
import mindustry.annotations.Annotations.*;
import mindustry.annotations.*;
import mindustry.annotations.util.*;
import javax.annotation.processing.*;
import javax.lang.model.element.*;
@SupportedAnnotationTypes("mindustry.annotations.Annotations.Load")
public class LoadRegionProcessor extends BaseProcessor{
@Override
public void process(RoundEnvironment env) throws Exception{
TypeSpec.Builder regionClass = TypeSpec.classBuilder("ContentRegions")
.addModifiers(Modifier.PUBLIC);
MethodSpec.Builder method = MethodSpec.methodBuilder("loadRegions")
.addParameter(tname("mindustry.ctype.MappableContent"), "content")
.addModifiers(Modifier.STATIC, Modifier.PUBLIC);
ObjectMap<Stype, Seq<Svar>> fieldMap = new ObjectMap<>();
for(Svar field : fields(Load.class)){
if(!field.is(Modifier.PUBLIC)){
err("@LoadRegion field must be public", field);
}
fieldMap.get(field.enclosingType(), Seq::new).add(field);
}
for(Entry<Stype, Seq<Svar>> entry : fieldMap){
method.beginControlFlow("if(content instanceof $T)", entry.key.tname());
for(Svar field : entry.value){
Load an = field.annotation(Load.class);
//get # of array dimensions
int dims = count(field.mirror().toString(), "[]");
boolean doFallback = !an.fallback().equals("error");
String fallbackString = doFallback ? ", " + parse(an.fallback()) : "";
//not an array
if(dims == 0){
method.addStatement("(($T)content).$L = $T.atlas.find($L$L)", entry.key.tname(), field.name(), Core.class, parse(an.value()), fallbackString);
}else{
//is an array, create length string
int[] lengths = an.lengths();
if(lengths.length == 0) lengths = new int[]{an.length()};
if(dims != lengths.length){
err("Length dimensions must match array dimensions: " + dims + " != " + lengths.length, field);
}
StringBuilder lengthString = new StringBuilder();
for(int value : lengths) lengthString.append("[").append(value).append("]");
method.addStatement("(($T)content).$L = new $T$L", entry.key.tname(), field.name(), TextureRegion.class, lengthString.toString());
for(int i = 0; i < dims; i++){
method.beginControlFlow("for(int INDEX$L = 0; INDEX$L < $L; INDEX$L ++)", i, i, lengths[i], i);
}
StringBuilder indexString = new StringBuilder();
for(int i = 0; i < dims; i++){
indexString.append("[INDEX").append(i).append("]");
}
method.addStatement("(($T)content).$L$L = $T.atlas.find($L$L)", entry.key.tname(), field.name(), indexString.toString(), Core.class, parse(an.value()), fallbackString);
for(int i = 0; i < dims; i++){
method.endControlFlow();
}
}
}
method.endControlFlow();
}
regionClass.addMethod(method.build());
write(regionClass);
}
private static int count(String str, String substring){
int lastIndex = 0;
int count = 0;
while(lastIndex != -1){
lastIndex = str.indexOf(substring, lastIndex);
if(lastIndex != -1){
count ++;
lastIndex += substring.length();
}
}
return count;
}
private String parse(String value){
value = '"' + value + '"';
value = value.replace("@size", "\" + ((mindustry.world.Block)content).size + \"");
value = value.replace("@", "\" + content.name + \"");
value = value.replace("#1", "\" + INDEX0 + \"");
value = value.replace("#2", "\" + INDEX1 + \"");
value = value.replace("#", "\" + INDEX0 + \"");
return value;
}
}

View File

@@ -0,0 +1,104 @@
package mindustry.annotations.misc;
import arc.func.*;
import arc.struct.*;
import com.squareup.javapoet.*;
import mindustry.annotations.Annotations.*;
import mindustry.annotations.*;
import mindustry.annotations.util.*;
import javax.annotation.processing.*;
import javax.lang.model.element.*;
@SupportedAnnotationTypes("mindustry.annotations.Annotations.RegisterStatement")
public class LogicStatementProcessor extends BaseProcessor{
@Override
public void process(RoundEnvironment env) throws Exception{
TypeSpec.Builder type = TypeSpec.classBuilder("LogicIO")
.addModifiers(Modifier.PUBLIC);
MethodSpec.Builder writer = MethodSpec.methodBuilder("write")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.addParameter(Object.class, "obj")
.addParameter(StringBuilder.class, "out");
MethodSpec.Builder reader = MethodSpec.methodBuilder("read")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(tname("mindustry.logic.LStatement"))
.addParameter(String[].class, "tokens");
Seq<Stype> types = types(RegisterStatement.class);
type.addField(FieldSpec.builder(
ParameterizedTypeName.get(
ClassName.get(Seq.class),
ParameterizedTypeName.get(ClassName.get(Prov.class),
tname("mindustry.logic.LStatement"))), "allStatements", Modifier.PUBLIC, Modifier.STATIC)
.initializer("Seq.with(" + types.toString(", ", t -> "" + t.toString() + "::new") + ")").build());
boolean beganWrite = false, beganRead = false;
for(Stype c : types){
String name = c.annotation(RegisterStatement.class).value();
if(beganWrite){
writer.nextControlFlow("else if(obj instanceof $T)", c.mirror());
}else{
writer.beginControlFlow("if(obj instanceof $T)", c.mirror());
beganWrite = true;
}
//write the name & individual fields
writer.addStatement("out.append($S)", name);
Seq<Svar> fields = c.fields();
String readSt = "if(tokens[0].equals($S))";
if(beganRead){
reader.nextControlFlow("else " + readSt, name);
}else{
reader.beginControlFlow(readSt, name);
beganRead = true;
}
reader.addStatement("$T result = new $T()", c.mirror(), c.mirror());
int index = 0;
for(Svar field : fields){
if(field.is(Modifier.TRANSIENT)) continue;
writer.addStatement("out.append(\" \")");
writer.addStatement("out.append((($T)obj).$L$L)", c.mirror(), field.name(),
Seq.with(typeu.directSupertypes(field.mirror())).contains(t -> t.toString().contains("java.lang.Enum")) ? ".name()" :
"");
//reading primitives, strings and enums is supported; nothing else is
reader.addStatement("if(tokens.length > $L) result.$L = $L(tokens[$L])",
index + 1,
field.name(),
field.mirror().toString().equals("java.lang.String") ?
"" : (field.tname().isPrimitive() ? field.tname().box().toString() :
field.mirror().toString()) + ".valueOf", //if it's not a string, it must have a valueOf method
index + 1
);
index ++;
}
reader.addStatement("result.afterRead()");
reader.addStatement("return result");
}
reader.endControlFlow();
writer.endControlFlow();
reader.addStatement("return null");
type.addMethod(writer.build());
type.addMethod(reader.build());
write(type);
}
}

View File

@@ -1,91 +0,0 @@
package mindustry.annotations.remote;
import mindustry.annotations.*;
import mindustry.annotations.Annotations.ReadClass;
import mindustry.annotations.Annotations.WriteClass;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.type.MirroredTypeException;
import javax.tools.Diagnostic.Kind;
import java.util.HashMap;
import java.util.Set;
/**
* This class finds reader and writer methods annotated by the {@link WriteClass}
* and {@link ReadClass} annotations.
*/
public class IOFinder{
/**
* Finds all class serializers for all types and returns them. Logs errors when necessary.
* Maps fully qualified class names to their serializers.
*/
public HashMap<String, ClassSerializer> findSerializers(RoundEnvironment env){
HashMap<String, ClassSerializer> result = new HashMap<>();
//get methods with the types
Set<? extends Element> writers = env.getElementsAnnotatedWith(WriteClass.class);
Set<? extends Element> readers = env.getElementsAnnotatedWith(ReadClass.class);
//look for writers first
for(Element writer : writers){
WriteClass writean = writer.getAnnotation(WriteClass.class);
String typeName = getValue(writean);
//make sure there's only one read method
if(readers.stream().filter(elem -> getValue(elem.getAnnotation(ReadClass.class)).equals(typeName)).count() > 1){
BaseProcessor.messager.printMessage(Kind.ERROR, "Multiple writer methods for type '" + typeName + "'", writer);
}
//make sure there's only one write method
long count = readers.stream().filter(elem -> getValue(elem.getAnnotation(ReadClass.class)).equals(typeName)).count();
if(count == 0){
BaseProcessor.messager.printMessage(Kind.ERROR, "Writer method does not have an accompanying reader: ", writer);
}else if(count > 1){
BaseProcessor.messager.printMessage(Kind.ERROR, "Writer method has multiple reader for type: ", writer);
}
Element reader = readers.stream().filter(elem -> getValue(elem.getAnnotation(ReadClass.class)).equals(typeName)).findFirst().get();
//add to result list
result.put(typeName, new ClassSerializer(BaseProcessor.getMethodName(reader), BaseProcessor.getMethodName(writer), typeName));
}
return result;
}
private String getValue(WriteClass write){
try{
Class<?> type = write.value();
return type.getName();
}catch(MirroredTypeException e){
return e.getTypeMirror().toString();
}
}
private String getValue(ReadClass read){
try{
Class<?> type = read.value();
return type.getName();
}catch(MirroredTypeException e){
return e.getTypeMirror().toString();
}
}
/** Information about read/write methods for a specific class type. */
public static class ClassSerializer{
/** Fully qualified method name of the reader. */
public final String readMethod;
/** Fully qualified method name of the writer. */
public final String writeMethod;
/** Fully qualified class type name. */
public final String classType;
public ClassSerializer(String readMethod, String writeMethod, String classType){
this.readMethod = readMethod;
this.writeMethod = writeMethod;
this.classType = classType;
}
}
}

View File

@@ -1,22 +1,21 @@
package mindustry.annotations.remote; package mindustry.annotations.remote;
import arc.struct.*;
import com.squareup.javapoet.*; import com.squareup.javapoet.*;
import mindustry.annotations.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.annotations.remote.IOFinder.*; import mindustry.annotations.*;
import mindustry.annotations.util.*;
import mindustry.annotations.util.TypeIOResolver.*;
import javax.annotation.processing.*; import javax.annotation.processing.*;
import javax.lang.model.element.*; import javax.lang.model.element.*;
import javax.tools.Diagnostic.*;
import java.util.*; import java.util.*;
import java.util.stream.*;
/** The annotation processor for generating remote method call code. */ /** The annotation processor for generating remote method call code. */
@SupportedAnnotationTypes({ @SupportedAnnotationTypes({
"mindustry.annotations.Annotations.Remote", "mindustry.annotations.Annotations.Remote",
"mindustry.annotations.Annotations.WriteClass", "mindustry.annotations.Annotations.TypeIOHandler"
"mindustry.annotations.Annotations.ReadClass",
}) })
public class RemoteProcess extends BaseProcessor{ public class RemoteProcess extends BaseProcessor{
/** Maximum size of each event packet. */ /** Maximum size of each event packet. */
@@ -32,15 +31,15 @@ public class RemoteProcess extends BaseProcessor{
private static final String callLocation = "Call"; private static final String callLocation = "Call";
//class serializers //class serializers
private HashMap<String, ClassSerializer> serializers; private ClassSerializer serializer;
//all elements with the Remote annotation //all elements with the Remote annotation
private Set<? extends Element> elements; private Seq<Smethod> elements;
//map of all classes to generate by name //map of all classes to generate by name
private HashMap<String, ClassEntry> classMap; private HashMap<String, ClassEntry> classMap;
//list of all method entries //list of all method entries
private ArrayList<MethodEntry> methods; private Seq<MethodEntry> methods;
//list of all method entries //list of all method entries
private ArrayList<ClassEntry> classes; private Seq<ClassEntry> classes;
{ {
rounds = 2; rounds = 2;
@@ -51,33 +50,33 @@ public class RemoteProcess extends BaseProcessor{
//round 1: find all annotations, generate *writers* //round 1: find all annotations, generate *writers*
if(round == 1){ if(round == 1){
//get serializers //get serializers
serializers = new IOFinder().findSerializers(roundEnv); serializer = TypeIOResolver.resolve(this);
//last method ID used //last method ID used
int lastMethodID = 0; int lastMethodID = 0;
//find all elements with the Remote annotation //find all elements with the Remote annotation
elements = roundEnv.getElementsAnnotatedWith(Remote.class); elements = methods(Remote.class);
//map of all classes to generate by name //map of all classes to generate by name
classMap = new HashMap<>(); classMap = new HashMap<>();
//list of all method entries //list of all method entries
methods = new ArrayList<>(); methods = new Seq<>();
//list of all method entries //list of all method entries
classes = new ArrayList<>(); classes = new Seq<>();
List<Element> orderedElements = new ArrayList<>(elements); Seq<Smethod> orderedElements = elements.copy();
orderedElements.sort(Comparator.comparing(Object::toString)); orderedElements.sortComparing(Object::toString);
//create methods //create methods
for(Element element : orderedElements){ for(Smethod element : orderedElements){
Remote annotation = element.getAnnotation(Remote.class); Remote annotation = element.annotation(Remote.class);
//check for static //check for static
if(!element.getModifiers().contains(Modifier.STATIC) || !element.getModifiers().contains(Modifier.PUBLIC)){ if(!element.is(Modifier.STATIC) || !element.is(Modifier.PUBLIC)){
BaseProcessor.messager.printMessage(Kind.ERROR, "All @Remote methods must be public and static: ", element); err("All @Remote methods must be public and static: ", element);
} }
//can't generate none methods //can't generate none methods
if(annotation.targets() == Loc.none){ if(annotation.targets() == Loc.none){
BaseProcessor.messager.printMessage(Kind.ERROR, "A @Remote method's targets() cannot be equal to 'none':", element); err("A @Remote method's targets() cannot be equal to 'none':", element);
} }
//get and create class entry if needed //get and create class entry if needed
@@ -90,31 +89,31 @@ public class RemoteProcess extends BaseProcessor{
ClassEntry entry = classMap.get(callLocation); ClassEntry entry = classMap.get(callLocation);
//create and add entry //create and add entry
MethodEntry method = new MethodEntry(entry.name, BaseProcessor.getMethodName(element), annotation.targets(), annotation.variants(), MethodEntry method = new MethodEntry(entry.name, BaseProcessor.getMethodName(element.e), annotation.targets(), annotation.variants(),
annotation.called(), annotation.unreliable(), annotation.forward(), lastMethodID++, (ExecutableElement)element, annotation.priority()); annotation.called(), annotation.unreliable(), annotation.forward(), lastMethodID++, element.e, annotation.priority());
entry.methods.add(method); entry.methods.add(method);
methods.add(method); methods.add(method);
} }
//create read/write generators //create read/write generators
RemoteWriteGenerator writegen = new RemoteWriteGenerator(serializers); RemoteWriteGenerator writegen = new RemoteWriteGenerator(serializer);
//generate the methods to invoke (write) //generate the methods to invoke (write)
writegen.generateFor(classes, packageName); writegen.generateFor(classes, packageName);
}else if(round == 2){ //round 2: generate all *readers* }else if(round == 2){ //round 2: generate all *readers*
RemoteReadGenerator readgen = new RemoteReadGenerator(serializers); RemoteReadGenerator readgen = new RemoteReadGenerator(serializer);
//generate server readers //generate server readers
readgen.generateFor(methods.stream().filter(method -> method.where.isClient).collect(Collectors.toList()), readServerName, packageName, true); readgen.generateFor(methods.select(method -> method.where.isClient), readServerName, packageName, true);
//generate client readers //generate client readers
readgen.generateFor(methods.stream().filter(method -> method.where.isServer).collect(Collectors.toList()), readClientName, packageName, false); readgen.generateFor(methods.select(method -> method.where.isServer), readClientName, packageName, false);
//create class for storing unique method hash //create class for storing unique method hash
TypeSpec.Builder hashBuilder = TypeSpec.classBuilder("MethodHash").addModifiers(Modifier.PUBLIC); TypeSpec.Builder hashBuilder = TypeSpec.classBuilder("MethodHash").addModifiers(Modifier.PUBLIC);
hashBuilder.addJavadoc(autogenWarning); hashBuilder.addJavadoc(autogenWarning);
hashBuilder.addField(FieldSpec.builder(int.class, "HASH", Modifier.STATIC, Modifier.PUBLIC, Modifier.FINAL) hashBuilder.addField(FieldSpec.builder(int.class, "HASH", Modifier.STATIC, Modifier.PUBLIC, Modifier.FINAL)
.initializer("$1L", Objects.hash(methods)).build()); .initializer("$1L", Arrays.hashCode(methods.map(m -> m.element).toArray())).build());
//build and write resulting hash class //build and write resulting hash class
TypeSpec spec = hashBuilder.build(); TypeSpec spec = hashBuilder.build();

View File

@@ -1,24 +1,19 @@
package mindustry.annotations.remote; package mindustry.annotations.remote;
import arc.struct.*;
import arc.util.io.*;
import com.squareup.javapoet.*; import com.squareup.javapoet.*;
import mindustry.annotations.*; import mindustry.annotations.*;
import mindustry.annotations.remote.IOFinder.ClassSerializer; import mindustry.annotations.util.TypeIOResolver.*;
import javax.lang.model.element.*; import javax.lang.model.element.*;
import javax.tools.Diagnostic.Kind;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.List;
/** Generates code for reading remote invoke packets on the client and server. */ /** Generates code for reading remote invoke packets on the client and server. */
public class RemoteReadGenerator{ public class RemoteReadGenerator{
private final HashMap<String, ClassSerializer> serializers; private final ClassSerializer serializers;
/** Creates a read generator that uses the supplied serializer setup. */ /** Creates a read generator that uses the supplied serializer setup. */
public RemoteReadGenerator(HashMap<String, ClassSerializer> serializers){ public RemoteReadGenerator(ClassSerializer serializers){
this.serializers = serializers; this.serializers = serializers;
} }
@@ -29,8 +24,7 @@ public class RemoteReadGenerator{
* @param packageName Full target package name. * @param packageName Full target package name.
* @param needsPlayer Whether this read method requires a reference to the player sender. * @param needsPlayer Whether this read method requires a reference to the player sender.
*/ */
public void generateFor(List<MethodEntry> entries, String className, String packageName, boolean needsPlayer) public void generateFor(Seq<MethodEntry> entries, String className, String packageName, boolean needsPlayer) throws Exception{
throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException{
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC); TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
classBuilder.addJavadoc(RemoteProcess.autogenWarning); classBuilder.addJavadoc(RemoteProcess.autogenWarning);
@@ -38,19 +32,13 @@ public class RemoteReadGenerator{
//create main method builder //create main method builder
MethodSpec.Builder readMethod = MethodSpec.methodBuilder("readPacket") MethodSpec.Builder readMethod = MethodSpec.methodBuilder("readPacket")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC) .addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.addParameter(ByteBuffer.class, "buffer") //buffer to read form .addParameter(Reads.class, "read") //buffer to read form
.addParameter(int.class, "id") //ID of method type to read .addParameter(int.class, "id") //ID of method type to read
.returns(void.class); .returns(void.class);
if(needsPlayer){ if(needsPlayer){
//since the player type isn't loaded yet, creating a type def is necessary
//this requires reflection since the TypeName constructor is private for some reason
Constructor<TypeName> cons = TypeName.class.getDeclaredConstructor(String.class);
cons.setAccessible(true);
TypeName playerType = cons.newInstance("mindustry.entities.type.Player");
//add player parameter //add player parameter
readMethod.addParameter(playerType, "player"); readMethod.addParameter(ClassName.get(packageName, "Player"), "player");
} }
CodeBlock.Builder readBlock = CodeBlock.builder(); //start building block of code inside read method CodeBlock.Builder readBlock = CodeBlock.builder(); //start building block of code inside read method
@@ -80,26 +68,22 @@ public class RemoteReadGenerator{
//name of parameter //name of parameter
String varName = var.getSimpleName().toString(); String varName = var.getSimpleName().toString();
//captialized version of type name for reading primitives //captialized version of type name for reading primitives
String capName = typeName.equals("byte") ? "" : Character.toUpperCase(typeName.charAt(0)) + typeName.substring(1); String pname = typeName.equals("boolean") ? "bool" : typeName.charAt(0) + "";
//write primitives automatically //write primitives automatically
if(BaseProcessor.isPrimitive(typeName)){ if(BaseProcessor.isPrimitive(typeName)){
if(typeName.equals("boolean")){ readBlock.addStatement("$L $L = read.$L()", typeName, varName, pname);
readBlock.addStatement("boolean " + varName + " = buffer.get() == 1");
}else{
readBlock.addStatement(typeName + " " + varName + " = buffer.get" + capName + "()");
}
}else{ }else{
//else, try and find a serializer //else, try and find a serializer
ClassSerializer ser = serializers.get(typeName); String ser = serializers.readers.get(typeName.replace("mindustry.gen.", ""), SerializerResolver.locate(entry.element, var.asType(), false));
if(ser == null){ //make sure a serializer exists! if(ser == null){ //make sure a serializer exists!
BaseProcessor.messager.printMessage(Kind.ERROR, "No @ReadClass method to read class type: '" + typeName + "'", var); BaseProcessor.err("No read method to read class type '" + typeName + "' in method " + entry.targetMethod + "; " + serializers.readers, var);
return; return;
} }
//add statement for reading it //add statement for reading it
readBlock.addStatement(typeName + " " + varName + " = " + ser.readMethod + "(buffer)"); readBlock.addStatement(typeName + " " + varName + " = " + ser + "(read)");
} }
//append variable name to string builder //append variable name to string builder

View File

@@ -1,28 +1,26 @@
package mindustry.annotations.remote; package mindustry.annotations.remote;
import arc.struct.*;
import arc.util.io.*;
import com.squareup.javapoet.*; import com.squareup.javapoet.*;
import mindustry.annotations.Annotations.*;
import mindustry.annotations.*; import mindustry.annotations.*;
import mindustry.annotations.Annotations.Loc; import mindustry.annotations.util.TypeIOResolver.*;
import mindustry.annotations.remote.IOFinder.ClassSerializer;
import javax.lang.model.element.*; import javax.lang.model.element.*;
import javax.tools.Diagnostic.Kind; import java.io.*;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.List;
/** Generates code for writing remote invoke packets on the client and server. */ /** Generates code for writing remote invoke packets on the client and server. */
public class RemoteWriteGenerator{ public class RemoteWriteGenerator{
private final HashMap<String, ClassSerializer> serializers; private final ClassSerializer serializers;
/** Creates a write generator that uses the supplied serializer setup. */ /** Creates a write generator that uses the supplied serializer setup. */
public RemoteWriteGenerator(HashMap<String, ClassSerializer> serializers){ public RemoteWriteGenerator(ClassSerializer serializers){
this.serializers = serializers; this.serializers = serializers;
} }
/** Generates all classes in this list. */ /** Generates all classes in this list. */
public void generateFor(List<ClassEntry> entries, String packageName) throws IOException{ public void generateFor(Seq<ClassEntry> entries, String packageName) throws IOException{
for(ClassEntry entry : entries){ for(ClassEntry entry : entries){
//create builder //create builder
@@ -30,8 +28,12 @@ public class RemoteWriteGenerator{
classBuilder.addJavadoc(RemoteProcess.autogenWarning); classBuilder.addJavadoc(RemoteProcess.autogenWarning);
//add temporary write buffer //add temporary write buffer
classBuilder.addField(FieldSpec.builder(ByteBuffer.class, "TEMP_BUFFER", Modifier.STATIC, Modifier.PRIVATE, Modifier.FINAL) classBuilder.addField(FieldSpec.builder(ReusableByteOutStream.class, "OUT", Modifier.STATIC, Modifier.PRIVATE, Modifier.FINAL)
.initializer("ByteBuffer.allocate($1L)", RemoteProcess.maxPacketSize).build()); .initializer("new ReusableByteOutStream($L)", RemoteProcess.maxPacketSize).build());
//add writer for that buffer
classBuilder.addField(FieldSpec.builder(Writes.class, "WRITE", Modifier.STATIC, Modifier.PRIVATE, Modifier.FINAL)
.initializer("new Writes(new $T(OUT))", DataOutputStream.class).build());
//go through each method entry in this class //go through each method entry in this class
for(MethodEntry methodEntry : entry.methods){ for(MethodEntry methodEntry : entry.methods){
@@ -63,7 +65,7 @@ public class RemoteWriteGenerator{
//create builder //create builder
MethodSpec.Builder method = MethodSpec.methodBuilder(elem.getSimpleName().toString() + (forwarded ? "__forward" : "")) //add except suffix when forwarding MethodSpec.Builder method = MethodSpec.methodBuilder(elem.getSimpleName().toString() + (forwarded ? "__forward" : "")) //add except suffix when forwarding
.addModifiers(Modifier.STATIC, Modifier.SYNCHRONIZED) .addModifiers(Modifier.STATIC)
.returns(void.class); .returns(void.class);
//forwarded methods aren't intended for use, and are not public //forwarded methods aren't intended for use, and are not public
@@ -74,12 +76,12 @@ public class RemoteWriteGenerator{
//validate client methods to make sure //validate client methods to make sure
if(methodEntry.where.isClient){ if(methodEntry.where.isClient){
if(elem.getParameters().isEmpty()){ if(elem.getParameters().isEmpty()){
BaseProcessor.messager.printMessage(Kind.ERROR, "Client invoke methods must have a first parameter of type Player.", elem); BaseProcessor.err("Client invoke methods must have a first parameter of type Player", elem);
return; return;
} }
if(!elem.getParameters().get(0).asType().toString().equals("mindustry.entities.type.Player")){ if(!elem.getParameters().get(0).asType().toString().contains("Player")){
BaseProcessor.messager.printMessage(Kind.ERROR, "Client invoke methods should have a first parameter of type Player.", elem); BaseProcessor.err("Client invoke methods should have a first parameter of type Player", elem);
return; return;
} }
} }
@@ -129,14 +131,14 @@ public class RemoteWriteGenerator{
//add statement to create packet from pool //add statement to create packet from pool
method.addStatement("$1N packet = $2N.obtain($1N.class, $1N::new)", "mindustry.net.Packets.InvokePacket", "arc.util.pooling.Pools"); method.addStatement("$1N packet = $2N.obtain($1N.class, $1N::new)", "mindustry.net.Packets.InvokePacket", "arc.util.pooling.Pools");
//assign buffer
method.addStatement("packet.writeBuffer = TEMP_BUFFER");
//assign priority //assign priority
method.addStatement("packet.priority = (byte)" + methodEntry.priority.ordinal()); method.addStatement("packet.priority = (byte)" + methodEntry.priority.ordinal());
//assign method ID //assign method ID
method.addStatement("packet.type = (byte)" + methodEntry.id); method.addStatement("packet.type = (byte)" + methodEntry.id);
//rewind buffer //reset stream
method.addStatement("TEMP_BUFFER.position(0)"); method.addStatement("OUT.reset()");
method.addTypeVariables(Seq.with(elem.getTypeParameters()).map(BaseProcessor::getTVN));
for(int i = 0; i < elem.getParameters().size(); i++){ for(int i = 0; i < elem.getParameters().size(); i++){
//first argument is skipped as it is always the player caller //first argument is skipped as it is always the player caller
@@ -146,8 +148,12 @@ public class RemoteWriteGenerator{
VariableElement var = elem.getParameters().get(i); VariableElement var = elem.getParameters().get(i);
try{
//add parameter to method //add parameter to method
method.addParameter(TypeName.get(var.asType()), var.getSimpleName().toString()); method.addParameter(TypeName.get(var.asType()), var.getSimpleName().toString());
}catch(Throwable t){
throw new RuntimeException("Error parsing method " + methodEntry.targetMethod);
}
//name of parameter //name of parameter
String varName = var.getSimpleName().toString(); String varName = var.getSimpleName().toString();
@@ -164,23 +170,18 @@ public class RemoteWriteGenerator{
} }
if(BaseProcessor.isPrimitive(typeName)){ //check if it's a primitive, and if so write it if(BaseProcessor.isPrimitive(typeName)){ //check if it's a primitive, and if so write it
if(typeName.equals("boolean")){ //booleans are special method.addStatement("WRITE.$L($L)", typeName.equals("boolean") ? "bool" : typeName.charAt(0) + "", varName);
method.addStatement("TEMP_BUFFER.put(" + varName + " ? (byte)1 : 0)");
}else{
method.addStatement("TEMP_BUFFER.put" +
capName + "(" + varName + ")");
}
}else{ }else{
//else, try and find a serializer //else, try and find a serializer
ClassSerializer ser = serializers.get(typeName); String ser = serializers.writers.get(typeName.replace("mindustry.gen.", ""), SerializerResolver.locate(elem, var.asType(), true));
if(ser == null){ //make sure a serializer exists! if(ser == null){ //make sure a serializer exists!
BaseProcessor.messager.printMessage(Kind.ERROR, "No @WriteClass method to write class type: '" + typeName + "'", var); BaseProcessor.err("No @WriteClass method to write class type: '" + typeName + "'", var);
return; return;
} }
//add statement for writing it //add statement for writing it
method.addStatement(ser.writeMethod + "(TEMP_BUFFER, " + varName + ")"); method.addStatement(ser + "(WRITE, " + varName + ")");
} }
if(writePlayerSkipCheck){ //write end check if(writePlayerSkipCheck){ //write end check
@@ -188,8 +189,10 @@ public class RemoteWriteGenerator{
} }
} }
//assign packet bytes
method.addStatement("packet.bytes = OUT.getBytes()");
//assign packet length //assign packet length
method.addStatement("packet.writeLength = TEMP_BUFFER.position()"); method.addStatement("packet.length = OUT.size()");
String sendString; String sendString;

View File

@@ -0,0 +1,22 @@
package mindustry.annotations.remote;
import arc.struct.*;
import javax.lang.model.element.*;
import javax.lang.model.type.*;
public class SerializerResolver{
public static String locate(ExecutableElement elem, TypeMirror mirror, boolean write){
//generic type
if((mirror.toString().equals("T") && Seq.with(elem.getTypeParameters().get(0).getBounds()).contains(SerializerResolver::isEntity)) ||
isEntity(mirror)){
return write ? "mindustry.io.TypeIO.writeEntity" : "mindustry.io.TypeIO.readEntity";
}
return null;
}
private static boolean isEntity(TypeMirror mirror){
return !mirror.toString().contains(".") || mirror.toString().startsWith("mindustry.gen.") && !mirror.toString().startsWith("byte");
}
}

View File

@@ -0,0 +1,262 @@
package mindustry.annotations.util;
import arc.func.*;
import com.sun.tools.javac.code.*;
import com.sun.tools.javac.code.Attribute.Array;
import com.sun.tools.javac.code.Attribute.Enum;
import com.sun.tools.javac.code.Attribute.Error;
import com.sun.tools.javac.code.Attribute.Visitor;
import com.sun.tools.javac.code.Attribute.*;
import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.code.Symbol.*;
import com.sun.tools.javac.code.Type.ArrayType;
import com.sun.tools.javac.util.List;
import com.sun.tools.javac.util.Name;
import com.sun.tools.javac.util.*;
import sun.reflect.annotation.*;
import javax.lang.model.element.*;
import javax.lang.model.type.*;
import java.lang.Class;
import java.lang.annotation.*;
import java.lang.reflect.*;
import java.util.*;
import java.util.Map.*;
//replaces the standard Java AnnotationProxyMaker with one that doesn't crash
//thanks, oracle.
@SuppressWarnings({"sunapi", "unchecked"})
public class AnnotationProxyMaker{
private final Compound anno;
private final Class<? extends Annotation> annoType;
private AnnotationProxyMaker(Compound var1, Class<? extends Annotation> var2){
this.anno = var1;
this.annoType = var2;
}
public static <A extends Annotation> A generateAnnotation(Compound var0, Class<A> var1){
AnnotationProxyMaker var2 = new AnnotationProxyMaker(var0, var1);
return (A)var1.cast(var2.generateAnnotation());
}
private Annotation generateAnnotation(){
return AnnotationParser.annotationForMap(this.annoType, this.getAllReflectedValues());
}
private Map<String, Object> getAllReflectedValues(){
LinkedHashMap var1 = new LinkedHashMap();
Iterator var2 = this.getAllValues().entrySet().iterator();
while(var2.hasNext()){
Entry var3 = (Entry)var2.next();
MethodSymbol var4 = (MethodSymbol)var3.getKey();
Object var5 = this.generateValue(var4, (Attribute)var3.getValue());
if(var5 != null){
var1.put(var4.name.toString(), var5);
}
}
return var1;
}
private Map<MethodSymbol, Attribute> getAllValues(){
LinkedHashMap map = new LinkedHashMap();
ClassSymbol cl = (ClassSymbol)this.anno.type.tsym;
//try to use Java 8 API for this if possible
try{
Class entryClass = Class.forName("com.sun.tools.javac.code.Scope$Entry");
Object members = cl.members();
Field field = members.getClass().getField("elems");
Object elems = field.get(members);
Field siblingField = entryClass.getField("sibling");
Field symField = entryClass.getField("sym");
for(Object currEntry = elems; currEntry != null; currEntry = siblingField.get(currEntry)){
handleSymbol((Symbol)symField.get(currEntry), map);
}
}catch(Throwable e){
//otherwise try other API
try{
Class lookupClass = Class.forName("com.sun.tools.javac.code.Scope$LookupKind");
Field nonRecField = lookupClass.getField("NON_RECURSIVE");
Object nonRec = nonRecField.get(null);
Scope scope = cl.members();
Method getSyms = scope.getClass().getMethod("getSymbols", lookupClass);
Iterable<Symbol> it = (Iterable<Symbol>)getSyms.invoke(scope, nonRec);
Iterator<Symbol> i = it.iterator();
while(i.hasNext()){
handleSymbol(i.next(), map);
}
}catch(Throwable death){
//I tried
throw new RuntimeException(death);
}
}
for(Pair var7 : this.anno.values){
map.put(var7.fst, var7.snd);
}
return map;
}
private void handleSymbol(Symbol sym, LinkedHashMap map){
if(sym.getKind() == ElementKind.METHOD){
MethodSymbol var4 = (MethodSymbol)sym;
Attribute var5 = var4.getDefaultValue();
if(var5 != null){
map.put(var4, var5);
}
}
}
private Object generateValue(MethodSymbol var1, Attribute var2){
AnnotationProxyMaker.ValueVisitor var3 = new AnnotationProxyMaker.ValueVisitor(var1);
return var3.getValue(var2);
}
private class ValueVisitor implements Visitor{
private MethodSymbol meth;
private Class<?> returnClass;
private Object value;
ValueVisitor(MethodSymbol var2){
this.meth = var2;
}
Object getValue(Attribute var1){
Method var2;
try{
var2 = AnnotationProxyMaker.this.annoType.getMethod(this.meth.name.toString());
}catch(NoSuchMethodException var4){
return null;
}
this.returnClass = var2.getReturnType();
var1.accept(this);
if(!(this.value instanceof ExceptionProxy) && !AnnotationType.invocationHandlerReturnType(this.returnClass).isInstance(this.value)){
this.typeMismatch(var2, var1);
}
return this.value;
}
public void visitConstant(Constant var1){
this.value = var1.getValue();
}
public void visitClass(com.sun.tools.javac.code.Attribute.Class var1){
this.value = mirrorProxy(var1.classType);
}
public void visitArray(Array var1){
Name var2 = ((ArrayType)var1.type).elemtype.tsym.getQualifiedName();
int var6;
if(var2.equals(var2.table.names.java_lang_Class)){
ListBuffer var14 = new ListBuffer();
Attribute[] var15 = var1.values;
int var16 = var15.length;
for(var6 = 0; var6 < var16; ++var6){
Attribute var7 = var15[var6];
Type var8 = var7 instanceof UnresolvedClass ? ((UnresolvedClass)var7).classType : ((com.sun.tools.javac.code.Attribute.Class)var7).classType;
var14.append(var8);
}
this.value = mirrorProxy(var14.toList());
}else{
int var3 = var1.values.length;
Class var4 = this.returnClass;
this.returnClass = this.returnClass.getComponentType();
try{
Object var5 = java.lang.reflect.Array.newInstance(this.returnClass, var3);
for(var6 = 0; var6 < var3; ++var6){
var1.values[var6].accept(this);
if(this.value == null || this.value instanceof ExceptionProxy){
return;
}
try{
java.lang.reflect.Array.set(var5, var6, this.value);
}catch(IllegalArgumentException var12){
this.value = null;
return;
}
}
this.value = var5;
}finally{
this.returnClass = var4;
}
}
}
public void visitEnum(Enum var1){
if(this.returnClass.isEnum()){
String var2 = var1.value.toString();
try{
this.value = java.lang.Enum.valueOf((Class)this.returnClass, var2);
}catch(IllegalArgumentException var4){
this.value = proxify(() -> new EnumConstantNotPresentException((Class)this.returnClass, var2));
}
}else{
this.value = null;
}
}
public void visitCompound(Compound var1){
try{
Class var2 = this.returnClass.asSubclass(Annotation.class);
this.value = AnnotationProxyMaker.generateAnnotation(var1, var2);
}catch(ClassCastException var3){
this.value = null;
}
}
public void visitError(Error var1){
if(var1 instanceof UnresolvedClass){
this.value = mirrorProxy(((UnresolvedClass)var1).classType);
}else{
this.value = null;
}
}
private void typeMismatch(Method var1, final Attribute var2){
this.value = proxify(() -> new AnnotationTypeMismatchException(var1, var2.type.toString()));
}
}
private static Object mirrorProxy(Type t){
return proxify(() -> new MirroredTypeException(t));
}
private static Object mirrorProxy(List<Type> t){
return proxify(() -> new MirroredTypesException(t));
}
private static <T extends Throwable> Object proxify(Prov<T> prov){
try{
return new ExceptionProxy(){
@Override
protected RuntimeException generateException(){
return (RuntimeException)prov.get();
}
};
}catch(Throwable t){
throw new RuntimeException(t);
}
}
}

View File

@@ -1,10 +1,16 @@
package mindustry.annotations.util; package mindustry.annotations.util;
import arc.struct.*;
import arc.util.ArcAnnotate.*;
import com.squareup.javapoet.*; import com.squareup.javapoet.*;
import com.sun.tools.javac.code.Attribute.*;
import mindustry.annotations.*; import mindustry.annotations.*;
import javax.lang.model.element.*; import javax.lang.model.element.*;
import javax.lang.model.type.*; import javax.lang.model.type.*;
import java.lang.Class;
import java.lang.annotation.*;
import java.lang.reflect.*;
public class Selement<T extends Element>{ public class Selement<T extends Element>{
public final T e; public final T e;
@@ -13,6 +19,61 @@ public class Selement<T extends Element>{
this.e = e; this.e = e;
} }
public @Nullable String doc(){
return BaseProcessor.elementu.getDocComment(e);
}
public Seq<Selement<?>> enclosed(){
return Seq.with(e.getEnclosedElements()).map(Selement::new);
}
public String fullName(){
return e.toString();
}
public Stype asType(){
return new Stype((TypeElement)e);
}
public Svar asVar(){
return new Svar((VariableElement)e);
}
public Smethod asMethod(){
return new Smethod((ExecutableElement)e);
}
public boolean isVar(){
return e instanceof VariableElement;
}
public boolean isType(){
return e instanceof TypeElement;
}
public boolean isMethod(){
return e instanceof ExecutableElement;
}
public Seq<? extends AnnotationMirror> annotations(){
return Seq.with(e.getAnnotationMirrors());
}
public <A extends Annotation> A annotation(Class<A> annotation){
try{
Method m = com.sun.tools.javac.code.AnnoConstruct.class.getDeclaredMethod("getAttribute", Class.class);
m.setAccessible(true);
Compound compound = (Compound)m.invoke(e, annotation);
return compound == null ? null : AnnotationProxyMaker.generateAnnotation(compound, annotation);
}catch(Exception e){
throw new RuntimeException(e);
}
}
public <A extends Annotation> boolean has(Class<A> annotation){
return annotation(annotation) != null;
}
public Element up(){ public Element up(){
return e.getEnclosingElement(); return e.getEnclosingElement();
} }
@@ -45,6 +106,6 @@ public class Selement<T extends Element>{
@Override @Override
public boolean equals(Object o){ public boolean equals(Object o){
return o != null && o.getClass() == getClass() && ((Selement)o).e.equals(e); return o != null && o.getClass() == getClass() && e.equals(((Selement)o).e);
} }
} }

View File

@@ -14,24 +14,43 @@ public class Smethod extends Selement<ExecutableElement>{
super(executableElement); super(executableElement);
} }
public boolean isAny(Modifier... mod){
for(Modifier m : mod){
if(is(m)) return true;
}
return false;
}
public String descString(){
return up().asType().toString() + "#" + super.toString().replace("mindustry.gen.", "");
}
public boolean is(Modifier mod){ public boolean is(Modifier mod){
return e.getModifiers().contains(mod); return e.getModifiers().contains(mod);
} }
public Array<TypeMirror> thrown(){ public Stype type(){
return Array.with(e.getThrownTypes()).as(TypeMirror.class); return new Stype((TypeElement)up());
} }
public Array<TypeName> thrownt(){ public Seq<TypeMirror> thrown(){
return Array.with(e.getThrownTypes()).map(TypeName::get); return Seq.with(e.getThrownTypes()).as();
} }
public Array<TypeParameterElement> typeVariables(){ public Seq<TypeName> thrownt(){
return Array.with(e.getTypeParameters()).as(TypeParameterElement.class); return Seq.with(e.getThrownTypes()).map(TypeName::get);
} }
public Array<Svar> params(){ public Seq<TypeParameterElement> typeVariables(){
return Array.with(e.getParameters()).map(Svar::new); return Seq.with(e.getTypeParameters()).as();
}
public Seq<Svar> params(){
return Seq.with(e.getParameters()).map(Svar::new);
}
public boolean isVoid(){
return ret().toString().equals("void");
} }
public TypeMirror ret(){ public TypeMirror ret(){
@@ -45,4 +64,8 @@ public class Smethod extends Selement<ExecutableElement>{
public MethodTree tree(){ public MethodTree tree(){
return BaseProcessor.trees.getTree(e); return BaseProcessor.trees.getTree(e);
} }
public String simpleString(){
return name() + "(" + params().toString(", ", p -> BaseProcessor.simpleName(p.mirror().toString())) + ")";
}
} }

View File

@@ -5,7 +5,6 @@ import mindustry.annotations.*;
import javax.lang.model.element.*; import javax.lang.model.element.*;
import javax.lang.model.type.*; import javax.lang.model.type.*;
import java.lang.annotation.*;
public class Stype extends Selement<TypeElement>{ public class Stype extends Selement<TypeElement>{
@@ -17,39 +16,41 @@ public class Stype extends Selement<TypeElement>{
return new Stype((TypeElement)BaseProcessor.typeu.asElement(mirror)); return new Stype((TypeElement)BaseProcessor.typeu.asElement(mirror));
} }
public Array<Stype> interfaces(){ public String fullName(){
return Array.with(e.getInterfaces()).map(Stype::of); return mirror().toString();
} }
public Array<Stype> superclasses(){ public Seq<Stype> interfaces(){
Array<Stype> out = new Array<>(); return Seq.with(e.getInterfaces()).map(Stype::of);
Stype sup = superclass();
while(!sup.name().equals("Object")){
out.add(sup);
sup = sup.superclass();
} }
return out;
public Seq<Stype> allInterfaces(){
return interfaces().flatMap(s -> s.allInterfaces().and(s)).distinct();
}
public Seq<Stype> superclasses(){
return Seq.with(BaseProcessor.typeu.directSupertypes(mirror())).map(Stype::of);
}
public Seq<Stype> allSuperclasses(){
return superclasses().flatMap(s -> s.allSuperclasses().and(s)).distinct();
} }
public Stype superclass(){ public Stype superclass(){
return new Stype((TypeElement)BaseProcessor.typeu.asElement(BaseProcessor.typeu.directSupertypes(mirror()).get(0))); return new Stype((TypeElement)BaseProcessor.typeu.asElement(BaseProcessor.typeu.directSupertypes(mirror()).get(0)));
} }
public <A extends Annotation> A annotation(Class<A> annotation){ public Seq<Svar> fields(){
return e.getAnnotation(annotation); return Seq.with(e.getEnclosedElements()).select(e -> e instanceof VariableElement).map(e -> new Svar((VariableElement)e));
} }
public Array<Svar> fields(){ public Seq<Smethod> methods(){
return Array.with(e.getEnclosedElements()).select(e -> e instanceof VariableElement).map(e -> new Svar((VariableElement)e)); return Seq.with(e.getEnclosedElements()).select(e -> e instanceof ExecutableElement
}
public Array<Smethod> methods(){
return Array.with(e.getEnclosedElements()).select(e -> e instanceof ExecutableElement
&& !e.getSimpleName().toString().contains("<")).map(e -> new Smethod((ExecutableElement)e)); && !e.getSimpleName().toString().contains("<")).map(e -> new Smethod((ExecutableElement)e));
} }
public Array<Smethod> constructors(){ public Seq<Smethod> constructors(){
return Array.with(e.getEnclosedElements()).select(e -> e instanceof ExecutableElement return Seq.with(e.getEnclosedElements()).select(e -> e instanceof ExecutableElement
&& e.getSimpleName().toString().contains("<")).map(e -> new Smethod((ExecutableElement)e)); && e.getSimpleName().toString().contains("<")).map(e -> new Smethod((ExecutableElement)e));
} }

View File

@@ -1,6 +1,7 @@
package mindustry.annotations.util; package mindustry.annotations.util;
import com.sun.source.tree.*; import com.sun.source.tree.*;
import com.sun.tools.javac.tree.JCTree.*;
import mindustry.annotations.*; import mindustry.annotations.*;
import javax.lang.model.element.*; import javax.lang.model.element.*;
@@ -11,6 +12,25 @@ public class Svar extends Selement<VariableElement>{
super(e); super(e);
} }
public String descString(){
return up().asType().toString() + "#" + super.toString().replace("mindustry.gen.", "");
}
public JCVariableDecl jtree(){
return (JCVariableDecl)BaseProcessor.elementu.getTree(e);
}
public Stype enclosingType(){
return new Stype((TypeElement)up());
}
public boolean isAny(Modifier... mods){
for(Modifier m : mods){
if(is(m)) return true;
}
return false;
}
public boolean is(Modifier mod){ public boolean is(Modifier mod){
return e.getModifiers().contains(mod); return e.getModifiers().contains(mod);
} }

View File

@@ -0,0 +1,58 @@
package mindustry.annotations.util;
import arc.struct.*;
import mindustry.annotations.Annotations.*;
import mindustry.annotations.*;
import javax.lang.model.element.*;
/**
* This class finds reader and writer methods.
*/
public class TypeIOResolver{
/**
* Finds all class serializers for all types and returns them. Logs errors when necessary.
* Maps fully qualified class names to their serializers.
*/
public static ClassSerializer resolve(BaseProcessor processor){
ClassSerializer out = new ClassSerializer(new ObjectMap<>(), new ObjectMap<>(), new ObjectMap<>());
for(Stype type : processor.types(TypeIOHandler.class)){
//look at all TypeIOHandler methods
Seq<Smethod> methods = type.methods();
for(Smethod meth : methods){
if(meth.is(Modifier.PUBLIC) && meth.is(Modifier.STATIC)){
Seq<Svar> params = meth.params();
//2 params, second one is type, first is writer
if(params.size == 2 && params.first().tname().toString().equals("arc.util.io.Writes")){
out.writers.put(fix(params.get(1).tname().toString()), type.fullName() + "." + meth.name());
}else if(params.size == 1 && params.first().tname().toString().equals("arc.util.io.Reads") && !meth.isVoid()){
//1 param, one is reader, returns type
out.readers.put(fix(meth.retn().toString()), type.fullName() + "." + meth.name());
}else if(params.size == 2 && params.first().tname().toString().equals("arc.util.io.Reads") && !meth.isVoid() && meth.ret().equals(meth.params().get(1).mirror())){
//2 params, one is reader, other is type, returns type - these are made to reduce garbage allocated
out.mutatorReaders.put(fix(meth.retn().toString()), type.fullName() + "." + meth.name());
}
}
}
}
return out;
}
/** makes sure type names don't contain 'gen' */
private static String fix(String str){
return str.replace("mindustry.gen", "");
}
/** Information about read/write methods for class types. */
public static class ClassSerializer{
public final ObjectMap<String, String> writers, readers, mutatorReaders;
public ClassSerializer(ObjectMap<String, String> writers, ObjectMap<String, String> readers, ObjectMap<String, String> mutatorReaders){
this.writers = writers;
this.readers = readers;
this.mutatorReaders = mutatorReaders;
}
}
}

View File

@@ -0,0 +1,25 @@
#Maps entity names to IDs. Autogenerated.
alpha=0
atrax=1
block=2
flare=3
mace=4
mega=5
mindustry.entities.comp.BuildingComp=6
mindustry.entities.comp.BulletComp=7
mindustry.entities.comp.DecalComp=8
mindustry.entities.comp.EffectStateComp=9
mindustry.entities.comp.FireComp=10
mindustry.entities.comp.LaunchCoreComp=11
mindustry.entities.comp.PlayerComp=12
mindustry.entities.comp.PuddleComp=13
mindustry.type.Weather.WeatherStateComp=14
mindustry.world.blocks.campaign.LaunchPad.LaunchPayloadComp=15
mindustry.world.blocks.defense.ForceProjector.ForceDrawComp=22
mono=16
nova=17
poly=18
pulsar=19
risso=20
spiroct=21

View File

@@ -0,0 +1 @@
{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:payloads,type:arc.struct.Seq<mindustry.world.blocks.payloads.Payload>,size:-1},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:cons,type:mindustry.world.modules.ConsumeModule,size:-1},{name:health,type:float,size:4},{name:items,type:mindustry.world.modules.ItemModule,size:-1},{name:liquids,type:mindustry.world.modules.LiquidModule,size:-1},{name:power,type:mindustry.world.modules.PowerModule,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:collided,type:arc.struct.IntSeq,size:-1},{name:damage,type:float,size:4},{name:data,type:java.lang.Object,size:-1},{name:fdata,type:float,size:4},{name:lifetime,type:float,size:4},{name:owner,type:mindustry.gen.Entityc,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:time,type:float,size:4},{name:type,type:mindustry.entities.bullet.BulletType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:color,type:arc.graphics.Color,size:-1},{name:lifetime,type:float,size:4},{name:region,type:arc.graphics.g2d.TextureRegion,size:-1},{name:rotation,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:color,type:arc.graphics.Color,size:-1},{name:data,type:java.lang.Object,size:-1},{name:effect,type:mindustry.entities.Effect,size:-1},{name:lifetime,type:float,size:4},{name:offsetX,type:float,size:4},{name:offsetY,type:float,size:4},{name:parent,type:mindustry.gen.Posc,size:-1},{name:rotation,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{version:1,fields:[{name:color,type:arc.graphics.Color,size:-1},{name:data,type:java.lang.Object,size:-1},{name:effect,type:mindustry.entities.Effect,size:-1},{name:lifetime,type:float,size:4},{name:offsetX,type:float,size:4},{name:offsetY,type:float,size:4},{name:parent,type:Posc,size:-1},{name:rotation,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{version:2,fields:[{name:color,type:arc.graphics.Color,size:-1},{name:data,type:java.lang.Object,size:-1},{name:effect,type:mindustry.entities.Effect,size:-1},{name:lifetime,type:float,size:4},{name:offsetX,type:float,size:4},{name:offsetY,type:float,size:4},{name:parent,type:mindustry.gen.Posc,size:-1},{name:rotation,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{version:3,fields:[{name:color,type:arc.graphics.Color,size:-1},{name:data,type:java.lang.Object,size:-1},{name:effect,type:mindustry.entities.Effect,size:-1},{name:lifetime,type:float,size:4},{name:offsetX,type:float,size:4},{name:offsetY,type:float,size:4},{name:parent,type:Posc,size:-1},{name:rotation,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{version:4,fields:[{name:color,type:arc.graphics.Color,size:-1},{name:data,type:java.lang.Object,size:-1},{name:effect,type:mindustry.entities.Effect,size:-1},{name:lifetime,type:float,size:4},{name:offsetX,type:float,size:4},{name:offsetY,type:float,size:4},{name:parent,type:Posc,size:-1},{name:rotation,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{version:5,fields:[{name:color,type:arc.graphics.Color,size:-1},{name:data,type:java.lang.Object,size:-1},{name:effect,type:mindustry.entities.Effect,size:-1},{name:lifetime,type:float,size:4},{name:offsetX,type:float,size:4},{name:offsetY,type:float,size:4},{name:parent,type:Posc,size:-1},{name:rotation,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:baseFlammability,type:float,size:4},{name:block,type:mindustry.world.Block,size:-1},{name:lifetime,type:float,size:4},{name:puddleFlammability,type:float,size:4},{name:tile,type:mindustry.world.Tile,size:-1},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{version:1,fields:[{name:lifetime,type:float,size:4},{name:tile,type:mindustry.world.Tile,size:-1},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:block,type:mindustry.world.Block,size:-1},{name:lifetime,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:lifetime,type:float,size:4},{name:stacks,type:arc.struct.Seq<mindustry.type.ItemStack>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:admin,type:boolean,size:1},{name:boosting,type:boolean,size:1},{name:color,type:arc.graphics.Color,size:-1},{name:mouseX,type:float,size:4},{name:mouseY,type:float,size:4},{name:name,type:java.lang.String,size:-1},{name:shooting,type:boolean,size:1},{name:team,type:mindustry.game.Team,size:-1},{name:typing,type:boolean,size:1},{name:unit,type:Unit,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:amount,type:float,size:4},{name:generation,type:int,size:4},{name:liquid,type:mindustry.type.Liquid,size:-1},{name:tile,type:mindustry.world.Tile,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{fields:[{name:intensity,type:float,size:4},{name:life,type:float,size:4},{name:opacity,type:float,size:4},{name:weather,type:mindustry.type.Weather,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{version:1,fields:[{name:effectTimer,type:float,size:4},{name:intensity,type:float,size:4},{name:life,type:float,size:4},{name:opacity,type:float,size:4},{name:weather,type:mindustry.type.Weather,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -0,0 +1 @@
{version:2,fields:[{name:effectTimer,type:float,size:4},{name:intensity,type:float,size:4},{name:life,type:float,size:4},{name:opacity,type:float,size:4},{name:weather,type:mindustry.type.Weather,size:-1},{name:windVector,type:arc.math.geom.Vec2,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}

View File

@@ -25,18 +25,18 @@ buildscript{
} }
allprojects{ allprojects{
version = 'release'
apply plugin: 'maven' apply plugin: 'maven'
version = 'release'
group = 'com.github.Anuken' group = 'com.github.Anuken'
ext{ ext{
versionNumber = '5' versionNumber = '6'
if(!project.hasProperty("versionModifier")) versionModifier = 'release' if(!project.hasProperty("versionModifier")) versionModifier = 'alpha'
if(!project.hasProperty("versionType")) versionType = 'official' if(!project.hasProperty("versionType")) versionType = 'official'
appName = 'Mindustry' appName = 'Mindustry'
gdxVersion = '1.9.10'
roboVMVersion = '2.3.8'
steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256' steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256'
rhinoVersion = '8437435dab9993769d72739608580d40c5343285'
loadVersionProps = { loadVersionProps = {
return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p } return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }
@@ -107,6 +107,7 @@ allprojects{
output += other.name.substring("bundle".length() + 1, other.name.lastIndexOf('.')) + "\n" output += other.name.substring("bundle".length() + 1, other.name.lastIndexOf('.')) + "\n"
} }
new File(project(':core').projectDir, 'assets/locales').text = output new File(project(':core').projectDir, 'assets/locales').text = output
new File(project(':core').projectDir, 'assets/basepartnames').text = new File(project(':core').projectDir, 'assets/baseparts/').list().join("\n")
} }
writeVersion = { writeVersion = {
@@ -146,6 +147,20 @@ allprojects{
processorFile.text = text.toString().replace(".java", "").replace("/", ".").replace("\\", ".") processorFile.text = text.toString().replace(".java", "").replace("/", ".").replace("\\", ".")
} }
writePlugins = {
new File(rootDir, "annotations/src/main/resources/META-INF/services/").mkdirs()
def processorFile = new File(rootDir, "annotations/src/main/resources/META-INF/services/com.sun.source.util.Plugin")
def text = new StringBuilder()
def files = new File(rootDir, "annotations/src/main/java")
files.eachFileRecurse(groovy.io.FileType.FILES){ file ->
if(file.name.endsWith(".java") && (file.text.contains(" implements Plugin"))){
text.append(file.path.substring(files.path.length() + 1)).append("\n")
}
}
processorFile.text = text.toString().replace(".java", "").replace("/", ".").replace("\\", ".")
}
} }
repositories{ repositories{
@@ -157,24 +172,44 @@ allprojects{
jcenter() jcenter()
} }
tasks.withType(Javadoc).all{ enabled = false } tasks.withType(JavaCompile){
sourceCompatibility = 1.8
targetCompatibility = 1.8
options.encoding = "UTF-8"
options.compilerArgs += ["-Xlint:deprecation"]
}
}
//compile with java 8 compatibility for everything except the annotati project
configure(subprojects - project(":annotations")){
tasks.withType(JavaCompile){
if(JavaVersion.current() != JavaVersion.VERSION_1_8){
options.compilerArgs.addAll(['--release', '8'])
}
}
tasks.withType(Javadoc){
options.addStringOption('Xdoclint:none', '-quiet')
}
} }
project(":desktop"){ project(":desktop"){
apply plugin: "java" apply plugin: "java"
compileJava.options.fork = true
dependencies{ dependencies{
compile project(":core") implementation project(":core")
implementation arcModule("natives:natives-box2d-desktop")
implementation arcModule("natives:natives-desktop")
implementation arcModule("natives:natives-freetype-desktop")
implementation 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1'
if(debugged()) compile project(":debug") if(debugged()) implementation project(":debug")
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" implementation "com.github.Anuken:steamworks4j:$steamworksVersion"
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
compile "com.github.Anuken:steamworks4j:$steamworksVersion" implementation arcModule("backends:backend-sdl")
compile arcModule("backends:backend-sdl")
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1'
} }
} }
@@ -200,26 +235,26 @@ project(":ios"){
} }
dependencies{ dependencies{
compile project(":core") implementation project(":core")
implementation arcModule("natives:natives-ios")
implementation arcModule("natives:natives-freetype-ios")
implementation arcModule("natives:natives-box2d-ios")
implementation arcModule("backends:backend-robovm")
compileOnly project(":annotations") compileOnly project(":annotations")
compile arcModule("backends:backend-robovm")
compile "com.mobidevelop.robovm:robovm-rt:$roboVMVersion"
compile "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion"
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-ios"
} }
} }
project(":core"){ project(":core"){
apply plugin: "java" apply plugin: "java-library"
task preGen{ task preGen{
outputs.upToDateWhen{ false } outputs.upToDateWhen{ false }
generateLocales() generateLocales()
writeVersion() writeVersion()
writeProcessors() writeProcessors()
writePlugins()
} }
task copyChangelog{ task copyChangelog{
@@ -232,11 +267,11 @@ project(":core"){
def androidLogList = loglines.findAll{ line -> !line.endsWith("]") || line.endsWith("[Mobile]") || line.endsWith("[Android]")} def androidLogList = loglines.findAll{ line -> !line.endsWith("]") || line.endsWith("[Mobile]") || line.endsWith("[Android]")}
def result = "" def result = ""
androidLogList.forEach({line -> androidLogList.forEach{line ->
if(result.length() + line.length() + 1 < maxLength){ if(result.length() + line.length() + 1 < maxLength){
result += line + "\n" result += line + "\n"
} }
}) }
def changelogs = file("../fastlane/metadata/android/en-US/changelogs/") def changelogs = file("../fastlane/metadata/android/en-US/changelogs/")
new File(changelogs, buildVersion + ".txt").text = (result) new File(changelogs, buildVersion + ".txt").text = (result)
new File(changelogs, androidVersion + ".txt").text = (result) new File(changelogs, androidVersion + ".txt").text = (result)
@@ -246,12 +281,15 @@ project(":core"){
dependencies{ dependencies{
compileJava.dependsOn(preGen) compileJava.dependsOn(preGen)
compile "org.lz4:lz4-java:1.4.1" api "org.lz4:lz4-java:1.4.1"
compile arcModule("arc-core") api arcModule("arc-core")
compile arcModule("extensions:freetype") api arcModule("extensions:freetype")
compile arcModule("extensions:arcnet") api arcModule("extensions:box2d")
compile "org.mozilla:rhino:1.7.11" api arcModule("extensions:g3d")
if(localArc() && debugged()) compile arcModule("extensions:recorder") api arcModule("extensions:fx")
api arcModule("extensions:arcnet")
api "com.github.Anuken:rhino:$rhinoVersion"
if(localArc() && debugged()) api arcModule("extensions:recorder")
compileOnly project(":annotations") compileOnly project(":annotations")
annotationProcessor project(":annotations") annotationProcessor project(":annotations")
@@ -262,8 +300,9 @@ project(":server"){
apply plugin: "java" apply plugin: "java"
dependencies{ dependencies{
compile project(":core") implementation project(":core")
compile arcModule("backends:backend-headless") implementation arcModule("natives:natives-box2d-desktop")
implementation arcModule("backends:backend-headless")
} }
} }
@@ -274,13 +313,18 @@ project(":tests"){
testImplementation project(":core") testImplementation project(":core")
testImplementation "org.junit.jupiter:junit-jupiter-params:5.3.1" testImplementation "org.junit.jupiter:junit-jupiter-params:5.3.1"
testImplementation "org.junit.jupiter:junit-jupiter-api:5.3.1" testImplementation "org.junit.jupiter:junit-jupiter-api:5.3.1"
testImplementation arcModule("backends:backend-headless")
testImplementation arcModule("natives:natives-box2d-desktop")
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.3.1" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.3.1"
compile arcModule("backends:backend-headless")
} }
test{ test{
useJUnitPlatform() useJUnitPlatform()
workingDir = new File("../core/assets") workingDir = new File("../core/assets")
testLogging {
exceptionFormat = 'full'
showStandardStreams = true
}
} }
} }
@@ -288,30 +332,29 @@ project(":tools"){
apply plugin: "java" apply plugin: "java"
dependencies{ dependencies{
compile project(":core") implementation project(":core")
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" implementation arcModule("natives:natives-desktop")
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" implementation arcModule("natives:natives-freetype-desktop")
compile "org.reflections:reflections:0.9.12" implementation arcModule("natives:natives-box2d-desktop")
implementation arcModule("backends:backend-headless")
compile arcModule("backends:backend-sdl")
} }
} }
project(":annotations"){ project(":annotations"){
apply plugin: "java" apply plugin: "java-library"
dependencies{ dependencies{
compile 'com.squareup:javapoet:1.12.1' implementation 'com.squareup:javapoet:1.12.1'
compile "com.github.Anuken.Arc:arc-core:$arcHash" implementation "com.github.Anuken.Arc:arc-core:$arcHash"
compile files("${System.getProperty('java.home')}/../lib/tools.jar") implementation files("${System.getProperty('java.home')}/../lib/tools.jar")
} }
} }
task deployAll{ task deployAll{
task cleanDeployOutput{ task cleanDeployOutput{
doFirst{ doFirst{
if("${getBuildVersion()}" == "custom build" || "${getBuildVersion()}" == "") throw new IllegalArgumentException("----\n\nSET A BUILD NUMBER FIRST!\n\n----") if(getBuildVersion() == "custom build" || getBuildVersion() == "") throw new IllegalArgumentException("----\n\nSET A BUILD NUMBER FIRST!\n\n----")
if(!project.hasProperty("release")) throw new IllegalArgumentException("----\n\nSET THE RELEASE PROJECT PROPERTY FIRST!\n\n----") if(!project.hasProperty("release")) throw new IllegalArgumentException("----\n\nSET THE RELEASE PROJECT PROPERTY FIRST!\n\n----")
delete{ delete{

View File

@@ -886,20 +886,6 @@
"command-retreat" "command-retreat"
] ]
}, },
{
"uid": "1bc31b80669cb5edc2ee5d1370554bc9",
"css": "players",
"code": 59483,
"src": "custom_icons",
"selected": true,
"svg": {
"path": "M370.1 55.1Q401.6 23.6 448.8 7.9 496.1-7.9 543.3 7.9 590.6 23.6 622 55.1 653.5 86.6 685 118.1 716.5 149.6 732.3 196.9 748 244.1 732.3 291.3 716.5 338.6 685 370.1 653.5 401.6 653.5 433.1 653.5 464.6 685 496.1 716.5 527.6 748 559.1 779.5 590.6 811 622 842.5 653.5 874 685 905.5 716.5 937 748 968.5 779.5 984.3 826.8 1000 874 984.3 921.3 968.5 968.5 921.3 984.3 874 1000 811 1000 748 1000 685 1000 622 1000 559.1 1000 496.1 1000 433.1 1000 370.1 1000 307.1 1000 244.1 1000 181.1 1000 118.1 1000 70.9 984.3 23.6 968.5 7.9 921.3-7.9 874 7.9 826.8 23.6 779.5 55.1 748 86.6 716.5 118.1 685 149.6 653.5 181.1 622 212.6 590.6 244.1 559.1 275.6 527.6 307.1 496.1 338.6 464.6 338.6 433.1 338.6 401.6 307.1 370.1 275.6 338.6 259.8 291.3 244.1 244.1 259.8 196.9 275.6 149.6 307.1 118.1 338.6 86.6 370.1 55.1",
"width": 992
},
"search": [
"players"
]
},
{ {
"uid": "2073dbd997e5d8e1ffc1322d13ba5585", "uid": "2073dbd997e5d8e1ffc1322d13ba5585",
"css": "chat", "css": "chat",
@@ -919,6 +905,34 @@
"css": "zoom", "css": "zoom",
"code": 59415, "code": 59415,
"src": "fontawesome" "src": "fontawesome"
},
{
"uid": "1bc31b80669cb5edc2ee5d1370554bc9",
"css": "players",
"code": 59483,
"src": "custom_icons",
"selected": true,
"svg": {
"path": "M370.1 55.1Q401.6 23.6 448.8 7.9 496.1-7.9 543.3 7.9 590.6 23.6 622 55.1 653.5 86.6 685 118.1 716.5 149.6 732.3 196.9 748 244.1 732.3 291.3 716.5 338.6 685 370.1 653.5 401.6 653.5 433.1 653.5 464.6 685 496.1 716.5 527.6 748 559.1 779.5 590.6 811 622 842.5 653.5 874 685 905.5 716.5 937 748 968.5 779.5 984.3 826.8 1000 874 984.3 921.3 968.5 968.5 921.3 984.3 874 1000 811 1000 748 1000 685 1000 622 1000 559.1 1000 496.1 1000 433.1 1000 370.1 1000 307.1 1000 244.1 1000 181.1 1000 118.1 1000 70.9 984.3 23.6 968.5 7.9 921.3-7.9 874 7.9 826.8 23.6 779.5 55.1 748 86.6 716.5 118.1 685 149.6 653.5 181.1 622 212.6 590.6 244.1 559.1 275.6 527.6 307.1 496.1 338.6 464.6 338.6 433.1 338.6 401.6 307.1 370.1 275.6 338.6 259.8 291.3 244.1 244.1 259.8 196.9 275.6 149.6 307.1 118.1 338.6 86.6 370.1 55.1",
"width": 992
},
"search": [
"players"
]
},
{
"uid": "dd1e5d774d1ced68cb7c439d8ed102f5",
"css": "logic",
"code": 59420,
"src": "custom_icons",
"selected": true,
"svg": {
"path": "M375 0L250 125H125V250L0 375 125 500 0 625 125 750V875H250L375 1000 500 875 625 1000 750 875H875V750L1000 625 875 500 1000 375 875 250V125H750L625 0 500 125ZM250 250H750V750H250ZM375 375V625H625V375Z",
"width": 1000
},
"search": [
"logic"
]
} }
] ]
} }

View File

@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="logic.svg"
inkscape:version="1.0 (9f2f71dc58, 2020-08-02)"
id="svg8"
version="1.1"
viewBox="0 0 128 128">
<defs
id="defs2" />
<sodipodi:namedview
units="px"
inkscape:window-maximized="1"
inkscape:window-y="27"
inkscape:window-x="0"
inkscape:window-height="1316"
inkscape:window-width="2560"
showgrid="true"
inkscape:document-rotation="0"
inkscape:current-layer="layer1"
inkscape:document-units="mm"
inkscape:cy="325.95853"
inkscape:cx="195.60221"
inkscape:zoom="1.28"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#000000"
id="base">
<inkscape:grid
empspacing="5"
spacingy="4.2333332"
spacingx="4.2333332"
id="grid10"
type="xygrid"
originx="0"
originy="0" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Layer 1">
<path
id="path19"
style="fill:#ffffff;stroke-width:3.77953;stroke-miterlimit:4;stroke-dasharray:none"
d="M 48,0 32,16 H 16 V 32 L 0,48 16,64 0,80 16,96 v 16 h 16 l 16,16 16,-16 16,16 16,-16 h 16 V 96 L 128,80 112,64 128,48 112,32 V 16 H 96 L 80,0 64,16 Z M 32,32 H 96 V 96 H 32 Z M 48,48 V 80 H 80 V 48 Z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 794 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 895 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 852 B

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 926 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 513 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 B

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