From db546412f13bdb475a7919af724fd49a04b9150f Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 27 Dec 2018 15:47:17 -0500 Subject: [PATCH] Arc compatibility update --- .gitignore | 2 +- android/build.gradle | 3 +- .../io/anuke/mindustry/AndroidLauncher.java | 30 ++++++------ .../mindustry/PatchedAndroidApplication.java | 20 -------- build.gradle | 13 +++-- .../src/io/anuke/mindustry/content/Mechs.java | 10 ++-- .../content/blocks/TurretBlocks.java | 10 ++-- .../content/bullets/TurretBullets.java | 4 +- .../anuke/mindustry/content/fx/ShootFx.java | 16 +++--- core/src/io/anuke/mindustry/core/Control.java | 8 --- .../src/io/anuke/mindustry/core/Renderer.java | 6 ++- core/src/io/anuke/mindustry/core/UI.java | 4 +- .../anuke/mindustry/editor/MapRenderer.java | 2 +- .../io/anuke/mindustry/entities/Player.java | 22 +++++---- .../src/io/anuke/mindustry/entities/Unit.java | 4 +- .../entities/bullet/ArtilleryBulletType.java | 4 +- .../entities/bullet/BasicBulletType.java | 4 +- .../entities/effect/RubbleDecal.java | 2 +- .../entities/effect/ScorchDecal.java | 3 +- .../mindustry/entities/units/BaseUnit.java | 2 +- .../mindustry/entities/units/FlyingUnit.java | 2 +- .../mindustry/entities/units/GroundUnit.java | 8 +-- core/src/io/anuke/mindustry/game/Saves.java | 2 +- .../mindustry/graphics/BlockRenderer.java | 7 ++- .../mindustry/graphics/FloorRenderer.java | 18 +++---- .../mindustry/graphics/MinimapRenderer.java | 3 +- .../io/anuke/mindustry/graphics/Shapes.java | 7 ++- .../anuke/mindustry/input/DesktopInput.java | 15 ++++-- .../io/anuke/mindustry/input/MobileInput.java | 7 ++- .../maps/missions/BlockLocMission.java | 8 +-- core/src/io/anuke/mindustry/ui/GridImage.java | 4 +- core/src/io/anuke/mindustry/ui/Minimap.java | 2 +- .../mindustry/ui/dialogs/GenViewDialog.java | 2 +- .../mindustry/ui/dialogs/SectorsDialog.java | 12 ++--- .../ui/fragments/BackgroundFragment.java | 9 ++-- .../mindustry/ui/fragments/ChatFragment.java | 4 +- core/src/io/anuke/mindustry/world/Block.java | 2 +- .../mindustry/world/blocks/BuildBlock.java | 4 +- .../anuke/mindustry/world/blocks/Floor.java | 10 ++-- .../mindustry/world/blocks/LiquidBlock.java | 6 +-- .../world/blocks/defense/DeflectorWall.java | 4 +- .../world/blocks/defense/ForceProjector.java | 4 +- .../world/blocks/defense/MendProjector.java | 4 +- .../blocks/defense/OverdriveProjector.java | 4 +- .../world/blocks/defense/ShockMine.java | 2 +- .../world/blocks/defense/turrets/Turret.java | 11 +++-- .../world/blocks/distribution/Conduit.java | 8 +-- .../world/blocks/distribution/Conveyor.java | 4 +- .../distribution/ExtendingItemBridge.java | 7 ++- .../world/blocks/distribution/ItemBridge.java | 6 +-- .../world/blocks/distribution/MassDriver.java | 3 +- .../world/blocks/power/FusionReactor.java | 5 +- .../world/blocks/production/Drill.java | 6 ++- .../world/blocks/production/Fracker.java | 2 +- .../world/blocks/production/LiquidMixer.java | 6 +-- .../world/blocks/production/PhaseWeaver.java | 2 +- .../world/blocks/production/Pulverizer.java | 2 +- .../world/blocks/production/SolidPump.java | 2 +- .../mindustry/world/blocks/units/MechPad.java | 4 +- .../world/blocks/units/RepairPoint.java | 2 +- .../mindustry/desktop/DesktopLauncher.java | 4 +- ios/src/io/anuke/mindustry/IOSLauncher.java | 23 +++++---- net/build/libs/kryonet-release.jar | Bin 22107 -> 0 bytes net/build/libs/net-release.jar | Bin 22107 -> 23415 bytes .../{kryonet => net}/ByteSerializer.java | 2 +- .../{kryonet => net}/FrameworkSerializer.java | 2 +- .../io/anuke/{kryonet => net}/KryoClient.java | 2 +- .../io/anuke/{kryonet => net}/KryoCore.java | 2 +- .../io/anuke/{kryonet => net}/KryoServer.java | 2 +- .../anuke/mindustry/server/CrashHandler.java | 6 +-- .../anuke/mindustry/server/ServerControl.java | 46 ++++++++---------- .../mindustry/server/ServerLauncher.java | 18 +++---- settings.gradle | 3 ++ tests/src/test/java/ApplicationTests.java | 37 ++++++-------- tests/src/test/java/SectorTests.java | 4 +- 75 files changed, 255 insertions(+), 285 deletions(-) delete mode 100644 android/src/io/anuke/mindustry/PatchedAndroidApplication.java delete mode 100644 net/build/libs/kryonet-release.jar rename net/src/io/anuke/{kryonet => net}/ByteSerializer.java (98%) rename net/src/io/anuke/{kryonet => net}/FrameworkSerializer.java (98%) rename net/src/io/anuke/{kryonet => net}/KryoClient.java (99%) rename net/src/io/anuke/{kryonet => net}/KryoCore.java (98%) rename net/src/io/anuke/{kryonet => net}/KryoServer.java (99%) diff --git a/.gitignore b/.gitignore index 611dd73e9a..455159c956 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ logs/ /core/lib/ /core/assets-raw/sprites/generated/ /annotations/build/ -/kryonet/build/ +/net/build/ /tools/build/ /tests/build/ /server/build/ diff --git a/android/build.gradle b/android/build.gradle index 4a388fee88..3f10a5a3e2 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -31,13 +31,12 @@ dependencies { implementation 'org.sufficientlysecure:donations:2.5' implementation 'com.google.android.gms:play-services-auth:16.0.1' - implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" + implementation project(":Arc:backends:backend-android") natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64" - implementation "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi" natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a" natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a" diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index 07fb4ce0c0..00f71dd74b 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -8,28 +8,28 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.provider.Core.settings.Secure; +import android.provider.Settings.Secure; import android.telephony.TelephonyManager; import android.util.Log; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.utils.Base64Coder; import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.common.GooglePlayServicesNotAvailableException; import com.google.android.gms.common.GooglePlayServicesRepairableException; import com.google.android.gms.security.ProviderInstaller; -import io.anuke.kryonet.KryoClient; -import io.anuke.kryonet.KryoServer; +import io.anuke.arc.Core; +import io.anuke.arc.backends.android.surfaceview.AndroidApplication; +import io.anuke.arc.backends.android.surfaceview.AndroidApplicationConfiguration; +import io.anuke.arc.files.FileHandle; +import io.anuke.arc.function.Consumer; +import io.anuke.arc.scene.ui.layout.Unit; +import io.anuke.arc.util.Strings; +import io.anuke.arc.util.serialization.Base64Coder; +import io.anuke.net.KryoClient; +import io.anuke.net.KryoServer; import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.game.Saves.SaveSlot; import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.ui.dialogs.FileChooser; -import io.anuke.arc.function.Consumer; -import io.anuke.arc.scene.ui.layout.Unit; -import io.anuke.arc.util.Bundles; -import io.anuke.arc.util.Strings; import java.io.File; import java.io.FileInputStream; @@ -39,7 +39,7 @@ import java.util.ArrayList; import static io.anuke.mindustry.Vars.*; -public class AndroidLauncher extends PatchedAndroidApplication{ +public class AndroidLauncher extends AndroidApplication{ public static final int PERMISSION_REQUEST_CODE = 1; boolean doubleScaleTablets = true; FileChooser chooser; @@ -161,10 +161,10 @@ public class AndroidLauncher extends PatchedAndroidApplication{ InputStream inStream; if(myFile != null) inStream = new FileInputStream(myFile); else inStream = getContentResolver().openInputStream(uri); - Gdx.app.postRunnable(() -> { + Core.app.post(() -> { if(save){ //open save System.out.println("Opening save."); - FileHandle file = Gdx.files.local("temp-save." + saveExtension); + FileHandle file = Core.files.local("temp-save." + saveExtension); file.write(inStream, false); if(SaveIO.isSaveValid(file)){ try{ @@ -177,7 +177,7 @@ public class AndroidLauncher extends PatchedAndroidApplication{ ui.showError("$text.save.import.invalid"); } }else if(map){ //open map - Gdx.app.postRunnable(() -> { + Core.app.post(() -> { System.out.println("Opening map."); if(!ui.editor.isShown()){ ui.editor.show(); diff --git a/android/src/io/anuke/mindustry/PatchedAndroidApplication.java b/android/src/io/anuke/mindustry/PatchedAndroidApplication.java deleted file mode 100644 index 78bc0476e9..0000000000 --- a/android/src/io/anuke/mindustry/PatchedAndroidApplication.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.anuke.mindustry; - -import com.badlogic.gdx.backends.android.AndroidApplication; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public abstract class PatchedAndroidApplication extends AndroidApplication { - private final ExecutorService exec = Executors.newSingleThreadExecutor(); - - @Override - protected void onPause () { - if(useImmersiveMode) { - exec.submit(() -> { - try {Thread.sleep(100);} catch (InterruptedException ignored) {} - graphics.onDrawFrame(null); - }); - } - super.onPause(); - } -} \ No newline at end of file diff --git a/build.gradle b/build.gradle index bedef4db0c..5edb8b2255 100644 --- a/build.gradle +++ b/build.gradle @@ -89,6 +89,7 @@ project(":desktop"){ dependencies{ compile project(":core") compile project(":net") + if(new File(projectDir.parent, '../debug').exists() && System.properties["release"] == null) compile project(":debug") compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" @@ -145,11 +146,12 @@ project(":ios"){ dependencies{ compile project(":core") - implementation project(":net") + compile project(":net") + compile project(":Arc:backends:backend-robovm") + compile "com.mobidevelop.robovm:robovm-rt:$roboVMVersion" compile "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion" - compile "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion" compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios" compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-ios" } @@ -185,11 +187,9 @@ project(":server"){ apply plugin: "java" dependencies{ - compile project(":core") compile project(":net") - compile "com.badlogicgames.gdx:gdx-backend-headless:$gdxVersion" - compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" + compile project(":Arc:backends:backend-headless") } } @@ -200,8 +200,7 @@ project(":tests"){ testImplementation project(":core") testImplementation('org.junit.jupiter:junit-jupiter-api:5.1.0') testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.1.0') - testImplementation "com.badlogicgames.gdx:gdx-backend-headless:$gdxVersion" - testImplementation "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" + compile project(":Arc:backends:backend-headless") } test{ diff --git a/core/src/io/anuke/mindustry/content/Mechs.java b/core/src/io/anuke/mindustry/content/Mechs.java index 82651d9ec6..fed2e528f5 100644 --- a/core/src/io/anuke/mindustry/content/Mechs.java +++ b/core/src/io/anuke/mindustry/content/Mechs.java @@ -202,14 +202,14 @@ public class Mechs implements ContentList{ public void draw(Player player){ if(player.shootHeat <= 0.01f) return; - float alpha = Core.graphics.batch().getColor().a; + float alpha = Draw.getColor().a; Shaders.build.progress = player.shootHeat; Shaders.build.region = armorRegion; Shaders.build.time = Time.time() / 10f; Shaders.build.color.set(Palette.accent).a = player.shootHeat; Draw.shader(Shaders.build); Draw.alpha(1f); - Draw.rect(armorRegion, player.snappedX(), player.snappedY()).rot(player.rotation); + Draw.rect(armorRegion, player.snappedX(), player.snappedY(), player.rotation); Draw.shader(Shaders.mix); Draw.color(1f, 1f, 1f, alpha); } @@ -268,11 +268,13 @@ public class Mechs implements ContentList{ public void draw(Player player){ float scl = scld(player); if(scl < 0.01f) return; - float alpha = Core.graphics.batch().getColor().a; + float alpha = Draw.getColor().a; Draw.shader(); Draw.color(Palette.lancerLaser); Draw.alpha(scl/2f); - Draw.rect(shield, player.snappedX() + Mathf.range(scl/2f), player.snappedY() + Mathf.range(scl/2f)).rot(player.rotation - 90).blend(Blending.additive); + Draw.blend(Blending.additive); + Draw.rect(shield, player.snappedX() + Mathf.range(scl/2f), player.snappedY() + Mathf.range(scl/2f), player.rotation - 90); + Draw.blend(); Draw.shader(Shaders.mix); Draw.color(); Draw.alpha(alpha); diff --git a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java index 2a11a2c96f..3bb6f8ba72 100644 --- a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java @@ -58,7 +58,7 @@ public class TurretBlocks extends BlockList implements ContentList{ ammoUseEffect = ShootFx.shellEjectSmall; health = 160; - drawer = (tile, entity) -> Draw.rect(entity.target != null ? shootRegion : region, tile.drawx() + tr2.x, tile.drawy() + tr2.y).rot(entity.rotation - 90); + drawer = (tile, entity) -> Draw.rect(entity.target != null ? shootRegion : region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); } }; @@ -74,11 +74,11 @@ public class TurretBlocks extends BlockList implements ContentList{ health = 360; drawer = (tile, entity) -> { - Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y).rot(entity.rotation - 90); + Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); Draw.color(entity.liquids.current().color); Draw.alpha(entity.liquids.total() / liquidCapacity); - Draw.rect(name + "-liquid", tile.drawx() + tr2.x, tile.drawy() + tr2.y).rot(entity.rotation - 90).color(entity.liquids.current().color); + Draw.rect(name + "-liquid", tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); Draw.color(); }; }}; @@ -157,7 +157,7 @@ public class TurretBlocks extends BlockList implements ContentList{ ammoUseEffect = ShootFx.shellEjectBig; drawer = (tile, entity) -> { - Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y).rot(entity.rotation - 90); + Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); float offsetx = (int) (abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 3f); float offsety = -(int) (abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 2f); @@ -165,7 +165,7 @@ public class TurretBlocks extends BlockList implements ContentList{ float rot = entity.rotation + 90 * i; Draw.rect(panels[i == -1 ? 0 : 1], tile.drawx() + tr2.x + Angles.trnsx(rot, offsetx, offsety), - tile.drawy() + tr2.y + Angles.trnsy(rot, -offsetx, offsety)).rot(entity.rotation - 90); + tile.drawy() + tr2.y + Angles.trnsy(rot, -offsetx, offsety), entity.rotation - 90); } }; diff --git a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java index a326387785..1bce07f371 100644 --- a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java +++ b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java @@ -346,10 +346,10 @@ public class TurretBullets extends BulletList implements ContentList{ float w = 11f, h = 13f; Draw.color(Palette.bulletYellowBack); - Draw.rect("shell-back", b.x, b.y, w, h).rot(b.angle() + 90); + Draw.rect("shell-back", b.x, b.y, w, h, b.angle() + 90); Draw.color(Palette.bulletYellow); - Draw.rect("shell", b.x, b.y, w, h).rot(b.angle() + 90); + Draw.rect("shell", b.x, b.y, w, h, b.angle() + 90); Draw.reset(); } diff --git a/core/src/io/anuke/mindustry/content/fx/ShootFx.java b/core/src/io/anuke/mindustry/content/fx/ShootFx.java index 263ab8cf43..f2c588610a 100644 --- a/core/src/io/anuke/mindustry/content/fx/ShootFx.java +++ b/core/src/io/anuke/mindustry/content/fx/ShootFx.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.content.fx; +import io.anuke.arc.Core; import io.anuke.arc.entities.Effects.Effect; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; @@ -108,10 +109,9 @@ public class ShootFx extends FxList implements ContentList{ float len = (2f + e.finpow() * 6f) * i; float lr = rot + e.fin() * 30f * i; - Draw.rect("white", - e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), + Fill.rect(e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), - 1f, 2f).rot(rot + e.fin() * 50f * i); + 1f, 2f, rot + e.fin() * 50f * i); Draw.color(); }); @@ -122,10 +122,10 @@ public class ShootFx extends FxList implements ContentList{ for(int i : Mathf.signs){ float len = (2f + e.finpow() * 10f) * i; float lr = rot + e.fin() * 20f * i; - Draw.rect("casing", + Draw.rect(Core.atlas.find("casing"), e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), - 2f, 3f).rot(rot); + 2f, 3f, rot); } Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin()); @@ -145,11 +145,11 @@ public class ShootFx extends FxList implements ContentList{ for(int i : Mathf.signs){ float len = (4f + e.finpow() * 8f) * i; float lr = rot + Mathf.randomSeedRange(e.id + i + 6, 20f * e.fin()) * i; - Draw.rect("casing", + Draw.rect(Core.atlas.find("casing"), e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), - 2.5f, 4f) - .rot(rot + e.fin() * 30f * i + Mathf.randomSeedRange(e.id + i + 9, 40f * e.fin())); + 2.5f, 4f, + rot + e.fin() * 30f * i + Mathf.randomSeedRange(e.id + i + 9, 40f * e.fin())); } Draw.color(Color.LIGHT_GRAY); diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 56cdb7e2f9..054a2be00c 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -50,7 +50,6 @@ public class Control implements ApplicationListener{ private boolean hiscore = false; private boolean wasPaused = false; private InputHandler[] inputs = {}; - private Throwable error; public Control(){ saves = new Saves(); @@ -206,10 +205,6 @@ public class Control implements ApplicationListener{ System.arraycopy(oldi, 0, inputs, 0, inputs.length); } - public void setError(Throwable error){ - this.error = error; - } - public InputHandler input(int index){ return inputs[index]; } @@ -308,9 +303,6 @@ public class Control implements ApplicationListener{ @Override public void update(){ - if(error != null){ - throw new RuntimeException(error); - } saves.update(); diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index e5dc8abe04..65963616d7 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -14,6 +14,7 @@ import io.anuke.arc.graphics.Camera; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Lines; +import io.anuke.arc.graphics.g2d.SpriteBatch; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Rectangle; import io.anuke.arc.math.geom.Vector2; @@ -30,7 +31,7 @@ import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.graphics.*; -import static io.anuke.arc.Core.camera; +import static io.anuke.arc.Core.*; import static io.anuke.arc.Core.graphics; import static io.anuke.mindustry.Vars.*; @@ -45,6 +46,7 @@ public class Renderer implements ApplicationListener{ private Vector2 avgPosition = new Vector2(); public Renderer(){ + batch = new SpriteBatch(4096); camera = new Camera(); Lines.setCircleVertices(14); @@ -146,7 +148,7 @@ public class Renderer implements ApplicationListener{ graphics.clear(clearColor); - graphics.batch().setProjection(camera.projection()); + Draw.proj(camera.projection()); blocks.drawFloor(); diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index 0b248f5fa1..7583eb01f9 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -11,6 +11,7 @@ import io.anuke.arc.function.Consumer; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Colors; import io.anuke.arc.graphics.g2d.BitmapFont; +import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.input.KeyCode; import io.anuke.arc.math.Interpolation; import io.anuke.arc.scene.Group; @@ -81,6 +82,7 @@ public class UI implements ApplicationListener{ } Core.scene = new Scene(skin); + Core.input.addProcessor(Core.scene); Dialog.setShowAction(() -> sequence( alpha(0f), @@ -142,7 +144,7 @@ public class UI implements ApplicationListener{ Core.scene.act(); Core.scene.draw(); - Core.graphics.batch().flush(); + Draw.flush(); } @Override diff --git a/core/src/io/anuke/mindustry/editor/MapRenderer.java b/core/src/io/anuke/mindustry/editor/MapRenderer.java index a0b08ad66a..1db1df1c96 100644 --- a/core/src/io/anuke/mindustry/editor/MapRenderer.java +++ b/core/src/io/anuke/mindustry/editor/MapRenderer.java @@ -79,7 +79,7 @@ public class MapRenderer implements Disposable{ } mesh.getTransformMatrix().setToTranslation(tx, ty).scale(tw / (width * tilesize), th / (height * tilesize)); - mesh.setProjectionMatrix(Core.graphics.batch().getProjection()); + mesh.setProjectionMatrix(Draw.proj()); mesh.render(Core.atlas.getTextures().first()); } diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index 9b79e4aff2..3878881b39 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -288,7 +288,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra float x = snappedX(), y = snappedY(); float scl = mech.flying ? 1f : boostHeat / 2f; - Draw.rect(mech.iconRegion, x + offsetX * scl, y + offsetY * scl).rot(rotation - 90); + Draw.rect(mech.iconRegion, x + offsetX * scl, y + offsetY * scl, rotation - 90); } @Override @@ -322,10 +322,10 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra Draw.rect(mech.legRegion, x + Angles.trnsx(baseRotation, ft * i + boostTrnsY, -boostTrnsX * i), y + Angles.trnsy(baseRotation, ft * i + boostTrnsY, -boostTrnsX * i), - mech.legRegion.getWidth() * i, mech.legRegion.getHeight() - Mathf.clamp(ft * i, 0, 2)).rot(baseRotation - 90 + boostAng * i); + mech.legRegion.getWidth() * i, mech.legRegion.getHeight() - Mathf.clamp(ft * i, 0, 2), baseRotation - 90 + boostAng * i); } - Draw.rect(mech.baseRegion, x, y).rot(baseRotation - 90); + Draw.rect(mech.baseRegion, x, y, baseRotation - 90); } if(floor.isLiquid){ @@ -334,7 +334,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra Draw.tint(Color.WHITE); } - Draw.rect(mech.region, x, y).rot(rotation - 90); + Draw.rect(mech.region, x, y, rotation - 90); mech.draw(this); @@ -343,7 +343,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra float w = i > 0 ? -mech.weapon.equipRegion.getWidth() : mech.weapon.equipRegion.getWidth(); Draw.rect(mech.weapon.equipRegion, x + Angles.trnsx(tra, (mech.weaponOffsetX + mech.spreadX(this)) * i, trY), - y + Angles.trnsy(tra, (mech.weaponOffsetX + mech.spreadX(this)) * i, trY), w, mech.weapon.equipRegion.getHeight()).rot(rotation - 90); + y + Angles.trnsy(tra, (mech.weaponOffsetX + mech.spreadX(this)) * i, trY), w, mech.weapon.equipRegion.getHeight(), rotation - 90); } float backTrns = 4f, itemSize = 5f; @@ -357,7 +357,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra Draw.rect(stack.item.region, x + Angles.trnsx(rotation + 180f + angT, backTrns + lenT), y + Angles.trnsy(rotation + 180f + angT, backTrns + lenT), - itemSize, itemSize).rot(rotation); + itemSize, itemSize, rotation); } } @@ -370,7 +370,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Time.time(), healthf() * 5f, 1f - healthf())); Draw.alpha(hitTime / hitDuration); - Draw.rect(getPowerCellRegion(), x + Angles.trnsx(rotation, mech.cellTrnsY, 0f), y + Angles.trnsy(rotation, mech.cellTrnsY, 0f)).rot(rotation - 90); + Draw.rect(getPowerCellRegion(), x + Angles.trnsx(rotation, mech.cellTrnsY, 0f), y + Angles.trnsy(rotation, mech.cellTrnsY, 0f), rotation - 90); Draw.color(); } @@ -406,7 +406,9 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra font.setUseIntegerPositions(false); font.getData().setScale(0.25f / io.anuke.arc.scene.ui.layout.Unit.dp.scl(1f)); layout.setText(font, name); - Fill.rect().center(x, y + 8 - layout.height / 2, layout.width + 2, layout.height + 3).color(0f, 0f, 0f, 0.3f); + Draw.color(0f, 0f, 0f, 0.3f); + Fill.rect(x, y + 8 - layout.height / 2, layout.width + 2, layout.height + 3); + Draw.color(); font.setColor(color); font.draw(name, x, y + 8, 0, Align.center, false); @@ -414,9 +416,9 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra if(isAdmin){ float s = 3f; Draw.color(color.r * 0.5f, color.g * 0.5f, color.b * 0.5f, 1f); - Draw.rect("icon-admin-small", x + layout.width / 2f + 2 + 1, y + 6.5f, s, s); + Draw.rect(Core.atlas.find("icon-admin-small"), x + layout.width / 2f + 2 + 1, y + 6.5f, s, s); Draw.color(color); - Draw.rect("icon-admin-small", x + layout.width / 2f + 2 + 1, y + 7f, s, s); + Draw.rect(Core.atlas.find("icon-admin-small"), x + layout.width / 2f + 2 + 1, y + 7f, s, s); } Draw.reset(); diff --git a/core/src/io/anuke/mindustry/entities/Unit.java b/core/src/io/anuke/mindustry/entities/Unit.java index 88217b73b8..1c3d4c6660 100644 --- a/core/src/io/anuke/mindustry/entities/Unit.java +++ b/core/src/io/anuke/mindustry/entities/Unit.java @@ -320,7 +320,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ public void drawStats(){ Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Time.time(), healthf()*5f, 1f - healthf())); Draw.alpha(hitTime); - Draw.rect(getPowerCellRegion(), x, y).rot(rotation - 90); + Draw.rect(getPowerCellRegion(), x, y, rotation - 90); Draw.color(); } @@ -336,7 +336,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ } public void drawShadow(float offsetX, float offsetY){ - Draw.rect(getIconRegion(), x + offsetX, y + offsetY).rot(rotation - 90); + Draw.rect(getIconRegion(), x + offsetX, y + offsetY, rotation - 90); } public void drawView(){ diff --git a/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java index 7bbba4afeb..6a317f0882 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java @@ -34,9 +34,9 @@ public class ArtilleryBulletType extends BasicBulletType{ float height = bulletHeight * ((1f - bulletShrink) + bulletShrink * b.fout()); Draw.color(backColor); - Draw.rect(backRegion, b.x, b.y, bulletWidth * scale, height * scale).rot(b.angle() - 90); + Draw.rect(backRegion, b.x, b.y, bulletWidth * scale, height * scale, b.angle() - 90); Draw.color(frontColor); - Draw.rect(frontRegion, b.x, b.y, bulletWidth * scale, height * scale).rot(b.angle() - 90); + Draw.rect(frontRegion, b.x, b.y, bulletWidth * scale, height * scale, b.angle() - 90); Draw.color(); } } diff --git a/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java index 44e437f4de..7f3ca88aeb 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java @@ -57,9 +57,9 @@ public class BasicBulletType extends BulletType{ float height = bulletHeight * ((1f - bulletShrink) + bulletShrink * b.fout()); Draw.color(backColor); - Draw.rect(backRegion, b.x, b.y, bulletWidth, height).rot(b.angle() - 90); + Draw.rect(backRegion, b.x, b.y, bulletWidth, height, b.angle() - 90); Draw.color(frontColor); - Draw.rect(frontRegion, b.x, b.y, bulletWidth, height).rot(b.angle() - 90); + Draw.rect(frontRegion, b.x, b.y, bulletWidth, height, b.angle() - 90); Draw.color(); } diff --git a/core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java b/core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java index 6ea1f5ca9e..51dda93718 100644 --- a/core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java +++ b/core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java @@ -26,6 +26,6 @@ public class RubbleDecal extends Decal{ return; } - Draw.rect(region, x, y).rot(Mathf.randomSeed(id, 0, 4) * 90); + Draw.rect(region, x, y, Mathf.randomSeed(id, 0, 4) * 90); } } diff --git a/core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java b/core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java index 98ae43bc86..ced259f6e9 100644 --- a/core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java +++ b/core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java @@ -36,8 +36,7 @@ public class ScorchDecal extends Decal{ TextureRegion region = regions[Mathf.randomSeed(id - i, 0, scorches - 1)]; float rotation = Mathf.randomSeed(id + i, 0, 360); float space = 1.5f + Mathf.randomSeed(id + i + 1, 0, 20) / 10f; - Draw.rect(region, x + Angles.trnsx(rotation, space), y + Angles.trnsy(rotation, space) + region.getHeight()/2f) - .origin(region.getWidth()/2f, 0).rot(rotation - 90); + Draw.rect(region, x + Angles.trnsx(rotation, space), y + Angles.trnsy(rotation, space) + region.getHeight()/2f, region.getWidth()/2f, 0, rotation - 90); } } } diff --git a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java index 5e6afa85ca..d73b42bccc 100644 --- a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java @@ -216,7 +216,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ Draw.rect(stack.item.region, x + Angles.trnsx(rotation + 180f + angT, backTrns + lenT), y + Angles.trnsy(rotation + 180f + angT, backTrns + lenT), - itemSize, itemSize).rot(rotation); + itemSize, itemSize, rotation); } } } diff --git a/core/src/io/anuke/mindustry/entities/units/FlyingUnit.java b/core/src/io/anuke/mindustry/entities/units/FlyingUnit.java index 2db599d42d..bc9e172d59 100644 --- a/core/src/io/anuke/mindustry/entities/units/FlyingUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/FlyingUnit.java @@ -164,7 +164,7 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{ public void draw(){ Draw.alpha(hitTime / hitDuration); - Draw.rect(type.name, x, y).rot(rotation - 90); + Draw.rect(type.name, x, y, rotation - 90); drawItems(); diff --git a/core/src/io/anuke/mindustry/entities/units/GroundUnit.java b/core/src/io/anuke/mindustry/entities/units/GroundUnit.java index 122fec1238..d5d965215a 100644 --- a/core/src/io/anuke/mindustry/entities/units/GroundUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/GroundUnit.java @@ -154,7 +154,7 @@ public abstract class GroundUnit extends BaseUnit{ Draw.rect(type.legRegion, x + Angles.trnsx(baseRotation, ft * i), y + Angles.trnsy(baseRotation, ft * i), - 12f * i, 12f - Mathf.clamp(ft * i, 0, 2)).rot(baseRotation - 90); + 12f * i, 12f - Mathf.clamp(ft * i, 0, 2), baseRotation - 90); } if(floor.isLiquid){ @@ -163,16 +163,16 @@ public abstract class GroundUnit extends BaseUnit{ Draw.tint(Color.WHITE); } - Draw.rect(type.baseRegion, x, y).rot(baseRotation - 90); + Draw.rect(type.baseRegion, x, y, baseRotation - 90); - Draw.rect(type.region, x, y).rot(rotation - 90); + Draw.rect(type.region, x, y, rotation - 90); for(int i : Mathf.signs){ float tra = rotation - 90, trY = -weapon.getRecoil(this, i > 0) + type.weaponOffsetY; float w = i > 0 ? -12 : 12; Draw.rect(weapon.equipRegion, x + Angles.trnsx(tra, type.weaponOffsetX * i, trY), - y + Angles.trnsy(tra, type.weaponOffsetX * i, trY), w, 12).rot(rotation - 90); + y + Angles.trnsy(tra, type.weaponOffsetX * i, trY), w, 12, rotation - 90); } drawItems(); diff --git a/core/src/io/anuke/mindustry/game/Saves.java b/core/src/io/anuke/mindustry/game/Saves.java index ba93efea35..d1c42703f4 100644 --- a/core/src/io/anuke/mindustry/game/Saves.java +++ b/core/src/io/anuke/mindustry/game/Saves.java @@ -142,7 +142,7 @@ public class Saves{ IntArray result = new IntArray(saves.size); for(int i = 0; i < saves.size; i++) result.add(saves.get(i).index); - Core.settings.put("save-slots", result); + Core.settings.putObject("save-slots", result); Core.settings.save(); } diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index 49d256f535..a7ed0b65ae 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.graphics; -import io.anuke.arc.Core; import io.anuke.arc.Events; import io.anuke.arc.collection.Array; import io.anuke.arc.collection.IntSet; @@ -58,7 +57,7 @@ public class BlockRenderer{ public void drawShadows(){ Draw.color(0, 0, 0, 0.15f); - Draw.rect().tex(shadows.getTexture()).center( + Draw.rect(Draw.wrap(shadows.getTexture()), camera.position.x - camera.position.x % tilesize, camera.position.y - camera.position.y % tilesize, shadows.getWidth(), -shadows.getHeight()); @@ -90,7 +89,7 @@ public class BlockRenderer{ requestidx = 0; Draw.flush(); - Core.graphics.batch().getProjection() + Draw.proj() .setOrtho(Mathf.round(camera.position.x, tilesize)-shadowW/2f, Mathf.round(camera.position.y, tilesize)-shadowH/2f, shadowW, shadowH); @@ -141,7 +140,7 @@ public class BlockRenderer{ shadows.end(); Draw.flush(); - Draw.projection(camera.projection()); + Draw.proj(camera.projection()); Sort.instance().sort(requests.items, 0, requestidx); diff --git a/core/src/io/anuke/mindustry/graphics/FloorRenderer.java b/core/src/io/anuke/mindustry/graphics/FloorRenderer.java index 6dcb73b6d5..2c50f11638 100644 --- a/core/src/io/anuke/mindustry/graphics/FloorRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/FloorRenderer.java @@ -7,11 +7,9 @@ import io.anuke.arc.collection.IntSet; import io.anuke.arc.collection.IntSet.IntSetIterator; import io.anuke.arc.collection.ObjectSet; import io.anuke.arc.graphics.Camera; -import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.GL20; import io.anuke.arc.graphics.g2d.CacheBatch; import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.Fill; import io.anuke.arc.graphics.g2d.SpriteBatch; import io.anuke.arc.math.Mathf; import io.anuke.arc.util.Log; @@ -145,12 +143,6 @@ public class FloorRenderer{ layer.end(); } - private void fillChunk(float x, float y){ - Draw.color(Color.BLACK); - Fill.rect().set(x, y, chunksize * tilesize, chunksize * tilesize); - Draw.color(); - } - private void cacheChunk(int cx, int cy){ Chunk chunk = cache[cx][cy]; @@ -174,8 +166,10 @@ public class FloorRenderer{ } private void cacheChunkLayer(int cx, int cy, Chunk chunk, CacheLayer layer){ - SpriteBatch current = Core.graphics.batch(); - Core.graphics.useBatch(cbatch); + SpriteBatch current = Core.batch; + Core.batch = cbatch; + + cbatch.beginCache(); for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){ for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize; tiley++){ @@ -195,8 +189,8 @@ public class FloorRenderer{ } } } - Core.graphics.useBatch(current); - chunk.caches[layer.ordinal()] = cbatch.flushCache(); + Core.batch = current; + chunk.caches[layer.ordinal()] = cbatch.endCache(); } public void clearTiles(){ diff --git a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java index 017a653340..95d386f8eb 100644 --- a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java @@ -8,6 +8,7 @@ import io.anuke.arc.graphics.Pixmap.Format; import io.anuke.arc.graphics.Pixmaps; import io.anuke.arc.graphics.Texture; import io.anuke.arc.graphics.g2d.Draw; +import io.anuke.arc.graphics.g2d.Fill; import io.anuke.arc.graphics.g2d.ScissorStack; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.math.Mathf; @@ -81,7 +82,7 @@ public class MinimapRenderer implements Disposable{ for(Unit unit : units){ float rx = (unit.x - rect.x) / rect.width * w, ry = (unit.y - rect.y) / rect.width * h; Draw.color(unit.getTeam().color); - Draw.rect().tex(Core.atlas.white()).set(x + rx, y + ry, w / (sz * 2), h / (sz * 2)); + Fill.crect(x + rx, y + ry, w / (sz * 2), h / (sz * 2)); } Draw.color(); diff --git a/core/src/io/anuke/mindustry/graphics/Shapes.java b/core/src/io/anuke/mindustry/graphics/Shapes.java index bc460b89b2..0faf484d8f 100644 --- a/core/src/io/anuke/mindustry/graphics/Shapes.java +++ b/core/src/io/anuke/mindustry/graphics/Shapes.java @@ -26,14 +26,13 @@ public class Shapes{ TextureRegion region = Core.atlas.find(edge); - Draw.rect(edge, x, y, region.getWidth() * Draw.scl, region.getHeight() * scale * Draw.scl).rot(rotation + 180); + Draw.rect(Core.atlas.find(edge), x, y, region.getWidth() * Draw.scl, region.getHeight() * scale * Draw.scl, rotation + 180); - Draw.rect(edge, x2, y2, region.getWidth() * Draw.scl, region.getHeight() * scale * Draw.scl).rot(rotation); + Draw.rect(Core.atlas.find(edge), x2, y2, region.getWidth() * Draw.scl, region.getHeight() * scale * Draw.scl, rotation); } public static void tri(float x, float y, float width, float length, float rotation){ float oy = 17f / 63f * length; - Core.graphics.batch().draw().tex(Core.atlas.find("shape-3")).pos(x - width / 2f, y - oy) - .origin(width / 2f, oy).size(width, length).rot(rotation - 90); + Draw.rect(Core.atlas.find("shape-3"), x, y - oy + length/2f, width, length, width / 2f, oy, rotation - 90); } } diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index 39b02e6482..9402a8da40 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -49,7 +49,7 @@ public class DesktopInput extends InputHandler{ for(TextureRegion region : regions){ Draw.rect(region, x * tilesize + block.offset(), y * tilesize + block.offset(), - region.getWidth() * selectScale, region.getHeight() * selectScale).rot(block.rotate ? rotation * 90 : 0); + region.getWidth() * selectScale, region.getHeight() * selectScale, block.rotate ? rotation * 90 : 0); } }else{ Draw.color(Palette.removeBack); @@ -79,8 +79,10 @@ public class DesktopInput extends InputHandler{ if(i + recipe.result.size > result.getLength() && recipe.result.rotate){ Draw.color(!validPlace(x, y, recipe.result, result.rotation) ? Palette.remove : Palette.placeRotate); - Draw.rect("place-arrow", x * tilesize + recipe.result.offset(), - y * tilesize + recipe.result.offset()).origin(x * tilesize + recipe.result.offset()/2f, 0f).rot(result.rotation * 90 - 90); + Draw.rect(Core.atlas.find("place-arrow"), x * tilesize + recipe.result.offset(), + y * tilesize + recipe.result.offset(), + Core.atlas.find("place-arrow").getWidth() * Draw.scl, Core.atlas.find("place-arrow").getHeight() * Draw.scl, + x * tilesize + recipe.result.offset()/2f, 0f, result.rotation * 90 - 90); } drawPlace(x, y, recipe.result, result.rotation); @@ -111,8 +113,11 @@ public class DesktopInput extends InputHandler{ }else if(isPlacing()){ if(recipe.result.rotate){ Draw.color(!validPlace(cursorX, cursorY, recipe.result, rotation) ? Palette.remove : Palette.placeRotate); - Draw.rect("place-arrow", cursorX * tilesize + recipe.result.offset(), - cursorY * tilesize + recipe.result.offset()).origin(cursorX * tilesize + recipe.result.offset()/2f, 0).rot(rotation * 90 - 90); + Draw.rect(Core.atlas.find("place-arrow"), cursorX * tilesize + recipe.result.offset(), + cursorY * tilesize + recipe.result.offset(), + Core.atlas.find("place-arrow").getWidth() * Draw.scl, + Core.atlas.find("place-arrow").getHeight() * Draw.scl, + cursorX * tilesize + recipe.result.offset()/2f, 0, rotation * 90 - 90); } drawPlace(cursorX, cursorY, recipe.result, rotation); recipe.result.drawPlace(cursorX, cursorY, rotation, validPlace(cursorX, cursorY, recipe.result, rotation)); diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index c4e1450586..2dcaafd89f 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -178,8 +178,8 @@ public class MobileInput extends InputHandler implements GestureListener{ for(TextureRegion region : regions){ Draw.rect(region, tile.worldx() + offset, tile.worldy() + offset, - region.getWidth() * request.scale, region.getHeight() * request.scale) - .rot(request.recipe.result.rotate ? request.rotation * 90 : 0); + region.getWidth() * request.scale, region.getHeight() * request.scale, + request.recipe.result.rotate ? request.rotation * 90 : 0); } }else{ float rad = (tile.block().size * tilesize / 2f - 1) * request.scale; @@ -346,8 +346,7 @@ public class MobileInput extends InputHandler implements GestureListener{ for(TextureRegion region : regions){ Draw.rect(region, x * tilesize + recipe.result.offset(), y * tilesize + recipe.result.offset(), - region.getWidth() * lineScale, region.getHeight() * lineScale) - .rot(recipe.result.rotate ? result.rotation * 90 : 0); + region.getWidth() * lineScale, region.getHeight() * lineScale, recipe.result.rotate ? result.rotation * 90 : 0); } }else{ Draw.color(Palette.removeBack); diff --git a/core/src/io/anuke/mindustry/maps/missions/BlockLocMission.java b/core/src/io/anuke/mindustry/maps/missions/BlockLocMission.java index 929c9b07af..2929e86e4a 100644 --- a/core/src/io/anuke/mindustry/maps/missions/BlockLocMission.java +++ b/core/src/io/anuke/mindustry/maps/missions/BlockLocMission.java @@ -42,18 +42,18 @@ public class BlockLocMission extends Mission{ if(block.rotate){ Draw.colorl(0.4f); - Draw.rect("icon-arrow", x * tilesize + block.offset(), y * tilesize + block.offset() - 1f).rot(rotation*90); + Draw.rect(Core.atlas.find("icon-arrow"), x * tilesize + block.offset(), y * tilesize + block.offset() - 1f, rotation*90); Draw.colorl(0.6f); - Draw.rect("icon-arrow", x * tilesize + block.offset(), y * tilesize + block.offset()).rot(rotation*90); + Draw.rect(Core.atlas.find("icon-arrow"), x * tilesize + block.offset(), y * tilesize + block.offset(), rotation*90); } float rot = players[0].angleTo(x * tilesize + block.offset(), y * tilesize + block.offset()); float len = 12f; Draw.color(Palette.accentBack); - Draw.rect("icon-arrow", players[0].x + Angles.trnsx(rot, len), players[0].y + Angles.trnsy(rot, len)).rot(rot); + Draw.rect(Core.atlas.find("icon-arrow"), players[0].x + Angles.trnsx(rot, len), players[0].y + Angles.trnsy(rot, len), rot); Draw.color(Palette.accent); - Draw.rect("icon-arrow", players[0].x + Angles.trnsx(rot, len), players[0].y + Angles.trnsy(rot, len) + 1f).rot(rot); + Draw.rect(Core.atlas.find("icon-arrow"), players[0].x + Angles.trnsx(rot, len), players[0].y + Angles.trnsy(rot, len) + 1f, rot); Draw.reset(); } diff --git a/core/src/io/anuke/mindustry/ui/GridImage.java b/core/src/io/anuke/mindustry/ui/GridImage.java index f0e6704cb7..fd164cc191 100644 --- a/core/src/io/anuke/mindustry/ui/GridImage.java +++ b/core/src/io/anuke/mindustry/ui/GridImage.java @@ -23,11 +23,11 @@ public class GridImage extends Element{ int jumpy = (int) (Math.max(minspace, yspace) / yspace); for(int x = 0; x <= imageWidth; x += jumpx){ - Fill.rect().set((int) (getX() + xspace * x - s), getY() - s, 2, getHeight() + (x == imageWidth ? 1 : 0)); + Fill.crect((int) (getX() + xspace * x - s), getY() - s, 2, getHeight() + (x == imageWidth ? 1 : 0)); } for(int y = 0; y <= imageHeight; y += jumpy){ - Fill.rect().set(getX() - s, (int) (getY() + y * yspace - s), getWidth(), 2); + Fill.crect(getX() - s, (int) (getY() + y * yspace - s), getWidth(), 2); } } diff --git a/core/src/io/anuke/mindustry/ui/Minimap.java b/core/src/io/anuke/mindustry/ui/Minimap.java index da07bdc36e..243e8039da 100644 --- a/core/src/io/anuke/mindustry/ui/Minimap.java +++ b/core/src/io/anuke/mindustry/ui/Minimap.java @@ -18,7 +18,7 @@ public class Minimap extends Container{ public void draw(){ if(renderer.minimap.getRegion() == null) return; - Draw.rect().tex(renderer.minimap.getRegion()).set(x, y, width, height); + Draw.rect(renderer.minimap.getRegion(), x + width/2f, y + height/2f, width, height); if(renderer.minimap.getTexture() != null){ renderer.minimap.drawEntities(x, y, width, height); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/GenViewDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/GenViewDialog.java index 1b59bfd1f0..484e8cad28 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/GenViewDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/GenViewDialog.java @@ -99,7 +99,7 @@ public class GenViewDialog extends FloatingDialog{ float drawX = x + width/2f+ wx * padSectorSize - tx * padSectorSize - panX % padSectorSize; float drawY = y + height/2f + wy * padSectorSize - ty * padSectorSize - panY % padSectorSize; - Draw.rect().tex(map.get(wx, wy)).set(drawX, drawY, padSectorSize, padSectorSize); + Draw.rect(Draw.wrap(map.get(wx, wy)), drawX + padSectorSize/2f, drawY + padSectorSize/2f, padSectorSize, padSectorSize); } } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SectorsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SectorsDialog.java index 36e378265c..32c7cfda8f 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SectorsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SectorsDialog.java @@ -202,13 +202,13 @@ public class SectorsDialog extends FloatingDialog{ if(sector == null || sector.texture == null){ Draw.reset(); - Draw.rect("empty-sector", drawX, drawY, sectorSize, sectorSize); + Draw.rect(("empty-sector"), drawX, drawY, sectorSize, sectorSize); int i = 0; for(Point2 point : Geometry.d4){ Sector other = world.sectors.get(sectorX + point.x, sectorY + point.y); if(other != null){ - Draw.rect("sector-edge", drawX, drawY, sectorSize, sectorSize).rot(i*90); + Draw.rect(("sector-edge"), drawX, drawY, sectorSize, sectorSize, i*90); } i ++; @@ -217,7 +217,7 @@ public class SectorsDialog extends FloatingDialog{ } Draw.colorl(!sector.complete ? 0.3f : 1f); - Draw.rect().tex(sector.texture).center(drawX, drawY, sectorSize, sectorSize); + Draw.rect(Draw.wrap(sector.texture), drawX, drawY, sectorSize, sectorSize); if(sector.missions.size == 0) continue; @@ -250,16 +250,16 @@ public class SectorsDialog extends FloatingDialog{ } Draw.color(selectColor); - Draw.rect("sector-select", drawX, drawY, sectorSize, sectorSize); + Draw.rect(("sector-select"), drawX, drawY, sectorSize, sectorSize); Draw.color(backColor); Draw.alpha(0.75f * backColor.a); - Draw.rect("icon-mission-background", drawX, drawY, Unit.dp.scl(18f * 5), Unit.dp.scl(18f * 5)); + Draw.rect(("icon-mission-background"), drawX, drawY, Unit.dp.scl(18f * 5), Unit.dp.scl(18f * 5)); float size = Unit.dp.scl(10f * 5); Draw.color(iconColor); - Draw.rect(region, drawX, drawY, size, size); + Draw.rect((region), drawX, drawY, size, size); } } diff --git a/core/src/io/anuke/mindustry/ui/fragments/BackgroundFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BackgroundFragment.java index 57c915f45b..2bd684e2f1 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BackgroundFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BackgroundFragment.java @@ -7,7 +7,6 @@ import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.scene.Group; import io.anuke.arc.scene.ui.layout.Unit; import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Shaders; import static io.anuke.mindustry.Vars.state; @@ -18,12 +17,10 @@ public class BackgroundFragment extends Fragment{ public void build(Group parent){ Core.scene.table().addRect((a, b, w, h) -> { Draw.colorl(0.1f); - Fill.rect().set(0, 0, w, h); - Draw.color(Palette.accent); + Fill.rect(0, 0, w, h); Draw.shader(Shaders.menu); - Fill.rect().set(0, 0, w, h); + Fill.rect(0, 0, w, h); Draw.shader(); - Draw.color(); boolean portrait = Core.graphics.getWidth() < Core.graphics.getHeight(); float logoscl = (int) Unit.dp.scl(7) * (portrait ? 5f / 7f : 1f); @@ -32,7 +29,7 @@ public class BackgroundFragment extends Fragment{ float logoh = logo.getHeight() * logoscl; Draw.color(); - Draw.rect().tex(logo).set((int) (w / 2 - logow / 2), (int) (h - logoh + 15 - Unit.dp.scl(portrait ? 30f : 0)), logow, logoh); + Draw.rect(logo, (int) (w / 2 - logow / 2), (int) (h - logoh + 15 - Unit.dp.scl(portrait ? 30f : 0)), logow, logoh); }).visible(() -> state.is(State.menu)).grow(); } } diff --git a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java b/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java index 478eb262fd..c3c31902ed 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java @@ -158,7 +158,7 @@ public class ChatFragment extends Table{ Draw.color(shadowColor); if(chatOpen){ - Fill.rect().set(offsetx, chatfield.getY(), chatfield.getWidth() + 15f, chatfield.getHeight() - 1); + Fill.crect(offsetx, chatfield.getY(), chatfield.getWidth() + 15f, chatfield.getHeight() - 1); } super.draw(); @@ -185,7 +185,7 @@ public class ChatFragment extends Table{ Draw.color(0, 0, 0, shadowColor.a * (fadetime - i)); } - Fill.rect().set(offsetx, theight - layout.height - 2, textWidth + Unit.dp.scl(4f), layout.height + textspacing); + Fill.crect(offsetx, theight - layout.height - 2, textWidth + Unit.dp.scl(4f), layout.height + textspacing); Draw.color(shadowColor); font.getCache().draw(); diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index a0743fc413..dce5a18421 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -509,7 +509,7 @@ public class Block extends BaseBlock { } public void draw(Tile tile){ - Draw.rect(region, tile.drawx(), tile.drawy()).rot(rotate ? tile.getRotation() * 90 : 0); + Draw.rect(region, tile.drawx(), tile.drawy(), rotate ? tile.getRotation() * 90 : 0); } public void drawNonLayer(Tile tile){ diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index 5992a38ecd..65e84a528b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -129,7 +129,7 @@ public class BuildBlock extends Block{ if(entity.previous == null) return; for(TextureRegion region : entity.previous.getBlockIcon()){ - Draw.rect(region, tile.drawx(), tile.drawy()).rot(entity.previous.rotate ? tile.getRotation() * 90 : 0); + Draw.rect(region, tile.drawx(), tile.drawy(), entity.previous.rotate ? tile.getRotation() * 90 : 0); } } @@ -149,7 +149,7 @@ public class BuildBlock extends Block{ Shaders.blockbuild.progress = entity.progress; Shaders.blockbuild.apply(); - Draw.rect(region, tile.drawx(), tile.drawy()).rot(target.rotate ? tile.getRotation() * 90 : 0); + Draw.rect(region, tile.drawx(), tile.drawy(), target.rotate ? tile.getRotation() * 90 : 0); Draw.flush(); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/Floor.java b/core/src/io/anuke/mindustry/world/blocks/Floor.java index 9287c932bc..04ed73669a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Floor.java +++ b/core/src/io/anuke/mindustry/world/blocks/Floor.java @@ -141,13 +141,13 @@ public class Floor extends Block{ boolean above = (tile.getCliffs() & (1 << ((i + 1) % 4) * 2)) != 0, below = (tile.getCliffs() & (1 << (Mathf.mod(i - 1, 4)) * 2)) != 0; if(above && below){ - Draw.rect(cliffRegions[0], tile.worldx(), tile.worldy()).rot(i * 90); + Draw.rect(cliffRegions[0], tile.worldx(), tile.worldy(), i * 90); }else if(above){ - Draw.rect(cliffRegions[1], tile.worldx(), tile.worldy()).rot(i * 90); + Draw.rect(cliffRegions[1], tile.worldx(), tile.worldy(), i * 90); }else if(below){ - Draw.rect(cliffRegions[2], tile.worldx(), tile.worldy()).rot(i * 90); + Draw.rect(cliffRegions[2], tile.worldx(), tile.worldy(), i * 90); }else{ - Draw.rect(cliffRegions[3], tile.worldx(), tile.worldy()).rot(i * 90); + Draw.rect(cliffRegions[3], tile.worldx(), tile.worldy(), i * 90); } } } @@ -178,7 +178,7 @@ public class Floor extends Block{ TextureRegion region = floor.edgeRegions[i]; - Draw.rect().tex(region).set(tile.worldx() + floor.offsets[i].x, tile.worldy() + floor.offsets[i].y, region.getWidth(), region.getHeight()); + Draw.rect(region, tile.worldx() + floor.offsets[i].x, tile.worldy() + floor.offsets[i].y, region.getWidth(), region.getHeight()); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/LiquidBlock.java b/core/src/io/anuke/mindustry/world/blocks/LiquidBlock.java index 6aaff026af..939da4b122 100644 --- a/core/src/io/anuke/mindustry/world/blocks/LiquidBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/LiquidBlock.java @@ -40,15 +40,15 @@ public class LiquidBlock extends Block{ int rotation = rotate ? tile.getRotation() * 90 : 0; - Draw.rect(bottomRegion, tile.drawx(), tile.drawy()).rot(rotation); + Draw.rect(bottomRegion, tile.drawx(), tile.drawy(), rotation); if(mod.total() > 0.001f){ Draw.color(mod.current().color); Draw.alpha(mod.total() / liquidCapacity); - Draw.rect(liquidRegion, tile.drawx(), tile.drawy()).rot(rotation); + Draw.rect(liquidRegion, tile.drawx(), tile.drawy(), rotation); Draw.color(); } - Draw.rect(topRegion, tile.drawx(), tile.drawy()).rot(rotation); + Draw.rect(topRegion, tile.drawx(), tile.drawy(), rotation); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java b/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java index 544f0eee14..5a857f18e9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java @@ -36,7 +36,9 @@ public class DeflectorWall extends Wall{ Draw.color(Color.WHITE); Draw.alpha(entity.hit * 0.5f); - Draw.rect("blank", tile.drawx(), tile.drawy(), tilesize * size, tilesize * size).blend(Blending.additive); + Draw.blend(Blending.additive); + Draw.rect("blank", tile.drawx(), tile.drawy(), tilesize * size, tilesize * size); + Draw.blend(); Draw.reset(); entity.hit = Mathf.clamp(entity.hit - Time.delta() / hitTime); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java index 6b91b63fe0..b37ddd2386 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java @@ -175,7 +175,9 @@ public class ForceProjector extends Block { if(entity.buildup <= 0f) return; Draw.alpha(entity.buildup / breakage * 0.75f); - Draw.rect(topRegion, tile.drawx(), tile.drawy()).blend(Blending.additive); + Draw.blend(Blending.additive); + Draw.rect(topRegion, tile.drawx(), tile.drawy()); + Draw.blend(); Draw.reset(); } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java index 55cc4b4437..ba90b43967 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java @@ -112,7 +112,9 @@ public class MendProjector extends Block{ Draw.color(color, phase, entity.phaseHeat); Draw.alpha(entity.heat * Mathf.absin(Time.time(), 10f, 1f) * 0.5f); - Draw.rect(topRegion, tile.drawx(), tile.drawy()).blend(Blending.additive); + Draw.blend(Blending.additive); + Draw.rect(topRegion, tile.drawx(), tile.drawy()); + Draw.blend(); Draw.alpha(1f); Lines.stroke((2f * f + 0.2f)* entity.heat); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java index 795fde22b8..8877c2a3d9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java @@ -115,7 +115,9 @@ public class OverdriveProjector extends Block{ Draw.color(color, phase, entity.phaseHeat); Draw.alpha(entity.heat * Mathf.absin(Time.time(), 10f, 1f) * 0.5f); - Draw.rect(topRegion, tile.drawx(), tile.drawy()).blend(Blending.additive); + Draw.blend(Blending.additive); + Draw.rect(topRegion, tile.drawx(), tile.drawy()); + Draw.blend(); Draw.alpha(1f); Lines.stroke((2f * f + 0.2f)* entity.heat); Lines.circle(tile.drawx(), tile.drawy(), (1f-f) * 9f); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java b/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java index 20963583ed..e8f0f2151f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java @@ -34,7 +34,7 @@ public class ShockMine extends Block{ super.draw(tile); Draw.color(tile.getTeam().color); Draw.alpha(0.22f); - Fill.rect().center(tile.drawx(), tile.drawy(), 2f, 2f); + Fill.rect(tile.drawx(), tile.drawy(), 2f, 2f); Draw.color(); } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java index 64c01166fc..7177a189d3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java @@ -75,10 +75,14 @@ public abstract class Turret extends Block{ protected TextureRegion baseTopRegion; protected BiConsumer drawer = (tile, entity) -> - Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y).rot(entity.rotation - 90); + Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); protected BiConsumer heatDrawer = (tile, entity) -> { if(entity.heat <= 0.00001f) return; - Draw.rect(heatRegion, tile.drawx() + tr2.x, tile.drawy() + tr2.y).rot(entity.rotation - 90).color(heatColor, entity.heat).blend(Blending.additive); + Draw.color(heatColor, entity.heat); + Draw.blend(Blending.additive); + Draw.rect(heatRegion, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); + Draw.blend(); + Draw.color(); }; public Turret(String name){ @@ -129,7 +133,8 @@ public abstract class Turret extends Block{ @Override public void draw(Tile tile){ Draw.rect(baseRegion, tile.drawx(), tile.drawy()); - Draw.rect(baseTopRegion, tile.drawx(), tile.drawy()).color(tile.getTeam().color, Color.WHITE, 0.45f); + Draw.color(tile.getTeam().color, Color.WHITE, 0.45f); + Draw.rect(baseTopRegion, tile.drawx(), tile.drawy()); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java index 1b87ed086c..c8d3b26201 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java @@ -45,7 +45,7 @@ public class Conduit extends LiquidBlock{ if(entity.blendshadowrot == -1){ super.drawShadow(tile); }else{ - Draw.rect("shadow-corner", tile.drawx(), tile.drawy()).rot((tile.getRotation() + 3 + entity.blendshadowrot) * 90); + Draw.rect(Core.atlas.find("shadow-corner"), tile.drawx(), tile.drawy(), (tile.getRotation() + 3 + entity.blendshadowrot) * 90); } } @@ -88,14 +88,14 @@ public class Conduit extends LiquidBlock{ int rotation = tile.getRotation() * 90; Draw.colorl(0.34f); - Draw.rect(botRegions[entity.blendbits], tile.drawx(), tile.drawy()).rot(rotation); + Draw.rect(botRegions[entity.blendbits], tile.drawx(), tile.drawy(), rotation); Draw.color(mod.current().color); Draw.alpha(entity.smoothLiquid); - Draw.rect(botRegions[entity.blendbits], tile.drawx(), tile.drawy()).rot(rotation); + Draw.rect(botRegions[entity.blendbits], tile.drawx(), tile.drawy(), rotation); Draw.color(); - Draw.rect(topRegions[entity.blendbits], tile.drawx(), tile.drawy()).rot(rotation); + Draw.rect(topRegions[entity.blendbits], tile.drawx(), tile.drawy(), rotation); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java index ff07df56ad..73ed7c7f15 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java @@ -91,7 +91,7 @@ public class Conveyor extends Block{ if(entity.blendshadowrot == -1){ super.drawShadow(tile); }else{ - Draw.rect("shadow-corner", tile.drawx(), tile.drawy()).rot((tile.getRotation() + 3 + entity.blendshadowrot) * 90); + Draw.rect(Core.atlas.find("shadow-corner"), tile.drawx(), tile.drawy(), (tile.getRotation() + 3 + entity.blendshadowrot) * 90); } } @@ -102,7 +102,7 @@ public class Conveyor extends Block{ int frame = entity.clogHeat <= 0.5f ? (int) (((Time.time() * speed * 8f * entity.timeScale)) % 4) : 0; Draw.rect(regions[Mathf.clamp(entity.blendbits, 0, regions.length - 1)][Mathf.clamp(frame, 0, regions[0].length - 1)], tile.drawx(), tile.drawy(), - tilesize * entity.blendsclx, tilesize * entity.blendscly).rot( rotation*90); + tilesize * entity.blendsclx, tilesize * entity.blendscly, rotation*90); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java index de3ba37749..1df134830f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java @@ -39,10 +39,10 @@ public class ExtendingItemBridge extends ItemBridge{ tile.worldx() + ex, tile.worldy() + ey, CapStyle.none, 0f); - Draw.rect(endRegion, tile.drawx(), tile.drawy()).rot(i * 90 + 90); + Draw.rect(endRegion, tile.drawx(), tile.drawy(), i * 90 + 90); Draw.rect(endRegion, tile.worldx() + ex + Geometry.d4[i].x * tilesize / 2f, - tile.worldy() + ey + Geometry.d4[i].y * tilesize / 2f).rot(i * 90 + 270); + tile.worldy() + ey + Geometry.d4[i].y * tilesize / 2f, i * 90 + 270); int dist = Math.max(Math.abs(other.x - tile.x), Math.abs(other.y - tile.y)); @@ -54,8 +54,7 @@ public class ExtendingItemBridge extends ItemBridge{ Draw.alpha(Mathf.absin(a / (float) arrows - entity.time / 100f, 0.1f, 1f) * entity.uptime); Draw.rect(arrowRegion, tile.worldx() + Geometry.d4[i].x * (tilesize / 2f + a * 6f + 2) * entity.uptime, - tile.worldy() + Geometry.d4[i].y * (tilesize / 2f + a * 6f + 2) * entity.uptime) - .rot(i * 90f); + tile.worldy() + Geometry.d4[i].y * (tilesize / 2f + a * 6f + 2) * entity.uptime, i * 90f); } Draw.reset(); } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java index 8321fb3b90..96b3c231c2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java @@ -216,8 +216,8 @@ public class ItemBridge extends Block{ Draw.color(Color.WHITE, Color.BLACK, Mathf.absin(Time.time(), 6f, 0.07f)); Draw.alpha(Math.max(entity.uptime, 0.25f)); - Draw.rect(endRegion, tile.drawx(), tile.drawy()).rot(i * 90 + 90); - Draw.rect(endRegion, other.drawx(), other.drawy()).rot(i * 90 + 270); + Draw.rect(endRegion, tile.drawx(), tile.drawy(), i * 90 + 90); + Draw.rect(endRegion, other.drawx(), other.drawy(), i * 90 + 270); Lines.stroke(8f); Lines.line(bridgeRegion, @@ -237,7 +237,7 @@ public class ItemBridge extends Block{ Draw.alpha(Mathf.absin(a / (float) arrows - entity.time / 100f, 0.1f, 1f) * entity.uptime); Draw.rect(arrowRegion, tile.worldx() + Geometry.d4[i].x * (tilesize / 2f + a * 4f + time % 4f), - tile.worldy() + Geometry.d4[i].y * (tilesize / 2f + a * 4f + time % 4f)).rot(i * 90f); + tile.worldy() + Geometry.d4[i].y * (tilesize / 2f + a * 4f + time % 4f), i * 90f); } Draw.reset(); } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java index e6ab3bbabc..831e3c53c2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java @@ -191,8 +191,7 @@ public class MassDriver extends Block{ Draw.rect(turretRegion, tile.drawx() + Angles.trnsx(entity.rotation + 180f, entity.reload * knockback), - tile.drawy() + Angles.trnsy(entity.rotation + 180f, entity.reload * knockback)) - .rot(entity.rotation - 90); + tile.drawy() + Angles.trnsy(entity.rotation + 180f, entity.reload * knockback), entity.rotation - 90); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/FusionReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/FusionReactor.java index aca9989b55..efd00fbe74 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/FusionReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/FusionReactor.java @@ -1,7 +1,6 @@ package io.anuke.mindustry.world.blocks.power; import io.anuke.arc.Core; -import io.anuke.arc.Graphics; import io.anuke.arc.graphics.Blending; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; @@ -85,7 +84,9 @@ public class FusionReactor extends PowerGenerator{ Draw.color(plasma1, plasma2, (float) i / plasmas); Draw.alpha((0.3f + Mathf.absin(Time.time(), 2f + i * 2f, 0.3f + i * 0.05f)) * entity.warmup); - Draw.rect(name + "-plasma-" + i, tile.drawx(), tile.drawy(), r, r).rot(Time.time() * (12 + i * 6f) * entity.warmup).blend(Blending.additive); + Draw.blend(Blending.additive); + Draw.rect(name + "-plasma-" + i, tile.drawx(), tile.drawy(), r, r, Time.time() * (12 + i * 6f) * entity.warmup); + Draw.blend(); } Draw.color(); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java index 57ae52f95d..0f11ef6345 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -97,11 +97,13 @@ public class Drill extends Block{ if(drawRim){ Draw.color(heatColor); Draw.alpha(entity.warmup * ts * (1f - s + Mathf.absin(Time.time(), 3f, s))); - Draw.rect(rimRegion, tile.drawx(), tile.drawy()).blend(Blending.additive); + Draw.blend(Blending.additive); + Draw.rect(rimRegion, tile.drawx(), tile.drawy()); + Draw.blend(); Draw.color(); } - Draw.rect(rotatorRegion, tile.drawx(), tile.drawy()).rot(entity.drillTime * rotateSpeed); + Draw.rect(rotatorRegion, tile.drawx(), tile.drawy(), entity.drillTime * rotateSpeed); Draw.rect(topRegion, tile.drawx(), tile.drawy()); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java index 514a4911a1..ebd4799505 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java @@ -44,7 +44,7 @@ public class Fracker extends SolidPump{ Draw.rect(liquidRegion, tile.drawx(), tile.drawy()); Draw.color(); - Draw.rect(rotatorRegion, tile.drawx(), tile.drawy()).rot(entity.pumpTime); + Draw.rect(rotatorRegion, tile.drawx(), tile.drawy(), entity.pumpTime); Draw.rect(topRegion, tile.drawx(), tile.drawy()); } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java b/core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java index 6c485625bd..3351217fd1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java @@ -78,16 +78,16 @@ public class LiquidMixer extends LiquidBlock{ int rotation = rotate ? tile.getRotation() * 90 : 0; - Draw.rect(bottomRegion, tile.drawx(), tile.drawy()).rot(rotation); + Draw.rect(bottomRegion, tile.drawx(), tile.drawy(), rotation); if(mod.total() > 0.001f){ Draw.color(outputLiquid.color); Draw.alpha(mod.get(outputLiquid) / liquidCapacity); - Draw.rect(liquidRegion, tile.drawx(), tile.drawy()).rot(rotation); + Draw.rect(liquidRegion, tile.drawx(), tile.drawy(), rotation); Draw.color(); } - Draw.rect(topRegion, tile.drawx(), tile.drawy()).rot(rotation); + Draw.rect(topRegion, tile.drawx(), tile.drawy(), rotation); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/production/PhaseWeaver.java b/core/src/io/anuke/mindustry/world/blocks/production/PhaseWeaver.java index 8a21fa49ce..31eb976ff3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/PhaseWeaver.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/PhaseWeaver.java @@ -50,7 +50,7 @@ public class PhaseWeaver extends PowerSmelter{ Draw.shader(Shaders.build, false); Shaders.build.apply(); - Draw.rect(weaveRegion, tile.drawx(), tile.drawy()).rot(entity.time); + Draw.rect(weaveRegion, tile.drawx(), tile.drawy(), entity.time); Draw.shader(); Draw.color(Palette.accent); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Pulverizer.java b/core/src/io/anuke/mindustry/world/blocks/production/Pulverizer.java index 39ce78e424..8ec2e1409e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Pulverizer.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Pulverizer.java @@ -25,7 +25,7 @@ public class Pulverizer extends GenericCrafter{ GenericCrafterEntity entity = tile.entity(); Draw.rect(region, tile.drawx(), tile.drawy()); - Draw.rect(rotatorRegion, tile.drawx(), tile.drawy()).rot(entity.totalProgress * 2f); + Draw.rect(rotatorRegion, tile.drawx(), tile.drawy(), entity.totalProgress * 2f); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java index aac9d6d8c9..57fc27a42f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java @@ -51,7 +51,7 @@ public class SolidPump extends Pump{ Draw.alpha(tile.entity.liquids.total() / liquidCapacity); Draw.rect(liquidRegion, tile.drawx(), tile.drawy()); Draw.color(); - Draw.rect(name + "-rotator", tile.drawx(), tile.drawy()).rot(entity.pumpTime * rotateSpeed); + Draw.rect(name + "-rotator", tile.drawx(), tile.drawy(), entity.pumpTime * rotateSpeed); Draw.rect(name + "-top", tile.drawx(), tile.drawy()); } diff --git a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java index 5f47804ce5..75d48114ec 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java @@ -111,7 +111,7 @@ public class MechPad extends Block{ Draw.color(Palette.accent); for(int i = 0; i < 4; i ++){ float length = tilesize * size/2f + 3 + Mathf.absin(Time.time(), 5f, 2f); - Draw.rect("transfer-arrow", tile.drawx() + Geometry.d4[i].x * length, tile.drawy() + Geometry.d4[i].y * length).rot((i+2) * 90); + Draw.rect("transfer-arrow", tile.drawx() + Geometry.d4[i].x * length, tile.drawy() + Geometry.d4[i].y * length, (i+2) * 90); } Draw.color(); } @@ -142,7 +142,7 @@ public class MechPad extends Block{ public void draw(Tile tile){ MechFactoryEntity entity = tile.entity(); - Draw.rect(Core.atlas.find(name), tile.drawx(), tile.drawy()).rot(entity.open ? 180f : 0f); + Draw.rect(Core.atlas.find(name), tile.drawx(), tile.drawy(), entity.open ? 180f : 0f); if(entity.player != null){ TextureRegion region = mech.iconRegion; diff --git a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java index cf93041a76..3a6a38cd61 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java @@ -60,7 +60,7 @@ public class RepairPoint extends Block{ public void drawLayer(Tile tile){ RepairPointEntity entity = tile.entity(); - Draw.rect(topRegion, tile.drawx(), tile.drawy()).rot(entity.rotation - 90); + Draw.rect(topRegion, tile.drawx(), tile.drawy(), entity.rotation - 90); } @Override diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index b93858e166..28179d163b 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -3,8 +3,8 @@ package io.anuke.mindustry.desktop; import io.anuke.arc.ApplicationListener; import io.anuke.arc.backends.lwjgl3.Lwjgl3Application; import io.anuke.arc.backends.lwjgl3.Lwjgl3ApplicationConfiguration; -import io.anuke.kryonet.KryoClient; -import io.anuke.kryonet.KryoServer; +import io.anuke.net.KryoClient; +import io.anuke.net.KryoServer; import io.anuke.mindustry.Mindustry; import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.net.Net; diff --git a/ios/src/io/anuke/mindustry/IOSLauncher.java b/ios/src/io/anuke/mindustry/IOSLauncher.java index 8ed13f374b..b8bdb66dda 100644 --- a/ios/src/io/anuke/mindustry/IOSLauncher.java +++ b/ios/src/io/anuke/mindustry/IOSLauncher.java @@ -1,18 +1,17 @@ package io.anuke.mindustry; -import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.iosrobovm.IOSApplication; import com.badlogic.gdx.backends.iosrobovm.IOSApplicationConfiguration; -import com.badlogic.gdx.files.FileHandle; -import io.anuke.kryonet.KryoClient; -import io.anuke.kryonet.KryoServer; +import io.anuke.arc.Core; +import io.anuke.arc.files.FileHandle; +import io.anuke.arc.scene.ui.layout.Unit; +import io.anuke.arc.util.Strings; +import io.anuke.net.KryoClient; +import io.anuke.net.KryoServer; import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.game.Saves.SaveSlot; import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.net.Net; -import io.anuke.arc.scene.ui.layout.Unit; -import io.anuke.arc.util.Bundles; -import io.anuke.arc.util.Strings; import org.robovm.apple.foundation.NSAutoreleasePool; import org.robovm.apple.foundation.NSURL; import org.robovm.apple.uikit.*; @@ -39,7 +38,7 @@ public class IOSLauncher extends IOSApplication.Delegate { @Override public void shareFile(FileHandle file){ - FileHandle to = Gdx.files.absolute(getDocumentsDirectory()).child(file.name()); + FileHandle to = Core.files.absolute(getDocumentsDirectory()).child(file.name()); file.copyTo(to); NSURL url = new NSURL(to.file()); @@ -91,9 +90,9 @@ public class IOSLauncher extends IOSApplication.Delegate { void openURL(NSURL url){ - Gdx.app.postRunnable(() -> { - FileHandle file = Gdx.files.absolute(getDocumentsDirectory()).child(url.getLastPathComponent()); - Gdx.files.absolute(url.getPath()).copyTo(file); + Core.app.post(() -> { + FileHandle file = Core.files.absolute(getDocumentsDirectory()).child(url.getLastPathComponent()); + Core.files.absolute(url.getPath()).copyTo(file); if(file.extension().equalsIgnoreCase(saveExtension)){ //open save @@ -109,7 +108,7 @@ public class IOSLauncher extends IOSApplication.Delegate { } }else if(file.extension().equalsIgnoreCase(mapExtension)){ //open map - Gdx.app.postRunnable(() -> { + Core.app.post(() -> { if (!ui.editor.isShown()) { ui.editor.show(); } diff --git a/net/build/libs/kryonet-release.jar b/net/build/libs/kryonet-release.jar deleted file mode 100644 index 43bf63903be25cda66ccde5ff0a9ff73830a8a4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22107 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�u 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

dwPeH#HC3#DptHj9d@4n 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 diff --git a/net/src/io/anuke/kryonet/ByteSerializer.java b/net/src/io/anuke/net/ByteSerializer.java similarity index 98% rename from net/src/io/anuke/kryonet/ByteSerializer.java rename to net/src/io/anuke/net/ByteSerializer.java index fac884bb83..a841d71994 100644 --- a/net/src/io/anuke/kryonet/ByteSerializer.java +++ b/net/src/io/anuke/net/ByteSerializer.java @@ -1,4 +1,4 @@ -package io.anuke.kryonet; +package io.anuke.net; import com.esotericsoftware.kryonet.FrameworkMessage; import com.esotericsoftware.kryonet.serialization.Serialization; diff --git a/net/src/io/anuke/kryonet/FrameworkSerializer.java b/net/src/io/anuke/net/FrameworkSerializer.java similarity index 98% rename from net/src/io/anuke/kryonet/FrameworkSerializer.java rename to net/src/io/anuke/net/FrameworkSerializer.java index 9b95ccdf98..6cc45e005e 100644 --- a/net/src/io/anuke/kryonet/FrameworkSerializer.java +++ b/net/src/io/anuke/net/FrameworkSerializer.java @@ -1,4 +1,4 @@ -package io.anuke.kryonet; +package io.anuke.net; import com.esotericsoftware.kryonet.FrameworkMessage; import com.esotericsoftware.kryonet.FrameworkMessage.*; diff --git a/net/src/io/anuke/kryonet/KryoClient.java b/net/src/io/anuke/net/KryoClient.java similarity index 99% rename from net/src/io/anuke/kryonet/KryoClient.java rename to net/src/io/anuke/net/KryoClient.java index 879a221419..d5d0ad8c67 100644 --- a/net/src/io/anuke/kryonet/KryoClient.java +++ b/net/src/io/anuke/net/KryoClient.java @@ -1,4 +1,4 @@ -package io.anuke.kryonet; +package io.anuke.net; import com.esotericsoftware.kryonet.*; import io.anuke.arc.Core; diff --git a/net/src/io/anuke/kryonet/KryoCore.java b/net/src/io/anuke/net/KryoCore.java similarity index 98% rename from net/src/io/anuke/kryonet/KryoCore.java rename to net/src/io/anuke/net/KryoCore.java index 9f4a100d4e..59792bf67f 100644 --- a/net/src/io/anuke/kryonet/KryoCore.java +++ b/net/src/io/anuke/net/KryoCore.java @@ -1,4 +1,4 @@ -package io.anuke.kryonet; +package io.anuke.net; import com.esotericsoftware.kryonet.util.Log; import com.esotericsoftware.kryonet.util.Log.Logger; diff --git a/net/src/io/anuke/kryonet/KryoServer.java b/net/src/io/anuke/net/KryoServer.java similarity index 99% rename from net/src/io/anuke/kryonet/KryoServer.java rename to net/src/io/anuke/net/KryoServer.java index 6920d5eb03..0f37c80e19 100644 --- a/net/src/io/anuke/kryonet/KryoServer.java +++ b/net/src/io/anuke/net/KryoServer.java @@ -1,4 +1,4 @@ -package io.anuke.kryonet; +package io.anuke.net; import com.dosse.upnp.UPnP; import com.esotericsoftware.kryonet.Connection; diff --git a/server/src/io/anuke/mindustry/server/CrashHandler.java b/server/src/io/anuke/mindustry/server/CrashHandler.java index f237f502aa..ce1311ca24 100644 --- a/server/src/io/anuke/mindustry/server/CrashHandler.java +++ b/server/src/io/anuke/mindustry/server/CrashHandler.java @@ -1,11 +1,11 @@ package io.anuke.mindustry.server; -import com.badlogic.gdx.utils.JsonValue; -import com.badlogic.gdx.utils.JsonValue.ValueType; -import com.badlogic.gdx.utils.JsonWriter.OutputType; import io.anuke.arc.Core; import io.anuke.arc.util.Log; import io.anuke.arc.util.OS; +import io.anuke.arc.util.serialization.JsonValue; +import io.anuke.arc.util.serialization.JsonValue.ValueType; +import io.anuke.arc.util.serialization.JsonWriter.OutputType; import io.anuke.mindustry.Vars; import io.anuke.mindustry.game.Version; import io.anuke.mindustry.net.Net; diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index 337ba5a97d..a20d2a54e3 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -1,22 +1,17 @@ package io.anuke.mindustry.server; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.ObjectSet; -import com.badlogic.gdx.utils.Timer; -import com.badlogic.gdx.utils.Timer.Task; import io.anuke.arc.ApplicationListener; import io.anuke.arc.Core; import io.anuke.arc.Events; +import io.anuke.arc.collection.Array; +import io.anuke.arc.collection.ObjectSet; import io.anuke.arc.entities.Effects; -import io.anuke.arc.util.CommandHandler; +import io.anuke.arc.files.FileHandle; +import io.anuke.arc.util.*; import io.anuke.arc.util.CommandHandler.Command; import io.anuke.arc.util.CommandHandler.Response; import io.anuke.arc.util.CommandHandler.ResponseType; -import io.anuke.arc.util.Log; -import io.anuke.arc.util.Strings; -import io.anuke.arc.util.Time; +import io.anuke.arc.util.Timer.Task; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.game.Difficulty; @@ -36,6 +31,7 @@ import io.anuke.mindustry.type.ItemType; import io.anuke.mindustry.world.Tile; import java.io.IOException; +import java.lang.StringBuilder; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Scanner; @@ -49,7 +45,7 @@ public class ServerControl implements ApplicationListener{ private static final int maxLogLength = 1024 * 512; private final CommandHandler handler = new CommandHandler(""); - private final FileHandle logFolder = Gdx.files.local("logs/"); + private final FileHandle logFolder = Core.files.local("logs/"); private FileHandle currentLogFile; private int gameOvers; @@ -99,13 +95,13 @@ public class ServerControl implements ApplicationListener{ } }); - Time.setDeltaProvider(() -> Gdx.graphics.getDeltaTime() * 60f); + Time.setDeltaProvider(() -> Core.graphics.getDeltaTime() * 60f); Effects.setScreenShakeProvider((a, b) -> {}); Effects.setEffectProvider((a, b, c, d, e, f) -> {}); registerCommands(); - Gdx.app.postRunnable(() -> { + Core.app.post(() -> { String[] commands = {}; if(args.length > 0){ @@ -176,7 +172,7 @@ public class ServerControl implements ApplicationListener{ }else{ Call.onInfoMessage("[SCARLET]Sector has been lost.[]\nRe-deploying in " + roundExtraTime + " seconds."); if(gameOvers >= 2){ - Core.settings.putInt("sector_y", Core.settings.getInt("sector_y") < 0 ? Core.settings.getInt("sector_y") + 1 : Core.settings.getInt("sector_y") - 1); + Core.settings.put("sector_y", Core.settings.getInt("sector_y") < 0 ? Core.settings.getInt("sector_y") + 1 : Core.settings.getInt("sector_y") - 1); Core.settings.save(); gameOvers = 0; } @@ -211,7 +207,7 @@ public class ServerControl implements ApplicationListener{ handler.register("exit", "Exit the server application.", arg -> { info("Shutting down server."); Net.dispose(); - Gdx.app.exit(); + Core.app.exit(); }); handler.register("stop", "Stop hosting the server.", arg -> { @@ -282,7 +278,7 @@ public class ServerControl implements ApplicationListener{ return; } info("&lyPort set to {0}.", port); - Core.settings.putInt("port", port); + Core.settings.put("port", port); Core.settings.save(); } }); @@ -308,7 +304,7 @@ public class ServerControl implements ApplicationListener{ } info(" &ly{0} FPS.", (int) (60f / Time.delta())); - info(" &ly{0} MB used.", Gdx.app.getJavaHeap() / 1024 / 1024); + info(" &ly{0} MB used.", Core.app.getJavaHeap() / 1024 / 1024); if(playerGroup.size() > 0){ info(" &lyPlayers: {0}", playerGroup.size()); @@ -343,8 +339,8 @@ public class ServerControl implements ApplicationListener{ handler.register("setsector", " ", "Sets the next sector to be played. Does not affect current game.", arg -> { try{ - Core.settings.putInt("sector_x", Integer.parseInt(arg[0])); - Core.settings.putInt("sector_y", Integer.parseInt(arg[1])); + Core.settings.put("sector_x", Integer.parseInt(arg[0])); + Core.settings.put("sector_y", Integer.parseInt(arg[1])); Core.settings.save(); info("Sector position set."); }catch(NumberFormatException e){ @@ -380,14 +376,14 @@ public class ServerControl implements ApplicationListener{ handler.register("crashreport", "", "Disables or enables automatic crash reporting", arg -> { boolean value = arg[0].equalsIgnoreCase("on"); - Core.settings.putBool("crashreport", value); + Core.settings.put("crashreport", value); Core.settings.save(); info("Crash reporting is now {0}.", value ? "on" : "off"); }); handler.register("logging", "", "Disables or enables server logs", arg -> { boolean value = arg[0].equalsIgnoreCase("on"); - Core.settings.putBool("logging", value); + Core.settings.put("logging", value); Core.settings.save(); info("Logging is now {0}.", value ? "on" : "off"); }); @@ -421,7 +417,7 @@ public class ServerControl implements ApplicationListener{ err("Invalid shuffle mode."); return; } - Core.settings.putBool("shuffle", arg[0].equals("on")); + Core.settings.put("shuffle", arg[0].equals("on")); Core.settings.save(); info("Shuffle mode set to '{0}'.", arg[0]); }); @@ -587,7 +583,7 @@ public class ServerControl implements ApplicationListener{ return; } - threads.run(() -> { + Core.app.post(() -> { SaveIO.loadFromSlot(slot); info("Save loaded."); host(); @@ -604,7 +600,7 @@ public class ServerControl implements ApplicationListener{ return; } - threads.run(() -> { + Core.app.post(() -> { int slot = Strings.parseInt(arg[0]); SaveIO.saveToSlot(slot); info("Saved to slot {0}.", slot); @@ -677,7 +673,7 @@ public class ServerControl implements ApplicationListener{ while(scan.hasNext()){ String line = scan.nextLine(); - Gdx.app.postRunnable(() -> { + Core.app.post(() -> { Response response = handler.handleMessage(line); if(response.type == ResponseType.unknownCommand){ diff --git a/server/src/io/anuke/mindustry/server/ServerLauncher.java b/server/src/io/anuke/mindustry/server/ServerLauncher.java index 8081a40059..aa760fa4f5 100644 --- a/server/src/io/anuke/mindustry/server/ServerLauncher.java +++ b/server/src/io/anuke/mindustry/server/ServerLauncher.java @@ -1,22 +1,18 @@ package io.anuke.mindustry.server; -import com.badlogic.gdx.ApplicationListener; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.backends.headless.HeadlessApplication; -import com.badlogic.gdx.backends.headless.HeadlessApplicationConfiguration; + +import io.anuke.arc.ApplicationListener; import io.anuke.arc.Core; -import io.anuke.arc.util.EmptyLogger; -import io.anuke.kryonet.KryoClient; -import io.anuke.kryonet.KryoServer; +import io.anuke.arc.backends.headless.HeadlessApplication; +import io.anuke.arc.backends.headless.HeadlessApplicationConfiguration; +import io.anuke.net.KryoClient; +import io.anuke.net.KryoServer; import io.anuke.mindustry.net.Net; public class ServerLauncher extends HeadlessApplication{ public ServerLauncher(ApplicationListener listener, HeadlessApplicationConfiguration config){ super(listener, config); - - //don't do anything at all for GDX logging: don't want controller info and such - Gdx.app.setApplicationLogger(new EmptyLogger()); } public static void main(String[] args){ @@ -26,7 +22,7 @@ public class ServerLauncher extends HeadlessApplication{ Net.setServerProvider(new KryoServer()); HeadlessApplicationConfiguration config = new HeadlessApplicationConfiguration(); - Core.settings.setPrefHandler((appName) -> Gdx.files.local("config")); + Core.settings.setDataDirectory(Core.files.local("config")); new ServerLauncher(new MindustryServer(args), config); }catch(Throwable t){ diff --git a/settings.gradle b/settings.gradle index e29e15bc8a..cb3b08c8fe 100644 --- a/settings.gradle +++ b/settings.gradle @@ -27,6 +27,9 @@ if(System.properties["release"] == null || System.properties["release"] == "fals use(':Arc:extensions:freetype', '../Arc/extensions/freetype') use(':Arc:backends', '../Arc/backends') use(':Arc:backends:backend-lwjgl3', '../Arc/backends/backend-lwjgl3') + use(':Arc:backends:backend-android', '../Arc/backends/backend-android') + use(':Arc:backends:backend-robovm', '../Arc/backends/backend-robovm') + use(':Arc:backends:backend-headless', '../Arc/backends/backend-headless') } if (new File(settingsDir, '../debug').exists()) { use(':debug', '../debug') diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 6824b8f4ff..04a868baab 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -1,7 +1,9 @@ -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.backends.headless.HeadlessApplication; -import com.badlogic.gdx.backends.headless.HeadlessApplicationConfiguration; -import com.badlogic.gdx.math.Point2; +import io.anuke.arc.ApplicationCore; +import io.anuke.arc.backends.headless.HeadlessApplication; +import io.anuke.arc.backends.headless.HeadlessApplicationConfiguration; +import io.anuke.arc.math.geom.Point2; +import io.anuke.arc.util.Log; +import io.anuke.arc.util.Time; import io.anuke.mindustry.Vars; import io.anuke.mindustry.content.Items; import io.anuke.mindustry.content.UnitTypes; @@ -24,16 +26,10 @@ import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Edges; import io.anuke.mindustry.world.Tile; -import io.anuke.arc.core.Timers; -import io.anuke.arc.modules.ModuleCore; -import io.anuke.arc.util.EmptyLogger; -import io.anuke.arc.util.Log; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.io.File; - import static io.anuke.mindustry.Vars.*; import static org.junit.jupiter.api.Assertions.*; @@ -46,9 +42,9 @@ public class ApplicationTests{ Throwable[] exceptionThrown = {null}; Log.setUseColors(false); - ModuleCore core = new ModuleCore(){ + ApplicationCore core = new ApplicationCore(){ @Override - public void init(){ + public void setup(){ Vars.init(); headless = true; @@ -57,26 +53,21 @@ public class ApplicationTests{ content.load(); content.initialize(Content::init); - module(logic = new Logic()); - module(world = new World()); - module(netServer = new NetServer()); + add(logic = new Logic()); + add(world = new World()); + add(netServer = new NetServer()); } @Override - public void postInit(){ - super.postInit(); + public void init(){ + super.init(); begins[0] = true; } }; HeadlessApplicationConfiguration config = new HeadlessApplicationConfiguration(); - config.preferencesDirectory = "test_files/"; - new File("tests_files/").delete(); - - new HeadlessApplication(core, config){{ - Gdx.app.setApplicationLogger(new EmptyLogger()); - }}; + new HeadlessApplication(core, config); for(Thread thread : Thread.getAllStackTraces().keySet()){ if(thread.getName().equals("HeadlessApplication")){ diff --git a/tests/src/test/java/SectorTests.java b/tests/src/test/java/SectorTests.java index bb07bc2743..29c0d9a4a0 100644 --- a/tests/src/test/java/SectorTests.java +++ b/tests/src/test/java/SectorTests.java @@ -1,4 +1,4 @@ -import com.badlogic.gdx.utils.Array; +import io.anuke.arc.collection.Array; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.ContentLoader; import io.anuke.mindustry.maps.SectorPresets; @@ -8,7 +8,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; /** This class is responsible for testing predefined sectors. */ public class SectorTests{