Compare commits

..

130 Commits
v127 ... v128

Author SHA1 Message Date
Anuken
a1f5982a85 Fixed loading bar stroke not scaling correctly 2021-07-12 15:36:43 -04:00
Anuken
3c688d3fec arc 2021-07-12 15:35:08 -04:00
Anuken
889a9a7a05 Merge remote-tracking branch 'origin/master' 2021-07-12 15:06:46 -04:00
Anuken
ce6c39b7aa Reorganized settings 2021-07-12 15:06:41 -04:00
VizardAlpha
2a1fdded72 bundle_fr.properties Updates (#5558)
* bundle_fr.properties Updates

Add new commits

* Update Bundle
2021-07-12 14:49:24 -04:00
Angel-24
2b757fe107 Update bundle_es.properties (#5526)
Updated Spanish trasnlations to the 1 - Jul - 2021 changes in "bundle.properties".
2021-07-12 14:47:17 -04:00
Sharlotte
a8d78453ff Update bundle_ko.properties (#5527) 2021-07-12 14:47:05 -04:00
Antsiferov Andrew
2b88396aac [Bundle][RU] Update (#5531)
* double newline fix

hint.guardian

* 13 changed lines

mod.enabled
mod.disabled
status.burning.name
status.freezing.name
status.wet.name
status.melting.name
status.sapped.name
status.spore-slowed.name
status.tarred.name
status.overclock.name
status.shocked.name
status.blasted.name
status.unmoving.name

* yon't

* x'nt

* Update bundle_ru.properties

* 1 new, 1 changed

New:
stat.healing

Changed:
bullet.healpercent

* Inverse trig logic functions

See 00ca247d0f

* new v7 stuff, long list

New:
schematic.tags
schematic.edittags
schematic.addtag
schematic.texttag
schematic.icontag
schematic.renametag
schematic.tagdelconfirm
schematic.tagexists
tps
guardian
sector.changeicon
status.electrified.name
unsupported.environment
stat.repairspeed
ability.energyfield
bar.strength
rules.corecapture
block.rhyolite.name
block.repair-turret.name
hint.blockInfo
lenum.config
laccess.progress
unit.retusa.name
unit.oxynoe.name
unit.cyerce.name
unit.aegires.name
unit.navanax.name
block.duct.name
block.duct-router.name
block.duct-bridge.name
block.payload-propulsion-tower.name
block.payload-void.name
block.payload-source.name
filter.option.rotate

Changed:
stat.repairtime
bullet.pierce
team.crux.name
team.sharded.name
item.titanium.description

Deleted:
quit.confirm.tutorial
boss.health
team.orange.name
lenum.configure

* Update bundle_ru.properties

* 1 line changed

unit.oxynoe.name

* роутер-marshrutizator

ibglish

* 2 lines changed

block.surge-wall.name
block.surge-wall-large.name

* 3 new, 2 changed

New:
stat.showinmap
block.metal-floor-4.name
block.metal-floor-5.name

Changed:
stat.affinities
stat.opposites

* undone the dumb

* 1 new line

filter.option.replacement

* 1 new, 1 changed

New:
rules.polygoncoreprotection

Changed:
hint.respawn

* Fixed outdated minke description

unit.minke.description: "зажигательными" -> "артиллерийскими"

* 3 new lines

unit.tilessecond (ec59cb602c)
lst.wait, lst.lookup (0949852758)

* typo

еденицы -> единицы

Co-authored-by: Vanguard <55051135+XEN0PHIL@users.noreply.github.com>
2021-07-12 14:46:46 -04:00
Antsiferov Andrew
f856ad16ba Fixed a typo (#5532) 2021-07-12 14:46:36 -04:00
Anuken
f36d47c13f Merge branch 'master' of https://github.com/Anuken/Mindustry 2021-07-12 12:36:48 -04:00
Anuken
4f98bc95a2 Better sliders 2021-07-12 12:36:45 -04:00
Arik
ec3dc867c1 Always increment launchpad counter (#5569) 2021-07-12 12:33:17 -04:00
Antsiferov Andrew
7fea7e91aa Correct comment (#5568)
This is `UI.packer`, not `Fonts.packer`.
2021-07-12 09:23:36 -04:00
TranquillyUnpleasant
1ea545ccb2 fix (#5567) 2021-07-12 09:23:20 -04:00
buthed010203
e5e2d0ab03 Fix payload driver crash (#5565)
Similar to the mass driver one, https://i-dont.go-outsi.de/53ZwBY_YS.png
2021-07-11 14:39:33 -04:00
Anuken
c94e7aa031 Mod bugfixes 2021-07-11 12:03:10 -04:00
Anuken
5d1af6fb76 Android release debuggable; fixes default interfaces 2021-07-11 11:54:07 -04:00
Anuken
3b400ac3f3 just in case 2021-07-11 10:15:53 -04:00
Anuken
308176ee81 Revert theme removal / Android jar import bugfixes 2021-07-11 10:13:34 -04:00
Anuken
8a84ebb58d Fixed server IO errors / Fixed kick IP tracing 2021-07-10 22:18:58 -04:00
Anuken
158d11d3ba arc 2021-07-10 18:54:22 -04:00
Anuken
beec1eeaba Fixed #5561 2021-07-10 12:32:29 -04:00
Anuken
63a1f4e2de Merge branch 'master' of https://github.com/Anuken/Mindustry 2021-07-10 11:33:09 -04:00
Anuken
7d845951e9 Fixed #5560 2021-07-10 11:33:05 -04:00
Anuken
48d9ea6aa1 Deleted all v6 servers with incorrect versions 2021-07-10 08:39:32 -04:00
RebornTrack970
ae83e604ba Added Rush V7 (#5557)
* Added Rush V7

Hosted by Red.

* Fixed

* Update servers_v7.json
2021-07-10 08:32:57 -04:00
키에르
c156968be6 update kr server list & Fix json format (#5559) 2021-07-10 08:32:05 -04:00
Anuken
effe2312e0 no 2021-07-09 16:51:12 -04:00
Anuken
1c389dc7f8 Fixed #5553 2021-07-08 13:42:30 -04:00
Anuken
972ca71978 Team-colored force projectors 2021-07-08 12:14:20 -04:00
Anuken
fb35adb494 Added AttributeCrafter env calculation 2021-07-08 11:06:46 -04:00
Anuken
22813b71ff Ignore all future changelogs 2021-07-08 09:47:01 -04:00
Anuken
02243d1f5c Merge remote-tracking branch 'origin/master' 2021-07-08 09:46:21 -04:00
Anuken
e2b2e8fb4e Deleted all Android changelogs - see below for details
Android changelogs are practically use due to their character limit; GitHub changelogs should be used instead. Translations always arrive a few days after an update, so they are seldom read.
2021-07-08 09:46:10 -04:00
Anuken
390ceb8887 FileChooser cleanup 2021-07-08 09:33:44 -04:00
Patrick 'Quezler' Mounier
2167a3d7fe Remove double space (#5551) 2021-07-08 09:32:53 -04:00
Anuken
6f2033a455 arc 2021-07-07 19:28:34 -04:00
Anuken
2ae7863cae arc.util.Http migration 2021-07-07 19:00:32 -04:00
Anuken
02b42c51da Fixed #5549 2021-07-07 13:38:39 -04:00
Anuken
0ba26b22c0 Fixed #5548 2021-07-06 16:32:42 -04:00
Anuken
017552f573 Fixed crash caused by invalid NinePatch sprites 2021-07-06 15:23:37 -04:00
Anuken
01a3c772e7 Sync unit velocity / Sync separator seed / 127.x Compat break 2021-07-06 11:41:05 -04:00
Anuken
5693605f31 Correct Bullet#scaleVelocity documentation 2021-07-06 11:10:11 -04:00
Anuken
481881aa8b Prop cleanup / Optimization of large skybox PNG 2021-07-05 21:18:40 -04:00
Anuken
544660c4bb Fixed #5545 2021-07-05 15:11:53 -04:00
Anuken
3d8d84177b Map listing improvements 2021-07-04 21:30:47 -04:00
TranquillyUnpleasant
789e354400 Server qol (#5534) 2021-07-04 21:18:41 -04:00
TranquillyUnpleasant
4fdb817d4a move domains (#5542) 2021-07-04 21:16:47 -04:00
Anuken
4055361501 Merge remote-tracking branch 'origin/master' 2021-07-04 19:14:16 -04:00
Anuken
416007593f convert_sounds.sh is no longer needed 2021-07-04 19:14:11 -04:00
Anuken
4ed9f10c1b Cleanup 2021-07-04 09:51:39 -04:00
GaviTSRA
178cb12f85 Change ip of TSR Server (#5539)
* Change ip of TSR Server

* Ip changed again - should be final
2021-07-04 09:28:40 -04:00
Vajda Simon
c0582cd527 Update servers_v6.json (#5538) 2021-07-04 09:28:25 -04:00
Anuken
39e47db8c7 Merge remote-tracking branch 'origin/master' 2021-07-03 23:21:35 -04:00
Anuken
ed4156850b Cached ping executor 2021-07-03 23:21:29 -04:00
Anuken
5364522a5a Update deployment.yml 2021-07-03 21:42:19 -04:00
Anuken
3382d56590 Fixed tests 2021-07-03 21:17:38 -04:00
Anuken
1e30c46322 Merge remote-tracking branch 'origin/master' 2021-07-03 20:27:09 -04:00
Anuken
3eb72d6d86 Updated to new Arc net 2021-07-03 20:27:04 -04:00
KotMilkMeoW
2d01c41159 Update servers_v7.json (#5533)
* Update servers_v7.json

* Fix
2021-07-03 10:53:19 -04:00
Anuken
0b3dddcc9e Minor reformatting 2021-07-01 17:06:35 -04:00
Anuken
bc7085826e Re-generated ClassMap 2021-07-01 11:44:29 -04:00
Anuken
f78ee66049 Deployment script fixes 2021-07-01 11:36:51 -04:00
Anuken
fecaf768ab Allow 3x3 blocks on payload conveyors 2021-07-01 11:24:23 -04:00
Anuken
ec59cb602c Crash fix / tilesSecond speed unit 2021-07-01 11:17:42 -04:00
Anuken
2ea1671739 Fixed #5519 2021-07-01 10:22:28 -04:00
Anuken
f7e4936445 Merge remote-tracking branch 'origin/master' 2021-06-30 22:22:57 -04:00
Anuken
d37e8c2e75 why 2021-06-30 22:22:53 -04:00
Sahrea
fb8dcc5f86 Update servers_v6.json (#5518)
A server for German players. See history in #deutsch on the io Discord. https://discord.com/channels/391020510269669376/464914764066324500/859754657134936134
2021-06-30 22:22:16 -04:00
Anuken
4c4c361093 #5517 2021-06-30 22:18:57 -04:00
Anuken
9c29706297 Only draw status for player's team blocks 2021-06-30 19:09:48 -04:00
RebornTrack970
4dcac119d8 Updated TR Bundle to the latest V7 prealpha (#5505)
* Updated TR Bundle to the latest V7 prealpha

* Update bundle_tr.properties
2021-06-30 13:24:52 -04:00
Anuken
f9dfd5b0b5 Commented out separator revision until 128 release 2021-06-30 13:08:19 -04:00
Patrick 'Quezler' Mounier
10dcd9cb2d outlaw separator desycning (#5516)
* Seed separators

* Sync separators

* Seed from tile position
2021-06-30 12:59:09 -04:00
Anuken
c80e800ac9 Merge remote-tracking branch 'origin/master' 2021-06-30 10:49:29 -04:00
Anuken
eafcbf0914 Minor unit balancing 2021-06-30 10:28:05 -04:00
ulwepo
4f561a3875 Update servers_v6.json (#5515)
Sakura is a Japanese server.
I add attack mode.
Thank you.
2021-06-30 08:34:18 -04:00
Thomas Widyantoko
5cc92506c9 [ID] Updates Indonesian V7 translation (#5513)
* Indonesian bundle update

lenum.controller description and Tar Fields map

* translation bundle sync

* Indonesian translation standardization

* healing status effect

* Indonesian translation for V7

bit confused on line 1611

* [ID] WIP polygonal core protection

* [ID] Updates Indonesian V7 translation

Logic wait & content look up instructions
2021-06-30 08:34:08 -04:00
Arik
2c8eb1e5b8 Conveyor Upgrade End Rotation (#5512) 2021-06-30 08:29:35 -04:00
Anuken
6c18634b0d Minor logic unit rotation fix / Core capture unit derelict tareting 2021-06-29 16:26:02 -04:00
Anuken
c7bd9dd0fa Merge remote-tracking branch 'origin/master' 2021-06-29 12:21:56 -04:00
Anuken
d8ec231a5e Fixed #5508 2021-06-29 12:21:42 -04:00
Arik
5c803594fb Fix WaveGraph Lineup (#5503) 2021-06-29 09:03:56 -04:00
Minxyzgo
cececa190a Update WaterMoveComp.java (#5504) 2021-06-29 08:54:10 -04:00
OSP
38a3f1839e Change ip XCore, and add new server (#5502) 2021-06-28 18:58:39 -04:00
Anuken
2eb57ab680 Minor repair turret nerf 2021-06-28 18:57:13 -04:00
Anuken
f6f1ddb826 Fixed non-existent fire being targeted 2021-06-28 13:30:54 -04:00
Anuken
fcdbd4b117 Fixed liquid turrets not targeting closest fire 2021-06-28 11:35:46 -04:00
Anuken
a5c44e7998 #5055 2021-06-28 10:50:04 -04:00
Anuken
8afea88023 Fixed #5500 2021-06-28 10:15:54 -04:00
Anuken
75443e4dfc Clear commanding units on sync 2021-06-28 09:56:49 -04:00
Anuken
fbfb491dca Merge remote-tracking branch 'origin/master' 2021-06-28 09:25:48 -04:00
Anuken
082c17da85 Fixed #5498 2021-06-28 09:25:38 -04:00
thedimas3007
88ebf4f9db Updated (#5497) 2021-06-28 09:12:25 -04:00
OSP
18825b1697 Change IP XCore (#5494)
the old hosting is broken.
2021-06-27 18:47:11 -04:00
BasedUser
551b11877d CRAPPY DDNS IS GONE 🦀🦀🦀 (#5495) 2021-06-27 18:47:01 -04:00
Anuken
0bd1b4eedc Skip loading team regions for teams without palettes 2021-06-27 12:28:40 -04:00
Anuken
d401d7838c Gradle 7.1 2021-06-27 11:10:07 -04:00
Anuken
8b2e273d41 Merge remote-tracking branch 'origin/master' 2021-06-27 09:34:59 -04:00
Anuken
bdff6f9560 Repair turret nerf 2021-06-27 09:34:54 -04:00
Fatonndev
bb500a53ef Add attack v7 server (#5490) 2021-06-27 09:13:22 -04:00
Volas171
7ff0811764 retire mindustry reborn from v6 (#5487) 2021-06-27 09:13:03 -04:00
Anuken
36b49b6d8b Fixed #5488 / Fixed #5489 2021-06-27 09:12:35 -04:00
Anuken
e8edfb1170 Merge remote-tracking branch 'origin/master' 2021-06-26 20:55:59 -04:00
Anuken
bc6fcbc86d Fixed more flaky tests 2021-06-26 20:55:52 -04:00
OSP
8853ca303e Add XCore server to the v7 global list (#5486)
My server, 1 mode - the siege.There will be more servers in the future.
2021-06-26 15:46:19 -04:00
L0615T1C5-216AC-9437
914a6fc89b Add Chaotic Neutral to the V7 Server List (#5484) 2021-06-26 14:07:02 -04:00
UnCaughT
028be85468 Add HexPvP to V7 (#5483) 2021-06-26 14:06:56 -04:00
Darkness6030
5ffc285e1c Add mindurka to V7 list (#5471)
* Add mindurka to V7 list

* Update servers_v7.json

Co-authored-by: Patrick 'Quezler' Mounier <Quezler@me.com>

* Update servers_v7.json

Co-authored-by: Patrick 'Quezler' Mounier <Quezler@me.com>
Co-authored-by: Anuken <arnukren@gmail.com>
2021-06-26 12:29:56 -04:00
Anuken
604e6f8c47 Catch NoClassDefFoundErrors on ClientLoad 2021-06-26 11:11:27 -04:00
Anuken
4ac4f10ea0 Log mismatch errors for net buffers 2021-06-26 11:08:45 -04:00
Anuken
4c07733857 Fixed #5481 2021-06-26 11:04:03 -04:00
Anuken
7dc0f4dbc5 Merge remote-tracking branch 'origin/master' 2021-06-26 10:12:04 -04:00
Anuken
22f64fa2a5 Revert naval balance changes for now 2021-06-26 10:11:59 -04:00
KotMilkMeoW
5b0f1b5c03 Server upgrade to v7 (#5480) 2021-06-26 09:54:18 -04:00
Anuken
c6e0292d03 Fixed clientside physics jitter 2021-06-26 09:52:03 -04:00
Anuken
17eee61a93 Fixed #5478 2021-06-26 09:34:25 -04:00
Anuken
3817b159cf Reduced jittery interpolation 2021-06-26 00:19:23 -04:00
Anuken
331cf2e269 arc 2021-06-25 22:58:30 -04:00
Anuken
96622848d9 Hide outdated lobbies on Steam 2021-06-25 19:49:53 -04:00
Anuken
bcdc8867e6 Merge remote-tracking branch 'origin/master' 2021-06-25 19:36:07 -04:00
Anuken
eaeb67b91f Fixed #5474 2021-06-25 19:35:34 -04:00
Catchears
ebd444cc5f final v7 german translation (#5473) 2021-06-25 16:57:20 -04:00
L0615T1C5-216AC-9437
ff1ab9dd42 Add Chaotic Neutral Survival to BE Server List (#5435)
Co-authored-by: Anuken <arnukren@gmail.com>
2021-06-25 16:22:11 -04:00
Ilya246
7e2c830f9c Add .pl to 7.0 serverlist (#5466)
* Add .pl to 7.0 serverlist

.pl will move to 7.0 once b127 is out
Somka currently can't make a PR by himself so i asked him whether i should and, after a positive answer, did it for him

* Update servers_v7.json
2021-06-25 16:01:38 -04:00
Volas171
0cc2214951 Add Mindustry Reborn to V7 Alpha list (#5470)
* v7

* be removal

* formatting

Co-authored-by: Anuken <arnukren@gmail.com>
2021-06-25 14:41:24 -04:00
Anuken
47443d5ae7 Merge remote-tracking branch 'origin/master' 2021-06-25 14:37:36 -04:00
Anuken
cd2c605036 Suppress certain mod errors on client load 2021-06-25 14:37:32 -04:00
RebornTrack970
847e46d270 Add Beta 2r2t to V7 (#5468)
* Add Beta 2r2t to V7

Other Omega Servers will likely get updated to V7 too, for now, only 2r2t has a Beta.

* Update servers_v7.json

* Update servers_v7.json

Co-authored-by: Patrick 'Quezler' Mounier <Quezler@me.com>

* Update servers_be.json

Co-authored-by: Patrick 'Quezler' Mounier <Quezler@me.com>
2021-06-25 14:26:54 -04:00
Anuken
3d6cfcafd0 Don't assign players to derelict 2021-06-25 14:11:36 -04:00
294 changed files with 1040 additions and 1696 deletions

View File

@@ -47,7 +47,8 @@ jobs:
git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
cd ../MindustryBuilds cd ../MindustryBuilds
echo "Updating version to ${RELEASE_VERSION:1}" echo "Updating version to ${RELEASE_VERSION:1}"
echo versionName=7-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${GITHUB_RUN_NUMBER} > version_fdroid.txt BNUM=$(($GITHUB_RUN_NUMBER + 1000))
echo versionName=7-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${BNUM} > version_fdroid.txt
git add . git add .
git commit -m "Updating to build ${RELEASE_VERSION:1}" git commit -m "Updating to build ${RELEASE_VERSION:1}"
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds

1
.gitignore vendored
View File

@@ -1,4 +1,5 @@
logs/ logs/
/fastlane/metadata/android/en-US/changelogs/
/core/assets/mindustry-saves/ /core/assets/mindustry-saves/
/core/assets/mindustry-maps/ /core/assets/mindustry-maps/
/core/assets/bundles/output/ /core/assets/bundles/output/

View File

@@ -14,6 +14,7 @@
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:isGame="true" android:isGame="true"
android:theme="@style/ArcTheme"
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"
android:appCategory="game" android:appCategory="game"
android:label="@string/app_name" android:label="@string/app_name"

View File

@@ -100,6 +100,9 @@ android{
all{ all{
minifyEnabled = true minifyEnabled = true
shrinkResources = true shrinkResources = true
//this is the ONLY WAY I could find to force r8 to keep its filthy hands off of my default interfaces.
//may have undesirable side effects
debuggable = true
proguardFiles("proguard-rules.pro") proguardFiles("proguard-rules.pro")
} }
} }

View File

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

View File

@@ -0,0 +1,10 @@
<resources>
<style name="ArcTheme" parent="android:Theme">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowFullscreen">true</item>
</style>
</resources>

View File

@@ -84,9 +84,9 @@ public class AndroidLauncher extends AndroidApplication{
try{ try{
//try to load own class first //try to load own class first
loadedClass = findClass(name); loadedClass = findClass(name);
}catch(ClassNotFoundException e){ }catch(ClassNotFoundException | NoClassDefFoundError e){
//use parent if not found //use parent if not found
loadedClass = super.loadClass(name, resolve); return parent.loadClass(name);
} }
} }

View File

@@ -143,7 +143,8 @@ public class EntityIO{
if(sl) cont("if(!islocal)"); if(sl) cont("if(!islocal)");
if(sf){ if(sf){
st(field.name + lastSuf + " = this." + field.name + targetSuf); //TODO adding + targetSuf to the assignment fixes units being interpolated incorrectly during physics, but makes interpolation snap instead.
st(field.name + lastSuf + " = this." + field.name);
} }
io(field.type, "this." + (sf ? field.name + targetSuf : field.name) + " = "); io(field.type, "this." + (sf ? field.name + targetSuf : field.name) + " = ");

View File

@@ -87,18 +87,18 @@ public class AssetsProcess extends BaseProcessor{
filename = filename.substring(0, filename.indexOf(".")); filename = filename.substring(0, filename.indexOf("."));
String sfilen = filename; String sfilen = filename;
String dtype = p.name().endsWith(".9.png") ? "arc.scene.style.NinePatchDrawable" : "arc.scene.style.TextureRegionDrawable"; String dtype = "arc.scene.style.Drawable";
String varname = capitalize(sfilen); String varname = capitalize(sfilen);
if(SourceVersion.isKeyword(varname)) varname += "s"; if(SourceVersion.isKeyword(varname)) varname += "s";
type.addField(ClassName.bestGuess(dtype), varname, Modifier.STATIC, Modifier.PUBLIC); type.addField(ClassName.bestGuess(dtype), varname, Modifier.STATIC, Modifier.PUBLIC);
load.addStatement(varname + " = (" + dtype + ")arc.Core.atlas.drawable($S)", sfilen); load.addStatement(varname + " = arc.Core.atlas.drawable($S)", sfilen);
}); });
for(Element elem : elements){ for(Element elem : elements){
Seq.with(((TypeElement)elem).getEnclosedElements()).each(e -> e.getKind() == ElementKind.FIELD, field -> { Seq.with(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 + ")");
@@ -124,7 +124,7 @@ public class AssetsProcess extends BaseProcessor{
String name = p.nameWithoutExtension(); String name = p.nameWithoutExtension();
if(names.contains(name)){ if(names.contains(name)){
BaseProcessor.err("Duplicate file name: " + p.toString() + "!"); BaseProcessor.err("Duplicate file name: " + p + "!");
}else{ }else{
names.add(name); names.add(name);
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -501,8 +501,10 @@ task deployAll{
dependsOn "desktop:packrWindows64" dependsOn "desktop:packrWindows64"
dependsOn "desktop:packrWindows32" dependsOn "desktop:packrWindows32"
dependsOn "desktop:packrMacOS" dependsOn "desktop:packrMacOS"
dependsOn "server:deploy" if(versionModifier != "steam"){
dependsOn "android:deploy" dependsOn "server:deploy"
dependsOn "android:deploy"
}
} }
task resolveDependencies{ task resolveDependencies{

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 B

After

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 B

After

Width:  |  Height:  |  Size: 120 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 B

After

Width:  |  Height:  |  Size: 120 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 B

View File

@@ -806,6 +806,7 @@ bullet.reload = [stat]{0}[lightgray]x fire rate
unit.blocks = blocks unit.blocks = blocks
unit.blockssquared = blocks² unit.blockssquared = blocks²
unit.powersecond = power units/second unit.powersecond = power units/second
unit.tilessecond = tiles/second
unit.liquidsecond = liquid units/second unit.liquidsecond = liquid units/second
unit.itemssecond = items/second unit.itemssecond = items/second
unit.liquidunits = liquid units unit.liquidunits = liquid units
@@ -1592,7 +1593,7 @@ lst.set = Set a variable.
lst.operation = Perform an operation on 1-2 variables. lst.operation = Perform an operation on 1-2 variables.
lst.end = Jump to the top of the instruction stack. lst.end = Jump to the top of the instruction stack.
lst.wait = Wait a certain number of seconds. lst.wait = Wait a certain number of seconds.
lst.lookup = Look up a item/liquid/unit/block type by ID.\nTotal counts of each type can be accessed with:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[] lst.lookup = Look up an item/liquid/unit/block type by ID.\nTotal counts of each type can be accessed with:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
lst.jump = Conditionally jump to another statement. lst.jump = Conditionally jump to another statement.
lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[]. lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[].
lst.unitcontrol = Control the currently bound unit. lst.unitcontrol = Control the currently bound unit.

View File

@@ -460,6 +460,7 @@ toolmode.drawteams = Teams zeichnen
toolmode.drawteams.description = Zeichnet Teams statt Blöcke. toolmode.drawteams.description = Zeichnet Teams statt Blöcke.
filters.empty = [lightgray]Keine Filter! Füge einen mit dem unteren Knopf hinzu. filters.empty = [lightgray]Keine Filter! Füge einen mit dem unteren Knopf hinzu.
filter.distort = Verzerren filter.distort = Verzerren
filter.noise = Rauschen filter.noise = Rauschen
filter.enemyspawn = Gegnerischer Spawn Auswahl filter.enemyspawn = Gegnerischer Spawn Auswahl
@@ -476,6 +477,7 @@ filter.clear = Löschen
filter.option.ignore = Ignorieren filter.option.ignore = Ignorieren
filter.scatter = Streuen filter.scatter = Streuen
filter.terrain = Landschaft filter.terrain = Landschaft
filter.option.scale = Skalierung filter.option.scale = Skalierung
filter.option.chance = Wahrscheinlichkeit filter.option.chance = Wahrscheinlichkeit
filter.option.mag = Größe filter.option.mag = Größe
@@ -490,6 +492,7 @@ filter.option.block = Block
filter.option.floor = Boden filter.option.floor = Boden
filter.option.flooronto = Zielboden filter.option.flooronto = Zielboden
filter.option.target = Ziel filter.option.target = Ziel
filter.option.replacement = Ersatz
filter.option.wall = Wand filter.option.wall = Wand
filter.option.ore = Erz filter.option.ore = Erz
filter.option.floor2 = Sekundärer Boden filter.option.floor2 = Sekundärer Boden
@@ -675,6 +678,7 @@ unit.nobuild = [scarlet]Einheit kann nicht bauen!
lastaccessed = [lightgray]Zuletzt konfiguriert: {0} lastaccessed = [lightgray]Zuletzt konfiguriert: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <öffne Spiel um zu zeigen>
stat.description = Beschreibung stat.description = Beschreibung
stat.input = Eingang stat.input = Eingang
stat.output = Ausgang stat.output = Ausgang
@@ -991,6 +995,7 @@ rules.waves = Wellen
rules.attack = Angriff-Modus rules.attack = Angriff-Modus
rules.buildai = KI kann bauen rules.buildai = KI kann bauen
rules.corecapture = Kern nach Zerstörung einnehmen rules.corecapture = Kern nach Zerstörung einnehmen
rules.polygoncoreprotection = Polygonaler Kernschutz
rules.enemyCheat = Unbegrenzte Ressourcen für die KI (Rotes Team) rules.enemyCheat = Unbegrenzte Ressourcen für die KI (Rotes Team)
rules.blockhealthmultiplier = Block-Lebenspunkte-Multiplikator rules.blockhealthmultiplier = Block-Lebenspunkte-Multiplikator
rules.blockdamagemultiplier = Block-Schaden-Multiplikator rules.blockdamagemultiplier = Block-Schaden-Multiplikator
@@ -1161,6 +1166,7 @@ block.spore-cluster.name = Sporen-Cluster
block.metal-floor.name = Metallboden 1 block.metal-floor.name = Metallboden 1
block.metal-floor-2.name = Metallboden 2 block.metal-floor-2.name = Metallboden 2
block.metal-floor-3.name = Metallboden 3 block.metal-floor-3.name = Metallboden 3
block.metal-floor-4.name = Metallboden 4
block.metal-floor-5.name = Metallboden 5 block.metal-floor-5.name = Metallboden 5
block.metal-floor-damaged.name = beschädigter Metallboden block.metal-floor-damaged.name = beschädigter Metallboden
block.dark-panel-1.name = Dunkles Panel 1 block.dark-panel-1.name = Dunkles Panel 1
@@ -1585,6 +1591,8 @@ lst.sensor = Gibt Daten über einen Block oder eine Einheit wieder.
lst.set = Setzt eine Variable fest. lst.set = Setzt eine Variable fest.
lst.operation = Verändert eine Variable. lst.operation = Verändert eine Variable.
lst.end = Springt wieder nach oben. lst.end = Springt wieder nach oben.
lst.wait = Wartet eine bestimmte Zeit.
lst.lookup = Sucht ein Item, eine Flüssigkeit, eine Einheit oder einen Block.\nGesamtmengen von jeder Sache können mit \n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]\nabgerufen werden.
lst.jump = Falls die Bedingung erfüllt ist, wird woanders weitergemacht. lst.jump = Falls die Bedingung erfüllt ist, wird woanders weitergemacht.
lst.unitbind = Speichert eine Einheit einer Sorte als [accent]@unit[]. lst.unitbind = Speichert eine Einheit einer Sorte als [accent]@unit[].
lst.unitcontrol = Steuert [accent]@unit[]. lst.unitcontrol = Steuert [accent]@unit[].

View File

@@ -41,11 +41,13 @@ be.ignore = Ignorar
be.noupdates = No se encontraron actualizaciones. be.noupdates = No se encontraron actualizaciones.
be.check = Buscar actualizaciones be.check = Buscar actualizaciones
mod.featured.title = Explorador de mods mods.browser = Explorador de Mods
mod.featured.dialog.title = Explorador de Mods
mods.browser.selected = Mod seleccionado mods.browser.selected = Mod seleccionado
mods.browser.add = Installar Mod mods.browser.add = Instalar
mods.github.open = Abrir en Github mods.browser.reinstall = Reinstalar
mods.github.open = Repositorio
mods.browser.sortdate = Más recientes
mods.browser.sortstars = Mejor valorados
schematic = Plantilla schematic = Plantilla
schematic.add = Guardar plantilla... schematic.add = Guardar plantilla...
@@ -55,16 +57,24 @@ schematic.exists = Ya existe una plantilla con ese nombre.
schematic.import = Importar plantilla... schematic.import = Importar plantilla...
schematic.exportfile = Exportar archivo schematic.exportfile = Exportar archivo
schematic.importfile = Importar archivo schematic.importfile = Importar archivo
schematic.browseworkshop = Buscar en el Steam Workshop schematic.browseworkshop = Buscar en Steam Workshop
schematic.copy = Copiar al portapapeles. schematic.copy = Copiar al portapapeles.
schematic.copy.import = Importar desde el portapapeles. schematic.copy.import = Importar desde el portapapeles.
schematic.shareworkshop = Compartir en el Steam Workshop schematic.shareworkshop = Compartir en Steam Workshop
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Girar plantilla schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Girar plantilla
schematic.saved = Plantilla guardada. schematic.saved = Plantilla guardada.
schematic.delete.confirm = Se borrará ésta plantilla. schematic.delete.confirm = Se borrará ésta plantilla.
schematic.rename = Renombrar plantilla schematic.rename = Renombrar plantilla
schematic.info = {0}x{1}, {2} bloques schematic.info = {0}x{1}, {2} bloques
schematic.disabled = [scarlet]Plantillas desactivadas.[]\nNo puedes usar plantillas en este [accent]mapa[] o [accent]servidor. schematic.disabled = [scarlet]Plantillas desactivadas.[]\nNo puedes usar plantillas en este [accent]mapa[] o [accent]servidor.
schematic.tags = Etiquetas:
schematic.edittags = Editar Etiquetas
schematic.addtag = Añadir Etiqueta
schematic.texttag = Texto de Etiqueta
schematic.icontag = Icono de Etiqueta
schematic.renametag = Renombrar Etiqueta
schematic.tagdelconfirm = ¿Eliminar ésta etiqueta?
schematic.tagexists = Esa etiqueta ya existe.
stats = Estadísticas stats = Estadísticas
stat.wave = Oleadas Derrotadas:[accent] {0} stat.wave = Oleadas Derrotadas:[accent] {0}
@@ -77,12 +87,12 @@ stat.playtime = Tiempo jugado:[accent] {0}
stat.rank = Rango final: [accent]{0} stat.rank = Rango final: [accent]{0}
globalitems = [accent]Recursos Totales globalitems = [accent]Recursos Totales
map.delete = ¿Estás seguro de que quieres borrar el mapa "[accent]{0}[]"? map.delete = ¿Quieres borrar el mapa "[accent]{0}[]"?
level.highscore = Puntuación más alta: [accent]{0} level.highscore = Puntuación más alta: [accent]{0}
level.select = Selección de nivel level.select = Selección de Nivel
level.mode = Modo de juego: level.mode = Modo de juego:
coreattack = < ¡El núcleo está bajo ataque! > coreattack = < ¡El núcleo está bajo ataque! >
nearpoint = [[ [scarlet]ABANDONA EL PUNTO DE APARICIÓN INMEDIATAMENTE[] ]\nRiesgo de aniquilación inminente nearpoint = [[ [scarlet]ABANDONA EL PUNTO DE ATERRIZAJE INMEDIATAMENTE[] ]\nRiesgo de aniquilación inminente
database = Base de datos database = Base de datos
savegame = Guardar Partida savegame = Guardar Partida
loadgame = Cargar Partida loadgame = Cargar Partida
@@ -90,6 +100,7 @@ joingame = Unirse a Partida
customgame = Crear Partida customgame = Crear Partida
newgame = Nueva Partida newgame = Nueva Partida
none = <no hay> none = <no hay>
none.found = [lightgray]<no hay coincidencias>
minimap = Minimapa minimap = Minimapa
position = Posición position = Posición
close = Cerrar close = Cerrar
@@ -110,17 +121,20 @@ committingchanges = Confirmando Cambios
done = Hecho done = Hecho
feature.unsupported = Tu dispositivo no es compatible con esta función. feature.unsupported = Tu dispositivo no es compatible con esta función.
mods.alphainfo = Ten en cuenta que los mods estan en fase Alpha, y[scarlet] pueden tener varios errores[].\nReporta cualquier error que encuentres en la página de GitHub de Mindustry. mods.initfailed = [red]⚠[] La anterior ejecución de Mindustry encontró un fallo al inicializarse. Seguramente fue causado por algún mod erróneo.\n\nPara evitar un bucle de erroes al iniciar el juego, [red]se han desactivado todos los mods.[]\n\nPuedes desactivar ésta medida de seguridad desde [accent]Opciones->Juego->Desactivar mods si el juego encuentra un error al iniciarse.[].
mods = Mods mods = Mods
mods.none = [lightgray]¡No se encontraron Mods! mods.none = [lightgray]¡No se encontraron Mods!
mods.guide = Guía de Modding mods.guide = Guía sobre Mods
mods.report = Reportar Error mods.report = Reportar Error
mods.openfolder = Abrir carpeta de mods mods.openfolder = Abrir carpeta de mods
mods.viewcontent = Ver Contenido
mods.reload = Recargar mods.reload = Recargar
mods.reloadexit = A continuación se cerrará el juego para recargar los mods. mods.reloadexit = A continuación se cerrará el juego para recargar los mods.
mod.installed = [[Instalado]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Activado mod.enabled = [lightgray]Activado
mod.disabled = [scarlet]Desactivado mod.disabled = [scarlet]Desactivado
mod.multiplayer.compatible = [gray]Compatible con Multijugador
mod.disable = Desactivar mod.disable = Desactivar
mod.content = Contenido: mod.content = Contenido:
mod.delete.error = No se pudo elminar el mod. Tal vez esté en uso por el juego. mod.delete.error = No se pudo elminar el mod. Tal vez esté en uso por el juego.
@@ -130,20 +144,20 @@ mod.missingdependencies = [scarlet]Dependencias faltantes: {0}
mod.erroredcontent = [scarlet]Contenido erróneo mod.erroredcontent = [scarlet]Contenido erróneo
mod.errors = Ha ocurrido un fallo al cargar el contenido. mod.errors = Ha ocurrido un fallo al cargar el contenido.
mod.noerrorplay = [scarlet]Se están ejecutando algunos mods con fallos.[]Deshabilítalos o arregla los errores antes de jugar. mod.noerrorplay = [scarlet]Se están ejecutando algunos mods con fallos.[]Deshabilítalos o arregla los errores antes de jugar.
mod.nowdisabled = [scarlet]Al/Los Mod/s '{0}'le esta/n faltando dependencias:[accent] {1}\n[lightgray]Estos mods necesitan descargarse primero.\nEste mod será automaticamente desactivado. mod.nowdisabled = [scarlet]El mod '{0}' necesita ejecutarse junto a otros mods de los que depende:[accent] {1}\n[lightgray]Es necesario descargar primero estos mods.\nEste mod será automaticamente desactivado.
mod.enable = Activar mod.enable = Activar
mod.requiresrestart = El juego se cerrará para aplicar los mods. mod.requiresrestart = El juego se cerrará para aplicar los mods.
mod.reloadrequired = [scarlet]Se requiere volver a cargar mod.reloadrequired = [scarlet]Es necesario Reiniciar
mod.import = Importar mod mod.import = Importar mod
mod.import.file = Importar archivo mod.import.file = Importar archivo
mod.import.github = Importar Mod de Github mod.import.github = Importar desde Github
mod.jarwarn = [scarlet]Los mods JAR pueden no ser seguros.[]\n¡Asegúrate de haberlos descargado de una fuente en la que confíes! mod.jarwarn = [scarlet]Los mods JAR pueden no ser seguros.[]\n¡Asegúrate de haberlos descargado de una fuente en la que confíes!
mod.item.remove = Este objeto es parte del[accent] '{0}'[] mod. Para eliminarlo, desinstala ese mod. mod.item.remove = Este objeto es parte del[accent] '{0}'[] mod. Para eliminarlo, desinstala ese mod.
mod.remove.confirm = Este mod va a ser eliminado.\n¿Quieres continuar? mod.remove.confirm = Este mod va a ser eliminado.\n¿Quieres continuar?
mod.author = [lightgray]Autor:[] {0} mod.author = [lightgray]Autor:[] {0}
mod.missing = Esta partida guardada usa mods que has actualizado recientemente o que no tienes instalados. Se puede corromper la partida guardada. ¿Quieres cargarla a pesar de ello?\n[lightgray]Mods:\n{0} mod.missing = Esta partida guardada usa mods que has actualizado recientemente o que no tienes instalados. Se puede corromper la partida guardada. ¿Quieres cargarla a pesar de ello?\n[lightgray]Mods:\n{0}
mod.preview.missing = Antes de publicar este mod en el Steam Workshop, debe añadir una imagen de vista previa.\nAñada una imagen con nombre[accent] preview.png[] en la carpeta del mod e intente nuevamente. mod.preview.missing = Antes de publicar este mod en Steam Workshop, debes añadir una imagen de vista previa.\nAñade una imagen llamada[accent] preview.png[] en la carpeta del mod e inténtalo de nuevo.
mod.folder.missing = Solo los mods en forma de carpeta se pueden publicar en el Steam Workshop.\nPara convertir cualquier mod en una carpeta, simplemente descomprima su archivo a una carpeta y elimine el zip anterior, luego reinicie su juego o vuelva a cargar sus mods. mod.folder.missing = Sólo los mods en forma de carpeta se pueden publicar en Steam Workshop.\nPara convertir cualquier mod en una carpeta, descomprime su archivo a una carpeta y elimina el zip anterior, luego reinicia el juego o vuelve a cargar tus mods.
mod.scripts.disable = Tu dispositivo no es compatible con mods con scripts. Debes deshabilitar esos mods para jugar. mod.scripts.disable = Tu dispositivo no es compatible con mods con scripts. Debes deshabilitar esos mods para jugar.
about.button = Acerca de... about.button = Acerca de...
@@ -214,6 +228,8 @@ trace.ip = IP: [accent]{0}
trace.id = ID Única: [accent]{0} trace.id = ID Única: [accent]{0}
trace.mobile = Cliente de móvil: [accent]{0} trace.mobile = Cliente de móvil: [accent]{0}
trace.modclient = Cliente Personalizado: [accent]{0} trace.modclient = Cliente Personalizado: [accent]{0}
trace.times.joined = Se ha unido [accent]{0} []veces
trace.times.kicked = Fue expulsado [accent]{0} []veces
invalidid = ¡ID de cliente inválida! Por favor, envía un informe del error. invalidid = ¡ID de cliente inválida! Por favor, envía un informe del error.
server.bans = Expulsiones server.bans = Expulsiones
server.bans.none = No se ha baneado a ningún usuario aún server.bans.none = No se ha baneado a ningún usuario aún
@@ -222,16 +238,16 @@ server.admins.none = ¡No hay ningún administrador!
server.add = Agregar Servidor server.add = Agregar Servidor
server.delete = ¿Estás seguro de querer borrar este servidor? server.delete = ¿Estás seguro de querer borrar este servidor?
server.edit = Editar Servidor server.edit = Editar Servidor
server.outdated = [crimson]¡Servidor desactualizado![] server.outdated = [scarlet]¡Servidor Desactualizado![]
server.outdated.client = [crimson]¡Cliente desactualizado![] server.outdated.client = [scarlet]¡Cliente Desactualizado![]
server.version = [lightgray]Versión: {0} server.version = [gray]v{0} {1}
server.custombuild = [accent]Versión personalizada server.custombuild = [accent]Versión Personalizada
confirmban = ¿Quieres banear a este jugador? confirmban = ¿Quieres banear a "{0}[white]"?
confirmkick = ¿Estás seguro de querer expulsar este jugador? confirmkick = ¿Quieres expulsar a "{0}[white]"?
confirmvotekick = ¿Estás de acuerdo en expulsar este jugador? confirmvotekick = ¿Estás a favor de expulsar a "{0}[white]"?
confirmunban = ¿Quieres desbanear a este jugador? confirmunban = ¿Quieres desbanear a este jugador?
confirmadmin = ¿Quieres hacer administrador a este jugador? confirmadmin = ¿Quieres hacer administrador a "{0}[white]"?
confirmunadmin = ¿Quieres quitar los permisos de administrador a este jugador? confirmunadmin = ¿Quieres quitarle los permisos de administrador a "{0}[white]"?
joingame.title = Unirse a Partida joingame.title = Unirse a Partida
joingame.ip = IP: joingame.ip = IP:
disconnect = Desconectado. disconnect = Desconectado.
@@ -287,6 +303,7 @@ cancel = Cancelar
openlink = Abrir Enlace openlink = Abrir Enlace
copylink = Copiar Enlace copylink = Copiar Enlace
back = Atrás back = Atrás
max = Máximo
crash.export = Exportar Registros de errores crash.export = Exportar Registros de errores
crash.none = No se encontraron Registros de errores. crash.none = No se encontraron Registros de errores.
crash.exported = Registros de errores exportados. crash.exported = Registros de errores exportados.
@@ -361,7 +378,6 @@ editor.center = Centrar
workshop = Steam Workshop workshop = Steam Workshop
waves.title = Oleadas waves.title = Oleadas
waves.remove = Borrar waves.remove = Borrar
waves.never = <nunca>
waves.every = cada waves.every = cada
waves.waves = oleada(s) waves.waves = oleada(s)
waves.perspawn = por lugar de aparición waves.perspawn = por lugar de aparición
@@ -444,6 +460,7 @@ toolmode.drawteams = Dibujar Equipos
toolmode.drawteams.description = Dibuja equipos en lugar de bloques. toolmode.drawteams.description = Dibuja equipos en lugar de bloques.
filters.empty = [lightgray]¡No hay filtros! Añade uno con el botón de abajo. filters.empty = [lightgray]¡No hay filtros! Añade uno con el botón de abajo.
filter.distort = Distorsionar filter.distort = Distorsionar
filter.noise = Ruido filter.noise = Ruido
filter.enemyspawn = Punto de aparición enemigo filter.enemyspawn = Punto de aparición enemigo
@@ -460,19 +477,22 @@ filter.clear = Despejar
filter.option.ignore = Ignorar filter.option.ignore = Ignorar
filter.scatter = Dispersar filter.scatter = Dispersar
filter.terrain = Terreno filter.terrain = Terreno
filter.option.scale = Escala filter.option.scale = Escala
filter.option.chance = Probabilidad filter.option.chance = Probabilidad
filter.option.mag = Magnitud filter.option.mag = Magnitud
filter.option.threshold = Umbral filter.option.threshold = Umbral
filter.option.circle-scale = Escala del círculo filter.option.circle-scale = Escala del círculo
filter.option.octaves = Continuidad filter.option.octaves = Continuidad
filter.option.falloff = Aterrizaje filter.option.falloff = Caída
filter.option.angle = Ángulo filter.option.angle = Ángulo
filter.option.rotate = Rotación
filter.option.amount = Cantidad filter.option.amount = Cantidad
filter.option.block = Bloque filter.option.block = Bloque
filter.option.floor = Suelo filter.option.floor = Suelo
filter.option.flooronto = Suelo objetivo filter.option.flooronto = Suelo objetivo
filter.option.target = Target filter.option.target = Objetivo
filter.option.replacement = Reemplazo
filter.option.wall = Muro filter.option.wall = Muro
filter.option.ore = Veta filter.option.ore = Veta
filter.option.floor2 = Terreno secundario filter.option.floor2 = Terreno secundario
@@ -484,11 +504,12 @@ width = Ancho:
height = Alto: height = Alto:
menu = Menú menu = Menú
play = Jugar play = Jugar
campaign = Continuar Campaña campaign = Campaña
load = Cargar load = Cargar
save = Guardar save = Guardar
fps = FPS: {0} fps = FPS: {0}
ping = Ping: {0} ms ping = Ping: {0}ms
tps = TPS: {0}
memory = Mem: {0}mb memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb memory2 = Mem:\n {0}mb +\n {1}mb
language.restart = Reinicia el juego para que los cambios en el idioma tengan efecto. language.restart = Reinicia el juego para que los cambios en el idioma tengan efecto.
@@ -565,6 +586,7 @@ sector.attacked = Sector [accent]{0}[white] bajo ataque[]!
sector.lost = ¡Sector [accent]{0}[white] perdido[]! sector.lost = ¡Sector [accent]{0}[white] perdido[]!
#nota: el espacio en blanco en la línea siguiente es intencionado #nota: el espacio en blanco en la línea siguiente es intencionado
sector.captured = ¡Sector [accent]{0}[white] capturado[]! sector.captured = ¡Sector [accent]{0}[white] capturado[]!
sector.changeicon = Cambiar Icono
threat.low = Baja threat.low = Baja
threat.medium = Media threat.medium = Media
@@ -611,6 +633,20 @@ sector.extractionOutpost.description = Una base remota, construida por el enemig
sector.impact0078.description = Aquí yacen las ruinas de la primera estación de transporte interestelar en estar operativa del sistema.\n\nRecupera todo lo posible de los escombros. Investiga cualquier tecnología intacta. sector.impact0078.description = Aquí yacen las ruinas de la primera estación de transporte interestelar en estar operativa del sistema.\n\nRecupera todo lo posible de los escombros. Investiga cualquier tecnología intacta.
sector.planetaryTerminal.description = El objetivo final.\n\nÉsta base costera alberga una estructura capaz de lanzar Núcleos a planeteas locales. Está extremadamente bien protegida.\n\nProduce unidades navales. Acaba con el enemigo lo antes posible. Analiza la estructura de lanzamiento. sector.planetaryTerminal.description = El objetivo final.\n\nÉsta base costera alberga una estructura capaz de lanzar Núcleos a planeteas locales. Está extremadamente bien protegida.\n\nProduce unidades navales. Acaba con el enemigo lo antes posible. Analiza la estructura de lanzamiento.
status.burning.name = En llamas
status.freezing.name = Congelado
status.wet.name = Húmedo
status.muddy.name = Fangoso
status.melting.name = Fundido
status.sapped.name = Debilitado
status.electrified.name = Electrificado
status.spore-slowed.name = Ralentizado
status.tarred.name = Alquitranado
status.overclock.name = Sobrecargado
status.shocked.name = Aturdido
status.blasted.name = Explotado
status.unmoving.name = Inmóvil
settings.language = Idioma settings.language = Idioma
settings.data = Datos del Juego settings.data = Datos del Juego
settings.reset = Reiniciar a los valores por defecto settings.reset = Reiniciar a los valores por defecto
@@ -632,6 +668,7 @@ settings.clearcampaignsaves.confirm = ¿Quieres borrar tus partidas guardadas en
paused = [accent] < Pausado > paused = [accent] < Pausado >
clear = Vaciar clear = Vaciar
banned = [scarlet]Baneado banned = [scarlet]Baneado
unsupported.environment = [scarlet]Entorno no válido
yes = yes =
no = No no = No
info.title = Información info.title = Información
@@ -641,12 +678,14 @@ unit.nobuild = [scarlet]Esta unidad no puede construir
lastaccessed = [lightgray]Último usado: {0} lastaccessed = [lightgray]Último usado: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <cargar mapa para mostrar>
stat.description = Objetivo stat.description = Objetivo
stat.input = Entrada stat.input = Entrada
stat.output = Salida stat.output = Salida
stat.booster = Potenciador stat.booster = Potenciador
stat.tiles = Terreno requerido stat.tiles = Terreno requerido
stat.affinities = Afinidades stat.affinities = Afinidades
stat.opposites = Opuestos
stat.powercapacity = Capacidad de Energía stat.powercapacity = Capacidad de Energía
stat.powershot = Energía/Disparo stat.powershot = Energía/Disparo
stat.damage = Daño stat.damage = Daño
@@ -669,6 +708,7 @@ stat.memorycapacity = Capacidad de memoria
stat.basepowergeneration = Generación de energía stat.basepowergeneration = Generación de energía
stat.productiontime = Tiempo de producción stat.productiontime = Tiempo de producción
stat.repairtime = Tiempo para Reparar Bloque Completamente stat.repairtime = Tiempo para Reparar Bloque Completamente
stat.repairspeed = Velocidad de Reparación
stat.weapons = Armas stat.weapons = Armas
stat.bullet = Proyectil stat.bullet = Proyectil
stat.speedincrease = Aumento de Velocidad stat.speedincrease = Aumento de Velocidad
@@ -705,15 +745,24 @@ stat.minetier = Nivel de taladro
stat.payloadcapacity = Capacidad de carga stat.payloadcapacity = Capacidad de carga
stat.commandlimit = Límite de comando stat.commandlimit = Límite de comando
stat.abilities = Habilidades stat.abilities = Habilidades
stat.canboost = Tiene Propulsores stat.canboost = Potenciador
stat.flying = Aéreo stat.flying = Aéreo
stat.ammouse = Usa Munición
stat.damagemultiplier = Multiplicador de Daño
stat.healthmultiplier = Multiplicador de Vida
stat.speedmultiplier = Multiplicador de Velocidad
stat.reloadmultiplier = Multiplicador de Recarga
stat.buildspeedmultiplier = Multiplicador de Velocidad de Construcción
stat.reactive = Reacciona
stat.healing = Sanador
ability.forcefield = Campo de Fuerza ability.forcefield = Campo de Escudo
ability.repairfield = Campo de Reparación ability.repairfield = Campo de Reparación
ability.statusfield = Campo de Estado ability.statusfield = {0} Campo de aceleración
ability.unitspawn = {0} Fábrica de Drones ability.unitspawn = {0} Fábrica
ability.shieldregenfield = Campo de Regeneración de Escudos ability.shieldregenfield = Regeneración de Armaduras
ability.movelightning = Movimiento Relámpago ability.movelightning = Movimiento Relámpago
ability.energyfield = Campo de Energía: [accent]{0}[] daño ~ [accent]{1}[] bloques / [accent]{2}[] objetivos
bar.drilltierreq = Requiere un taladro mejor bar.drilltierreq = Requiere un taladro mejor
bar.noresources = Recursos insuficientes bar.noresources = Recursos insuficientes
@@ -736,29 +785,28 @@ bar.power = Energía
bar.progress = Progreso de construcción bar.progress = Progreso de construcción
bar.input = Entrada bar.input = Entrada
bar.output = Salida bar.output = Salida
bar.strength = [stat]{0}[lightgray]x fuerza
units.processorcontrol = [lightgray]Controlado por Procesador units.processorcontrol = [lightgray]Controlado por Procesador
bullet.damage = [stat]{0}[lightgray] Daño bullet.damage = [stat]{0}[lightgray] Daño
bullet.splashdamage = [stat]{0}[lightgray] daño de área ~[stat] {1}[lightgray] casillas bullet.splashdamage = [stat]{0}[lightgray] área daño ~[stat] {1}[lightgray] bloques
bullet.incendiary = [stat]Incendiaria bullet.incendiary = [stat]Incendiaria
bullet.sapping = [stat]Oxidante
bullet.homing = [stat]Rastreadora bullet.homing = [stat]Rastreadora
bullet.shock = [stat]Electrizante
bullet.frag = [stat]De fragmentación bullet.frag = [stat]De fragmentación
bullet.buildingdamage = [stat]{0}%[lightgray]daño a estructuras bullet.lightning = [stat]{0}[lightgray]x rayo ~ [stat]{1}[lightgray] daño
bullet.knockback = [stat]{0}[lightgray] Empuje bullet.buildingdamage = [stat]{0}%[lightgray] daño a estructuras
bullet.pierce = [stat]{0}[lightgray]x penetración bullet.knockback = [stat]{0}[lightgray] empuje
bullet.infinitepierce = [stat]Penetrante bullet.pierce = [stat]{0}[lightgray]x perforación
bullet.infinitepierce = [stat]Perforante
bullet.healpercent = [stat]{0}[lightgray]% reparación bullet.healpercent = [stat]{0}[lightgray]% reparación
bullet.freezing = [stat]Congelación
bullet.tarred = [stat]Ralentizado
bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munición bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munición
bullet.reload = [stat]{0}[lightgray]x cadencia de fuego bullet.reload = [stat]{0}[lightgray]x cadencia de fuego
unit.blocks = bloques unit.blocks = bloques
unit.blockssquared = bloques² unit.blockssquared = bloques²
unit.powersecond = unidades de energía/segundo unit.powersecond = unidades de energía/segundo
unit.tilessecond = bloques/segundo
unit.liquidsecond = unidades de líquido/segundo unit.liquidsecond = unidades de líquido/segundo
unit.itemssecond = objetos/segundo unit.itemssecond = objetos/segundo
unit.liquidunits = unidades de líquido unit.liquidunits = unidades de líquido
@@ -775,6 +823,7 @@ unit.items = objetos
unit.thousands = k unit.thousands = k
unit.millions = M unit.millions = M
unit.billions = b unit.billions = b
unit.pershot = /disparo
category.purpose = Objetivo category.purpose = Objetivo
category.general = General category.general = General
category.power = Energía category.power = Energía
@@ -788,10 +837,13 @@ setting.shadows.name = Sombras
setting.blockreplace.name = Sugerir bloques al construir setting.blockreplace.name = Sugerir bloques al construir
setting.linear.name = Filtrado Lineal setting.linear.name = Filtrado Lineal
setting.hints.name = Consejos setting.hints.name = Consejos
setting.logichints.name = Consejos sobre "Bloques Lógicos"
setting.flow.name = Mostrar tasa de flujo de recursos setting.flow.name = Mostrar tasa de flujo de recursos
setting.backgroundpause.name = Pausar en segundo plano setting.backgroundpause.name = Pausar en segundo plano
setting.buildautopause.name = Auto-pausar construcción setting.buildautopause.name = Auto-pausar construcción
setting.animatedwater.name = Animaciones de Terreno setting.doubletapmine.name = Doble-Click para Extraer minerales
setting.modcrashdisable.name = Desactivar Mods si se cuelga el juego
setting.animatedwater.name = Animación de Terreno
setting.animatedshields.name = Animación de Escudos setting.animatedshields.name = Animación de Escudos
setting.antialias.name = Antialias[lightgray] (necesita un reinicio)[] setting.antialias.name = Antialias[lightgray] (necesita un reinicio)[]
setting.playerindicators.name = Indicadores de Jugadores setting.playerindicators.name = Indicadores de Jugadores
@@ -844,6 +896,7 @@ setting.bridgeopacity.name = Opacidad de Puentes Transportadores
setting.playerchat.name = Mostrar el chat de burbuja setting.playerchat.name = Mostrar el chat de burbuja
setting.showweather.name = Efectos visuales climáticos setting.showweather.name = Efectos visuales climáticos
public.confirm = ¿Quieres hacer pública tu partida?\n[lightgray]Esto se puede cambiar más tarde en "Configuración->Juego->Visibilidad pública de la partida". public.confirm = ¿Quieres hacer pública tu partida?\n[lightgray]Esto se puede cambiar más tarde en "Configuración->Juego->Visibilidad pública de la partida".
public.confirm.really = ¡Si quieres jugar con amigos, usa [green]Invitar a Amigos[] en lugar de un [scarlet]Servidor Público[]!\n¿De verdad quieres hacer [scarlet]pública[] tu partida?
public.beta = Recuerda que no puedes crear partidas públicas en las versiones beta del juego. public.beta = Recuerda que no puedes crear partidas públicas en las versiones beta del juego.
uiscale.reset = La escala de la interfaz ha sido modificada.\nPulsa "OK" para conservar esta escala.\n[scarlet]Se desharán los cambios automáticamente en [accent] {0}[] segundos... uiscale.reset = La escala de la interfaz ha sido modificada.\nPulsa "OK" para conservar esta escala.\n[scarlet]Se desharán los cambios automáticamente en [accent] {0}[] segundos...
uiscale.cancel = Cancelar y Salir uiscale.cancel = Cancelar y Salir
@@ -908,7 +961,8 @@ keybind.pause.name = Pausa
keybind.pause_building.name = Pausar/Reanudar construcción keybind.pause_building.name = Pausar/Reanudar construcción
keybind.minimap.name = Minimapa keybind.minimap.name = Minimapa
keybind.planet_map.name = Mapa del Planeta keybind.planet_map.name = Mapa del Planeta
keybind.research.name = Investigaciones keybind.research.name = Investigar
keybind.block_info.name = Información del Bloque
keybind.chat.name = Chat keybind.chat.name = Chat
keybind.player_list.name = Lista de jugadores keybind.player_list.name = Lista de jugadores
keybind.console.name = Consola keybind.console.name = Consola
@@ -935,18 +989,23 @@ mode.custom = Normas personalizadas
rules.infiniteresources = Recursos infinitos rules.infiniteresources = Recursos infinitos
rules.reactorexplosions = Los reactores pueden explotar rules.reactorexplosions = Los reactores pueden explotar
rules.coreincinerates = Núcleos inceran exceso de recursos
rules.schematic = Permitir Plantillas rules.schematic = Permitir Plantillas
rules.wavetimer = Temporizador de Oleadas rules.wavetimer = Temporizador de Oleadas
rules.waves = Oleadas rules.waves = Oleadas
rules.attack = Ataque rules.attack = Asalto
rules.buildai = La IA enemiga puede construir rules.buildai = Contrucción de IA
rules.enemyCheat = La IA enemiga tiene recursos infinitos rules.corecapture = Capturar Núcleo al Destruirlo
rules.blockhealthmultiplier = Multiplicador de salud de bloque rules.polygoncoreprotection = Protección de Núcleo Poligonal
rules.blockdamagemultiplier = Multiplicador de daño de bloque rules.enemyCheat = La IA (Equipo Rojo) tiene recursos infinitos
rules.blockhealthmultiplier = Multiplicador de Salud de Bloque
rules.blockdamagemultiplier = Multiplicador de Daño de Bloque
rules.unitbuildspeedmultiplier = Multiplicador de velocidad de creación de unidades rules.unitbuildspeedmultiplier = Multiplicador de velocidad de creación de unidades
rules.unithealthmultiplier = Multiplicador de la vida de las unidades rules.unithealthmultiplier = Multiplicador de Vida de Unidades
rules.unitdamagemultiplier = Multiplicador del daño de unidades rules.unitdamagemultiplier = Multiplicador de Daño de Unidades
rules.enemycorebuildradius = Radio de No-Construcción del Núcleo Enemigo:[lightgray] (casillas) rules.unitcapvariable = Núcleos alteran el Límite de Unidades
rules.unitcap = Límite Base de Unidades
rules.enemycorebuildradius = Radio de No-Construcción del Núcleo Enemigo:[lightgray] (bloques)
rules.wavespacing = Tiempo entre oleadas:[lightgray] (seg) rules.wavespacing = Tiempo entre oleadas:[lightgray] (seg)
rules.buildcostmultiplier = Multiplicador de coste de construcción rules.buildcostmultiplier = Multiplicador de coste de construcción
rules.buildspeedmultiplier = Multiplicador de velocidad de construcción rules.buildspeedmultiplier = Multiplicador de velocidad de construcción
@@ -967,12 +1026,14 @@ rules.explosions = Daño de explosiones de Bloques/Unidades
rules.ambientlight = Iluminación ambiental rules.ambientlight = Iluminación ambiental
rules.weather = Clima rules.weather = Clima
rules.weather.frequency = Frequencia: rules.weather.frequency = Frequencia:
rules.weather.always = Siempre
rules.weather.duration = Duracion: rules.weather.duration = Duracion:
content.item.name = Objetos content.item.name = Objetos
content.liquid.name = Líquidos content.liquid.name = Líquidos
content.unit.name = Unidades content.unit.name = Unidades
content.block.name = Bloques content.block.name = Bloques
content.status.name = Alteraciones de Estado
content.sector.name = Sectores content.sector.name = Sectores
item.copper.name = Cobre item.copper.name = Cobre
@@ -983,7 +1044,7 @@ item.titanium.name = Titanio
item.thorium.name = Torio item.thorium.name = Torio
item.silicon.name = Silicio item.silicon.name = Silicio
item.plastanium.name = Plastanio item.plastanium.name = Plastanio
item.phase-fabric.name = Tejido de fase item.phase-fabric.name = Tejido de Fase
item.surge-alloy.name = Aleación Eléctrica item.surge-alloy.name = Aleación Eléctrica
item.spore-pod.name = Vaina de Esporas item.spore-pod.name = Vaina de Esporas
item.sand.name = Arena item.sand.name = Arena
@@ -991,11 +1052,12 @@ item.blast-compound.name = Compuesto Explosivo
item.pyratite.name = Pirotita item.pyratite.name = Pirotita
item.metaglass.name = Metacristal item.metaglass.name = Metacristal
item.scrap.name = Chatarra item.scrap.name = Chatarra
liquid.water.name = Agua liquid.water.name = Agua
liquid.slag.name = Magma liquid.slag.name = Magma
liquid.oil.name = Petróleo liquid.oil.name = Petróleo
liquid.cryofluid.name = Líquido criogénico liquid.cryofluid.name = Líquido criogénico
#Names of Units and Turrets look better untranslated, since they are propper/own names #Names of Units and Turrets looks better untranslated, since they are propper/own names
unit.dagger.name = Dagger unit.dagger.name = Dagger
unit.mace.name = Mace unit.mace.name = Mace
unit.fortress.name = Fortress unit.fortress.name = Fortress
@@ -1022,6 +1084,11 @@ unit.minke.name = Minke
unit.bryde.name = Bryde unit.bryde.name = Bryde
unit.sei.name = Sei unit.sei.name = Sei
unit.omura.name = Omura unit.omura.name = Omura
unit.retusa.name = Retusa
unit.oxynoe.name = Oxynoe
unit.cyerce.name = Cyerce
unit.aegires.name = Aegires
unit.navanax.name = Navanax
unit.alpha.name = Alpha unit.alpha.name = Alpha
unit.beta.name = Beta unit.beta.name = Beta
unit.gamma.name = Gamma unit.gamma.name = Gamma
@@ -1082,23 +1149,25 @@ block.sand-water.name = Agua con arena
block.darksand-water.name = Agua con arena oscura block.darksand-water.name = Agua con arena oscura
block.char.name = Cenizas block.char.name = Cenizas
block.dacite.name = Dacita block.dacite.name = Dacita
block.dacite-wall.name = Bloque de dacita block.rhyolite.name = Riolita
block.dacite-boulder.name = Roca de dacita block.dacite-wall.name = Bloque de Dacita
block.dacite-boulder.name = Roca de Dacita
block.ice-snow.name = Hielo-Nieve block.ice-snow.name = Hielo-Nieve
block.stone-wall.name = Bloque de piedra block.stone-wall.name = Bloque de Piedra
block.ice-wall.name = Bloque de hielo block.ice-wall.name = Bloque de Hielo
block.snow-wall.name = Bloque de nieve block.snow-wall.name = Bloque de Nieve
block.dune-wall.name = Bloque de arena block.dune-wall.name = Bloque de Arena
block.pine.name = Pino block.pine.name = Pino
block.dirt.name = Tierra block.dirt.name = Tierra
block.dirt-wall.name = Bloque de tierra block.dirt-wall.name = Bloque de tierra
block.mud.name = Lodo block.mud.name = Lodo
block.white-tree-dead.name = Árbol Blanco Muerto block.white-tree-dead.name = Árbol Blanco Muerto
block.white-tree.name = Árbol Blanco block.white-tree.name = Árbol Blanco
block.spore-cluster.name = Concentración de Esporas block.spore-cluster.name = Esporas
block.metal-floor.name = Suelo de Metal block.metal-floor.name = Suelo de Metal 1
block.metal-floor-2.name = Suelo de Metal 2 block.metal-floor-2.name = Suelo de Metal 2
block.metal-floor-3.name = Suelo de Metal 3 block.metal-floor-3.name = Suelo de Metal 3
block.metal-floor-4.name = Suelo de Metal 4
block.metal-floor-5.name = Suelo de Metal 5 block.metal-floor-5.name = Suelo de Metal 5
block.metal-floor-damaged.name = Suelo de Metal dañado block.metal-floor-damaged.name = Suelo de Metal dañado
block.dark-panel-1.name = Panel Oscuro 1 block.dark-panel-1.name = Panel Oscuro 1
@@ -1189,6 +1258,7 @@ block.solar-panel.name = Panel Solar
block.solar-panel-large.name = Panel Solar Grande block.solar-panel-large.name = Panel Solar Grande
block.oil-extractor.name = Extractor de Petróleo block.oil-extractor.name = Extractor de Petróleo
block.repair-point.name = Punto de Reparación de Unidades block.repair-point.name = Punto de Reparación de Unidades
block.repair-turret.name = Torreta Reparadora
block.pulse-conduit.name = Conducto de Pulso block.pulse-conduit.name = Conducto de Pulso
block.plated-conduit.name = Conducto Acorazado block.plated-conduit.name = Conducto Acorazado
block.phase-conduit.name = Conducto de Fase block.phase-conduit.name = Conducto de Fase
@@ -1221,16 +1291,22 @@ block.container.name = Contenedor
block.launch-pad.name = Plataforma de Lanzamiento block.launch-pad.name = Plataforma de Lanzamiento
block.launch-pad-large.name = Plataforma de Lanzamiento Grande block.launch-pad-large.name = Plataforma de Lanzamiento Grande
block.segment.name = Segment block.segment.name = Segment
block.command-center.name = Centro de comando block.command-center.name = Centro de Comando
block.ground-factory.name = Fábrica terrestre block.ground-factory.name = Fábrica Terrestre
block.air-factory.name = Fábrica aérea block.air-factory.name = Fábrica Aérea
block.naval-factory.name = Fábrica naval block.naval-factory.name = Fábrica naval
block.additive-reconstructor.name = Reconstructor aditivo block.additive-reconstructor.name = Reconstructor Aditivo
block.multiplicative-reconstructor.name = Reconstructor multiplicativo block.multiplicative-reconstructor.name = Reconstructor Multiplicativo
block.exponential-reconstructor.name = Reconstructor exponencial block.exponential-reconstructor.name = Reconstructor Exponencial
block.tetrative-reconstructor.name = Reconstructor tetrativo block.tetrative-reconstructor.name = Reconstructor Tetrativo
block.payload-conveyor.name = Transportador de carga block.payload-conveyor.name = Cinta Transportadora de Carga
block.payload-router.name = Enrutador de carga block.payload-router.name = Enrutador de Carga
block.duct.name = Túnel
block.duct-router.name = Túnel Enrutador
block.duct-bridge.name = Túnel Puente
block.payload-propulsion-tower.name = Torre de Propulsión de Bloques
block.payload-void.name = Vacío de Bloques
block.payload-source.name = Fuente de Bloques
block.disassembler.name = Desensamblador block.disassembler.name = Desensamblador
block.silicon-crucible.name = Crisol de silicio block.silicon-crucible.name = Crisol de silicio
block.overdrive-dome.name = Campo de Aceleración block.overdrive-dome.name = Campo de Aceleración
@@ -1252,7 +1328,6 @@ block.memory-bank.name = Servidor de memoria
team.blue.name = azul team.blue.name = azul
team.crux.name = crux team.crux.name = crux
team.sharded.name = sharded team.sharded.name = sharded
team.orange.name = naranja
team.derelict.name = delerict team.derelict.name = delerict
team.green.name = verde team.green.name = verde
team.purple.name = morado team.purple.name = morado
@@ -1273,6 +1348,7 @@ hint.placeConveyor.mobile = Las cintas transportadoras pueden mover objetos de l
hint.placeTurret = Construye \uf861 [accent]Torretas[] para defender tu base de los enemigos.\n\nLas torretas necesitan munición - en este caso, \uf838cobre.\nUsa cintas transportadoras y taladros para abastecerlas con cobre. hint.placeTurret = Construye \uf861 [accent]Torretas[] para defender tu base de los enemigos.\n\nLas torretas necesitan munición - en este caso, \uf838cobre.\nUsa cintas transportadoras y taladros para abastecerlas con cobre.
hint.breaking = Pulsa [accent]Clic-derecho[] y arrastra para destruir bloques. hint.breaking = Pulsa [accent]Clic-derecho[] y arrastra para destruir bloques.
hint.breaking.mobile = Activa el botón con el \ue817 [accent]martillo[] situado abajo a la derecha y selecciona bloques para eliminarlos.\n\nMantén el dedo un segundo y arrastra para eliminar bloques directamente en esa selección. hint.breaking.mobile = Activa el botón con el \ue817 [accent]martillo[] situado abajo a la derecha y selecciona bloques para eliminarlos.\n\nMantén el dedo un segundo y arrastra para eliminar bloques directamente en esa selección.
hint.blockInfo = Puedes visualizar información de un bloque seleccionándolo en el [accent]menú de construcción[], mediante el botón [accent][[?][] en la derecha.
hint.research = Usa el botón \ue875 [accent]Investigación[] para acceder al menú de descubrimientos tecnológicos. hint.research = Usa el botón \ue875 [accent]Investigación[] para acceder al menú de descubrimientos tecnológicos.
hint.research.mobile = Usa el botón \ue875 [accent]Investigación[] para acceder al menú de descubrimientos tecnológicos. hint.research.mobile = Usa el botón \ue875 [accent]Investigación[] para acceder al menú de descubrimientos tecnológicos.
hint.unitControl = Mantén [accent][[L-ctrl][] y [accent]haz clic[] sobre unidades o torretas aliadas para controlarlas manualmente. hint.unitControl = Mantén [accent][[L-ctrl][] y [accent]haz clic[] sobre unidades o torretas aliadas para controlarlas manualmente.
@@ -1319,7 +1395,7 @@ item.spore-pod.details = Esporas. Es algo parecido a una forma de vida sintétic
item.blast-compound.description = Usado en bombas y munición explosiva. item.blast-compound.description = Usado en bombas y munición explosiva.
item.pyratite.description = Usado en armas incendiarias y generadores de combustión. item.pyratite.description = Usado en armas incendiarias y generadores de combustión.
liquid.water.description = Usada comúnmente para enfriar máquinas y para procesar residuos. liquid.water.description = Usada para enfriar máquinas y para procesar residuos.
liquid.slag.description = Diferentes tipos de metales fundidos mezclados. Puede ser separado en sus minerales constituyentes, o disparado a unidades enemigas como arma. liquid.slag.description = Diferentes tipos de metales fundidos mezclados. Puede ser separado en sus minerales constituyentes, o disparado a unidades enemigas como arma.
liquid.oil.description = Se utiliza en producción de materiales avanzados, y en munición incendiaria. liquid.oil.description = Se utiliza en producción de materiales avanzados, y en munición incendiaria.
liquid.cryofluid.description = Usado como refrigerante para reactores, torretas, y fábricas. liquid.cryofluid.description = Usado como refrigerante para reactores, torretas, y fábricas.
@@ -1502,3 +1578,155 @@ unit.omura.description = Dispara rayos contínuos perforantes. Construye unidade
unit.alpha.description = Defiende el núcleo Shard de los enemigos. Construye estructuras. unit.alpha.description = Defiende el núcleo Shard de los enemigos. Construye estructuras.
unit.beta.description = Defiende el núcleo Foundation de los enemigos. Construye estructuras. unit.beta.description = Defiende el núcleo Foundation de los enemigos. Construye estructuras.
unit.gamma.description = Defiende el núcleo Nucleus de los enemigos. Construye estructuras. unit.gamma.description = Defiende el núcleo Nucleus de los enemigos. Construye estructuras.
lst.read = Lee un número desde una unidad de memoria conectada.
lst.write = Escribe un número en una unidad de memoria conectada.
lst.print = Añade texto a la cola para impresión.\nNo mostrará nada hasta que se use [accent]Ejecutar Imprimir[].
lst.draw = Añade una operación a la cola de gráfico.\nNo mostrará nada hasta que se use [accent]Ejecutar Gráfico[].
lst.drawflush = Ejecución en cola de operaciones [accent]Gráfico[] a un monitor gráfico.
lst.printflush = Ejecución en cola de operaciones [accent]Imprimir[] a un bloque de mensaje.
lst.getlink = Obtiene el número de enlace de procesador. Inicia en 0.
lst.control = Controla el estado de un bloque.
lst.radar = Localiza unidades alrededor de un bloque con rango.
lst.sensor = Recopila datos de un bloque o unidad.
lst.set = Establece una variable.
lst.operation = Realiza una operación sobre 1-2 variables.
lst.end = Salta al inicio de la lista de instrucciones.
lst.wait = Espera unos segundos.
lst.lookup = Busca un objeto/líquido/unidad/tipo de bloque por ID.\nSe puede acceder al número total de cada tipo con:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
lst.jump = Salta a otra instrucción.
lst.unitbind = Se enlaza a la siguiente unidad de un tipo, y la almacena en [accent]@unit[].
lst.unitcontrol = Controla la unidad actualmente enlazada.
lst.unitradar = Localiza unidades alrededor de la unidad actualmente enlazada.
lst.unitlocate = Localiza un tipo específico de posición/bloque en cualquier lugar del mapa.\nRequiere una unidad enlazada.
logic.nounitbuild = [red]No se permite la construcción de bloques de categoría lógica.
lenum.type = El tipo de bloque/unidad\nEjemplo: "para cualquier enrutador", devolverá [accent]@router[].\nNo es una cadena de texto.
lenum.shoot = Dispara a una posición.
lenum.shootp = Dispara a una unidad/bloque con predicción de velocidad.
lenum.config = Configuración de bloque, por ejemplo: clasificador.
lenum.enabled = Si el bloque está activado o no.
laccess.color = Color del iluminador.
laccess.controller = Controlador de unidad. Si se controla mediante un procesador, devuelve dicho procesador.\nSi está en formación, devuelve su líder.\nDe otra forma, devuelve la misma unidad.
laccess.dead = Si una unidad/bloque es destruída o inválida.
laccess.controlled = Devuelve:\n[accent]@ctrlProcessor[] si el control de la unidad lo tiene un procesador\n[accent]@ctrlPlayer[] si el control de la unidad/bloque lo tiene un jugador\n[accent]@ctrlFormation[] si la unidad está en formación\nDe otra forma, devuelve 0.
laccess.commanded = [red]En desuso. ¡Será eliminado![]\nUsa [accent]controlado[] en su lugar.
laccess.progress = Progreso de una acción, 0 a 1.\nDevuelve de una producción, recarga de una torreta o progreso de una construcción.
graphicstype.clear = Llena el monitor con un color.
graphicstype.color = Establece el color para próximas operaciones de gráficos.
graphicstype.stroke = Establece el ancho de la línea.
graphicstype.line = Segmento de la línea del gráfico.
graphicstype.rect = Rellena un rectángulo.
graphicstype.linerect = Dibuja las aristas de un rectángulo.
graphicstype.poly = Rellena un polígono regular.
graphicstype.linepoly = Dibuja las aristas de un polígono regular.
graphicstype.triangle = Rellena un triángulo.
graphicstype.image = Dibuja una imágen de un contenido.\nEjemplo: [accent]@router[] o [accent]@dagger[].
lenum.always = Siempre "true".
lenum.idiv = División de un número entero.
lenum.div = División.\nDevuelve [accent]null[] al dividir entre cero.
lenum.mod = Modulo.
lenum.equal = Igual. Coacciona tipos.\nObjetos no-nulos coaccionados con números pasan a 1, si no coinciden pasan a 0.
lenum.notequal = No igual. Coacciona tipos.
lenum.strictequal = Igualdad estricta. No coacciona tipos.\nSe puede usar para comprobar si un resultado es [accent]null[].
lenum.shl = Cambia bits a izquierda.
lenum.shr = Cambia bits a derecha.
lenum.or = Comprobación bit a bit OR.
lenum.land = Comprobación lógica AND.
lenum.and = Comprobación bit a bit AND.
lenum.not = Comprobación bit a bit invertida.
lenum.xor = Comprobación bit a bit XOR.
lenum.min = Mínimo de dos números.
lenum.max = Máximo de dos números.
lenum.angle = Ángulo del vector en grados.
lenum.len = Longitud del vector.
lenum.sin = Seno, en grados.
lenum.cos = Coseno, en grados.
lenum.tan = Tangente, en grados.
lenum.asin = Arco seno, en grados.
lenum.acos = Arco coseno, en grados.
lenum.atan = Arco tangente, en grados.
#not a typo, look up 'range notation'
lenum.rand = Número decimal aleatorio en un rango [0, valor).
lenum.log = Logaritmo natural (ln).
lenum.log10 = Logaritmo en base 10.
lenum.noise = Ruido simplex 2D.
lenum.abs = Valor absoluto.
lenum.sqrt = Raíz cuadrada.
lenum.any = Cualquier unidad.
lenum.ally = Unidad aliada.
lenum.attacker = Unidad con un arma.
lenum.enemy = Unidad enemiga.
lenum.boss = Unidad guardián (Jefe).
lenum.flying = Unidad aérea.
lenum.ground = Unidad terrestre.
lenum.player = Unidad controlada por un jugador.
lenum.ore = Depósito mineral.
lenum.damaged = Bloque aliado dañado.
lenum.spawn = Punto de aterrizaje enemigo.\nPuede ser un núcleo o una posición.
lenum.building = Un bloque de una categoría específica.
lenum.core = Cualquier núcleo.
lenum.storage = Bloque de almacenamiento, ejemplo: Contenedor.
lenum.generator = Bloques que generan energía.
lenum.factory = Bloques que transforman recursos.
lenum.repair = Puntos de reparación.
lenum.rally = Centro de comando.
lenum.battery = Cualquier batería.
lenum.resupply = Puntos de reabastecimiento.\nSólo es relevante cuando [accent]"Unidades necesitan munición"[] está activada.
lenum.reactor = Reactor de Impacto/Torio.
lenum.turret = Cualquier torreta.
sensor.in = El bloque/unidad a detectar.
radar.from = Bloque del que detectar.\nEl rango del sensor está limitado por el rango de dicha construcción.
radar.target = Filtro de unidades a detectar.
radar.and = Filtros adicionales.
radar.order = Orden para ordenar. 0 para invertir.
radar.sort = Métrica a usar al ordenar resultados.
radar.output = Variable en la que escribir la salida de una unidad.
unitradar.target = Filtro para detectar unidades.
unitradar.and = Filtros adicionales.
unitradar.order = Orden para ordenar. 0 para invertir.
unitradar.sort = Métrica a usar al ordenar resultados.
unitradar.output = Variable en la que escribir la salida de una unidad.
control.of = Bloque a controlar.
control.unit = Unidad/bloque al que apuntar.
control.shoot = Cuándo disparar.
unitlocate.enemy = Cuándo localizar construcciones enemigas.
unitlocate.found = Cuándo el objeto es encontrado.
unitlocate.building = Variable de salida para contrucciones localizadas.
unitlocate.outx = Coordenada X devuelta.
unitlocate.outy = Coordenada Y devuelta.
unitlocate.group = Grupo de bloque a buscar.
lenum.idle = No se mueve, pero seguirá construyendo/extrayendo minerales.\nEs el estado por defecto.
lenum.stop = Deja de moverse/extraer minerales/contruir.
lenum.move = Moverse a una posición exacta.
lenum.approach = Aproximarse a una posición con un radio.
lenum.pathfind = Establece una ruta hasta el punto de aterrizaje enemigo.
lenum.target = Dispara a una posición.
lenum.targetp = Dispara a un objetivo con predicción de velocidad.
lenum.itemdrop = Suelta un objeto.
lenum.itemtake = Recoge un objeto de una construcción.
lenum.paydrop = Suelta la carga actual.
lenum.paytake = Recoge bloques o unidades en la posición actual como carga a trasnportar.
lenum.flag = Etiqueta numérica de la unidad.
lenum.mine = Extrae minerales de una posición.
lenum.build = Construye una estructura.
lenum.getblock = Obtiene la construcción y su categoría en unas coordenadas específicas.\nLa unidad debe estar en el rango de su posición.\nLos bloques no-construcciones tendrán el tipo [accent]@solid[].
lenum.within = Comprueba si una unidad se encuentra cerca de una posición.
lenum.boost = Inicia/Detiene potenciación.

View File

@@ -807,6 +807,7 @@ bullet.reload = [stat]{0}[lightgray]x vitesse de tir
unit.blocks = blocs unit.blocks = blocs
unit.blockssquared = blocs² unit.blockssquared = blocs²
unit.powersecond = unités d'énergie/seconde unit.powersecond = unités d'énergie/seconde
unit.tilessecond = tuiles/seconde
unit.liquidsecond = unités de liquide/seconde unit.liquidsecond = unités de liquide/seconde
unit.itemssecond = objets/seconde unit.itemssecond = objets/seconde
unit.liquidunits = unités de liquide unit.liquidunits = unités de liquide
@@ -1601,6 +1602,8 @@ lst.sensor = Récupère des données depuis un bâtiment ou une unité.
lst.set = Définit une variable. lst.set = Définit une variable.
lst.operation = Effectue une opération sur 1 ou 2 variables. lst.operation = Effectue une opération sur 1 ou 2 variables.
lst.end = Saute au sommet de la série dinstructions. lst.end = Saute au sommet de la série dinstructions.
lst.wait = Attendre un certain nombre de secondes.
lst.lookup = Recherche d'un type d'objet/liquide/unité/bloc par ID.\nLe nombre total de chaque type peut être consulté avec:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
lst.jump = Saute conditionnellement vers une autre instruction. lst.jump = Saute conditionnellement vers une autre instruction.
lst.unitbind = Se lie à une unité du type donné et la stocke dans [accent]@unit[]. lst.unitbind = Se lie à une unité du type donné et la stocke dans [accent]@unit[].
lst.unitcontrol = Contrôle l'unité actuellement liée. lst.unitcontrol = Contrôle l'unité actuellement liée.

View File

@@ -1591,6 +1591,8 @@ lst.sensor = Mengambil data dari bangunan atau unit.
lst.set = Menentukan sebuah variabel. lst.set = Menentukan sebuah variabel.
lst.operation = Melakukan operasi pada 1-2 variabel. lst.operation = Melakukan operasi pada 1-2 variabel.
lst.end = Loncati ke awal dari tumpukan perintah. lst.end = Loncati ke awal dari tumpukan perintah.
lst.wait = Memberi jeda dalam detik yang ditentukan.
lst.lookup = Mencari tipe barang/cairan/unit/blok dengan ID.\nJumlah hitungan dari setiap tipe dapat dilihat dengan:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
lst.jump = Loncati secara bersyarat ke pernyataan berikutnya. lst.jump = Loncati secara bersyarat ke pernyataan berikutnya.
lst.unitbind = Menautkan ke unit jenis berikutnya, dan menyimpannya di [accent]@unit[]. lst.unitbind = Menautkan ke unit jenis berikutnya, dan menyimpannya di [accent]@unit[].
lst.unitcontrol = Mengendalikan unit yang saat ini dihubungkan. lst.unitcontrol = Mengendalikan unit yang saat ini dihubungkan.

View File

@@ -806,6 +806,7 @@ bullet.reload = [stat]{0}[lightgray]배 발사 속도
unit.blocks = 블록 unit.blocks = 블록
unit.blockssquared = 블록² unit.blockssquared = 블록²
unit.powersecond = 전력/초 unit.powersecond = 전력/초
unit.tilessecond = 타일/초
unit.liquidsecond = 액체/초 unit.liquidsecond = 액체/초
unit.itemssecond = 자원/초 unit.itemssecond = 자원/초
unit.liquidunits = 액체 unit.liquidunits = 액체

View File

@@ -806,6 +806,7 @@ bullet.reload = [stat]{0}[lightgray]x скорость стрельбы
unit.blocks = блоков unit.blocks = блоков
unit.blockssquared = блоков² unit.blockssquared = блоков²
unit.powersecond = единиц энергии/секунду unit.powersecond = единиц энергии/секунду
unit.tilessecond = плиток/секунду
unit.liquidsecond = жидкостных единиц/секунду unit.liquidsecond = жидкостных единиц/секунду
unit.itemssecond = предметов/секунду unit.itemssecond = предметов/секунду
unit.liquidunits = жидкостных единиц unit.liquidunits = жидкостных единиц
@@ -1570,7 +1571,7 @@ unit.mega.description = Автоматически ремонтирует пов
unit.quad.description = Сбрасывает большие бомбы на наземные цели, восстанавливая союзные постройки и повреждая врагов. Может переносить единицы среднего размера. unit.quad.description = Сбрасывает большие бомбы на наземные цели, восстанавливая союзные постройки и повреждая врагов. Может переносить единицы среднего размера.
unit.oct.description = Защищает союзников поблизости при помощи своего восстанавливающегося щита. Может переносить большинство наземных единиц. unit.oct.description = Защищает союзников поблизости при помощи своего восстанавливающегося щита. Может переносить большинство наземных единиц.
unit.risso.description = Стреляет залпами ракет и пуль по всем врагам поблизости. unit.risso.description = Стреляет залпами ракет и пуль по всем врагам поблизости.
unit.minke.description = Стреляет зажигательными снарядами и стандартными пулями по наземным целям. unit.minke.description = Стреляет артиллерийскими снарядами и стандартными пулями по наземным целям.
unit.bryde.description = Стреляет дальнобойными артиллерийскими снарядами и ракетами по врагам. unit.bryde.description = Стреляет дальнобойными артиллерийскими снарядами и ракетами по врагам.
unit.sei.description = Стреляет залпами ракет и бронебойных пуль по врагам. unit.sei.description = Стреляет залпами ракет и бронебойных пуль по врагам.
unit.omura.description = Стреляет дальнобойным пробивающим снарядом из рельсотрона по врагам. Производит единицы «Вспышка». unit.omura.description = Стреляет дальнобойным пробивающим снарядом из рельсотрона по врагам. Производит единицы «Вспышка».
@@ -1591,6 +1592,8 @@ lst.sensor = Получает данные из постройки или еди
lst.set = Устанавливает переменную. lst.set = Устанавливает переменную.
lst.operation = Совершает операцию над 1-2 переменными. lst.operation = Совершает операцию над 1-2 переменными.
lst.end = Переходит к началу стека операций. lst.end = Переходит к началу стека операций.
lst.wait = Ждёт определённое количество секунд.
lst.lookup = Находит тип предмета/жидкости/единицы/блока по ID.\nОбщее количество каждого типа может быть получено при помощи:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
lst.jump = Условно переходит к другой операции. lst.jump = Условно переходит к другой операции.
lst.unitbind = Привязывается к единице определённого типа и сохраняет её в [accent]@unit[]. lst.unitbind = Привязывается к единице определённого типа и сохраняет её в [accent]@unit[].
lst.unitcontrol = Управляет привязанной в данный момент единицей. lst.unitcontrol = Управляет привязанной в данный момент единицей.

View File

@@ -460,6 +460,7 @@ toolmode.drawteams = Takım Çiz
toolmode.drawteams.description = Bloklar yerine takımları çizer.. toolmode.drawteams.description = Bloklar yerine takımları çizer..
filters.empty = [lightgray]Hiç filtre yok! Aşağıdaki butonla bir adet ekleyin. filters.empty = [lightgray]Hiç filtre yok! Aşağıdaki butonla bir adet ekleyin.
filter.distort = Çarpıt filter.distort = Çarpıt
filter.noise = Gürültü filter.noise = Gürültü
filter.enemyspawn = Düşman Doğma Alanı Seçimi filter.enemyspawn = Düşman Doğma Alanı Seçimi
@@ -476,6 +477,7 @@ filter.clear = Temizle
filter.option.ignore = Yoksay filter.option.ignore = Yoksay
filter.scatter = Saç filter.scatter = Saç
filter.terrain = Arazi filter.terrain = Arazi
filter.option.scale = Ölçek filter.option.scale = Ölçek
filter.option.chance = Şans filter.option.chance = Şans
filter.option.mag = Genlik filter.option.mag = Genlik
@@ -490,6 +492,7 @@ filter.option.block = Blok
filter.option.floor = Zemin filter.option.floor = Zemin
filter.option.flooronto = Hedef Zemin filter.option.flooronto = Hedef Zemin
filter.option.target = Target filter.option.target = Target
filter.option.replacement = Değiştirme
filter.option.wall = Duvar filter.option.wall = Duvar
filter.option.ore = Maden filter.option.ore = Maden
filter.option.floor2 = İkincil Duvar filter.option.floor2 = İkincil Duvar
@@ -675,6 +678,7 @@ unit.nobuild = [scarlet]Birlik inşa edemiyor
lastaccessed = [lightgray]Son Erişme: {0} lastaccessed = [lightgray]Son Erişme: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <görüntülenecek haritayı yükle>
stat.description = Amaç stat.description = Amaç
stat.input = Giriş stat.input = Giriş
stat.output = Çıkış stat.output = Çıkış
@@ -991,6 +995,7 @@ rules.waves = Dalgalar
rules.attack = Saldırı Modu rules.attack = Saldırı Modu
rules.buildai = Yapay Zeka İnşası rules.buildai = Yapay Zeka İnşası
rules.corecapture = Yıkımca Çekirdeği Elegeçir rules.corecapture = Yıkımca Çekirdeği Elegeçir
rules.polygoncoreprotection = Çokgenli Çekirdek Koruması
rules.enemyCheat = Sonsuz AI (Kırmızı Takım) Kaynakları rules.enemyCheat = Sonsuz AI (Kırmızı Takım) Kaynakları
rules.blockhealthmultiplier = Blok Canı Çarpanı rules.blockhealthmultiplier = Blok Canı Çarpanı
rules.blockdamagemultiplier = Blok Hasarı Çarpanı rules.blockdamagemultiplier = Blok Hasarı Çarpanı
@@ -1161,7 +1166,8 @@ block.spore-cluster.name = Spor Kümesi
block.metal-floor.name = Metal Zemin 1 block.metal-floor.name = Metal Zemin 1
block.metal-floor-2.name = Metal Zemin 2 block.metal-floor-2.name = Metal Zemin 2
block.metal-floor-3.name = Metal Zemin 3 block.metal-floor-3.name = Metal Zemin 3
block.metal-floor-5.name = Metal Zemin 4 block.metal-floor-4.name = Metal Zemin 4
block.metal-floor-5.name = Metal Zemin 5
block.metal-floor-damaged.name = Hasarlı Metal Zemin block.metal-floor-damaged.name = Hasarlı Metal Zemin
block.dark-panel-1.name = Kara Panel 1 block.dark-panel-1.name = Kara Panel 1
block.dark-panel-2.name = Kara Panel 2 block.dark-panel-2.name = Kara Panel 2

View File

@@ -126,3 +126,4 @@ Skat
WilloIzCitron WilloIzCitron
SAMBUYYA SAMBUYYA
genNAowl genNAowl
TranquillyUnpleasant

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 KiB

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 447 KiB

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 KiB

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 316 KiB

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 229 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

View File

@@ -155,6 +155,7 @@ const BlockBuildBeginEvent = Packages.mindustry.game.EventType.BlockBuildBeginEv
const ResearchEvent = Packages.mindustry.game.EventType.ResearchEvent const ResearchEvent = Packages.mindustry.game.EventType.ResearchEvent
const UnlockEvent = Packages.mindustry.game.EventType.UnlockEvent const UnlockEvent = Packages.mindustry.game.EventType.UnlockEvent
const StateChangeEvent = Packages.mindustry.game.EventType.StateChangeEvent const StateChangeEvent = Packages.mindustry.game.EventType.StateChangeEvent
const CoreChangeEvent = Packages.mindustry.game.EventType.CoreChangeEvent
const TileChangeEvent = Packages.mindustry.game.EventType.TileChangeEvent const TileChangeEvent = Packages.mindustry.game.EventType.TileChangeEvent
const TilePreChangeEvent = Packages.mindustry.game.EventType.TilePreChangeEvent const TilePreChangeEvent = Packages.mindustry.game.EventType.TilePreChangeEvent
const GameOverEvent = Packages.mindustry.game.EventType.GameOverEvent const GameOverEvent = Packages.mindustry.game.EventType.GameOverEvent
@@ -166,6 +167,7 @@ const DepositEvent = Packages.mindustry.game.EventType.DepositEvent
const WithdrawEvent = Packages.mindustry.game.EventType.WithdrawEvent const WithdrawEvent = Packages.mindustry.game.EventType.WithdrawEvent
const SectorCaptureEvent = Packages.mindustry.game.EventType.SectorCaptureEvent const SectorCaptureEvent = Packages.mindustry.game.EventType.SectorCaptureEvent
const PlayerChatEvent = Packages.mindustry.game.EventType.PlayerChatEvent const PlayerChatEvent = Packages.mindustry.game.EventType.PlayerChatEvent
const MenuOptionChooseEvent = Packages.mindustry.game.EventType.MenuOptionChooseEvent
const ClientPreConnectEvent = Packages.mindustry.game.EventType.ClientPreConnectEvent const ClientPreConnectEvent = Packages.mindustry.game.EventType.ClientPreConnectEvent
const CommandIssueEvent = Packages.mindustry.game.EventType.CommandIssueEvent const CommandIssueEvent = Packages.mindustry.game.EventType.CommandIssueEvent
const SchematicCreateEvent = Packages.mindustry.game.EventType.SchematicCreateEvent const SchematicCreateEvent = Packages.mindustry.game.EventType.SchematicCreateEvent

View File

@@ -20,9 +20,9 @@ void main(){
vec4 color = texture2D(u_texture, c); vec4 color = texture2D(u_texture, c);
if(noise > 0.54 && noise < 0.68){ if(noise > 0.54 && noise < 0.68){
color.rgb *= 1.4; color.rgb *= vec3(1.4);
}else if(!(noise > 0.40 && noise < 0.54)){ }else if(!(noise > 0.40 && noise < 0.54)){
color.rgb *= 1.2; color.rgb *= vec3(1.2);
} }
gl_FragColor = color; gl_FragColor = color;

View File

@@ -1,12 +0,0 @@
#convert from stereo to mono
cd assets/sounds/
for i in *.ogg; do
echo $i
ffmpeg -i "$i" -ac 1 "OUT_$i"
done
find . -type f ! -name "OUT_*" -delete
for file in OUT_*; do mv "$file" "${file#OUT_}"; done;
cd ../../

View File

@@ -149,7 +149,16 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
} }
mods.eachClass(Mod::init); mods.eachClass(Mod::init);
finished = true; finished = true;
Events.fire(new ClientLoadEvent()); var event = new ClientLoadEvent();
//a temporary measure for compatibility with certain mods
Events.fireWrap(event.getClass(), event, listener -> {
try{
listener.get(event);
}catch(NoSuchFieldError | NoSuchMethodError | NoClassDefFoundError error){
Log.err(error);
}
});
clientLoaded = true; clientLoaded = true;
super.resize(graphics.getWidth(), graphics.getHeight()); super.resize(graphics.getWidth(), graphics.getHeight());
app.post(() -> app.post(() -> app.post(() -> app.post(() -> { app.post(() -> app.post(() -> app.post(() -> app.post(() -> {

View File

@@ -148,6 +148,8 @@ public class Vars implements Loadable{
public static int maxTextureSize = 2048; public static int maxTextureSize = 2048;
/** Whether to show the core landing animation. */ /** Whether to show the core landing animation. */
public static boolean showLandAnimation = true; public static boolean showLandAnimation = true;
/** Whether to check for memory use before taking screenshots. */
public static boolean checkScreenshotMemory = true;
/** Whether to prompt the user to confirm exiting. */ /** Whether to prompt the user to confirm exiting. */
public static boolean confirmExit = true; public static boolean confirmExit = true;
/** if true, UI is not drawn */ /** if true, UI is not drawn */

View File

@@ -285,7 +285,7 @@ public class BlockIndexer{
for(int i = 0; i < activeTeams.size; i++){ for(int i = 0; i < activeTeams.size; i++){
Team enemy = activeTeams.items[i]; Team enemy = activeTeams.items[i];
if(enemy == team || team == Team.derelict) continue; if(enemy == team || (team == Team.derelict && !state.rules.coreCapture)) continue;
Building entity = indexer.findTile(enemy, x, y, range, pred, true); Building entity = indexer.findTile(enemy, x, y, range, pred, true);
if(entity != null){ if(entity != null){
@@ -360,7 +360,7 @@ public class BlockIndexer{
private void process(Tile tile){ private void process(Tile tile){
var team = tile.team(); var team = tile.team();
//only process entity changes with centered tiles //only process entity changes with centered tiles
if(tile.isCenter() && team != Team.derelict){ if(tile.isCenter() && tile.build != null){
var data = team.data(); var data = team.data();
if(tile.block().flags.size() > 0 && tile.isCenter()){ if(tile.block().flags.size() > 0 && tile.isCenter()){
TileArray[] map = getFlagged(team); TileArray[] map = getFlagged(team);

View File

@@ -119,9 +119,11 @@ public class Pathfinder implements Runnable{
} }
} }
int tid = tile.getTeamID();
return PathTile.get( return PathTile.get(
tile.build == null || !solid || tile.block() instanceof CoreBlock ? 0 : Math.min((int)(tile.build.health / 40), 80), tile.build == null || !solid || tile.block() instanceof CoreBlock ? 0 : Math.min((int)(tile.build.health / 40), 80),
tile.getTeamID(), tid == 0 && tile.build != null && state.rules.coreCapture ? 255 : tid, //use teamid = 255 when core capture is enabled to mark out derelict structures
solid, solid,
tile.floor().isLiquid, tile.floor().isLiquid,
tile.staticDarkness() >= 2 || (tile.floor().solid && tile.block() == Blocks.air), tile.staticDarkness() >= 2 || (tile.floor().solid && tile.block() == Blocks.air),

View File

@@ -104,7 +104,7 @@ public class LogicAI extends AIController{
//look where moving if there's nothing to aim at //look where moving if there's nothing to aim at
if(!shoot){ if(!shoot){
unit.lookAt(unit.prefRotation()); unit.lookAt(unit.prefRotation());
}else if(unit.hasWeapons() && unit.mounts.length > 0){ //if there is, look at the object }else if(unit.hasWeapons() && unit.mounts.length > 0 && !unit.mounts[0].weapon.ignoreRotation){ //if there is, look at the object
unit.lookAt(unit.mounts[0].aimX, unit.mounts[0].aimY); unit.lookAt(unit.mounts[0].aimX, unit.mounts[0].aimY);
} }
} }

View File

@@ -24,6 +24,7 @@ public class PhysicsProcess implements AsyncProcess{
@Override @Override
public void begin(){ public void begin(){
if(physics == null) return; if(physics == null) return;
boolean local = !Vars.net.client();
//remove stale entities //remove stale entities
refs.removeAll(ref -> { refs.removeAll(ref -> {
@@ -60,8 +61,9 @@ public class PhysicsProcess implements AsyncProcess{
ref.body.layer = ref.body.layer =
entity.type.allowLegStep ? layerLegs : entity.type.allowLegStep ? layerLegs :
entity.isGrounded() ? layerGround : layerFlying; entity.isGrounded() ? layerGround : layerFlying;
ref.x = entity.x(); ref.x = entity.x;
ref.y = entity.y(); ref.y = entity.y;
ref.body.local = local || entity.isLocal();
} }
} }
@@ -156,6 +158,10 @@ public class PhysicsProcess implements AsyncProcess{
for(int i = 0; i < bodies.size; i++){ for(int i = 0; i < bodies.size; i++){
PhysicsBody body = bodies.items[i]; PhysicsBody body = bodies.items[i];
//for clients, the only body that collides is the local one; all other physics simulations are handled by the server.
if(!body.local) continue;
body.hitbox(rect); body.hitbox(rect);
seq.size = 0; seq.size = 0;
@@ -174,10 +180,14 @@ public class PhysicsProcess implements AsyncProcess{
float ms = body.mass + other.mass; float ms = body.mass + other.mass;
float m1 = other.mass / ms, m2 = body.mass / ms; float m1 = other.mass / ms, m2 = body.mass / ms;
//first body is always local due to guard check above
body.x += vec.x * m1 / scl; body.x += vec.x * m1 / scl;
body.y += vec.y * m1 / scl; body.y += vec.y * m1 / scl;
other.x -= vec.x * m2 / scl;
other.y -= vec.y * m2 / scl; if(other.local){
other.x -= vec.x * m2 / scl;
other.y -= vec.y * m2 / scl;
}
} }
} }
body.collided = true; body.collided = true;
@@ -187,7 +197,7 @@ public class PhysicsProcess implements AsyncProcess{
public static class PhysicsBody implements QuadTreeObject{ public static class PhysicsBody implements QuadTreeObject{
public float x, y, radius, mass; public float x, y, radius, mass;
public int layer = 0; public int layer = 0;
public boolean collided = false; public boolean collided = false, local = true;
@Override @Override
public void hitbox(Rect out){ public void hitbox(Rect out){

View File

@@ -51,7 +51,7 @@ public class Blocks implements ContentList{
melter, separator, disassembler, sporePress, pulverizer, incinerator, coalCentrifuge, melter, separator, disassembler, sporePress, pulverizer, incinerator, coalCentrifuge,
//sandbox //sandbox
powerSource, powerVoid, itemSource, itemVoid, liquidSource, liquidVoid, payloadVoid, payloadSource, illuminator, powerSource, powerVoid, itemSource, itemVoid, liquidSource, liquidVoid, payloadSource, payloadVoid, illuminator,
//defense //defense
copperWall, copperWallLarge, titaniumWall, titaniumWallLarge, plastaniumWall, plastaniumWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge, copperWall, copperWallLarge, titaniumWall, titaniumWallLarge, plastaniumWall, plastaniumWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge,
@@ -659,12 +659,12 @@ public class Blocks implements ContentList{
}}; }};
disassembler = new Separator("disassembler"){{ disassembler = new Separator("disassembler"){{
requirements(Category.crafting, with(Items.graphite, 140, Items.titanium, 100, Items.silicon, 150, Items.surgeAlloy, 70)); requirements(Category.crafting, with(Items.plastanium, 40, Items.titanium, 100, Items.silicon, 150, Items.thorium, 80));
results = with( results = with(
Items.sand, 4, Items.sand, 4,
Items.graphite, 2, Items.graphite, 2,
Items.titanium, 2, Items.titanium, 2,
Items.thorium, 1 Items.thorium, 2
); );
hasPower = true; hasPower = true;
craftTime = 15f; craftTime = 15f;
@@ -1589,13 +1589,13 @@ public class Blocks implements ContentList{
shots = 4; shots = 4;
burstSpacing = 5; burstSpacing = 5;
inaccuracy = 10f; inaccuracy = 10f;
range = 210f; range = 215f;
xRand = 6f; xRand = 6f;
size = 2; size = 2;
health = 300 * size * size; health = 300 * size * size;
shootSound = Sounds.missile; shootSound = Sounds.missile;
limitRange(2f); limitRange(5f);
}}; }};
salvo = new ItemTurret("salvo"){{ salvo = new ItemTurret("salvo"){{
@@ -1610,7 +1610,7 @@ public class Blocks implements ContentList{
size = 2; size = 2;
range = 190f; range = 190f;
reloadTime = 34f; reloadTime = 31f;
restitution = 0.03f; restitution = 0.03f;
ammoEjectBack = 3f; ammoEjectBack = 3f;
cooldown = 0.03f; cooldown = 0.03f;
@@ -1978,25 +1978,25 @@ public class Blocks implements ContentList{
}}; }};
repairPoint = new RepairPoint("repair-point"){{ repairPoint = new RepairPoint("repair-point"){{
requirements(Category.units, with(Items.lead, 20, Items.copper, 20, Items.silicon, 15)); requirements(Category.units, with(Items.lead, 30, Items.copper, 30, Items.silicon, 20));
repairSpeed = 0.5f; repairSpeed = 0.45f;
repairRadius = 65f; repairRadius = 60f;
beamWidth = 0.73f; beamWidth = 0.73f;
powerUse = 1f; powerUse = 1f;
pulseRadius = 5f; pulseRadius = 5f;
}}; }};
repairTurret = new RepairPoint("repair-turret"){{ repairTurret = new RepairPoint("repair-turret"){{
requirements(Category.units, with(Items.silicon, 70, Items.thorium, 60, Items.plastanium, 60)); requirements(Category.units, with(Items.silicon, 90, Items.thorium, 80, Items.plastanium, 60));
size = 2; size = 2;
length = 6f; length = 6f;
repairSpeed = 4f; repairSpeed = 3f;
repairRadius = 140f; repairRadius = 145f;
powerUse = 5f; powerUse = 5f;
beamWidth = 1.1f; beamWidth = 1.1f;
pulseRadius = 6.1f; pulseRadius = 6.1f;
coolantUse = 0.15f; coolantUse = 0.16f;
coolantMultiplier = 1.7f; coolantMultiplier = 1.6f;
acceptCoolant = true; acceptCoolant = true;
}}; }};
@@ -2068,12 +2068,12 @@ public class Blocks implements ContentList{
alwaysUnlocked = true; alwaysUnlocked = true;
}}; }};
payloadVoid = new PayloadVoid("payload-void"){{ payloadSource = new PayloadSource("payload-source"){{
requirements(Category.units, BuildVisibility.sandboxOnly, with()); requirements(Category.units, BuildVisibility.sandboxOnly, with());
size = 5; size = 5;
}}; }};
payloadSource = new PayloadSource("payload-source"){{ payloadVoid = new PayloadVoid("payload-void"){{
requirements(Category.units, BuildVisibility.sandboxOnly, with()); requirements(Category.units, BuildVisibility.sandboxOnly, with());
size = 5; size = 5;
}}; }};

View File

@@ -257,7 +257,6 @@ public class Bullets implements ContentList{
width = 8f; width = 8f;
height = 8f; height = 8f;
shrinkY = 0f; shrinkY = 0f;
drag = -0.01f;
splashDamageRadius = 30f; splashDamageRadius = 30f;
splashDamage = 30f * 1.5f; splashDamage = 30f * 1.5f;
ammoMultiplier = 5f; ammoMultiplier = 5f;
@@ -274,7 +273,6 @@ public class Bullets implements ContentList{
width = 7f; width = 7f;
height = 8f; height = 8f;
shrinkY = 0f; shrinkY = 0f;
drag = -0.01f;
homingPower = 0.08f; homingPower = 0.08f;
splashDamageRadius = 20f; splashDamageRadius = 20f;
splashDamage = 20f * 1.5f; splashDamage = 20f * 1.5f;
@@ -288,7 +286,6 @@ public class Bullets implements ContentList{
width = 8f; width = 8f;
height = 8f; height = 8f;
shrinkY = 0f; shrinkY = 0f;
drag = -0.01f;
splashDamageRadius = 25f; splashDamageRadius = 25f;
splashDamage = 25f * 1.4f; splashDamage = 25f * 1.4f;
hitEffect = Fx.blastExplosion; hitEffect = Fx.blastExplosion;

View File

@@ -854,7 +854,7 @@ public class Fx{
fireRemove = new Effect(70f, e -> { fireRemove = new Effect(70f, e -> {
if(Fire.regions[0] == null) return; if(Fire.regions[0] == null) return;
alpha(e.fout()); alpha(e.fout());
rect(Fire.regions[((int)(e.rotation + e.fin() * Fire.frames)) % Fire.frames], e.x, e.y); rect(Fire.regions[((int)(e.rotation + e.fin() * Fire.frames)) % Fire.frames], e.x + Mathf.randomSeedRange((int)e.y, 2), e.y + Mathf.randomSeedRange((int)e.x, 2));
Drawf.light(e.x, e.y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * e.fout()); Drawf.light(e.x, e.y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * e.fout());
}), }),

View File

@@ -87,7 +87,7 @@ public class UnitTypes implements ContentList{
mace = new UnitType("mace"){{ mace = new UnitType("mace"){{
speed = 0.45f; speed = 0.45f;
hitSize = 10f; hitSize = 10f;
health = 530; health = 540;
armor = 4f; armor = 4f;
immunities.add(StatusEffects.burning); immunities.add(StatusEffects.burning);
@@ -96,7 +96,7 @@ public class UnitTypes implements ContentList{
top = false; top = false;
shootSound = Sounds.flame; shootSound = Sounds.flame;
shootY = 2f; shootY = 2f;
reload = 12f; reload = 11f;
recoil = 1f; recoil = 1f;
ejectEffect = Fx.none; ejectEffect = Fx.none;
bullet = new BulletType(4.1f, 32f){{ bullet = new BulletType(4.1f, 32f){{
@@ -120,7 +120,7 @@ public class UnitTypes implements ContentList{
hitSize = 13f; hitSize = 13f;
rotateSpeed = 3f; rotateSpeed = 3f;
targetAir = false; targetAir = false;
health = 820; health = 900;
armor = 9f; armor = 9f;
mechFrontSway = 0.55f; mechFrontSway = 0.55f;
@@ -133,15 +133,15 @@ public class UnitTypes implements ContentList{
shake = 2f; shake = 2f;
ejectEffect = Fx.casing2; ejectEffect = Fx.casing2;
shootSound = Sounds.artillery; shootSound = Sounds.artillery;
bullet = new ArtilleryBulletType(2f, 8, "shell"){{ bullet = new ArtilleryBulletType(2f, 20, "shell"){{
hitEffect = Fx.blastExplosion; hitEffect = Fx.blastExplosion;
knockback = 0.8f; knockback = 0.8f;
lifetime = 120f; lifetime = 120f;
width = height = 14f; width = height = 14f;
collides = true; collides = true;
collidesTiles = true; collidesTiles = true;
splashDamageRadius = 30f; splashDamageRadius = 35f;
splashDamage = 60f; splashDamage = 80f;
backColor = Pal.bulletYellowBack; backColor = Pal.bulletYellowBack;
frontColor = Pal.bulletYellow; frontColor = Pal.bulletYellow;
}}; }};
@@ -572,7 +572,7 @@ public class UnitTypes implements ContentList{
speed = 1f; speed = 1f;
splashDamageRadius = 60f; splashDamageRadius = 60f;
instantDisappear = true; instantDisappear = true;
splashDamage = 88f; splashDamage = 90f;
killShooter = true; killShooter = true;
hittable = false; hittable = false;
collidesAir = true; collidesAir = true;
@@ -581,7 +581,7 @@ public class UnitTypes implements ContentList{
}}; }};
atrax = new UnitType("atrax"){{ atrax = new UnitType("atrax"){{
speed = 0.5f; speed = 0.54f;
drag = 0.4f; drag = 0.4f;
hitSize = 13f; hitSize = 13f;
rotateSpeed = 3f; rotateSpeed = 3f;
@@ -621,7 +621,7 @@ public class UnitTypes implements ContentList{
}}; }};
spiroct = new UnitType("spiroct"){{ spiroct = new UnitType("spiroct"){{
speed = 0.45f; speed = 0.48f;
drag = 0.4f; drag = 0.4f;
hitSize = 15f; hitSize = 15f;
rotateSpeed = 3f; rotateSpeed = 3f;
@@ -1125,10 +1125,10 @@ public class UnitTypes implements ContentList{
BulletType fragBullet = new FlakBulletType(4f, 5){{ BulletType fragBullet = new FlakBulletType(4f, 5){{
shootEffect = Fx.shootBig; shootEffect = Fx.shootBig;
ammoMultiplier = 4f; ammoMultiplier = 4f;
splashDamage = 50f; splashDamage = 60f;
splashDamageRadius = 25f; splashDamageRadius = 25f;
collidesGround = true; collidesGround = true;
lifetime = 38f; lifetime = 47f;
status = StatusEffects.blasted; status = StatusEffects.blasted;
statusDuration = 60f; statusDuration = 60f;
@@ -1148,12 +1148,12 @@ public class UnitTypes implements ContentList{
rotate = true; rotate = true;
bullet = new LaserBulletType(){{ bullet = new LaserBulletType(){{
damage = 100f; damage = 110f;
sideAngle = 20f; sideAngle = 20f;
sideWidth = 1.5f; sideWidth = 1.5f;
sideLength = 80f; sideLength = 80f;
width = 25f; width = 25f;
length = 200f; length = 230f;
shootEffect = Fx.shockwave; shootEffect = Fx.shockwave;
colors = new Color[]{Color.valueOf("ec7458aa"), Color.valueOf("ff9c5a"), Color.white}; colors = new Color[]{Color.valueOf("ec7458aa"), Color.valueOf("ff9c5a"), Color.white};
}}; }};
@@ -2047,7 +2047,6 @@ public class UnitTypes implements ContentList{
buildSpeed = 3f; buildSpeed = 3f;
abilities.add(new EnergyFieldAbility(35f, 65f, 180f){{ abilities.add(new EnergyFieldAbility(35f, 65f, 180f){{
repair = 35f;
statusDuration = 60f * 6f; statusDuration = 60f * 6f;
maxTargets = 25; maxTargets = 25;
}}); }});
@@ -2113,7 +2112,7 @@ public class UnitTypes implements ContentList{
bullet = new ContinuousLaserBulletType(){{ bullet = new ContinuousLaserBulletType(){{
maxRange = 90f; maxRange = 90f;
damage = 26f; damage = 27f;
length = 95f; length = 95f;
hitEffect = Fx.hitMeltHeal; hitEffect = Fx.hitMeltHeal;
drawSize = 200f; drawSize = 200f;
@@ -2144,7 +2143,7 @@ public class UnitTypes implements ContentList{
x = 70f/4f; x = 70f/4f;
y = -26f/4f; y = -26f/4f;
reload = 70f; reload = 65f;
shake = 3f; shake = 3f;
rotateSpeed = 2f; rotateSpeed = 2f;
shadow = 30f; shadow = 30f;
@@ -2155,13 +2154,14 @@ public class UnitTypes implements ContentList{
bullet = new EmpBulletType(){{ bullet = new EmpBulletType(){{
float rad = 100f; float rad = 100f;
scaleVelocity = true;
lightOpacity = 0.7f; lightOpacity = 0.7f;
unitDamageScl = 0.8f; unitDamageScl = 0.8f;
healPercent = 20f; healPercent = 20f;
timeIncrease = 3f; timeIncrease = 3f;
timeDuration = 60f * 20f; timeDuration = 60f * 20f;
powerDamageScl = 3f; powerDamageScl = 3f;
damage = 50; damage = 60;
hitColor = lightColor = Pal.heal; hitColor = lightColor = Pal.heal;
lightRadius = 70f; lightRadius = 70f;
clipSize = 250f; clipSize = 250f;
@@ -2177,7 +2177,7 @@ public class UnitTypes implements ContentList{
trailWidth = 6f; trailWidth = 6f;
trailColor = Pal.heal; trailColor = Pal.heal;
trailInterval = 3f; trailInterval = 3f;
splashDamage = 60f; splashDamage = 70f;
splashDamageRadius = rad; splashDamageRadius = rad;
hitShake = 4f; hitShake = 4f;
trailRotation = true; trailRotation = true;

View File

@@ -247,11 +247,11 @@ public class Logic implements ApplicationListener{
Events.fire(new GameOverEvent(state.rules.waveTeam)); Events.fire(new GameOverEvent(state.rules.waveTeam));
}else if(state.rules.attackMode){ }else if(state.rules.attackMode){
//count # of teams alive //count # of teams alive
int countAlive = state.teams.getActive().count(TeamData::hasCore); int countAlive = state.teams.getActive().count(t -> t.hasCore() && t.team != Team.derelict);
if((countAlive <= 1 || (!state.rules.pvp && state.rules.defaultTeam.core() == null)) && !state.gameOver){ if((countAlive <= 1 || (!state.rules.pvp && state.rules.defaultTeam.core() == null)) && !state.gameOver){
//find team that won //find team that won
TeamData left = state.teams.getActive().find(TeamData::hasCore); TeamData left = state.teams.getActive().find(t -> t.hasCore() && t.team != Team.derelict);
Events.fire(new GameOverEvent(left == null ? Team.derelict : left.team)); Events.fire(new GameOverEvent(left == null ? Team.derelict : left.team));
state.gameOver = true; state.gameOver = true;
} }

View File

@@ -48,7 +48,7 @@ public class NetServer implements ApplicationListener{
if(state.rules.pvp){ if(state.rules.pvp){
//find team with minimum amount of players and auto-assign player to that. //find team with minimum amount of players and auto-assign player to that.
TeamData re = state.teams.getActive().min(data -> { TeamData re = state.teams.getActive().min(data -> {
if((state.rules.waveTeam == data.team && state.rules.waves) || !data.team.active()) return Integer.MAX_VALUE; if((state.rules.waveTeam == data.team && state.rules.waves) || !data.team.active() || data.team == Team.derelict) return Integer.MAX_VALUE;
int count = 0; int count = 0;
for(Player other : players){ for(Player other : players){
@@ -344,8 +344,7 @@ public class NetServer implements ApplicationListener{
boolean checkPass(){ boolean checkPass(){
if(votes >= votesRequired()){ if(votes >= votesRequired()){
Call.sendMessage(Strings.format("[orange]Vote passed.[scarlet] @[orange] will be banned from the server for @ minutes.", target.name, (kickDuration / 60))); Call.sendMessage(Strings.format("[orange]Vote passed.[scarlet] @[orange] will be banned from the server for @ minutes.", target.name, (kickDuration / 60)));
target.getInfo().lastKicked = Time.millis() + kickDuration * 1000; Groups.player.each(p -> p.uuid().equals(target.uuid()), p -> p.kick(KickReason.vote, kickDuration * 1000));
Groups.player.each(p -> p.uuid().equals(target.uuid()), p -> p.kick(KickReason.vote));
map[0] = null; map[0] = null;
task.cancel(); task.cancel();
return true; return true;
@@ -472,6 +471,10 @@ public class NetServer implements ApplicationListener{
return; return;
} }
if(!player.dead() && player.unit().isCommanding()){
player.unit().clearCommand();
}
player.getInfo().lastSyncTime = Time.millis(); player.getInfo().lastSyncTime = Time.millis();
Call.worldDataBegin(player.con); Call.worldDataBegin(player.con);
netServer.sendWorldData(player); netServer.sendWorldData(player);

View File

@@ -11,6 +11,7 @@ import arc.scene.ui.layout.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import arc.util.async.*; import arc.util.async.*;
import mindustry.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.game.EventType.*; import mindustry.game.EventType.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -355,7 +356,7 @@ public class Renderer implements ApplicationListener{
int w = world.width() * tilesize, h = world.height() * tilesize; int w = world.width() * tilesize, h = world.height() * tilesize;
int memory = w * h * 4 / 1024 / 1024; int memory = w * h * 4 / 1024 / 1024;
if(memory >= (mobile ? 65 : 120)){ if(Vars.checkScreenshotMemory && memory >= (mobile ? 65 : 120)){
ui.showInfo("@screenshot.invalid"); ui.showInfo("@screenshot.invalid");
return; return;
} }

View File

@@ -53,7 +53,7 @@ public class WaveGraph extends Table{
for(int i = 0; i < values.length; i++){ for(int i = 0; i < values.length; i++){
int val = values[i][type.id]; int val = values[i][type.id];
float cx = graphX + i*spacing, cy = 2f + graphY + val * (graphH - 4f) / max; float cx = graphX + i*spacing, cy = graphY + val * graphH / max;
Lines.linePoint(cx, cy); Lines.linePoint(cx, cy);
} }
@@ -69,7 +69,7 @@ public class WaveGraph extends Table{
sum += values[i][type.id]; sum += values[i][type.id];
} }
float cx = graphX + i*spacing, cy = 2f + graphY + sum * (graphH - 4f) / maxTotal; float cx = graphX + i*spacing, cy = graphY + sum * graphH / maxTotal;
Lines.linePoint(cx, cy); Lines.linePoint(cx, cy);
} }
@@ -84,7 +84,7 @@ public class WaveGraph extends Table{
sum += (type.health) * values[i][type.id]; sum += (type.health) * values[i][type.id];
} }
float cx = graphX + i*spacing, cy = 2f + graphY + sum * (graphH - 4f) / maxHealth; float cx = graphX + i*spacing, cy = graphY + sum * graphH / maxHealth;
Lines.linePoint(cx, cy); Lines.linePoint(cx, cy);
} }
@@ -92,29 +92,29 @@ public class WaveGraph extends Table{
} }
//how many numbers can fit here //how many numbers can fit here
float totalMarks = (height - offsetY - getMarginBottom() *2f - 1f) / (lay.height * 2); float totalMarks = (graphH - getMarginBottom() *2f) / (lay.height * 2);
int markSpace = Math.max(1, Mathf.ceil(max / totalMarks)); int markSpace = Math.max(1, Mathf.ceil(max / totalMarks));
Draw.color(Color.lightGray); Draw.color(Color.lightGray);
for(int i = 0; i < max; i += markSpace){ for(int i = 0; i < max; i += markSpace){
float cy = 2f + y + i * (height - 4f) / max + offsetY, cx = x + offsetX; float cy = graphY + i * graphH / max, cx = graphX;
//Lines.line(cx, cy, cx + len, cy); //Lines.line(cx, cy, cx + len, cy);
lay.setText(font, "" + i); lay.setText(font, "" + i);
font.draw("" + i, cx, cy + lay.height/2f - Scl.scl(3f), Align.right); font.draw("" + i, cx, cy + lay.height/2f, Align.right);
} }
float len = Scl.scl(4f); float len = Scl.scl(4f);
font.setColor(Color.lightGray); font.setColor(Color.lightGray);
for(int i = 0; i < values.length; i++){ for(int i = 0; i < values.length; i++){
float cy = y + fh, cx = x + graphW / (values.length - 1) * i + offsetX; float cy = y + fh, cx = graphX + graphW / (values.length - 1) * i;
Lines.line(cx, cy, cx, cy + len); Lines.line(cx, cy, cx, cy + len);
if(i == values.length/2){ if(i == values.length/2){
font.draw("" + (i + from + 1), cx, cy - 2f, Align.center); font.draw("" + (i + from + 1), cx, cy - Scl.scl(2f), Align.center);
} }
} }
font.setColor(Color.white); font.setColor(Color.white);

View File

@@ -52,22 +52,22 @@ public class Puddles{
Puddle p = map.get(tile.pos()); Puddle p = map.get(tile.pos());
if(p == null){ if(p == null){
Puddle puddle = Puddle.create(); Puddle puddle = Puddle.create();
puddle.tile(tile); puddle.tile = tile;
puddle.liquid(liquid); puddle.liquid = liquid;
puddle.amount(amount); puddle.amount = amount;
puddle.generation(generation); puddle.generation = generation;
puddle.set((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f); puddle.set((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f);
puddle.add(); puddle.add();
map.put(tile.pos(), puddle); map.put(tile.pos(), puddle);
}else if(p.liquid() == liquid){ }else if(p.liquid == liquid){
p.accepting(Math.max(amount, p.accepting())); p.accepting = Math.max(amount, p.accepting);
if(generation == 0 && p.lastRipple <= Time.time - 40f && p.amount() >= maxLiquid / 2f){ if(generation == 0 && p.lastRipple <= Time.time - 40f && p.amount >= maxLiquid / 2f){
Fx.ripple.at((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f, 1f, p.liquid().color); Fx.ripple.at((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f, 1f, p.liquid.color);
p.lastRipple = Time.time; p.lastRipple = Time.time;
} }
}else{ }else{
p.amount(p.amount() + reactPuddle(p.liquid(), liquid, amount, p.tile(), (p.x() + source.worldx())/2f, (p.y() + source.worldy())/2f)); p.amount += reactPuddle(p.liquid, liquid, amount, p.tile, (p.x + source.worldx())/2f, (p.y + source.worldy())/2f);
} }
} }

View File

@@ -16,14 +16,14 @@ import mindustry.type.*;
public class EnergyFieldAbility extends Ability{ public class EnergyFieldAbility extends Ability{
private static final Seq<Healthc> all = new Seq<>(); private static final Seq<Healthc> all = new Seq<>();
public float damage = 1, repair = 20f, reload = 100, range = 60; public float damage = 1, reload = 100, range = 60;
public Effect healEffect = Fx.heal, hitEffect = Fx.hitLaserBlast, damageEffect = Fx.chainLightning; public Effect healEffect = Fx.heal, hitEffect = Fx.hitLaserBlast, damageEffect = Fx.chainLightning;
public StatusEffect status = StatusEffects.electrified; public StatusEffect status = StatusEffects.electrified;
public float statusDuration = 60f * 6f; public float statusDuration = 60f * 6f;
public float x, y; public float x, y;
public boolean hitBuildings = true; public boolean hitBuildings = true;
public int maxTargets = 25; public int maxTargets = 25;
public float healPercent = 3f; public float healPercent = 2.5f;
public float layer = Layer.bullet - 0.001f, blinkScl = 20f; public float layer = Layer.bullet - 0.001f, blinkScl = 20f;
public float effectRadius = 5f, sectorRad = 0.14f, rotateSpeed = 0.5f; public float effectRadius = 5f, sectorRad = 0.14f, rotateSpeed = 0.5f;

View File

@@ -93,7 +93,7 @@ public class BulletType extends Content implements Cloneable{
public boolean collides = true; public boolean collides = true;
/** Whether velocity is inherited from the shooter. */ /** Whether velocity is inherited from the shooter. */
public boolean keepVelocity = true; public boolean keepVelocity = true;
/** Whether to scale velocity to disappear at the target position. Used for artillery. */ /** Whether to scale lifetime (not actually velocity!) to disappear at the target position. Used for artillery. */
public boolean scaleVelocity; public boolean scaleVelocity;
/** Whether this bullet can be hit by point defense. */ /** Whether this bullet can be hit by point defense. */
public boolean hittable = true; public boolean hittable = true;

View File

@@ -1,6 +1,7 @@
package mindustry.entities.comp; package mindustry.entities.comp;
import arc.math.*; import arc.math.*;
import arc.util.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -24,7 +25,7 @@ abstract class BoundedComp implements Velc, Posc, Healthc, Flyingc{
if(x > world.unitWidth()) dx -= (x - world.unitWidth())/warpDst; if(x > world.unitWidth()) dx -= (x - world.unitWidth())/warpDst;
if(y > world.unitHeight()) dy -= (y - world.unitHeight())/warpDst; if(y > world.unitHeight()) dy -= (y - world.unitHeight())/warpDst;
velAddNet(dx, dy); velAddNet(dx * Time.delta, dy * Time.delta);
} }
//clamp position if not flying //clamp position if not flying

View File

@@ -44,6 +44,13 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
} }
} }
//bullets always considered local
@Override
@Replace
public boolean isLocal(){
return true;
}
@Override @Override
public void add(){ public void add(){
type.init(self()); type.init(self());

View File

@@ -28,6 +28,7 @@ abstract class FireComp implements Timedc, Posc, Syncc, Drawc{
public static final TextureRegion[] regions = new TextureRegion[frames]; public static final TextureRegion[] regions = new TextureRegion[frames];
@Import float time, lifetime, x, y; @Import float time, lifetime, x, y;
@Import int id;
Tile tile; Tile tile;
private transient Block block; private transient Block block;
@@ -116,7 +117,7 @@ abstract class FireComp implements Timedc, Posc, Syncc, Drawc{
Draw.alpha(Mathf.clamp(warmup / warmupDuration)); Draw.alpha(Mathf.clamp(warmup / warmupDuration));
Draw.z(Layer.effect); Draw.z(Layer.effect);
Draw.rect(regions[Math.min((int)animation, regions.length - 1)], x, y); Draw.rect(regions[Math.min((int)animation, regions.length - 1)], x + Mathf.randomSeedRange((int)y, 2), y + Mathf.randomSeedRange((int)x, 2));
Draw.reset(); Draw.reset();
Drawf.light(x, y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * Mathf.clamp(warmup / warmupDuration)); Drawf.light(x, y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * Mathf.clamp(warmup / warmupDuration));

View File

@@ -1,6 +1,5 @@
package mindustry.entities.comp; package mindustry.entities.comp;
import arc.math.*;
import arc.util.*; import arc.util.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -34,7 +33,7 @@ abstract class HealthComp implements Entityc, Posc{
void kill(){ void kill(){
if(dead) return; if(dead) return;
health = 0; health = Math.min(health, 0);
dead = true; dead = true;
killed(); killed();
remove(); remove();
@@ -86,7 +85,7 @@ abstract class HealthComp implements Entityc, Posc{
} }
void clampHealth(){ void clampHealth(){
health = Mathf.clamp(health, 0, maxHealth); health = Math.min(health, maxHealth);
} }
/** Heals by a flat amount. */ /** Heals by a flat amount. */

View File

@@ -51,13 +51,11 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
return unit.canBuild(); return unit.canBuild();
} }
public @Nullable public @Nullable CoreBuild closestCore(){
CoreBuild closestCore(){
return state.teams.closestCore(x, y, team); return state.teams.closestCore(x, y, team);
} }
public @Nullable public @Nullable CoreBuild core(){
CoreBuild core(){
return team.core(); return team.core();
} }
@@ -240,6 +238,10 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
con.kick(reason); con.kick(reason);
} }
void kick(KickReason reason, long duration){
con.kick(reason, duration);
}
void kick(String reason){ void kick(String reason){
con.kick(reason); con.kick(reason);
} }

View File

@@ -16,8 +16,8 @@ abstract class ShieldComp implements Healthc, Posc{
/** Absorbs health damage. */ /** Absorbs health damage. */
float shield; float shield;
/** Subtracts an amount from damage. */ /** Subtracts an amount from damage. No need to save. */
float armor; transient float armor;
/** Shield opacity. */ /** Shield opacity. */
transient float shieldAlpha = 0f; transient float shieldAlpha = 0f;

View File

@@ -397,7 +397,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
//move down //move down
elevation -= type.fallSpeed * Time.delta; elevation -= type.fallSpeed * Time.delta;
if(isGrounded()){ if(isGrounded() || health <= -maxHealth){
Call.unitDestroy(id); Call.unitDestroy(id);
} }
} }
@@ -528,7 +528,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
@Override @Override
public void killed(){ public void killed(){
wasPlayer = isLocal(); wasPlayer = isLocal();
health = 0; health = Math.min(health, 0);
dead = true; dead = true;
//don't waste time when the unit is already on the ground, just destroy it //don't waste time when the unit is already on the ground, just destroy it

View File

@@ -13,20 +13,24 @@ import static mindustry.Vars.*;
abstract class VelComp implements Posc{ abstract class VelComp implements Posc{
@Import float x, y; @Import float x, y;
//TODO @SyncLocal this? does it even need to be sent? @SyncLocal Vec2 vel = new Vec2();
transient final Vec2 vel = new Vec2();
transient float drag = 0f; transient float drag = 0f;
//velocity needs to be called first, as it affects delta and lastPosition //velocity needs to be called first, as it affects delta and lastPosition
@MethodPriority(-1) @MethodPriority(-1)
@Override @Override
public void update(){ public void update(){
float px = x, py = y; //do not update velocity on the client at all, unless it's non-interpolated
move(vel.x * Time.delta, vel.y * Time.delta); //velocity conflicts with interpolation.
if(Mathf.equal(px, x)) vel.x = 0; if(!net.client() || isLocal()){
if(Mathf.equal(py, y)) vel.y = 0; float px = x, py = y;
move(vel.x * Time.delta, vel.y * Time.delta);
if(Mathf.equal(px, x)) vel.x = 0;
if(Mathf.equal(py, y)) vel.y = 0;
vel.scl(Math.max(1f - drag * Time.delta, 0)); vel.scl(Math.max(1f - drag * Time.delta, 0));
}
} }
/** @return function to use for check solid state. if null, no checking is done. */ /** @return function to use for check solid state. if null, no checking is done. */

View File

@@ -19,7 +19,7 @@ import static mindustry.Vars.*;
@Component @Component
abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{
@Import float x, y, rotation; @Import float x, y, rotation, speedMultiplier;
@Import UnitType type; @Import UnitType type;
private transient Trail tleft = new Trail(1), tright = new Trail(1); private transient Trail tleft = new Trail(1), tright = new Trail(1);
@@ -74,7 +74,7 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{
@Replace @Replace
public float floorSpeedMultiplier(){ public float floorSpeedMultiplier(){
Floor on = isFlying() ? Blocks.air.asFloor() : floorOn(); Floor on = isFlying() ? Blocks.air.asFloor() : floorOn();
return on.isDeep() ? 1.3f : 1f; return (on.isDeep() ? 1.3f : 1f) * speedMultiplier;
} }
public boolean onLiquid(){ public boolean onLiquid(){

View File

@@ -114,22 +114,6 @@ public class Rules{
/** special tags for additional info. */ /** special tags for additional info. */
public StringMap tags = new StringMap(); public StringMap tags = new StringMap();
/** A team-specific ruleset. */
public static class TeamRule{
/** Whether to use building AI. */
public boolean ai;
/** TODO Tier of blocks/designs that the AI uses for building. [0, 1] */
public float aiTier = 1f;
/** Whether, when AI is enabled, ships should be spawned from the core. */
public boolean aiCoreSpawn = true;
/** If true, blocks don't require power or resources. */
public boolean cheat;
/** If true, resources are not consumed when building. */
public boolean infiniteResources;
/** If true, this team has infinite unit ammo. */
public boolean infiniteAmmo;
}
/** Copies this ruleset exactly. Not efficient at all, do not use often. */ /** Copies this ruleset exactly. Not efficient at all, do not use often. */
public Rules copy(){ public Rules copy(){
return JsonIO.copy(this); return JsonIO.copy(this);
@@ -150,6 +134,22 @@ public class Rules{
} }
} }
/** A team-specific ruleset. */
public static class TeamRule{
/** Whether to use building AI. */
public boolean ai;
/** TODO Tier of blocks/designs that the AI uses for building. [0, 1] */
public float aiTier = 1f;
/** Whether, when AI is enabled, ships should be spawned from the core. */
public boolean aiCoreSpawn = true;
/** If true, blocks don't require power or resources. */
public boolean cheat;
/** If true, resources are not consumed when building. */
public boolean infiniteResources;
/** If true, this team has infinite unit ammo. */
public boolean infiniteAmmo;
}
/** A simple map for storing TeamRules in an efficient way without hashing. */ /** A simple map for storing TeamRules in an efficient way without hashing. */
public static class TeamRules implements JsonSerializable{ public static class TeamRules implements JsonSerializable{
final TeamRule[] values = new TeamRule[Team.all.length]; final TeamRule[] values = new TeamRule[Team.all.length];

View File

@@ -97,7 +97,7 @@ public class Team implements Comparable<Team>{
} }
public boolean isEnemy(Team other){ public boolean isEnemy(Team other){
return state.teams.areEnemies(this, other); return this != other;
} }
public Seq<CoreBuild> cores(){ public Seq<CoreBuild> cores(){

View File

@@ -49,7 +49,7 @@ public class Teams{
public boolean eachEnemyCore(Team team, Boolf<CoreBuild> ret){ public boolean eachEnemyCore(Team team, Boolf<CoreBuild> ret){
for(TeamData data : active){ for(TeamData data : active){
if(areEnemies(team, data.team)){ if(team != data.team){
for(CoreBuild tile : data.cores){ for(CoreBuild tile : data.cores){
if(ret.get(tile)){ if(ret.get(tile)){
return true; return true;
@@ -62,7 +62,7 @@ public class Teams{
public void eachEnemyCore(Team team, Cons<Building> ret){ public void eachEnemyCore(Team team, Cons<Building> ret){
for(TeamData data : active){ for(TeamData data : active){
if(areEnemies(team, data.team)){ if(team != data.team){
for(Building tile : data.cores){ for(Building tile : data.cores){
ret.get(tile); ret.get(tile);
} }
@@ -91,11 +91,6 @@ public class Teams{
return get(team).active(); return get(team).active();
} }
/** Returns whether {@param other} is an enemy of {@param #team}. */
public boolean areEnemies(Team team, Team other){
return team != other;
}
public boolean canInteract(Team team, Team other){ public boolean canInteract(Team team, Team other){
return team == other || other == Team.derelict; return team == other || other == Team.derelict;
} }
@@ -216,7 +211,7 @@ public class Teams{
Seq<Team> enemies = new Seq<>(); Seq<Team> enemies = new Seq<>();
for(TeamData other : active){ for(TeamData other : active){
if(areEnemies(data.team, other.team)){ if(data.team != other.team){
enemies.add(other.team); enemies.add(other.team);
} }
} }

View File

@@ -165,6 +165,7 @@ public class BlockRenderer{
darkEvents.each(pos -> { darkEvents.each(pos -> {
var tile = world.tile(pos); var tile = world.tile(pos);
if(tile == null) return;
float darkness = world.getDarkness(tile.x, tile.y); float darkness = world.getDarkness(tile.x, tile.y);
//then draw the shadow //then draw the shadow
Draw.colorl(darkness <= 0f ? 1f : 1f - Math.min((darkness + 0.5f) / 4f, 1f)); Draw.colorl(darkness <= 0f ? 1f : 1f - Math.min((darkness + 0.5f) / 4f, 1f));
@@ -338,7 +339,7 @@ public class BlockRenderer{
Draw.z(Layer.block); Draw.z(Layer.block);
} }
if(renderer.drawStatus && block.consumes.any()){ if(entity.team == player.team() && renderer.drawStatus && block.consumes.any()){
entity.drawStatus(); entity.drawStatus();
} }
} }

View File

@@ -1242,12 +1242,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
diagonal = !diagonal; diagonal = !diagonal;
} }
int endRotation = -1;
if(diagonal){ if(diagonal){
var start = world.build(startX, startY); var start = world.build(startX, startY);
var end = world.build(endX, endY); var end = world.build(endX, endY);
if(block != null && start instanceof ChainedBuilding && end instanceof ChainedBuilding if(block != null && start instanceof ChainedBuilding && end instanceof ChainedBuilding
&& block.canReplace(end.block) && block.canReplace(start.block)){ && block.canReplace(end.block) && block.canReplace(start.block)){
points = Placement.upgradeLine(startX, startY, endX, endY); points = Placement.upgradeLine(startX, startY, endX, endY);
endRotation = end.rotation;
}else{ }else{
points = Placement.pathfindLine(block != null && block.conveyorPlacement, startX, startY, endX, endY); points = Placement.pathfindLine(block != null && block.conveyorPlacement, startX, startY, endX, endY);
} }
@@ -1281,6 +1283,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
int result = baseRotation; int result = baseRotation;
if(next != null){ if(next != null){
result = Tile.relativeTo(point.x, point.y, next.x, next.y); result = Tile.relativeTo(point.x, point.y, next.x, next.y);
}else if(endRotation != -1){
result = endRotation;
}else if(block.conveyorPlacement && i > 0){ }else if(block.conveyorPlacement && i > 0){
Point2 prev = points.get(i - 1); Point2 prev = points.get(i - 1);
result = Tile.relativeTo(prev.x, prev.y, point.x, point.y); result = Tile.relativeTo(prev.x, prev.y, point.x, point.y);

View File

@@ -181,7 +181,7 @@ public class LCanvas extends Table{
float dst = Math.min(y - this.y, Core.graphics.getHeight() - y); float dst = Math.min(y - this.y, Core.graphics.getHeight() - y);
if(dst < Scl.scl(100f)){ //scroll margin if(dst < Scl.scl(100f)){ //scroll margin
int sign = Mathf.sign(Core.graphics.getHeight()/2f - y); int sign = Mathf.sign(Core.graphics.getHeight()/2f - y);
pane.setScrollY(pane.getScrollY() + sign * Scl.scl(15f)); pane.setScrollY(pane.getScrollY() + sign * Scl.scl(15f) * Time.delta);
} }
} }
} }

View File

@@ -422,7 +422,7 @@ public class Maps{
} }
private void writeCache(Map map) throws IOException{ private void writeCache(Map map) throws IOException{
try(DataOutputStream stream = new DataOutputStream(map.cacheFile().write(false, Streams.DEFAULT_BUFFER_SIZE))){ try(DataOutputStream stream = new DataOutputStream(map.cacheFile().write(false, Streams.defaultBufferSize))){
stream.write(0); stream.write(0);
stream.writeInt(map.spawns); stream.writeInt(map.spawns);
stream.write(map.teams.size); stream.write(map.teams.size);
@@ -434,7 +434,7 @@ public class Maps{
} }
private void readCache(Map map) throws IOException{ private void readCache(Map map) throws IOException{
try(DataInputStream stream = new DataInputStream(map.cacheFile().read(Streams.DEFAULT_BUFFER_SIZE))){ try(DataInputStream stream = new DataInputStream(map.cacheFile().read(Streams.defaultBufferSize))){
stream.read(); //version stream.read(); //version
map.spawns = stream.readInt(); map.spawns = stream.readInt();
int teamsize = stream.readByte(); int teamsize = stream.readByte();

View File

@@ -3,12 +3,15 @@ package mindustry.maps.filters;
import arc.*; import arc.*;
import arc.func.*; import arc.func.*;
import arc.scene.event.*;
import arc.scene.style.*; import arc.scene.style.*;
import arc.scene.ui.*; import arc.scene.ui.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.ui.*;
import mindustry.ui.dialogs.*; import mindustry.ui.dialogs.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.environment.*; import mindustry.world.blocks.environment.*;
@@ -35,7 +38,7 @@ public abstract class FilterOption{
final Floatc setter; final Floatc setter;
final float min, max, step; final float min, max, step;
boolean display; boolean display = true;
SliderOption(String name, Floatp getter, Floatc setter, float min, float max){ SliderOption(String name, Floatp getter, Floatc setter, float min, float max){
this(name, getter, setter, min, max, (max - min) / 200); this(name, getter, setter, min, max, (max - min) / 200);
@@ -57,19 +60,27 @@ public abstract class FilterOption{
@Override @Override
public void build(Table table){ public void build(Table table){
Label label;
if(!display){ if(!display){
table.add("@filter.option." + name); label = new Label("@filter.option." + name);
}else{ }else{
table.label(() -> Core.bundle.get("filter.option." + name) + ": " + (int)getter.get()); label = new Label(() -> Core.bundle.get("filter.option." + name) + ": " + Strings.autoFixed(getter.get(), 2));
} }
table.row(); label.setWrap(true);
Slider slider = table.slider(min, max, step, setter).growX().get(); label.setAlignment(Align.center);
label.touchable = Touchable.disabled;
label.setStyle(Styles.outlineLabel);
Slider slider = new Slider(min, max, step, false);
slider.moved(setter);
slider.setValue(getter.get()); slider.setValue(getter.get());
if(updateEditorOnChange){ if(updateEditorOnChange){
slider.changed(changed); slider.changed(changed);
}else{ }else{
slider.released(changed); slider.released(changed);
} }
table.stack(slider, label).colspan(2).pad(3).growX().row();
} }
} }

View File

@@ -1,9 +1,6 @@
package mindustry.mod; package mindustry.mod;
import arc.struct.*; import arc.struct.*;
import mindustry.world.blocks.environment.*;
import mindustry.world.blocks.payloads.*;
/** Generated class. Maps simple class names to concrete classes. For use in JSON mods. */ /** Generated class. Maps simple class names to concrete classes. For use in JSON mods. */
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public class ClassMap{ public class ClassMap{
@@ -168,26 +165,28 @@ public class ClassMap{
classes.put("StackConveyor", mindustry.world.blocks.distribution.StackConveyor.class); classes.put("StackConveyor", mindustry.world.blocks.distribution.StackConveyor.class);
classes.put("StackConveyorBuild", mindustry.world.blocks.distribution.StackConveyor.StackConveyorBuild.class); classes.put("StackConveyorBuild", mindustry.world.blocks.distribution.StackConveyor.StackConveyorBuild.class);
classes.put("AirBlock", mindustry.world.blocks.environment.AirBlock.class); classes.put("AirBlock", mindustry.world.blocks.environment.AirBlock.class);
classes.put("Bush", mindustry.world.blocks.environment.Bush.class);
classes.put("Cliff", mindustry.world.blocks.environment.Cliff.class); classes.put("Cliff", mindustry.world.blocks.environment.Cliff.class);
classes.put("DoubleOverlayFloor", mindustry.world.blocks.environment.DoubleOverlayFloor.class); classes.put("DoubleOverlayFloor", mindustry.world.blocks.environment.DoubleOverlayFloor.class);
classes.put("Floor", mindustry.world.blocks.environment.Floor.class); classes.put("Floor", mindustry.world.blocks.environment.Floor.class);
classes.put("OreBlock", mindustry.world.blocks.environment.OreBlock.class); classes.put("OreBlock", mindustry.world.blocks.environment.OreBlock.class);
classes.put("OverlayFloor", mindustry.world.blocks.environment.OverlayFloor.class); classes.put("OverlayFloor", mindustry.world.blocks.environment.OverlayFloor.class);
classes.put("Prop", mindustry.world.blocks.environment.Prop.class); classes.put("Prop", mindustry.world.blocks.environment.Prop.class);
classes.put("Bush", Bush.class);
classes.put("WavingProp", WavingProp.class);
classes.put("ShallowLiquid", mindustry.world.blocks.environment.ShallowLiquid.class); classes.put("ShallowLiquid", mindustry.world.blocks.environment.ShallowLiquid.class);
classes.put("SpawnBlock", mindustry.world.blocks.environment.SpawnBlock.class); classes.put("SpawnBlock", mindustry.world.blocks.environment.SpawnBlock.class);
classes.put("StaticClusterWall", StaticClusterWall.class); classes.put("StaticClusterWall", mindustry.world.blocks.environment.StaticClusterWall.class);
classes.put("StaticTree", mindustry.world.blocks.environment.StaticTree.class); classes.put("StaticTree", mindustry.world.blocks.environment.StaticTree.class);
classes.put("StaticWall", mindustry.world.blocks.environment.StaticWall.class); classes.put("StaticWall", mindustry.world.blocks.environment.StaticWall.class);
classes.put("TreeBlock", mindustry.world.blocks.environment.TreeBlock.class); classes.put("TreeBlock", mindustry.world.blocks.environment.TreeBlock.class);
classes.put("WallOreBlock", mindustry.world.blocks.environment.WallOreBlock.class); classes.put("WallOreBlock", mindustry.world.blocks.environment.WallOreBlock.class);
classes.put("WavingProp", mindustry.world.blocks.environment.WavingProp.class);
classes.put("WobbleProp", mindustry.world.blocks.environment.WobbleProp.class); classes.put("WobbleProp", mindustry.world.blocks.environment.WobbleProp.class);
classes.put("BlockLoader", BlockLoader.class); classes.put("BlockForge", mindustry.world.blocks.experimental.BlockForge.class);
classes.put("BlockLoaderBuild", BlockLoader.BlockLoaderBuild.class); classes.put("BlockForgeBuild", mindustry.world.blocks.experimental.BlockForge.BlockForgeBuild.class);
classes.put("BlockUnloader", BlockUnloader.class); classes.put("BlockLoader", mindustry.world.blocks.experimental.BlockLoader.class);
classes.put("BlockUnloaderBuild", BlockUnloader.BlockUnloaderBuild.class); classes.put("BlockLoaderBuild", mindustry.world.blocks.experimental.BlockLoader.BlockLoaderBuild.class);
classes.put("BlockUnloader", mindustry.world.blocks.experimental.BlockUnloader.class);
classes.put("BlockUnloaderBuild", mindustry.world.blocks.experimental.BlockUnloader.BlockUnloaderBuild.class);
classes.put("LegacyBlock", mindustry.world.blocks.legacy.LegacyBlock.class); classes.put("LegacyBlock", mindustry.world.blocks.legacy.LegacyBlock.class);
classes.put("LegacyMechPad", mindustry.world.blocks.legacy.LegacyMechPad.class); classes.put("LegacyMechPad", mindustry.world.blocks.legacy.LegacyMechPad.class);
classes.put("LegacyMechPadBuild", mindustry.world.blocks.legacy.LegacyMechPad.LegacyMechPadBuild.class); classes.put("LegacyMechPadBuild", mindustry.world.blocks.legacy.LegacyMechPad.LegacyMechPadBuild.class);
@@ -223,8 +222,12 @@ public class ClassMap{
classes.put("BallisticSiloBuild", mindustry.world.blocks.payloads.BallisticSilo.BallisticSiloBuild.class); classes.put("BallisticSiloBuild", mindustry.world.blocks.payloads.BallisticSilo.BallisticSiloBuild.class);
classes.put("BlockForge", mindustry.world.blocks.payloads.BlockForge.class); classes.put("BlockForge", mindustry.world.blocks.payloads.BlockForge.class);
classes.put("BlockForgeBuild", mindustry.world.blocks.payloads.BlockForge.BlockForgeBuild.class); classes.put("BlockForgeBuild", mindustry.world.blocks.payloads.BlockForge.BlockForgeBuild.class);
classes.put("BlockLoader", mindustry.world.blocks.payloads.BlockLoader.class);
classes.put("BlockLoaderBuild", mindustry.world.blocks.payloads.BlockLoader.BlockLoaderBuild.class);
classes.put("BlockProducer", mindustry.world.blocks.payloads.BlockProducer.class); classes.put("BlockProducer", mindustry.world.blocks.payloads.BlockProducer.class);
classes.put("BlockProducerBuild", mindustry.world.blocks.payloads.BlockProducer.BlockProducerBuild.class); classes.put("BlockProducerBuild", mindustry.world.blocks.payloads.BlockProducer.BlockProducerBuild.class);
classes.put("BlockUnloader", mindustry.world.blocks.payloads.BlockUnloader.class);
classes.put("BlockUnloaderBuild", mindustry.world.blocks.payloads.BlockUnloader.BlockUnloaderBuild.class);
classes.put("BuildPayload", mindustry.world.blocks.payloads.BuildPayload.class); classes.put("BuildPayload", mindustry.world.blocks.payloads.BuildPayload.class);
classes.put("NuclearWarhead", mindustry.world.blocks.payloads.NuclearWarhead.class); classes.put("NuclearWarhead", mindustry.world.blocks.payloads.NuclearWarhead.class);
classes.put("NuclearWarheadBuild", mindustry.world.blocks.payloads.NuclearWarhead.NuclearWarheadBuild.class); classes.put("NuclearWarheadBuild", mindustry.world.blocks.payloads.NuclearWarhead.NuclearWarheadBuild.class);
@@ -238,7 +241,7 @@ public class ClassMap{
classes.put("PayloadSource", mindustry.world.blocks.payloads.PayloadSource.class); classes.put("PayloadSource", mindustry.world.blocks.payloads.PayloadSource.class);
classes.put("PayloadSourceBuild", mindustry.world.blocks.payloads.PayloadSource.PayloadSourceBuild.class); classes.put("PayloadSourceBuild", mindustry.world.blocks.payloads.PayloadSource.PayloadSourceBuild.class);
classes.put("PayloadVoid", mindustry.world.blocks.payloads.PayloadVoid.class); classes.put("PayloadVoid", mindustry.world.blocks.payloads.PayloadVoid.class);
classes.put("BlockLoaderBuild", PayloadVoid.PayloadVoidBuild.class); classes.put("PayloadVoidBuild", mindustry.world.blocks.payloads.PayloadVoid.PayloadVoidBuild.class);
classes.put("UnitPayload", mindustry.world.blocks.payloads.UnitPayload.class); classes.put("UnitPayload", mindustry.world.blocks.payloads.UnitPayload.class);
classes.put("Battery", mindustry.world.blocks.power.Battery.class); classes.put("Battery", mindustry.world.blocks.power.Battery.class);
classes.put("BatteryBuild", mindustry.world.blocks.power.Battery.BatteryBuild.class); classes.put("BatteryBuild", mindustry.world.blocks.power.Battery.BatteryBuild.class);
@@ -246,6 +249,7 @@ public class ClassMap{
classes.put("BurnerGeneratorBuild", mindustry.world.blocks.power.BurnerGenerator.BurnerGeneratorBuild.class); classes.put("BurnerGeneratorBuild", mindustry.world.blocks.power.BurnerGenerator.BurnerGeneratorBuild.class);
classes.put("ConditionalConsumePower", mindustry.world.blocks.power.ConditionalConsumePower.class); classes.put("ConditionalConsumePower", mindustry.world.blocks.power.ConditionalConsumePower.class);
classes.put("DecayGenerator", mindustry.world.blocks.power.DecayGenerator.class); classes.put("DecayGenerator", mindustry.world.blocks.power.DecayGenerator.class);
classes.put("DynamicConsumePower", mindustry.world.blocks.power.DynamicConsumePower.class);
classes.put("ImpactReactor", mindustry.world.blocks.power.ImpactReactor.class); classes.put("ImpactReactor", mindustry.world.blocks.power.ImpactReactor.class);
classes.put("ImpactReactorBuild", mindustry.world.blocks.power.ImpactReactor.ImpactReactorBuild.class); classes.put("ImpactReactorBuild", mindustry.world.blocks.power.ImpactReactor.ImpactReactorBuild.class);
classes.put("ItemLiquidGenerator", mindustry.world.blocks.power.ItemLiquidGenerator.class); classes.put("ItemLiquidGenerator", mindustry.world.blocks.power.ItemLiquidGenerator.class);
@@ -334,6 +338,7 @@ public class ClassMap{
classes.put("DrawCells", mindustry.world.draw.DrawCells.class); classes.put("DrawCells", mindustry.world.draw.DrawCells.class);
classes.put("DrawCultivator", mindustry.world.draw.DrawCultivator.class); classes.put("DrawCultivator", mindustry.world.draw.DrawCultivator.class);
classes.put("DrawGlow", mindustry.world.draw.DrawGlow.class); classes.put("DrawGlow", mindustry.world.draw.DrawGlow.class);
classes.put("DrawLiquid", mindustry.world.draw.DrawLiquid.class);
classes.put("DrawMixer", mindustry.world.draw.DrawMixer.class); classes.put("DrawMixer", mindustry.world.draw.DrawMixer.class);
classes.put("DrawRotator", mindustry.world.draw.DrawRotator.class); classes.put("DrawRotator", mindustry.world.draw.DrawRotator.class);
classes.put("DrawSmelter", mindustry.world.draw.DrawSmelter.class); classes.put("DrawSmelter", mindustry.world.draw.DrawSmelter.class);

View File

@@ -11,6 +11,10 @@ public class ModClassLoader extends ClassLoader{
} }
}; };
public ModClassLoader(ClassLoader parent){
super(parent);
}
public void addChild(ClassLoader child){ public void addChild(ClassLoader child){
children.add(child); children.add(child);
} }

View File

@@ -39,7 +39,7 @@ public class Mods implements Loadable{
private int totalSprites; private int totalSprites;
private MultiPacker packer; private MultiPacker packer;
private ModClassLoader mainLoader = new ModClassLoader(); private ModClassLoader mainLoader = new ModClassLoader(getClass().getClassLoader());
Seq<LoadedMod> mods = new Seq<>(); Seq<LoadedMod> mods = new Seq<>();
private ObjectMap<Class<?>, ModMeta> metas = new ObjectMap<>(); private ObjectMap<Class<?>, ModMeta> metas = new ObjectMap<>();
@@ -86,7 +86,8 @@ public class Mods implements Loadable{
/** Imports an external mod file. Folders are not supported here. */ /** Imports an external mod file. Folders are not supported here. */
public LoadedMod importMod(Fi file) throws IOException{ public LoadedMod importMod(Fi file) throws IOException{
String baseName = file.nameWithoutExtension(); //for some reason, android likes to add colons to file names, e.g. primary:ExampleJavaMod.jar, which breaks dexing
String baseName = file.nameWithoutExtension().replace(':', '_').replace(' ', '_');
String finalName = baseName; String finalName = baseName;
//find a name to prevent any name conflicts //find a name to prevent any name conflicts
int count = 1; int count = 1;
@@ -300,12 +301,12 @@ public class Mods implements Loadable{
} }
private PageType getPage(Fi file){ private PageType getPage(Fi file){
String parent = file.parent().name(); String path = file.path();
return return
parent.equals("environment") ? PageType.environment : path.contains("sprites/blocks/environment") ? PageType.environment :
parent.equals("editor") ? PageType.editor : path.contains("sprites/editor") ? PageType.editor :
parent.equals("rubble") ? PageType.editor : path.contains("sprites/rubble") ? PageType.editor :
parent.equals("ui") || file.parent().parent().name().equals("ui") ? PageType.ui : path.contains("sprites/ui") ? PageType.ui :
PageType.main; PageType.main;
} }

View File

@@ -7,9 +7,9 @@ import arc.assets.loaders.SoundLoader.*;
import arc.audio.*; import arc.audio.*;
import arc.files.*; import arc.files.*;
import arc.func.*; import arc.func.*;
import arc.struct.*;
import arc.util.*; import arc.util.*;
import arc.util.Log.*; import arc.util.Log.*;
import arc.util.io.*;
import mindustry.*; import mindustry.*;
import mindustry.mod.Mods.*; import mindustry.mod.Mods.*;
import rhino.*; import rhino.*;
@@ -18,7 +18,6 @@ import rhino.module.provider.*;
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
import java.util.*;
import java.util.regex.*; import java.util.regex.*;
public class Scripts implements Disposable{ public class Scripts implements Disposable{
@@ -131,7 +130,7 @@ public class Scripts implements Disposable{
/** writeFile but for a byte[] */ /** writeFile but for a byte[] */
public void writeBinFile(String purpose, String ext, byte[] contents){ public void writeBinFile(String purpose, String ext, byte[] contents){
if(contents == null) contents = new byte[0]; if(contents == null) contents = Streams.emptyBytes;
final byte[] fContents = contents; final byte[] fContents = contents;
selectFile(false, purpose, ext, fi -> fi.writeBytes(fContents)); selectFile(false, purpose, ext, fi -> fi.writeBytes(fContents));
} }
@@ -183,7 +182,7 @@ public class Scripts implements Disposable{
} }
private class ScriptModuleProvider extends UrlModuleSourceProvider{ private class ScriptModuleProvider extends UrlModuleSourceProvider{
private Pattern directory = Pattern.compile("^(.+?)/(.+)"); private final Pattern directory = Pattern.compile("^(.+?)/(.+)");
public ScriptModuleProvider(){ public ScriptModuleProvider(){
super(null, null); super(null, null);

View File

@@ -1,7 +1,6 @@
package mindustry.net; package mindustry.net;
import arc.*; import arc.*;
import arc.Net.*;
import arc.files.*; import arc.files.*;
import arc.func.*; import arc.func.*;
import arc.util.*; import arc.util.*;
@@ -62,27 +61,25 @@ public class BeControl{
/** asynchronously checks for updates. */ /** asynchronously checks for updates. */
public void checkUpdate(Boolc done){ public void checkUpdate(Boolc done){
Core.net.httpGet("https://api.github.com/repos/Anuken/MindustryBuilds/releases/latest", res -> { Http.get("https://api.github.com/repos/Anuken/MindustryBuilds/releases/latest")
if(res.getStatus() == HttpStatus.OK){ .error(e -> {}) //ignore errors
Jval val = Jval.read(res.getResultAsString()); .submit(res -> {
int newBuild = Strings.parseInt(val.getString("tag_name", "0")); Jval val = Jval.read(res.getResultAsString());
if(newBuild > Version.build){ int newBuild = Strings.parseInt(val.getString("tag_name", "0"));
Jval asset = val.get("assets").asArray().find(v -> v.getString("name", "").startsWith(headless ? "Mindustry-BE-Server" : "Mindustry-BE-Desktop")); if(newBuild > Version.build){
String url = asset.getString("browser_download_url", ""); Jval asset = val.get("assets").asArray().find(v -> v.getString("name", "").startsWith(headless ? "Mindustry-BE-Server" : "Mindustry-BE-Desktop"));
updateAvailable = true; String url = asset.getString("browser_download_url", "");
updateBuild = newBuild; updateAvailable = true;
updateUrl = url; updateBuild = newBuild;
Core.app.post(() -> { updateUrl = url;
showUpdateDialog(); Core.app.post(() -> {
done.get(true); showUpdateDialog();
}); done.get(true);
}else{ });
Core.app.post(() -> done.get(false));
}
}else{ }else{
Core.app.post(() -> done.get(false)); Core.app.post(() -> done.get(false));
} }
}, error -> {}); //ignore errors });
} }
/** @return whether a new update is available */ /** @return whether a new update is available */

View File

@@ -1,7 +1,6 @@
package mindustry.net; package mindustry.net;
import arc.*; import arc.*;
import arc.Net.*;
import arc.files.*; import arc.files.*;
import arc.func.*; import arc.func.*;
import arc.struct.*; import arc.struct.*;
@@ -147,26 +146,18 @@ public class CrashSender{
ex(() -> value.addChild("javaVersion", new JsonValue(System.getProperty("java.version")))); ex(() -> value.addChild("javaVersion", new JsonValue(System.getProperty("java.version"))));
ex(() -> value.addChild("javaArch", new JsonValue(System.getProperty("sun.arch.data.model")))); ex(() -> value.addChild("javaArch", new JsonValue(System.getProperty("sun.arch.data.model"))));
boolean[] sent = {false};
Log.info("Sending crash report."); Log.info("Sending crash report.");
//post to crash report URL, exit code indicates send success //post to crash report URL, exit code indicates send success
httpPost(Vars.crashReportURL, value.toJson(OutputType.json), r -> { Http.post(Vars.crashReportURL, value.toJson(OutputType.json)).error(t -> {
Log.info("Crash sent successfully."); Log.info("Crash report not sent.");
sent[0] = true;
System.exit(1);
}, t -> {
t.printStackTrace();
sent[0] = true;
System.exit(-1); System.exit(-1);
}).block(r -> {
Log.info("Crash sent successfully.");
System.exit(1);
}); });
//sleep until report is sent ret();
try{
while(!sent[0]){
Thread.sleep(30);
}
}catch(InterruptedException ignored){}
}catch(Throwable death){ }catch(Throwable death){
death.printStackTrace(); death.printStackTrace();
} }
@@ -178,10 +169,6 @@ public class CrashSender{
System.exit(1); System.exit(1);
} }
private static void httpPost(String url, String content, Cons<HttpResponse> success, Cons<Throwable> failure){
new NetJavaImpl().http(new HttpRequest().method(HttpMethod.POST).content(content).url(url), success, failure);
}
private static String parseException(Throwable e){ private static String parseException(Throwable e){
StringWriter sw = new StringWriter(); StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw); PrintWriter pw = new PrintWriter(sw);

View File

@@ -9,6 +9,7 @@ import arc.util.async.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.net.Packets.*; import mindustry.net.Packets.*;
import mindustry.net.Streamable.*; import mindustry.net.Streamable.*;
import net.jpountz.lz4.*;
import java.io.*; import java.io.*;
import java.nio.*; import java.nio.*;
@@ -33,7 +34,7 @@ public class Net{
private final ObjectMap<Class<?>, Cons> clientListeners = new ObjectMap<>(); private final ObjectMap<Class<?>, Cons> clientListeners = new ObjectMap<>();
private final ObjectMap<Class<?>, Cons2<NetConnection, Object>> serverListeners = new ObjectMap<>(); private final ObjectMap<Class<?>, Cons2<NetConnection, Object>> serverListeners = new ObjectMap<>();
private final IntMap<StreamBuilder> streams = new IntMap<>(); private final IntMap<StreamBuilder> streams = new IntMap<>();
private final ExecutorService pingExecutor = Threads.executor(Math.max(Runtime.getRuntime().availableProcessors(), 6)); private final ExecutorService pingExecutor = Threads.cachedExecutor();
private final NetProvider provider; private final NetProvider provider;
@@ -97,7 +98,7 @@ public class Net{
if(e instanceof BufferUnderflowException || e instanceof BufferOverflowException){ if(e instanceof BufferUnderflowException || e instanceof BufferOverflowException){
error = Core.bundle.get("error.io"); error = Core.bundle.get("error.io");
}else if(error.equals("mismatch")){ }else if(error.equals("mismatch") || e instanceof LZ4Exception || (e instanceof IndexOutOfBoundsException && e.getStackTrace()[0].getClassName().contains("java.nio"))){
error = Core.bundle.get("error.mismatch"); error = Core.bundle.get("error.mismatch");
}else if(error.contains("port out of range") || error.contains("invalid argument") || (error.contains("invalid") && error.contains("address")) || Strings.neatError(e).contains("address associated")){ }else if(error.contains("port out of range") || error.contains("invalid argument") || (error.contains("invalid") && error.contains("address")) || Strings.neatError(e).contains("address associated")){
error = Core.bundle.get("error.invalidaddress"); error = Core.bundle.get("error.invalidaddress");
@@ -325,13 +326,6 @@ public class Net{
pingExecutor.submit(() -> provider.pingHost(address, port, valid, failed)); pingExecutor.submit(() -> provider.pingHost(address, port, valid, failed));
} }
/**
* Pings a host in an new thread. If an error occurred, failed() should be called with the exception.
*/
public void pingHostThread(String address, int port, Cons<Host> valid, Cons<Exception> failed){
Threads.daemon(() -> provider.pingHost(address, port, valid, failed));
}
/** /**
* Whether the net is active, e.g. whether this is a multiplayer game. * Whether the net is active, e.g. whether this is a multiplayer game.
*/ */

View File

@@ -4,7 +4,6 @@ import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.net.Administration.*;
import mindustry.net.Packets.*; import mindustry.net.Packets.*;
import java.io.*; import java.io.*;
@@ -37,38 +36,39 @@ public abstract class NetConnection{
/** Kick with a special, localized reason. Use this if possible. */ /** Kick with a special, localized reason. Use this if possible. */
public void kick(KickReason reason){ public void kick(KickReason reason){
if(kicked) return; kick(reason, (reason == KickReason.kick || reason == KickReason.banned || reason == KickReason.vote) ? 30 * 1000 : 0);
}
Log.info("Kicking connection @ / @; Reason: @", address, uuid, reason.name()); /** Kick with a special, localized reason. Use this if possible. */
public void kick(KickReason reason, long kickDuration){
if((reason == KickReason.kick || reason == KickReason.banned || reason == KickReason.vote)){ kick(null, reason, kickDuration);
PlayerInfo info = netServer.admins.getInfo(uuid);
info.timesKicked++;
info.lastKicked = Math.max(Time.millis() + 30 * 1000, info.lastKicked);
}
Call.kick(this, reason);
close();
netServer.admins.save();
kicked = true;
} }
/** Kick with an arbitrary reason. */ /** Kick with an arbitrary reason. */
public void kick(String reason){ public void kick(String reason){
kick(reason, 30 * 1000); kick(reason, null, 30 * 1000);
}
/** Kick with an arbitrary reason. */
public void kick(String reason, long duration){
kick(reason, null, duration);
} }
/** Kick with an arbitrary reason, and a kick duration in milliseconds. */ /** Kick with an arbitrary reason, and a kick duration in milliseconds. */
public void kick(String reason, long kickDuration){ private void kick(String reason, KickReason kickType, long kickDuration){
if(kicked) return; if(kicked) return;
Log.info("Kicking connection @ / @; Reason: @", address, uuid, reason.replace("\n", " ")); Log.info("Kicking connection @ / @; Reason: @", address, uuid, reason == null ? kickType.name() : reason.replace("\n", " "));
netServer.admins.handleKicked(uuid, address, kickDuration); if(kickDuration > 0){
netServer.admins.handleKicked(uuid, address, kickDuration);
}
Call.kick(this, reason); if(reason == null){
Call.kick(this, kickType);
}else{
Call.kick(this, reason);
}
close(); close();

View File

@@ -255,7 +255,7 @@ public class UnitType extends UnlockableContent{
stats.add(Stat.health, health); stats.add(Stat.health, health);
stats.add(Stat.armor, armor); stats.add(Stat.armor, armor);
stats.add(Stat.speed, speed); stats.add(Stat.speed, speed * 60f / tilesize, StatUnit.tilesSecond);
stats.add(Stat.size, hitSize / tilesize, StatUnit.blocksSquared); stats.add(Stat.size, hitSize / tilesize, StatUnit.blocksSquared);
stats.add(Stat.itemCapacity, itemCapacity); stats.add(Stat.itemCapacity, itemCapacity);
stats.add(Stat.range, (int)(maxRange / tilesize), StatUnit.blocks); stats.add(Stat.range, (int)(maxRange / tilesize), StatUnit.blocks);

View File

@@ -203,7 +203,7 @@ public class Fonts{
/** Merges the UI and font atlas together for better performance. */ /** Merges the UI and font atlas together for better performance. */
public static void mergeFontAtlas(TextureAtlas atlas){ public static void mergeFontAtlas(TextureAtlas atlas){
//grab all textures from the ui page, remove all the regions assigned to it, then copy them over to Fonts.packer and replace the texture in this atlas. //grab all textures from the ui page, remove all the regions assigned to it, then copy them over to UI.packer and replace the texture in this atlas.
//grab old UI texture and regions... //grab old UI texture and regions...
Texture texture = atlas.find("logo").texture; Texture texture = atlas.find("logo").texture;

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