soundMap = new ObjectMap<>();
- private Throwable error;
public Control(){
saves = new Saves();
unlocks = new Unlocks();
- Inputs.useControllers(true);
-
- Gdx.input.setCatchBackKey(true);
+ Core.input.setCatch(KeyCode.BACK, true);
Effects.setShakeFalloff(10000f);
content.initialize(Content::init);
- Core.atlas = new Atlas("sprites.atlas");
- Core.atlas.setErrorRegion("error");
+ Core.atlas = new TextureAtlas("sprites/sprites.atlas");
+ Draw.scl = 1f / Core.atlas.find("scale_marker").getWidth();
content.initialize(Content::load);
+ if(Core.atlas.getTextures().size != 1){
+ throw new IllegalStateException("Atlas must be exactly one texture. " +
+ "If more textures are used, the map editor will not display them correctly.");
+ }
+
unlocks.load();
- Sounds.setFalloff(9000f);
- Sounds.setPlayer((sound, volume) -> {
- long time = TimeUtils.millis();
- long value = soundMap.get(sound, 0L);
-
- if(TimeUtils.timeSinceMillis(value) >= minSoundPeriod){
- threads.runGraphics(() -> sound.play(volume));
- soundMap.put(sound, time);
- }
- });
-
- DefaultKeybinds.load();
-
- Settings.defaultList(
+ Core.settings.setAppName(appName);
+ Core.settings.defaults(
"ip", "localhost",
"color-0", Color.rgba8888(playerColors[8]),
"color-1", Color.rgba8888(playerColors[11]),
@@ -95,15 +83,13 @@ public class Control extends Module{
"lastBuild", 0
);
- KeyBinds.load();
-
addPlayer(0);
saves.load();
Events.on(StateChangeEvent.class, event -> {
if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){
- Timers.runTask(5f, Platform.instance::updateRPC);
+ Time.runTask(5f, Platform.instance::updateRPC);
}
});
@@ -115,9 +101,9 @@ public class Control extends Module{
state.set(State.playing);
});
- Events.on(WorldLoadGraphicsEvent.class, event -> {
+ Events.on(WorldLoadEvent.class, event -> {
if(mobile){
- Gdx.app.postRunnable(() -> Core.camera.position.set(players[0].x, players[0].y, 0));
+ Core.app.post(() -> Core.camera.position.set(players[0]));
}
});
@@ -133,11 +119,11 @@ public class Control extends Module{
Events.on(WaveEvent.class, event -> {
- int last = Settings.getInt("hiscore" + world.getMap().name, 0);
+ int last = Core.settings.getInt("hiscore" + world.getMap().name, 0);
if(state.wave > last && !state.mode.infiniteResources && !state.mode.disableWaveTimer && world.getSector() == null){
- Settings.putInt("hiscore" + world.getMap().name, state.wave);
- Settings.save();
+ Core.settings.put("hiscore" + world.getMap().name, state.wave);
+ Core.settings.save();
hiscore = true;
}
@@ -149,12 +135,9 @@ public class Control extends Module{
if(world.getSector() != null && world.getSector().hasSave()){
world.getSector().getSave().delete();
}
-
- threads.runGraphics(() -> {
- Effects.shake(5, 6, Core.camera.position.x, Core.camera.position.y);
- //the restart dialog can show info for any number of scenarios
- Call.onGameOver(event.winner);
- });
+ Effects.shake(5, 6, Core.camera.position.x, Core.camera.position.y);
+ //the restart dialog can show info for any number of scenarios
+ Call.onGameOver(event.winner);
});
//autohost for pvp sectors
@@ -164,13 +147,11 @@ public class Control extends Module{
Net.host(port);
players[0].isAdmin = true;
}catch(IOException e){
- ui.showError(Bundles.format("text.server.error", Strings.parseException(e, false)));
- threads.runDelay(() -> state.set(State.menu));
+ ui.showError(Core.bundle.format("text.server.error", Strings.parseException(e, false)));
+ Core.app.post(() -> state.set(State.menu));
}
}
});
-
- Events.on(WorldLoadEvent.class, event -> threads.runGraphics(() -> Events.fire(new WorldLoadGraphicsEvent())));
}
public void addPlayer(int index){
@@ -189,9 +170,9 @@ public class Control extends Module{
Player setTo = (index == 0 ? null : players[0]);
Player player = new Player();
- player.name = Settings.getString("name");
+ player.name = Core.settings.getString("name");
player.mech = mobile ? Mechs.starterMobile : Mechs.starterDesktop;
- player.color.set(Settings.getInt("color-" + index));
+ player.color.set(Core.settings.getInt("color-" + index));
player.isLocal = true;
player.playerIndex = index;
player.isMobile = mobile;
@@ -214,7 +195,7 @@ public class Control extends Module{
}
inputs[index] = input;
- Inputs.addProcessor(input);
+ Core.input.addProcessor(input);
}
public void removePlayer(){
@@ -230,10 +211,6 @@ public class Control extends Module{
System.arraycopy(oldi, 0, inputs, 0, inputs.length);
}
- public void setError(Throwable error){
- this.error = error;
- }
-
public InputHandler input(int index){
return inputs[index];
}
@@ -266,7 +243,7 @@ public class Control extends Module{
Recipe recipe = content.recipes().get(i);
if(!recipe.isHidden() && recipe.requirements != null){
for(ItemStack stack : recipe.requirements){
- if(!entity.items.has(stack.item, Math.min((int) (stack.amount * unlockResourceScaling), 2000))) continue outer;
+ if(!entity.items.has(stack.item, Math.min((int) (stack.amount), 2000))) continue outer;
}
if(unlocks.unlockContent(recipe)){
@@ -305,16 +282,16 @@ public class Control extends Module{
Platform.instance.updateRPC();
- if(!Settings.getBool("4.0-warning-2", false)){
+ if(!Core.settings.getBool("4.0-warning-2", false)){
- Timers.run(5f, () -> {
- FloatingDialog dialog = new FloatingDialog("[accent]WARNING![]");
+ Time.run(5f, () -> {
+ FloatingDialog dialog = new FloatingDialog("WARNING!");
dialog.buttons().addButton("$text.ok", () -> {
dialog.hide();
- Settings.putBool("4.0-warning-2", true);
- Settings.save();
+ Core.settings.put("4.0-warning-2", true);
+ Core.settings.save();
}).size(100f, 60f);
- dialog.content().add("Reminder: The beta version you are about to play is very unstable, and is [accent]not representative of the final 4.0 release.[]\n\n " +
+ dialog.content().add("Reminder: The alpha version you are about to play is very unstable, and is [accent]not representative of the final 4.0 release.[]\n\n " +
"\nThere is currently[scarlet] no sound implemented[]; this is intentional.\n" +
"All current art and UI is temporary, and will be re-drawn before release. " +
"\n\n[accent]Saves and maps may be corrupted without warning between updates.").wrap().width(400f);
@@ -323,18 +300,8 @@ public class Control extends Module{
}
}
- /** Called from main logic thread.*/
- public void runUpdateLogic(){
- if(!state.is(State.menu)){
- renderer.minimap.updateUnitArray();
- }
- }
-
@Override
public void update(){
- if(error != null){
- throw new RuntimeException(error);
- }
saves.update();
@@ -362,26 +329,26 @@ public class Control extends Module{
}
}
- if(Inputs.keyTap("pause") && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){
+ if(Core.input.keyTap(Binding.pause) && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){
state.set(state.is(State.playing) ? State.paused : State.playing);
}
- if(Inputs.keyTap("menu") && !ui.restart.isShown()){
+ if(Core.input.keyTap(Binding.menu) && !ui.restart.isShown()){
if(ui.chatfrag.chatOpen()){
ui.chatfrag.hide();
- }else if(!ui.paused.isShown() && !ui.hasDialog()){
+ }else if(!ui.paused.isShown() && !scene.hasDialog()){
ui.paused.show();
state.set(State.paused);
}
}
- if(!mobile && Inputs.keyTap("screenshot") && !ui.chatfrag.chatOpen()){
+ if(!mobile && Core.input.keyTap(Binding.screenshot) && !(scene.getKeyboardFocus() instanceof TextField) && !ui.chatfrag.chatOpen()){
renderer.takeMapScreenshot();
}
}else{
if(!state.isPaused()){
- Timers.update();
+ Time.update();
}
}
}
diff --git a/core/src/io/anuke/mindustry/core/GameState.java b/core/src/io/anuke/mindustry/core/GameState.java
index 96a36fad8a..4d795a46fc 100644
--- a/core/src/io/anuke/mindustry/core/GameState.java
+++ b/core/src/io/anuke/mindustry/core/GameState.java
@@ -5,7 +5,7 @@ import io.anuke.mindustry.game.EventType.StateChangeEvent;
import io.anuke.mindustry.game.GameMode;
import io.anuke.mindustry.game.Teams;
import io.anuke.mindustry.net.Net;
-import io.anuke.ucore.core.Events;
+import io.anuke.arc.Events;
import static io.anuke.mindustry.Vars.unitGroups;
import static io.anuke.mindustry.Vars.waveTeam;
diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java
index 5f7035cb7e..c564ed6115 100644
--- a/core/src/io/anuke/mindustry/core/Logic.java
+++ b/core/src/io/anuke/mindustry/core/Logic.java
@@ -1,9 +1,14 @@
package io.anuke.mindustry.core;
-import com.badlogic.gdx.utils.Array;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
-import io.anuke.mindustry.Vars;
+import io.anuke.arc.ApplicationListener;
+import io.anuke.arc.Events;
+import io.anuke.arc.collection.Array;
+import io.anuke.arc.entities.Entities;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.entities.EntityQuery;
+import io.anuke.arc.util.Time;
import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.game.EventType.*;
@@ -16,12 +21,6 @@ import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.core.Events;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.entities.Entities;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.entities.EntityQuery;
-import io.anuke.ucore.modules.Module;
import static io.anuke.mindustry.Vars.*;
@@ -33,7 +32,7 @@ import static io.anuke.mindustry.Vars.*;
*
* This class should not call any outside methods to change state of modules, but instead fire events.
*/
-public class Logic extends Module{
+public class Logic implements ApplicationListener{
public Logic(){
Events.on(TileChangeEvent.class, event -> {
@@ -85,7 +84,7 @@ public class Logic extends Module{
state.gameOver = false;
state.teams = new Teams();
- Timers.clear();
+ Time.clear();
Entities.clear();
TileEntity.sleepingEntities = 0;
@@ -141,7 +140,7 @@ public class Logic extends Module{
@Remote(called = Loc.both)
public static void onGameOver(Team winner){
- threads.runGraphics(() -> ui.restart.show(winner));
+ ui.restart.show(winner);
netClient.setQuiet();
}
@@ -172,17 +171,13 @@ public class Logic extends Module{
@Override
public void update(){
- if(Vars.control != null){
- control.runUpdateLogic();
- }
-
if(!state.is(State.menu)){
if(!state.isPaused()){
- Timers.update();
+ Time.update();
if(!state.mode.disableWaveTimer && !state.mode.disableWaves && !state.gameOver){
- state.wavetime -= Timers.delta();
+ state.wavetime -= Time.delta();
}
if(!Net.client() && state.wavetime <= 0 && !state.mode.disableWaves){
diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java
index bf124f9be2..e3e70da110 100644
--- a/core/src/io/anuke/mindustry/core/NetClient.java
+++ b/core/src/io/anuke/mindustry/core/NetClient.java
@@ -1,14 +1,20 @@
package io.anuke.mindustry.core;
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.utils.Base64Coder;
-import com.badlogic.gdx.utils.IntSet;
-import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.PacketPriority;
import io.anuke.annotations.Annotations.Remote;
import io.anuke.annotations.Annotations.Variant;
+import io.anuke.arc.ApplicationListener;
+import io.anuke.arc.Core;
+import io.anuke.arc.collection.IntSet;
+import io.anuke.arc.entities.Entities;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.util.Interval;
+import io.anuke.arc.util.Log;
+import io.anuke.arc.util.Time;
+import io.anuke.arc.util.io.ReusableByteArrayInputStream;
+import io.anuke.arc.util.serialization.Base64Coder;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Player;
@@ -25,16 +31,6 @@ import io.anuke.mindustry.net.Packets.*;
import io.anuke.mindustry.net.ValidateException;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.modules.ItemModule;
-import io.anuke.ucore.core.Core;
-import io.anuke.ucore.core.Settings;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.entities.Entities;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.io.ReusableByteArrayInputStream;
-import io.anuke.ucore.modules.Module;
-import io.anuke.ucore.util.Log;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.Timer;
import java.io.DataInputStream;
import java.io.IOException;
@@ -43,12 +39,12 @@ import java.util.zip.InflaterInputStream;
import static io.anuke.mindustry.Vars.*;
-public class NetClient extends Module{
+public class NetClient implements ApplicationListener{
private final static float dataTimeout = 60 * 18;
private final static float playerSyncTime = 2;
public final static float viewScale = 2f;
- private Timer timer = new Timer(5);
+ private Interval timer = new Interval(5);
/**Whether the client is currently connecting.*/
private boolean connecting = false;
/**If true, no message will be shown on disconnect.*/
@@ -58,16 +54,6 @@ public class NetClient extends Module{
/**Last sent client snapshot ID.*/
private int lastSent;
- /**Last snapshot ID recieved.*/
- private int lastSnapshotBaseID = -1;
-
- /**Current snapshot that is being built from chinks.*/
- private byte[] currentSnapshot;
- /**Counter of how many chunks have been recieved.*/
- private int recievedChunkCounter;
- /**ID of snapshot that is currently being constructed.*/
- private int currentSnapshotID = -1;
-
/**List of entities that were removed, and need not be added while syncing.*/
private IntSet removed = new IntSet();
/**Byte stream for reading in snapshots.*/
@@ -114,7 +100,7 @@ public class NetClient extends Module{
Net.handleClient(Disconnect.class, packet -> {
if(quiet) return;
- Timers.runTask(3f, ui.loadfrag::hide);
+ Time.runTask(3f, ui.loadfrag::hide);
state.set(State.menu);
@@ -168,21 +154,19 @@ public class NetClient extends Module{
netClient.disconnectQuietly();
state.set(State.menu);
- threads.runGraphics(() -> {
- if(!reason.quiet){
- if(reason.extraText() != null){
- ui.showText(reason.toString(), reason.extraText());
- }else{
- ui.showText("$text.disconnect", reason.toString());
- }
+ if(!reason.quiet){
+ if(reason.extraText() != null){
+ ui.showText(reason.toString(), reason.extraText());
+ }else{
+ ui.showText("$text.disconnect", reason.toString());
}
- ui.loadfrag.hide();
- });
+ }
+ ui.loadfrag.hide();
}
@Remote(variants = Variant.both)
public static void onInfoMessage(String message){
- threads.runGraphics(() -> ui.showText("", message));
+ ui.showText("", message);
}
@Remote(variants = Variant.both)
@@ -193,15 +177,13 @@ public class NetClient extends Module{
ui.chatfrag.clearMessages();
Net.setClientLoaded(false);
- threads.runGraphics(() -> {
- ui.loadfrag.show("$text.connecting.data");
+ ui.loadfrag.show("$text.connecting.data");
- ui.loadfrag.setButton(() -> {
- ui.loadfrag.hide();
- netClient.connecting = false;
- netClient.quiet = true;
- Net.disconnect();
- });
+ ui.loadfrag.setButton(() -> {
+ ui.loadfrag.hide();
+ netClient.connecting = false;
+ netClient.quiet = true;
+ Net.disconnect();
});
}
@@ -217,97 +199,11 @@ public class NetClient extends Module{
}
@Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true)
- public static void onSnapshot(byte[] chunk, int snapshotID, short chunkID, int totalLength, int uncompressedLength){
- int totalChunks = Mathf.ceil((float) totalLength / NetServer.maxSnapshotSize);
-
- if(NetServer.debugSnapshots)
- Log.info("Recieved snapshot: len {0} ID {1} chunkID {2} / "+totalChunks+" totalLength {3} bclient-base {4}", chunk.length, snapshotID, chunkID, totalLength, netClient.lastSnapshotBaseID);
-
- //skip snapshot IDs that have already been recieved OR snapshots that are too far in front
- if(snapshotID < netClient.lastSnapshotBaseID){
- if(NetServer.debugSnapshots) Log.info("//SKIP SNAPSHOT");
- return;
- }
-
+ public static void onEntitySnapshot(byte groupID, short amount, short dataLen, byte[] data){
try{
- byte[] snapshot;
-
- //total length exceeds that needed to hold one snapshot, therefore, it is split into chunks
- if(totalLength > NetServer.maxSnapshotSize){
- //total amount of chunks to recieve
-
- //reset status when a new snapshot sending begins
- if(netClient.currentSnapshotID != snapshotID || netClient.currentSnapshot == null){
- netClient.currentSnapshotID = snapshotID;
- netClient.currentSnapshot = new byte[totalLength];
- netClient.recievedChunkCounter = 0;
- }
-
- netClient.recievedChunkCounter++; //update recieved status
- //copy the recieved bytes into the holding array
- System.arraycopy(chunk, 0, netClient.currentSnapshot, chunkID * NetServer.maxSnapshotSize,
- Math.min(NetServer.maxSnapshotSize, totalLength - chunkID * NetServer.maxSnapshotSize));
-
- //when all chunks have been recieved, begin
- if(netClient.recievedChunkCounter >= totalChunks && netClient.currentSnapshot != null){
- snapshot = netClient.currentSnapshot;
- }else{
- return;
- }
- }else{
- snapshot = chunk;
- }
-
- if(NetServer.debugSnapshots)
- Log.info("Finished recieving snapshot ID {0} length {1}", snapshotID, chunk.length);
-
- byte[] result = Net.decompressSnapshot(snapshot, uncompressedLength);
- int length = result.length;
-
- netClient.lastSnapshotBaseID = snapshotID;
-
- //set stream bytes to begin snapshot reading
- netClient.byteStream.setBytes(result, 0, length);
-
- //get data input for reading from the stream
+ netClient.byteStream.setBytes(Net.decompressSnapshot(data, dataLen));
DataInputStream input = netClient.dataStream;
- netClient.readSnapshot(input);
-
- //confirm that snapshot has been recieved
- netClient.lastSnapshotBaseID = snapshotID;
- }catch(Exception e){
- throw new RuntimeException(e);
- }
- }
-
- public void readSnapshot(DataInputStream input) throws IOException{
-
- //read wave info
- state.wavetime = input.readFloat();
- state.wave = input.readInt();
- state.enemies = input.readInt();
-
- byte cores = input.readByte();
- for(int i = 0; i < cores; i++){
- int pos = input.readInt();
- Tile tile = world.tile(pos);
- if(tile != null && tile.entity != null){
- tile.entity.items.read(input);
- }else{
- new ItemModule().read(input);
- }
- }
-
- long timestamp = input.readLong();
-
- byte totalGroups = input.readByte();
- //for each group...
- for(int i = 0; i < totalGroups; i++){
- //read group info
- byte groupID = input.readByte();
- short amount = input.readShort();
-
EntityGroup group = Entities.getGroup(groupID);
//go through each entity
@@ -328,13 +224,41 @@ public class NetClient extends Module{
}
//read the entity
- entity.read(input, timestamp);
+ entity.read(input);
if(add){
entity.add();
netClient.addRemovedEntity(entity.getID());
}
}
+ }catch(IOException e){
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true)
+ public static void onStateSnapshot(float waveTime, int wave, int enemies, short coreDataLen, byte[] coreData){
+ try{
+ state.wavetime = waveTime;
+ state.wave = wave;
+ state.enemies = enemies;
+
+ netClient.byteStream.setBytes(Net.decompressSnapshot(coreData, coreDataLen));
+ DataInputStream input = netClient.dataStream;
+
+ byte cores = input.readByte();
+ for(int i = 0; i < cores; i++){
+ int pos = input.readInt();
+ Tile tile = world.tile(pos);
+ if(tile != null && tile.entity != null){
+ tile.entity.items.read(input);
+ }else{
+ new ItemModule().read(input);
+ }
+ }
+
+ }catch(IOException e){
+ throw new RuntimeException(e);
}
}
@@ -347,7 +271,7 @@ public class NetClient extends Module{
}else if(!connecting){
Net.disconnect();
}else{ //...must be connecting
- timeoutTime += Timers.delta();
+ timeoutTime += Time.delta();
if(timeoutTime > dataTimeout){
Log.err("Failed to load data!");
ui.loadfrag.hide();
@@ -369,8 +293,8 @@ public class NetClient extends Module{
ui.loadfrag.hide();
ui.join.hide();
Net.setClientLoaded(true);
- Gdx.app.postRunnable(Call::connectConfirm);
- Timers.runTask(40f, Platform.instance::updateRPC);
+ Core.app.post(Call::connectConfirm);
+ Time.runTask(40f, Platform.instance::updateRPC);
}
private void reset(){
@@ -380,9 +304,6 @@ public class NetClient extends Module{
connecting = true;
quiet = false;
lastSent = 0;
- currentSnapshot = null;
- currentSnapshotID = -1;
- lastSnapshotBaseID = -1;
Entities.clear();
ui.chatfrag.clearMessages();
@@ -416,19 +337,21 @@ public class NetClient extends Module{
Player player = players[0];
BuildRequest[] requests;
+ //limit to 10 to prevent buffer overflows
+ int usedRequests = Math.min(player.getPlaceQueue().size, 10);
- requests = new BuildRequest[player.getPlaceQueue().size];
- for(int i = 0; i < requests.length; i++){
+ requests = new BuildRequest[usedRequests];
+ for(int i = 0; i < usedRequests; i++){
requests[i] = player.getPlaceQueue().get(i);
}
- Call.onClientShapshot(lastSent++, TimeUtils.millis(), player.x, player.y,
+ Call.onClientShapshot(lastSent++, Time.millis(), player.x, player.y,
player.pointerX, player.pointerY, player.rotation, player.baseRotation,
player.getVelocity().x, player.getVelocity().y,
player.getMineTile(),
player.isBoosting, player.isShooting, requests,
Core.camera.position.x, Core.camera.position.y,
- Core.camera.viewportWidth * Core.camera.zoom * viewScale, Core.camera.viewportHeight * Core.camera.zoom * viewScale);
+ Core.camera.width * viewScale, Core.camera.height * viewScale);
}
if(timer.get(1, 60)){
@@ -437,14 +360,14 @@ public class NetClient extends Module{
}
String getUsid(String ip){
- if(Settings.getString("usid-" + ip, null) != null){
- return Settings.getString("usid-" + ip, null);
+ if(Core.settings.getString("usid-" + ip, null) != null){
+ return Core.settings.getString("usid-" + ip, null);
}else{
byte[] bytes = new byte[8];
new Random().nextBytes(bytes);
String result = new String(Base64Coder.encode(bytes));
- Settings.putString("usid-" + ip, result);
- Settings.save();
+ Core.settings.put("usid-" + ip, result);
+ Core.settings.save();
return result;
}
}
diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java
index a88ea19301..4987df27c4 100644
--- a/core/src/io/anuke/mindustry/core/NetServer.java
+++ b/core/src/io/anuke/mindustry/core/NetServer.java
@@ -1,15 +1,26 @@
package io.anuke.mindustry.core;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.Colors;
-import com.badlogic.gdx.math.Rectangle;
-import com.badlogic.gdx.math.Vector2;
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.IntMap;
-import com.badlogic.gdx.utils.ObjectSet;
-import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
+import io.anuke.arc.ApplicationListener;
+import io.anuke.arc.Events;
+import io.anuke.arc.collection.Array;
+import io.anuke.arc.collection.IntMap;
+import io.anuke.arc.collection.ObjectSet;
+import io.anuke.arc.entities.Entities;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.entities.EntityQuery;
+import io.anuke.arc.entities.trait.Entity;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.graphics.Colors;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Rectangle;
+import io.anuke.arc.math.geom.Vector2;
+import io.anuke.arc.util.Log;
+import io.anuke.arc.util.Structs;
+import io.anuke.arc.util.Time;
+import io.anuke.arc.util.io.ByteBufferOutput;
+import io.anuke.arc.util.io.CountableByteArrayOutputStream;
import io.anuke.mindustry.content.Mechs;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.core.GameState.State;
@@ -21,35 +32,25 @@ import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.Version;
import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.gen.RemoteReadServer;
-import io.anuke.mindustry.net.*;
+import io.anuke.mindustry.net.Administration;
import io.anuke.mindustry.net.Administration.PlayerInfo;
+import io.anuke.mindustry.net.Net;
+import io.anuke.mindustry.net.NetConnection;
+import io.anuke.mindustry.net.NetworkIO;
import io.anuke.mindustry.net.Packets.*;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.core.Events;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.entities.Entities;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.entities.EntityQuery;
-import io.anuke.ucore.entities.trait.Entity;
-import io.anuke.ucore.io.ByteBufferOutput;
-import io.anuke.ucore.io.CountableByteArrayOutputStream;
-import io.anuke.ucore.modules.Module;
-import io.anuke.ucore.util.Structs;
-import io.anuke.ucore.util.Log;
-import io.anuke.ucore.util.Mathf;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
-import java.util.Arrays;
import java.util.zip.DeflaterOutputStream;
import static io.anuke.mindustry.Vars.*;
-public class NetServer extends Module{
- public final static int maxSnapshotSize = 2047;
+public class NetServer implements ApplicationListener{
+ public final static int maxSnapshotSize = 430;
public final static boolean debugSnapshots = false;
public final static float maxSnapshotDelay = 200;
@@ -122,7 +123,7 @@ public class NetServer extends Module{
return;
}
- if(TimeUtils.millis() - info.lastKicked < kickDuration){
+ if(Time.millis() - info.lastKicked < kickDuration){
kick(id, KickReason.recentKick);
return;
}
@@ -224,45 +225,6 @@ public class NetServer extends Module{
});
}
- /** Sends a raw byte[] snapshot to a client, splitting up into chunks when needed.*/
- private static void sendSplitSnapshot(int userid, byte[] bytes, int snapshotID, int uncompressedLength){
- if(bytes.length < maxSnapshotSize){
- scheduleSnapshot(() -> Call.onSnapshot(userid, bytes, snapshotID, (short) 0, bytes.length, uncompressedLength));
- }else{
- int remaining = bytes.length;
- int offset = 0;
- int chunkid = 0;
- while(remaining > 0){
- int used = Math.min(remaining, maxSnapshotSize);
- byte[] toSend;
- //re-use sent byte arrays when possible
- if(used == maxSnapshotSize && !debugSnapshots){
- toSend = reusableSnapArray;
- System.arraycopy(bytes, offset, toSend, 0, Math.min(offset + maxSnapshotSize, bytes.length) - offset);
- }else{
- toSend = Arrays.copyOfRange(bytes, offset, Math.min(offset + maxSnapshotSize, bytes.length));
- }
-
- short fchunk = (short)chunkid;
- scheduleSnapshot(() -> Call.onSnapshot(userid, toSend, snapshotID, fchunk, bytes.length, uncompressedLength));
-
- remaining -= used;
- offset += used;
- chunkid++;
- }
- }
- }
-
- private static void scheduleSnapshot(Runnable r){
- if(debugSnapshots){
- if(!Mathf.chance(snapshotDropchance)){
- Timers.run(maxSnapshotDelay / 1000f * 60f, r);
- }
- }else{
- r.run();
- }
- }
-
public void sendWorldData(Player player, int clientID){
ByteArrayOutputStream stream = new ByteArrayOutputStream();
DeflaterOutputStream def = new DeflaterOutputStream(stream);
@@ -311,14 +273,14 @@ public class NetServer extends Module{
boolean verifyPosition = !player.isDead() && netServer.admins.getStrict() && headless && player.getCarrier() == null;
- if(connection.lastRecievedClientTime == 0) connection.lastRecievedClientTime = TimeUtils.millis() - 16;
+ if(connection.lastRecievedClientTime == 0) connection.lastRecievedClientTime = Time.millis() - 16;
connection.viewX = viewX;
connection.viewY = viewY;
connection.viewWidth = viewWidth;
connection.viewHeight = viewHeight;
- long elapsed = TimeUtils.timeSinceMillis(connection.lastRecievedClientTime);
+ long elapsed = Time.timeSinceMillis(connection.lastRecievedClientTime);
float maxSpeed = boosting && !player.mech.flying ? player.mech.boostSpeed : player.mech.speed;
float maxMove = elapsed / 1000f * 60f * Math.min(compound(maxSpeed, player.mech.drag) * 1.25f, player.mech.maxSpeed * 1.1f);
@@ -357,7 +319,7 @@ public class NetServer extends Module{
player.y = prevy;
newx = x;
newy = y;
- }else if(Vector2.dst(x, y, newx, newy) > correctDist){
+ }else if(Mathf.dst(x, y, newx, newy) > correctDist){
Call.onPositionSet(player.con.id, newx, newy); //teleport and correct position when necessary
}
@@ -370,7 +332,7 @@ public class NetServer extends Module{
player.getVelocity().set(xVelocity, yVelocity); //only for visual calculation purposes, doesn't actually update the player
connection.lastRecievedClientSnapshot = snapshotID;
- connection.lastRecievedClientTime = TimeUtils.millis();
+ connection.lastRecievedClientTime = Time.millis();
}
@Remote(targets = Loc.client, called = Loc.server)
@@ -436,8 +398,8 @@ public class NetServer extends Module{
if(!headless && !closing && Net.server() && state.is(State.menu)){
closing = true;
- threads.runGraphics(() -> ui.loadfrag.show("$text.server.closing"));
- Timers.runTask(5f, () -> {
+ ui.loadfrag.show("$text.server.closing");
+ Time.runTask(5f, () -> {
Net.closeServer();
ui.loadfrag.hide();
closing = false;
@@ -469,45 +431,34 @@ public class NetServer extends Module{
if(player != null && (reason == KickReason.kick || reason == KickReason.banned) && player.uuid != null){
PlayerInfo info = admins.getInfo(player.uuid);
info.timesKicked++;
- info.lastKicked = TimeUtils.millis();
+ info.lastKicked = Time.millis();
}
Call.onKick(connection, reason);
- Timers.runTask(2f, con::close);
+ Time.runTask(2f, con::close);
admins.save();
}
- public void writeSnapshot(Player player, DataOutputStream dataStream) throws IOException{
- viewport.setSize(player.con.viewWidth, player.con.viewHeight).setCenter(player.con.viewX, player.con.viewY);
-
- //write wave datas
- dataStream.writeFloat(state.wavetime);
- dataStream.writeInt(state.wave);
- dataStream.writeInt(state.enemies());
-
+ public void writeSnapshot(Player player) throws IOException{
+ syncStream.reset();
ObjectSet cores = state.teams.get(player.getTeam()).cores;
dataStream.writeByte(cores.size);
- //write all core inventory data
for(Tile tile : cores){
dataStream.writeInt(tile.pos());
tile.entity.items.write(dataStream);
}
- //write timestamp
- dataStream.writeLong(TimeUtils.millis());
+ dataStream.close();
+ byte[] stateBytes = syncStream.toByteArray();
- int totalGroups = 0;
+ //write basic state data.
+ Call.onStateSnapshot(player.con.id, state.wavetime, state.wave, state.enemies, (short)stateBytes.length, Net.compressSnapshot(stateBytes));
- for(EntityGroup> group : Entities.getAllGroups()){
- if(!group.isEmpty() && (group.all().get(0) instanceof SyncTrait)) totalGroups++;
- }
-
- //write total amount of serializable groups
- dataStream.writeByte(totalGroups);
+ viewport.setSize(player.con.viewWidth, player.con.viewHeight).setCenter(player.con.viewX, player.con.viewY);
//check for syncable groups
for(EntityGroup> group : Entities.getAllGroups()){
@@ -535,15 +486,32 @@ public class NetServer extends Module{
}
}
- //write group ID + group size
- dataStream.writeByte(group.getID());
- dataStream.writeShort(returnArray.size);
+ syncStream.reset();
+
+ int sent = 0;
for(Entity entity : returnArray){
//write all entities now
dataStream.writeInt(entity.getID()); //write id
dataStream.writeByte(((SyncTrait) entity).getTypeID()); //write type ID
((SyncTrait) entity).write(dataStream); //write entity
+
+ sent ++;
+
+ if(syncStream.position() > maxSnapshotSize){
+ dataStream.close();
+ byte[] syncBytes = syncStream.toByteArray();
+ Call.onEntitySnapshot(player.con.id, (byte)group.getID(), (short)sent, (short)syncBytes.length, Net.compressSnapshot(syncBytes));
+ sent = 0;
+ syncStream.reset();
+ }
+ }
+
+ if(sent > 0){
+ dataStream.close();
+
+ byte[] syncBytes = syncStream.toByteArray();
+ Call.onEntitySnapshot(player.con.id, (byte)group.getID(), (short)sent, (short)syncBytes.length, Net.compressSnapshot(syncBytes));
}
}
}
@@ -617,21 +585,7 @@ public class NetServer extends Module{
if(!player.timer.get(Player.timerSync, serverSyncTime) || !connection.hasConnected) continue;
- //reset stream to begin writing
- Timers.mark();
- syncStream.reset();
-
- writeSnapshot(player, dataStream);
-
- dataStream.close();
-
- byte[] bytes = syncStream.toByteArray();
- int uncompressed = bytes.length;
- bytes = Net.compressSnapshot(bytes);
- int snapid = connection.lastSentSnapshotID ++;
-
- if(debugSnapshots) Log.info("Sent snapshot: {0} bytes.", bytes.length);
- sendSplitSnapshot(connection.id, bytes, snapid, uncompressed);
+ writeSnapshot(player);
}
}catch(IOException e){
diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java
index 0064c066c3..049e262da1 100644
--- a/core/src/io/anuke/mindustry/core/Platform.java
+++ b/core/src/io/anuke/mindustry/core/Platform.java
@@ -1,15 +1,11 @@
package io.anuke.mindustry.core;
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.Input.Keys;
-import com.badlogic.gdx.files.FileHandle;
-import com.badlogic.gdx.utils.Base64Coder;
-import io.anuke.ucore.core.Core;
-import io.anuke.ucore.core.Settings;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.function.Consumer;
-import io.anuke.ucore.scene.ui.Dialog;
-import io.anuke.ucore.scene.ui.TextField;
+import io.anuke.arc.Core;
+import io.anuke.arc.Input.TextInput;
+import io.anuke.arc.files.FileHandle;
+import io.anuke.arc.function.Consumer;
+import io.anuke.arc.scene.ui.TextField;
+import io.anuke.arc.util.serialization.Base64Coder;
import java.util.Random;
@@ -28,40 +24,16 @@ public abstract class Platform {
if(!mobile) return; //this is mobile only, desktop doesn't need dialogs
field.tapped(() -> {
- Dialog dialog = new Dialog("", "dialog");
- dialog.setFillParent(true);
- dialog.content().top();
- dialog.content().defaults().height(65f);
-
- TextField[] use = {null};
-
- dialog.content().addImageButton("icon-copy", "clear", 16*3, () -> use[0].copy())
- .visible(() -> !use[0].getSelection().isEmpty()).width(65f);
-
- dialog.content().addImageButton("icon-paste", "clear", 16*3, () ->
- use[0].paste(Gdx.app.getClipboard().getContents(), false))
- .visible(() -> Gdx.app.getClipboard() != null && Gdx.app.getClipboard().getContents() != null && !Gdx.app.getClipboard().getContents().isEmpty()).width(65f);
-
- TextField to = dialog.content().addField(field.getText(), t-> {}).pad(15).width(250f).get();
- to.setMaxLength(maxLength);
- to.keyDown(Keys.ENTER, () -> dialog.content().find("okb").fireClick());
-
- use[0] = to;
-
- dialog.content().addButton("$text.ok", () -> {
+ TextInput input = new TextInput();
+ input.text = field.getText();
+ input.maxLength = maxLength;
+ input.accepted = text -> {
field.clearText();
- field.appendText(to.getText());
+ field.appendText(text);
field.change();
- dialog.hide();
- Gdx.input.setOnscreenKeyboardVisible(false);
- }).width(90f).name("okb");
-
- dialog.show();
- Timers.runTask(1f, () -> {
- to.setCursorPosition(to.getText().length());
- Core.scene.setKeyboardFocus(to);
- Gdx.input.setOnscreenKeyboardVisible(true);
- });
+ Core.input.setOnscreenKeyboardVisible(false);
+ };
+ Core.input.getTextInput(input);
});
}
/**Update discord RPC.*/
@@ -76,13 +48,13 @@ public abstract class Platform {
}
/**Must be a base64 string 8 bytes in length.*/
public String getUUID(){
- String uuid = Settings.getString("uuid", "");
+ String uuid = Core.settings.getString("uuid", "");
if(uuid.isEmpty()){
byte[] result = new byte[8];
new Random().nextBytes(result);
uuid = new String(Base64Coder.encode(result));
- Settings.putString("uuid", uuid);
- Settings.save();
+ Core.settings.put("uuid", uuid);
+ Core.settings.save();
return uuid;
}
return uuid;
diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java
index df097fc0f9..cff7944281 100644
--- a/core/src/io/anuke/mindustry/core/Renderer.java
+++ b/core/src/io/anuke/mindustry/core/Renderer.java
@@ -1,16 +1,26 @@
package io.anuke.mindustry.core;
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.files.FileHandle;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.Pixmap;
-import com.badlogic.gdx.graphics.PixmapIO;
-import com.badlogic.gdx.graphics.g2d.SpriteBatch;
-import com.badlogic.gdx.math.Rectangle;
-import com.badlogic.gdx.math.Vector2;
-import com.badlogic.gdx.utils.BufferUtils;
-import com.badlogic.gdx.utils.ScreenUtils;
-import com.badlogic.gdx.utils.TimeUtils;
+import io.anuke.arc.ApplicationListener;
+import io.anuke.arc.Core;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.entities.EntityDraw;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.entities.impl.EffectEntity;
+import io.anuke.arc.entities.trait.DrawTrait;
+import io.anuke.arc.entities.trait.Entity;
+import io.anuke.arc.function.Consumer;
+import io.anuke.arc.function.Predicate;
+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;
+import io.anuke.arc.util.ScreenRecorder;
+import io.anuke.arc.util.Time;
+import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Player;
@@ -22,62 +32,45 @@ import io.anuke.mindustry.entities.traits.BelowLiquidTrait;
import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.graphics.*;
-import io.anuke.mindustry.world.blocks.defense.ForceProjector.ShieldEntity;
-import io.anuke.ucore.core.Core;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.core.Graphics;
-import io.anuke.ucore.core.Settings;
-import io.anuke.ucore.entities.EntityDraw;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.entities.impl.EffectEntity;
-import io.anuke.ucore.entities.trait.DrawTrait;
-import io.anuke.ucore.entities.trait.Entity;
-import io.anuke.ucore.function.Consumer;
-import io.anuke.ucore.function.Predicate;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Lines;
-import io.anuke.ucore.graphics.Surface;
-import io.anuke.ucore.modules.RendererModule;
-import io.anuke.ucore.scene.utils.Cursors;
-import io.anuke.ucore.util.Bundles;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.Pooling;
-import io.anuke.ucore.util.Translator;
+import static io.anuke.arc.Core.*;
import static io.anuke.mindustry.Vars.*;
-import static io.anuke.ucore.core.Core.batch;
-import static io.anuke.ucore.core.Core.camera;
-public class Renderer extends RendererModule{
- public final Surface effectSurface;
+public class Renderer implements ApplicationListener{
public final BlockRenderer blocks = new BlockRenderer();
public final MinimapRenderer minimap = new MinimapRenderer();
public final OverlayRenderer overlays = new OverlayRenderer();
- public final FogRenderer fog = new FogRenderer();
- private int targetscale = baseCameraScale;
+ private Color clearColor;
+ private float targetscale = io.anuke.arc.scene.ui.layout.Unit.dp.scl(4);
+ private float camerascale = targetscale;
private Rectangle rect = new Rectangle(), rect2 = new Rectangle();
- private Vector2 avgPosition = new Translator();
+ private Vector2 avgPosition = new Vector2();
+ private float shakeIntensity, shaketime;
public Renderer(){
- Core.batch = new SpriteBatch(4096);
-
+ batch = new SpriteBatch(4096);
+ camera = new Camera();
Lines.setCircleVertices(14);
Shaders.init();
- Core.cameraScale = baseCameraScale;
+ Effects.setScreenShakeProvider((intensity, duration) -> {
+ shakeIntensity = Math.max(intensity, shakeIntensity);
+ shaketime = Math.max(shaketime, duration);
+ });
+
Effects.setEffectProvider((effect, color, x, y, rotation, data) -> {
if(effect == Fx.none) return;
- if(Settings.getBool("effects")){
- Rectangle view = rect.setSize(camera.viewportWidth, camera.viewportHeight)
+ if(Core.settings.getBool("effects")){
+ Rectangle view = rect.setSize(camera.width, camera.height)
.setCenter(camera.position.x, camera.position.y);
Rectangle pos = rect2.setSize(effect.size).setCenter(x, y);
if(view.overlaps(pos)){
if(!(effect instanceof GroundEffect)){
- EffectEntity entity = Pooling.obtain(EffectEntity.class, EffectEntity::new);
+ EffectEntity entity = Pools.obtain(EffectEntity.class, EffectEntity::new);
entity.effect = effect;
entity.color = color;
entity.rotation = rotation;
@@ -87,9 +80,9 @@ public class Renderer extends RendererModule{
if(data instanceof Entity){
entity.setParent((Entity) data);
}
- threads.runGraphics(() -> effectGroup.add(entity));
+ effectGroup.add(entity);
}else{
- GroundEffectEntity entity = Pooling.obtain(GroundEffectEntity.class, GroundEffectEntity::new);
+ GroundEffectEntity entity = Pools.obtain(GroundEffectEntity.class, GroundEffectEntity::new);
entity.effect = effect;
entity.color = color;
entity.rotation = rotation;
@@ -99,30 +92,13 @@ public class Renderer extends RendererModule{
if(data instanceof Entity){
entity.setParent((Entity) data);
}
- threads.runGraphics(() -> groundEffectGroup.add(entity));
+ groundEffectGroup.add(entity);
}
}
}
});
- Cursors.cursorScaling = 3;
- Cursors.outlineColor = Color.valueOf("444444");
-
- Cursors.arrow = Cursors.loadCursor("cursor");
- Cursors.hand = Cursors.loadCursor("hand");
- Cursors.ibeam = Cursors.loadCursor("ibar");
- Cursors.restoreCursor();
- Cursors.loadCustom("drill");
- Cursors.loadCustom("unload");
-
clearColor = new Color(0f, 0f, 0f, 1f);
-
- effectSurface = Graphics.createSurface(Core.cameraScale);
- pixelSurface = Graphics.createSurface(Core.cameraScale);
- }
-
- @Override
- public void init(){
}
@Override
@@ -130,113 +106,77 @@ public class Renderer extends RendererModule{
//TODO hack, find source of this bug
Color.WHITE.set(1f, 1f, 1f, 1f);
- if(Core.cameraScale != targetscale){
- float targetzoom = (float) Core.cameraScale / targetscale;
- camera.zoom = Mathf.lerpDelta(camera.zoom, targetzoom, 0.2f);
-
- if(Mathf.in(camera.zoom, targetzoom, 0.005f)){
- camera.zoom = 1f;
- Graphics.setCameraScale(targetscale);
- for(Player player : players){
- control.input(player.playerIndex).resetCursor();
- }
- }
- }else{
- camera.zoom = Mathf.lerpDelta(camera.zoom, 1f, 0.2f);
- }
+ camerascale = Mathf.lerpDelta(camerascale, targetscale, 0.1f);
+ camera.width = graphics.getWidth() / camerascale;
+ camera.height = graphics.getHeight() / camerascale;
if(state.is(State.menu)){
- Graphics.clear(Color.BLACK);
+ graphics.clear(Color.BLACK);
}else{
Vector2 position = averagePosition();
if(players[0].isDead()){
TileEntity core = players[0].getClosestCore();
if(core != null && players[0].spawner == Unit.noSpawner){
- smoothCamera(core.x, core.y, 0.08f);
+ camera.position.lerpDelta(core.x, core.y, 0.08f);
}else{
- smoothCamera(position.x + 0.0001f, position.y + 0.0001f, 0.08f);
+ camera.position.lerpDelta(position, 0.08f);
}
}else if(!mobile){
- setCamera(position.x + 0.0001f, position.y + 0.0001f);
+ camera.position.lerpDelta(position, 0.08f);
}
+
camera.position.x = Mathf.clamp(camera.position.x, -tilesize / 2f, world.width() * tilesize - tilesize / 2f);
camera.position.y = Mathf.clamp(camera.position.y, -tilesize / 2f, world.height() * tilesize - tilesize / 2f);
- float prex = camera.position.x, prey = camera.position.y;
updateShake(0.75f);
- float deltax = camera.position.x - prex, deltay = camera.position.y - prey;
- float lastx = camera.position.x, lasty = camera.position.y;
-
- if(snapCamera){
- camera.position.set((int) camera.position.x, (int) camera.position.y, 0);
- }
-
- if(Gdx.graphics.getHeight() / Core.cameraScale % 2 == 1){
- camera.position.add(0, -0.5f, 0);
- }
-
- if(Gdx.graphics.getWidth() / Core.cameraScale % 2 == 1){
- camera.position.add(-0.5f, 0, 0);
- }
-
draw();
-
- camera.position.set(lastx - deltax, lasty - deltay, 0);
}
if(!ui.chatfrag.chatOpen()){
- renderer.record(); //this only does something if GdxGifRecorder is on the class path, which it usually isn't
+ ScreenRecorder.record(); //this only does something if CoreGifRecorder is on the class path, which it usually isn't
+ }
+ }
+
+ void updateShake(float scale){
+ if(shaketime > 0){
+ float intensity = shakeIntensity * (settings.getInt("screenshake", 4) / 4f) * scale;
+ camera.position.add(Mathf.range(intensity), Mathf.range(intensity));
+ shakeIntensity -= 0.25f * Time.delta();
+ shaketime -= Time.delta();
+ shakeIntensity = Mathf.clamp(shakeIntensity, 0f, 100f);
+ }else{
+ shakeIntensity = 0f;
}
}
- @Override
public void draw(){
camera.update();
- if(Float.isNaN(Core.camera.position.x) || Float.isNaN(Core.camera.position.y)){
- Core.camera.position.x = players[0].x;
- Core.camera.position.y = players[0].y;
+
+ if(Float.isNaN(camera.position.x) || Float.isNaN(camera.position.y)){
+ camera.position.x = players[0].x;
+ camera.position.y = players[0].y;
}
- Graphics.clear(clearColor);
+ graphics.clear(clearColor);
- batch.setProjectionMatrix(camera.combined);
+ Draw.proj(camera.projection());
- Graphics.surface(pixelSurface, false);
-
- Graphics.clear(clearColor);
-
- blocks.drawFloor();
+ blocks.floor.drawFloor();
drawAndInterpolate(groundEffectGroup, e -> e instanceof BelowLiquidTrait);
drawAndInterpolate(puddleGroup);
drawAndInterpolate(groundEffectGroup, e -> !(e instanceof BelowLiquidTrait));
blocks.processBlocks();
+
blocks.drawShadows();
- for(Team team : Team.all){
- if(blocks.isTeamShown(team)){
- boolean outline = team != players[0].getTeam() && team != Team.none;
+ blocks.drawBlocks(Layer.block);
- if(outline){
- Shaders.outline.color.set(team.color);
- Shaders.outline.color.a = 0.8f;
- Graphics.beginShaders(Shaders.outline);
- }
-
- blocks.drawTeamBlocks(Layer.block, team);
-
- if(outline){
- Graphics.endShaders();
- }
- }
- }
- blocks.skipLayer(Layer.block);
-
- Graphics.shader(Shaders.blockbuild, false);
+ Draw.shader(Shaders.blockbuild, true);
blocks.drawBlocks(Layer.placement);
- Graphics.shader();
+ Draw.shader();
blocks.drawBlocks(Layer.overlay);
@@ -255,39 +195,34 @@ public class Renderer extends RendererModule{
overlays.drawBottom();
drawAndInterpolate(playerGroup, p -> true, Player::drawBuildRequests);
- Graphics.beginShaders(Shaders.shield);
- EntityDraw.draw(shieldGroup);
- EntityDraw.drawWith(shieldGroup, shield -> true, shield -> ((ShieldEntity)shield).drawOver());
- Draw.color(Palette.accent);
- Graphics.endShaders();
- Draw.color();
+ //TODO shield
+ /*
+ if(shieldGroup.size() > 0){
+ Graphics.beginShaders(Shaders.shield);
+ EntityDraw.draw(shieldGroup);
+ EntityDraw.drawWith(shieldGroup, shield -> true, shield -> ((ShieldEntity)shield).drawOver());
+ Draw.color(Palette.accent);
+ Graphics.endShaders();
+ Draw.color();
+ }
+ */
overlays.drawTop();
- if(showFog){
- Graphics.surface();
- }else{
- Graphics.flushSurface();
- }
-
- batch.end();
-
- if(showFog){
- fog.draw();
- }
-
- Graphics.beginCam();
EntityDraw.setClip(false);
drawAndInterpolate(playerGroup, p -> !p.isDead() && !p.isLocal, Player::drawName);
EntityDraw.setClip(true);
- Graphics.end();
+
Draw.color();
+ Draw.flush();
}
private void drawFlyerShadows(){
- Graphics.surface(effectSurface, true, false);
+ //TODO fix flyer shadows
+ //Graphics.surface(effectSurface, true, false);
float trnsX = -12, trnsY = -13;
+ Draw.color(0, 0, 0, 0.15f);
for(EntityGroup extends BaseUnit> group : unitGroups){
if(!group.isEmpty()){
@@ -299,8 +234,8 @@ public class Renderer extends RendererModule{
drawAndInterpolate(playerGroup, unit -> unit.isFlying() && !unit.isDead(), player -> player.drawShadow(trnsX, trnsY));
}
- Draw.color(0, 0, 0, 0.15f);
- Graphics.flushSurface();
+ //Draw.color(0, 0, 0, 0.15f);
+ //Graphics.flushSurface();
Draw.color();
}
@@ -317,13 +252,13 @@ public class Renderer extends RendererModule{
Shaders.outline.color.set(team.color);
Shaders.mix.color.set(Color.WHITE);
- Graphics.beginShaders(Shaders.outline);
- Graphics.shader(Shaders.mix, true);
+ //Graphics.beginShaders(Shaders.outline);
+ Draw.shader(Shaders.mix, true);
drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawAll);
drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawAll);
- Graphics.shader();
+ Draw.shader();
blocks.drawTeamBlocks(Layer.turret, team);
- Graphics.endShaders();
+ //Graphics.endShaders();
drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawOver);
drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawOver);
@@ -342,20 +277,8 @@ public class Renderer extends RendererModule{
EntityDraw.drawWith(group, toDraw, drawer);
}
- @Override
- public void resize(int width, int height){
- float lastX = camera.position.x, lastY = camera.position.y;
- super.resize(width, height);
- for(Player player : players){
- control.input(player.playerIndex).resetCursor();
- }
- camera.update();
- camera.position.set(lastX, lastY, 0f);
- }
-
- @Override
- public void dispose(){
- fog.dispose();
+ public float cameraScale(){
+ return camerascale;
}
public Vector2 averagePosition(){
@@ -367,43 +290,35 @@ public class Renderer extends RendererModule{
return avgPosition;
}
- public void setCameraScale(int amount){
- targetscale = amount;
+ public void scaleCamera(float amount){
+ targetscale += amount;
clampScale();
- //scale up all surfaces in preparation for the zoom
- for(Surface surface : Graphics.getSurfaces()){
- surface.setScale(targetscale);
- }
- }
-
- public void scaleCamera(int amount){
- setCameraScale(targetscale + amount);
}
public void clampScale(){
- float s = io.anuke.ucore.scene.ui.layout.Unit.dp.scl(1f);
- targetscale = Mathf.clamp(targetscale, Math.round(s * 2), Math.round(s * 5));
+ float s = io.anuke.arc.scene.ui.layout.Unit.dp.scl(1f);
+ targetscale = Mathf.clamp(targetscale, s * 2.5f, Math.round(s * 7));
}
public void takeMapScreenshot(){
- float vpW = Core.camera.viewportWidth, vpH = Core.camera.viewportHeight;
+ //TODO fix/implement
+ /*
+ float vpW = camera.width, vpH = camera.height;
int w = world.width()*tilesize, h = world.height()*tilesize;
int pw = pixelSurface.width(), ph = pixelSurface.height();
- showFog = false;
disableUI = true;
pixelSurface.setSize(w, h, true);
Graphics.getEffectSurface().setSize(w, h, true);
- Core.camera.viewportWidth = w;
- Core.camera.viewportHeight = h;
- Core.camera.position.x = w/2f + tilesize/2f;
- Core.camera.position.y = h/2f + tilesize/2f;
+ camera.width = w;
+ camera.height = h;
+ camera.position.x = w/2f + tilesize/2f;
+ camera.position.y = h/2f + tilesize/2f;
draw();
- showFog = true;
disableUI = false;
- Core.camera.viewportWidth = vpW;
- Core.camera.viewportHeight = vpH;
+ camera.width = vpW;
+ camera.height = vpH;
pixelSurface.getBuffer().begin();
byte[] lines = ScreenUtils.getFrameBufferPixels(0, 0, w, h, true);
@@ -415,14 +330,14 @@ public class Renderer extends RendererModule{
Pixmap fullPixmap = new Pixmap(w, h, Pixmap.Format.RGBA8888);
BufferUtils.copy(lines, 0, fullPixmap.getPixels(), lines.length);
- FileHandle file = screenshotDirectory.child("screenshot-" + TimeUtils.millis() + ".png");
+ FileHandle file = screenshotDirectory.child("screenshot-" + Time.millis() + ".png");
PixmapIO.writePNG(file, fullPixmap);
fullPixmap.dispose();
pixelSurface.setSize(pw, ph, false);
Graphics.getEffectSurface().setSize(pw, ph, false);
- ui.showInfoFade(Bundles.format("text.screenshot", file.toString()));
+ ui.showInfoFade(Core.bundle.format("text.screenshot", file.toString()));*/
}
}
diff --git a/core/src/io/anuke/mindustry/core/ThreadHandler.java b/core/src/io/anuke/mindustry/core/ThreadHandler.java
deleted file mode 100644
index 700b816a92..0000000000
--- a/core/src/io/anuke/mindustry/core/ThreadHandler.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package io.anuke.mindustry.core;
-
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.utils.TimeUtils;
-import io.anuke.ucore.core.Settings;
-import io.anuke.ucore.core.Timers;
-
-public class ThreadHandler{
- private long lastFrameTime;
-
- public ThreadHandler(){
- Timers.setDeltaProvider(() -> {
- float result = Gdx.graphics.getDeltaTime() * 60f;
- return Float.isNaN(result) || Float.isInfinite(result) ? 1f : Math.min(result, 60f / 10f);
- });
- }
-
- public void run(Runnable r){
- r.run();
- }
-
- public void runGraphics(Runnable r){
- r.run();
- }
-
- public void runDelay(Runnable r){
- Gdx.app.postRunnable(r);
- }
-
- public long getFrameID(){
- return Gdx.graphics.getFrameId();
- }
-
- public void handleBeginRender(){
- lastFrameTime = TimeUtils.millis();
- }
-
- public void handleEndRender(){
- int fpsCap = Settings.getInt("fpscap", 125);
-
- if(fpsCap <= 120){
- long target = 1000/fpsCap;
- long elapsed = TimeUtils.timeSinceMillis(lastFrameTime);
- if(elapsed < target){
- try{
- Thread.sleep(target - elapsed);
- }catch(InterruptedException e){
- e.printStackTrace();
- }
- }
- }
- }
-
-}
diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java
index 27e8fd3569..f1acfeac89 100644
--- a/core/src/io/anuke/mindustry/core/UI.java
+++ b/core/src/io/anuke/mindustry/core/UI.java
@@ -1,47 +1,50 @@
package io.anuke.mindustry.core;
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.Input.Keys;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.Colors;
-import com.badlogic.gdx.graphics.g2d.BitmapFont;
-import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
-import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeFontParameter;
-import com.badlogic.gdx.math.Interpolation;
-import com.badlogic.gdx.utils.Align;
+import io.anuke.arc.ApplicationListener;
+import io.anuke.arc.Core;
+import io.anuke.arc.Events;
+import io.anuke.arc.Graphics.Cursor;
+import io.anuke.arc.Graphics.Cursor.SystemCursor;
+import io.anuke.arc.freetype.FreeTypeFontGenerator;
+import io.anuke.arc.freetype.FreeTypeFontGenerator.FreeTypeFontParameter;
+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.input.KeyCode;
+import io.anuke.arc.math.Interpolation;
+import io.anuke.arc.scene.Group;
+import io.anuke.arc.scene.Scene;
+import io.anuke.arc.scene.Skin;
+import io.anuke.arc.scene.actions.Actions;
+import io.anuke.arc.scene.ui.Dialog;
+import io.anuke.arc.scene.ui.TextField;
+import io.anuke.arc.scene.ui.TextField.TextFieldFilter;
+import io.anuke.arc.scene.ui.TooltipManager;
+import io.anuke.arc.scene.ui.layout.Table;
+import io.anuke.arc.scene.ui.layout.Unit;
+import io.anuke.arc.util.Align;
+import io.anuke.arc.util.Strings;
+import io.anuke.arc.util.Time;
import io.anuke.mindustry.editor.MapEditorDialog;
import io.anuke.mindustry.game.EventType.ResizeEvent;
import io.anuke.mindustry.graphics.Palette;
-import io.anuke.mindustry.input.InputHandler;
import io.anuke.mindustry.ui.dialogs.*;
import io.anuke.mindustry.ui.fragments.*;
-import io.anuke.ucore.core.*;
-import io.anuke.ucore.function.Consumer;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.modules.SceneModule;
-import io.anuke.ucore.scene.Group;
-import io.anuke.ucore.scene.Skin;
-import io.anuke.ucore.scene.actions.Actions;
-import io.anuke.ucore.scene.ui.Dialog;
-import io.anuke.ucore.scene.ui.TextField;
-import io.anuke.ucore.scene.ui.TextField.TextFieldFilter;
-import io.anuke.ucore.scene.ui.TooltipManager;
-import io.anuke.ucore.scene.ui.layout.Table;
-import io.anuke.ucore.scene.ui.layout.Unit;
-import io.anuke.ucore.util.Strings;
-import static io.anuke.mindustry.Vars.*;
-import static io.anuke.ucore.scene.actions.Actions.*;
+import static io.anuke.arc.scene.actions.Actions.*;
+import static io.anuke.mindustry.Vars.control;
+import static io.anuke.mindustry.Vars.disableUI;
-public class UI extends SceneModule{
+public class UI implements ApplicationListener{
private FreeTypeFontGenerator generator;
- public final MenuFragment menufrag = new MenuFragment();
- public final HudFragment hudfrag = new HudFragment();
- public final ChatFragment chatfrag = new ChatFragment();
- public final PlayerListFragment listfrag = new PlayerListFragment();
- public final BackgroundFragment backfrag = new BackgroundFragment();
- public final LoadingFragment loadfrag = new LoadingFragment();
+ public MenuFragment menufrag;
+ public HudFragment hudfrag;
+ public ChatFragment chatfrag;
+ public PlayerListFragment listfrag;
+ public BackgroundFragment backfrag;
+ public LoadingFragment loadfrag;
public AboutDialog about;
public RestartDialog restart;
@@ -66,11 +69,24 @@ public class UI extends SceneModule{
public SectorsDialog sectors;
public MissionDialog missions;
+ public Cursor drillCursor, unloadCursor;
+
public UI(){
+ Skin skin = new Skin(Core.atlas);
+ generateFonts(skin);
+ skin.load(Core.files.internal("ui/uiskin.json"));
+
+ for(BitmapFont font : skin.getAll(BitmapFont.class).values()){
+ font.setUseIntegerPositions(true);
+ }
+
+ Core.scene = new Scene(skin);
+ Core.input.addProcessor(Core.scene);
+
Dialog.setShowAction(() -> sequence(
alpha(0f),
originCenter(),
- moveToAligned(Gdx.graphics.getWidth() / 2f, Gdx.graphics.getHeight() / 2f, Align.center),
+ moveToAligned(Core.graphics.getWidth() / 2f, Core.graphics.getHeight() / 2f, Align.center),
scaleTo(0.0f, 1f),
parallel(
scaleTo(1f, 1f, 0.1f, Interpolation.fade),
@@ -87,16 +103,31 @@ public class UI extends SceneModule{
TooltipManager.getInstance().animations = false;
- Settings.setErrorHandler(() -> Timers.run(1f, () -> showError("[crimson]Failed to access local storage.\nSettings will not be saved.")));
-
- Dialog.closePadR = -1;
- Dialog.closePadT = 5;
+ Core.settings.setErrorHandler(e -> {
+ e.printStackTrace();
+ Core.app.post(() -> showError("Failed to access local storage.\nSettings will not be saved."));
+ });
Colors.put("accent", Palette.accent);
+
+ loadCursors();
+ }
+
+ void loadCursors(){
+ int cursorScaling = 3;
+ Color outlineColor = Color.valueOf("444444");
+
+ drillCursor = Core.graphics.newCursor("drill", cursorScaling, outlineColor);
+ unloadCursor = Core.graphics.newCursor("unload", cursorScaling, outlineColor);
+ SystemCursor.arrow.set(Core.graphics.newCursor("cursor", cursorScaling, outlineColor));
+ SystemCursor.hand.set(Core.graphics.newCursor("hand", cursorScaling, outlineColor));
+ SystemCursor.ibeam.set(Core.graphics.newCursor("ibeam", cursorScaling, outlineColor));
+
+ Core.graphics.restoreCursor();
}
- void generateFonts(){
- generator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/pixel.ttf"));
+ void generateFonts(Skin skin){
+ generator = new FreeTypeFontGenerator(Core.files.internal("fonts/pixel.ttf"));
FreeTypeFontParameter param = new FreeTypeFontParameter();
param.size = (int)(14*2 * Math.max(Unit.dp.scl(1f), 0.5f));
param.shadowColor = Color.DARK_GRAY;
@@ -109,46 +140,23 @@ public class UI extends SceneModule{
skin.getFont("default-font").setOwnsTexture(false);
}
- @Override
- protected void loadSkin(){
- skin = new Skin(Core.atlas);
- generateFonts();
- skin.load(Gdx.files.internal("ui/uiskin.json"));
-
- for(BitmapFont font : skin.getAll(BitmapFont.class).values()){
- font.setUseIntegerPositions(true);
- //font.getData().setScale(Vars.fontScale);
- }
- }
-
@Override
public void update(){
if(disableUI) return;
- if(Graphics.drawing()) Graphics.end();
-
- act();
-
- Graphics.begin();
-
- for(int i = 0; i < players.length; i++){
- InputHandler input = control.input(i);
-
- if(input.isCursorVisible()){
- Draw.color();
-
- float scl = Unit.dp.scl(3f);
-
- Draw.rect("controller-cursor", input.getMouseX(), Gdx.graphics.getHeight() - input.getMouseY(), 16 * scl, 16 * scl);
- }
- }
-
- Graphics.end();
- Draw.color();
+ Core.scene.act();
+ Core.scene.draw();
}
@Override
public void init(){
+ menufrag = new MenuFragment();
+ hudfrag = new HudFragment();
+ chatfrag = new ChatFragment();
+ listfrag = new PlayerListFragment();
+ backfrag = new BackgroundFragment();
+ loadfrag = new LoadingFragment();
+
editor = new MapEditorDialog();
controls = new ControlsDialog();
restart = new RestartDialog();
@@ -172,10 +180,10 @@ public class UI extends SceneModule{
sectors = new SectorsDialog();
missions = new MissionDialog();
- Group group = Core.scene.getRoot();
+ Group group = Core.scene.root;
backfrag.build(group);
- control.input(0).getFrag().build(Core.scene.getRoot());
+ control.input(0).getFrag().build(group);
hudfrag.build(group);
menufrag.build(group);
chatfrag.container().build(group);
@@ -185,14 +193,12 @@ public class UI extends SceneModule{
@Override
public void resize(int width, int height){
- super.resize(width, height);
-
+ Core.scene.resize(width, height);
Events.fire(new ResizeEvent());
}
@Override
public void dispose(){
- super.dispose();
generator.dispose();
}
@@ -202,7 +208,7 @@ public class UI extends SceneModule{
public void loadGraphics(String text, Runnable call){
loadfrag.show(text);
- Timers.runTask(7f, () -> {
+ Time.runTask(7f, () -> {
call.run();
loadfrag.hide();
});
@@ -214,10 +220,10 @@ public class UI extends SceneModule{
public void loadLogic(String text, Runnable call){
loadfrag.show(text);
- Timers.runTask(7f, () ->
- threads.run(() -> {
+ Time.runTask(7f, () ->
+ Core.app.post(() -> {
call.run();
- threads.runGraphics(loadfrag::hide);
+ loadfrag.hide();
}));
}
@@ -292,8 +298,8 @@ public class UI extends SceneModule{
dialog.hide();
confirmed.run();
});
- dialog.keyDown(Keys.ESCAPE, dialog::hide);
- dialog.keyDown(Keys.BACK, dialog::hide);
+ dialog.keyDown(KeyCode.ESCAPE, dialog::hide);
+ dialog.keyDown(KeyCode.BACK, dialog::hide);
dialog.show();
}
diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java
index 58dedd6e2a..490ac28612 100644
--- a/core/src/io/anuke/mindustry/core/World.java
+++ b/core/src/io/anuke/mindustry/core/World.java
@@ -1,8 +1,17 @@
package io.anuke.mindustry.core;
-import com.badlogic.gdx.math.GridPoint2;
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.ObjectMap;
+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.ObjectMap;
+import io.anuke.arc.entities.EntityQuery;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Point2;
+import io.anuke.arc.util.Log;
+import io.anuke.arc.util.Structs;
+import io.anuke.arc.util.Time;
+import io.anuke.arc.util.Tmp;
import io.anuke.mindustry.ai.BlockIndexer;
import io.anuke.mindustry.ai.Pathfinder;
import io.anuke.mindustry.ai.WaveSpawner;
@@ -18,15 +27,10 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Pos;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.OreBlock;
-import io.anuke.ucore.core.Events;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.entities.EntityQuery;
-import io.anuke.ucore.modules.Module;
-import io.anuke.ucore.util.*;
import static io.anuke.mindustry.Vars.*;
-public class World extends Module{
+public class World implements ApplicationListener{
public final Maps maps = new Maps();
public final Sectors sectors = new Sectors();
public final WorldGenerator generator = new WorldGenerator();
@@ -38,7 +42,7 @@ public class World extends Module{
private Sector currentSector;
private Tile[][] tiles;
- private Array tempTiles = new ThreadArray<>();
+ private Array tempTiles = new Array<>();
private boolean generating, invalidMap;
public World(){
@@ -121,11 +125,11 @@ public class World extends Module{
}
public Tile tileWorld(float x, float y){
- return tile(Mathf.scl2(x, tilesize), Mathf.scl2(y, tilesize));
+ return tile(Math.round(x / tilesize), Math.round(y / tilesize));
}
public int toTile(float coord){
- return Mathf.scl2(coord, tilesize);
+ return Math.round(coord / tilesize);
}
public Tile[][] getTiles(){
@@ -209,8 +213,8 @@ public class World extends Module{
currentSector = sector;
state.difficulty = sectors.getDifficulty(sector);
state.mode = sector.currentMission().getMode();
- Timers.mark();
- Timers.mark();
+ Time.mark();
+ Time.mark();
logic.reset();
@@ -247,7 +251,7 @@ public class World extends Module{
Log.err(e);
if(!headless){
ui.showError("$text.map.invalid");
- threads.runDelay(() -> state.set(State.menu));
+ Core.app.post(() -> state.set(State.menu));
invalidMap = true;
}
generating = false;
@@ -277,13 +281,13 @@ public class World extends Module{
invalidMap = false;
}
- if(invalidMap) threads.runDelay(() -> state.set(State.menu));
+ if(invalidMap) Core.app.post(() -> state.set(State.menu));
}
public void notifyChanged(Tile tile){
if(!generating){
- threads.runDelay(() -> Events.fire(new TileChangeEvent(tile)));
+ Core.app.post(() -> Events.fire(new TileChangeEvent(tile)));
}
}
@@ -334,9 +338,9 @@ public class World extends Module{
/**
* Raycast, but with world coordinates.
*/
- public GridPoint2 raycastWorld(float x, float y, float x2, float y2){
- return raycast(Mathf.scl2(x, tilesize), Mathf.scl2(y, tilesize),
- Mathf.scl2(x2, tilesize), Mathf.scl2(y2, tilesize));
+ public Point2 raycastWorld(float x, float y, float x2, float y2){
+ return raycast(Math.round(x / tilesize), Math.round(y / tilesize),
+ Math.round(x2 / tilesize), Math.round(y2 / tilesize));
}
/**
@@ -344,7 +348,7 @@ public class World extends Module{
*
* @return null if no collisions found, block position otherwise.
*/
- public GridPoint2 raycast(int x0f, int y0f, int x1, int y1){
+ public Point2 raycast(int x0f, int y0f, int x1, int y1){
int x0 = x0f;
int y0 = y0f;
int dx = Math.abs(x1 - x0);
diff --git a/core/src/io/anuke/mindustry/editor/DrawOperation.java b/core/src/io/anuke/mindustry/editor/DrawOperation.java
index d2b434e21f..b6b7d13f76 100755
--- a/core/src/io/anuke/mindustry/editor/DrawOperation.java
+++ b/core/src/io/anuke/mindustry/editor/DrawOperation.java
@@ -1,10 +1,10 @@
package io.anuke.mindustry.editor;
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.IntSet;
+import io.anuke.arc.collection.Array;
+import io.anuke.arc.collection.IntSet;
+import io.anuke.arc.util.Pack;
import io.anuke.mindustry.maps.MapTileData;
import io.anuke.mindustry.maps.MapTileData.TileDataMarker;
-import io.anuke.ucore.util.Bits;
public class DrawOperation{
/**
@@ -29,7 +29,7 @@ public class DrawOperation{
}
public boolean checkDuplicate(short x, short y){
- int i = Bits.packInt(x, y);
+ int i = Pack.shortInt(x, y);
if(checks.contains(i)) return true;
checks.add(i);
diff --git a/core/src/io/anuke/mindustry/editor/EditorTool.java b/core/src/io/anuke/mindustry/editor/EditorTool.java
index 6eca7e8fd4..3693f03266 100644
--- a/core/src/io/anuke/mindustry/editor/EditorTool.java
+++ b/core/src/io/anuke/mindustry/editor/EditorTool.java
@@ -1,15 +1,15 @@
package io.anuke.mindustry.editor;
-import com.badlogic.gdx.utils.IntArray;
+import io.anuke.arc.collection.IntArray;
+import io.anuke.arc.function.IntPositionConsumer;
+import io.anuke.arc.util.Pack;
+import io.anuke.arc.util.Structs;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.maps.MapTileData;
import io.anuke.mindustry.maps.MapTileData.DataPosition;
import io.anuke.mindustry.maps.MapTileData.TileDataMarker;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.Floor;
-import io.anuke.ucore.function.IntPositionConsumer;
-import io.anuke.ucore.util.Structs;
-import io.anuke.ucore.util.Bits;
import static io.anuke.mindustry.Vars.content;
import static io.anuke.mindustry.Vars.ui;
@@ -24,8 +24,8 @@ public enum EditorTool{
byte link = editor.getMap().read(x, y, DataPosition.link);
if(link != 0){
- x -= (Bits.getLeftByte(link) - 8);
- y -= (Bits.getRightByte(link) - 8);
+ x -= (Pack.leftByte(link) - 8);
+ y -= (Pack.rightByte(link) - 8);
bf = editor.getMap().read(x, y, DataPosition.floor);
bw = editor.getMap().read(x, y, DataPosition.wall);
}
@@ -101,7 +101,7 @@ public enum EditorTool{
byte bw = data.read(x, y, DataPosition.wall);
be = data.read(x, y, DataPosition.elevation);
boolean synth = editor.getDrawBlock().synthetic();
- byte brt = Bits.packByte((byte) editor.getDrawRotation(), (byte) editor.getDrawTeam().ordinal());
+ byte brt = Pack.byteByte((byte) editor.getDrawRotation(), (byte) editor.getDrawTeam().ordinal());
dest = floor ? bf : bw;
byte draw = editor.getDrawBlock().id;
diff --git a/core/src/io/anuke/mindustry/editor/MapEditor.java b/core/src/io/anuke/mindustry/editor/MapEditor.java
index 532e720622..369f9f6682 100644
--- a/core/src/io/anuke/mindustry/editor/MapEditor.java
+++ b/core/src/io/anuke/mindustry/editor/MapEditor.java
@@ -1,6 +1,9 @@
package io.anuke.mindustry.editor;
-import com.badlogic.gdx.utils.ObjectMap;
+import io.anuke.arc.collection.ObjectMap;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.util.Pack;
+import io.anuke.arc.util.Structs;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.editor.DrawOperation.TileOperation;
@@ -10,10 +13,9 @@ import io.anuke.mindustry.maps.MapTileData.DataPosition;
import io.anuke.mindustry.maps.MapTileData.TileDataMarker;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.Floor;
-import io.anuke.ucore.util.Structs;
-import io.anuke.ucore.util.Bits;
-import io.anuke.ucore.util.Mathf;
+
import static io.anuke.mindustry.Vars.content;
+
public class MapEditor{
public static final int[] brushSizes = {1, 2, 3, 4, 5, 9, 15};
@@ -103,7 +105,7 @@ public class MapEditor{
byte writeID = drawBlock.id;
byte partID = Blocks.blockpart.id;
- byte rotationTeam = Bits.packByte(drawBlock.rotate ? (byte) rotation : 0, drawBlock.synthetic() ? (byte) drawTeam.ordinal() : 0);
+ byte rotationTeam = Pack.byteByte(drawBlock.rotate ? (byte)rotation : 0, drawBlock.synthetic() ? (byte)drawTeam.ordinal() : 0);
boolean isfloor = drawBlock instanceof Floor && drawBlock != Blocks.air;
@@ -126,13 +128,13 @@ public class MapEditor{
if(i == 1){
map.write(worldx, worldy, DataPosition.wall, partID);
map.write(worldx, worldy, DataPosition.rotationTeam, rotationTeam);
- map.write(worldx, worldy, DataPosition.link, Bits.packByte((byte) (dx + offsetx + 8), (byte) (dy + offsety + 8)));
+ map.write(worldx, worldy, DataPosition.link, Pack.byteByte((byte) (dx + offsetx + 8), (byte) (dy + offsety + 8)));
}else{
byte link = map.read(worldx, worldy, DataPosition.link);
byte block = map.read(worldx, worldy, DataPosition.wall);
if(link != 0){
- removeLinked(worldx - (Bits.getLeftByte(link) - 8), worldy - (Bits.getRightByte(link) - 8));
+ removeLinked(worldx - (Pack.leftByte(link) - 8), worldy - (Pack.rightByte(link) - 8));
}else if(content.block(block).isMultiblock()){
removeLinked(worldx, worldy);
}
@@ -170,7 +172,7 @@ public class MapEditor{
if(content.block(map.read(wx, wy, DataPosition.wall)).isMultiblock()){
removeLinked(wx, wy);
}else if(link != 0){
- removeLinked(wx - (Bits.getLeftByte(link) - 8), wy - (Bits.getRightByte(link) - 8));
+ removeLinked(wx - (Pack.leftByte(link) - 8), wy - (Pack.rightByte(link) - 8));
}
}
diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java
index 90d18ac61e..8f3818e5f1 100644
--- a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java
+++ b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java
@@ -1,15 +1,22 @@
package io.anuke.mindustry.editor;
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.files.FileHandle;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.Pixmap;
-import com.badlogic.gdx.graphics.g2d.Batch;
-import com.badlogic.gdx.graphics.g2d.TextureRegion;
-import com.badlogic.gdx.math.Vector2;
-import com.badlogic.gdx.utils.Align;
-import com.badlogic.gdx.utils.Disposable;
-import com.badlogic.gdx.utils.ObjectMap;
+import io.anuke.arc.Core;
+import io.anuke.arc.collection.ObjectMap;
+import io.anuke.arc.files.FileHandle;
+import io.anuke.arc.function.Consumer;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.graphics.Pixmap;
+import io.anuke.arc.graphics.g2d.TextureRegion;
+import io.anuke.arc.input.KeyCode;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Vector2;
+import io.anuke.arc.scene.actions.Actions;
+import io.anuke.arc.scene.ui.*;
+import io.anuke.arc.scene.ui.layout.Stack;
+import io.anuke.arc.scene.ui.layout.Table;
+import io.anuke.arc.scene.ui.layout.Unit;
+import io.anuke.arc.scene.utils.UIUtils;
+import io.anuke.arc.util.*;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.content.blocks.StorageBlocks;
import io.anuke.mindustry.core.Platform;
@@ -21,26 +28,8 @@ import io.anuke.mindustry.maps.MapTileData;
import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import io.anuke.mindustry.world.Block;
-import io.anuke.ucore.core.Core;
-import io.anuke.ucore.core.Graphics;
-import io.anuke.ucore.core.Inputs;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.function.Consumer;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.input.Input;
-import io.anuke.ucore.scene.actions.Actions;
-import io.anuke.ucore.scene.ui.*;
-import io.anuke.ucore.scene.ui.layout.Stack;
-import io.anuke.ucore.scene.ui.layout.Table;
-import io.anuke.ucore.scene.ui.layout.Unit;
-import io.anuke.ucore.scene.utils.UIUtils;
-import io.anuke.ucore.util.Bundles;
-import io.anuke.ucore.util.Log;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.Strings;
import java.io.DataInputStream;
-import java.io.IOException;
import java.io.InputStream;
import static io.anuke.mindustry.Vars.*;
@@ -96,26 +85,24 @@ public class MapEditorDialog extends Dialog implements Disposable{
t.addImageTextButton("$text.editor.import", "icon-load-map", isize, () ->
createDialog("$text.editor.import",
"$text.editor.importmap", "$text.editor.importmap.description", "icon-load-map", (Runnable) loadDialog::show,
- "$text.editor.importfile", "$text.editor.importfile.description", "icon-file", (Runnable) () -> {
- Platform.instance.showFileChooser("$text.loadimage", "Map Files", file -> {
- ui.loadGraphics(() -> {
- try{
- DataInputStream stream = new DataInputStream(file.read());
+ "$text.editor.importfile", "$text.editor.importfile.description", "icon-file", (Runnable) () ->
+ Platform.instance.showFileChooser("$text.loadimage", "Map Files", file -> ui.loadGraphics(() -> {
+ try{
+ DataInputStream stream = new DataInputStream(file.read());
- MapMeta meta = MapIO.readMapMeta(stream);
- MapTileData data = MapIO.readTileData(stream, meta, false);
+ MapMeta meta = MapIO.readMapMeta(stream);
+ MapTileData data = MapIO.readTileData(stream, meta, false);
- editor.beginEdit(data, meta.tags, false);
- view.clearStack();
- }catch(Exception e){
- ui.showError(Bundles.format("text.editor.errorimageload", Strings.parseException(e, false)));
- Log.err(e);
- }
- });
- }, true, mapExtension);
- },
- "$text.editor.importimage", "$text.editor.importimage.description", "icon-file-image", (Runnable)() -> {
- Platform.instance.showFileChooser("$text.loadimage", "Image Files", file -> {
+ editor.beginEdit(data, meta.tags, false);
+ view.clearStack();
+ }catch(Exception e){
+ ui.showError(Core.bundle.format("text.editor.errorimageload", Strings.parseException(e, false)));
+ Log.err(e);
+ }
+ }), true, mapExtension),
+
+ "$text.editor.importimage", "$text.editor.importimage.description", "icon-file-image", (Runnable)() ->
+ Platform.instance.showFileChooser("$text.loadimage", "Image Files", file ->
ui.loadGraphics(() -> {
try{
MapTileData data = MapIO.readLegacyPixmap(new Pixmap(file));
@@ -123,15 +110,14 @@ public class MapEditorDialog extends Dialog implements Disposable{
editor.beginEdit(data, editor.getTags(), false);
view.clearStack();
}catch (Exception e){
- ui.showError(Bundles.format("text.editor.errorimageload", Strings.parseException(e, false)));
+ ui.showError(Core.bundle.format("text.editor.errorimageload", Strings.parseException(e, false)));
Log.err(e);
}
- });
- }, true, "png");
- }));
+ }), true, "png")
+ ));
t.addImageTextButton("$text.editor.export", "icon-save-map", isize, () -> createDialog("$text.editor.export",
- "$text.editor.exportfile", "$text.editor.exportfile.description", "icon-file", (Runnable) () -> {
+ "$text.editor.exportfile", "$text.editor.exportfile.description", "icon-file", (Runnable) () ->
Platform.instance.showFileChooser("$text.saveimage", "Map Files", file -> {
file = file.parent().child(file.nameWithoutExtension() + "." + mapExtension);
FileHandle result = file;
@@ -143,12 +129,11 @@ public class MapEditorDialog extends Dialog implements Disposable{
}
MapIO.writeMap(result.write(false), editor.getTags(), editor.getMap());
}catch(Exception e){
- ui.showError(Bundles.format("text.editor.errorimagesave", Strings.parseException(e, false)));
+ ui.showError(Core.bundle.format("text.editor.errorimagesave", Strings.parseException(e, false)));
Log.err(e);
}
});
- }, false, mapExtension);
- }));
+ }, false, mapExtension)));
t.row();
@@ -171,8 +156,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
}
});
- loadDialog = new MapLoadDialog(map -> {
-
+ loadDialog = new MapLoadDialog(map ->
ui.loadGraphics(() -> {
try(DataInputStream stream = new DataInputStream(map.stream.get())){
MapMeta meta = MapIO.readMapMeta(stream);
@@ -180,12 +164,11 @@ public class MapEditorDialog extends Dialog implements Disposable{
editor.beginEdit(data, meta.tags, false);
view.clearStack();
- }catch(IOException e){
- ui.showError(Bundles.format("text.editor.errormapload", Strings.parseException(e, false)));
+ }catch(Exception e){
+ ui.showError(Core.bundle.format("text.editor.errormapload", Strings.parseException(e, false)));
Log.err(e);
}
- });
- });
+ }));
setFillParent(true);
@@ -198,7 +181,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
return;
}
- Vector2 v = pane.stageToLocalCoordinates(Graphics.mouse());
+ Vector2 v = pane.stageToLocalCoordinates(Core.input.mouse());
if(v.x >= 0 && v.y >= 0 && v.x <= pane.getWidth() && v.y <= pane.getHeight()){
Core.scene.setScrollFocus(pane);
@@ -221,7 +204,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
}
shownWithMap = false;
- Timers.runTask(10f, Platform.instance::updateRPC);
+ Time.runTask(10f, Platform.instance::updateRPC);
});
hidden(() -> {
@@ -231,8 +214,8 @@ public class MapEditorDialog extends Dialog implements Disposable{
}
@Override
- protected void drawBackground(Batch batch, float parentAlpha, float x, float y){
- drawDefaultBackground(batch, parentAlpha, x, y);
+ protected void drawBackground(float x, float y){
+ drawDefaultBackground(x, y);
}
private void save(){
@@ -261,7 +244,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
* 2) icon name
* 3) listener
*/
- private FloatingDialog createDialog(String title, Object... arguments){
+ private void createDialog(String title, Object... arguments){
FloatingDialog dialog = new FloatingDialog(title);
float h = 90f;
@@ -278,18 +261,15 @@ public class MapEditorDialog extends Dialog implements Disposable{
listenable.run();
dialog.hide();
menu.hide();
- }).left().get();
+ }).left().margin(0).get();
button.clearChildren();
- button.table("button", t -> {
- t.addImage(iconname).size(16 * 3);
- t.update(() -> t.background(button.getClickListener().isOver() ? "button-over" : "button"));
- }).padLeft(-10).padBottom(-3).size(h);
+ button.addImage(iconname).size(16 * 3).padLeft(10);
button.table(t -> {
t.add(name).growX().wrap();
t.row();
t.add(description).color(Color.GRAY).growX().wrap();
- }).growX().padLeft(8);
+ }).growX().pad(10f).padLeft(5);
button.row();
@@ -298,8 +278,6 @@ public class MapEditorDialog extends Dialog implements Disposable{
dialog.addCloseButton();
dialog.show();
-
- return dialog;
}
@Override
@@ -323,7 +301,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
show();
}catch(Exception e){
Log.err(e);
- ui.showError(Bundles.format("text.editor.errorimageload", Strings.parseException(e, false)));
+ ui.showError(Core.bundle.format("text.editor.errorimageload", Strings.parseException(e, false)));
}
});
}
@@ -353,8 +331,8 @@ public class MapEditorDialog extends Dialog implements Disposable{
public void build(){
float amount = 10f, baseSize = 60f;
- float size = mobile ? (int) (Math.min(Gdx.graphics.getHeight(), Gdx.graphics.getWidth()) / amount / Unit.dp.scl(1f)) :
- Math.min(Gdx.graphics.getDisplayMode().height / amount, baseSize);
+ float size = mobile ? (int) (Math.min(Core.graphics.getHeight(), Core.graphics.getWidth()) / amount / Unit.dp.scl(1f)) :
+ Math.min(Core.graphics.getDisplayMode().height / amount, baseSize);
clearChildren();
table(cont -> {
@@ -421,7 +399,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
tools.row();
tools.table("underline", t -> t.add("$text.editor.teams"))
- .colspan(3).height(40).width(size * 3f).padBottom(3);
+ .colspan(3).height(40).width(size * 3f + 3f).padBottom(3);
tools.row();
@@ -459,7 +437,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
mid.row();
mid.table("underline", t -> t.add("$text.editor.elevation"))
- .colspan(3).height(40).width(size * 3f);
+ .colspan(3).height(40).width(size * 3f + 3f);
mid.row();
@@ -472,8 +450,8 @@ public class MapEditorDialog extends Dialog implements Disposable{
.size(size).get().setAlignment(Align.center, Align.center);
t.addImageButton("icon-arrow-right", "clear-partial", 16 * 2f, () -> editor.setDrawElevation(editor.getDrawElevation() + 1))
- .disabled(b -> editor.getDrawElevation() >= 63).size(size);
- }).colspan(3).height(size).width(size * 3f);
+ .disabled(b -> editor.getDrawElevation() >= 63).size(size).name("aaaaa");
+ }).colspan(3).height(size).width(size * 3f + 3f);
}).margin(0).left().growY();
@@ -488,35 +466,35 @@ public class MapEditorDialog extends Dialog implements Disposable{
private void doInput(){
//tool select
for(int i = 0; i < EditorTool.values().length; i++){
- if(Inputs.keyTap(Input.valueOf("NUM_" + (i + 1)))){
+ if(Core.input.keyTap(KeyCode.valueOf("NUM_" + (i + 1)))){
view.setTool(EditorTool.values()[i]);
break;
}
}
- if(Inputs.keyTap(Input.R)){
+ if(Core.input.keyTap(KeyCode.R)){
editor.setDrawRotation((editor.getDrawRotation() + 1) % 4);
}
- if(Inputs.keyTap(Input.E)){
+ if(Core.input.keyTap(KeyCode.E)){
editor.setDrawRotation(Mathf.mod((editor.getDrawRotation() + 1), 4));
}
//ctrl keys (undo, redo, save)
if(UIUtils.ctrl()){
- if(Inputs.keyTap(Input.Z)){
+ if(Core.input.keyTap(KeyCode.Z)){
view.undo();
}
- if(Inputs.keyTap(Input.Y)){
+ if(Core.input.keyTap(KeyCode.Y)){
view.redo();
}
- if(Inputs.keyTap(Input.S)){
+ if(Core.input.keyTap(KeyCode.S)){
save();
}
- if(Inputs.keyTap(Input.G)){
+ if(Core.input.keyTap(KeyCode.G)){
view.setGrid(!view.isGrid());
}
}
@@ -551,7 +529,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
continue;
}
- if(regions.length == 0 || regions[0] == Draw.region("jjfgj")) continue;
+ if(regions.length == 0 || regions[0] == Core.atlas.find("jjfgj")) continue;
Stack stack = new Stack();
@@ -562,9 +540,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
ImageButton button = new ImageButton("white", "clear-toggle");
button.clicked(() -> editor.setDrawBlock(block));
button.resizeImage(8 * 4f);
- button.getImageCell().setActor(stack);
- button.addChild(stack);
- button.getImage().remove();
+ button.replaceImage(stack);
button.update(() -> button.setChecked(editor.getDrawBlock() == block));
group.add(button);
content.add(button).size(50f);
diff --git a/core/src/io/anuke/mindustry/editor/MapInfoDialog.java b/core/src/io/anuke/mindustry/editor/MapInfoDialog.java
index 6f4a046d45..25e8002a54 100644
--- a/core/src/io/anuke/mindustry/editor/MapInfoDialog.java
+++ b/core/src/io/anuke/mindustry/editor/MapInfoDialog.java
@@ -1,11 +1,11 @@
package io.anuke.mindustry.editor;
-import com.badlogic.gdx.utils.ObjectMap;
+import io.anuke.arc.Core;
+import io.anuke.arc.collection.ObjectMap;
+import io.anuke.arc.scene.ui.TextArea;
+import io.anuke.arc.scene.ui.TextField;
import io.anuke.mindustry.core.Platform;
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
-import io.anuke.ucore.core.Settings;
-import io.anuke.ucore.scene.ui.TextArea;
-import io.anuke.ucore.scene.ui.TextField;
public class MapInfoDialog extends FloatingDialog{
private final MapEditor editor;
@@ -53,10 +53,10 @@ public class MapInfoDialog extends FloatingDialog{
content().add("$text.editor.author").padRight(8).left();
- author = content().addField(tags.get("author", Settings.getString("mapAuthor", "")), text -> {
+ author = content().addField(tags.get("author", Core.settings.getString("mapAuthor", "")), text -> {
tags.put("author", text);
- Settings.putString("mapAuthor", text);
- Settings.save();
+ Core.settings.put("mapAuthor", text);
+ Core.settings.save();
}).size(400, 55f).get();
author.setMessageText("$text.unknown");
diff --git a/core/src/io/anuke/mindustry/editor/MapLoadDialog.java b/core/src/io/anuke/mindustry/editor/MapLoadDialog.java
index c819cd0a3a..cd6881901e 100644
--- a/core/src/io/anuke/mindustry/editor/MapLoadDialog.java
+++ b/core/src/io/anuke/mindustry/editor/MapLoadDialog.java
@@ -1,14 +1,14 @@
package io.anuke.mindustry.editor;
-import com.badlogic.gdx.utils.Scaling;
+import io.anuke.arc.util.Scaling;
import io.anuke.mindustry.maps.Map;
import io.anuke.mindustry.ui.BorderImage;
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
-import io.anuke.ucore.function.Consumer;
-import io.anuke.ucore.scene.ui.ButtonGroup;
-import io.anuke.ucore.scene.ui.ScrollPane;
-import io.anuke.ucore.scene.ui.TextButton;
-import io.anuke.ucore.scene.ui.layout.Table;
+import io.anuke.arc.function.Consumer;
+import io.anuke.arc.scene.ui.ButtonGroup;
+import io.anuke.arc.scene.ui.ScrollPane;
+import io.anuke.arc.scene.ui.TextButton;
+import io.anuke.arc.scene.ui.layout.Table;
import static io.anuke.mindustry.Vars.world;
diff --git a/core/src/io/anuke/mindustry/editor/MapRenderer.java b/core/src/io/anuke/mindustry/editor/MapRenderer.java
index bd4b7b8f43..9d7547ff0d 100644
--- a/core/src/io/anuke/mindustry/editor/MapRenderer.java
+++ b/core/src/io/anuke/mindustry/editor/MapRenderer.java
@@ -1,21 +1,20 @@
package io.anuke.mindustry.editor;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.g2d.TextureRegion;
-import com.badlogic.gdx.math.GridPoint2;
-import com.badlogic.gdx.utils.Disposable;
-import com.badlogic.gdx.utils.IntSet;
-import com.badlogic.gdx.utils.IntSet.IntSetIterator;
+import io.anuke.arc.Core;
+import io.anuke.arc.collection.IntSet;
+import io.anuke.arc.collection.IntSet.IntSetIterator;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.graphics.g2d.TextureRegion;
+import io.anuke.arc.math.geom.Geometry;
+import io.anuke.arc.math.geom.Point2;
+import io.anuke.arc.util.Disposable;
+import io.anuke.arc.util.Pack;
+import io.anuke.arc.util.Structs;
import io.anuke.mindustry.game.Team;
+import io.anuke.mindustry.graphics.IndexedRenderer;
import io.anuke.mindustry.maps.MapTileData.DataPosition;
import io.anuke.mindustry.world.Block;
-import io.anuke.ucore.core.Core;
-import io.anuke.ucore.core.Graphics;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.IndexedRenderer;
-import io.anuke.ucore.util.Structs;
-import io.anuke.ucore.util.Bits;
-import io.anuke.ucore.util.Geometry;
import static io.anuke.mindustry.Vars.content;
import static io.anuke.mindustry.Vars.tilesize;
@@ -56,7 +55,7 @@ public class MapRenderer implements Disposable{
public void draw(float tx, float ty, float tw, float th){
- Graphics.end();
+ Draw.flush();
IntSetIterator it = updates.iterator();
while(it.hasNext){
@@ -79,15 +78,12 @@ public class MapRenderer implements Disposable{
mesh = chunks[x][y];
}
- mesh.getTransformMatrix().setToTranslation(tx, ty, 0).scl(tw / (width * tilesize),
- th / (height * tilesize), 1f);
- mesh.setProjectionMatrix(Core.batch.getProjectionMatrix());
+ mesh.getTransformMatrix().setToTranslation(tx, ty).scale(tw / (width * tilesize), th / (height * tilesize));
+ mesh.setProjectionMatrix(Draw.proj());
mesh.render(Core.atlas.getTextures().first());
}
}
-
- Graphics.begin();
}
public void updatePoint(int x, int y){
@@ -111,8 +107,8 @@ public class MapRenderer implements Disposable{
byte bw = editor.getMap().read(wx, wy, DataPosition.wall);
byte btr = editor.getMap().read(wx, wy, DataPosition.rotationTeam);
byte elev = editor.getMap().read(wx, wy, DataPosition.elevation);
- byte rotation = Bits.getLeftByte(btr);
- Team team = Team.all[Bits.getRightByte(btr)];
+ byte rotation = Pack.leftByte(btr);
+ Team team = Team.all[Pack.rightByte(btr)];
Block floor = content.block(bf);
Block wall = content.block(bw);
@@ -125,12 +121,12 @@ public class MapRenderer implements Disposable{
if(wall.rotate){
mesh.draw((wx % chunksize) + (wy % chunksize) * chunksize, region,
wx * tilesize + wall.offset(), wy * tilesize + wall.offset(),
- region.getRegionWidth(), region.getRegionHeight(), rotation * 90 - 90);
+ region.getWidth() * Draw.scl, region.getHeight() * Draw.scl, rotation * 90 - 90);
}else{
mesh.draw((wx % chunksize) + (wy % chunksize) * chunksize, region,
- wx * tilesize + wall.offset() + (tilesize - region.getRegionWidth())/2f,
- wy * tilesize + wall.offset() + (tilesize - region.getRegionHeight())/2f,
- region.getRegionWidth(), region.getRegionHeight());
+ wx * tilesize + wall.offset() + (tilesize - region.getWidth() * Draw.scl)/2f,
+ wy * tilesize + wall.offset() + (tilesize - region.getHeight() * Draw.scl)/2f,
+ region.getWidth() * Draw.scl, region.getHeight() * Draw.scl);
}
}else{
region = floor.getEditorIcon();
@@ -142,24 +138,24 @@ public class MapRenderer implements Disposable{
if(wall.update || wall.destructible){
mesh.setColor(team.color);
- region = Draw.region("block-border");
+ region = Core.atlas.find("block-border");
}else if(elev > 0 && check){
mesh.setColor(tmpColor.fromHsv((360f * elev / 127f * 4f) % 360f, 0.5f + (elev / 4f) % 0.5f, 1f));
- region = Draw.region("block-elevation");
+ region = Core.atlas.find("block-elevation");
}else if(elev == -1){
- region = Draw.region("block-slope");
+ region = Core.atlas.find("block-slope");
}else{
- region = Draw.region("clear");
+ region = Core.atlas.find("clear");
}
mesh.draw((wx % chunksize) + (wy % chunksize) * chunksize + chunksize * chunksize, region,
wx * tilesize - (wall.size/3) * tilesize, wy * tilesize - (wall.size/3) * tilesize,
- region.getRegionWidth(), region.getRegionHeight());
+ region.getWidth() * Draw.scl, region.getHeight() * Draw.scl);
mesh.setColor(Color.WHITE);
}
private boolean checkElevation(byte elev, int x, int y){
- for(GridPoint2 p : Geometry.d4){
+ for(Point2 p : Geometry.d4){
int wx = x + p.x, wy = y + p.y;
if(!Structs.inBounds(wx, wy, editor.getMap().width(), editor.getMap().height())){
return true;
diff --git a/core/src/io/anuke/mindustry/editor/MapResizeDialog.java b/core/src/io/anuke/mindustry/editor/MapResizeDialog.java
index 84f2ae4d51..1b493f5daf 100644
--- a/core/src/io/anuke/mindustry/editor/MapResizeDialog.java
+++ b/core/src/io/anuke/mindustry/editor/MapResizeDialog.java
@@ -2,11 +2,11 @@ package io.anuke.mindustry.editor;
import io.anuke.mindustry.maps.MapTileData;
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
-import io.anuke.ucore.function.BiConsumer;
-import io.anuke.ucore.scene.ui.ButtonGroup;
-import io.anuke.ucore.scene.ui.TextButton;
-import io.anuke.ucore.scene.ui.layout.Table;
-import io.anuke.ucore.util.Mathf;
+import io.anuke.arc.function.BiConsumer;
+import io.anuke.arc.scene.ui.ButtonGroup;
+import io.anuke.arc.scene.ui.TextButton;
+import io.anuke.arc.scene.ui.layout.Table;
+import io.anuke.arc.math.Mathf;
public class MapResizeDialog extends FloatingDialog{
int[] validMapSizes = {200, 300, 400, 500};
diff --git a/core/src/io/anuke/mindustry/editor/MapSaveDialog.java b/core/src/io/anuke/mindustry/editor/MapSaveDialog.java
index a8a377b921..1b2f2de543 100644
--- a/core/src/io/anuke/mindustry/editor/MapSaveDialog.java
+++ b/core/src/io/anuke/mindustry/editor/MapSaveDialog.java
@@ -3,9 +3,9 @@ package io.anuke.mindustry.editor;
import io.anuke.mindustry.core.Platform;
import io.anuke.mindustry.maps.Map;
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
-import io.anuke.ucore.function.Consumer;
-import io.anuke.ucore.scene.ui.TextButton;
-import io.anuke.ucore.scene.ui.TextField;
+import io.anuke.arc.function.Consumer;
+import io.anuke.arc.scene.ui.TextButton;
+import io.anuke.arc.scene.ui.TextField;
import static io.anuke.mindustry.Vars.ui;
import static io.anuke.mindustry.Vars.world;
diff --git a/core/src/io/anuke/mindustry/editor/MapView.java b/core/src/io/anuke/mindustry/editor/MapView.java
index baa0edca5c..fa250bc3f4 100644
--- a/core/src/io/anuke/mindustry/editor/MapView.java
+++ b/core/src/io/anuke/mindustry/editor/MapView.java
@@ -1,32 +1,27 @@
package io.anuke.mindustry.editor;
-import com.badlogic.gdx.Input.Buttons;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.g2d.Batch;
-import com.badlogic.gdx.input.GestureDetector;
-import com.badlogic.gdx.input.GestureDetector.GestureListener;
-import com.badlogic.gdx.math.Bresenham2;
-import com.badlogic.gdx.math.GridPoint2;
-import com.badlogic.gdx.math.Rectangle;
-import com.badlogic.gdx.math.Vector2;
-import com.badlogic.gdx.utils.Array;
+import io.anuke.arc.Core;
+import io.anuke.arc.collection.Array;
+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.ScissorStack;
+import io.anuke.arc.input.GestureDetector;
+import io.anuke.arc.input.GestureDetector.GestureListener;
+import io.anuke.arc.input.KeyCode;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.*;
+import io.anuke.arc.scene.Element;
+import io.anuke.arc.scene.event.InputEvent;
+import io.anuke.arc.scene.event.InputListener;
+import io.anuke.arc.scene.event.Touchable;
+import io.anuke.arc.scene.ui.TextField;
+import io.anuke.arc.scene.ui.layout.Unit;
+import io.anuke.arc.util.Tmp;
import io.anuke.mindustry.editor.DrawOperation.TileOperation;
import io.anuke.mindustry.graphics.Palette;
+import io.anuke.mindustry.input.Binding;
import io.anuke.mindustry.ui.GridImage;
-import io.anuke.ucore.core.Core;
-import io.anuke.ucore.core.Graphics;
-import io.anuke.ucore.core.Inputs;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Lines;
-import io.anuke.ucore.scene.Element;
-import io.anuke.ucore.scene.event.InputEvent;
-import io.anuke.ucore.scene.event.InputListener;
-import io.anuke.ucore.scene.event.Touchable;
-import io.anuke.ucore.scene.ui.TextField;
-import io.anuke.ucore.scene.ui.layout.Unit;
-import io.anuke.ucore.util.Geometry;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.Tmp;
import static io.anuke.mindustry.Vars.mobile;
import static io.anuke.mindustry.Vars.ui;
@@ -57,11 +52,11 @@ public class MapView extends Element implements GestureListener{
for(int i = 0; i < MapEditor.brushSizes.length; i++){
float size = MapEditor.brushSizes[i];
- brushPolygons[i] = Geometry.pixelCircle(size, (index, x, y) -> Vector2.dst(x, y, index, index) <= index - 0.5f);
+ brushPolygons[i] = Geometry.pixelCircle(size, (index, x, y) -> Mathf.dst(x, y, index, index) <= index - 0.5f);
}
- Inputs.addProcessor(0, new GestureDetector(20, 0.5f, 2, 0.15f, this));
- setTouchable(Touchable.enabled);
+ Core.input.getInputProcessors().insert(0, new GestureDetector(20, 0.5f, 2, 0.15f, this));
+ touchable(Touchable.enabled);
addListener(new InputListener(){
@@ -74,16 +69,16 @@ public class MapView extends Element implements GestureListener{
}
@Override
- public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){
+ public boolean touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){
if(pointer != 0){
return false;
}
- if(!mobile && button != Buttons.LEFT && button != Buttons.MIDDLE){
+ if(!mobile && button != KeyCode.MOUSE_LEFT && button != KeyCode.MOUSE_MIDDLE){
return true;
}
- if(button == Buttons.MIDDLE){
+ if(button == KeyCode.MOUSE_MIDDLE){
lastTool = tool;
tool = EditorTool.zoom;
}
@@ -95,7 +90,7 @@ public class MapView extends Element implements GestureListener{
updated = false;
- GridPoint2 p = project(x, y);
+ Point2 p = project(x, y);
lastx = p.x;
lasty = p.y;
startx = p.x;
@@ -112,19 +107,19 @@ public class MapView extends Element implements GestureListener{
}
@Override
- public void touchUp(InputEvent event, float x, float y, int pointer, int button){
- if(!mobile && button != Buttons.LEFT && button != Buttons.MIDDLE){
+ public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button){
+ if(!mobile && button != KeyCode.MOUSE_LEFT && button != KeyCode.MOUSE_MIDDLE){
return;
}
drawing = false;
- GridPoint2 p = project(x, y);
+ Point2 p = project(x, y);
if(tool == EditorTool.line){
ui.editor.resetSaved();
- Array points = br.line(startx, starty, p.x, p.y);
- for(GridPoint2 point : points){
+ Array points = br.line(startx, starty, p.x, p.y);
+ for(Point2 point : points){
editor.draw(point.x, point.y);
}
updated = true;
@@ -149,12 +144,12 @@ public class MapView extends Element implements GestureListener{
mousex = x;
mousey = y;
- GridPoint2 p = project(x, y);
+ Point2 p = project(x, y);
if(drawing && tool.draggable){
ui.editor.resetSaved();
- Array points = br.line(lastx, lasty, p.x, p.y);
- for(GridPoint2 point : points){
+ Array points = br.line(lastx, lasty, p.x, p.y);
+ for(Point2 point : points){
tool.touched(editor, point.x, point.y);
}
updated = true;
@@ -214,16 +209,16 @@ public class MapView extends Element implements GestureListener{
super.act(delta);
if(Core.scene.getKeyboardFocus() == null || !(Core.scene.getKeyboardFocus() instanceof TextField) &&
- !Inputs.keyDown(io.anuke.ucore.input.Input.CONTROL_LEFT)){
- float ax = Inputs.getAxis("move_x");
- float ay = Inputs.getAxis("move_y");
+ !Core.input.keyDown(KeyCode.CONTROL_LEFT)){
+ float ax = Core.input.axis(Binding.move_x);
+ float ay = Core.input.axis(Binding.move_y);
offsetx -= ax * 15f / zoom;
offsety -= ay * 15f / zoom;
}
if(ui.editor.hasPane()) return;
- zoom += Inputs.scroll() / 10f * zoom;
+ zoom += Core.input.axis(KeyCode.SCROLL) / 10f * zoom;
clampZoom();
}
@@ -231,7 +226,7 @@ public class MapView extends Element implements GestureListener{
zoom = Mathf.clamp(zoom, 0.2f, 12f);
}
- private GridPoint2 project(float x, float y){
+ private Point2 project(float x, float y){
float ratio = 1f / ((float) editor.getMap().width() / editor.getMap().height());
float size = Math.min(width, height);
float sclwidth = size * zoom;
@@ -258,7 +253,7 @@ public class MapView extends Element implements GestureListener{
}
@Override
- public void draw(Batch batch, float alpha){
+ public void draw(){
float ratio = 1f / ((float) editor.getMap().width() / editor.getMap().height());
float size = Math.min(width, height);
float sclwidth = size * zoom;
@@ -268,7 +263,9 @@ public class MapView extends Element implements GestureListener{
image.setImageSize(editor.getMap().width(), editor.getMap().height());
- Graphics.beginClip(x, y, width, height);
+ if(!ScissorStack.pushScissors(rect.set(x, y, width, height))){
+ return;
+ }
Draw.color(Palette.remove);
Lines.stroke(2f);
@@ -279,7 +276,7 @@ public class MapView extends Element implements GestureListener{
if(grid){
Draw.color(Color.GRAY);
image.setBounds(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight);
- image.draw(batch, alpha);
+ image.draw();
Draw.color();
}
@@ -307,13 +304,13 @@ public class MapView extends Element implements GestureListener{
}
if(tool.edit && (!mobile || drawing)){
- GridPoint2 p = project(mousex, mousey);
+ Point2 p = project(mousex, mousey);
Vector2 v = unproject(p.x, p.y).add(x, y);
Lines.poly(brushPolygons[index], v.x, v.y, scaling);
}
}else{
if((tool.edit || tool == EditorTool.line) && (!mobile || drawing)){
- GridPoint2 p = project(mousex, mousey);
+ Point2 p = project(mousex, mousey);
Vector2 v = unproject(p.x, p.y).add(x, y);
float offset = (editor.getDrawBlock().size % 2 == 0 ? scaling / 2f : 0f);
Lines.square(
@@ -323,51 +320,26 @@ public class MapView extends Element implements GestureListener{
}
}
- Graphics.endClip();
-
Draw.color(Palette.accent);
Lines.stroke(Unit.dp.scl(3f));
Lines.rect(x, y, width, height);
Draw.reset();
+
+ ScissorStack.popScissors();
}
private boolean active(){
return Core.scene.getKeyboardFocus() != null
&& Core.scene.getKeyboardFocus().isDescendantOf(ui.editor)
&& ui.editor.isShown() && tool == EditorTool.zoom &&
- Core.scene.hit(Graphics.mouse().x, Graphics.mouse().y, true) == this;
- }
-
- @Override
- public boolean touchDown(float x, float y, int pointer, int button){
- return false;
- }
-
- @Override
- public boolean tap(float x, float y, int count, int button){
- return false;
- }
-
- @Override
- public boolean longPress(float x, float y){
- return false;
- }
-
- @Override
- public boolean fling(float velocityX, float velocityY, int button){
- return false;
+ Core.scene.hit(Core.input.mouse().x, Core.input.mouse().y, true) == this;
}
@Override
public boolean pan(float x, float y, float deltaX, float deltaY){
if(!active()) return false;
offsetx += deltaX / zoom;
- offsety -= deltaY / zoom;
- return false;
- }
-
- @Override
- public boolean panStop(float x, float y, int pointer, int button){
+ offsety += deltaY / zoom;
return false;
}
diff --git a/core/src/io/anuke/mindustry/editor/OperationStack.java b/core/src/io/anuke/mindustry/editor/OperationStack.java
index 402da3cf5e..aa53bb3afa 100755
--- a/core/src/io/anuke/mindustry/editor/OperationStack.java
+++ b/core/src/io/anuke/mindustry/editor/OperationStack.java
@@ -1,6 +1,6 @@
package io.anuke.mindustry.editor;
-import com.badlogic.gdx.utils.Array;
+import io.anuke.arc.collection.Array;
public class OperationStack{
private final static int maxSize = 10;
@@ -22,7 +22,7 @@ public class OperationStack{
stack.add(action);
if(stack.size > maxSize){
- stack.removeIndex(0);
+ stack.remove(0);
}
}
diff --git a/core/src/io/anuke/mindustry/entities/Damage.java b/core/src/io/anuke/mindustry/entities/Damage.java
index 23f00d7e10..7df2455bc6 100644
--- a/core/src/io/anuke/mindustry/entities/Damage.java
+++ b/core/src/io/anuke/mindustry/entities/Damage.java
@@ -1,11 +1,17 @@
package io.anuke.mindustry.entities;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.math.Rectangle;
-import com.badlogic.gdx.math.Vector2;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.entities.Effects.Effect;
+import io.anuke.arc.function.Consumer;
+import io.anuke.arc.function.Predicate;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Geometry;
+import io.anuke.arc.math.geom.Rectangle;
+import io.anuke.arc.math.geom.Vector2;
+import io.anuke.arc.util.Time;
import io.anuke.mindustry.content.bullets.TurretBullets;
import io.anuke.mindustry.content.fx.ExplosionFx;
-import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.effect.Fire;
import io.anuke.mindustry.entities.effect.Lightning;
@@ -13,14 +19,6 @@ import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.core.Effects.Effect;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.function.Consumer;
-import io.anuke.ucore.function.Predicate;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.Physics;
-import io.anuke.ucore.util.Translator;
import static io.anuke.mindustry.Vars.*;
@@ -28,26 +26,26 @@ import static io.anuke.mindustry.Vars.*;
public class Damage{
private static Rectangle rect = new Rectangle();
private static Rectangle hitrect = new Rectangle();
- private static Translator tr = new Translator();
+ private static Vector2 tr = new Vector2();
/**Creates a dynamic explosion based on specified parameters.*/
public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, Color color){
for(int i = 0; i < Mathf.clamp(power / 20, 0, 6); i++){
int branches = 5 + Mathf.clamp((int) (power / 30), 1, 20);
- Timers.run(i * 2f + Mathf.random(4f), () -> Lightning.create(Team.none, Palette.power, 3,
+ Time.run(i * 2f + Mathf.random(4f), () -> Lightning.create(Team.none, Palette.power, 3,
x, y, Mathf.random(360f), branches + Mathf.range(2)));
}
for(int i = 0; i < Mathf.clamp(flammability / 4, 0, 30); i++){
- Timers.run(i / 2f, () -> Call.createBullet(TurretBullets.fireball, x, y, Mathf.random(360f)));
+ Time.run(i / 2f, () -> Call.createBullet(TurretBullets.fireball, x, y, Mathf.random(360f)));
}
int waves = Mathf.clamp((int) (explosiveness / 4), 0, 30);
for(int i = 0; i < waves; i++){
int f = i;
- Timers.run(i * 2f, () -> {
- threads.run(() -> Damage.damage(x, y, Mathf.clamp(radius + explosiveness, 0, 50f) * ((f + 1f) / waves), explosiveness / 2f));
+ Time.run(i * 2f, () -> {
+ Damage.damage(x, y, Mathf.clamp(radius + explosiveness, 0, 50f) * ((f + 1f) / waves), explosiveness / 2f);
Effects.effect(ExplosionFx.blockExplosionSmoke, x + Mathf.range(radius), y + Mathf.range(radius));
});
}
@@ -119,7 +117,7 @@ public class Damage{
other.width += expand * 2;
other.height += expand * 2;
- Vector2 vec = Physics.raycastRect(x, y, x2, y2, other);
+ Vector2 vec = Geometry.raycastRect(x, y, x2, y2, other);
if(vec != null){
Effects.effect(effect, vec.x, vec.y);
@@ -160,7 +158,7 @@ public class Damage{
/**Damages all entities and blocks in a radius that are enemies of the team.*/
public static void damage(Team team, float x, float y, float radius, float damage){
Consumer cons = entity -> {
- if(entity.team == team || entity.distanceTo(x, y) > radius){
+ if(entity.team == team || entity.dst(x, y) > radius){
return;
}
float amount = calculateDamage(x, y, entity.x, entity.y, radius, damage);
@@ -180,8 +178,8 @@ public class Damage{
int trad = (int) (radius / tilesize);
for(int dx = -trad; dx <= trad; dx++){
for(int dy = -trad; dy <= trad; dy++){
- Tile tile = world.tile(Mathf.scl2(x, tilesize) + dx, Mathf.scl2(y, tilesize) + dy);
- if(tile != null && tile.entity != null && (team == null || state.teams.areEnemies(team, tile.getTeam())) && Vector2.dst(dx, dy, 0, 0) <= trad){
+ Tile tile = world.tile(Math.round(x / tilesize) + dx, Math.round(y / tilesize) + dy);
+ if(tile != null && tile.entity != null && (team == null || state.teams.areEnemies(team, tile.getTeam())) && Mathf.dst(dx, dy, 0, 0) <= trad){
float amount = calculateDamage(x, y, tile.worldx(), tile.worldy(), radius, damage);
tile.entity.damage(amount);
}
@@ -191,7 +189,7 @@ public class Damage{
}
private static float calculateDamage(float x, float y, float tx, float ty, float radius, float damage){
- float dist = Vector2.dst(x, y, tx, ty);
+ float dist = Mathf.dst(x, y, tx, ty);
float falloff = 0.4f;
float scaled = Mathf.lerp(1f - dist / radius, 1f, falloff);
return damage * scaled;
diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java
index c4708c9951..a6c073c61e 100644
--- a/core/src/io/anuke/mindustry/entities/Player.java
+++ b/core/src/io/anuke/mindustry/entities/Player.java
@@ -1,13 +1,24 @@
package io.anuke.mindustry.entities;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.g2d.GlyphLayout;
-import com.badlogic.gdx.graphics.g2d.TextureRegion;
-import com.badlogic.gdx.math.Rectangle;
-import com.badlogic.gdx.math.Vector2;
-import com.badlogic.gdx.utils.Queue;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
+import io.anuke.arc.Core;
+import io.anuke.arc.collection.Queue;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.entities.EntityQuery;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.graphics.g2d.*;
+import io.anuke.arc.math.Angles;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Geometry;
+import io.anuke.arc.math.geom.Rectangle;
+import io.anuke.arc.math.geom.Vector2;
+import io.anuke.arc.util.Align;
+import io.anuke.arc.util.Interval;
+import io.anuke.arc.util.Pack;
+import io.anuke.arc.util.Time;
+import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.content.Mechs;
import io.anuke.mindustry.content.fx.UnitFx;
import io.anuke.mindustry.entities.effect.ScorchDecal;
@@ -15,7 +26,7 @@ import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette;
-import io.anuke.mindustry.graphics.Trail;
+import io.anuke.mindustry.input.Binding;
import io.anuke.mindustry.io.TypeIO;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.NetConnection;
@@ -24,13 +35,6 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.storage.CoreBlock.CoreEntity;
-import io.anuke.ucore.core.*;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.entities.EntityQuery;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Hue;
-import io.anuke.ucore.graphics.Lines;
-import io.anuke.ucore.util.*;
import java.io.DataInput;
import java.io.DataOutput;
@@ -63,7 +67,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
public NetConnection con;
public int playerIndex = 0;
public boolean isLocal = false;
- public Timer timer = new Timer(4);
+ public Interval timer = new Interval(4);
public TargetTrait target;
public TargetTrait moveTarget;
@@ -71,8 +75,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
private Queue placeQueue = new Queue<>();
private Tile mining;
private CarriableTrait carrying;
- private Trail trail = new Trail(12);
- private Vector2 movement = new Translator();
+ private Vector2 movement = new Vector2();
private boolean moved;
//endregion
@@ -112,7 +115,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
}
@Override
- public Timer getTimer(){
+ public Interval getTimer(){
return timer;
}
@@ -150,7 +153,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
}
if(interpolator.target.dst(interpolator.last) > 1f){
- walktime += Timers.delta();
+ walktime += Time.delta();
}
}
@@ -282,18 +285,15 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
@Override
public void drawShadow(float offsetX, float offsetY){
- float x = snappedX(), y = snappedY();
- float scl = mech.flying ? 1f : boostHeat/2f;
+ float scl = mech.flying ? 1f : boostHeat / 2f;
- Draw.rect(mech.iconRegion, x + offsetX*scl, y + offsetY*scl, rotation - 90);
+ Draw.rect(mech.iconRegion, x + offsetX * scl, y + offsetY * scl, rotation - 90);
}
@Override
public void draw(){
if(dead) return;
- float x = snappedX(), y = snappedY();
-
if(!movement.isZero() && moved && !state.isPaused()){
walktime += movement.len() / 0.7f * getFloorOn().speedMultiplier;
baseRotation = Mathf.slerpDelta(baseRotation, movement.angle(), 0.13f);
@@ -317,9 +317,11 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
for(int i : Mathf.signs){
Draw.rect(mech.legRegion,
- x + Angles.trnsx(baseRotation, ft * i + boostTrnsY, -boostTrnsX * i),
- y + Angles.trnsy(baseRotation, ft * i + boostTrnsY, -boostTrnsX * i),
- mech.legRegion.getRegionWidth() * i, mech.legRegion.getRegionHeight() - Mathf.clamp(ft * i, 0, 2), baseRotation - 90 + boostAng * i);
+ x + Angles.trnsx(baseRotation, ft * i + boostTrnsY, -boostTrnsX * i),
+ y + Angles.trnsy(baseRotation, ft * i + boostTrnsY, -boostTrnsX * i),
+ mech.legRegion.getWidth() * i * Draw.scl,
+ (mech.legRegion.getHeight() - Mathf.clamp(ft * i, 0, 2)) * Draw.scl,
+ baseRotation - 90 + boostAng * i);
}
Draw.rect(mech.baseRegion, x, y, baseRotation - 90);
@@ -337,10 +339,13 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
for(int i : Mathf.signs){
float tra = rotation - 90, trY = -mech.weapon.getRecoil(this, i > 0) + mech.weaponOffsetY;
- float w = i > 0 ? -mech.weapon.equipRegion.getRegionWidth() : mech.weapon.equipRegion.getRegionWidth();
+ 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.getRegionHeight(), rotation - 90);
+ x + Angles.trnsx(tra, (mech.weaponOffsetX + mech.spreadX(this)) * i, trY),
+ y + Angles.trnsy(tra, (mech.weaponOffsetX + mech.spreadX(this)) * i, trY),
+ w * Draw.scl,
+ mech.weapon.equipRegion.getHeight() * Draw.scl,
+ rotation - 90);
}
float backTrns = 4f, itemSize = 5f;
@@ -352,9 +357,9 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
float angT = i == 0 ? 0 : Mathf.randomSeedRange(i + 1, 60f);
float lenT = i == 0 ? 0 : Mathf.randomSeedRange(i + 2, 1f) - 1f;
Draw.rect(stack.item.region,
- x + Angles.trnsx(rotation + 180f + angT, backTrns + lenT),
- y + Angles.trnsy(rotation + 180f + angT, backTrns + lenT),
- itemSize, itemSize, rotation);
+ x + Angles.trnsx(rotation + 180f + angT, backTrns + lenT),
+ y + Angles.trnsy(rotation + 180f + angT, backTrns + lenT),
+ itemSize, itemSize, rotation);
}
}
@@ -363,9 +368,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
@Override
public void drawStats(){
- float x = snappedX(), y = snappedY();
-
- Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Timers.time(), healthf()*5f, 1f - healthf()));
+ 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), rotation - 90);
Draw.color();
@@ -376,53 +379,38 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
if(dead) return;
drawBuilding(this);
-
- if(mech.flying || boostHeat > 0.001f){
- float wobblyness = 0.6f;
- if(!state.isPaused()) trail.update(x + Angles.trnsx(rotation + 180f, 5f) + Mathf.range(wobblyness),
- y + Angles.trnsy(rotation + 180f, 5f) + Mathf.range(wobblyness));
- trail.draw(Hue.mix(mech.trailColor, mech.trailColorTo, mech.flying ? 0f : boostHeat, Tmp.c1), 5f * (isFlying() ? 1f : boostHeat));
- }else{
- trail.clear();
- }
- }
-
- public float snappedX(){
- return snapCamera && isLocal ? (int) (x + 0.0001f) : x;
- }
-
- public float snappedY(){
- return snapCamera && isLocal ? (int) (y + 0.0001f) : y;
}
public void drawName(){
- GlyphLayout layout = Pooling.obtain(GlyphLayout.class, GlyphLayout::new);
+ BitmapFont font = Core.scene.skin.getFont("default-font");
+ GlyphLayout layout = Pools.obtain(GlyphLayout.class, GlyphLayout::new);
- boolean ints = Core.font.usesIntegerPositions();
- Core.font.setUseIntegerPositions(false);
- Draw.tscl(0.25f / io.anuke.ucore.scene.ui.layout.Unit.dp.scl(1f));
- layout.setText(Core.font, name);
+ boolean ints = font.usesIntegerPositions();
+ font.setUseIntegerPositions(false);
+ font.getData().setScale(0.25f / io.anuke.arc.scene.ui.layout.Unit.dp.scl(1f));
+ layout.setText(font, name);
Draw.color(0f, 0f, 0f, 0.3f);
- Draw.rect("blank", x, y + 8 - layout.height / 2, layout.width + 2, layout.height + 3);
+ Fill.rect(x, y + 8 - layout.height / 2, layout.width + 2, layout.height + 3);
Draw.color();
- Draw.tcolor(color);
- Draw.text(name, x, y + 8);
+ font.setColor(color);
+
+ font.draw(name, x, y + 8, 0, Align.center, false);
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();
- Pooling.free(layout);
- Draw.tscl(1f);
- Core.font.setUseIntegerPositions(ints);
+ Pools.free(layout);
+ font.getData().setScale(1f);
+ font.setUseIntegerPositions(ints);
}
- /**Draw all current build requests. Does not draw the beam effect, only the positions.*/
+ /** Draw all current build requests. Does not draw the beam effect, only the positions. */
public void drawBuildRequests(){
for(BuildRequest request : getPlaceQueue()){
if(getCurrentRequest() == request) continue;
@@ -431,42 +419,38 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
Block block = world.tile(request.x, request.y).target().block();
//draw removal request
- Lines.stroke(2f);
+ Lines.stroke(2f, Palette.removeBack);
- Draw.color(Palette.removeBack);
-
- float rad = Mathf.absin(Timers.time(), 7f, 1f) + block.size * tilesize / 2f - 1;
+ float rad = Mathf.absin(Time.time(), 7f, 1f) + block.size * tilesize / 2f - 1;
Lines.square(
- request.x * tilesize + block.offset(),
- request.y * tilesize + block.offset() - 1,
- rad);
+ request.x * tilesize + block.offset(),
+ request.y * tilesize + block.offset() - 1,
+ rad);
Draw.color(Palette.remove);
Lines.square(
- request.x * tilesize + block.offset(),
- request.y * tilesize + block.offset(),
- rad);
+ request.x * tilesize + block.offset(),
+ request.y * tilesize + block.offset(),
+ rad);
}else{
//draw place request
- Lines.stroke(2f);
+ Lines.stroke(2f, Palette.accentBack);
- Draw.color(Palette.accentBack);
-
- float rad = Mathf.absin(Timers.time(), 7f, 1f) - 2f + request.recipe.result.size * tilesize / 2f;
+ float rad = Mathf.absin(Time.time(), 7f, 1f) - 2f + request.recipe.result.size * tilesize / 2f;
Lines.square(
- request.x * tilesize + request.recipe.result.offset(),
- request.y * tilesize + request.recipe.result.offset() - 1,
- rad);
+ request.x * tilesize + request.recipe.result.offset(),
+ request.y * tilesize + request.recipe.result.offset() - 1,
+ rad);
Draw.color(Palette.accent);
Lines.square(
- request.x * tilesize + request.recipe.result.offset(),
- request.y * tilesize + request.recipe.result.offset(),
- rad);
+ request.x * tilesize + request.recipe.result.offset(),
+ request.y * tilesize + request.recipe.result.offset(),
+ rad);
}
}
@@ -479,7 +463,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
@Override
public void update(){
- hitTime -= Timers.delta();
+ hitTime -= Time.delta();
if(Float.isNaN(x) || Float.isNaN(y)){
velocity.set(0f, 0f);
@@ -552,14 +536,14 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
updateBuilding(this);
- x = Mathf.clamp(x, tilesize, world.width() * tilesize - tilesize);
- y = Mathf.clamp(y, tilesize, world.height() * tilesize - tilesize);
+ x = Mathf.clamp(x, 0, world.width() * tilesize - tilesize);
+ y = Mathf.clamp(y, 0, world.height() * tilesize - tilesize);
}
protected void updateMech(){
Tile tile = world.tileWorld(x, y);
- isBoosting = Inputs.keyDown("dash") && !mech.flying;
+ isBoosting = Core.input.keyDown(Binding.dash) && !mech.flying;
//if player is in solid block
if(tile != null && tile.solid()){
@@ -579,7 +563,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
}
//drop from carrier on key press
- if(!ui.chatfrag.chatOpen() && Inputs.keyTap("drop_unit")){
+ if(!ui.chatfrag.chatOpen() && Core.input.keyTap(Binding.drop_unit)){
if(!mech.flying){
if(getCarrier() != null){
Call.dropSelf(this);
@@ -597,20 +581,19 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
movement.setZero();
- String section = control.input(playerIndex).section;
+ float xa = Core.input.axis(Binding.move_x);
+ float ya = Core.input.axis(Binding.move_y);
+ if(!Core.input.keyDown(Binding.gridMode)){
+ movement.y += ya * speed;
+ movement.x += xa * speed;
+ }
- float xa = Inputs.getAxis(section, "move_x");
- float ya = Inputs.getAxis(section, "move_y");
-
- movement.y += ya * speed;
- movement.x += xa * speed;
-
- Vector2 vec = Graphics.world(control.input(playerIndex).getMouseX(), control.input(playerIndex).getMouseY());
+ Vector2 vec = Core.input.mouseWorld(control.input(playerIndex).getMouseX(), control.input(playerIndex).getMouseY());
pointerX = vec.x;
pointerY = vec.y;
updateShooting();
- movement.limit(speed).scl(Timers.delta());
+ movement.limit(speed).scl(Time.delta());
if(getCarrier() == null){
if(!ui.chatfrag.chatOpen()){
@@ -618,7 +601,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
}
float prex = x, prey = y;
updateVelocityStatus();
- moved = distanceTo(prex, prey) > 0.001f;
+ moved = dst(prex, prey) > 0.001f;
}else{
velocity.setZero();
x = Mathf.lerpDelta(x, getCarrier().getX(), 0.1f);
@@ -646,7 +629,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
protected void updateFlying(){
if(Units.invalidateTarget(target, this) && !(target instanceof TileEntity && ((TileEntity) target).damaged() && target.getTeam() == team &&
- mech.canHeal && distanceTo(target) < getWeapon().getAmmo().getRange())){
+ mech.canHeal && dst(target) < getWeapon().getAmmo().getRange())){
target = null;
}
@@ -663,7 +646,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
velocity.setAngle(Mathf.slerpDelta(velocity.angle(), angleTo(moveTarget), 0.1f));
}
- if(distanceTo(moveTarget) < 2f){
+ if(dst(moveTarget) < 2f){
if(moveTarget instanceof CarriableTrait){
carry((CarriableTrait) moveTarget);
}else if(tapping){
@@ -686,7 +669,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
movement.set(targetX - x, targetY - y).limit(isBoosting && !mech.flying ? mech.boostSpeed : mech.speed);
movement.setAngle(Mathf.slerp(movement.angle(), velocity.angle(), 0.05f));
- if(distanceTo(targetX, targetY) < attractDst){
+ if(dst(targetX, targetY) < attractDst){
movement.setZero();
}
@@ -695,27 +678,27 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
getHitbox(rect);
rect.x -= expansion;
rect.y -= expansion;
- rect.width += expansion*2f;
- rect.height += expansion*2f;
+ rect.width += expansion * 2f;
+ rect.height += expansion * 2f;
- isBoosting = EntityQuery.collisions().overlapsTile(rect) || distanceTo(targetX, targetY) > 85f;
+ isBoosting = EntityQuery.collisions().overlapsTile(rect) || dst(targetX, targetY) > 85f;
- velocity.add(movement.scl(Timers.delta()));
+ velocity.add(movement.scl(Time.delta()));
if(velocity.len() <= 0.2f && mech.flying){
- rotation += Mathf.sin(Timers.time() + id * 99, 10f, 1f);
+ rotation += Mathf.sin(Time.time() + id * 99, 10f, 1f);
}else if(target == null){
rotation = Mathf.slerpDelta(rotation, velocity.angle(), velocity.len() / 10f);
}
float lx = x, ly = y;
updateVelocityStatus();
- moved = distanceTo(lx, ly) > 0.001f && !isCarried();
+ moved = dst(lx, ly) > 0.001f && !isCarried();
if(mech.flying){
//hovering effect
- x += Mathf.sin(Timers.time() + id * 999, 25f, 0.08f);
- y += Mathf.cos(Timers.time() + id * 999, 25f, 0.08f);
+ x += Mathf.sin(Time.time() + id * 999, 25f, 0.08f);
+ y += Mathf.cos(Time.time() + id * 999, 25f, 0.08f);
}
//update shooting if not building, not mining and there's ammo left
@@ -725,15 +708,15 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
if(mobile){
if(target == null){
isShooting = false;
- if(Settings.getBool("autotarget")){
+ if(Core.settings.getBool("autotarget")){
target = Units.getClosestTarget(team, x, y, getWeapon().getAmmo().getRange());
if(mech.canHeal && target == null){
target = Geometry.findClosest(x, y, world.indexer.getDamaged(Team.blue));
- if(target != null && distanceTo(target) > getWeapon().getAmmo().getRange()){
+ if(target != null && dst(target) > getWeapon().getAmmo().getRange()){
target = null;
}else if(target != null){
- target = ((Tile)target).entity;
+ target = ((Tile) target).entity;
}
}
@@ -742,14 +725,14 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
}
}
}else if(target.isValid() || (target instanceof TileEntity && ((TileEntity) target).damaged() && target.getTeam() == team &&
- mech.canHeal && distanceTo(target) < getWeapon().getAmmo().getRange())){
+ mech.canHeal && dst(target) < getWeapon().getAmmo().getRange())){
//rotate toward and shoot the target
if(mech.turnCursor){
rotation = Mathf.slerpDelta(rotation, angleTo(target), 0.2f);
}
Vector2 intercept =
- Predict.intercept(x, y, target.getX(), target.getY(), target.getVelocity().x - velocity.x, target.getVelocity().y - velocity.y, getWeapon().getAmmo().bullet.speed);
+ Predict.intercept(x, y, target.getX(), target.getY(), target.getVelocity().x - velocity.x, target.getVelocity().y - velocity.y, getWeapon().getAmmo().bullet.speed);
pointerX = intercept.x;
pointerY = intercept.y;
@@ -759,8 +742,8 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
}
}else if(isShooting()){
- Vector2 vec = Graphics.world(control.input(playerIndex).getMouseX(),
- control.input(playerIndex).getMouseY());
+ Vector2 vec = Core.input.mouseWorld(control.input(playerIndex).getMouseX(),
+ control.input(playerIndex).getMouseY());
pointerX = vec.x;
pointerY = vec.y;
@@ -773,7 +756,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
//region utility methods
- /** Resets all values of the player.*/
+ /** Resets all values of the player. */
public void reset(){
resetNoAdd();
@@ -786,7 +769,8 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
inventory.clear();
placeQueue.clear();
dead = true;
- trail.clear();
+ target = null;
+ moveTarget = null;
carrier = null;
health = maxHealth();
boostHeat = drownTime = hitTime = 0f;
@@ -869,7 +853,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
public void write(DataOutput buffer) throws IOException{
super.writeSave(buffer, !isLocal);
TypeIO.writeStringData(buffer, name); //TODO writing strings is very inefficient
- buffer.writeByte(Bits.toByte(isAdmin) | (Bits.toByte(dead) << 1) | (Bits.toByte(isBoosting) << 2));
+ buffer.writeByte(Pack.byteValue(isAdmin) | (Pack.byteValue(dead) << 1) | (Pack.byteValue(isBoosting) << 2));
buffer.writeInt(Color.rgba8888(color));
buffer.writeByte(mech.id);
buffer.writeInt(mining == null ? -1 : mining.pos());
@@ -880,7 +864,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
}
@Override
- public void read(DataInput buffer, long time) throws IOException{
+ public void read(DataInput buffer) throws IOException{
float lastx = x, lasty = y, lastrot = rotation;
super.readSave(buffer);
name = TypeIO.readStringData(buffer);
@@ -896,7 +880,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
readBuilding(buffer, !isLocal);
- interpolator.read(lastx, lasty, x, y, time, rotation, baseRotation);
+ interpolator.read(lastx, lasty, x, y, rotation, baseRotation);
rotation = lastrot;
if(isLocal){
diff --git a/core/src/io/anuke/mindustry/entities/Predict.java b/core/src/io/anuke/mindustry/entities/Predict.java
index 09d589bffd..d4a935c173 100644
--- a/core/src/io/anuke/mindustry/entities/Predict.java
+++ b/core/src/io/anuke/mindustry/entities/Predict.java
@@ -1,8 +1,8 @@
package io.anuke.mindustry.entities;
-import com.badlogic.gdx.math.Vector2;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Vector2;
import io.anuke.mindustry.entities.traits.TargetTrait;
-import io.anuke.ucore.util.Mathf;
/**
* Class for predicting shoot angles based on velocities of targets.
diff --git a/core/src/io/anuke/mindustry/entities/StatusController.java b/core/src/io/anuke/mindustry/entities/StatusController.java
index 2df186d4c8..a324e71ab4 100644
--- a/core/src/io/anuke/mindustry/entities/StatusController.java
+++ b/core/src/io/anuke/mindustry/entities/StatusController.java
@@ -1,15 +1,14 @@
package io.anuke.mindustry.entities;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.utils.Array;
+import io.anuke.arc.collection.Array;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.util.Time;
+import io.anuke.arc.util.Tmp;
+import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.content.StatusEffects;
import io.anuke.mindustry.entities.traits.Saveable;
import io.anuke.mindustry.type.ContentType;
import io.anuke.mindustry.type.StatusEffect;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.util.Pooling;
-import io.anuke.ucore.util.ThreadArray;
-import io.anuke.ucore.util.Tmp;
import java.io.DataInput;
import java.io.DataOutput;
@@ -21,9 +20,9 @@ import static io.anuke.mindustry.Vars.content;
*/
public class StatusController implements Saveable{
private static final StatusEntry globalResult = new StatusEntry();
- private static final Array removals = new ThreadArray<>();
+ private static final Array removals = new Array<>();
- private Array statuses = new ThreadArray<>();
+ private Array statuses = new Array<>();
private float speedMultiplier;
private float damageMultiplier;
@@ -57,7 +56,7 @@ public class StatusController implements Saveable{
}
//otherwise, no opposites found, add direct effect
- StatusEntry entry = Pooling.obtain(StatusEntry.class, StatusEntry::new);
+ StatusEntry entry = Pools.obtain(StatusEntry.class, StatusEntry::new);
entry.set(effect, newTime);
statuses.add(entry);
}
@@ -88,10 +87,10 @@ public class StatusController implements Saveable{
removals.clear();
for(StatusEntry entry : statuses){
- entry.time = Math.max(entry.time - Timers.delta(), 0);
+ entry.time = Math.max(entry.time - Time.delta(), 0);
if(entry.time <= 0){
- Pooling.free(entry);
+ Pools.free(entry);
removals.add(entry);
}else{
speedMultiplier *= entry.effect.speedMultiplier;
@@ -137,7 +136,7 @@ public class StatusController implements Saveable{
@Override
public void readSave(DataInput stream) throws IOException{
for(StatusEntry effect : statuses){
- Pooling.free(effect);
+ Pools.free(effect);
}
statuses.clear();
@@ -146,7 +145,7 @@ public class StatusController implements Saveable{
for(int i = 0; i < amount; i++){
byte id = stream.readByte();
float time = stream.readShort() / 2f;
- StatusEntry entry = Pooling.obtain(StatusEntry.class, StatusEntry::new);
+ StatusEntry entry = Pools.obtain(StatusEntry.class, StatusEntry::new);
entry.set(content.getByID(ContentType.status, id), time);
statuses.add(entry);
}
diff --git a/core/src/io/anuke/mindustry/entities/TileEntity.java b/core/src/io/anuke/mindustry/entities/TileEntity.java
index 6207154dd1..c3dc293f95 100644
--- a/core/src/io/anuke/mindustry/entities/TileEntity.java
+++ b/core/src/io/anuke/mindustry/entities/TileEntity.java
@@ -1,11 +1,18 @@
package io.anuke.mindustry.entities;
-import com.badlogic.gdx.math.GridPoint2;
-import com.badlogic.gdx.math.Vector2;
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.ObjectSet;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
+import io.anuke.arc.collection.Array;
+import io.anuke.arc.collection.ObjectSet;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.entities.impl.BaseEntity;
+import io.anuke.arc.entities.trait.HealthTrait;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Point2;
+import io.anuke.arc.math.geom.Vector2;
+import io.anuke.arc.util.Interval;
+import io.anuke.arc.util.Time;
import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.traits.TargetTrait;
@@ -20,13 +27,6 @@ import io.anuke.mindustry.world.modules.ConsumeModule;
import io.anuke.mindustry.world.modules.ItemModule;
import io.anuke.mindustry.world.modules.LiquidModule;
import io.anuke.mindustry.world.modules.PowerModule;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.entities.impl.BaseEntity;
-import io.anuke.ucore.entities.trait.HealthTrait;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.Timer;
import java.io.DataInput;
import java.io.DataOutput;
@@ -42,7 +42,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
public static int sleepingEntities = 0;
public Tile tile;
- public Timer timer;
+ public Interval timer;
public float health;
public float timeScale = 1f, timeScaleDuration;
@@ -78,7 +78,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
health = tile.block().health;
- timer = new Timer(tile.block().timers);
+ timer = new Interval(tile.block().timers);
if(shouldAdd){
add();
@@ -89,12 +89,12 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
/**Scaled delta.*/
public float delta(){
- return Timers.delta() * timeScale;
+ return Time.delta() * timeScale;
}
/**Call when nothing is happening to the entity. This increments the internal sleep timer.*/
public void sleep(){
- sleepTime += Timers.delta();
+ sleepTime += Time.delta();
if(!sleeping && sleepTime >= timeToSleep){
remove();
sleeping = true;
@@ -169,8 +169,8 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
public void removeFromProximity(){
tile.block().onProximityRemoved(tile);
- GridPoint2[] nearby = Edges.getEdges(tile.block().size);
- for(GridPoint2 point : nearby){
+ Point2[] nearby = Edges.getEdges(tile.block().size);
+ for(Point2 point : nearby){
Tile other = world.tile(tile.x + point.x, tile.y + point.y);
//remove this tile from all nearby tile's proximities
if(other != null){
@@ -187,8 +187,8 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
tmpTiles.clear();
proximity.clear();
- GridPoint2[] nearby = Edges.getEdges(tile.block().size);
- for(GridPoint2 point : nearby){
+ Point2[] nearby = Edges.getEdges(tile.block().size);
+ for(Point2 point : nearby){
Tile other = world.tile(tile.x + point.x, tile.y + point.y);
if(other == null) continue;
@@ -258,19 +258,19 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
@Override
public Vector2 getVelocity(){
- return Vector2.Zero;
+ return Vector2.ZERO;
}
@Override
public void update(){
//TODO better smoke effect, this one is awful
if(health != 0 && health < tile.block().health && !(tile.block() instanceof Wall) &&
- Mathf.chance(0.009f * Timers.delta() * (1f - health / tile.block().health))){
+ Mathf.chance(0.009f * Time.delta() * (1f - health / tile.block().health))){
Effects.effect(Fx.smoke, x + Mathf.range(4), y + Mathf.range(4));
}
- timeScaleDuration -= Timers.delta();
+ timeScaleDuration -= Time.delta();
if(timeScaleDuration <= 0f || !tile.block().canOverdrive){
timeScale = 1f;
}
diff --git a/core/src/io/anuke/mindustry/entities/Unit.java b/core/src/io/anuke/mindustry/entities/Unit.java
index 198d44b283..1c3d4c6660 100644
--- a/core/src/io/anuke/mindustry/entities/Unit.java
+++ b/core/src/io/anuke/mindustry/entities/Unit.java
@@ -1,9 +1,20 @@
package io.anuke.mindustry.entities;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.g2d.TextureRegion;
-import com.badlogic.gdx.math.Rectangle;
-import com.badlogic.gdx.math.Vector2;
+import io.anuke.arc.Core;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.entities.impl.DestructibleEntity;
+import io.anuke.arc.entities.trait.DamageTrait;
+import io.anuke.arc.entities.trait.DrawTrait;
+import io.anuke.arc.entities.trait.SolidTrait;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.graphics.g2d.Fill;
+import io.anuke.arc.graphics.g2d.TextureRegion;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Geometry;
+import io.anuke.arc.math.geom.Rectangle;
+import io.anuke.arc.math.geom.Vector2;
+import io.anuke.arc.util.Time;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.game.Team;
@@ -15,16 +26,6 @@ import io.anuke.mindustry.type.Weapon;
import io.anuke.mindustry.world.Pos;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.entities.impl.DestructibleEntity;
-import io.anuke.ucore.entities.trait.DamageTrait;
-import io.anuke.ucore.entities.trait.DrawTrait;
-import io.anuke.ucore.entities.trait.SolidTrait;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Fill;
-import io.anuke.ucore.util.Geometry;
-import io.anuke.ucore.util.Mathf;
import java.io.DataInput;
import java.io.DataOutput;
@@ -194,7 +195,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
Units.getNearby(queryRect, t -> {
if(t == this || t.getCarrier() == this || getCarrier() == t || t.isFlying() != isFlying()) return;
- float dst = distanceTo(t);
+ float dst = dst(t);
moveVector.set(x, y).sub(t.getX(), t.getY()).setLength(1f * (1f - (dst / queryRect.getWidth())));
applyImpulse(moveVector.x, moveVector.y);
});
@@ -235,11 +236,11 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
status.update(this);
- velocity.limit(getMaxVelocity()).scl(1f + (status.getSpeedMultiplier()-1f) * Timers.delta());
+ velocity.limit(getMaxVelocity()).scl(1f + (status.getSpeedMultiplier()-1f) * Time.delta());
if(isFlying()){
- x += velocity.x * Timers.delta();
- y += velocity.y * Timers.delta();
+ x += velocity.x * Time.delta();
+ y += velocity.y * Time.delta();
}else{
boolean onLiquid = floor.isLiquid;
@@ -255,7 +256,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
}
}
- if(onLiquid && velocity.len() > 0.4f && Mathf.chance((velocity.len() * floor.speedMultiplier) * 0.06f * Timers.delta())){
+ if(onLiquid && velocity.len() > 0.4f && Mathf.chance((velocity.len() * floor.speedMultiplier) * 0.06f * Time.delta())){
Effects.effect(floor.walkEffect, floor.liquidColor, x, y);
}
@@ -268,8 +269,8 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
}
if(onLiquid && floor.drownTime > 0){
- drownTime += Timers.delta() * 1f / floor.drownTime;
- if(Mathf.chance(Timers.delta() * 0.05f)){
+ drownTime += Time.delta() * 1f / floor.drownTime;
+ if(Mathf.chance(Time.delta() * 0.05f)){
Effects.effect(floor.drownUpdateEffect, floor.liquidColor, x, y);
}
}else{
@@ -283,12 +284,12 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
}
float px = x, py = y;
- move(velocity.x * floor.speedMultiplier * Timers.delta(), velocity.y * floor.speedMultiplier * Timers.delta());
+ move(velocity.x * floor.speedMultiplier * Time.delta(), velocity.y * floor.speedMultiplier * Time.delta());
if(Math.abs(px - x) <= 0.0001f) velocity.x = 0f;
if(Math.abs(py - y) <= 0.0001f) velocity.y = 0f;
}
- velocity.scl(Mathf.clamp(1f - getDrag() * (isFlying() ? 1f : floor.dragMultiplier) * Timers.delta()));
+ velocity.scl(Mathf.clamp(1f - getDrag() * (isFlying() ? 1f : floor.dragMultiplier) * Time.delta()));
}
public void applyEffect(StatusEffect effect, float intensity){
@@ -297,7 +298,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
}
public void damagePeriodic(float amount){
- damage(amount * Timers.delta(), hitTime <= -20 + hitDuration);
+ damage(amount * Time.delta(), hitTime <= -20 + hitDuration);
}
public void damage(float amount, boolean withEffect){
@@ -317,14 +318,14 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
}
public void drawStats(){
- Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Timers.time(), healthf()*5f, 1f - healthf()));
+ Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Time.time(), healthf()*5f, 1f - healthf()));
Draw.alpha(hitTime);
Draw.rect(getPowerCellRegion(), x, y, rotation - 90);
Draw.color();
}
public TextureRegion getPowerCellRegion(){
- return Draw.region("power-cell");
+ return Core.atlas.find("power-cell");
}
public void drawAll(){
diff --git a/core/src/io/anuke/mindustry/entities/Units.java b/core/src/io/anuke/mindustry/entities/Units.java
index 0d0584371c..95e16842da 100644
--- a/core/src/io/anuke/mindustry/entities/Units.java
+++ b/core/src/io/anuke/mindustry/entities/Units.java
@@ -1,18 +1,18 @@
package io.anuke.mindustry.entities;
-import com.badlogic.gdx.math.Rectangle;
-import com.badlogic.gdx.math.Vector2;
+import io.anuke.arc.collection.EnumSet;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.entities.EntityQuery;
+import io.anuke.arc.function.Consumer;
+import io.anuke.arc.function.Predicate;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Geometry;
+import io.anuke.arc.math.geom.Rectangle;
import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.entities.EntityQuery;
-import io.anuke.ucore.function.Consumer;
-import io.anuke.ucore.function.Predicate;
-import io.anuke.ucore.util.EnumSet;
-import io.anuke.ucore.util.Geometry;
import static io.anuke.mindustry.Vars.*;
@@ -38,7 +38,7 @@ public class Units{
* @return whether the target is invalid
*/
public static boolean invalidateTarget(TargetTrait target, Team team, float x, float y, float range){
- return target == null || (range != Float.MAX_VALUE && target.distanceTo(x, y) > range) || target.getTeam() == team || !target.isValid();
+ return target == null || (range != Float.MAX_VALUE && target.dst(x, y) > range) || target.getTeam() == team || !target.isValid();
}
/**See {@link #invalidateTarget(TargetTrait, Team, float, float, float)}*/
@@ -165,7 +165,7 @@ public class Units{
if(e.isDead() || !predicate.test(e))
return;
- float dist = Vector2.dst(e.x, e.y, x, y);
+ float dist = Mathf.dst(e.x, e.y, x, y);
if(dist < range){
if(result == null || dist < cdist){
result = e;
@@ -188,7 +188,7 @@ public class Units{
if(!predicate.test(e))
return;
- float dist = Vector2.dst(e.x, e.y, x, y);
+ float dist = Mathf.dst(e.x, e.y, x, y);
if(dist < range){
if(result == null || dist < cdist){
result = e;
@@ -221,7 +221,7 @@ public class Units{
EntityGroup group = unitGroups[team.ordinal()];
if(!group.isEmpty()){
EntityQuery.getNearby(group, rect, entity -> {
- if(entity.distanceTo(x, y) <= radius){
+ if(entity.dst(x, y) <= radius){
cons.accept((Unit) entity);
}
});
@@ -229,7 +229,7 @@ public class Units{
//now check all players
EntityQuery.getNearby(playerGroup, rect, player -> {
- if(((Unit) player).team == team && player.distanceTo(x, y) <= radius){
+ if(((Unit) player).team == team && player.dst(x, y) <= radius){
cons.accept((Unit) player);
}
});
diff --git a/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java
index e0c9af0c27..6a317f0882 100644
--- a/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java
+++ b/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java
@@ -1,9 +1,9 @@
package io.anuke.mindustry.entities.bullet;
import io.anuke.mindustry.content.fx.BulletFx;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.core.Effects.Effect;
-import io.anuke.ucore.graphics.Draw;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.entities.Effects.Effect;
+import io.anuke.arc.graphics.g2d.Draw;
//TODO scale velocity depending on fslope()
public class ArtilleryBulletType extends BasicBulletType{
diff --git a/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java
index d130585cae..7f3ca88aeb 100644
--- a/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java
+++ b/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java
@@ -1,16 +1,17 @@
package io.anuke.mindustry.entities.bullet;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.g2d.TextureRegion;
+import io.anuke.arc.Core;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.graphics.g2d.TextureRegion;
+import io.anuke.arc.math.Angles;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.util.Time;
import io.anuke.mindustry.entities.Damage;
import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.graphics.Palette;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.util.Angles;
-import io.anuke.ucore.util.Mathf;
/**
* A BulletType for most ammo-based bullets shot from turrets and units.
@@ -47,8 +48,8 @@ public class BasicBulletType extends BulletType{
@Override
public void load(){
- backRegion = Draw.region(bulletSprite + "-back");
- frontRegion = Draw.region(bulletSprite);
+ backRegion = Core.atlas.find(bulletSprite + "-back");
+ frontRegion = Core.atlas.find(bulletSprite);
}
@Override
@@ -69,7 +70,7 @@ public class BasicBulletType extends BulletType{
if(homingPower > 0.0001f){
TargetTrait target = Units.getClosestTarget(b.getTeam(), b.x, b.y, homingRange);
if(target != null){
- b.getVelocity().setAngle(Angles.moveToward(b.getVelocity().angle(), b.angleTo(target), homingPower * Timers.delta()));
+ b.getVelocity().setAngle(Angles.moveToward(b.getVelocity().angle(), b.angleTo(target), homingPower * Time.delta()));
}
}
}
diff --git a/core/src/io/anuke/mindustry/entities/bullet/Bullet.java b/core/src/io/anuke/mindustry/entities/bullet/Bullet.java
index f918d6ce8b..b2d10aeac6 100644
--- a/core/src/io/anuke/mindustry/entities/bullet/Bullet.java
+++ b/core/src/io/anuke/mindustry/entities/bullet/Bullet.java
@@ -1,8 +1,17 @@
package io.anuke.mindustry.entities.bullet;
-import com.badlogic.gdx.math.Vector2;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.entities.impl.BulletEntity;
+import io.anuke.arc.entities.trait.Entity;
+import io.anuke.arc.entities.trait.SolidTrait;
+import io.anuke.arc.entities.trait.VelocityTrait;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Vector2;
+import io.anuke.arc.util.Interval;
+import io.anuke.arc.util.Time;
+import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.effect.Lightning;
import io.anuke.mindustry.entities.traits.AbsorbTrait;
@@ -10,15 +19,6 @@ import io.anuke.mindustry.entities.traits.SyncTrait;
import io.anuke.mindustry.entities.traits.TeamTrait;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.entities.impl.BulletEntity;
-import io.anuke.ucore.entities.trait.Entity;
-import io.anuke.ucore.entities.trait.SolidTrait;
-import io.anuke.ucore.entities.trait.VelocityTrait;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.Pooling;
-import io.anuke.ucore.util.Timer;
import java.io.DataInput;
import java.io.DataOutput;
@@ -28,7 +28,7 @@ import static io.anuke.mindustry.Vars.*;
public class Bullet extends BulletEntity implements TeamTrait, SyncTrait, AbsorbTrait{
private static Vector2 vector = new Vector2();
- public Timer timer = new Timer(3);
+ public Interval timer = new Interval(3);
private float lifeScl;
private Team team;
private Object data;
@@ -55,21 +55,21 @@ public class Bullet extends BulletEntity implements TeamTrait, SyncT
}
public static Bullet create(BulletType type, Entity owner, Team team, float x, float y, float angle, float velocityScl, float lifetimeScl, Object data){
- Bullet bullet = Pooling.obtain(Bullet.class, Bullet::new);
+ Bullet bullet = Pools.obtain(Bullet.class, Bullet::new);
bullet.type = type;
bullet.owner = owner;
bullet.data = data;
bullet.velocity.set(0, type.speed).setAngle(angle).scl(velocityScl);
if(type.keepVelocity){
- bullet.velocity.add(owner instanceof VelocityTrait ? ((VelocityTrait) owner).getVelocity() : Vector2.Zero);
+ bullet.velocity.add(owner instanceof VelocityTrait ? ((VelocityTrait) owner).getVelocity() : Vector2.ZERO);
}
bullet.team = team;
bullet.type = type;
bullet.lifeScl = lifetimeScl;
- bullet.set(x - bullet.velocity.x * Timers.delta(), y - bullet.velocity.y * Timers.delta());
+ bullet.set(x - bullet.velocity.x * Time.delta(), y - bullet.velocity.y * Time.delta());
bullet.add();
return bullet;
@@ -158,7 +158,7 @@ public class Bullet extends BulletEntity implements TeamTrait, SyncT
}
@Override
- public void read(DataInput data, long time) throws IOException{
+ public void read(DataInput data) throws IOException{
x = data.readFloat();
y = data.readFloat();
velocity.x = data.readFloat();
@@ -236,7 +236,7 @@ public class Bullet extends BulletEntity implements TeamTrait, SyncT
@Override
protected void updateLife(){
- time += Timers.delta() * 1f/(lifeScl);
+ time += Time.delta() * 1f/(lifeScl);
time = Mathf.clamp(time, 0, type.lifetime());
if(time >= type.lifetime){
@@ -259,7 +259,7 @@ public class Bullet extends BulletEntity implements TeamTrait, SyncT
@Override
public void removed(){
- Pooling.free(this);
+ Pools.free(this);
}
@Override
diff --git a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java
index b6220dd9dd..0c2cbc7c94 100644
--- a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java
+++ b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java
@@ -1,15 +1,15 @@
package io.anuke.mindustry.entities.bullet;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.entities.Effects.Effect;
+import io.anuke.arc.entities.impl.BaseBulletType;
+import io.anuke.arc.math.geom.Vector2;
import io.anuke.mindustry.content.StatusEffects;
import io.anuke.mindustry.content.fx.BulletFx;
import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.type.ContentType;
import io.anuke.mindustry.type.StatusEffect;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.core.Effects.Effect;
-import io.anuke.ucore.entities.impl.BaseBulletType;
-import io.anuke.ucore.util.Translator;
public abstract class BulletType extends Content implements BaseBulletType{
public float lifetime;
@@ -45,7 +45,7 @@ public abstract class BulletType extends Content implements BaseBulletType {
if(b.getData() instanceof Float) return;
- if(unit.distanceTo(b) < explodeRange){
+ if(unit.dst(b) < explodeRange){
b.setData(0);
- Timers.run(5f, () -> {
+ Time.run(5f, () -> {
if(b.getData() instanceof Integer){
b.time(b.lifetime());
}
diff --git a/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java
index fa8b7164ee..4c60fcadf4 100644
--- a/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java
+++ b/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java
@@ -1,18 +1,18 @@
package io.anuke.mindustry.entities.bullet;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.math.GridPoint2;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.graphics.g2d.Fill;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Geometry;
+import io.anuke.arc.math.geom.Point2;
import io.anuke.mindustry.content.fx.BulletFx;
import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.entities.effect.Fire;
import io.anuke.mindustry.entities.effect.Puddle;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Fill;
-import io.anuke.ucore.util.Geometry;
-import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.tilesize;
import static io.anuke.mindustry.Vars.world;
@@ -60,7 +60,7 @@ public class LiquidBulletType extends BulletType{
if(liquid.temperature <= 0.5f && liquid.flammability < 0.3f){
float intensity = 400f;
Fire.extinguish(world.tileWorld(hitx, hity), intensity);
- for(GridPoint2 p : Geometry.d4){
+ for(Point2 p : Geometry.d4){
Fire.extinguish(world.tileWorld(hitx + p.x * tilesize, hity + p.y * tilesize), intensity);
}
}
diff --git a/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java
index 7e75370183..d27e2f222f 100644
--- a/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java
+++ b/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java
@@ -1,11 +1,11 @@
package io.anuke.mindustry.entities.bullet;
-import com.badlogic.gdx.graphics.Color;
+import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.content.fx.BulletFx;
import io.anuke.mindustry.graphics.Palette;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.util.Mathf;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.util.Time;
+import io.anuke.arc.math.Mathf;
public class MissileBulletType extends BasicBulletType{
protected Color trailColor = Palette.missileYellowBack;
@@ -21,7 +21,7 @@ public class MissileBulletType extends BasicBulletType{
public void update(Bullet b){
super.update(b);
- if(Mathf.chance(Timers.delta() * 0.2)){
+ if(Mathf.chance(Time.delta() * 0.2)){
Effects.effect(BulletFx.missileTrail, trailColor, b.x, b.y, 2f);
}
}
diff --git a/core/src/io/anuke/mindustry/entities/effect/Decal.java b/core/src/io/anuke/mindustry/entities/effect/Decal.java
index 64c9facba6..4181cec8f7 100644
--- a/core/src/io/anuke/mindustry/entities/effect/Decal.java
+++ b/core/src/io/anuke/mindustry/entities/effect/Decal.java
@@ -1,12 +1,12 @@
package io.anuke.mindustry.entities.effect;
-import com.badlogic.gdx.graphics.Color;
+import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.entities.traits.BelowLiquidTrait;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.entities.impl.TimedEntity;
-import io.anuke.ucore.entities.trait.DrawTrait;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.util.Mathf;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.entities.impl.TimedEntity;
+import io.anuke.arc.entities.trait.DrawTrait;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.math.Mathf;
import static io.anuke.mindustry.Vars.groundEffectGroup;
diff --git a/core/src/io/anuke/mindustry/entities/effect/Fire.java b/core/src/io/anuke/mindustry/entities/effect/Fire.java
index bf6e58c698..36e2f03ac5 100644
--- a/core/src/io/anuke/mindustry/entities/effect/Fire.java
+++ b/core/src/io/anuke/mindustry/entities/effect/Fire.java
@@ -1,10 +1,18 @@
package io.anuke.mindustry.entities.effect;
-import com.badlogic.gdx.math.GridPoint2;
-import com.badlogic.gdx.utils.IntMap;
-import com.badlogic.gdx.utils.Pool.Poolable;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
+import io.anuke.arc.collection.IntMap;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.entities.impl.TimedEntity;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Geometry;
+import io.anuke.arc.math.geom.Point2;
+import io.anuke.arc.util.Structs;
+import io.anuke.arc.util.Time;
+import io.anuke.arc.util.pooling.Pool.Poolable;
+import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.content.StatusEffects;
import io.anuke.mindustry.content.bullets.TurretBullets;
import io.anuke.mindustry.content.fx.EnvironmentFx;
@@ -16,14 +24,6 @@ import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.entities.impl.TimedEntity;
-import io.anuke.ucore.util.Structs;
-import io.anuke.ucore.util.Geometry;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.Pooling;
import java.io.DataInput;
import java.io.DataOutput;
@@ -51,7 +51,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
Fire fire = map.get(tile.pos());
if(fire == null){
- fire = Pooling.obtain(Fire.class, Fire::new);
+ fire = Pools.obtain(Fire.class, Fire::new);
fire.tile = tile;
fire.lifetime = baseLifetime;
fire.set(tile.worldx(), tile.worldy());
@@ -76,7 +76,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
*/
public static void extinguish(Tile tile, float intensity){
if(tile != null && map.containsKey(tile.pos())){
- map.get(tile.pos()).time += intensity * Timers.delta();
+ map.get(tile.pos()).time += intensity * Time.delta();
}
}
@@ -92,11 +92,11 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
@Override
public void update(){
- if(Mathf.chance(0.1 * Timers.delta())){
+ if(Mathf.chance(0.1 * Time.delta())){
Effects.effect(EnvironmentFx.fire, x + Mathf.range(4f), y + Mathf.range(4f));
}
- if(Mathf.chance(0.05 * Timers.delta())){
+ if(Mathf.chance(0.05 * Time.delta())){
Effects.effect(EnvironmentFx.smoke, x + Mathf.range(4f), y + Mathf.range(4f));
}
@@ -104,7 +104,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
return;
}
- time = Mathf.clamp(time + Timers.delta(), 0, lifetime());
+ time = Mathf.clamp(time + Time.delta(), 0, lifetime());
if(time >= lifetime() || tile == null){
Call.onFireRemoved(getID());
@@ -118,7 +118,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
float flammability = baseFlammability + puddleFlammability;
if(!damage && flammability <= 0){
- time += Timers.delta() * 8;
+ time += Time.delta() * 8;
}
if(baseFlammability < 0 || block != tile.block()){
@@ -127,20 +127,20 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
}
if(damage){
- lifetime += Mathf.clamp(flammability / 8f, 0f, 0.6f) * Timers.delta();
+ lifetime += Mathf.clamp(flammability / 8f, 0f, 0.6f) * Time.delta();
}
- if(flammability > 1f && Mathf.chance(spreadChance * Timers.delta() * Mathf.clamp(flammability / 5f, 0.3f, 2f))){
- GridPoint2 p = Mathf.select(Geometry.d4);
+ if(flammability > 1f && Mathf.chance(spreadChance * Time.delta() * Mathf.clamp(flammability / 5f, 0.3f, 2f))){
+ Point2 p = Geometry.d4[Mathf.random(3)];
Tile other = world.tile(tile.x + p.x, tile.y + p.y);
create(other);
- if(Mathf.chance(fireballChance * Timers.delta() * Mathf.clamp(flammability / 10.0))){
+ if(Mathf.chance(fireballChance * Time.delta() * Mathf.clamp(flammability / 10f))){
Call.createBullet(TurretBullets.fireball, x, y, Mathf.random(360f));
}
}
- if(Mathf.chance(0.1 * Timers.delta())){
+ if(Mathf.chance(0.1 * Time.delta())){
Puddle p = Puddle.getPuddle(tile);
if(p != null){
puddleFlammability = p.getFlammability() / 3f;
@@ -177,7 +177,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
}
@Override
- public void read(DataInput data, long time) throws IOException{
+ public void read(DataInput data) throws IOException{
x = data.readFloat();
y = data.readFloat();
}
diff --git a/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java b/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java
index ceaceb8ba7..812cbd0db4 100644
--- a/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java
+++ b/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java
@@ -1,13 +1,13 @@
package io.anuke.mindustry.entities.effect;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.entities.Effects.Effect;
+import io.anuke.arc.entities.Effects.EffectRenderer;
+import io.anuke.arc.entities.impl.EffectEntity;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.util.Time;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.core.Effects.Effect;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.entities.impl.EffectEntity;
-import io.anuke.ucore.core.Effects.EffectRenderer;
-import io.anuke.ucore.util.Mathf;
/**
* A ground effect contains an effect that is rendered on the ground layer as opposed to the top layer.
@@ -20,7 +20,7 @@ public class GroundEffectEntity extends EffectEntity{
GroundEffect effect = (GroundEffect) this.effect;
if(effect.isStatic){
- time += Timers.delta();
+ time += Time.delta();
time = Mathf.clamp(time, 0, effect.staticLife);
diff --git a/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java b/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java
index 90e35dd496..bc0dfaaf5e 100644
--- a/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java
+++ b/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java
@@ -1,26 +1,25 @@
package io.anuke.mindustry.entities.effect;
-import com.badlogic.gdx.math.Interpolation;
-import com.badlogic.gdx.math.Vector2;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.entities.impl.TimedEntity;
+import io.anuke.arc.entities.trait.DrawTrait;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.graphics.g2d.Fill;
+import io.anuke.arc.graphics.g2d.Lines;
+import io.anuke.arc.math.Interpolation;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Position;
+import io.anuke.arc.math.geom.Vector2;
+import io.anuke.arc.util.Time;
+import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.entities.impl.TimedEntity;
-import io.anuke.ucore.entities.trait.DrawTrait;
-import io.anuke.ucore.entities.trait.PosTrait;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Fill;
-import io.anuke.ucore.graphics.Lines;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.Pooling;
import static io.anuke.mindustry.Vars.effectGroup;
-import static io.anuke.mindustry.Vars.threads;
public class ItemTransfer extends TimedEntity implements DrawTrait{
private Vector2 from = new Vector2();
@@ -28,7 +27,7 @@ public class ItemTransfer extends TimedEntity implements DrawTrait{
private Vector2 tovec = new Vector2();
private Item item;
private float seed;
- private PosTrait to;
+ private Position to;
private Runnable done;
public ItemTransfer(){
@@ -51,14 +50,14 @@ public class ItemTransfer extends TimedEntity implements DrawTrait{
public static void transferItemTo(Item item, int amount, float x, float y, Tile tile){
if(tile == null || tile.entity == null || tile.entity.items == null) return;
for(int i = 0; i < Mathf.clamp(amount / 3, 1, 8); i++){
- Timers.run(i * 3, () -> create(item, x, y, tile, () -> {
+ Time.run(i * 3, () -> create(item, x, y, tile, () -> {
}));
}
tile.entity.items.add(item, amount);
}
- public static void create(Item item, float fromx, float fromy, PosTrait to, Runnable done){
- ItemTransfer tr = Pooling.obtain(ItemTransfer.class, ItemTransfer::new);
+ public static void create(Item item, float fromx, float fromy, Position to, Runnable done){
+ ItemTransfer tr = Pools.obtain(ItemTransfer.class, ItemTransfer::new);
tr.item = item;
tr.from.set(fromx, fromy);
tr.to = to;
@@ -86,9 +85,9 @@ public class ItemTransfer extends TimedEntity implements DrawTrait{
@Override
public void removed(){
if(done != null){
- threads.run(done);
+ done.run();
}
- Pooling.free(this);
+ Pools.free(this);
}
@Override
@@ -108,8 +107,7 @@ public class ItemTransfer extends TimedEntity implements DrawTrait{
public void draw(){
float length = fslope() * 6f;
float angle = current.set(x, y).sub(from).angle();
- Draw.color(Palette.accent);
- Lines.stroke(fslope() * 2f);
+ Lines.stroke(fslope() * 2f, Palette.accent);
Lines.circle(x, y, fslope() * 2f);
Lines.lineAngleCenter(x, y, angle, length);
diff --git a/core/src/io/anuke/mindustry/entities/effect/Lightning.java b/core/src/io/anuke/mindustry/entities/effect/Lightning.java
index 1cf162f286..a26ce41eea 100644
--- a/core/src/io/anuke/mindustry/entities/effect/Lightning.java
+++ b/core/src/io/anuke/mindustry/entities/effect/Lightning.java
@@ -1,11 +1,24 @@
package io.anuke.mindustry.entities.effect;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.math.Rectangle;
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.IntSet;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
+import io.anuke.arc.collection.Array;
+import io.anuke.arc.collection.IntSet;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.entities.impl.TimedEntity;
+import io.anuke.arc.entities.trait.DrawTrait;
+import io.anuke.arc.entities.trait.TimeTrait;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.graphics.g2d.Lines;
+import io.anuke.arc.math.Angles;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.RandomXS128;
+import io.anuke.arc.math.geom.Geometry;
+import io.anuke.arc.math.geom.Position;
+import io.anuke.arc.math.geom.Rectangle;
+import io.anuke.arc.math.geom.Vector2;
+import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.content.bullets.TurretBullets;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.Units;
@@ -14,14 +27,6 @@ import io.anuke.mindustry.entities.traits.SyncTrait;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.entities.impl.TimedEntity;
-import io.anuke.ucore.entities.trait.DrawTrait;
-import io.anuke.ucore.entities.trait.PosTrait;
-import io.anuke.ucore.entities.trait.TimeTrait;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Lines;
-import io.anuke.ucore.util.*;
import java.io.DataInput;
import java.io.DataOutput;
@@ -31,7 +36,7 @@ import static io.anuke.mindustry.Vars.bulletGroup;
public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, TimeTrait{
public static final float lifetime = 10f;
- private static final SeedRandom random = new SeedRandom();
+ private static final RandomXS128 random = new RandomXS128();
private static final Rectangle rect = new Rectangle();
private static final Array entities = new Array<>();
private static final IntSet hit = new IntSet();
@@ -39,7 +44,7 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time
private static final float hitRange = 30f;
private static int lastSeed = 0;
- private Array lines = new Array<>();
+ private Array lines = new Array<>();
private Color color = Palette.lancerLaser;
/**For pooling use only. Do not call directly!*/
@@ -55,7 +60,7 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time
@Remote(called = Loc.server)
public static void createLighting(int seed, Team team, Color color, float damage, float x, float y, float rotation, int length){
- Lightning l = Pooling.obtain(Lightning.class, Lightning::new);
+ Lightning l = Pools.obtain(Lightning.class, Lightning::new);
Float dmg = damage;
l.x = x;
@@ -68,7 +73,7 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time
for (int i = 0; i < length/2; i++) {
Bullet.create(TurretBullets.damageLightning, l, team, x, y, 0f, 1f, 1f, dmg);
- l.lines.add(new Translator(x + Mathf.range(3f), y + Mathf.range(3f)));
+ l.lines.add(new Vector2(x + Mathf.range(3f), y + Mathf.range(3f)));
rect.setSize(hitRange).setCenter(x, y);
entities.clear();
@@ -103,7 +108,7 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time
public void write(DataOutput data){}
@Override
- public void read(DataInput data, long time){}
+ public void read(DataInput data){}
@Override
public float lifetime(){
@@ -120,15 +125,17 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time
@Override
public void removed(){
super.removed();
- Pooling.free(this);
+ Pools.free(this);
}
@Override
public void draw(){
float lx = x, ly = y;
Draw.color(color, Color.WHITE, fin());
+ //TODO this is really, really bad rendering
+ /*
for(int i = 0; i < lines.size; i++){
- PosTrait v = lines.get(i);
+ Position v = lines.get(i);
float f = (float) i / lines.size;
@@ -143,11 +150,10 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time
Lines.line(lx, ly, v.getX(), v.getY());
Lines.stroke(3f * fout() * (1f - f));
- // Lines.lineAngleCenter(lx, ly, Angles.angle(lx, ly, v.getX(), v.getY()) + 90f, 20f);
lx = v.getX();
ly = v.getY();
- }
+ }*/
Draw.color();
}
diff --git a/core/src/io/anuke/mindustry/entities/effect/Puddle.java b/core/src/io/anuke/mindustry/entities/effect/Puddle.java
index ce9dfc4926..b97dbc2f38 100644
--- a/core/src/io/anuke/mindustry/entities/effect/Puddle.java
+++ b/core/src/io/anuke/mindustry/entities/effect/Puddle.java
@@ -1,12 +1,23 @@
package io.anuke.mindustry.entities.effect;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.math.GridPoint2;
-import com.badlogic.gdx.math.Rectangle;
-import com.badlogic.gdx.utils.IntMap;
-import com.badlogic.gdx.utils.Pool.Poolable;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
+import io.anuke.arc.collection.IntMap;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.entities.impl.SolidEntity;
+import io.anuke.arc.entities.trait.DrawTrait;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.graphics.g2d.Fill;
+import io.anuke.arc.math.Angles;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Geometry;
+import io.anuke.arc.math.geom.Point2;
+import io.anuke.arc.math.geom.Rectangle;
+import io.anuke.arc.util.Time;
+import io.anuke.arc.util.pooling.Pool.Poolable;
+import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.content.Liquids;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.content.bullets.TurretBullets;
@@ -19,18 +30,6 @@ import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.entities.impl.SolidEntity;
-import io.anuke.ucore.entities.trait.DrawTrait;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Fill;
-import io.anuke.ucore.graphics.Hue;
-import io.anuke.ucore.util.Angles;
-import io.anuke.ucore.util.Geometry;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.Pooling;
import java.io.DataInput;
import java.io.DataOutput;
@@ -85,10 +84,10 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
Puddle p = map.get(tile.pos());
- if(generation == 0 && p != null && p.lastRipple <= Timers.time() - 40f){
+ if(generation == 0 && p != null && p.lastRipple <= Time.time() - 40f){
Effects.effect(BlockFx.ripple, tile.floor().liquidDrop.color,
(tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f);
- p.lastRipple = Timers.time();
+ p.lastRipple = Time.time();
}
return;
}
@@ -97,7 +96,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
if(p == null){
if(Net.client()) return; //not clientside.
- Puddle puddle = Pooling.obtain(Puddle.class, Puddle::new);
+ Puddle puddle = Pools.obtain(Puddle.class, Puddle::new);
puddle.tile = tile;
puddle.liquid = liquid;
puddle.amount = amount;
@@ -108,9 +107,9 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
}else if(p.liquid == liquid){
p.accepting = Math.max(amount, p.accepting);
- if(generation == 0 && p.lastRipple <= Timers.time() - 40f && p.amount >= maxLiquid / 2f){
+ if(generation == 0 && p.lastRipple <= Time.time() - 40f && p.amount >= maxLiquid / 2f){
Effects.effect(BlockFx.ripple, p.liquid.color, (tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f);
- p.lastRipple = Timers.time();
+ p.lastRipple = Time.time();
}
}else{
p.amount += reactPuddle(p.liquid, liquid, amount, p.tile, p.x, p.y);
@@ -176,14 +175,14 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
//update code
float addSpeed = accepting > 0 ? 3f : 0f;
- amount -= Timers.delta() * (1f - liquid.viscosity) / (5f + addSpeed);
+ amount -= Time.delta() * (1f - liquid.viscosity) / (5f + addSpeed);
amount += accepting;
accepting = 0f;
if(amount >= maxLiquid / 1.5f && generation < maxGeneration){
- float deposited = Math.min((amount - maxLiquid / 1.5f) / 4f, 0.3f) * Timers.delta();
- for(GridPoint2 point : Geometry.d4){
+ float deposited = Math.min((amount - maxLiquid / 1.5f) / 4f, 0.3f) * Time.delta();
+ for(Point2 point : Geometry.d4){
Tile other = world.tile(tile.x + point.x, tile.y + point.y);
if(other != null && other.block() == Blocks.air && !other.hasCliffs()){
deposit(other, tile, liquid, deposited, generation + 1);
@@ -214,14 +213,14 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
}
});
- if(liquid.temperature > 0.7f && tile.entity != null && Mathf.chance(0.3 * Timers.delta())){
+ if(liquid.temperature > 0.7f && tile.entity != null && Mathf.chance(0.3 * Time.delta())){
Fire.create(tile);
}
updateTime = 20f;
}
- updateTime -= Timers.delta();
+ updateTime -= Time.delta();
}
@Override
@@ -232,11 +231,11 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
float smag = onLiquid ? 0.8f : 0f;
float sscl = 20f;
- Draw.color(Hue.shift(tmp.set(liquid.color), 2, -0.05f));
- Fill.circle(x + Mathf.sin(Timers.time() + seeds * 532, sscl, smag), y + Mathf.sin(Timers.time() + seeds * 53, sscl, smag), f * 8f);
+ Draw.color(tmp.set(liquid.color).shiftValue(-0.05f));
+ Fill.circle(x + Mathf.sin(Time.time() + seeds * 532, sscl, smag), y + Mathf.sin(Time.time() + seeds * 53, sscl, smag), f * 8f);
Angles.randLenVectors(id, 3, f * 6f, (ex, ey) -> {
- Fill.circle(x + ex + Mathf.sin(Timers.time() + seeds * 532, sscl, smag),
- y + ey + Mathf.sin(Timers.time() + seeds * 53, sscl, smag), f * 5f);
+ Fill.circle(x + ex + Mathf.sin(Time.time() + seeds * 532, sscl, smag),
+ y + ey + Mathf.sin(Time.time() + seeds * 53, sscl, smag), f * 5f);
seeds++;
});
Draw.color();
@@ -302,7 +301,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
}
@Override
- public void read(DataInput data, long time) throws IOException{
+ public void read(DataInput data) throws IOException{
x = data.readFloat();
y = data.readFloat();
liquid = content.liquid(data.readByte());
diff --git a/core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java b/core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java
index 8fb5dedf98..51dda93718 100644
--- a/core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java
+++ b/core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java
@@ -1,7 +1,8 @@
package io.anuke.mindustry.entities.effect;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.util.Mathf;
+import io.anuke.arc.Core;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.math.Mathf;
public class RubbleDecal extends Decal{
private int size;
@@ -20,7 +21,7 @@ public class RubbleDecal extends Decal{
public void drawDecal(){
String region = "rubble-" + size + "-" + Mathf.randomSeed(id, 0, 1);
- if(!Draw.hasRegion(region)){
+ if(!Core.atlas.has(region)){
remove();
return;
}
diff --git a/core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java b/core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java
index 7bfc3e369e..ced259f6e9 100644
--- a/core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java
+++ b/core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java
@@ -1,10 +1,11 @@
package io.anuke.mindustry.entities.effect;
-import com.badlogic.gdx.graphics.g2d.TextureRegion;
+import io.anuke.arc.Core;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.graphics.g2d.TextureRegion;
+import io.anuke.arc.math.Angles;
+import io.anuke.arc.math.Mathf;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.util.Angles;
-import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.world;
@@ -15,7 +16,7 @@ public class ScorchDecal extends Decal{
public static void create(float x, float y){
if(regions[0] == null){
for(int i = 0; i < regions.length; i++){
- regions[i] = Draw.region("scorch" + (i + 1));
+ regions[i] = Core.atlas.find("scorch" + (i + 1));
}
}
@@ -35,7 +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.grect(region, x + Angles.trnsx(rotation, space), y + Angles.trnsy(rotation, space), 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/traits/AbsorbTrait.java b/core/src/io/anuke/mindustry/entities/traits/AbsorbTrait.java
index 445533dda3..7c6520364c 100644
--- a/core/src/io/anuke/mindustry/entities/traits/AbsorbTrait.java
+++ b/core/src/io/anuke/mindustry/entities/traits/AbsorbTrait.java
@@ -1,7 +1,7 @@
package io.anuke.mindustry.entities.traits;
-import io.anuke.ucore.entities.trait.DamageTrait;
-import io.anuke.ucore.entities.trait.Entity;
+import io.anuke.arc.entities.trait.DamageTrait;
+import io.anuke.arc.entities.trait.Entity;
public interface AbsorbTrait extends Entity, TeamTrait, DamageTrait{
void absorb();
diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java
index 926f033fc9..9a3b6e174d 100644
--- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java
+++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java
@@ -1,9 +1,19 @@
package io.anuke.mindustry.entities.traits;
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.Queue;
+import io.anuke.arc.Core;
+import io.anuke.arc.Events;
+import io.anuke.arc.collection.Array;
+import io.anuke.arc.collection.Queue;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.entities.trait.Entity;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.graphics.g2d.Fill;
+import io.anuke.arc.graphics.g2d.Lines;
+import io.anuke.arc.math.Angles;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Vector2;
+import io.anuke.arc.util.Time;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.content.fx.BlockFx;
@@ -13,6 +23,7 @@ import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.game.EventType.BuildSelectEvent;
import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette;
+import io.anuke.mindustry.graphics.Shapes;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Recipe;
@@ -21,16 +32,6 @@ import io.anuke.mindustry.world.Pos;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.BuildBlock;
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.core.Events;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.entities.trait.Entity;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Fill;
-import io.anuke.ucore.graphics.Lines;
-import io.anuke.ucore.graphics.Shapes;
-import io.anuke.ucore.util.Angles;
-import io.anuke.ucore.util.Mathf;
import java.io.DataInput;
import java.io.DataOutput;
@@ -44,6 +45,7 @@ import static io.anuke.mindustry.Vars.*;
*/
public interface BuilderTrait extends Entity{
//these are not instance variables!
+ Vector2[] tmptr = new Vector2[]{new Vector2(), new Vector2(), new Vector2(), new Vector2()};
float placeDistance = 150f;
float mineDistance = 70f;
Array removal = new Array<>();
@@ -173,15 +175,19 @@ public interface BuilderTrait extends Entity{
default void updateBuilding(Unit unit){
//remove already completed build requests
removal.clear();
- for(BuildRequest request : getPlaceQueue()){
- if((request.breaking && world.tile(request.x, request.y).block() == Blocks.air) ||
- (!request.breaking && world.tile(request.x, request.y).block() == request.recipe.result)){
- removal.add(request);
- }
+ for(BuildRequest req : getPlaceQueue()){
+ removal.add(req);
}
- for(BuildRequest req : removal){
- getPlaceQueue().removeValue(req, true);
+ getPlaceQueue().clear();
+
+ for(BuildRequest request : removal){
+ if(!((request.breaking && world.tile(request.x, request.y).block() == Blocks.air) ||
+ (!request.breaking &&
+ (world.tile(request.x, request.y).getRotation() == request.rotation || !request.recipe.result.rotate)
+ && world.tile(request.x, request.y).block() == request.recipe.result))){
+ getPlaceQueue().addLast(request);
+ }
}
BuildRequest current = getCurrentRequest();
@@ -198,7 +204,7 @@ public interface BuilderTrait extends Entity{
Tile tile = world.tile(current.x, current.y);
- if(unit.distanceTo(tile) > placeDistance){
+ if(unit.dst(tile) > placeDistance){
return;
}
@@ -228,7 +234,7 @@ public interface BuilderTrait extends Entity{
return;
}
- if(unit.distanceTo(tile) <= placeDistance){
+ if(unit.dst(tile) <= placeDistance){
unit.rotation = Mathf.slerpDelta(unit.rotation, unit.angleTo(entity), 0.4f);
}
@@ -236,9 +242,9 @@ public interface BuilderTrait extends Entity{
if(!Net.client()){
//deconstructing is 2x as fast
if(current.breaking){
- entity.deconstruct(unit, core, 2f / entity.buildCost * Timers.delta() * getBuildPower(tile));
+ entity.deconstruct(unit, core, 2f / entity.buildCost * Time.delta() * getBuildPower(tile));
}else{
- entity.construct(unit, core, 1f / entity.buildCost * Timers.delta() * getBuildPower(tile));
+ entity.construct(unit, core, 1f / entity.buildCost * Time.delta() * getBuildPower(tile));
}
current.progress = entity.progress();
@@ -247,7 +253,7 @@ public interface BuilderTrait extends Entity{
}
if(!current.initialized){
- Gdx.app.postRunnable(() -> Events.fire(new BuildSelectEvent(tile, unit.getTeam(), this, current.breaking)));
+ Core.app.post(() -> Events.fire(new BuildSelectEvent(tile, unit.getTeam(), this, current.breaking)));
current.initialized = true;
}
}
@@ -257,16 +263,16 @@ public interface BuilderTrait extends Entity{
Tile tile = getMineTile();
TileEntity core = unit.getClosestCore();
- if(core == null || tile.block() != Blocks.air || unit.distanceTo(tile.worldx(), tile.worldy()) > mineDistance
+ if(core == null || tile.block() != Blocks.air || unit.dst(tile.worldx(), tile.worldy()) > mineDistance
|| tile.floor().drops == null || !unit.inventory.canAcceptItem(tile.floor().drops.item) || !canMine(tile.floor().drops.item)){
setMineTile(null);
}else{
Item item = tile.floor().drops.item;
unit.rotation = Mathf.slerpDelta(unit.rotation, unit.angleTo(tile.worldx(), tile.worldy()), 0.4f);
- if(Mathf.chance(Timers.delta() * (0.06 - item.hardness * 0.01) * getMinePower())){
+ if(Mathf.chance(Time.delta() * (0.06 - item.hardness * 0.01) * getMinePower())){
- if(unit.distanceTo(core) < mineTransferRange && core.tile.block().acceptStack(item, 1, core.tile, unit) == 1){
+ if(unit.dst(core) < mineTransferRange && core.tile.block().acceptStack(item, 1, core.tile, unit) == 1){
Call.transferItemTo(item, 1,
tile.worldx() + Mathf.range(tilesize / 2f),
tile.worldy() + Mathf.range(tilesize / 2f), core.tile);
@@ -278,7 +284,7 @@ public interface BuilderTrait extends Entity{
}
}
- if(Mathf.chance(0.06 * Timers.delta())){
+ if(Mathf.chance(0.06 * Time.delta())){
Effects.effect(BlockFx.pulverizeSmall,
tile.worldx() + Mathf.range(tilesize / 2f),
tile.worldy() + Mathf.range(tilesize / 2f), 0f, item.color);
@@ -300,12 +306,12 @@ public interface BuilderTrait extends Entity{
Tile tile = world.tile(request.x, request.y);
- if(unit.distanceTo(tile) > placeDistance){
+ if(unit.dst(tile) > placeDistance){
return;
}
- Draw.color(Palette.accent);
- float focusLen = 3.8f + Mathf.absin(Timers.time(), 1.1f, 0.6f);
+ Lines.stroke(1f, Palette.accent);
+ float focusLen = 3.8f + Mathf.absin(Time.time(), 1.1f, 0.6f);
float px = unit.x + Angles.trnsx(unit.rotation, focusLen);
float py = unit.y + Angles.trnsy(unit.rotation, focusLen);
@@ -318,7 +324,7 @@ public interface BuilderTrait extends Entity{
tmptr[3].set(tile.drawx() + sz, tile.drawy() + sz);
Arrays.sort(tmptr, (a, b) -> -Float.compare(Angles.angleDist(Angles.angle(unit.x, unit.y, a.x, a.y), ang),
- Angles.angleDist(Angles.angle(unit.x, unit.y, b.x, b.y), ang)));
+ Angles.angleDist(Angles.angle(unit.x, unit.y, b.x, b.y), ang)));
float x1 = tmptr[0].x, y1 = tmptr[0].y,
x3 = tmptr[1].x, y3 = tmptr[1].y;
@@ -328,7 +334,7 @@ public interface BuilderTrait extends Entity{
Lines.line(px, py, x1, y1);
Lines.line(px, py, x3, y3);
- Fill.circle(px, py, 1.6f + Mathf.absin(Timers.time(), 0.8f, 1.5f));
+ Fill.circle(px, py, 1.6f + Mathf.absin(Time.time(), 0.8f, 1.5f));
Draw.color();
}
@@ -339,22 +345,23 @@ public interface BuilderTrait extends Entity{
if(tile == null) return;
- float focusLen = 4f + Mathf.absin(Timers.time(), 1.1f, 0.5f);
+ float focusLen = 4f + Mathf.absin(Time.time(), 1.1f, 0.5f);
float swingScl = 12f, swingMag = tilesize / 8f;
float flashScl = 0.3f;
float px = unit.x + Angles.trnsx(unit.rotation, focusLen);
float py = unit.y + Angles.trnsy(unit.rotation, focusLen);
- float ex = tile.worldx() + Mathf.sin(Timers.time() + 48, swingScl, swingMag);
- float ey = tile.worldy() + Mathf.sin(Timers.time() + 48, swingScl + 2f, swingMag);
+ float ex = tile.worldx() + Mathf.sin(Time.time() + 48, swingScl, swingMag);
+ float ey = tile.worldy() + Mathf.sin(Time.time() + 48, swingScl + 2f, swingMag);
+
+ Draw.color(Color.LIGHT_GRAY, Color.WHITE, 1f - flashScl + Mathf.absin(Time.time(), 0.5f, flashScl));
- Draw.color(Color.LIGHT_GRAY, Color.WHITE, 1f - flashScl + Mathf.absin(Timers.time(), 0.5f, flashScl));
Shapes.laser("minelaser", "minelaser-end", px, py, ex, ey);
if(unit instanceof Player && ((Player) unit).isLocal){
- Draw.color(Palette.accent);
- Lines.poly(tile.worldx(), tile.worldy(), 4, tilesize / 2f * Mathf.sqrt2, Timers.time());
+ Lines.stroke(1f, Palette.accent);
+ Lines.poly(tile.worldx(), tile.worldy(), 4, tilesize / 2f * Mathf.sqrt2, Time.time());
}
Draw.color();
diff --git a/core/src/io/anuke/mindustry/entities/traits/CarriableTrait.java b/core/src/io/anuke/mindustry/entities/traits/CarriableTrait.java
index 296b782154..3755245e8e 100644
--- a/core/src/io/anuke/mindustry/entities/traits/CarriableTrait.java
+++ b/core/src/io/anuke/mindustry/entities/traits/CarriableTrait.java
@@ -1,6 +1,6 @@
package io.anuke.mindustry.entities.traits;
-import io.anuke.ucore.entities.trait.SolidTrait;
+import io.anuke.arc.entities.trait.SolidTrait;
public interface CarriableTrait extends TeamTrait, TargetTrait, SolidTrait{
diff --git a/core/src/io/anuke/mindustry/entities/traits/CarryTrait.java b/core/src/io/anuke/mindustry/entities/traits/CarryTrait.java
index fdc052f787..b63ce195cd 100644
--- a/core/src/io/anuke/mindustry/entities/traits/CarryTrait.java
+++ b/core/src/io/anuke/mindustry/entities/traits/CarryTrait.java
@@ -5,8 +5,8 @@ import io.anuke.annotations.Annotations.Remote;
import io.anuke.mindustry.content.fx.UnitFx;
import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.gen.Call;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.entities.trait.SolidTrait;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.entities.trait.SolidTrait;
public interface CarryTrait extends TeamTrait, SolidTrait, TargetTrait{
diff --git a/core/src/io/anuke/mindustry/entities/traits/SaveTrait.java b/core/src/io/anuke/mindustry/entities/traits/SaveTrait.java
index 4e7009771e..bcf357f4e5 100644
--- a/core/src/io/anuke/mindustry/entities/traits/SaveTrait.java
+++ b/core/src/io/anuke/mindustry/entities/traits/SaveTrait.java
@@ -1,6 +1,6 @@
package io.anuke.mindustry.entities.traits;
-import io.anuke.ucore.entities.trait.Entity;
+import io.anuke.arc.entities.trait.Entity;
/**
* Marks an entity as serializable.
diff --git a/core/src/io/anuke/mindustry/entities/traits/ShooterTrait.java b/core/src/io/anuke/mindustry/entities/traits/ShooterTrait.java
index 12df85dda1..22072cfd64 100644
--- a/core/src/io/anuke/mindustry/entities/traits/ShooterTrait.java
+++ b/core/src/io/anuke/mindustry/entities/traits/ShooterTrait.java
@@ -1,12 +1,12 @@
package io.anuke.mindustry.entities.traits;
+import io.anuke.arc.entities.trait.VelocityTrait;
+import io.anuke.arc.util.Interval;
import io.anuke.mindustry.type.Weapon;
-import io.anuke.ucore.entities.trait.VelocityTrait;
-import io.anuke.ucore.util.Timer;
public interface ShooterTrait extends VelocityTrait, TeamTrait, InventoryTrait{
- Timer getTimer();
+ Interval getTimer();
int getShootTimer(boolean left);
diff --git a/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java b/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java
index 9509e4eb68..38bbe23088 100644
--- a/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java
+++ b/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java
@@ -2,9 +2,9 @@ package io.anuke.mindustry.entities.traits;
import io.anuke.mindustry.core.NetClient;
import io.anuke.mindustry.net.Interpolator;
-import io.anuke.ucore.core.Core;
-import io.anuke.ucore.entities.trait.Entity;
-import io.anuke.ucore.util.Tmp;
+import io.anuke.arc.Core;
+import io.anuke.arc.entities.trait.Entity;
+import io.anuke.arc.util.Tmp;
import java.io.DataInput;
import java.io.DataOutput;
@@ -33,8 +33,7 @@ public interface SyncTrait extends Entity, TypeTrait{
if(isClipped()){
//move off screen when no longer in bounds
- Tmp.r1.setSize(Core.camera.viewportWidth * Core.camera.zoom * NetClient.viewScale,
- Core.camera.viewportHeight * Core.camera.zoom * NetClient.viewScale)
+ Tmp.r1.setSize(Core.camera.width * NetClient.viewScale, Core.camera.height * NetClient.viewScale)
.setCenter(Core.camera.position.x, Core.camera.position.y);
if(!Tmp.r1.contains(getX(), getY()) && !Tmp.r1.contains(getInterpolator().last.x, getInterpolator().last.y)){
@@ -67,5 +66,5 @@ public interface SyncTrait extends Entity, TypeTrait{
//Read and write sync data, usually position
void write(DataOutput data) throws IOException;
- void read(DataInput data, long time) throws IOException;
+ void read(DataInput data) throws IOException;
}
diff --git a/core/src/io/anuke/mindustry/entities/traits/TargetTrait.java b/core/src/io/anuke/mindustry/entities/traits/TargetTrait.java
index bdeea6ea33..68eac61412 100644
--- a/core/src/io/anuke/mindustry/entities/traits/TargetTrait.java
+++ b/core/src/io/anuke/mindustry/entities/traits/TargetTrait.java
@@ -1,14 +1,14 @@
package io.anuke.mindustry.entities.traits;
+import io.anuke.arc.entities.trait.SolidTrait;
+import io.anuke.arc.entities.trait.VelocityTrait;
+import io.anuke.arc.math.geom.Position;
import io.anuke.mindustry.game.Team;
-import io.anuke.ucore.entities.trait.PosTrait;
-import io.anuke.ucore.entities.trait.SolidTrait;
-import io.anuke.ucore.entities.trait.VelocityTrait;
/**
* Base interface for targetable entities.
*/
-public interface TargetTrait extends PosTrait, VelocityTrait{
+public interface TargetTrait extends Position, VelocityTrait{
boolean isDead();
diff --git a/core/src/io/anuke/mindustry/entities/traits/TeamTrait.java b/core/src/io/anuke/mindustry/entities/traits/TeamTrait.java
index 3c7cbf7dd3..6954258423 100644
--- a/core/src/io/anuke/mindustry/entities/traits/TeamTrait.java
+++ b/core/src/io/anuke/mindustry/entities/traits/TeamTrait.java
@@ -1,7 +1,7 @@
package io.anuke.mindustry.entities.traits;
import io.anuke.mindustry.game.Team;
-import io.anuke.ucore.entities.trait.Entity;
+import io.anuke.arc.entities.trait.Entity;
public interface TeamTrait extends Entity{
Team getTeam();
diff --git a/core/src/io/anuke/mindustry/entities/traits/TypeTrait.java b/core/src/io/anuke/mindustry/entities/traits/TypeTrait.java
index 774b2b4143..663575bb5f 100644
--- a/core/src/io/anuke/mindustry/entities/traits/TypeTrait.java
+++ b/core/src/io/anuke/mindustry/entities/traits/TypeTrait.java
@@ -1,8 +1,8 @@
package io.anuke.mindustry.entities.traits;
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.ObjectIntMap;
-import io.anuke.ucore.function.Supplier;
+import io.anuke.arc.collection.Array;
+import io.anuke.arc.collection.ObjectIntMap;
+import io.anuke.arc.function.Supplier;
public interface TypeTrait{
int[] lastRegisteredID = {0};
diff --git a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java
index f40e21c2c2..840aaf19de 100644
--- a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java
+++ b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java
@@ -1,9 +1,18 @@
package io.anuke.mindustry.entities.units;
-import com.badlogic.gdx.graphics.g2d.TextureRegion;
-import com.badlogic.gdx.math.Rectangle;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
+import io.anuke.arc.Core;
+import io.anuke.arc.entities.Effects;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.graphics.g2d.TextureRegion;
+import io.anuke.arc.math.Angles;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Geometry;
+import io.anuke.arc.math.geom.Rectangle;
+import io.anuke.arc.util.Interval;
+import io.anuke.arc.util.Time;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.content.fx.ExplosionFx;
import io.anuke.mindustry.entities.Damage;
@@ -24,11 +33,6 @@ import io.anuke.mindustry.type.Weapon;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.units.CommandCenter.CommandCenterEntity;
import io.anuke.mindustry.world.meta.BlockFlag;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.util.*;
import java.io.DataInput;
import java.io.DataOutput;
@@ -46,7 +50,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
protected static final int timerShootRight = timerIndex++;
protected UnitType type;
- protected Timer timer = new Timer(5);
+ protected Interval timer = new Interval(5);
protected StateMachine state = new StateMachine();
protected TargetTrait target;
@@ -77,7 +81,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
Effects.shake(2f, 2f, unit);
//must run afterwards so the unit's group is not null when sending the removal packet
- threads.runDelay(unit::remove);
+ Core.app.post(unit::remove);
}
@Override
@@ -222,7 +226,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
}
@Override
- public Timer getTimer(){
+ public Interval getTimer(){
return timer;
}
@@ -282,7 +286,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
@Override
public void update(){
- hitTime -= Timers.delta();
+ hitTime -= Time.delta();
if(isDead()){
updateRespawning();
@@ -393,12 +397,12 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
}
@Override
- public void read(DataInput data, long time) throws IOException{
+ public void read(DataInput data) throws IOException{
float lastx = x, lasty = y, lastrot = rotation;
super.readSave(data);
this.type = content.getByID(ContentType.unit, data.readByte());
- interpolator.read(lastx, lasty, x, y, time, rotation);
+ interpolator.read(lastx, lasty, x, y, rotation);
rotation = lastrot;
}
diff --git a/core/src/io/anuke/mindustry/entities/units/FlyingUnit.java b/core/src/io/anuke/mindustry/entities/units/FlyingUnit.java
index e72390c51e..f2b00660d9 100644
--- a/core/src/io/anuke/mindustry/entities/units/FlyingUnit.java
+++ b/core/src/io/anuke/mindustry/entities/units/FlyingUnit.java
@@ -1,26 +1,25 @@
package io.anuke.mindustry.entities.units;
-import com.badlogic.gdx.math.Vector2;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.math.Angles;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Geometry;
+import io.anuke.arc.math.geom.Vector2;
+import io.anuke.arc.util.Time;
import io.anuke.mindustry.entities.Predict;
import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.entities.traits.CarriableTrait;
import io.anuke.mindustry.entities.traits.CarryTrait;
-import io.anuke.mindustry.graphics.Trail;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.AmmoType;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockFlag;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.util.*;
import static io.anuke.mindustry.Vars.world;
public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
- protected static Translator vec = new Translator();
- protected static float wobblyness = 0.6f;
+ protected static Vector2 vec = new Vector2();
- protected Trail trail = new Trail(8);
protected CarriableTrait carrying;
protected final UnitState
@@ -75,8 +74,8 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
}else{
attack(150f);
- if((Mathf.angNear(angleTo(target), rotation, 15f) || !getWeapon().getAmmo().bullet.keepVelocity) //bombers don't care about rotation
- && distanceTo(target) < Math.max(getWeapon().getAmmo().getRange(), type.range)){
+ if((Angles.near(angleTo(target), rotation, 15f) || !getWeapon().getAmmo().bullet.keepVelocity) //bombers don't care about rotation
+ && dst(target) < Math.max(getWeapon().getAmmo().getRange(), type.range)){
AmmoType ammo = getWeapon().getAmmo();
Vector2 to = Predict.intercept(FlyingUnit.this, target, ammo.bullet.speed);
@@ -99,7 +98,7 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
});
if(target != null){
- circle(60f + Mathf.absin(Timers.time() + id * 23525, 70f, 1200f));
+ circle(60f + Mathf.absin(Time.time() + id * 23525, 70f, 1200f));
}
}
},
@@ -153,9 +152,6 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
updateRotation();
wobble();
}
-
- trail.update(x + Angles.trnsx(rotation + 180f, 6f) + Mathf.range(wobblyness),
- y + Angles.trnsy(rotation + 180f, 6f) + Mathf.range(wobblyness));
}
@Override
@@ -169,11 +165,6 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
Draw.alpha(1f);
}
- @Override
- public void drawOver(){
- trail.draw(type.trailColor, 5f);
- }
-
@Override
public void behavior(){
if(health <= health * type.retreatPercent && !isCommanded() &&
@@ -200,11 +191,11 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
protected void wobble(){
if(Net.client()) return;
- x += Mathf.sin(Timers.time() + id * 999, 25f, 0.08f)*Timers.delta();
- y += Mathf.cos(Timers.time() + id * 999, 25f, 0.08f)*Timers.delta();
+ x += Mathf.sin(Time.time() + id * 999, 25f, 0.08f)*Time.delta();
+ y += Mathf.cos(Time.time() + id * 999, 25f, 0.08f)*Time.delta();
if(velocity.len() <= 0.05f){
- rotation += Mathf.sin(Timers.time() + id * 99, 10f, 2.5f)*Timers.delta();
+ rotation += Mathf.sin(Time.time() + id * 99, 10f, 2.5f)*Time.delta();
}
}
@@ -225,7 +216,7 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
vec.rotate((circleLength - vec.len()) / circleLength * 180f);
}
- vec.setLength(speed * Timers.delta());
+ vec.setLength(speed * Time.delta());
velocity.add(vec);
}
@@ -235,9 +226,9 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
vec.set(target.getX() - x, target.getY() - y);
- float length = circleLength <= 0.001f ? 1f : Mathf.clamp((distanceTo(target) - circleLength) / 100f, -1f, 1f);
+ float length = circleLength <= 0.001f ? 1f : Mathf.clamp((dst(target) - circleLength) / 100f, -1f, 1f);
- vec.setLength(type.speed * Timers.delta() * length);
+ vec.setLength(type.speed * Time.delta() * length);
if(length < 0) vec.rotate(180f);
velocity.add(vec);
@@ -255,7 +246,7 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
vec.setAngle(Mathf.slerpDelta(velocity.angle(), vec.angle(), 0.44f));
}
- vec.setLength(type.speed * Timers.delta());
+ vec.setLength(type.speed * Time.delta());
velocity.add(vec);
}
diff --git a/core/src/io/anuke/mindustry/entities/units/GroundUnit.java b/core/src/io/anuke/mindustry/entities/units/GroundUnit.java
index db01ba1ab1..ba73b95f43 100644
--- a/core/src/io/anuke/mindustry/entities/units/GroundUnit.java
+++ b/core/src/io/anuke/mindustry/entities/units/GroundUnit.java
@@ -1,7 +1,11 @@
package io.anuke.mindustry.entities.units;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.math.Vector2;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.math.Angles;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Vector2;
+import io.anuke.arc.util.Time;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.Predict;
import io.anuke.mindustry.entities.TileEntity;
@@ -12,11 +16,6 @@ import io.anuke.mindustry.type.ContentType;
import io.anuke.mindustry.type.Weapon;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.util.Angles;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.Translator;
import java.io.DataInput;
import java.io.DataOutput;
@@ -26,7 +25,7 @@ import static io.anuke.mindustry.Vars.content;
import static io.anuke.mindustry.Vars.world;
public abstract class GroundUnit extends BaseUnit{
- protected static Translator vec = new Translator();
+ protected static Vector2 vec = new Vector2();
protected float walkTime;
protected float stuckTime;
@@ -42,7 +41,7 @@ public abstract class GroundUnit extends BaseUnit{
public void update(){
TileEntity core = getClosestEnemyCore();
- float dst = core == null ? 0 : distanceTo(core);
+ float dst = core == null ? 0 : dst(core);
if(core != null && dst < getWeapon().getAmmo().getRange() / 1.1f){
target = core;
@@ -57,7 +56,7 @@ public abstract class GroundUnit extends BaseUnit{
public void update(){
TileEntity target = getClosestCore();
if(target != null){
- if(distanceTo(target) > 400f){
+ if(dst(target) > 400f){
moveAwayFromCore();
}else{
patrol();
@@ -105,7 +104,7 @@ public abstract class GroundUnit extends BaseUnit{
@Override
public void move(float x, float y){
if(Mathf.dst(x, y) > 0.01f){
- baseRotation = Mathf.slerpDelta(baseRotation, Mathf.atan2(x, y), type.baseRotateSpeed);
+ baseRotation = Mathf.slerpDelta(baseRotation, Mathf.angle(x, y), type.baseRotateSpeed);
}
super.move(x, y);
}
@@ -119,14 +118,14 @@ public abstract class GroundUnit extends BaseUnit{
public void update(){
super.update();
- stuckTime = !vec.set(x, y).sub(lastPosition()).isZero(0.0001f) ? 0f : stuckTime + Timers.delta();
+ stuckTime = !vec.set(x, y).sub(lastPosition()).isZero(0.0001f) ? 0f : stuckTime + Time.delta();
if(!velocity.isZero()){
baseRotation = Mathf.slerpDelta(baseRotation, velocity.angle(), 0.05f);
}
if(stuckTime < 1f){
- walkTime += Timers.delta();
+ walkTime += Time.delta();
}
}
@@ -188,10 +187,10 @@ public abstract class GroundUnit extends BaseUnit{
}
if(!Units.invalidateTarget(target, this)){
- if(distanceTo(target) < getWeapon().getAmmo().getRange()){
+ if(dst(target) < getWeapon().getAmmo().getRange()){
rotate(angleTo(target));
- if(Mathf.angNear(angleTo(target), rotation, 13f)){
+ if(Angles.near(angleTo(target), rotation, 13f)){
AmmoType ammo = getWeapon().getAmmo();
Vector2 to = Predict.intercept(GroundUnit.this, target, ammo.bullet.speed);
@@ -220,8 +219,8 @@ public abstract class GroundUnit extends BaseUnit{
}
@Override
- public void read(DataInput data, long time) throws IOException{
- super.read(data, time);
+ public void read(DataInput data) throws IOException{
+ super.read(data);
weapon = content.getByID(ContentType.weapon, data.readByte());
}
@@ -238,12 +237,12 @@ public abstract class GroundUnit extends BaseUnit{
}
protected void patrol(){
- vec.trns(baseRotation, type.speed * Timers.delta());
+ vec.trns(baseRotation, type.speed * Time.delta());
velocity.add(vec.x, vec.y);
vec.trns(baseRotation, type.hitsizeTile);
Tile tile = world.tileWorld(x + vec.x, y + vec.y);
if((tile == null || tile.solid() || tile.floor().drownTime > 0) || stuckTime > 10f){
- baseRotation += Mathf.sign(id % 2 - 0.5f) * Timers.delta() * 3f;
+ baseRotation += Mathf.sign(id % 2 - 0.5f) * Time.delta() * 3f;
}
rotation = Mathf.slerpDelta(rotation, velocity.angle(), type.rotatespeed);
@@ -258,7 +257,7 @@ public abstract class GroundUnit extends BaseUnit{
vec.rotate((circleLength - vec.len()) / circleLength * 180f);
}
- vec.setLength(type.speed * Timers.delta());
+ vec.setLength(type.speed * Time.delta());
velocity.add(vec);
}
@@ -272,7 +271,7 @@ public abstract class GroundUnit extends BaseUnit{
float angle = angleTo(targetTile);
- velocity.add(vec.trns(angleTo(targetTile), type.speed*Timers.delta()));
+ velocity.add(vec.trns(angleTo(targetTile), type.speed*Time.delta()));
rotation = Mathf.slerpDelta(rotation, angle, type.rotatespeed);
}
@@ -292,11 +291,11 @@ public abstract class GroundUnit extends BaseUnit{
Tile targetTile = world.pathfinder.getTargetTile(enemy, tile);
TileEntity core = getClosestCore();
- if(tile == targetTile || core == null || distanceTo(core) < 90f) return;
+ if(tile == targetTile || core == null || dst(core) < 90f) return;
float angle = angleTo(targetTile);
- velocity.add(vec.trns(angleTo(targetTile), type.speed*Timers.delta()));
+ velocity.add(vec.trns(angleTo(targetTile), type.speed*Time.delta()));
rotation = Mathf.slerpDelta(rotation, angle, type.rotatespeed);
}
}
diff --git a/core/src/io/anuke/mindustry/entities/units/Squad.java b/core/src/io/anuke/mindustry/entities/units/Squad.java
index 1068de0a6b..ef5d2b6e01 100644
--- a/core/src/io/anuke/mindustry/entities/units/Squad.java
+++ b/core/src/io/anuke/mindustry/entities/units/Squad.java
@@ -1,24 +1,22 @@
package io.anuke.mindustry.entities.units;
-import com.badlogic.gdx.math.Vector2;
-import io.anuke.ucore.util.Translator;
-
-import static io.anuke.mindustry.Vars.threads;
+import io.anuke.arc.Core;
+import io.anuke.arc.math.geom.Vector2;
/**
* Used to group entities together, for formations and such.
* Usually, squads are used by units spawned in the same wave.
*/
public class Squad{
- public Vector2 direction = new Translator();
+ public Vector2 direction = new Vector2();
public int units;
private long lastUpdated;
protected void update(){
- if(threads.getFrameID() != lastUpdated){
+ if(Core.graphics.getFrameId() != lastUpdated){
direction.setZero();
- lastUpdated = threads.getFrameID();
+ lastUpdated = Core.graphics.getFrameId();
}
}
}
diff --git a/core/src/io/anuke/mindustry/entities/units/UnitCommand.java b/core/src/io/anuke/mindustry/entities/units/UnitCommand.java
index a6e8c2a005..5939ec3aff 100644
--- a/core/src/io/anuke/mindustry/entities/units/UnitCommand.java
+++ b/core/src/io/anuke/mindustry/entities/units/UnitCommand.java
@@ -1,6 +1,6 @@
package io.anuke.mindustry.entities.units;
-import io.anuke.ucore.util.Bundles;
+import io.anuke.arc.Core;
public enum UnitCommand{
attack, retreat, patrol;
@@ -8,7 +8,7 @@ public enum UnitCommand{
private final String localized;
UnitCommand(){
- localized = Bundles.get("command." + name());
+ localized = Core.bundle.get("command." + name());
}
public String localized(){
diff --git a/core/src/io/anuke/mindustry/entities/units/UnitDrops.java b/core/src/io/anuke/mindustry/entities/units/UnitDrops.java
index 3780465876..25a20a5e45 100644
--- a/core/src/io/anuke/mindustry/entities/units/UnitDrops.java
+++ b/core/src/io/anuke/mindustry/entities/units/UnitDrops.java
@@ -5,7 +5,7 @@ import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.type.Item;
-import io.anuke.ucore.util.Mathf;
+import io.anuke.arc.math.Mathf;
public class UnitDrops{
private static Item[] dropTable;
diff --git a/core/src/io/anuke/mindustry/entities/units/UnitType.java b/core/src/io/anuke/mindustry/entities/units/UnitType.java
index c18928262b..9552a786cc 100644
--- a/core/src/io/anuke/mindustry/entities/units/UnitType.java
+++ b/core/src/io/anuke/mindustry/entities/units/UnitType.java
@@ -1,8 +1,13 @@
package io.anuke.mindustry.entities.units;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.g2d.TextureRegion;
-import com.badlogic.gdx.utils.ObjectSet;
+import io.anuke.arc.Core;
+import io.anuke.arc.collection.ObjectSet;
+import io.anuke.arc.function.Supplier;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.graphics.g2d.TextureRegion;
+import io.anuke.arc.scene.ui.layout.Table;
+import io.anuke.arc.util.Log;
+import io.anuke.arc.util.Strings;
import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.content.Weapons;
import io.anuke.mindustry.entities.traits.TypeTrait;
@@ -12,12 +17,6 @@ import io.anuke.mindustry.type.ContentType;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Weapon;
import io.anuke.mindustry.ui.ContentDisplay;
-import io.anuke.ucore.function.Supplier;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.scene.ui.layout.Table;
-import io.anuke.ucore.util.Bundles;
-import io.anuke.ucore.util.Log;
-import io.anuke.ucore.util.Strings;
public class UnitType extends UnlockableContent{
protected final Supplier extends BaseUnit> constructor;
@@ -51,11 +50,11 @@ public class UnitType extends UnlockableContent{
public UnitType(String name, Class type, Supplier mainConstructor){
this.name = name;
this.constructor = mainConstructor;
- this.description = Bundles.getOrNull("unit." + name + ".description");
+ this.description = Core.bundle.getOrNull("unit." + name + ".description");
TypeTrait.registerType(type, mainConstructor);
- if(!Bundles.has("unit." + this.name + ".name")){
+ if(!Core.bundle.has("unit." + this.name + ".name")){
Log.err("Warning: unit '" + name + "' is missing a localized name. Add the follow to bundle.properties:");
Log.err("unit." + this.name + ".name=" + Strings.capitalize(name.replace('-', '_')));
}
@@ -68,7 +67,7 @@ public class UnitType extends UnlockableContent{
@Override
public String localizedName(){
- return Bundles.get("unit." + name + ".name");
+ return Core.bundle.get("unit." + name + ".name");
}
@Override
@@ -78,12 +77,12 @@ public class UnitType extends UnlockableContent{
@Override
public void load(){
- iconRegion = Draw.region("unit-icon-" + name);
- region = Draw.region(name);
+ iconRegion = Core.atlas.find("unit-icon-" + name);
+ region = Core.atlas.find(name);
if(!isFlying){
- legRegion = Draw.region(name + "-leg");
- baseRegion = Draw.region(name + "-base");
+ legRegion = Core.atlas.find(name + "-leg");
+ baseRegion = Core.atlas.find(name + "-base");
}
}
diff --git a/core/src/io/anuke/mindustry/entities/units/types/AlphaDrone.java b/core/src/io/anuke/mindustry/entities/units/types/AlphaDrone.java
deleted file mode 100644
index 478854cfc0..0000000000
--- a/core/src/io/anuke/mindustry/entities/units/types/AlphaDrone.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package io.anuke.mindustry.entities.units.types;
-
-import com.badlogic.gdx.math.Vector2;
-import io.anuke.annotations.Annotations.Loc;
-import io.anuke.annotations.Annotations.Remote;
-import io.anuke.mindustry.Vars;
-import io.anuke.mindustry.content.fx.UnitFx;
-import io.anuke.mindustry.entities.Player;
-import io.anuke.mindustry.entities.Predict;
-import io.anuke.mindustry.entities.traits.TargetTrait;
-import io.anuke.mindustry.entities.units.BaseUnit;
-import io.anuke.mindustry.entities.units.FlyingUnit;
-import io.anuke.mindustry.entities.units.UnitCommand;
-import io.anuke.mindustry.entities.units.UnitState;
-import io.anuke.mindustry.gen.Call;
-import io.anuke.mindustry.net.Net;
-import io.anuke.mindustry.type.AmmoType;
-import io.anuke.ucore.core.Effects;
-import io.anuke.ucore.util.Mathf;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-
-import static io.anuke.mindustry.Vars.*;
-
-public class AlphaDrone extends FlyingUnit {
- static final float followDistance = 80f;
-
- public Player leader;
-
- public final UnitState attack = new UnitState() {
- @Override
- public void update() {
- if(leader == null || leader.isDead() || !leader.isAdded()){
- damage(99999f);
- return;
- }
- TargetTrait last = target;
- target = leader;
-
- if(last == null){
- circle(leader.isShooting ? 60f : 0f);
- }
-
- target = last;
- if(distanceTo(leader) < followDistance){
- targetClosest();
- }else{
- target = null;
- }
-
- if(target != null){
- attack(50f);
-
- if((Mathf.angNear(angleTo(target), rotation, 15f) && distanceTo(target) < getWeapon().getAmmo().getRange())){
- AmmoType ammo = getWeapon().getAmmo();
-
- Vector2 to = Predict.intercept(AlphaDrone.this, target, ammo.bullet.speed);
- getWeapon().update(AlphaDrone.this, to.x, to.y);
- }
- }
-
- if(!leader.isShooting && distanceTo(leader) < 7f){
- Call.onAlphaDroneFade(AlphaDrone.this);
- }
- }
- };
-
- @Remote(called = Loc.server)
- public static void onAlphaDroneFade(BaseUnit drone){
- if(drone == null) return;
- Effects.effect(UnitFx.pickup, drone);
- //must run afterwards so the unit's group is not null when sending the removal packet
- threads.runDelay(drone::remove);
- }
-
- @Override
- public void onCommand(UnitCommand command){
- //nuh
- }
-
- @Override
- public void behavior(){
- //nope
- }
-
- @Override
- public UnitState getStartState() {
- return attack;
- }
-
- @Override
- public void write(DataOutput stream) throws IOException {
- super.write(stream);
- stream.writeInt(leader == null ? -1 : leader.id);
- }
-
- @Override
- public void read(DataInput stream, long time) throws IOException {
- super.read(stream, time);
- leader = Vars.playerGroup.getByID(stream.readInt());
- }
-
- @Override
- public void readSave(DataInput stream) throws IOException{
- super.readSave(stream);
-
- if(!Net.active() && !headless){
- leader = players[0];
- }
- }
-}
diff --git a/core/src/io/anuke/mindustry/entities/units/types/Drone.java b/core/src/io/anuke/mindustry/entities/units/types/Drone.java
index b47215d4ea..7d6ffb133a 100644
--- a/core/src/io/anuke/mindustry/entities/units/types/Drone.java
+++ b/core/src/io/anuke/mindustry/entities/units/types/Drone.java
@@ -1,6 +1,11 @@
package io.anuke.mindustry.entities.units.types;
-import com.badlogic.gdx.utils.Queue;
+import io.anuke.arc.Events;
+import io.anuke.arc.collection.Queue;
+import io.anuke.arc.entities.EntityGroup;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Geometry;
+import io.anuke.arc.util.Structs;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.entities.TileEntity;
@@ -12,7 +17,6 @@ import io.anuke.mindustry.entities.units.UnitCommand;
import io.anuke.mindustry.entities.units.UnitState;
import io.anuke.mindustry.game.EventType.BuildSelectEvent;
import io.anuke.mindustry.gen.Call;
-import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.ItemType;
@@ -20,11 +24,6 @@ import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.BuildBlock;
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
import io.anuke.mindustry.world.meta.BlockFlag;
-import io.anuke.ucore.core.Events;
-import io.anuke.ucore.entities.EntityGroup;
-import io.anuke.ucore.util.Geometry;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.Structs;
import java.io.DataInput;
import java.io.DataOutput;
@@ -63,7 +62,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
if(core == null) return;
if((entity.progress() < 1f || entity.progress() > 0f) && entity.tile.block() instanceof BuildBlock){ //building is valid
- if(!isBuilding() && distanceTo(target) < placeDistance * 0.9f){ //within distance, begin placing
+ if(!isBuilding() && dst(target) < placeDistance * 0.9f){ //within distance, begin placing
if(isBreaking){
getPlaceQueue().addLast(new BuildRequest(entity.tile.x, entity.tile.y));
}else{
@@ -108,7 +107,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
if(target == null) return;
- if(target.distanceTo(Drone.this) > type.range){
+ if(target.dst(Drone.this) > type.range){
circle(type.range*0.9f);
}else{
getWeapon().update(Drone.this, target.getX(), target.getY());
@@ -158,7 +157,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
if(target instanceof Tile){
moveTo(type.range / 1.5f);
- if(distanceTo(target) < type.range && mineTile != target){
+ if(dst(target) < type.range && mineTile != target){
setMineTile((Tile) target);
}
@@ -196,7 +195,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
TileEntity tile = (TileEntity) target;
- if(distanceTo(target) < type.range){
+ if(dst(target) < type.range){
if(tile.tile.block().acceptStack(inventory.getItem().item, inventory.getItem().amount, tile.tile, Drone.this) == inventory.getItem().amount){
Call.transferItemTo(inventory.getItem().item, inventory.getItem().amount, x, y, tile.tile);
inventory.clearItem();
@@ -254,7 +253,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
}
private void notifyPlaced(BuildEntity entity, boolean isBreaking){
- float dist = Math.min(entity.distanceTo(x, y) - placeDistance, 0);
+ float dist = Math.min(entity.dst(x, y) - placeDistance, 0);
if(!state.is(build) && dist / type.maxVelocity < entity.buildCost * 0.9f){
target = entity;
@@ -311,7 +310,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
@Override
protected void updateRotation(){
- if(target != null && ((state.is(repair) && target.distanceTo(this) < type.range) || state.is(mine))){
+ if(target != null && ((state.is(repair) && target.dst(this) < type.range) || state.is(mine))){
rotation = Mathf.slerpDelta(rotation, angleTo(target), 0.3f);
}else{
rotation = Mathf.slerpDelta(rotation, velocity.angle(), 0.3f);
@@ -333,7 +332,6 @@ public class Drone extends FlyingUnit implements BuilderTrait{
@Override
public void drawOver(){
- trail.draw(Palette.lightTrail, 3f);
drawBuilding(this);
}
@@ -364,8 +362,8 @@ public class Drone extends FlyingUnit implements BuilderTrait{
}
@Override
- public void read(DataInput data, long time) throws IOException{
- super.read(data, time);
+ public void read(DataInput data) throws IOException{
+ super.read(data);
int mined = data.readInt();
int repairing = data.readInt();
diff --git a/core/src/io/anuke/mindustry/game/Difficulty.java b/core/src/io/anuke/mindustry/game/Difficulty.java
index bfbbdd1e90..c533e1b1a6 100644
--- a/core/src/io/anuke/mindustry/game/Difficulty.java
+++ b/core/src/io/anuke/mindustry/game/Difficulty.java
@@ -1,6 +1,6 @@
package io.anuke.mindustry.game;
-import io.anuke.ucore.util.Bundles;
+import io.anuke.arc.Core;
public enum Difficulty{
training(3f, 3f),
@@ -24,7 +24,7 @@ public enum Difficulty{
@Override
public String toString(){
if(value == null){
- value = Bundles.get("setting.difficulty." + name());
+ value = Core.bundle.get("setting.difficulty." + name());
}
return value;
}
diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java
index 0724be398a..32e680e4ae 100644
--- a/core/src/io/anuke/mindustry/game/EventType.java
+++ b/core/src/io/anuke/mindustry/game/EventType.java
@@ -1,9 +1,9 @@
package io.anuke.mindustry.game;
+import io.anuke.arc.Events.Event;
import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.traits.BuilderTrait;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.core.Events.Event;
public class EventType{
@@ -11,6 +11,7 @@ public class EventType{
}
+ /**Called when the game is first loaded.*/
public static class GameLoadEvent implements Event{
}
@@ -35,22 +36,11 @@ public class EventType{
}
}
- /**
- * This event is called from the logic thread.
- * DO NOT INITIALIZE GRAPHICS HERE.
- */
+ /**Called when a game begins and the world is loaded.*/
public static class WorldLoadEvent implements Event{
}
- /**
- * Called after the WorldLoadEvent is, and all logic has been loaded.
- * It is safe to intialize graphics here.
- */
- public static class WorldLoadGraphicsEvent implements Event{
-
- }
-
/**Called from the logic thread. Do not access graphics here!*/
public static class TileChangeEvent implements Event{
public final Tile tile;
diff --git a/core/src/io/anuke/mindustry/game/GameMode.java b/core/src/io/anuke/mindustry/game/GameMode.java
index cd4057012a..43a6b5c851 100644
--- a/core/src/io/anuke/mindustry/game/GameMode.java
+++ b/core/src/io/anuke/mindustry/game/GameMode.java
@@ -1,6 +1,6 @@
package io.anuke.mindustry.game;
-import io.anuke.ucore.util.Bundles;
+import io.anuke.arc.Core;
public enum GameMode{
waves,
@@ -33,12 +33,12 @@ public enum GameMode{
public float respawnTime = 60 * 4;
public String description(){
- return Bundles.get("mode." + name() + ".description");
+ return Core.bundle.get("mode." + name() + ".description");
}
@Override
public String toString(){
- return Bundles.get("mode." + name() + ".name");
+ return Core.bundle.get("mode." + name() + ".name");
}
}
diff --git a/core/src/io/anuke/mindustry/game/Saves.java b/core/src/io/anuke/mindustry/game/Saves.java
index 0a2f2fcf28..d1c42703f4 100644
--- a/core/src/io/anuke/mindustry/game/Saves.java
+++ b/core/src/io/anuke/mindustry/game/Saves.java
@@ -1,28 +1,28 @@
package io.anuke.mindustry.game;
-import com.badlogic.gdx.files.FileHandle;
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.IntArray;
-import com.badlogic.gdx.utils.IntMap;
-import com.badlogic.gdx.utils.TimeUtils;
+import io.anuke.arc.Core;
+import io.anuke.arc.Events;
+import io.anuke.arc.collection.Array;
+import io.anuke.arc.collection.IntArray;
+import io.anuke.arc.collection.IntMap;
+import io.anuke.arc.files.FileHandle;
+import io.anuke.arc.util.Strings;
+import io.anuke.arc.util.Time;
import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.game.EventType.StateChangeEvent;
import io.anuke.mindustry.io.SaveIO;
import io.anuke.mindustry.io.SaveMeta;
import io.anuke.mindustry.maps.Map;
-import io.anuke.ucore.core.Events;
-import io.anuke.ucore.core.Settings;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.util.Strings;
-import io.anuke.ucore.util.ThreadArray;
import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
import static io.anuke.mindustry.Vars.*;
public class Saves{
private int nextSlot;
- private Array saves = new ThreadArray<>();
+ private Array saves = new Array<>();
private IntMap saveMap = new IntMap<>();
private SaveSlot current;
private boolean saving;
@@ -34,18 +34,16 @@ public class Saves{
public Saves(){
Events.on(StateChangeEvent.class, event -> {
if(event.to == State.menu){
- threads.run(() -> {
- totalPlaytime = 0;
- lastTimestamp = 0;
- current = null;
- });
+ totalPlaytime = 0;
+ lastTimestamp = 0;
+ current = null;
}
});
}
public void load(){
saves.clear();
- IntArray slots = Settings.getObject("save-slots", IntArray.class, IntArray::new);
+ IntArray slots = Core.settings.getObject("save-slots", IntArray.class, IntArray::new);
for(int i = 0; i < slots.size; i ++){
int index = slots.get(i);
@@ -67,19 +65,19 @@ public class Saves{
SaveSlot current = this.current;
if(current != null && !state.is(State.menu)
- && !(state.isPaused() && ui.hasDialog())){
+ && !(state.isPaused() && Core.scene.hasDialog())){
if(lastTimestamp != 0){
- totalPlaytime += TimeUtils.timeSinceMillis(lastTimestamp);
+ totalPlaytime += Time.timeSinceMillis(lastTimestamp);
}
- lastTimestamp = TimeUtils.millis();
+ lastTimestamp = Time.millis();
}
if(!state.is(State.menu) && !state.gameOver && current != null && current.isAutosave()){
- time += Timers.delta();
- if(time > Settings.getInt("saveinterval") * 60){
+ time += Time.delta();
+ if(time > Core.settings.getInt("saveinterval") * 60){
saving = true;
- Timers.runTask(2f, () -> {
+ Time.runTask(2f, () -> {
try{
current.save();
}catch(Exception e){
@@ -144,8 +142,8 @@ public class Saves{
IntArray result = new IntArray(saves.size);
for(int i = 0; i < saves.size; i++) result.add(saves.get(i).index);
- Settings.putObject("save-slots", result);
- Settings.save();
+ Core.settings.putObject("save-slots", result);
+ Core.settings.save();
}
public class SaveSlot{
@@ -165,7 +163,6 @@ public class Saves{
public void save(){
long time = totalPlaytime;
- renderer.fog.writeFog();
long prev = totalPlaytime;
totalPlaytime = time;
@@ -186,8 +183,12 @@ public class Saves{
return Strings.formatMillis(current == this ? totalPlaytime : meta.timePlayed);
}
+ public long getTimestamp(){
+ return meta.timestamp;
+ }
+
public String getDate(){
- return meta.date;
+ return SimpleDateFormat.getDateTimeInstance().format(new Date(meta.timestamp));
}
public Map getMap(){
@@ -195,12 +196,12 @@ public class Saves{
}
public String getName(){
- return Settings.getString("save-" + index + "-name", "untittled");
+ return Core.settings.getString("save-" + index + "-name", "untittled");
}
public void setName(String name){
- Settings.putString("save-" + index + "-name", name);
- Settings.save();
+ Core.settings.put("save-" + index + "-name", name);
+ Core.settings.save();
}
public int getBuild(){
@@ -220,12 +221,12 @@ public class Saves{
}
public boolean isAutosave(){
- return Settings.getBool("save-" + index + "-autosave", true);
+ return Core.settings.getBool("save-" + index + "-autosave", true);
}
public void setAutosave(boolean save){
- Settings.putBool("save-" + index + "-autosave", save);
- Settings.save();
+ Core.settings.put("save-" + index + "-autosave", save);
+ Core.settings.save();
}
public void importFile(FileHandle file) throws IOException{
diff --git a/core/src/io/anuke/mindustry/game/Team.java b/core/src/io/anuke/mindustry/game/Team.java
index 2bace764e2..429e6e970a 100644
--- a/core/src/io/anuke/mindustry/game/Team.java
+++ b/core/src/io/anuke/mindustry/game/Team.java
@@ -1,7 +1,7 @@
package io.anuke.mindustry.game;
-import com.badlogic.gdx.graphics.Color;
-import io.anuke.ucore.util.Bundles;
+import io.anuke.arc.Core;
+import io.anuke.arc.graphics.Color;
public enum Team{
none(Color.valueOf("4d4e58")),
@@ -21,6 +21,6 @@ public enum Team{
}
public String localized(){
- return Bundles.get("team." + name() + ".name");
+ return Core.bundle.get("team." + name() + ".name");
}
}
diff --git a/core/src/io/anuke/mindustry/game/Teams.java b/core/src/io/anuke/mindustry/game/Teams.java
index 7b004b37d2..65ff687e76 100644
--- a/core/src/io/anuke/mindustry/game/Teams.java
+++ b/core/src/io/anuke/mindustry/game/Teams.java
@@ -1,14 +1,11 @@
package io.anuke.mindustry.game;
-import com.badlogic.gdx.utils.ObjectSet;
+import io.anuke.arc.collection.EnumSet;
+import io.anuke.arc.collection.ObjectSet;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.util.EnumSet;
-import io.anuke.ucore.util.ThreadSet;
-/**
- * Class for various team-based utilities.
- */
+/**Class for various team-based utilities.*/
public class Teams{
private TeamData[] map = new TeamData[Team.all.length];
@@ -52,7 +49,7 @@ public class Teams{
}
public class TeamData{
- public final ObjectSet cores = new ThreadSet<>();
+ public final ObjectSet cores = new ObjectSet<>();
public final EnumSet enemies;
public final Team team;
diff --git a/core/src/io/anuke/mindustry/game/UnlockableContent.java b/core/src/io/anuke/mindustry/game/UnlockableContent.java
index fc90949927..cd8e068af4 100644
--- a/core/src/io/anuke/mindustry/game/UnlockableContent.java
+++ b/core/src/io/anuke/mindustry/game/UnlockableContent.java
@@ -1,7 +1,7 @@
package io.anuke.mindustry.game;
-import com.badlogic.gdx.graphics.g2d.TextureRegion;
-import io.anuke.ucore.scene.ui.layout.Table;
+import io.anuke.arc.graphics.g2d.TextureRegion;
+import io.anuke.arc.scene.ui.layout.Table;
import static io.anuke.mindustry.Vars.control;
diff --git a/core/src/io/anuke/mindustry/game/Unlocks.java b/core/src/io/anuke/mindustry/game/Unlocks.java
index 7b624263b9..61aeca7339 100644
--- a/core/src/io/anuke/mindustry/game/Unlocks.java
+++ b/core/src/io/anuke/mindustry/game/Unlocks.java
@@ -1,19 +1,20 @@
package io.anuke.mindustry.game;
-import com.badlogic.gdx.utils.ObjectMap;
-import com.badlogic.gdx.utils.ObjectSet;
+import io.anuke.arc.Core;
+import io.anuke.arc.collection.ObjectMap;
+import io.anuke.arc.collection.ObjectSet;
import io.anuke.mindustry.game.EventType.UnlockEvent;
import io.anuke.mindustry.type.ContentType;
-import io.anuke.ucore.core.Events;
-import io.anuke.ucore.core.Settings;
+import io.anuke.arc.Events;
+import io.anuke.arc.Settings;
/**Stores player unlocks. Clientside only.*/
public class Unlocks{
private ObjectMap> unlocked = new ObjectMap<>();
private boolean dirty;
- static{
- Settings.setSerializer(ContentType.class, (stream, t) -> stream.writeInt(t.ordinal()), stream -> ContentType.values()[stream.readInt()]);
+ public Unlocks(){
+ Core.settings.setSerializer(ContentType.class, (stream, t) -> stream.writeInt(t.ordinal()), stream -> ContentType.values()[stream.readInt()]);
}
/** Returns whether or not this piece of content is unlocked yet.*/
@@ -65,13 +66,14 @@ public class Unlocks{
save();
}
+ @SuppressWarnings("unchecked")
public void load(){
- unlocked = Settings.getObject("unlockset", ObjectMap.class, ObjectMap::new);
+ unlocked = Core.settings.getObject("unlockset", ObjectMap.class, ObjectMap::new);
}
public void save(){
- Settings.putObject("unlockset", unlocked);
- Settings.save();
+ Core.settings.putObject("unlockset", unlocked);
+ Core.settings.save();
}
}
diff --git a/core/src/io/anuke/mindustry/game/Version.java b/core/src/io/anuke/mindustry/game/Version.java
index 44d4aac4b1..276dd04354 100644
--- a/core/src/io/anuke/mindustry/game/Version.java
+++ b/core/src/io/anuke/mindustry/game/Version.java
@@ -1,10 +1,10 @@
package io.anuke.mindustry.game;
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.files.FileHandle;
-import com.badlogic.gdx.utils.ObjectMap;
-import com.badlogic.gdx.utils.PropertiesUtils;
-import io.anuke.ucore.util.Strings;
+import io.anuke.arc.Core;
+import io.anuke.arc.collection.ObjectMap;
+import io.anuke.arc.files.FileHandle;
+import io.anuke.arc.util.Strings;
+import io.anuke.arc.util.io.PropertiesUtils;
import java.io.IOException;
@@ -22,7 +22,7 @@ public class Version{
public static void init(){
try{
- FileHandle file = Gdx.files.internal("version.properties");
+ FileHandle file = Core.files.internal("version.properties");
ObjectMap map = new ObjectMap<>();
PropertiesUtils.load(map, file.reader());
diff --git a/core/src/io/anuke/mindustry/game/Waves.java b/core/src/io/anuke/mindustry/game/Waves.java
index 12fe04c959..d05a2f9aa3 100644
--- a/core/src/io/anuke/mindustry/game/Waves.java
+++ b/core/src/io/anuke/mindustry/game/Waves.java
@@ -1,6 +1,6 @@
package io.anuke.mindustry.game;
-import com.badlogic.gdx.utils.Array;
+import io.anuke.arc.collection.Array;
import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.content.StatusEffects;
import io.anuke.mindustry.content.UnitTypes;
diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java
index 5b679ccdf4..680c007cfa 100644
--- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java
+++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java
@@ -1,103 +1,100 @@
package io.anuke.mindustry.graphics;
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.IntSet;
-import com.badlogic.gdx.utils.Sort;
+import io.anuke.arc.Core;
+import io.anuke.arc.Events;
+import io.anuke.arc.collection.Array;
+import io.anuke.arc.collection.Sort;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.graphics.glutils.FrameBuffer;
+import io.anuke.arc.util.Tmp;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.game.EventType.TileChangeEvent;
-import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent;
+import io.anuke.mindustry.game.EventType.WorldLoadEvent;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.core.Core;
-import io.anuke.ucore.core.Events;
-import io.anuke.ucore.core.Graphics;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Surface;
-import io.anuke.ucore.util.Mathf;
+import static io.anuke.arc.Core.camera;
import static io.anuke.mindustry.Vars.*;
-import static io.anuke.ucore.core.Core.camera;
public class BlockRenderer{
private final static int initialRequests = 32 * 32;
private final static int expandr = 6;
- private FloorRenderer floorRenderer;
+ public final FloorRenderer floor = new FloorRenderer();
private Array requests = new Array<>(true, initialRequests, BlockRequest.class);
- private IntSet teamChecks = new IntSet();
private int lastCamX, lastCamY, lastRangeX, lastRangeY;
- private Layer lastLayer;
private int requestidx = 0;
private int iterateidx = 0;
- private Surface shadows = Graphics.createSurface().setSize(2, 2);
+ private FrameBuffer shadows = new FrameBuffer(1, 1);
public BlockRenderer(){
- floorRenderer = new FloorRenderer();
for(int i = 0; i < requests.size; i++){
requests.set(i, new BlockRequest());
}
- Events.on(WorldLoadGraphicsEvent.class, event -> {
+ Events.on(WorldLoadEvent.class, event -> {
lastCamY = lastCamX = -99; //invalidate camera position so blocks get updated
});
Events.on(TileChangeEvent.class, event -> {
- threads.runGraphics(() -> {
- int avgx = Mathf.scl(camera.position.x, tilesize);
- int avgy = Mathf.scl(camera.position.y, tilesize);
- int rangex = (int) (camera.viewportWidth * camera.zoom / tilesize / 2) + 2;
- int rangey = (int) (camera.viewportHeight * camera.zoom / tilesize / 2) + 2;
+ int avgx = (int)(camera.position.x / tilesize);
+ int avgy = (int)(camera.position. y/ tilesize);
+ int rangex = (int) (camera.width / tilesize / 2) + 2;
+ int rangey = (int) (camera.height / tilesize / 2) + 2;
- if(Math.abs(avgx - event.tile.x) <= rangex && Math.abs(avgy - event.tile.y) <= rangey){
- lastCamY = lastCamX = -99; //invalidate camera position so blocks get updated
- }
- });
+ if(Math.abs(avgx - event.tile.x) <= rangex && Math.abs(avgy - event.tile.y) <= rangey){
+ lastCamY = lastCamX = -99; //invalidate camera position so blocks get updated
+ }
});
}
public void drawShadows(){
- Draw.color(0, 0, 0, 0.15f);
- Draw.rect(shadows.texture(),
- Core.camera.position.x - Core.camera.position.x % tilesize,
- Core.camera.position.y - Core.camera.position.y % tilesize,
- shadows.width(), -shadows.height());
- Draw.color();
- }
+ if(shadows.getWidth() != Core.graphics.getWidth() || shadows.getHeight() != Core.graphics.getHeight()){
+ shadows.resize(Core.graphics.getWidth(), Core.graphics.getHeight());
+ }
- public boolean isTeamShown(Team team){
- return teamChecks.contains(team.ordinal());
+ Tmp.tr1.set(shadows.getTexture());
+ Shaders.outline.color.set(0, 0, 0, 0.15f);
+ Shaders.outline.scl = renderer.cameraScale()/3f;
+ Shaders.outline.region = Tmp.tr1;
+
+ Draw.flush();
+ shadows.begin();
+ Core.graphics.clear(Color.CLEAR);
+ Draw.color(Color.BLACK);
+ drawBlocks(Layer.shadow);
+ Draw.color();
+ Draw.flush();
+ shadows.end();
+
+ Draw.shader(Shaders.outline);
+ Draw.rect(Draw.wrap(shadows.getTexture()),
+ camera.position.x,
+ camera.position.y,
+ camera.width, -camera.height);
+ Draw.shader();
}
/**Process all blocks to draw, simultaneously updating the block shadow framebuffer.*/
public void processBlocks(){
iterateidx = 0;
- lastLayer = null;
- int avgx = Mathf.scl(camera.position.x, tilesize);
- int avgy = Mathf.scl(camera.position.y, tilesize);
+ int avgx = (int)(camera.position.x / tilesize);
+ int avgy = (int)(camera.position.y / tilesize);
- int rangex = (int) (camera.viewportWidth * camera.zoom / tilesize / 2) + 2;
- int rangey = (int) (camera.viewportHeight * camera.zoom / tilesize / 2) + 2;
+ int rangex = (int) (camera.width / tilesize / 2) + 2;
+ int rangey = (int) (camera.height / tilesize / 2) + 2;
if(avgx == lastCamX && avgy == lastCamY && lastRangeX == rangex && lastRangeY == rangey){
return;
}
- int shadowW = rangex * tilesize*2, shadowH = rangey * tilesize*2;
-
- teamChecks.clear();
requestidx = 0;
- Graphics.end();
- if(shadows.width() != shadowW || shadows.height() != shadowH){
- shadows.setSize(shadowW, shadowH);
- }
- Core.batch.getProjectionMatrix().setToOrtho2D(Mathf.round(Core.camera.position.x, tilesize)-shadowW/2f, Mathf.round(Core.camera.position.y, tilesize)-shadowH/2f, shadowW, shadowH);
- Graphics.surface(shadows);
-
int minx = Math.max(avgx - rangex - expandr, 0);
int miny = Math.max(avgy - rangey - expandr, 0);
int maxx = Math.min(world.width() - 1, avgx + rangex + expandr);
@@ -118,8 +115,8 @@ public class BlockRenderer{
if(block != Blocks.air){
if(!expanded){
+ addRequest(tile, Layer.shadow);
addRequest(tile, Layer.block);
- teamChecks.add(team.ordinal());
}
if(block.expanded || !expanded){
@@ -136,10 +133,7 @@ public class BlockRenderer{
}
}
- Graphics.surface();
- Graphics.end();
- Core.batch.setProjectionMatrix(camera.combined);
- Graphics.begin();
+ Draw.proj(camera.projection());
Sort.instance().sort(requests.items, 0, requestidx);
@@ -149,10 +143,6 @@ public class BlockRenderer{
lastRangeY = rangey;
}
- public int getRequests(){
- return requestidx;
- }
-
public void drawBlocks(Layer stopAt){
for(; iterateidx < requestidx; iterateidx++){
@@ -162,23 +152,17 @@ public class BlockRenderer{
}
BlockRequest req = requests.get(iterateidx);
-
- if(req.layer != lastLayer){
- if(lastLayer != null) layerEnds(lastLayer);
- layerBegins(req.layer);
- }
-
Block block = req.tile.block();
- if(req.layer == Layer.block){
+ if(req.layer == Layer.shadow){
+ block.drawShadow(req.tile);
+ }else if(req.layer == Layer.block){
block.draw(req.tile);
}else if(req.layer == block.layer){
block.drawLayer(req.tile);
}else if(req.layer == block.layer2){
block.drawLayer2(req.tile);
}
-
- lastLayer = req.layer;
}
}
@@ -216,24 +200,6 @@ public class BlockRenderer{
}
}
- public void beginFloor(){
- floorRenderer.beginDraw();
- }
-
- public void endFloor(){
- floorRenderer.endDraw();
- }
-
- public void drawFloor(){
- floorRenderer.drawFloor();
- }
-
- private void layerBegins(Layer layer){
- }
-
- private void layerEnds(Layer layer){
- }
-
private void addRequest(Tile tile, Layer layer){
if(requestidx >= requests.size){
requests.add(new BlockRequest());
diff --git a/core/src/io/anuke/mindustry/graphics/CacheLayer.java b/core/src/io/anuke/mindustry/graphics/CacheLayer.java
index 4a13487541..bd1d1a88c9 100644
--- a/core/src/io/anuke/mindustry/graphics/CacheLayer.java
+++ b/core/src/io/anuke/mindustry/graphics/CacheLayer.java
@@ -1,57 +1,13 @@
package io.anuke.mindustry.graphics;
-import com.badlogic.gdx.graphics.Color;
-import io.anuke.ucore.core.Core;
-import io.anuke.ucore.core.Graphics;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Shader;
-
-import static io.anuke.mindustry.Vars.renderer;
-
public enum CacheLayer{
water{
- @Override
- public void begin(){
- beginShader();
- }
-
- @Override
- public void end(){
- endShader(Shaders.water);
- }
},
lava{
- @Override
- public void begin(){
- beginShader();
- }
-
- @Override
- public void end(){
- endShader(Shaders.lava);
- }
},
oil{
- @Override
- public void begin(){
- beginShader();
- }
-
- @Override
- public void end(){
- endShader(Shaders.oil);
- }
},
space{
- @Override
- public void begin(){
- beginShader();
- }
-
- @Override
- public void end(){
- endShader(Shaders.space);
- }
},
normal;
@@ -64,25 +20,9 @@ public enum CacheLayer{
}
protected void beginShader(){
- //renderer.getBlocks().endFloor();
- renderer.effectSurface.getBuffer().begin();
- Graphics.clear(Color.CLEAR);
- //renderer.getBlocks().beginFloor();
+
}
- public void endShader(Shader shader){
- renderer.blocks.endFloor();
-
- //renderer.effectSurface.getBuffer().end();
-
- renderer.pixelSurface.getBuffer().begin();
-
- Graphics.shader(shader);
- Graphics.begin();
- Draw.rect(renderer.effectSurface.texture(), Core.camera.position.x, Core.camera.position.y,
- Core.camera.viewportWidth * Core.camera.zoom, -Core.camera.viewportHeight * Core.camera.zoom);
- Graphics.end();
- Graphics.shader();
- renderer.blocks.beginFloor();
+ public void endShader(){
}
}
diff --git a/core/src/io/anuke/mindustry/graphics/FloorRenderer.java b/core/src/io/anuke/mindustry/graphics/FloorRenderer.java
index 36510734d7..461756141f 100644
--- a/core/src/io/anuke/mindustry/graphics/FloorRenderer.java
+++ b/core/src/io/anuke/mindustry/graphics/FloorRenderer.java
@@ -1,32 +1,27 @@
package io.anuke.mindustry.graphics;
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.GL20;
-import com.badlogic.gdx.graphics.OrthographicCamera;
-import com.badlogic.gdx.utils.IntArray;
-import com.badlogic.gdx.utils.IntSet;
-import com.badlogic.gdx.utils.IntSet.IntSetIterator;
-import com.badlogic.gdx.utils.ObjectSet;
-import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent;
-import io.anuke.mindustry.maps.Sector;
+import io.anuke.arc.Core;
+import io.anuke.arc.Events;
+import io.anuke.arc.collection.IntArray;
+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.GL20;
+import io.anuke.arc.graphics.g2d.CacheBatch;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.graphics.g2d.SpriteBatch;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.util.Log;
+import io.anuke.arc.util.Structs;
+import io.anuke.arc.util.Time;
+import io.anuke.mindustry.game.EventType.WorldLoadEvent;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor;
-import io.anuke.ucore.core.Core;
-import io.anuke.ucore.core.Events;
-import io.anuke.ucore.core.Graphics;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.graphics.CacheBatch;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Fill;
-import io.anuke.ucore.util.Log;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.Structs;
import java.util.Arrays;
-import static io.anuke.mindustry.Vars.tilesize;
-import static io.anuke.mindustry.Vars.world;
+import static io.anuke.mindustry.Vars.*;
public class FloorRenderer{
private final static int chunksize = 64;
@@ -37,7 +32,7 @@ public class FloorRenderer{
private IntArray drawnLayers = new IntArray();
public FloorRenderer(){
- Events.on(WorldLoadGraphicsEvent.class, event -> clearTiles());
+ Events.on(WorldLoadEvent.class, event -> clearTiles());
}
public void drawFloor(){
@@ -45,13 +40,13 @@ public class FloorRenderer{
return;
}
- OrthographicCamera camera = Core.camera;
+ Camera camera = Core.camera;
- int crangex = (int) (camera.viewportWidth * camera.zoom / (chunksize * tilesize)) + 1;
- int crangey = (int) (camera.viewportHeight * camera.zoom / (chunksize * tilesize)) + 1;
+ int crangex = (int) (camera.width / (chunksize * tilesize)) + 1;
+ int crangey = (int) (camera.height / (chunksize * tilesize)) + 1;
- int camx = Mathf.scl(camera.position.x, chunksize * tilesize);
- int camy = Mathf.scl(camera.position.y, chunksize * tilesize);
+ int camx = (int)(camera.position.x / (chunksize * tilesize));
+ int camy = (int)(camera.position.y / (chunksize * tilesize));
int layers = CacheLayer.values().length;
@@ -85,7 +80,7 @@ public class FloorRenderer{
drawnLayers.sort();
- Graphics.end();
+ Draw.flush();
beginDraw();
for(int i = 0; i < drawnLayers.size; i++){
@@ -95,7 +90,6 @@ public class FloorRenderer{
}
endDraw();
- Graphics.begin();
}
public void beginDraw(){
@@ -103,10 +97,10 @@ public class FloorRenderer{
return;
}
- cbatch.setProjectionMatrix(Core.camera.combined);
+ cbatch.setProjection(Core.camera.projection());
cbatch.beginDraw();
- Gdx.gl.glEnable(GL20.GL_BLEND);
+ Core.gl.glEnable(GL20.GL_BLEND);
}
public void endDraw(){
@@ -122,17 +116,17 @@ public class FloorRenderer{
return;
}
- OrthographicCamera camera = Core.camera;
+ Camera camera = Core.camera;
- int crangex = (int) (camera.viewportWidth * camera.zoom / (chunksize * tilesize)) + 1;
- int crangey = (int) (camera.viewportHeight * camera.zoom / (chunksize * tilesize)) + 1;
+ int crangex = (int) (camera.width / (chunksize * tilesize)) + 1;
+ int crangey = (int) (camera.height / (chunksize * tilesize)) + 1;
layer.begin();
for(int x = -crangex; x <= crangex; x++){
for(int y = -crangey; y <= crangey; y++){
- int worldx = Mathf.scl(camera.position.x, chunksize * tilesize) + x;
- int worldy = Mathf.scl(camera.position.y, chunksize * tilesize) + y;
+ int worldx = (int)(camera.position.x / (chunksize * tilesize)) + x;
+ int worldy = (int)(camera.position.y / (chunksize * tilesize)) + y;
if(!Structs.inBounds(worldx, worldy, cache)){
continue;
@@ -147,19 +141,11 @@ public class FloorRenderer{
layer.end();
}
- private void fillChunk(float x, float y){
- Draw.color(Color.BLACK);
- Fill.crect(x, y, chunksize * tilesize, chunksize * tilesize);
- Draw.color();
- }
-
private void cacheChunk(int cx, int cy){
Chunk chunk = cache[cx][cy];
ObjectSet used = new ObjectSet<>();
- Sector sector = world.getSector();
-
for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){
for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize; tiley++){
Tile tile = world.tile(tilex, tiley);
@@ -176,11 +162,10 @@ public class FloorRenderer{
}
private void cacheChunkLayer(int cx, int cy, Chunk chunk, CacheLayer layer){
+ SpriteBatch current = Core.batch;
+ Core.batch = cbatch;
- Graphics.useBatch(cbatch);
- cbatch.begin();
-
- Sector sector = world.getSector();
+ cbatch.beginCache();
for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){
for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize; tiley++){
@@ -200,21 +185,19 @@ public class FloorRenderer{
}
}
}
-
- cbatch.end();
- Graphics.popBatch();
- chunk.caches[layer.ordinal()] = cbatch.getLastCache();
+ Core.batch = current;
+ chunk.caches[layer.ordinal()] = cbatch.endCache();
}
public void clearTiles(){
if(cbatch != null) cbatch.dispose();
int chunksx = Mathf.ceil((float) (world.width()) / chunksize),
- chunksy = Mathf.ceil((float) (world.height()) / chunksize) ;
+ chunksy = Mathf.ceil((float) (world.height()) / chunksize) ;
cache = new Chunk[chunksx][chunksy];
cbatch = new CacheBatch(world.width() * world.height() * 4 * 4);
- Timers.mark();
+ Time.mark();
for(int x = 0; x < chunksx; x++){
for(int y = 0; y < chunksy; y++){
@@ -225,7 +208,7 @@ public class FloorRenderer{
}
}
- Log.info("Time to cache: {0}", Timers.elapsed());
+ Log.info("Time to cache: {0}", Time.elapsed());
}
private class Chunk{
diff --git a/core/src/io/anuke/mindustry/graphics/FogRenderer.java b/core/src/io/anuke/mindustry/graphics/FogRenderer.java
deleted file mode 100644
index 7c920c78b0..0000000000
--- a/core/src/io/anuke/mindustry/graphics/FogRenderer.java
+++ /dev/null
@@ -1,177 +0,0 @@
-package io.anuke.mindustry.graphics;
-
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.GL20;
-import com.badlogic.gdx.graphics.Pixmap.Format;
-import com.badlogic.gdx.graphics.Texture;
-import com.badlogic.gdx.graphics.g2d.TextureRegion;
-import com.badlogic.gdx.graphics.glutils.FrameBuffer;
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.Disposable;
-import io.anuke.mindustry.entities.Unit;
-import io.anuke.mindustry.game.EventType.TileChangeEvent;
-import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent;
-import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.core.Core;
-import io.anuke.ucore.core.Events;
-import io.anuke.ucore.core.Graphics;
-import io.anuke.ucore.entities.EntityDraw;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Fill;
-
-import java.nio.ByteBuffer;
-
-import static io.anuke.mindustry.Vars.*;
-
-/**Used for rendering fog of war. A framebuffer is used for this.*/
-public class FogRenderer implements Disposable{
- private TextureRegion region = new TextureRegion();
- private FrameBuffer buffer;
- private ByteBuffer pixelBuffer;
- private Array changeQueue = new Array<>();
- private int shadowPadding;
- private boolean dirty;
-
- public FogRenderer(){
- Events.on(WorldLoadGraphicsEvent.class, event -> {
- dispose();
-
- shadowPadding = -1;
-
- buffer = new FrameBuffer(Format.RGBA8888, world.width(), world.height(), false);
- changeQueue.clear();
-
- //clear buffer to black
- buffer.begin();
- Graphics.clear(0, 0, 0, 1f);
- buffer.end();
-
- for(int x = 0; x < world.width(); x++){
- for(int y = 0; y < world.height(); y++){
- Tile tile = world.tile(x, y);
- if(tile.getTeam() == players[0].getTeam() && tile.block().synthetic() && tile.block().viewRange > 0){
- changeQueue.add(tile);
- }
- }
- }
-
- pixelBuffer = ByteBuffer.allocateDirect(world.width() * world.height() * 4);
- dirty = true;
- });
-
- Events.on(TileChangeEvent.class, event -> threads.runGraphics(() -> {
- if(event.tile.getTeam() == players[0].getTeam() && event.tile.block().synthetic() && event.tile.block().viewRange > 0){
- changeQueue.add(event.tile);
- }
- }));
- }
-
- public void writeFog(){
- if(buffer == null) return;
-
- buffer.begin();
- pixelBuffer.position(0);
- Gdx.gl.glPixelStorei(GL20.GL_PACK_ALIGNMENT, 1);
- Gdx.gl.glReadPixels(0, 0, world.width(), world.height(), GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixelBuffer);
-
- pixelBuffer.position(0);
- for(int i = 0; i < world.width() * world.height(); i++){
- int x = i % world.width();
- int y = i / world.width();
- byte r = pixelBuffer.get();
- if(r != 0){
- world.tile(x, y).setVisibility((byte)1);
- }
- pixelBuffer.position(pixelBuffer.position() + 3);
- }
- buffer.end();
- }
-
- public int getPadding(){
- return -shadowPadding;
- }
-
- public void draw(){
- if(buffer == null) return;
-
- float vw = Core.camera.viewportWidth * Core.camera.zoom;
- float vh = Core.camera.viewportHeight * Core.camera.zoom;
-
- float px = Core.camera.position.x - vw / 2f;
- float py = Core.camera.position.y - vh / 2f;
-
- float u = (px / tilesize) / buffer.getWidth();
- float v = (py / tilesize) / buffer.getHeight();
-
- float u2 = ((px + vw) / tilesize) / buffer.getWidth();
- float v2 = ((py + vh) / tilesize) / buffer.getHeight();
-
- Core.batch.getProjectionMatrix().setToOrtho2D(0, 0, buffer.getWidth() * tilesize, buffer.getHeight() * tilesize);
-
- Draw.color(Color.WHITE);
-
- buffer.begin();
-
- Graphics.beginClip((-shadowPadding), (-shadowPadding), (world.width() + shadowPadding*2), (world.height() + shadowPadding*2));
-
- Graphics.begin();
- EntityDraw.setClip(false);
-
- renderer.drawAndInterpolate(playerGroup, player -> !player.isDead() && player.getTeam() == players[0].getTeam(), Unit::drawView);
- renderer.drawAndInterpolate(unitGroups[players[0].getTeam().ordinal()], unit -> !unit.isDead(), Unit::drawView);
-
- for(Tile tile : changeQueue){
- float viewRange = tile.block().viewRange;
- if(viewRange < 0) continue;
- Fill.circle(tile.drawx(), tile.drawy(), tile.block().viewRange);
- }
-
- changeQueue.clear();
-
- if(dirty){
- for(int x = 0; x < world.width(); x++){
- for(int y = 0; y < world.height(); y++){
- Tile tile = world.tile(x, y);
- if(tile.discovered()){
- Fill.rect(tile.worldx(), tile.worldy(), tilesize, tilesize);
- }
- }
- }
- dirty = false;
- }
-
- EntityDraw.setClip(true);
- Graphics.end();
- buffer.end();
-
- Graphics.endClip();
-
- region.setTexture(buffer.getColorBufferTexture());
- region.setRegion(u, v2, u2, v);
-
- Core.batch.setProjectionMatrix(Core.camera.combined);
- Graphics.shader(Shaders.fog);
- renderer.pixelSurface.getBuffer().begin();
- Graphics.begin();
-
- Core.batch.draw(region, px, py, vw, vh);
-
- Graphics.end();
- renderer.pixelSurface.getBuffer().end();
- Graphics.shader();
-
- Graphics.setScreen();
- Core.batch.draw(renderer.pixelSurface.texture(), 0, Gdx.graphics.getHeight(), Gdx.graphics.getWidth(), -Gdx.graphics.getHeight());
- Graphics.end();
- }
-
- public Texture getTexture(){
- return buffer.getColorBufferTexture();
- }
-
- @Override
- public void dispose(){
- if(buffer != null) buffer.dispose();
- }
-}
diff --git a/core/src/io/anuke/mindustry/graphics/IndexedRenderer.java b/core/src/io/anuke/mindustry/graphics/IndexedRenderer.java
new file mode 100644
index 0000000000..a05bec2c6d
--- /dev/null
+++ b/core/src/io/anuke/mindustry/graphics/IndexedRenderer.java
@@ -0,0 +1,222 @@
+package io.anuke.mindustry.graphics;
+
+import io.anuke.arc.Core;
+import io.anuke.arc.graphics.*;
+import io.anuke.arc.graphics.VertexAttributes.Usage;
+import io.anuke.arc.graphics.g2d.BatchShader;
+import io.anuke.arc.graphics.g2d.TextureRegion;
+import io.anuke.arc.graphics.glutils.Shader;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.Matrix3;
+import io.anuke.arc.util.Disposable;
+
+//TODO this class is a trainwreck, remove it
+public class IndexedRenderer implements Disposable{
+ private final static int vsize = 5;
+
+ private Shader program = BatchShader.create();
+ private Mesh mesh;
+ private float[] tmpVerts = new float[vsize * 6];
+ private float[] vertices;
+
+ private Matrix3 projMatrix = new Matrix3();
+ private Matrix3 transMatrix = new Matrix3();
+ private Matrix3 combined = new Matrix3();
+ private float color = Color.WHITE.toFloatBits();
+
+ public IndexedRenderer(int sprites){
+ resize(sprites);
+ }
+
+ public void render(Texture texture){
+ Core.gl.glEnable(GL20.GL_BLEND);
+
+ updateMatrix();
+
+ program.begin();
+
+ texture.bind();
+
+ program.setUniformMatrix4("u_projTrans", BatchShader.copyTransform(combined));
+ program.setUniformi("u_texture", 0);
+
+ mesh.render(program, GL20.GL_TRIANGLES, 0, vertices.length / 5);
+
+ program.end();
+ }
+
+ public void setColor(Color color){
+ this.color = color.toFloatBits();
+ }
+
+ public void draw(int index, TextureRegion region, float x, float y, float w, float h){
+ final float fx2 = x + w;
+ final float fy2 = y + h;
+ final float u = region.getU();
+ final float v = region.getV2();
+ final float u2 = region.getU2();
+ final float v2 = region.getV();
+
+ float[] vertices = tmpVerts;
+
+ int idx = 0;
+ vertices[idx++] = x;
+ vertices[idx++] = y;
+ vertices[idx++] = color;
+ vertices[idx++] = u;
+ vertices[idx++] = v;
+
+ vertices[idx++] = x;
+ vertices[idx++] = fy2;
+ vertices[idx++] = color;
+ vertices[idx++] = u;
+ vertices[idx++] = v2;
+
+ vertices[idx++] = fx2;
+ vertices[idx++] = fy2;
+ vertices[idx++] = color;
+ vertices[idx++] = u2;
+ vertices[idx++] = v2;
+
+ //tri2
+ vertices[idx++] = x;
+ vertices[idx++] = y;
+ vertices[idx++] = color;
+ vertices[idx++] = u;
+ vertices[idx++] = v;
+
+ vertices[idx++] = fx2;
+ vertices[idx++] = y;
+ vertices[idx++] = color;
+ vertices[idx++] = u2;
+ vertices[idx++] = v;
+
+ vertices[idx++] = fx2;
+ vertices[idx++] = fy2;
+ vertices[idx++] = color;
+ vertices[idx++] = u2;
+ vertices[idx++] = v2;
+
+ mesh.updateVertices(index * vsize * 6, vertices);
+ }
+
+ public void draw(int index, TextureRegion region, float x, float y, float w, float h, float rotation){
+ final float u = region.getU();
+ final float v = region.getV2();
+ final float u2 = region.getU2();
+ final float v2 = region.getV();
+
+ final float originX = w / 2, originY = h / 2;
+
+ final float cos = Mathf.cosDeg(rotation);
+ final float sin = Mathf.sinDeg(rotation);
+
+ float fx = -originX;
+ float fy = -originY;
+ float fx2 = w - originX;
+ float fy2 = h - originY;
+
+ final float worldOriginX = x + originX;
+ final float worldOriginY = y + originY;
+
+ float x1 = cos * fx - sin * fy;
+ float y1 = sin * fx + cos * fy;
+
+ float x2 = cos * fx - sin * fy2;
+ float y2 = sin * fx + cos * fy2;
+
+ float x3 = cos * fx2 - sin * fy2;
+ float y3 = sin * fx2 + cos * fy2;
+
+ float x4 = x1 + (x3 - x2);
+ float y4 = y3 - (y2 - y1);
+
+ x1 += worldOriginX;
+ y1 += worldOriginY;
+ x2 += worldOriginX;
+ y2 += worldOriginY;
+ x3 += worldOriginX;
+ y3 += worldOriginY;
+ x4 += worldOriginX;
+ y4 += worldOriginY;
+
+ float[] vertices = tmpVerts;
+
+ int idx = 0;
+ vertices[idx++] = x1;
+ vertices[idx++] = y1;
+ vertices[idx++] = color;
+ vertices[idx++] = u;
+ vertices[idx++] = v;
+
+ vertices[idx++] = x3;
+ vertices[idx++] = y3;
+ vertices[idx++] = color;
+ vertices[idx++] = u2;
+ vertices[idx++] = v2;
+
+ vertices[idx++] = x4;
+ vertices[idx++] = y4;
+ vertices[idx++] = color;
+ vertices[idx++] = u;
+ vertices[idx++] = v2;
+
+ //tri2
+ vertices[idx++] = x1;
+ vertices[idx++] = y1;
+ vertices[idx++] = color;
+ vertices[idx++] = u;
+ vertices[idx++] = v;
+
+ vertices[idx++] = x2;
+ vertices[idx++] = y2;
+ vertices[idx++] = color;
+ vertices[idx++] = u2;
+ vertices[idx++] = v;
+
+ vertices[idx++] = x3;
+ vertices[idx++] = y3;
+ vertices[idx++] = color;
+ vertices[idx++] = u2;
+ vertices[idx++] = v2;
+
+ mesh.updateVertices(index * vsize * 6, vertices);
+ }
+
+ public Matrix3 getTransformMatrix(){
+ return transMatrix;
+ }
+
+ public void setTransformMatrix(Matrix3 matrix){
+ transMatrix = matrix;
+ }
+
+ public Matrix3 getProjectionMatrix(){
+ return projMatrix;
+ }
+
+ public void setProjectionMatrix(Matrix3 matrix){
+ projMatrix = matrix;
+ }
+
+ public void resize(int sprites){
+ if(mesh != null) mesh.dispose();
+
+ mesh = new Mesh(true, 6 * sprites, 0,
+ new VertexAttribute(Usage.Position, 2, "a_position"),
+ new VertexAttribute(Usage.ColorPacked, 4, "a_color"),
+ new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoord0"));
+ vertices = new float[6 * sprites * vsize];
+ mesh.setVertices(vertices);
+ }
+
+ private void updateMatrix(){
+ combined.set(projMatrix).mul(transMatrix);
+ }
+
+ @Override
+ public void dispose(){
+ mesh.dispose();
+ program.dispose();
+ }
+}
diff --git a/core/src/io/anuke/mindustry/graphics/Layer.java b/core/src/io/anuke/mindustry/graphics/Layer.java
index f04144a2cd..493a13deba 100644
--- a/core/src/io/anuke/mindustry/graphics/Layer.java
+++ b/core/src/io/anuke/mindustry/graphics/Layer.java
@@ -1,28 +1,18 @@
package io.anuke.mindustry.graphics;
public enum Layer{
- /**
- * Base block layer.
- */
+ /**Drawn under everything.*/
+ shadow,
+ /**Base block layer.*/
block,
- /**
- * for placement
- */
+ /**for placement*/
placement,
- /**
- * First overlay. Stuff like conveyor items.
- */
+ /**First overlay. Stuff like conveyor items.*/
overlay,
- /**
- * "High" blocks, like turrets.
- */
+ /**"High" blocks, like turrets.*/
turret,
- /**
- * Power lasers.
- */
+ /**Power lasers.*/
power,
- /**
- * Extra lasers, like healing turrets.
- */
+ /**Extra lasers, like healing turrets.*/
laser
}
diff --git a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java
index e900b2feef..8c5d198d24 100644
--- a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java
+++ b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java
@@ -1,54 +1,53 @@
package io.anuke.mindustry.graphics;
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.graphics.Pixmap;
-import com.badlogic.gdx.graphics.Pixmap.Format;
-import com.badlogic.gdx.graphics.Texture;
-import com.badlogic.gdx.graphics.g2d.TextureRegion;
-import com.badlogic.gdx.math.Rectangle;
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.Disposable;
+import io.anuke.arc.Core;
+import io.anuke.arc.Events;
+import io.anuke.arc.collection.Array;
+import io.anuke.arc.graphics.Pixmap;
+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;
+import io.anuke.arc.math.geom.Rectangle;
+import io.anuke.arc.util.Disposable;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.game.EventType.TileChangeEvent;
-import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent;
+import io.anuke.mindustry.game.EventType.WorldLoadEvent;
import io.anuke.mindustry.world.ColorMapper;
import io.anuke.mindustry.world.Tile;
-import io.anuke.ucore.core.Core;
-import io.anuke.ucore.core.Events;
-import io.anuke.ucore.core.Graphics;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Pixmaps;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.ThreadArray;
import static io.anuke.mindustry.Vars.tilesize;
import static io.anuke.mindustry.Vars.world;
public class MinimapRenderer implements Disposable{
private static final int baseSize = 16;
- private final Array units = new ThreadArray<>();
+ private final Array units = new Array<>();
private Pixmap pixmap;
private Texture texture;
private TextureRegion region;
- private Rectangle rect = new Rectangle();
+ private Rectangle rect = new Rectangle(), scissor = new Rectangle();
private int zoom = 4;
public MinimapRenderer(){
- Events.on(WorldLoadGraphicsEvent.class, event -> {
+ Events.on(WorldLoadEvent.class, event -> {
reset();
updateAll();
});
//make sure to call on the graphics thread
- Events.on(TileChangeEvent.class, event -> Gdx.app.postRunnable(() -> update(event.tile)));
+ Events.on(TileChangeEvent.class, event -> Core.app.post(() -> update(event.tile)));
}
public Texture getTexture(){
return texture;
}
- public void zoomBy(int amount){
+ public void zoomBy(float amount){
zoom += amount;
zoom = Mathf.clamp(zoom, 1, Math.min(world.width(), world.height()) / baseSize / 2);
}
@@ -68,24 +67,27 @@ public class MinimapRenderer implements Disposable{
}
public void drawEntities(float x, float y, float w, float h){
+ updateUnitArray();
+
int sz = baseSize * zoom;
float dx = (Core.camera.position.x / tilesize);
float dy = (Core.camera.position.y / tilesize);
dx = Mathf.clamp(dx, sz, world.width() - sz);
dy = Mathf.clamp(dy, sz, world.height() - sz);
+ if(!ScissorStack.pushScissors(scissor.set(x, y, w, h))){
+ return;
+ }
+
rect.set((dx - sz) * tilesize, (dy - sz) * tilesize, sz * 2 * tilesize, sz * 2 * tilesize);
- Graphics.beginClip(x, y, w, h);
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.crect(Draw.getBlankRegion(), x + rx, y + ry, w / (sz * 2), h / (sz * 2));
+ Fill.crect(x + rx, y + ry, w / (sz * 2), h / (sz * 2));
}
Draw.color();
-
- Graphics.endClip();
}
public TextureRegion getRegion(){
@@ -99,7 +101,7 @@ public class MinimapRenderer implements Disposable{
float invTexWidth = 1f / texture.getWidth();
float invTexHeight = 1f / texture.getHeight();
float x = dx - sz, y = world.height() - dy - sz, width = sz * 2, height = sz * 2;
- region.setRegion(x * invTexWidth, y * invTexHeight, (x + width) * invTexWidth, (y + height) * invTexHeight);
+ region.set(x * invTexWidth, y * invTexHeight, (x + width) * invTexWidth, (y + height) * invTexHeight);
return region;
}
diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java
index 3c070132fa..ed56e89b1c 100644
--- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java
+++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java
@@ -1,27 +1,19 @@
package io.anuke.mindustry.graphics;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.math.MathUtils;
-import com.badlogic.gdx.math.Rectangle;
-import com.badlogic.gdx.math.Vector2;
-import com.badlogic.gdx.utils.Array;
+import io.anuke.arc.Core;
+import io.anuke.arc.graphics.Color;
+import io.anuke.arc.graphics.g2d.Draw;
+import io.anuke.arc.graphics.g2d.Lines;
+import io.anuke.arc.math.Mathf;
+import io.anuke.arc.math.geom.Rectangle;
+import io.anuke.arc.math.geom.Vector2;
+import io.anuke.arc.util.Time;
+import io.anuke.arc.util.Tmp;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.entities.Player;
-import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.input.InputHandler;
-import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
-import io.anuke.mindustry.world.meta.BlockBar;
-import io.anuke.ucore.core.Core;
-import io.anuke.ucore.core.Graphics;
-import io.anuke.ucore.core.Settings;
-import io.anuke.ucore.core.Timers;
-import io.anuke.ucore.graphics.Draw;
-import io.anuke.ucore.graphics.Fill;
-import io.anuke.ucore.graphics.Lines;
-import io.anuke.ucore.util.Mathf;
-import io.anuke.ucore.util.Tmp;
import static io.anuke.mindustry.Vars.*;
@@ -41,25 +33,25 @@ public class OverlayRenderer{
if(!input.isDrawing() || player.isDead()) continue;
Shaders.outline.color.set(Palette.accent);
- Graphics.beginShaders(Shaders.outline);
+ //TODO draw outlined version
+ //Graphics.beginShaders(Shaders.outline);
input.drawOutlined();
- Graphics.endShaders();
+ //Graphics.endShaders();
}
}
public void drawTop(){
for(Player player : playerGroup.all()){
- if(Settings.getBool("indicators") && player != players[0] && player.getTeam() == players[0].getTeam()){
- if(!rect.setSize(Core.camera.viewportWidth * Core.camera.zoom * 0.9f, Core.camera.viewportHeight * Core.camera.zoom * 0.9f)
+ if(Core.settings.getBool("indicators") && player != players[0] && player.getTeam() == players[0].getTeam()){
+ if(!rect.setSize(Core.camera.width * 0.9f, Core.camera.height * 0.9f)
.setCenter(Core.camera.position.x, Core.camera.position.y).contains(player.x, player.y)){
Tmp.v1.set(player.x, player.y).sub(Core.camera.position.x, Core.camera.position.y).setLength(indicatorLength);
- Draw.color(player.getTeam().color);
- Lines.stroke(2f);
+ Lines.stroke(2f, player.getTeam().color);
Lines.lineAngle(Core.camera.position.x + Tmp.v1.x, Core.camera.position.y + Tmp.v1.y, Tmp.v1.angle(), 4f);
Draw.reset();
}
@@ -87,11 +79,11 @@ public class OverlayRenderer{
if(buildFadeTime > 0.005f){
for(Team enemy : state.teams.enemiesOf(player.getTeam())){
for(Tile core : state.teams.get(enemy).cores){
- float dst = Vector2.dst(player.x, player.y, core.drawx(), core.drawy());
+ float dst = Mathf.dst(player.x, player.y, core.drawx(), core.drawy());
if(dst < state.mode.enemyCoreBuildRadius * 1.5f){
Draw.color(Color.DARK_GRAY);
Lines.poly(core.drawx(), core.drawy() - 2, 200, state.mode.enemyCoreBuildRadius);
- Draw.color(Palette.accent, enemy.color, 0.5f + Mathf.absin(Timers.time(), 10f, 0.5f));
+ Draw.color(Palette.accent, enemy.color, 0.5f + Mathf.absin(Time.time(), 10f, 0.5f));
Lines.poly(core.drawx(), core.drawy(), 200, state.mode.enemyCoreBuildRadius);
}
}
@@ -101,129 +93,32 @@ public class OverlayRenderer{
Draw.reset();
//draw selected block bars and info
- if(input.recipe == null && !ui.hasMouse()){
- Vector2 vec = Graphics.world(input.getMouseX(), input.getMouseY());
+ if(input.recipe == null && !Core.scene.hasMouse()){
+ Vector2 vec = Core.input.mouseWorld(input.getMouseX(), input.getMouseY());
Tile tile = world.tileWorld(vec.x, vec.y);
if(tile != null && tile.block() != Blocks.air && tile.target().getTeam() == players[0].getTeam()){
Tile target = tile.target();
-
- if(showBlockDebug && target.entity != null){
- Draw.color(Color.RED);
- Lines.crect(target.drawx(), target.drawy(), target.block().size * tilesize, target.block().size * tilesize);
- Vector2 v = new Vector2();
-
- Draw.tcolor(Color.YELLOW);
- Draw.tscl(0.25f);
- Array