This commit is contained in:
Anuken
2018-12-28 22:22:08 -05:00
350 changed files with 4160 additions and 5081 deletions
+1 -1
View File
@@ -14,7 +14,7 @@ logs/
/core/lib/ /core/lib/
/core/assets-raw/sprites/generated/ /core/assets-raw/sprites/generated/
/annotations/build/ /annotations/build/
/kryonet/build/ /net/build/
/tools/build/ /tools/build/
/tests/build/ /tests/build/
/server/build/ /server/build/
+1
View File
@@ -17,6 +17,7 @@
android:appCategory="game" android:appCategory="game"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/GdxTheme" android:fullBackupContent="@xml/backup_rules"> android:theme="@style/GdxTheme" android:fullBackupContent="@xml/backup_rules">
<meta-data android:name="android.max_aspect" android:value="2.1" />
<activity <activity
android:name="io.anuke.mindustry.AndroidLauncher" android:name="io.anuke.mindustry.AndroidLauncher"
android:label="@string/app_name" android:label="@string/app_name"
+2 -4
View File
@@ -26,24 +26,22 @@ repositories {
dependencies { dependencies {
implementation project(":core") implementation project(":core")
implementation project(":kryonet") implementation project(":net")
implementation 'com.android.support:support-v4:28.0.0' implementation 'com.android.support:support-v4:28.0.0'
implementation 'org.sufficientlysecure:donations:2.5' implementation 'org.sufficientlysecure:donations:2.5'
implementation 'com.google.android.gms:play-services-auth:16.0.1' implementation 'com.google.android.gms:play-services-auth:16.0.1'
implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" implementation project(":Arc:backends:backend-android")
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64"
implementation "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi" natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a" natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a" natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86" natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64" natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64"
implementation "com.badlogicgames.gdx:gdx-controllers-android:$gdxVersion"
} }
task deploy(type: Copy){ task deploy(type: Copy){
@@ -11,25 +11,25 @@ import android.os.Bundle;
import android.provider.Settings.Secure; import android.provider.Settings.Secure;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.util.Log; import android.util.Log;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Base64Coder;
import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException; import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesRepairableException; import com.google.android.gms.common.GooglePlayServicesRepairableException;
import com.google.android.gms.security.ProviderInstaller; import com.google.android.gms.security.ProviderInstaller;
import io.anuke.kryonet.KryoClient; import io.anuke.arc.Core;
import io.anuke.kryonet.KryoServer; import io.anuke.arc.backends.android.surfaceview.AndroidApplication;
import io.anuke.arc.backends.android.surfaceview.AndroidApplicationConfiguration;
import io.anuke.arc.files.FileHandle;
import io.anuke.arc.function.Consumer;
import io.anuke.arc.scene.ui.layout.Unit;
import io.anuke.arc.util.Strings;
import io.anuke.arc.util.serialization.Base64Coder;
import io.anuke.net.KryoClient;
import io.anuke.net.KryoServer;
import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.core.Platform;
import io.anuke.mindustry.game.Saves.SaveSlot; import io.anuke.mindustry.game.Saves.SaveSlot;
import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.io.SaveIO;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.ui.dialogs.FileChooser; import io.anuke.mindustry.ui.dialogs.FileChooser;
import io.anuke.ucore.function.Consumer;
import io.anuke.ucore.scene.ui.layout.Unit;
import io.anuke.ucore.util.Bundles;
import io.anuke.ucore.util.Strings;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@@ -39,7 +39,7 @@ import java.util.ArrayList;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
public class AndroidLauncher extends PatchedAndroidApplication{ public class AndroidLauncher extends AndroidApplication{
public static final int PERMISSION_REQUEST_CODE = 1; public static final int PERMISSION_REQUEST_CODE = 1;
boolean doubleScaleTablets = true; boolean doubleScaleTablets = true;
FileChooser chooser; FileChooser chooser;
@@ -161,23 +161,23 @@ public class AndroidLauncher extends PatchedAndroidApplication{
InputStream inStream; InputStream inStream;
if(myFile != null) inStream = new FileInputStream(myFile); if(myFile != null) inStream = new FileInputStream(myFile);
else inStream = getContentResolver().openInputStream(uri); else inStream = getContentResolver().openInputStream(uri);
Gdx.app.postRunnable(() -> { Core.app.post(() -> {
if(save){ //open save if(save){ //open save
System.out.println("Opening save."); System.out.println("Opening save.");
FileHandle file = Gdx.files.local("temp-save." + saveExtension); FileHandle file = Core.files.local("temp-save." + saveExtension);
file.write(inStream, false); file.write(inStream, false);
if(SaveIO.isSaveValid(file)){ if(SaveIO.isSaveValid(file)){
try{ try{
SaveSlot slot = control.saves.importSave(file); SaveSlot slot = control.saves.importSave(file);
ui.load.runLoadSave(slot); ui.load.runLoadSave(slot);
}catch(IOException e){ }catch(IOException e){
ui.showError(Bundles.format("text.save.import.fail", Strings.parseException(e, false))); ui.showError(Core.bundle.format("text.save.import.fail", Strings.parseException(e, false)));
} }
}else{ }else{
ui.showError("$text.save.import.invalid"); ui.showError("$text.save.import.invalid");
} }
}else if(map){ //open map }else if(map){ //open map
Gdx.app.postRunnable(() -> { Core.app.post(() -> {
System.out.println("Opening map."); System.out.println("Opening map.");
if(!ui.editor.isShown()){ if(!ui.editor.isShown()){
ui.editor.show(); ui.editor.show();
@@ -1,20 +0,0 @@
package io.anuke.mindustry;
import com.badlogic.gdx.backends.android.AndroidApplication;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class PatchedAndroidApplication extends AndroidApplication {
private final ExecutorService exec = Executors.newSingleThreadExecutor();
@Override
protected void onPause () {
if(useImmersiveMode) {
exec.submit(() -> {
try {Thread.sleep(100);} catch (InterruptedException ignored) {}
graphics.onDrawFrame(null);
});
}
super.onPause();
}
}
@@ -129,7 +129,7 @@ public class RemoteWriteGenerator{
method.beginControlFlow("if(" + getCheckString(methodEntry.where) + ")"); method.beginControlFlow("if(" + getCheckString(methodEntry.where) + ")");
//add statement to create packet from pool //add statement to create packet from pool
method.addStatement("$1N packet = $2N.obtain($1N.class, $1N::new)", "io.anuke.mindustry.net.Packets.InvokePacket", "io.anuke.ucore.util.Pooling"); method.addStatement("$1N packet = $2N.obtain($1N.class, $1N::new)", "io.anuke.mindustry.net.Packets.InvokePacket", "io.anuke.arc.util.pooling.Pools");
//assign buffer //assign buffer
method.addStatement("packet.writeBuffer = TEMP_BUFFER"); method.addStatement("packet.writeBuffer = TEMP_BUFFER");
//assign priority //assign priority
@@ -53,7 +53,7 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
TypeSpec.Builder serializer = TypeSpec.anonymousClassBuilder("") TypeSpec.Builder serializer = TypeSpec.anonymousClassBuilder("")
.addSuperinterface(ParameterizedTypeName.get( .addSuperinterface(ParameterizedTypeName.get(
ClassName.bestGuess("io.anuke.ucore.io.TypeSerializer"), type)); ClassName.bestGuess("io.anuke.arc.Settings.TypeSerializer"), type));
MethodSpec.Builder writeMethod = MethodSpec.methodBuilder("write") MethodSpec.Builder writeMethod = MethodSpec.methodBuilder("write")
.returns(void.class) .returns(void.class)
@@ -84,8 +84,8 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
writeMethod.addStatement("stream.write" + capName + "(object." + name + ")"); writeMethod.addStatement("stream.write" + capName + "(object." + name + ")");
readMethod.addStatement("object." + name + "= stream.read" + capName + "()"); readMethod.addStatement("object." + name + "= stream.read" + capName + "()");
}else{ }else{
writeMethod.addStatement("io.anuke.ucore.core.Settings.getSerializer(" + typeName+ ".class).write(stream, object." + name + ")"); writeMethod.addStatement("io.anuke.arc.Core.settings.getSerializer(" + typeName+ ".class).write(stream, object." + name + ")");
readMethod.addStatement("object." + name + " = (" +typeName+")io.anuke.ucore.core.Settings.getSerializer(" + typeName+ ".class).read(stream)"); readMethod.addStatement("object." + name + " = (" +typeName+")io.anuke.arc.Core.settings.getSerializer(" + typeName+ ".class).read(stream)");
} }
} }
@@ -94,7 +94,7 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
serializer.addMethod(writeMethod.build()); serializer.addMethod(writeMethod.build());
serializer.addMethod(readMethod.build()); serializer.addMethod(readMethod.build());
method.addStatement("io.anuke.ucore.core.Settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build()); method.addStatement("io.anuke.arc.Core.settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build());
} }
classBuilder.addMethod(method.build()); classBuilder.addMethod(method.build());
+17 -30
View File
@@ -88,13 +88,14 @@ project(":desktop"){
dependencies{ dependencies{
compile project(":core") compile project(":core")
compile project(":kryonet") compile project(":net")
if(new File(projectDir.parent, '../debug').exists() && System.properties["release"] == null) compile project(":debug") if(new File(projectDir.parent, '../debug').exists() && System.properties["release"] == null) compile project(":debug")
compile "com.badlogicgames.gdx:gdx-backend-lwjgl3:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
compile "com.badlogicgames.gdx:gdx-controllers-lwjgl3:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
compile project(":Arc:backends:backend-lwjgl3")
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.0' compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.0'
} }
} }
@@ -145,11 +146,12 @@ project(":ios"){
dependencies{ dependencies{
compile project(":core") compile project(":core")
implementation project(":kryonet") compile project(":net")
compile project(":Arc:backends:backend-robovm")
compile "com.mobidevelop.robovm:robovm-rt:$roboVMVersion" compile "com.mobidevelop.robovm:robovm-rt:$roboVMVersion"
compile "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion" compile "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion"
compile "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios" compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-ios" compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-ios"
} }
@@ -168,20 +170,14 @@ project(":core"){
def comp = System.properties["release"] == null || System.properties["release"] == "false" def comp = System.properties["release"] == null || System.properties["release"] == "false"
if(!comp) println("Note: Compiling release build.") if(!comp) println("Note: Compiling release build.")
if(new File(projectDir.parent, '../uCore').exists() && comp){ if(new File(projectDir.parent, '../Arc').exists() && comp){
compile project(":uCore") compile project(":Arc:arc-core")
compile project(":Arc:extensions:freetype")
}else{ }else{
compile "com.github.anuken:ucore:$uCoreVersion" //TODO compile arc from jitpack
//compile 'com.github.Anuken.Arc:arc:-SNAPSHOT'
} }
if(new File(projectDir.parent, '../GDXGifRecorder').exists() && comp){
compile project(":GDXGifRecorder")
}
compile "com.badlogicgames.gdx:gdx:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
compileOnly project(":annotations") compileOnly project(":annotations")
annotationProcessor project(":annotations") annotationProcessor project(":annotations")
} }
@@ -190,18 +186,10 @@ project(":core"){
project(":server"){ project(":server"){
apply plugin: "java" apply plugin: "java"
configurations{
if(findProject(":android") != null){
compile.exclude module: android
}
}
dependencies{ dependencies{
compile project(":core") compile project(":core")
compile project(":kryonet") compile project(":net")
compile "com.badlogicgames.gdx:gdx-backend-headless:$gdxVersion" compile project(":Arc:backends:backend-headless")
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
} }
} }
@@ -212,8 +200,7 @@ project(":tests"){
testImplementation project(":core") testImplementation project(":core")
testImplementation('org.junit.jupiter:junit-jupiter-api:5.1.0') testImplementation('org.junit.jupiter:junit-jupiter-api:5.1.0')
testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.1.0') testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.1.0')
testImplementation "com.badlogicgames.gdx:gdx-backend-headless:$gdxVersion" compile project(":Arc:backends:backend-headless")
testImplementation "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
} }
test{ test{
@@ -238,13 +225,13 @@ project(":annotations"){
} }
} }
project(":kryonet"){ project(":net"){
apply plugin: "java" apply plugin: "java"
dependencies{ dependencies{
compile project(":core") compile project(":core")
compile "org.lz4:lz4-java:1.4.1" compile "org.lz4:lz4-java:1.4.1"
compile 'com.github.Anuken:kryonet:53b10247b1' compile 'com.github.Anuken:kryonet:38ca8d51b5763ebe463ed973a63b64390ff51416'
compile 'com.github.Anuken:WaifUPnP:05eb46bc577fd7674596946ba288c96c0cedd893' compile 'com.github.Anuken:WaifUPnP:05eb46bc577fd7674596946ba288c96c0cedd893'
} }
} }

Before

Width:  |  Height:  |  Size: 196 B

After

Width:  |  Height:  |  Size: 196 B

+42 -20
View File
@@ -1,20 +1,26 @@
package io.anuke.mindustry; package io.anuke.mindustry;
import io.anuke.arc.ApplicationCore;
import io.anuke.arc.Core;
import io.anuke.arc.Events;
import io.anuke.arc.util.Log;
import io.anuke.arc.util.Time;
import io.anuke.mindustry.core.*; import io.anuke.mindustry.core.*;
import io.anuke.mindustry.game.EventType.GameLoadEvent; import io.anuke.mindustry.game.EventType.GameLoadEvent;
import io.anuke.mindustry.io.BundleLoader; import io.anuke.mindustry.io.BundleLoader;
import io.anuke.ucore.core.Events;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.modules.ModuleCore;
import io.anuke.ucore.util.Log;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
public class Mindustry extends ModuleCore{ public class Mindustry extends ApplicationCore{
@Override @Override
public void init(){ public void setup(){
Timers.mark(); Time.setDeltaProvider(() -> {
float result = Core.graphics.getDeltaTime() * 60f;
return Float.isNaN(result) || Float.isInfinite(result) ? 1f : Math.min(result, 60f / 10f);
});
Time.mark();
Vars.init(); Vars.init();
@@ -22,26 +28,42 @@ public class Mindustry extends ModuleCore{
BundleLoader.load(); BundleLoader.load();
content.load(); content.load();
module(logic = new Logic()); add(logic = new Logic());
module(world = new World()); add(world = new World());
module(control = new Control()); add(control = new Control());
module(renderer = new Renderer()); add(renderer = new Renderer());
module(ui = new UI()); add(ui = new UI());
module(netServer = new NetServer()); add(netServer = new NetServer());
module(netClient = new NetClient()); add(netClient = new NetClient());
} }
@Override @Override
public void postInit(){ public void init(){
Log.info("Time to load [total]: {0}", Timers.elapsed()); super.init();
Log.info("Time to load [total]: {0}", Time.elapsed());
Events.fire(new GameLoadEvent()); Events.fire(new GameLoadEvent());
} }
@Override @Override
public void render(){ public void update(){
threads.handleBeginRender(); long lastFrameTime = Time.millis();
super.render();
threads.handleEndRender(); super.update();
int fpsCap = Core.settings.getInt("fpscap", 125);
if(fpsCap <= 120){
long target = 1000/fpsCap;
long elapsed = Time.timeSinceMillis(lastFrameTime);
if(elapsed < target){
try{
Thread.sleep(target - elapsed);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
} }
} }
+53 -45
View File
@@ -1,9 +1,13 @@
package io.anuke.mindustry; package io.anuke.mindustry;
import com.badlogic.gdx.Application.ApplicationType; import io.anuke.arc.Application.ApplicationType;
import com.badlogic.gdx.Gdx; import io.anuke.arc.Core;
import com.badlogic.gdx.files.FileHandle; import io.anuke.arc.entities.Entities;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.entities.EntityGroup;
import io.anuke.arc.entities.impl.EffectEntity;
import io.anuke.arc.entities.trait.DrawTrait;
import io.anuke.arc.files.FileHandle;
import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.core.*; import io.anuke.mindustry.core.*;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
@@ -17,42 +21,45 @@ import io.anuke.mindustry.game.Version;
import io.anuke.mindustry.gen.Serialization; import io.anuke.mindustry.gen.Serialization;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.world.blocks.defense.ForceProjector.ShieldEntity; import io.anuke.mindustry.world.blocks.defense.ForceProjector.ShieldEntity;
import io.anuke.ucore.core.Settings;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.entities.EntityGroup;
import io.anuke.ucore.entities.impl.EffectEntity;
import io.anuke.ucore.entities.trait.DrawTrait;
import io.anuke.ucore.scene.ui.layout.Unit;
import io.anuke.ucore.util.Translator;
import java.util.Arrays; import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class Vars{ public class Vars{
/**main application name, capitalized*/
public static final String appName = "Mindustry"; public static final String appName = "Mindustry";
/**URL for discord invite.*/
public static final String discordURL = "https://discord.gg/mindustry"; public static final String discordURL = "https://discord.gg/mindustry";
/**URL for Github API for releases*/
public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases"; public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases";
/**URL for Github API for contributors*/
public static final String contributorsURL = "https://api.github.com/repos/Anuken/Mindustry/contributors"; public static final String contributorsURL = "https://api.github.com/repos/Anuken/Mindustry/contributors";
/**URL for sending crash reports to*/
public static final String crashReportURL = "http://mindustry.us.to/report"; public static final String crashReportURL = "http://mindustry.us.to/report";
//time between waves in frames (on normal mode) /**time between waves in ticks (on normal mode)*/
public static final float wavespace = 60 * 60 * 1.5f; public static final float wavespace = 60 * 60 * 1.5f;
/**maximum distance between mine and core that supports automatic transferring*/
public static final float mineTransferRange = 220f; public static final float mineTransferRange = 220f;
//set ridiculously high for now /**maximum distance from core that the player can be before it is no longer used for building*/
public static final float coreBuildRange = 999999f; public static final float coreBuildRange = 999999f;
//team of the player by default /**team of the player by default*/
public static final Team defaultTeam = Team.blue; public static final Team defaultTeam = Team.blue;
//team of the enemy in waves /**team of the enemy in waves/sectors*/
public static final Team waveTeam = Team.red; public static final Team waveTeam = Team.red;
public static final float unlockResourceScaling = 1f; /**max chat message length*/
public static final int maxTextLength = 150; public static final int maxTextLength = 150;
/**max player name length in bytes*/
public static final int maxNameLength = 40; public static final int maxNameLength = 40;
/**displayed item size when ingame, TODO remove.*/
public static final float itemSize = 5f; public static final float itemSize = 5f;
/**size of tiles in units*/
public static final int tilesize = 8; public static final int tilesize = 8;
/**size of sectors in tiles*/
public static final int sectorSize = 256; public static final int sectorSize = 256;
/**specific number indicating 'invalid' sector*/
public static final int invalidSector = Integer.MAX_VALUE; public static final int invalidSector = Integer.MAX_VALUE;
public static Locale[] locales; /**all choosable player colors in join/host dialog*/
public static final Color[] playerColors = { public static final Color[] playerColors = {
Color.valueOf("82759a"), Color.valueOf("82759a"),
Color.valueOf("c0c1c5"), Color.valueOf("c0c1c5"),
@@ -71,36 +78,38 @@ public class Vars{
Color.valueOf("4b5ef1"), Color.valueOf("4b5ef1"),
Color.valueOf("2cabfe"), Color.valueOf("2cabfe"),
}; };
//server port /**default server port*/
public static final int port = 6567; public static final int port = 6567;
/**if true, UI is not drawn*/
public static boolean disableUI; public static boolean disableUI;
/**if true, game is set up in mobile mode, even on desktop. used for debugging*/
public static boolean testMobile; public static boolean testMobile;
//shorthand for whether or not this is running on android or ios /**whether the game is running on a mobile device*/
public static boolean mobile; public static boolean mobile;
/**whether the game is running on an iOS device*/
public static boolean ios; public static boolean ios;
/**whether the game is running on an Android device*/
public static boolean android; public static boolean android;
//main data directory /**whether the game is running on a headless server*/
public static boolean headless;
/**application data directory, equivalent to {@link io.anuke.arc.Settings#getDataDirectory()}*/
public static FileHandle dataDirectory; public static FileHandle dataDirectory;
//subdirectory for screenshots /**data subdirectory used for screenshots*/
public static FileHandle screenshotDirectory; public static FileHandle screenshotDirectory;
//directory for user-created map data /**data subdirectory used for custom mmaps*/
public static FileHandle customMapDirectory; public static FileHandle customMapDirectory;
//save file directory /**data subdirectory used for saves*/
public static FileHandle saveDirectory; public static FileHandle saveDirectory;
public static String mapExtension = "mmap"; /**map file extension*/
public static String saveExtension = "msav"; public static final String mapExtension = "mmap";
//camera zoom displayed on startup /**save file extension*/
public static int baseCameraScale; public static final String saveExtension = "msav";
public static boolean showBlockDebug = false;
public static boolean showFog = true; /**list of all locales that can be switched to*/
public static boolean headless = false; public static Locale[] locales;
public static float controllerMin = 0.25f;
public static float baseControllerSpeed = 11f;
public static boolean snapCamera = true;
public static ContentLoader content; public static ContentLoader content;
public static GameState state; public static GameState state;
public static ThreadHandler threads;
public static Control control; public static Control control;
public static Logic logic; public static Logic logic;
@@ -110,8 +119,6 @@ public class Vars{
public static NetServer netServer; public static NetServer netServer;
public static NetClient netClient; public static NetClient netClient;
public static Player[] players = {};
public static EntityGroup<Player> playerGroup; public static EntityGroup<Player> playerGroup;
public static EntityGroup<TileEntity> tileGroup; public static EntityGroup<TileEntity> tileGroup;
public static EntityGroup<Bullet> bulletGroup; public static EntityGroup<Bullet> bulletGroup;
@@ -122,13 +129,14 @@ public class Vars{
public static EntityGroup<Fire> fireGroup; public static EntityGroup<Fire> fireGroup;
public static EntityGroup<BaseUnit>[] unitGroups; public static EntityGroup<BaseUnit>[] unitGroups;
public static final Translator[] tmptr = new Translator[]{new Translator(), new Translator(), new Translator(), new Translator()}; /**all local players, currently only has one player. may be used for local co-op in the future*/
public static Player[] players = {};
public static void init(){ public static void init(){
Serialization.init(); Serialization.init();
//load locales //load locales
String[] stra = Gdx.files.internal("locales").readString().split("\n"); String[] stra = Core.files.internal("locales").readString().split("\n");
locales = new Locale[stra.length]; locales = new Locale[stra.length];
for(int i = 0; i < locales.length; i++){ for(int i = 0; i < locales.length; i++){
String code = stra[i]; String code = stra[i];
@@ -167,16 +175,16 @@ public class Vars{
} }
state = new GameState(); state = new GameState();
threads = new ThreadHandler();
mobile = Gdx.app.getType() == ApplicationType.Android || Gdx.app.getType() == ApplicationType.iOS || testMobile; mobile = Core.app.getType() == ApplicationType.Android || Core.app.getType() == ApplicationType.iOS || testMobile;
ios = Gdx.app.getType() == ApplicationType.iOS; ios = Core.app.getType() == ApplicationType.iOS;
android = Gdx.app.getType() == ApplicationType.Android; android = Core.app.getType() == ApplicationType.Android;
dataDirectory = Settings.getDataDirectory(appName); Core.settings.setAppName(appName);
dataDirectory = Core.settings.getDataDirectory();
screenshotDirectory = dataDirectory.child("screenshots/"); screenshotDirectory = dataDirectory.child("screenshots/");
customMapDirectory = dataDirectory.child("maps/"); customMapDirectory = dataDirectory.child("maps/");
saveDirectory = dataDirectory.child("saves/"); saveDirectory = dataDirectory.child("saves/");
baseCameraScale = Math.round(Unit.dp.scl(4));
} }
} }
@@ -1,7 +1,10 @@
package io.anuke.mindustry.ai; package io.anuke.mindustry.ai;
import com.badlogic.gdx.math.Vector2; import io.anuke.arc.Events;
import com.badlogic.gdx.utils.*; import io.anuke.arc.collection.*;
import io.anuke.arc.function.Predicate;
import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Geometry;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.game.EventType.TileChangeEvent; import io.anuke.mindustry.game.EventType.TileChangeEvent;
@@ -11,12 +14,6 @@ import io.anuke.mindustry.game.Teams.TeamData;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.meta.BlockFlag;
import io.anuke.ucore.core.Events;
import io.anuke.ucore.function.Predicate;
import io.anuke.ucore.util.EnumSet;
import io.anuke.ucore.util.Geometry;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.ThreadArray;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -47,7 +44,7 @@ public class BlockIndexer{
/**Empty set used for returning.*/ /**Empty set used for returning.*/
private ObjectSet<Tile> emptySet = new ObjectSet<>(); private ObjectSet<Tile> emptySet = new ObjectSet<>();
/**Array used for returning and reusing.*/ /**Array used for returning and reusing.*/
private Array<Tile> returnArray = new ThreadArray<>(); private Array<Tile> returnArray = new Array<>();
public BlockIndexer(){ public BlockIndexer(){
Events.on(TileChangeEvent.class, event -> { Events.on(TileChangeEvent.class, event -> {
@@ -176,7 +173,7 @@ public class BlockIndexer{
TileEntity e = other.entity; TileEntity e = other.entity;
float ndst = Vector2.dst(x, y, e.x, e.y); float ndst = Mathf.dst(x, y, e.x, e.y);
if(ndst < range && (closest == null || ndst < dst)){ if(ndst < range && (closest == null || ndst < dst)){
dst = ndst; dst = ndst;
closest = e; closest = e;
+14 -15
View File
@@ -1,9 +1,12 @@
package io.anuke.mindustry.ai; package io.anuke.mindustry.ai;
import com.badlogic.gdx.math.GridPoint2; import io.anuke.arc.Events;
import com.badlogic.gdx.utils.IntArray; import io.anuke.arc.collection.IntArray;
import com.badlogic.gdx.utils.Queue; import io.anuke.arc.collection.Queue;
import com.badlogic.gdx.utils.TimeUtils; 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.mindustry.game.EventType.TileChangeEvent; import io.anuke.mindustry.game.EventType.TileChangeEvent;
import io.anuke.mindustry.game.EventType.WorldLoadEvent; import io.anuke.mindustry.game.EventType.WorldLoadEvent;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
@@ -11,16 +14,12 @@ import io.anuke.mindustry.game.Teams.TeamData;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.meta.BlockFlag;
import io.anuke.ucore.core.Events;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Geometry;
import io.anuke.ucore.util.Structs;
import static io.anuke.mindustry.Vars.state; import static io.anuke.mindustry.Vars.state;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
public class Pathfinder{ public class Pathfinder{
private long maxUpdate = TimeUtils.millisToNanos(4); private long maxUpdate = Time.millisToNanos(4);
private PathData[] paths; private PathData[] paths;
private IntArray blocked = new IntArray(); private IntArray blocked = new IntArray();
@@ -63,7 +62,7 @@ public class Pathfinder{
Tile target = null; Tile target = null;
float tl = 0f; float tl = 0f;
for(GridPoint2 point : Geometry.d8){ for(Point2 point : Geometry.d8){
int dx = tile.x + point.x, dy = tile.y + point.y; int dx = tile.x + point.x, dy = tile.y + point.y;
Tile other = world.tile(dx, dy); Tile other = world.tile(dx, dy);
@@ -105,7 +104,7 @@ public class Pathfinder{
//increment search, clear frontier //increment search, clear frontier
path.search++; path.search++;
path.frontier.clear(); path.frontier.clear();
path.lastSearchTime = TimeUtils.millis(); path.lastSearchTime = Time.millis();
//add all targets to the frontier //add all targets to the frontier
for(Tile other : world.indexer.getEnemy(team, BlockFlag.target)){ for(Tile other : world.indexer.getEnemy(team, BlockFlag.target)){
@@ -144,14 +143,14 @@ public class Pathfinder{
private void updateFrontier(Team team, long nsToRun){ private void updateFrontier(Team team, long nsToRun){
PathData path = paths[team.ordinal()]; PathData path = paths[team.ordinal()];
long start = TimeUtils.nanoTime(); long start = Time.nanoTime();
while(path.frontier.size > 0 && (nsToRun < 0 || TimeUtils.timeSinceNanos(start) <= nsToRun)){ while(path.frontier.size > 0 && (nsToRun < 0 || Time.timeSinceNanos(start) <= nsToRun)){
Tile tile = path.frontier.removeLast(); Tile tile = path.frontier.removeLast();
float cost = path.weights[tile.x][tile.y]; float cost = path.weights[tile.x][tile.y];
if(cost < Float.MAX_VALUE){ if(cost < Float.MAX_VALUE){
for(GridPoint2 point : Geometry.d4){ for(Point2 point : Geometry.d4){
int dx = tile.x + point.x, dy = tile.y + point.y; int dx = tile.x + point.x, dy = tile.y + point.y;
Tile other = world.tile(dx, dy); Tile other = world.tile(dx, dy);
@@ -168,7 +167,7 @@ public class Pathfinder{
} }
private void clear(){ private void clear(){
Timers.mark(); Time.mark();
paths = new PathData[Team.all.length]; paths = new PathData[Team.all.length];
blocked.clear(); blocked.clear();
@@ -1,6 +1,10 @@
package io.anuke.mindustry.ai; package io.anuke.mindustry.ai;
import com.badlogic.gdx.utils.Array; import io.anuke.arc.Events;
import io.anuke.arc.collection.Array;
import io.anuke.arc.collection.GridBits;
import io.anuke.arc.math.Mathf;
import io.anuke.arc.util.Structs;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.entities.units.Squad; import io.anuke.mindustry.entities.units.Squad;
@@ -9,10 +13,6 @@ import io.anuke.mindustry.game.SpawnGroup;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.Waves; import io.anuke.mindustry.game.Waves;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Events;
import io.anuke.ucore.util.GridBits;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Structs;
import java.io.DataInput; import java.io.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -115,8 +115,8 @@ public class WaveSpawner{
FlyerSpawn spawn = flySpawns.get(flyCount); FlyerSpawn spawn = flySpawns.get(flyCount);
float margin = 40f; //how far away from the edge flying units spawn float margin = 40f; //how far away from the edge flying units spawn
spawnX = world.width() * tilesize / 2f + Mathf.sqrwavex(spawn.angle) * (world.width() / 2f * tilesize + margin); spawnX = world.width() * tilesize / 2f + sqrwavex(spawn.angle) * (world.width() / 2f * tilesize + margin);
spawnY = world.height() * tilesize / 2f + Mathf.sqrwavey(spawn.angle) * (world.height() / 2f * tilesize + margin); spawnY = world.height() * tilesize / 2f + sqrwavey(spawn.angle) * (world.height() / 2f * tilesize + margin);
spread = margin / 1.5f; spread = margin / 1.5f;
flyCount++; flyCount++;
@@ -223,7 +223,7 @@ public class WaveSpawner{
int shellWidth = quadWidth() * 2 + quadHeight() * 2 * 6; int shellWidth = quadWidth() * 2 + quadHeight() * 2 * 6;
shellWidth = Math.min(quadWidth() * quadHeight() / 4, shellWidth); shellWidth = Math.min(quadWidth() * quadHeight() / 4, shellWidth);
Mathf.traverseSpiral(quadWidth(), quadHeight(), Mathf.random(shellWidth), (x, y) -> { traverseSpiral(quadWidth(), quadHeight(), Mathf.random(shellWidth), (x, y) -> {
if(getQuad(x, y)){ if(getQuad(x, y)){
spawn.x = x; spawn.x = x;
spawn.y = y; spawn.y = y;
@@ -256,4 +256,57 @@ public class WaveSpawner{
//quadrant spawn coordinates //quadrant spawn coordinates
int x, y; int x, y;
} }
//utility methods
float sqrwavex(float degrees){
degrees = Mathf.mod(degrees, 360f);
if(degrees < 45){
return 1;
}else if(degrees < 135){
return 1f - (degrees - 45f) / 90f;
}else if(degrees < 225){
return -1f;
}else if(degrees < 315){
return (degrees - 225) / 90f;
}else{
return 1f;
}
}
float sqrwavey(float degrees){
return sqrwavex(degrees + 90f);
}
void traverseSpiral(int width, int height, int offset, SpiralTraverser con){
int directionIdx = 0;
int curRow = 0, curCol = 0;
for(int i = 0; i < height * width; i++){
if(i >= offset && con.accept(curCol, curRow)) break;
int same = 1, row = curRow, col = curCol;
if(row > height - 1 - row){
row = height - 1 - row;
same = 0;
}
if(col >= width - 1 - col){
col = width - 1 - col;
same = 0;
}
row -= same;
if(row == col){
directionIdx = (directionIdx + 1) % 4;
}
curRow += directions[directionIdx][0];
curCol += directions[directionIdx][1];
}
}
interface SpiralTraverser{
boolean accept(int x, int y);
}
private static int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
} }
@@ -1,6 +1,6 @@
package io.anuke.mindustry.content; package io.anuke.mindustry.content;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.type.ContentType;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
@@ -1,6 +1,6 @@
package io.anuke.mindustry.content; package io.anuke.mindustry.content;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.type.ContentType;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.type.Liquid;
+25 -25
View File
@@ -1,8 +1,14 @@
package io.anuke.mindustry.content; package io.anuke.mindustry.content;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.Core;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.arc.entities.Effects;
import com.badlogic.gdx.math.Rectangle; import io.anuke.arc.graphics.Blending;
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.Mathf;
import io.anuke.arc.math.geom.Rectangle;
import io.anuke.arc.util.Time;
import io.anuke.mindustry.content.fx.BulletFx; import io.anuke.mindustry.content.fx.BulletFx;
import io.anuke.mindustry.content.fx.UnitFx; import io.anuke.mindustry.content.fx.UnitFx;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
@@ -17,12 +23,6 @@ import io.anuke.mindustry.maps.TutorialSector;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.type.ContentType;
import io.anuke.mindustry.type.Mech; import io.anuke.mindustry.type.Mech;
import io.anuke.ucore.core.Core;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.unitGroups; import static io.anuke.mindustry.Vars.unitGroups;
@@ -100,7 +100,7 @@ public class Mechs implements ContentList{
Effects.shake(1f, 1f, player); Effects.shake(1f, 1f, player);
Effects.effect(UnitFx.landShock, player); Effects.effect(UnitFx.landShock, player);
for(int i = 0; i < 8; i++){ for(int i = 0; i < 8; i++){
Timers.run(Mathf.random(8f), () -> Lightning.create(player.getTeam(), Palette.lancerLaser, 17f, player.x, player.y, Mathf.random(360f), 14)); Time.run(Mathf.random(8f), () -> Lightning.create(player.getTeam(), Palette.lancerLaser, 17f, player.x, player.y, Mathf.random(360f), 14));
} }
} }
} }
@@ -137,7 +137,7 @@ public class Mechs implements ContentList{
rect.setSize(healRange*2f).setCenter(player.x, player.y); rect.setSize(healRange*2f).setCenter(player.x, player.y);
Units.getNearby(player.getTeam(), rect, unit -> { Units.getNearby(player.getTeam(), rect, unit -> {
if(unit.distanceTo(player) <= healRange){ if(unit.dst(player) <= healRange){
if(unit.health < unit.maxHealth()){ if(unit.health < unit.maxHealth()){
Effects.effect(UnitFx.heal, unit); Effects.effect(UnitFx.heal, unit);
wasHealed = true; wasHealed = true;
@@ -184,7 +184,7 @@ public class Mechs implements ContentList{
@Override @Override
public void load(){ public void load(){
super.load(); super.load();
armorRegion = Draw.region(name + "-armor"); armorRegion = Core.atlas.find(name + "-armor");
} }
@Override @Override
@@ -202,15 +202,15 @@ public class Mechs implements ContentList{
public void draw(Player player){ public void draw(Player player){
if(player.shootHeat <= 0.01f) return; if(player.shootHeat <= 0.01f) return;
float alpha = Core.batch.getColor().a; float alpha = Draw.getColor().a;
Shaders.build.progress = player.shootHeat; Shaders.build.progress = player.shootHeat;
Shaders.build.region = armorRegion; Shaders.build.region = armorRegion;
Shaders.build.time = Timers.time() / 10f; Shaders.build.time = Time.time() / 10f;
Shaders.build.color.set(Palette.accent).a = player.shootHeat; Shaders.build.color.set(Palette.accent).a = player.shootHeat;
Graphics.shader(Shaders.build); Draw.shader(Shaders.build);
Draw.alpha(1f); Draw.alpha(1f);
Draw.rect(armorRegion, player.snappedX(), player.snappedY(), player.rotation); Draw.rect(armorRegion, player.x, player.y, player.rotation);
Graphics.shader(Shaders.mix); Draw.shader(Shaders.mix);
Draw.color(1f, 1f, 1f, alpha); Draw.color(1f, 1f, 1f, alpha);
} }
}; };
@@ -246,7 +246,7 @@ public class Mechs implements ContentList{
@Override @Override
public void load(){ public void load(){
super.load(); super.load();
shield = Draw.region(name + "-shield"); shield = Core.atlas.find(name + "-shield");
} }
@Override @Override
@@ -257,7 +257,7 @@ public class Mechs implements ContentList{
@Override @Override
public void updateAlt(Player player){ public void updateAlt(Player player){
float scl = scld(player); float scl = scld(player);
if(Mathf.chance(Timers.delta() * (0.15*scl))){ if(Mathf.chance(Time.delta() * (0.15*scl))){
Effects.effect(BulletFx.hitLancer, Palette.lancerLaser, player.x, player.y); Effects.effect(BulletFx.hitLancer, Palette.lancerLaser, player.x, player.y);
Lightning.create(player.getTeam(), Palette.lancerLaser, 10f, Lightning.create(player.getTeam(), Palette.lancerLaser, 10f,
player.x + player.getVelocity().x, player.y + player.getVelocity().y, player.rotation, 14); player.x + player.getVelocity().x, player.y + player.getVelocity().y, player.rotation, 14);
@@ -268,14 +268,14 @@ public class Mechs implements ContentList{
public void draw(Player player){ public void draw(Player player){
float scl = scld(player); float scl = scld(player);
if(scl < 0.01f) return; if(scl < 0.01f) return;
float alpha = Core.batch.getColor().a; float alpha = Draw.getColor().a;
Graphics.shader(); Draw.shader();
Graphics.setAdditiveBlending();
Draw.color(Palette.lancerLaser); Draw.color(Palette.lancerLaser);
Draw.alpha(scl/2f); Draw.alpha(scl/2f);
Draw.rect(shield, player.snappedX() + Mathf.range(scl/2f), player.snappedY() + Mathf.range(scl/2f), player.rotation - 90); Draw.blend(Blending.additive);
Graphics.setNormalBlending(); Draw.rect(shield, player.x + Mathf.range(scl/2f), player.y + Mathf.range(scl/2f), player.rotation - 90);
Graphics.shader(Shaders.mix); Draw.blend();
Draw.shader(Shaders.mix);
Draw.color(); Draw.color();
Draw.alpha(alpha); Draw.alpha(alpha);
} }
@@ -1,14 +1,14 @@
package io.anuke.mindustry.content; package io.anuke.mindustry.content;
import io.anuke.arc.entities.Effects;
import io.anuke.arc.math.Mathf;
import io.anuke.arc.util.Time;
import io.anuke.mindustry.content.fx.EnvironmentFx; import io.anuke.mindustry.content.fx.EnvironmentFx;
import io.anuke.mindustry.entities.StatusController.StatusEntry; import io.anuke.mindustry.entities.StatusController.StatusEntry;
import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.type.ContentType;
import io.anuke.mindustry.type.StatusEffect; import io.anuke.mindustry.type.StatusEffect;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Mathf;
public class StatusEffects implements ContentList{ public class StatusEffects implements ContentList{
public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded, shocked; public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded, shocked;
@@ -38,7 +38,7 @@ public class StatusEffects implements ContentList{
public void update(Unit unit, float time){ public void update(Unit unit, float time){
unit.damagePeriodic(0.04f); unit.damagePeriodic(0.04f);
if(Mathf.chance(Timers.delta() * 0.2f)){ if(Mathf.chance(Time.delta() * 0.2f)){
Effects.effect(EnvironmentFx.burning, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f)); Effects.effect(EnvironmentFx.burning, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f));
} }
} }
@@ -54,7 +54,7 @@ public class StatusEffects implements ContentList{
@Override @Override
public void update(Unit unit, float time){ public void update(Unit unit, float time){
if(Mathf.chance(Timers.delta() * 0.15f)){ if(Mathf.chance(Time.delta() * 0.15f)){
Effects.effect(EnvironmentFx.freezing, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f)); Effects.effect(EnvironmentFx.freezing, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f));
} }
} }
@@ -79,7 +79,7 @@ public class StatusEffects implements ContentList{
@Override @Override
public void update(Unit unit, float time){ public void update(Unit unit, float time){
if(Mathf.chance(Timers.delta() * 0.15f)){ if(Mathf.chance(Time.delta() * 0.15f)){
Effects.effect(EnvironmentFx.wet, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f)); Effects.effect(EnvironmentFx.wet, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f));
} }
} }
@@ -105,7 +105,7 @@ public class StatusEffects implements ContentList{
public void update(Unit unit, float time){ public void update(Unit unit, float time){
unit.damagePeriodic(0.3f); unit.damagePeriodic(0.3f);
if(Mathf.chance(Timers.delta() * 0.2f)){ if(Mathf.chance(Time.delta() * 0.2f)){
Effects.effect(EnvironmentFx.melting, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f)); Effects.effect(EnvironmentFx.melting, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f));
} }
} }
@@ -118,7 +118,7 @@ public class StatusEffects implements ContentList{
@Override @Override
public void update(Unit unit, float time){ public void update(Unit unit, float time){
if(Mathf.chance(Timers.delta() * 0.15f)){ if(Mathf.chance(Time.delta() * 0.15f)){
Effects.effect(EnvironmentFx.oily, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f)); Effects.effect(EnvironmentFx.oily, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f));
} }
} }
@@ -143,9 +143,9 @@ public class StatusEffects implements ContentList{
@Override @Override
public void update(Unit unit, float time){ public void update(Unit unit, float time){
//idle regen boosted //idle regen boosted
unit.health += 0.01f * Timers.delta(); unit.health += 0.01f * Time.delta();
if(Mathf.chance(Timers.delta() * 0.25f)){ if(Mathf.chance(Time.delta() * 0.25f)){
Effects.effect(EnvironmentFx.overdriven, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f), 0f, unit); Effects.effect(EnvironmentFx.overdriven, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f), 0f, unit);
} }
} }
@@ -1,7 +1,7 @@
package io.anuke.mindustry.content; package io.anuke.mindustry.content;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.graphics.Color;
import com.badlogic.gdx.utils.ObjectSet; import io.anuke.arc.collection.ObjectSet;
import io.anuke.mindustry.entities.units.UnitType; import io.anuke.mindustry.entities.units.UnitType;
import io.anuke.mindustry.entities.units.types.*; import io.anuke.mindustry.entities.units.types.*;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
@@ -1,6 +1,6 @@
package io.anuke.mindustry.content.blocks; package io.anuke.mindustry.content.blocks;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.content.Items; import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.content.Liquids;
import io.anuke.mindustry.content.StatusEffects; import io.anuke.mindustry.content.StatusEffects;
@@ -10,10 +10,10 @@ import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.blocks.*;
import io.anuke.ucore.core.Timers; import io.anuke.arc.util.Time;
import io.anuke.ucore.graphics.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.ucore.graphics.Lines; import io.anuke.arc.graphics.g2d.Lines;
import io.anuke.ucore.util.Mathf; import io.anuke.arc.math.Mathf;
public class Blocks extends BlockList implements ContentList{ public class Blocks extends BlockList implements ContentList{
public static Block air, blockpart, spawn, space, metalfloor, deepwater, water, lava, tar, stone, public static Block air, blockpart, spawn, space, metalfloor, deepwater, water, lava, tar, stone,
@@ -41,7 +41,7 @@ public class Blocks extends BlockList implements ContentList{
public void draw(Tile tile){ public void draw(Tile tile){
Draw.color(Color.SCARLET); Draw.color(Color.SCARLET);
Lines.circle(tile.worldx(), tile.worldy(), 4f +Mathf.absin(Timers.time(), 6f, 6f)); Lines.circle(tile.worldx(), tile.worldy(), 4f +Mathf.absin(Time.time(), 6f, 6f));
Draw.color(); Draw.color();
} }
}; };
@@ -1,6 +1,6 @@
package io.anuke.mindustry.content.blocks; package io.anuke.mindustry.content.blocks;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.content.Items; import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.content.Liquids;
import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.content.fx.BlockFx;
@@ -23,7 +23,7 @@ public class CraftingBlocks extends BlockList implements ContentList{
burnDuration = 46f; burnDuration = 46f;
useFlux = true; useFlux = true;
consumes.items(new ItemStack[]{new ItemStack(Items.copper, 1), new ItemStack(Items.lead, 2)}); consumes.items(new ItemStack(Items.copper, 1), new ItemStack(Items.lead, 2));
consumes.item(Items.coal).optional(true); consumes.item(Items.coal).optional(true);
}}; }};
@@ -37,7 +37,7 @@ public class CraftingBlocks extends BlockList implements ContentList{
useFlux = true; useFlux = true;
fluxNeeded = 2; fluxNeeded = 2;
consumes.items(new ItemStack[]{new ItemStack(Items.copper, 1), new ItemStack(Items.lead, 2)}); consumes.items(new ItemStack(Items.copper, 1), new ItemStack(Items.lead, 2));
consumes.power(0.1f); consumes.power(0.1f);
}}; }};
@@ -51,7 +51,7 @@ public class CraftingBlocks extends BlockList implements ContentList{
hasLiquids = false; hasLiquids = false;
flameColor = Color.valueOf("ffef99"); flameColor = Color.valueOf("ffef99");
consumes.items(new ItemStack[]{new ItemStack(Items.coal, 1), new ItemStack(Items.sand, 2)}); consumes.items(new ItemStack(Items.coal, 1), new ItemStack(Items.sand, 2));
consumes.power(0.05f); consumes.power(0.05f);
}}; }};
@@ -80,7 +80,7 @@ public class CraftingBlocks extends BlockList implements ContentList{
powerCapacity = 50f; powerCapacity = 50f;
size = 2; size = 2;
consumes.items(new ItemStack[]{new ItemStack(Items.thorium, 4), new ItemStack(Items.sand, 10)}); consumes.items(new ItemStack(Items.thorium, 4), new ItemStack(Items.sand, 10));
consumes.power(0.5f); consumes.power(0.5f);
}}; }};
@@ -95,7 +95,7 @@ public class CraftingBlocks extends BlockList implements ContentList{
fluxNeeded = 3; fluxNeeded = 3;
consumes.power(0.4f); consumes.power(0.4f);
consumes.items(new ItemStack[]{new ItemStack(Items.titanium, 2), new ItemStack(Items.lead, 4), new ItemStack(Items.silicon, 3), new ItemStack(Items.copper, 3)}); consumes.items(new ItemStack(Items.titanium, 2), new ItemStack(Items.lead, 4), new ItemStack(Items.silicon, 3), new ItemStack(Items.copper, 3));
}}; }};
cryofluidmixer = new LiquidMixer("cryofluidmixer"){{ cryofluidmixer = new LiquidMixer("cryofluidmixer"){{
@@ -133,7 +133,7 @@ public class CraftingBlocks extends BlockList implements ContentList{
size = 2; size = 2;
consumes.power(0.02f); consumes.power(0.02f);
consumes.items(new ItemStack[]{new ItemStack(Items.coal, 1), new ItemStack(Items.lead, 2), new ItemStack(Items.sand, 2)}); consumes.items(new ItemStack(Items.coal, 1), new ItemStack(Items.lead, 2), new ItemStack(Items.sand, 2));
}}; }};
melter = new PowerCrafter("melter"){{ melter = new PowerCrafter("melter"){{
@@ -1,6 +1,6 @@
package io.anuke.mindustry.content.blocks; package io.anuke.mindustry.content.blocks;
import com.badlogic.gdx.utils.Array; import io.anuke.arc.collection.Array;
import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote; import io.anuke.annotations.Annotations.Remote;
import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.content.Liquids;
@@ -10,17 +10,16 @@ import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.PowerBlock; import io.anuke.mindustry.world.blocks.PowerBlock;
import io.anuke.mindustry.world.blocks.distribution.Sorter; import io.anuke.mindustry.world.blocks.distribution.Sorter;
import io.anuke.mindustry.world.blocks.power.PowerNode; import io.anuke.mindustry.world.blocks.power.PowerNode;
import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.ucore.graphics.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.ucore.scene.ui.ButtonGroup; import io.anuke.arc.scene.ui.ButtonGroup;
import io.anuke.ucore.scene.ui.ImageButton; import io.anuke.arc.scene.ui.ImageButton;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.arc.scene.ui.layout.Table;
import java.io.DataInput; import java.io.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -44,12 +43,6 @@ public class DebugBlocks extends BlockList implements ContentList{
shadow = "shadow-round-1"; shadow = "shadow-round-1";
} }
@Override
public void setBars(){
super.setBars();
bars.remove(BarType.power);
}
@Override @Override
public void init(){ public void init(){
super.init(); super.init();
@@ -83,12 +76,6 @@ public class DebugBlocks extends BlockList implements ContentList{
return true; return true;
} }
@Override
public void setBars(){
super.setBars();
bars.remove(BarType.inventory);
}
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
SorterEntity entity = tile.entity(); SorterEntity entity = tile.entity();
@@ -1,6 +1,6 @@
package io.anuke.mindustry.content.blocks; package io.anuke.mindustry.content.blocks;
import com.badlogic.gdx.utils.ObjectMap; import io.anuke.arc.collection.ObjectMap;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.Floor;
@@ -1,6 +1,6 @@
package io.anuke.mindustry.content.blocks; package io.anuke.mindustry.content.blocks;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.content.Items; import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.content.Liquids;
import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.content.fx.BlockFx;
@@ -1,16 +1,17 @@
package io.anuke.mindustry.content.blocks; package io.anuke.mindustry.content.blocks;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.Core;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.mindustry.content.AmmoTypes; import io.anuke.mindustry.content.AmmoTypes;
import io.anuke.mindustry.content.fx.ShootFx; import io.anuke.mindustry.content.fx.ShootFx;
import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.type.AmmoType;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.defense.turrets.*; import io.anuke.mindustry.world.blocks.defense.turrets.*;
import io.anuke.ucore.graphics.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.ucore.util.Angles; import io.anuke.arc.math.Angles;
import io.anuke.ucore.util.Mathf; import io.anuke.arc.math.Mathf;
public class TurretBlocks extends BlockList implements ContentList{ public class TurretBlocks extends BlockList implements ContentList{
public static Block duo, /*scatter,*/ public static Block duo, /*scatter,*/
@@ -46,7 +47,7 @@ public class TurretBlocks extends BlockList implements ContentList{
@Override @Override
public void load(){ public void load(){
super.load(); super.load();
shootRegion = Draw.region(name + "-shoot"); shootRegion = Core.atlas.find(name + "-shoot");
} }
{ {
@@ -137,8 +138,8 @@ public class TurretBlocks extends BlockList implements ContentList{
@Override @Override
public void load() { public void load() {
super.load(); super.load();
panels[0] = Draw.region(name + "-panel-left"); panels[0] = Core.atlas.find(name + "-panel-left");
panels[1] = Draw.region(name + "-panel-right"); panels[1] = Core.atlas.find(name + "-panel-right");
} }
{ {
@@ -157,8 +158,8 @@ public class TurretBlocks extends BlockList implements ContentList{
drawer = (tile, entity) -> { drawer = (tile, entity) -> {
Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
float offsetx = (int) (Mathf.abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 3f); float offsetx = (int) (abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 3f);
float offsety = -(int) (Mathf.abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 2f); float offsety = -(int) (abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 2f);
for(int i : Mathf.signs){ for(int i : Mathf.signs){
float rot = entity.rotation + 90 * i; float rot = entity.rotation + 90 * i;
@@ -170,6 +171,11 @@ public class TurretBlocks extends BlockList implements ContentList{
health = 360; health = 360;
} }
/** Converts a value range from 0-1 to a value range 0-1-0. */
float abscurve(float f){
return 1f - Math.abs(f - 0.5f) * 2f;
}
}; };
ripple = new ArtilleryTurret("ripple"){{ ripple = new ArtilleryTurret("ripple"){{
@@ -7,7 +7,7 @@ import io.anuke.mindustry.entities.bullet.FlakBulletType;
import io.anuke.mindustry.entities.effect.Lightning; import io.anuke.mindustry.entities.effect.Lightning;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.ucore.util.Mathf; import io.anuke.arc.math.Mathf;
public class FlakBullets extends BulletList implements ContentList{ public class FlakBullets extends BulletList implements ContentList{
public static BulletType plastic, explosive, surge; public static BulletType plastic, explosive, surge;
@@ -1,6 +1,6 @@
package io.anuke.mindustry.content.bullets; package io.anuke.mindustry.content.bullets;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.content.fx.BulletFx; import io.anuke.mindustry.content.fx.BulletFx;
import io.anuke.mindustry.entities.bullet.Bullet; import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.bullet.BulletType; import io.anuke.mindustry.entities.bullet.BulletType;
@@ -8,8 +8,8 @@ import io.anuke.mindustry.entities.bullet.MissileBulletType;
import io.anuke.mindustry.entities.effect.Lightning; import io.anuke.mindustry.entities.effect.Lightning;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.ucore.core.Timers; import io.anuke.arc.util.Time;
import io.anuke.ucore.util.Mathf; import io.anuke.arc.math.Mathf;
public class MissileBullets extends BulletList implements ContentList{ public class MissileBullets extends BulletList implements ContentList{
public static BulletType explosive, incindiary, surge, javelin, swarm; public static BulletType explosive, incindiary, surge, javelin, swarm;
@@ -92,7 +92,7 @@ public class MissileBullets extends BulletList implements ContentList{
@Override @Override
public void update(Bullet b){ public void update(Bullet b){
super.update(b); super.update(b);
b.getVelocity().rotate(Mathf.sin(Timers.time() + b.id * 4422, 8f, 2f)); b.getVelocity().rotate(Mathf.sin(Time.time() + b.id * 4422, 8f, 2f));
} }
}; };
@@ -117,7 +117,7 @@ public class MissileBullets extends BulletList implements ContentList{
@Override @Override
public void update(Bullet b){ public void update(Bullet b){
super.update(b); super.update(b);
b.getVelocity().rotate(Mathf.sin(Timers.time() + b.id * 4422, 8f, 2f)); b.getVelocity().rotate(Mathf.sin(Time.time() + b.id * 4422, 8f, 2f));
} }
}; };
} }
@@ -1,6 +1,6 @@
package io.anuke.mindustry.content.bullets; package io.anuke.mindustry.content.bullets;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.content.fx.BulletFx; import io.anuke.mindustry.content.fx.BulletFx;
import io.anuke.mindustry.entities.bullet.BasicBulletType; import io.anuke.mindustry.entities.bullet.BasicBulletType;
import io.anuke.mindustry.entities.bullet.BulletType; import io.anuke.mindustry.entities.bullet.BulletType;
@@ -1,6 +1,14 @@
package io.anuke.mindustry.content.bullets; package io.anuke.mindustry.content.bullets;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.entities.Effects;
import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.CapStyle;
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.util.Time;
import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.content.Liquids;
import io.anuke.mindustry.content.StatusEffects; import io.anuke.mindustry.content.StatusEffects;
import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.content.fx.BlockFx;
@@ -15,14 +23,10 @@ import io.anuke.mindustry.entities.effect.Fire;
import io.anuke.mindustry.entities.effect.Lightning; import io.anuke.mindustry.entities.effect.Lightning;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.graphics.Shapes;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.BuildBlock; import io.anuke.mindustry.world.blocks.BuildBlock;
import io.anuke.mindustry.world.blocks.distribution.MassDriver.DriverBulletData; import io.anuke.mindustry.world.blocks.distribution.MassDriver.DriverBulletData;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.*;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.content; import static io.anuke.mindustry.Vars.content;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
@@ -105,18 +109,18 @@ public class TurretBullets extends BulletList implements ContentList{
@Override @Override
public void update(Bullet b){ public void update(Bullet b){
if(Mathf.chance(0.04 * Timers.delta())){ if(Mathf.chance(0.04 * Time.delta())){
Tile tile = world.tileWorld(b.x, b.y); Tile tile = world.tileWorld(b.x, b.y);
if(tile != null){ if(tile != null){
Fire.create(tile); Fire.create(tile);
} }
} }
if(Mathf.chance(0.1 * Timers.delta())){ if(Mathf.chance(0.1 * Time.delta())){
Effects.effect(EnvironmentFx.fireballsmoke, b.x, b.y); Effects.effect(EnvironmentFx.fireballsmoke, b.x, b.y);
} }
if(Mathf.chance(0.1 * Timers.delta())){ if(Mathf.chance(0.1 * Time.delta())){
Effects.effect(EnvironmentFx.ballfire, b.x, b.y); Effects.effect(EnvironmentFx.ballfire, b.x, b.y);
} }
} }
@@ -213,10 +217,10 @@ public class TurretBullets extends BulletList implements ContentList{
Lines.lineAngle(b.x, b.y, b.angle(), baseLen); Lines.lineAngle(b.x, b.y, b.angle(), baseLen);
for(int s = 0; s < colors.length; s++){ for(int s = 0; s < colors.length; s++){
Draw.color(tmpColor.set(colors[s]).mul(1f + Mathf.absin(Timers.time(), 1f, 0.1f))); Draw.color(tmpColor.set(colors[s]).mul(1f + Mathf.absin(Time.time(), 1f, 0.1f)));
for(int i = 0; i < tscales.length; i++){ for(int i = 0; i < tscales.length; i++){
vector.trns(b.angle() + 180f, (lenscales[i] - 1f) * 35f); vector.trns(b.angle() + 180f, (lenscales[i] - 1f) * 35f);
Lines.stroke((9f + Mathf.absin(Timers.time(), 0.8f, 1.5f)) * b.fout() * strokes[s] * tscales[i]); Lines.stroke((9f + Mathf.absin(Time.time(), 0.8f, 1.5f)) * b.fout() * strokes[s] * tscales[i]);
Lines.lineAngle(b.x + vector.x, b.y + vector.y, b.angle(), baseLen * lenscales[i], CapStyle.none); Lines.lineAngle(b.x + vector.x, b.y + vector.y, b.angle(), baseLen * lenscales[i], CapStyle.none);
} }
} }
@@ -367,9 +371,9 @@ public class TurretBullets extends BulletList implements ContentList{
return; return;
} }
float baseDst = data.from.distanceTo(data.to); float baseDst = data.from.dst(data.to);
float dst1 = b.distanceTo(data.from); float dst1 = b.dst(data.from);
float dst2 = b.distanceTo(data.to); float dst2 = b.dst(data.to);
boolean intersect = false; boolean intersect = false;
@@ -379,7 +383,7 @@ public class TurretBullets extends BulletList implements ContentList{
float baseAngle = data.to.angleTo(data.from); float baseAngle = data.to.angleTo(data.from);
//if angles are nearby, then yes, it did //if angles are nearby, then yes, it did
if(Mathf.angNear(angleTo, baseAngle, 2f)){ if(Angles.near(angleTo, baseAngle, 2f)){
intersect = true; intersect = true;
//snap bullet position back; this is used for low-FPS situations //snap bullet position back; this is used for low-FPS situations
b.set(data.to.x + Angles.trnsx(baseAngle, hitDst), data.to.y + Angles.trnsy(baseAngle, hitDst)); b.set(data.to.x + Angles.trnsx(baseAngle, hitDst), data.to.y + Angles.trnsy(baseAngle, hitDst));
@@ -1,6 +1,6 @@
package io.anuke.mindustry.content.bullets; package io.anuke.mindustry.content.bullets;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.content.Liquids;
import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.content.fx.BlockFx;
import io.anuke.mindustry.content.fx.BulletFx; import io.anuke.mindustry.content.fx.BulletFx;
@@ -12,7 +12,7 @@ import io.anuke.mindustry.entities.effect.Fire;
import io.anuke.mindustry.entities.effect.Puddle; import io.anuke.mindustry.entities.effect.Puddle;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.util.Mathf; import io.anuke.arc.math.Mathf;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
@@ -1,17 +1,16 @@
package io.anuke.mindustry.content.fx; package io.anuke.mindustry.content.fx;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect; import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.arc.entities.Effects.Effect;
import io.anuke.ucore.graphics.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.ucore.graphics.Fill; import io.anuke.arc.graphics.g2d.Fill;
import io.anuke.ucore.graphics.Hue; import io.anuke.arc.graphics.g2d.Lines;
import io.anuke.ucore.graphics.Lines; import io.anuke.arc.math.Angles;
import io.anuke.ucore.util.Angles; import io.anuke.arc.math.Mathf;
import io.anuke.ucore.util.Mathf; import io.anuke.arc.util.Tmp;
import io.anuke.ucore.util.Tmp;
import static io.anuke.mindustry.Vars.tilesize; import static io.anuke.mindustry.Vars.tilesize;
@@ -264,14 +263,14 @@ public class BlockFx extends FxList implements ContentList{
Draw.reset(); Draw.reset();
}); });
ripple = new GroundEffect(false, 30, e -> { ripple = new GroundEffect(false, 30, e -> {
Draw.color(Hue.shift(Tmp.c1.set(e.color), 2, 0.1f)); Draw.color(Tmp.c1.set(e.color).shiftValue(0.1f));
Lines.stroke(e.fout() + 0.4f); Lines.stroke(e.fout() + 0.4f);
Lines.circle(e.x, e.y, 2f + e.fin() * 4f); Lines.circle(e.x, e.y, 2f + e.fin() * 4f);
Draw.reset(); Draw.reset();
}); });
bubble = new Effect(20, e -> { bubble = new Effect(20, e -> {
Draw.color(Hue.shift(Tmp.c1.set(e.color), 2, 0.1f)); Draw.color(Tmp.c1.set(e.color).shiftValue(0.1f));
Lines.stroke(e.fout() + 0.2f); Lines.stroke(e.fout() + 0.2f);
Angles.randLenVectors(e.id, 2, 8f, (x, y) -> { Angles.randLenVectors(e.id, 2, 8f, (x, y) -> {
Lines.circle(e.x + x, e.y + y, 1f + e.fin() * 3f); Lines.circle(e.x + x, e.y + y, 1f + e.fin() * 3f);
@@ -1,14 +1,14 @@
package io.anuke.mindustry.content.fx; package io.anuke.mindustry.content.fx;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.arc.entities.Effects.Effect;
import io.anuke.ucore.graphics.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.ucore.graphics.Fill; import io.anuke.arc.graphics.g2d.Fill;
import io.anuke.ucore.graphics.Lines; import io.anuke.arc.graphics.g2d.Lines;
import io.anuke.ucore.util.Angles; import io.anuke.arc.math.Angles;
import io.anuke.ucore.util.Mathf; import io.anuke.arc.math.Mathf;
public class BulletFx extends FxList implements ContentList{ public class BulletFx extends FxList implements ContentList{
public static Effect hitBulletSmall, hitFuse, hitBulletBig, hitFlameSmall, hitLiquid, hitLaser, hitLancer, hitMeltdown, despawn, flakExplosion, blastExplosion, plasticExplosion, public static Effect hitBulletSmall, hitFuse, hitBulletBig, hitFlameSmall, hitLiquid, hitLaser, hitLancer, hitMeltdown, despawn, flakExplosion, blastExplosion, plasticExplosion,
@@ -1,15 +1,15 @@
package io.anuke.mindustry.content.fx; package io.anuke.mindustry.content.fx;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.entities.Effects.Effect;
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.mindustry.content.Liquids; import io.anuke.mindustry.content.Liquids;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Fill;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf;
public class EnvironmentFx extends FxList implements ContentList{ public class EnvironmentFx extends FxList implements ContentList{
public static Effect burning, fire, smoke, steam, fireballsmoke, ballfire, freezing, melting, wet, oily, overdriven, dropItem; public static Effect burning, fire, smoke, steam, fireballsmoke, ballfire, freezing, melting, wet, oily, overdriven, dropItem;
@@ -1,14 +1,14 @@
package io.anuke.mindustry.content.fx; package io.anuke.mindustry.content.fx;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.arc.entities.Effects.Effect;
import io.anuke.ucore.graphics.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.ucore.graphics.Fill; import io.anuke.arc.graphics.g2d.Fill;
import io.anuke.ucore.graphics.Lines; import io.anuke.arc.graphics.g2d.Lines;
import io.anuke.ucore.util.Angles; import io.anuke.arc.math.Angles;
import io.anuke.ucore.util.Mathf; import io.anuke.arc.math.Mathf;
public class ExplosionFx extends FxList implements ContentList{ public class ExplosionFx extends FxList implements ContentList{
public static Effect shockwave, bigShockwave, nuclearShockwave, explosion, blockExplosion, blockExplosionSmoke; public static Effect shockwave, bigShockwave, nuclearShockwave, explosion, blockExplosion, blockExplosionSmoke;
@@ -1,13 +1,13 @@
package io.anuke.mindustry.content.fx; package io.anuke.mindustry.content.fx;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.arc.entities.Effects.Effect;
import io.anuke.ucore.graphics.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.ucore.graphics.Fill; import io.anuke.arc.graphics.g2d.Fill;
import io.anuke.ucore.graphics.Lines; import io.anuke.arc.graphics.g2d.Lines;
import io.anuke.ucore.util.Angles; import io.anuke.arc.math.Angles;
import static io.anuke.mindustry.Vars.tilesize; import static io.anuke.mindustry.Vars.tilesize;
@@ -1,16 +1,17 @@
package io.anuke.mindustry.content.fx; package io.anuke.mindustry.content.fx;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.Core;
import io.anuke.arc.entities.Effects.Effect;
import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.Draw;
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.mindustry.entities.effect.GroundEffectEntity.GroundEffect; import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.mindustry.graphics.Palette;
import io.anuke.ucore.graphics.Draw; import io.anuke.mindustry.graphics.Shapes;
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;
public class ShootFx extends FxList implements ContentList{ public class ShootFx extends FxList implements ContentList{
public static Effect shootSmall, shootHeal, shootSmallSmoke, shootBig, shootBig2, shootBigSmoke, shootBigSmoke2, shootSmallFlame, shootLiquid, shellEjectSmall, shellEjectMedium, shellEjectBig, lancerLaserShoot, lancerLaserShootSmoke, lancerLaserCharge, lancerLaserChargeBegin, lightningCharge, lightningShoot; public static Effect shootSmall, shootHeal, shootSmallSmoke, shootBig, shootBig2, shootBigSmoke, shootBigSmoke2, shootSmallFlame, shootLiquid, shellEjectSmall, shellEjectMedium, shellEjectBig, lancerLaserShoot, lancerLaserShootSmoke, lancerLaserCharge, lancerLaserChargeBegin, lightningCharge, lightningShoot;
@@ -108,8 +109,7 @@ public class ShootFx extends FxList implements ContentList{
float len = (2f + e.finpow() * 6f) * i; float len = (2f + e.finpow() * 6f) * i;
float lr = rot + e.fin() * 30f * i; float lr = rot + e.fin() * 30f * i;
Draw.rect("white", Fill.rect(e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()),
e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()),
e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()),
1f, 2f, rot + e.fin() * 50f * i); 1f, 2f, rot + e.fin() * 50f * i);
@@ -122,7 +122,7 @@ public class ShootFx extends FxList implements ContentList{
for(int i : Mathf.signs){ for(int i : Mathf.signs){
float len = (2f + e.finpow() * 10f) * i; float len = (2f + e.finpow() * 10f) * i;
float lr = rot + e.fin() * 20f * i; float lr = rot + e.fin() * 20f * i;
Draw.rect("casing", Draw.rect(Core.atlas.find("casing"),
e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()),
e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()),
2f, 3f, rot); 2f, 3f, rot);
@@ -145,7 +145,7 @@ public class ShootFx extends FxList implements ContentList{
for(int i : Mathf.signs){ for(int i : Mathf.signs){
float len = (4f + e.finpow() * 8f) * i; float len = (4f + e.finpow() * 8f) * i;
float lr = rot + Mathf.randomSeedRange(e.id + i + 6, 20f * e.fin()) * i; float lr = rot + Mathf.randomSeedRange(e.id + i + 6, 20f * e.fin()) * i;
Draw.rect("casing", Draw.rect(Core.atlas.find("casing"),
e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()),
e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()),
2.5f, 4f, 2.5f, 4f,
@@ -3,12 +3,12 @@ package io.anuke.mindustry.content.fx;
import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect; import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.arc.entities.Effects.Effect;
import io.anuke.ucore.graphics.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.ucore.graphics.Fill; import io.anuke.arc.graphics.g2d.Fill;
import io.anuke.ucore.graphics.Lines; import io.anuke.arc.graphics.g2d.Lines;
import io.anuke.ucore.util.Angles; import io.anuke.arc.math.Angles;
import io.anuke.ucore.util.Mathf; import io.anuke.arc.math.Mathf;
public class UnitFx extends FxList implements ContentList{ public class UnitFx extends FxList implements ContentList{
public static Effect vtolHover, unitDrop, unitPickup, unitLand, pickup, healWave, heal, landShock; public static Effect vtolHover, unitDrop, unitPickup, unitLand, pickup, healWave, heal, landShock;
@@ -1,8 +1,10 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import com.badlogic.gdx.utils.Array; import io.anuke.arc.collection.Array;
import com.badlogic.gdx.utils.ObjectMap; import io.anuke.arc.collection.ObjectMap;
import com.badlogic.gdx.utils.ObjectSet; import io.anuke.arc.collection.ObjectSet;
import io.anuke.arc.function.Consumer;
import io.anuke.arc.util.Log;
import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.*;
import io.anuke.mindustry.content.blocks.*; import io.anuke.mindustry.content.blocks.*;
import io.anuke.mindustry.content.bullets.*; import io.anuke.mindustry.content.bullets.*;
@@ -24,9 +26,6 @@ import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.ColorMapper; import io.anuke.mindustry.world.ColorMapper;
import io.anuke.mindustry.world.LegacyColorMapper; import io.anuke.mindustry.world.LegacyColorMapper;
import io.anuke.ucore.function.Consumer;
import io.anuke.ucore.util.Log;
import io.anuke.ucore.util.ThreadArray;
/** /**
* Loads all game content. * Loads all game content.
@@ -114,7 +113,7 @@ public class ContentLoader{
registerTypes(); registerTypes();
for(ContentType type : ContentType.values()){ for(ContentType type : ContentType.values()){
contentMap[type.ordinal()] = new ThreadArray<>(); contentMap[type.ordinal()] = new Array<>();
contentNameMap[type.ordinal()] = new ObjectMap<>(); contentNameMap[type.ordinal()] = new ObjectMap<>();
} }
+42 -64
View File
@@ -1,7 +1,17 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import com.badlogic.gdx.Gdx; import io.anuke.arc.ApplicationListener;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.Core;
import io.anuke.arc.Events;
import io.anuke.arc.entities.Effects;
import io.anuke.arc.entities.EntityQuery;
import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.TextureAtlas;
import io.anuke.arc.input.KeyCode;
import io.anuke.arc.scene.ui.TextField;
import io.anuke.arc.util.Interval;
import io.anuke.arc.util.Strings;
import io.anuke.arc.util.Time;
import io.anuke.mindustry.content.Mechs; import io.anuke.mindustry.content.Mechs;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
@@ -11,7 +21,7 @@ import io.anuke.mindustry.game.EventType.*;
import io.anuke.mindustry.game.Saves; import io.anuke.mindustry.game.Saves;
import io.anuke.mindustry.game.Unlocks; import io.anuke.mindustry.game.Unlocks;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.input.DefaultKeybinds; import io.anuke.mindustry.input.Binding;
import io.anuke.mindustry.input.DesktopInput; import io.anuke.mindustry.input.DesktopInput;
import io.anuke.mindustry.input.InputHandler; import io.anuke.mindustry.input.InputHandler;
import io.anuke.mindustry.input.MobileInput; import io.anuke.mindustry.input.MobileInput;
@@ -20,16 +30,10 @@ import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.ui.dialogs.FloatingDialog; import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import io.anuke.ucore.core.*;
import io.anuke.ucore.entities.EntityQuery;
import io.anuke.ucore.modules.Module;
import io.anuke.ucore.util.Atlas;
import io.anuke.ucore.util.Bundles;
import io.anuke.ucore.util.Strings;
import io.anuke.ucore.util.Timer;
import java.io.IOException; import java.io.IOException;
import static io.anuke.arc.Core.scene;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
/** /**
@@ -38,36 +42,31 @@ import static io.anuke.mindustry.Vars.*;
* Should <i>not</i> handle any logic-critical state. * Should <i>not</i> handle any logic-critical state.
* This class is not created in the headless server. * This class is not created in the headless server.
*/ */
public class Control extends Module{ public class Control implements ApplicationListener{
public final Saves saves; public final Saves saves;
public final Unlocks unlocks; public final Unlocks unlocks;
private Timer timerRPC = new Timer(), timerUnlock = new Timer(); private Interval timerRPC = new Interval(), timerUnlock = new Interval();
private boolean hiscore = false; private boolean hiscore = false;
private boolean wasPaused = false; private boolean wasPaused = false;
private InputHandler[] inputs = {}; private InputHandler[] inputs = {};
private Throwable error;
public Control(){ public Control(){
saves = new Saves(); saves = new Saves();
unlocks = new Unlocks(); unlocks = new Unlocks();
Inputs.useControllers(true); Core.input.setCatch(KeyCode.BACK, true);
Gdx.input.setCatchBackKey(true);
Effects.setShakeFalloff(10000f); Effects.setShakeFalloff(10000f);
content.initialize(Content::init); content.initialize(Content::init);
Core.atlas = new Atlas("sprites.atlas"); Core.atlas = new TextureAtlas("sprites/sprites.atlas");
Core.atlas.setErrorRegion("error");
content.initialize(Content::load); content.initialize(Content::load);
unlocks.load(); unlocks.load();
DefaultKeybinds.load(); Core.settings.setAppName(appName);
Core.settings.defaults(
Settings.defaultList(
"ip", "localhost", "ip", "localhost",
"color-0", Color.rgba8888(playerColors[8]), "color-0", Color.rgba8888(playerColors[8]),
"color-1", Color.rgba8888(playerColors[11]), "color-1", Color.rgba8888(playerColors[11]),
@@ -77,15 +76,13 @@ public class Control extends Module{
"lastBuild", 0 "lastBuild", 0
); );
KeyBinds.load();
addPlayer(0); addPlayer(0);
saves.load(); saves.load();
Events.on(StateChangeEvent.class, event -> { Events.on(StateChangeEvent.class, event -> {
if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){ 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);
} }
}); });
@@ -97,9 +94,9 @@ public class Control extends Module{
state.set(State.playing); state.set(State.playing);
}); });
Events.on(WorldLoadGraphicsEvent.class, event -> { Events.on(WorldLoadEvent.class, event -> {
if(mobile){ 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]));
} }
}); });
@@ -115,11 +112,11 @@ public class Control extends Module{
Events.on(WaveEvent.class, event -> { 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){ if(state.wave > last && !state.mode.infiniteResources && !state.mode.disableWaveTimer && world.getSector() == null){
Settings.putInt("hiscore" + world.getMap().name, state.wave); Core.settings.put("hiscore" + world.getMap().name, state.wave);
Settings.save(); Core.settings.save();
hiscore = true; hiscore = true;
} }
@@ -131,13 +128,10 @@ public class Control extends Module{
if(world.getSector() != null && world.getSector().hasSave()){ if(world.getSector() != null && world.getSector().hasSave()){
world.getSector().getSave().delete(); world.getSector().getSave().delete();
} }
threads.runGraphics(() -> {
Effects.shake(5, 6, Core.camera.position.x, Core.camera.position.y); Effects.shake(5, 6, Core.camera.position.x, Core.camera.position.y);
//the restart dialog can show info for any number of scenarios //the restart dialog can show info for any number of scenarios
Call.onGameOver(event.winner); Call.onGameOver(event.winner);
}); });
});
//autohost for pvp sectors //autohost for pvp sectors
Events.on(WorldLoadEvent.class, event -> { Events.on(WorldLoadEvent.class, event -> {
@@ -146,13 +140,11 @@ public class Control extends Module{
Net.host(port); Net.host(port);
players[0].isAdmin = true; players[0].isAdmin = true;
}catch(IOException e){ }catch(IOException e){
ui.showError(Bundles.format("text.server.error", Strings.parseException(e, false))); ui.showError(Core.bundle.format("text.server.error", Strings.parseException(e, false)));
threads.runDelay(() -> state.set(State.menu)); Core.app.post(() -> state.set(State.menu));
} }
} }
}); });
Events.on(WorldLoadEvent.class, event -> threads.runGraphics(() -> Events.fire(new WorldLoadGraphicsEvent())));
} }
public void addPlayer(int index){ public void addPlayer(int index){
@@ -171,9 +163,9 @@ public class Control extends Module{
Player setTo = (index == 0 ? null : players[0]); Player setTo = (index == 0 ? null : players[0]);
Player player = new Player(); Player player = new Player();
player.name = Settings.getString("name"); player.name = Core.settings.getString("name");
player.mech = mobile ? Mechs.starterMobile : Mechs.starterDesktop; 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.isLocal = true;
player.playerIndex = index; player.playerIndex = index;
player.isMobile = mobile; player.isMobile = mobile;
@@ -196,7 +188,7 @@ public class Control extends Module{
} }
inputs[index] = input; inputs[index] = input;
Inputs.addProcessor(input); Core.input.addProcessor(input);
} }
public void removePlayer(){ public void removePlayer(){
@@ -212,10 +204,6 @@ public class Control extends Module{
System.arraycopy(oldi, 0, inputs, 0, inputs.length); System.arraycopy(oldi, 0, inputs, 0, inputs.length);
} }
public void setError(Throwable error){
this.error = error;
}
public InputHandler input(int index){ public InputHandler input(int index){
return inputs[index]; return inputs[index];
} }
@@ -248,7 +236,7 @@ public class Control extends Module{
Recipe recipe = content.recipes().get(i); Recipe recipe = content.recipes().get(i);
if(!recipe.isHidden() && recipe.requirements != null){ if(!recipe.isHidden() && recipe.requirements != null){
for(ItemStack stack : recipe.requirements){ 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)){ if(unlocks.unlockContent(recipe)){
@@ -287,14 +275,14 @@ public class Control extends Module{
Platform.instance.updateRPC(); Platform.instance.updateRPC();
if(!Settings.getBool("4.0-warning-2", false)){ if(!Core.settings.getBool("4.0-warning-2", false)){
Timers.run(5f, () -> { Time.run(5f, () -> {
FloatingDialog dialog = new FloatingDialog("[accent]WARNING![]"); FloatingDialog dialog = new FloatingDialog("WARNING!");
dialog.buttons().addButton("$text.ok", () -> { dialog.buttons().addButton("$text.ok", () -> {
dialog.hide(); dialog.hide();
Settings.putBool("4.0-warning-2", true); Core.settings.put("4.0-warning-2", true);
Settings.save(); Core.settings.save();
}).size(100f, 60f); }).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 beta 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" + "\nThere is currently[scarlet] no sound implemented[]; this is intentional.\n" +
@@ -305,18 +293,8 @@ public class Control extends Module{
} }
} }
/** Called from main logic thread.*/
public void runUpdateLogic(){
if(!state.is(State.menu)){
renderer.minimap.updateUnitArray();
}
}
@Override @Override
public void update(){ public void update(){
if(error != null){
throw new RuntimeException(error);
}
saves.update(); saves.update();
@@ -344,26 +322,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); 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()){ if(ui.chatfrag.chatOpen()){
ui.chatfrag.hide(); ui.chatfrag.hide();
}else if(!ui.paused.isShown() && !ui.hasDialog()){ }else if(!ui.paused.isShown() && !scene.hasDialog()){
ui.paused.show(); ui.paused.show();
state.set(State.paused); 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(); renderer.takeMapScreenshot();
} }
}else{ }else{
if(!state.isPaused()){ if(!state.isPaused()){
Timers.update(); Time.update();
} }
} }
} }
@@ -5,7 +5,7 @@ import io.anuke.mindustry.game.EventType.StateChangeEvent;
import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.game.GameMode;
import io.anuke.mindustry.game.Teams; import io.anuke.mindustry.game.Teams;
import io.anuke.mindustry.net.Net; 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.unitGroups;
import static io.anuke.mindustry.Vars.waveTeam; import static io.anuke.mindustry.Vars.waveTeam;
+12 -17
View File
@@ -1,9 +1,14 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import com.badlogic.gdx.utils.Array;
import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote; 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.core.GameState.State;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.game.EventType.*; 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.ItemStack;
import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.world.Tile; 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.*; import static io.anuke.mindustry.Vars.*;
@@ -33,7 +32,7 @@ import static io.anuke.mindustry.Vars.*;
* <p> * <p>
* This class should <i>not</i> call any outside methods to change state of modules, but instead fire events. * This class should <i>not</i> 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(){ public Logic(){
Events.on(TileChangeEvent.class, event -> { Events.on(TileChangeEvent.class, event -> {
@@ -85,7 +84,7 @@ public class Logic extends Module{
state.gameOver = false; state.gameOver = false;
state.teams = new Teams(); state.teams = new Teams();
Timers.clear(); Time.clear();
Entities.clear(); Entities.clear();
TileEntity.sleepingEntities = 0; TileEntity.sleepingEntities = 0;
@@ -141,7 +140,7 @@ public class Logic extends Module{
@Remote(called = Loc.both) @Remote(called = Loc.both)
public static void onGameOver(Team winner){ public static void onGameOver(Team winner){
threads.runGraphics(() -> ui.restart.show(winner)); ui.restart.show(winner);
netClient.setQuiet(); netClient.setQuiet();
} }
@@ -172,17 +171,13 @@ public class Logic extends Module{
@Override @Override
public void update(){ public void update(){
if(Vars.control != null){
control.runUpdateLogic();
}
if(!state.is(State.menu)){ if(!state.is(State.menu)){
if(!state.isPaused()){ if(!state.isPaused()){
Timers.update(); Time.update();
if(!state.mode.disableWaveTimer && !state.mode.disableWaves && !state.gameOver){ 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){ if(!Net.client() && state.wavetime <= 0 && !state.mode.disableWaves){
+25 -32
View File
@@ -1,14 +1,21 @@
package io.anuke.mindustry.core; 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.Loc;
import io.anuke.annotations.Annotations.PacketPriority; import io.anuke.annotations.Annotations.PacketPriority;
import io.anuke.annotations.Annotations.Remote; import io.anuke.annotations.Annotations.Remote;
import io.anuke.annotations.Annotations.Variant; 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.io.ReusableByteArrayInputStream;
import io.anuke.arc.math.Mathf;
import io.anuke.arc.util.Log;
import io.anuke.arc.util.Time;
import io.anuke.arc.util.serialization.Base64Coder;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
@@ -25,16 +32,6 @@ import io.anuke.mindustry.net.Packets.*;
import io.anuke.mindustry.net.ValidateException; import io.anuke.mindustry.net.ValidateException;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.modules.ItemModule; 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.DataInputStream;
import java.io.IOException; import java.io.IOException;
@@ -43,12 +40,12 @@ import java.util.zip.InflaterInputStream;
import static io.anuke.mindustry.Vars.*; 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 dataTimeout = 60 * 18;
private final static float playerSyncTime = 2; private final static float playerSyncTime = 2;
public final static float viewScale = 2f; public final static float viewScale = 2f;
private Timer timer = new Timer(5); private Interval timer = new Interval(5);
/**Whether the client is currently connecting.*/ /**Whether the client is currently connecting.*/
private boolean connecting = false; private boolean connecting = false;
/**If true, no message will be shown on disconnect.*/ /**If true, no message will be shown on disconnect.*/
@@ -114,7 +111,7 @@ public class NetClient extends Module{
Net.handleClient(Disconnect.class, packet -> { Net.handleClient(Disconnect.class, packet -> {
if(quiet) return; if(quiet) return;
Timers.runTask(3f, ui.loadfrag::hide); Time.runTask(3f, ui.loadfrag::hide);
state.set(State.menu); state.set(State.menu);
@@ -168,7 +165,6 @@ public class NetClient extends Module{
netClient.disconnectQuietly(); netClient.disconnectQuietly();
state.set(State.menu); state.set(State.menu);
threads.runGraphics(() -> {
if(!reason.quiet){ if(!reason.quiet){
if(reason.extraText() != null){ if(reason.extraText() != null){
ui.showText(reason.toString(), reason.extraText()); ui.showText(reason.toString(), reason.extraText());
@@ -177,12 +173,11 @@ public class NetClient extends Module{
} }
} }
ui.loadfrag.hide(); ui.loadfrag.hide();
});
} }
@Remote(variants = Variant.both) @Remote(variants = Variant.both)
public static void onInfoMessage(String message){ public static void onInfoMessage(String message){
threads.runGraphics(() -> ui.showText("", message)); ui.showText("", message);
} }
@Remote(variants = Variant.both) @Remote(variants = Variant.both)
@@ -193,7 +188,6 @@ public class NetClient extends Module{
ui.chatfrag.clearMessages(); ui.chatfrag.clearMessages();
Net.setClientLoaded(false); Net.setClientLoaded(false);
threads.runGraphics(() -> {
ui.loadfrag.show("$text.connecting.data"); ui.loadfrag.show("$text.connecting.data");
ui.loadfrag.setButton(() -> { ui.loadfrag.setButton(() -> {
@@ -202,7 +196,6 @@ public class NetClient extends Module{
netClient.quiet = true; netClient.quiet = true;
Net.disconnect(); Net.disconnect();
}); });
});
} }
@Remote(variants = Variant.one) @Remote(variants = Variant.one)
@@ -347,7 +340,7 @@ public class NetClient extends Module{
}else if(!connecting){ }else if(!connecting){
Net.disconnect(); Net.disconnect();
}else{ //...must be connecting }else{ //...must be connecting
timeoutTime += Timers.delta(); timeoutTime += Time.delta();
if(timeoutTime > dataTimeout){ if(timeoutTime > dataTimeout){
Log.err("Failed to load data!"); Log.err("Failed to load data!");
ui.loadfrag.hide(); ui.loadfrag.hide();
@@ -369,8 +362,8 @@ public class NetClient extends Module{
ui.loadfrag.hide(); ui.loadfrag.hide();
ui.join.hide(); ui.join.hide();
Net.setClientLoaded(true); Net.setClientLoaded(true);
Gdx.app.postRunnable(Call::connectConfirm); Core.app.post(Call::connectConfirm);
Timers.runTask(40f, Platform.instance::updateRPC); Time.runTask(40f, Platform.instance::updateRPC);
} }
private void reset(){ private void reset(){
@@ -422,13 +415,13 @@ public class NetClient extends Module{
requests[i] = player.getPlaceQueue().get(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.pointerX, player.pointerY, player.rotation, player.baseRotation,
player.getVelocity().x, player.getVelocity().y, player.getVelocity().x, player.getVelocity().y,
player.getMineTile(), player.getMineTile(),
player.isBoosting, player.isShooting, requests, player.isBoosting, player.isShooting, requests,
Core.camera.position.x, Core.camera.position.y, 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)){ if(timer.get(1, 60)){
@@ -437,14 +430,14 @@ public class NetClient extends Module{
} }
String getUsid(String ip){ String getUsid(String ip){
if(Settings.getString("usid-" + ip, null) != null){ if(Core.settings.getString("usid-" + ip, null) != null){
return Settings.getString("usid-" + ip, null); return Core.settings.getString("usid-" + ip, null);
}else{ }else{
byte[] bytes = new byte[8]; byte[] bytes = new byte[8];
new Random().nextBytes(bytes); new Random().nextBytes(bytes);
String result = new String(Base64Coder.encode(bytes)); String result = new String(Base64Coder.encode(bytes));
Settings.putString("usid-" + ip, result); Core.settings.put("usid-" + ip, result);
Settings.save(); Core.settings.save();
return result; return result;
} }
} }
+36 -34
View File
@@ -1,15 +1,26 @@
package io.anuke.mindustry.core; 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.Loc;
import io.anuke.annotations.Annotations.Remote; 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.Mechs;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
@@ -21,22 +32,13 @@ import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.Version; import io.anuke.mindustry.game.Version;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.gen.RemoteReadServer; 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.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.net.Packets.*;
import io.anuke.mindustry.world.Tile; 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.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
@@ -48,7 +50,7 @@ import java.util.zip.DeflaterOutputStream;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
public class NetServer extends Module{ public class NetServer implements ApplicationListener{
public final static int maxSnapshotSize = 2047; public final static int maxSnapshotSize = 2047;
public final static boolean debugSnapshots = false; public final static boolean debugSnapshots = false;
@@ -122,7 +124,7 @@ public class NetServer extends Module{
return; return;
} }
if(TimeUtils.millis() - info.lastKicked < kickDuration){ if(Time.millis() - info.lastKicked < kickDuration){
kick(id, KickReason.recentKick); kick(id, KickReason.recentKick);
return; return;
} }
@@ -256,7 +258,7 @@ public class NetServer extends Module{
private static void scheduleSnapshot(Runnable r){ private static void scheduleSnapshot(Runnable r){
if(debugSnapshots){ if(debugSnapshots){
if(!Mathf.chance(snapshotDropchance)){ if(!Mathf.chance(snapshotDropchance)){
Timers.run(maxSnapshotDelay / 1000f * 60f, r); Time.run(maxSnapshotDelay / 1000f * 60f, r);
} }
}else{ }else{
r.run(); r.run();
@@ -311,14 +313,14 @@ public class NetServer extends Module{
boolean verifyPosition = !player.isDead() && netServer.admins.getStrict() && headless && player.getCarrier() == null; 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.viewX = viewX;
connection.viewY = viewY; connection.viewY = viewY;
connection.viewWidth = viewWidth; connection.viewWidth = viewWidth;
connection.viewHeight = viewHeight; 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 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); float maxMove = elapsed / 1000f * 60f * Math.min(compound(maxSpeed, player.mech.drag) * 1.25f, player.mech.maxSpeed * 1.1f);
@@ -357,7 +359,7 @@ public class NetServer extends Module{
player.y = prevy; player.y = prevy;
newx = x; newx = x;
newy = y; 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 Call.onPositionSet(player.con.id, newx, newy); //teleport and correct position when necessary
} }
@@ -370,7 +372,7 @@ public class NetServer extends Module{
player.getVelocity().set(xVelocity, yVelocity); //only for visual calculation purposes, doesn't actually update the player player.getVelocity().set(xVelocity, yVelocity); //only for visual calculation purposes, doesn't actually update the player
connection.lastRecievedClientSnapshot = snapshotID; connection.lastRecievedClientSnapshot = snapshotID;
connection.lastRecievedClientTime = TimeUtils.millis(); connection.lastRecievedClientTime = Time.millis();
} }
@Remote(targets = Loc.client, called = Loc.server) @Remote(targets = Loc.client, called = Loc.server)
@@ -436,8 +438,8 @@ public class NetServer extends Module{
if(!headless && !closing && Net.server() && state.is(State.menu)){ if(!headless && !closing && Net.server() && state.is(State.menu)){
closing = true; closing = true;
threads.runGraphics(() -> ui.loadfrag.show("$text.server.closing")); ui.loadfrag.show("$text.server.closing");
Timers.runTask(5f, () -> { Time.runTask(5f, () -> {
Net.closeServer(); Net.closeServer();
ui.loadfrag.hide(); ui.loadfrag.hide();
closing = false; closing = false;
@@ -469,12 +471,12 @@ public class NetServer extends Module{
if(player != null && (reason == KickReason.kick || reason == KickReason.banned) && player.uuid != null){ if(player != null && (reason == KickReason.kick || reason == KickReason.banned) && player.uuid != null){
PlayerInfo info = admins.getInfo(player.uuid); PlayerInfo info = admins.getInfo(player.uuid);
info.timesKicked++; info.timesKicked++;
info.lastKicked = TimeUtils.millis(); info.lastKicked = Time.millis();
} }
Call.onKick(connection, reason); Call.onKick(connection, reason);
Timers.runTask(2f, con::close); Time.runTask(2f, con::close);
admins.save(); admins.save();
} }
@@ -498,7 +500,7 @@ public class NetServer extends Module{
} }
//write timestamp //write timestamp
dataStream.writeLong(TimeUtils.millis()); dataStream.writeLong(Time.millis());
int totalGroups = 0; int totalGroups = 0;
@@ -618,7 +620,7 @@ public class NetServer extends Module{
if(!player.timer.get(Player.timerSync, serverSyncTime) || !connection.hasConnected) continue; if(!player.timer.get(Player.timerSync, serverSyncTime) || !connection.hasConnected) continue;
//reset stream to begin writing //reset stream to begin writing
Timers.mark(); Time.mark();
syncStream.reset(); syncStream.reset();
writeSnapshot(player, dataStream); writeSnapshot(player, dataStream);
+17 -19
View File
@@ -1,15 +1,13 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import com.badlogic.gdx.Gdx; import io.anuke.arc.Core;
import com.badlogic.gdx.Input.Keys; import io.anuke.arc.files.FileHandle;
import com.badlogic.gdx.files.FileHandle; import io.anuke.arc.function.Consumer;
import com.badlogic.gdx.utils.Base64Coder; import io.anuke.arc.input.KeyCode;
import io.anuke.ucore.core.Core; import io.anuke.arc.scene.ui.Dialog;
import io.anuke.ucore.core.Settings; import io.anuke.arc.scene.ui.TextField;
import io.anuke.ucore.core.Timers; import io.anuke.arc.util.Time;
import io.anuke.ucore.function.Consumer; import io.anuke.arc.util.serialization.Base64Coder;
import io.anuke.ucore.scene.ui.Dialog;
import io.anuke.ucore.scene.ui.TextField;
import java.util.Random; import java.util.Random;
@@ -39,12 +37,12 @@ public abstract class Platform {
.visible(() -> !use[0].getSelection().isEmpty()).width(65f); .visible(() -> !use[0].getSelection().isEmpty()).width(65f);
dialog.content().addImageButton("icon-paste", "clear", 16*3, () -> dialog.content().addImageButton("icon-paste", "clear", 16*3, () ->
use[0].paste(Gdx.app.getClipboard().getContents(), false)) use[0].paste(Core.app.getClipboard().getContents(), false))
.visible(() -> Gdx.app.getClipboard() != null && Gdx.app.getClipboard().getContents() != null && !Gdx.app.getClipboard().getContents().isEmpty()).width(65f); .visible(() -> Core.app.getClipboard() != null && Core.app.getClipboard().getContents() != null && !Core.app.getClipboard().getContents().isEmpty()).width(65f);
TextField to = dialog.content().addField(field.getText(), t-> {}).pad(15).width(250f).get(); TextField to = dialog.content().addField(field.getText(), t-> {}).pad(15).width(250f).get();
to.setMaxLength(maxLength); to.setMaxLength(maxLength);
to.keyDown(Keys.ENTER, () -> dialog.content().find("okb").fireClick()); to.keyDown(KeyCode.ENTER, () -> dialog.content().find("okb").fireClick());
use[0] = to; use[0] = to;
@@ -53,14 +51,14 @@ public abstract class Platform {
field.appendText(to.getText()); field.appendText(to.getText());
field.change(); field.change();
dialog.hide(); dialog.hide();
Gdx.input.setOnscreenKeyboardVisible(false); Core.input.setOnscreenKeyboardVisible(false);
}).width(90f).name("okb"); }).width(90f).name("okb");
dialog.show(); dialog.show();
Timers.runTask(1f, () -> { Time.runTask(1f, () -> {
to.setCursorPosition(to.getText().length()); to.setCursorPosition(to.getText().length());
Core.scene.setKeyboardFocus(to); Core.scene.setKeyboardFocus(to);
Gdx.input.setOnscreenKeyboardVisible(true); Core.input.setOnscreenKeyboardVisible(true);
}); });
}); });
} }
@@ -76,13 +74,13 @@ public abstract class Platform {
} }
/**Must be a base64 string 8 bytes in length.*/ /**Must be a base64 string 8 bytes in length.*/
public String getUUID(){ public String getUUID(){
String uuid = Settings.getString("uuid", ""); String uuid = Core.settings.getString("uuid", "");
if(uuid.isEmpty()){ if(uuid.isEmpty()){
byte[] result = new byte[8]; byte[] result = new byte[8];
new Random().nextBytes(result); new Random().nextBytes(result);
uuid = new String(Base64Coder.encode(result)); uuid = new String(Base64Coder.encode(result));
Settings.putString("uuid", uuid); Core.settings.put("uuid", uuid);
Settings.save(); Core.settings.save();
return uuid; return uuid;
} }
return uuid; return uuid;
+103 -184
View File
@@ -1,16 +1,26 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import com.badlogic.gdx.Gdx; import io.anuke.arc.ApplicationListener;
import com.badlogic.gdx.files.FileHandle; import io.anuke.arc.Core;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.entities.Effects;
import com.badlogic.gdx.graphics.Pixmap; import io.anuke.arc.entities.EntityDraw;
import com.badlogic.gdx.graphics.PixmapIO; import io.anuke.arc.entities.EntityGroup;
import com.badlogic.gdx.graphics.g2d.SpriteBatch; import io.anuke.arc.entities.impl.EffectEntity;
import com.badlogic.gdx.math.Rectangle; import io.anuke.arc.entities.trait.DrawTrait;
import com.badlogic.gdx.math.Vector2; import io.anuke.arc.entities.trait.Entity;
import com.badlogic.gdx.utils.BufferUtils; import io.anuke.arc.function.Consumer;
import com.badlogic.gdx.utils.ScreenUtils; import io.anuke.arc.function.Predicate;
import com.badlogic.gdx.utils.TimeUtils; 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.content.fx.Fx;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Player; 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.entities.units.BaseUnit;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.graphics.*; 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.mindustry.Vars.*;
import static io.anuke.ucore.core.Core.batch;
import static io.anuke.ucore.core.Core.camera;
public class Renderer extends RendererModule{ public class Renderer implements ApplicationListener{
public final Surface effectSurface;
public final BlockRenderer blocks = new BlockRenderer(); public final BlockRenderer blocks = new BlockRenderer();
public final MinimapRenderer minimap = new MinimapRenderer(); public final MinimapRenderer minimap = new MinimapRenderer();
public final OverlayRenderer overlays = new OverlayRenderer(); 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 Rectangle rect = new Rectangle(), rect2 = new Rectangle();
private Vector2 avgPosition = new Translator(); private Vector2 avgPosition = new Vector2();
private float shakeIntensity, shaketime;
public Renderer(){ public Renderer(){
Core.batch = new SpriteBatch(4096); batch = new SpriteBatch(4096);
camera = new Camera();
Lines.setCircleVertices(14); Lines.setCircleVertices(14);
Shaders.init(); 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) -> { Effects.setEffectProvider((effect, color, x, y, rotation, data) -> {
if(effect == Fx.none) return; if(effect == Fx.none) return;
if(Settings.getBool("effects")){ if(Core.settings.getBool("effects")){
Rectangle view = rect.setSize(camera.viewportWidth, camera.viewportHeight) Rectangle view = rect.setSize(camera.width, camera.height)
.setCenter(camera.position.x, camera.position.y); .setCenter(camera.position.x, camera.position.y);
Rectangle pos = rect2.setSize(effect.size).setCenter(x, y); Rectangle pos = rect2.setSize(effect.size).setCenter(x, y);
if(view.overlaps(pos)){ if(view.overlaps(pos)){
if(!(effect instanceof GroundEffect)){ if(!(effect instanceof GroundEffect)){
EffectEntity entity = Pooling.obtain(EffectEntity.class, EffectEntity::new); EffectEntity entity = Pools.obtain(EffectEntity.class, EffectEntity::new);
entity.effect = effect; entity.effect = effect;
entity.color = color; entity.color = color;
entity.rotation = rotation; entity.rotation = rotation;
@@ -87,9 +80,9 @@ public class Renderer extends RendererModule{
if(data instanceof Entity){ if(data instanceof Entity){
entity.setParent((Entity) data); entity.setParent((Entity) data);
} }
threads.runGraphics(() -> effectGroup.add(entity)); effectGroup.add(entity);
}else{ }else{
GroundEffectEntity entity = Pooling.obtain(GroundEffectEntity.class, GroundEffectEntity::new); GroundEffectEntity entity = Pools.obtain(GroundEffectEntity.class, GroundEffectEntity::new);
entity.effect = effect; entity.effect = effect;
entity.color = color; entity.color = color;
entity.rotation = rotation; entity.rotation = rotation;
@@ -99,30 +92,13 @@ public class Renderer extends RendererModule{
if(data instanceof Entity){ if(data instanceof Entity){
entity.setParent((Entity) data); 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); clearColor = new Color(0f, 0f, 0f, 1f);
effectSurface = Graphics.createSurface(Core.cameraScale);
pixelSurface = Graphics.createSurface(Core.cameraScale);
}
@Override
public void init(){
} }
@Override @Override
@@ -130,84 +106,64 @@ public class Renderer extends RendererModule{
//TODO hack, find source of this bug //TODO hack, find source of this bug
Color.WHITE.set(1f, 1f, 1f, 1f); Color.WHITE.set(1f, 1f, 1f, 1f);
if(Core.cameraScale != targetscale){ camerascale = Mathf.lerpDelta(camerascale, targetscale, 0.1f);
float targetzoom = (float) Core.cameraScale / targetscale; camera.width = graphics.getWidth() / camerascale;
camera.zoom = Mathf.lerpDelta(camera.zoom, targetzoom, 0.2f); camera.height = graphics.getHeight() / camerascale;
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);
}
if(state.is(State.menu)){ if(state.is(State.menu)){
Graphics.clear(Color.BLACK); graphics.clear(Color.BLACK);
}else{ }else{
Vector2 position = averagePosition(); Vector2 position = averagePosition();
if(players[0].isDead()){ if(players[0].isDead()){
TileEntity core = players[0].getClosestCore(); TileEntity core = players[0].getClosestCore();
if(core != null && players[0].spawner == Unit.noSpawner){ 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{ }else{
smoothCamera(position.x + 0.0001f, position.y + 0.0001f, 0.08f); camera.position.lerpDelta(position, 0.08f);
} }
}else if(!mobile){ }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.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); 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); 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(); draw();
camera.position.set(lastx - deltax, lasty - deltay, 0);
} }
if(!ui.chatfrag.chatOpen()){ 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(){ public void draw(){
camera.update(); camera.update();
if(Float.isNaN(Core.camera.position.x) || Float.isNaN(Core.camera.position.y)){
Core.camera.position.x = players[0].x; if(Float.isNaN(camera.position.x) || Float.isNaN(camera.position.y)){
Core.camera.position.y = players[0].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); blocks.floor.drawFloor();
Graphics.clear(clearColor);
blocks.drawFloor();
drawAndInterpolate(groundEffectGroup, e -> e instanceof BelowLiquidTrait); drawAndInterpolate(groundEffectGroup, e -> e instanceof BelowLiquidTrait);
drawAndInterpolate(puddleGroup); drawAndInterpolate(puddleGroup);
@@ -217,26 +173,14 @@ public class Renderer extends RendererModule{
blocks.drawShadows(); blocks.drawShadows();
for(Team team : Team.all){ for(Team team : Team.all){
if(blocks.isTeamShown(team)){ if(blocks.isTeamShown(team)){
boolean outline = team != players[0].getTeam() && team != Team.none;
if(outline){
Shaders.outline.color.set(team.color);
Shaders.outline.color.a = 0.8f;
Graphics.beginShaders(Shaders.outline);
}
blocks.drawTeamBlocks(Layer.block, team); blocks.drawTeamBlocks(Layer.block, team);
if(outline){
Graphics.endShaders();
}
} }
} }
blocks.skipLayer(Layer.block); blocks.skipLayer(Layer.block);
Graphics.shader(Shaders.blockbuild, false); Draw.shader(Shaders.blockbuild, false);
blocks.drawBlocks(Layer.placement); blocks.drawBlocks(Layer.placement);
Graphics.shader(); Draw.shader();
blocks.drawBlocks(Layer.overlay); blocks.drawBlocks(Layer.overlay);
@@ -255,39 +199,36 @@ public class Renderer extends RendererModule{
overlays.drawBottom(); overlays.drawBottom();
drawAndInterpolate(playerGroup, p -> true, Player::drawBuildRequests); drawAndInterpolate(playerGroup, p -> true, Player::drawBuildRequests);
//TODO shield
/*
Graphics.beginShaders(Shaders.shield); Graphics.beginShaders(Shaders.shield);
EntityDraw.draw(shieldGroup); EntityDraw.draw(shieldGroup);
EntityDraw.drawWith(shieldGroup, shield -> true, shield -> ((ShieldEntity)shield).drawOver()); EntityDraw.drawWith(shieldGroup, shield -> true, shield -> ((ShieldEntity)shield).drawOver());
Draw.color(Palette.accent); Draw.color(Palette.accent);
Graphics.endShaders(); Graphics.endShaders();
Draw.color(); Draw.color();
*/
overlays.drawTop(); overlays.drawTop();
if(showFog){ //TODO this isn't necessary anymore
Graphics.surface(); //Graphics.beginCam();
}else{
Graphics.flushSurface();
}
batch.end();
if(showFog){
fog.draw();
}
Graphics.beginCam();
EntityDraw.setClip(false); EntityDraw.setClip(false);
drawAndInterpolate(playerGroup, p -> !p.isDead() && !p.isLocal, Player::drawName); drawAndInterpolate(playerGroup, p -> !p.isDead() && !p.isLocal, Player::drawName);
EntityDraw.setClip(true); EntityDraw.setClip(true);
Graphics.end(); //Graphics.end();
Draw.color(); Draw.color();
Draw.flush();
} }
private void drawFlyerShadows(){ private void drawFlyerShadows(){
Graphics.surface(effectSurface, true, false); //TODO fix flyer shadows
//Graphics.surface(effectSurface, true, false);
float trnsX = -12, trnsY = -13; float trnsX = -12, trnsY = -13;
Draw.color(0, 0, 0, 0.15f);
for(EntityGroup<? extends BaseUnit> group : unitGroups){ for(EntityGroup<? extends BaseUnit> group : unitGroups){
if(!group.isEmpty()){ if(!group.isEmpty()){
@@ -299,8 +240,8 @@ public class Renderer extends RendererModule{
drawAndInterpolate(playerGroup, unit -> unit.isFlying() && !unit.isDead(), player -> player.drawShadow(trnsX, trnsY)); drawAndInterpolate(playerGroup, unit -> unit.isFlying() && !unit.isDead(), player -> player.drawShadow(trnsX, trnsY));
} }
Draw.color(0, 0, 0, 0.15f); //Draw.color(0, 0, 0, 0.15f);
Graphics.flushSurface(); //Graphics.flushSurface();
Draw.color(); Draw.color();
} }
@@ -317,13 +258,13 @@ public class Renderer extends RendererModule{
Shaders.outline.color.set(team.color); Shaders.outline.color.set(team.color);
Shaders.mix.color.set(Color.WHITE); Shaders.mix.color.set(Color.WHITE);
Graphics.beginShaders(Shaders.outline); //Graphics.beginShaders(Shaders.outline);
Graphics.shader(Shaders.mix, true); Draw.shader(Shaders.mix, true);
drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawAll); drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawAll);
drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawAll); drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawAll);
Graphics.shader(); Draw.shader();
blocks.drawTeamBlocks(Layer.turret, team); blocks.drawTeamBlocks(Layer.turret, team);
Graphics.endShaders(); //Graphics.endShaders();
drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawOver); drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawOver);
drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawOver); drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawOver);
@@ -342,22 +283,6 @@ public class Renderer extends RendererModule{
EntityDraw.drawWith(group, toDraw, drawer); 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 Vector2 averagePosition(){ public Vector2 averagePosition(){
avgPosition.setZero(); avgPosition.setZero();
@@ -367,43 +292,37 @@ public class Renderer extends RendererModule{
return avgPosition; return avgPosition;
} }
public void setCameraScale(int amount){ public void scaleCamera(float amount){
targetscale = amount; targetscale += amount;
clampScale(); 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(){ public void clampScale(){
float s = io.anuke.ucore.scene.ui.layout.Unit.dp.scl(1f); float s = io.anuke.arc.scene.ui.layout.Unit.dp.scl(1f);
targetscale = Mathf.clamp(targetscale, Math.round(s * 2), Math.round(s * 5)); targetscale = Mathf.clamp(targetscale, Math.round(s * 1), Math.round(s * 6));
} }
public void takeMapScreenshot(){ 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 w = world.width()*tilesize, h = world.height()*tilesize;
int pw = pixelSurface.width(), ph = pixelSurface.height(); int pw = pixelSurface.width(), ph = pixelSurface.height();
showFog = false; showFog = false;
disableUI = true; disableUI = true;
pixelSurface.setSize(w, h, true); pixelSurface.setSize(w, h, true);
Graphics.getEffectSurface().setSize(w, h, true); Graphics.getEffectSurface().setSize(w, h, true);
Core.camera.viewportWidth = w; camera.width = w;
Core.camera.viewportHeight = h; camera.height = h;
Core.camera.position.x = w/2f + tilesize/2f; camera.position.x = w/2f + tilesize/2f;
Core.camera.position.y = h/2f + tilesize/2f; camera.position.y = h/2f + tilesize/2f;
draw(); draw();
showFog = true; showFog = true;
disableUI = false; disableUI = false;
Core.camera.viewportWidth = vpW; camera.width = vpW;
Core.camera.viewportHeight = vpH; camera.height = vpH;
pixelSurface.getBuffer().begin(); pixelSurface.getBuffer().begin();
byte[] lines = ScreenUtils.getFrameBufferPixels(0, 0, w, h, true); byte[] lines = ScreenUtils.getFrameBufferPixels(0, 0, w, h, true);
@@ -415,14 +334,14 @@ public class Renderer extends RendererModule{
Pixmap fullPixmap = new Pixmap(w, h, Pixmap.Format.RGBA8888); Pixmap fullPixmap = new Pixmap(w, h, Pixmap.Format.RGBA8888);
BufferUtils.copy(lines, 0, fullPixmap.getPixels(), lines.length); 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); PixmapIO.writePNG(file, fullPixmap);
fullPixmap.dispose(); fullPixmap.dispose();
pixelSurface.setSize(pw, ph, false); pixelSurface.setSize(pw, ph, false);
Graphics.getEffectSurface().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()));*/
} }
} }
@@ -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();
}
}
}
}
}
+89 -83
View File
@@ -1,47 +1,50 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import com.badlogic.gdx.Gdx; import io.anuke.arc.ApplicationListener;
import com.badlogic.gdx.Input.Keys; import io.anuke.arc.Core;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.Events;
import com.badlogic.gdx.graphics.Colors; import io.anuke.arc.Graphics.Cursor;
import com.badlogic.gdx.graphics.g2d.BitmapFont; import io.anuke.arc.Graphics.Cursor.SystemCursor;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; import io.anuke.arc.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeFontParameter; import io.anuke.arc.freetype.FreeTypeFontGenerator.FreeTypeFontParameter;
import com.badlogic.gdx.math.Interpolation; import io.anuke.arc.function.Consumer;
import com.badlogic.gdx.utils.Align; 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.editor.MapEditorDialog;
import io.anuke.mindustry.game.EventType.ResizeEvent; import io.anuke.mindustry.game.EventType.ResizeEvent;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.input.InputHandler;
import io.anuke.mindustry.ui.dialogs.*; import io.anuke.mindustry.ui.dialogs.*;
import io.anuke.mindustry.ui.fragments.*; 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.arc.scene.actions.Actions.*;
import static io.anuke.ucore.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; private FreeTypeFontGenerator generator;
public final MenuFragment menufrag = new MenuFragment(); public MenuFragment menufrag;
public final HudFragment hudfrag = new HudFragment(); public HudFragment hudfrag;
public final ChatFragment chatfrag = new ChatFragment(); public ChatFragment chatfrag;
public final PlayerListFragment listfrag = new PlayerListFragment(); public PlayerListFragment listfrag;
public final BackgroundFragment backfrag = new BackgroundFragment(); public BackgroundFragment backfrag;
public final LoadingFragment loadfrag = new LoadingFragment(); public LoadingFragment loadfrag;
public AboutDialog about; public AboutDialog about;
public RestartDialog restart; public RestartDialog restart;
@@ -66,11 +69,24 @@ public class UI extends SceneModule{
public SectorsDialog sectors; public SectorsDialog sectors;
public MissionDialog missions; public MissionDialog missions;
public Cursor drillCursor, unloadCursor;
public UI(){ 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( Dialog.setShowAction(() -> sequence(
alpha(0f), alpha(0f),
originCenter(), 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), scaleTo(0.0f, 1f),
parallel( parallel(
scaleTo(1f, 1f, 0.1f, Interpolation.fade), scaleTo(1f, 1f, 0.1f, Interpolation.fade),
@@ -87,16 +103,31 @@ public class UI extends SceneModule{
TooltipManager.getInstance().animations = false; TooltipManager.getInstance().animations = false;
Settings.setErrorHandler(() -> Timers.run(1f, () -> showError("[crimson]Failed to access local storage.\nSettings will not be saved."))); Core.settings.setErrorHandler(e -> {
e.printStackTrace();
Dialog.closePadR = -1; Core.app.post(() -> showError("Failed to access local storage.\nSettings will not be saved."));
Dialog.closePadT = 5; });
Colors.put("accent", Palette.accent); Colors.put("accent", Palette.accent);
loadCursors();
} }
void generateFonts(){ void loadCursors(){
generator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/pixel.ttf")); 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(Skin skin){
generator = new FreeTypeFontGenerator(Core.files.internal("fonts/pixel.ttf"));
FreeTypeFontParameter param = new FreeTypeFontParameter(); FreeTypeFontParameter param = new FreeTypeFontParameter();
param.size = (int)(14*2 * Math.max(Unit.dp.scl(1f), 0.5f)); param.size = (int)(14*2 * Math.max(Unit.dp.scl(1f), 0.5f));
param.shadowColor = Color.DARK_GRAY; param.shadowColor = Color.DARK_GRAY;
@@ -109,46 +140,23 @@ public class UI extends SceneModule{
skin.getFont("default-font").setOwnsTexture(false); 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 @Override
public void update(){ public void update(){
if(disableUI) return; if(disableUI) return;
if(Graphics.drawing()) Graphics.end(); Core.scene.act();
Core.scene.draw();
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();
} }
@Override @Override
public void init(){ public void init(){
menufrag = new MenuFragment();
hudfrag = new HudFragment();
chatfrag = new ChatFragment();
listfrag = new PlayerListFragment();
backfrag = new BackgroundFragment();
loadfrag = new LoadingFragment();
editor = new MapEditorDialog(); editor = new MapEditorDialog();
controls = new ControlsDialog(); controls = new ControlsDialog();
restart = new RestartDialog(); restart = new RestartDialog();
@@ -172,10 +180,10 @@ public class UI extends SceneModule{
sectors = new SectorsDialog(); sectors = new SectorsDialog();
missions = new MissionDialog(); missions = new MissionDialog();
Group group = Core.scene.getRoot(); Group group = Core.scene.root;
backfrag.build(group); backfrag.build(group);
control.input(0).getFrag().build(Core.scene.getRoot()); control.input(0).getFrag().build(group);
hudfrag.build(group); hudfrag.build(group);
menufrag.build(group); menufrag.build(group);
chatfrag.container().build(group); chatfrag.container().build(group);
@@ -185,14 +193,12 @@ public class UI extends SceneModule{
@Override @Override
public void resize(int width, int height){ public void resize(int width, int height){
super.resize(width, height); Core.scene.resize(width, height);
Events.fire(new ResizeEvent()); Events.fire(new ResizeEvent());
} }
@Override @Override
public void dispose(){ public void dispose(){
super.dispose();
generator.dispose(); generator.dispose();
} }
@@ -202,7 +208,7 @@ public class UI extends SceneModule{
public void loadGraphics(String text, Runnable call){ public void loadGraphics(String text, Runnable call){
loadfrag.show(text); loadfrag.show(text);
Timers.runTask(7f, () -> { Time.runTask(7f, () -> {
call.run(); call.run();
loadfrag.hide(); loadfrag.hide();
}); });
@@ -214,10 +220,10 @@ public class UI extends SceneModule{
public void loadLogic(String text, Runnable call){ public void loadLogic(String text, Runnable call){
loadfrag.show(text); loadfrag.show(text);
Timers.runTask(7f, () -> Time.runTask(7f, () ->
threads.run(() -> { Core.app.post(() -> {
call.run(); call.run();
threads.runGraphics(loadfrag::hide); loadfrag.hide();
})); }));
} }
@@ -292,8 +298,8 @@ public class UI extends SceneModule{
dialog.hide(); dialog.hide();
confirmed.run(); confirmed.run();
}); });
dialog.keyDown(Keys.ESCAPE, dialog::hide); dialog.keyDown(KeyCode.ESCAPE, dialog::hide);
dialog.keyDown(Keys.BACK, dialog::hide); dialog.keyDown(KeyCode.BACK, dialog::hide);
dialog.show(); dialog.show();
} }
+25 -21
View File
@@ -1,8 +1,17 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import com.badlogic.gdx.math.GridPoint2; import io.anuke.arc.ApplicationListener;
import com.badlogic.gdx.utils.Array; import io.anuke.arc.Core;
import com.badlogic.gdx.utils.ObjectMap; 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.BlockIndexer;
import io.anuke.mindustry.ai.Pathfinder; import io.anuke.mindustry.ai.Pathfinder;
import io.anuke.mindustry.ai.WaveSpawner; 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.Pos;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.OreBlock; 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.*; import static io.anuke.mindustry.Vars.*;
public class World extends Module{ public class World implements ApplicationListener{
public final Maps maps = new Maps(); public final Maps maps = new Maps();
public final Sectors sectors = new Sectors(); public final Sectors sectors = new Sectors();
public final WorldGenerator generator = new WorldGenerator(); public final WorldGenerator generator = new WorldGenerator();
@@ -38,7 +42,7 @@ public class World extends Module{
private Sector currentSector; private Sector currentSector;
private Tile[][] tiles; private Tile[][] tiles;
private Array<Tile> tempTiles = new ThreadArray<>(); private Array<Tile> tempTiles = new Array<>();
private boolean generating, invalidMap; private boolean generating, invalidMap;
public World(){ public World(){
@@ -121,11 +125,11 @@ public class World extends Module{
} }
public Tile tileWorld(float x, float y){ 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){ public int toTile(float coord){
return Mathf.scl2(coord, tilesize); return Math.round(coord / tilesize);
} }
public Tile[][] getTiles(){ public Tile[][] getTiles(){
@@ -209,8 +213,8 @@ public class World extends Module{
currentSector = sector; currentSector = sector;
state.difficulty = sectors.getDifficulty(sector); state.difficulty = sectors.getDifficulty(sector);
state.mode = sector.currentMission().getMode(); state.mode = sector.currentMission().getMode();
Timers.mark(); Time.mark();
Timers.mark(); Time.mark();
logic.reset(); logic.reset();
@@ -247,7 +251,7 @@ public class World extends Module{
Log.err(e); Log.err(e);
if(!headless){ if(!headless){
ui.showError("$text.map.invalid"); ui.showError("$text.map.invalid");
threads.runDelay(() -> state.set(State.menu)); Core.app.post(() -> state.set(State.menu));
invalidMap = true; invalidMap = true;
} }
generating = false; generating = false;
@@ -277,13 +281,13 @@ public class World extends Module{
invalidMap = false; invalidMap = false;
} }
if(invalidMap) threads.runDelay(() -> state.set(State.menu)); if(invalidMap) Core.app.post(() -> state.set(State.menu));
} }
public void notifyChanged(Tile tile){ public void notifyChanged(Tile tile){
if(!generating){ 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. * Raycast, but with world coordinates.
*/ */
public GridPoint2 raycastWorld(float x, float y, float x2, float y2){ public Point2 raycastWorld(float x, float y, float x2, float y2){
return raycast(Mathf.scl2(x, tilesize), Mathf.scl2(y, tilesize), return raycast(Math.round(x / tilesize), Math.round(y / tilesize),
Mathf.scl2(x2, tilesize), Mathf.scl2(y2, 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. * @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 x0 = x0f;
int y0 = y0f; int y0 = y0f;
int dx = Math.abs(x1 - x0); int dx = Math.abs(x1 - x0);
@@ -1,10 +1,10 @@
package io.anuke.mindustry.editor; package io.anuke.mindustry.editor;
import com.badlogic.gdx.utils.Array; import io.anuke.arc.collection.Array;
import com.badlogic.gdx.utils.IntSet; import io.anuke.arc.collection.IntSet;
import io.anuke.arc.util.Pack;
import io.anuke.mindustry.maps.MapTileData; import io.anuke.mindustry.maps.MapTileData;
import io.anuke.mindustry.maps.MapTileData.TileDataMarker; import io.anuke.mindustry.maps.MapTileData.TileDataMarker;
import io.anuke.ucore.util.Bits;
public class DrawOperation{ public class DrawOperation{
/** /**
@@ -29,7 +29,7 @@ public class DrawOperation{
} }
public boolean checkDuplicate(short x, short y){ 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; if(checks.contains(i)) return true;
checks.add(i); checks.add(i);
@@ -1,15 +1,15 @@
package io.anuke.mindustry.editor; 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.content.blocks.Blocks;
import io.anuke.mindustry.maps.MapTileData; import io.anuke.mindustry.maps.MapTileData;
import io.anuke.mindustry.maps.MapTileData.DataPosition; import io.anuke.mindustry.maps.MapTileData.DataPosition;
import io.anuke.mindustry.maps.MapTileData.TileDataMarker; import io.anuke.mindustry.maps.MapTileData.TileDataMarker;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.Floor; 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.content;
import static io.anuke.mindustry.Vars.ui; import static io.anuke.mindustry.Vars.ui;
@@ -24,8 +24,8 @@ public enum EditorTool{
byte link = editor.getMap().read(x, y, DataPosition.link); byte link = editor.getMap().read(x, y, DataPosition.link);
if(link != 0){ if(link != 0){
x -= (Bits.getLeftByte(link) - 8); x -= (Pack.leftByte(link) - 8);
y -= (Bits.getRightByte(link) - 8); y -= (Pack.rightByte(link) - 8);
bf = editor.getMap().read(x, y, DataPosition.floor); bf = editor.getMap().read(x, y, DataPosition.floor);
bw = editor.getMap().read(x, y, DataPosition.wall); bw = editor.getMap().read(x, y, DataPosition.wall);
} }
@@ -101,7 +101,7 @@ public enum EditorTool{
byte bw = data.read(x, y, DataPosition.wall); byte bw = data.read(x, y, DataPosition.wall);
be = data.read(x, y, DataPosition.elevation); be = data.read(x, y, DataPosition.elevation);
boolean synth = editor.getDrawBlock().synthetic(); 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; dest = floor ? bf : bw;
byte draw = editor.getDrawBlock().id; byte draw = editor.getDrawBlock().id;
@@ -1,6 +1,9 @@
package io.anuke.mindustry.editor; 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.Vars;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.editor.DrawOperation.TileOperation; 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.maps.MapTileData.TileDataMarker;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.Floor; 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; import static io.anuke.mindustry.Vars.content;
public class MapEditor{ public class MapEditor{
public static final int[] brushSizes = {1, 2, 3, 4, 5, 9, 15}; public static final int[] brushSizes = {1, 2, 3, 4, 5, 9, 15};
@@ -103,7 +105,7 @@ public class MapEditor{
byte writeID = drawBlock.id; byte writeID = drawBlock.id;
byte partID = Blocks.blockpart.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; boolean isfloor = drawBlock instanceof Floor && drawBlock != Blocks.air;
@@ -126,13 +128,13 @@ public class MapEditor{
if(i == 1){ if(i == 1){
map.write(worldx, worldy, DataPosition.wall, partID); map.write(worldx, worldy, DataPosition.wall, partID);
map.write(worldx, worldy, DataPosition.rotationTeam, rotationTeam); 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{ }else{
byte link = map.read(worldx, worldy, DataPosition.link); byte link = map.read(worldx, worldy, DataPosition.link);
byte block = map.read(worldx, worldy, DataPosition.wall); byte block = map.read(worldx, worldy, DataPosition.wall);
if(link != 0){ 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()){ }else if(content.block(block).isMultiblock()){
removeLinked(worldx, worldy); removeLinked(worldx, worldy);
} }
@@ -170,7 +172,7 @@ public class MapEditor{
if(content.block(map.read(wx, wy, DataPosition.wall)).isMultiblock()){ if(content.block(map.read(wx, wy, DataPosition.wall)).isMultiblock()){
removeLinked(wx, wy); removeLinked(wx, wy);
}else if(link != 0){ }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));
} }
} }
@@ -1,15 +1,22 @@
package io.anuke.mindustry.editor; package io.anuke.mindustry.editor;
import com.badlogic.gdx.Gdx; import io.anuke.arc.Core;
import com.badlogic.gdx.files.FileHandle; import io.anuke.arc.collection.ObjectMap;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.files.FileHandle;
import com.badlogic.gdx.graphics.Pixmap; import io.anuke.arc.function.Consumer;
import com.badlogic.gdx.graphics.g2d.Batch; import io.anuke.arc.graphics.Color;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.arc.graphics.Pixmap;
import com.badlogic.gdx.math.Vector2; import io.anuke.arc.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.Align; import io.anuke.arc.input.KeyCode;
import com.badlogic.gdx.utils.Disposable; import io.anuke.arc.math.Mathf;
import com.badlogic.gdx.utils.ObjectMap; 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.Vars;
import io.anuke.mindustry.content.blocks.StorageBlocks; import io.anuke.mindustry.content.blocks.StorageBlocks;
import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.core.Platform;
@@ -21,23 +28,6 @@ import io.anuke.mindustry.maps.MapTileData;
import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.ui.dialogs.FloatingDialog; import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import io.anuke.mindustry.world.Block; 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.DataInputStream;
import java.io.InputStream; import java.io.InputStream;
@@ -106,7 +96,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
editor.beginEdit(data, meta.tags, false); editor.beginEdit(data, meta.tags, false);
view.clearStack(); view.clearStack();
}catch(Exception e){ }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); Log.err(e);
} }
}), true, mapExtension), }), true, mapExtension),
@@ -120,7 +110,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
editor.beginEdit(data, editor.getTags(), false); editor.beginEdit(data, editor.getTags(), false);
view.clearStack(); view.clearStack();
}catch (Exception e){ }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); Log.err(e);
} }
}), true, "png") }), true, "png")
@@ -139,7 +129,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
} }
MapIO.writeMap(result.write(false), editor.getTags(), editor.getMap()); MapIO.writeMap(result.write(false), editor.getTags(), editor.getMap());
}catch(Exception e){ }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); Log.err(e);
} }
}); });
@@ -175,7 +165,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
editor.beginEdit(data, meta.tags, false); editor.beginEdit(data, meta.tags, false);
view.clearStack(); view.clearStack();
}catch(Exception e){ }catch(Exception e){
ui.showError(Bundles.format("text.editor.errormapload", Strings.parseException(e, false))); ui.showError(Core.bundle.format("text.editor.errormapload", Strings.parseException(e, false)));
Log.err(e); Log.err(e);
} }
})); }));
@@ -191,7 +181,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
return; 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()){ if(v.x >= 0 && v.y >= 0 && v.x <= pane.getWidth() && v.y <= pane.getHeight()){
Core.scene.setScrollFocus(pane); Core.scene.setScrollFocus(pane);
@@ -214,7 +204,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
} }
shownWithMap = false; shownWithMap = false;
Timers.runTask(10f, Platform.instance::updateRPC); Time.runTask(10f, Platform.instance::updateRPC);
}); });
hidden(() -> { hidden(() -> {
@@ -224,8 +214,8 @@ public class MapEditorDialog extends Dialog implements Disposable{
} }
@Override @Override
protected void drawBackground(Batch batch, float parentAlpha, float x, float y){ protected void drawBackground(float x, float y){
drawDefaultBackground(batch, parentAlpha, x, y); drawDefaultBackground(x, y);
} }
private void save(){ private void save(){
@@ -311,7 +301,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
show(); show();
}catch(Exception e){ }catch(Exception e){
Log.err(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)));
} }
}); });
} }
@@ -341,8 +331,8 @@ public class MapEditorDialog extends Dialog implements Disposable{
public void build(){ public void build(){
float amount = 10f, baseSize = 60f; float amount = 10f, baseSize = 60f;
float size = mobile ? (int) (Math.min(Gdx.graphics.getHeight(), Gdx.graphics.getWidth()) / amount / Unit.dp.scl(1f)) : float size = mobile ? (int) (Math.min(Core.graphics.getHeight(), Core.graphics.getWidth()) / amount / Unit.dp.scl(1f)) :
Math.min(Gdx.graphics.getDisplayMode().height / amount, baseSize); Math.min(Core.graphics.getDisplayMode().height / amount, baseSize);
clearChildren(); clearChildren();
table(cont -> { table(cont -> {
@@ -409,7 +399,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
tools.row(); tools.row();
tools.table("underline", t -> t.add("$text.editor.teams")) 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(); tools.row();
@@ -447,7 +437,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
mid.row(); mid.row();
mid.table("underline", t -> t.add("$text.editor.elevation")) 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(); mid.row();
@@ -460,8 +450,8 @@ public class MapEditorDialog extends Dialog implements Disposable{
.size(size).get().setAlignment(Align.center, Align.center); .size(size).get().setAlignment(Align.center, Align.center);
t.addImageButton("icon-arrow-right", "clear-partial", 16 * 2f, () -> editor.setDrawElevation(editor.getDrawElevation() + 1)) t.addImageButton("icon-arrow-right", "clear-partial", 16 * 2f, () -> editor.setDrawElevation(editor.getDrawElevation() + 1))
.disabled(b -> editor.getDrawElevation() >= 63).size(size); .disabled(b -> editor.getDrawElevation() >= 63).size(size).name("aaaaa");
}).colspan(3).height(size).width(size * 3f); }).colspan(3).height(size).width(size * 3f + 3f);
}).margin(0).left().growY(); }).margin(0).left().growY();
@@ -476,35 +466,35 @@ public class MapEditorDialog extends Dialog implements Disposable{
private void doInput(){ private void doInput(){
//tool select //tool select
for(int i = 0; i < EditorTool.values().length; i++){ 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]); view.setTool(EditorTool.values()[i]);
break; break;
} }
} }
if(Inputs.keyTap(Input.R)){ if(Core.input.keyTap(KeyCode.R)){
editor.setDrawRotation((editor.getDrawRotation() + 1) % 4); 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)); editor.setDrawRotation(Mathf.mod((editor.getDrawRotation() + 1), 4));
} }
//ctrl keys (undo, redo, save) //ctrl keys (undo, redo, save)
if(UIUtils.ctrl()){ if(UIUtils.ctrl()){
if(Inputs.keyTap(Input.Z)){ if(Core.input.keyTap(KeyCode.Z)){
view.undo(); view.undo();
} }
if(Inputs.keyTap(Input.Y)){ if(Core.input.keyTap(KeyCode.Y)){
view.redo(); view.redo();
} }
if(Inputs.keyTap(Input.S)){ if(Core.input.keyTap(KeyCode.S)){
save(); save();
} }
if(Inputs.keyTap(Input.G)){ if(Core.input.keyTap(KeyCode.G)){
view.setGrid(!view.isGrid()); view.setGrid(!view.isGrid());
} }
} }
@@ -539,7 +529,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
continue; 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(); Stack stack = new Stack();
@@ -1,11 +1,11 @@
package io.anuke.mindustry.editor; 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.core.Platform;
import io.anuke.mindustry.ui.dialogs.FloatingDialog; 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{ public class MapInfoDialog extends FloatingDialog{
private final MapEditor editor; private final MapEditor editor;
@@ -53,10 +53,10 @@ public class MapInfoDialog extends FloatingDialog{
content().add("$text.editor.author").padRight(8).left(); 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); tags.put("author", text);
Settings.putString("mapAuthor", text); Core.settings.put("mapAuthor", text);
Settings.save(); Core.settings.save();
}).size(400, 55f).get(); }).size(400, 55f).get();
author.setMessageText("$text.unknown"); author.setMessageText("$text.unknown");
@@ -1,14 +1,14 @@
package io.anuke.mindustry.editor; 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.maps.Map;
import io.anuke.mindustry.ui.BorderImage; import io.anuke.mindustry.ui.BorderImage;
import io.anuke.mindustry.ui.dialogs.FloatingDialog; import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import io.anuke.ucore.function.Consumer; import io.anuke.arc.function.Consumer;
import io.anuke.ucore.scene.ui.ButtonGroup; import io.anuke.arc.scene.ui.ButtonGroup;
import io.anuke.ucore.scene.ui.ScrollPane; import io.anuke.arc.scene.ui.ScrollPane;
import io.anuke.ucore.scene.ui.TextButton; import io.anuke.arc.scene.ui.TextButton;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.arc.scene.ui.layout.Table;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
@@ -1,21 +1,20 @@
package io.anuke.mindustry.editor; package io.anuke.mindustry.editor;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.Core;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.arc.collection.IntSet;
import com.badlogic.gdx.math.GridPoint2; import io.anuke.arc.collection.IntSet.IntSetIterator;
import com.badlogic.gdx.utils.Disposable; import io.anuke.arc.graphics.Color;
import com.badlogic.gdx.utils.IntSet; import io.anuke.arc.graphics.g2d.Draw;
import com.badlogic.gdx.utils.IntSet.IntSetIterator; 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.game.Team;
import io.anuke.mindustry.graphics.IndexedRenderer;
import io.anuke.mindustry.maps.MapTileData.DataPosition; import io.anuke.mindustry.maps.MapTileData.DataPosition;
import io.anuke.mindustry.world.Block; 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.content;
import static io.anuke.mindustry.Vars.tilesize; 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){ public void draw(float tx, float ty, float tw, float th){
Graphics.end(); Draw.flush();
IntSetIterator it = updates.iterator(); IntSetIterator it = updates.iterator();
while(it.hasNext){ while(it.hasNext){
@@ -79,15 +78,12 @@ public class MapRenderer implements Disposable{
mesh = chunks[x][y]; mesh = chunks[x][y];
} }
mesh.getTransformMatrix().setToTranslation(tx, ty, 0).scl(tw / (width * tilesize), mesh.getTransformMatrix().setToTranslation(tx, ty).scale(tw / (width * tilesize), th / (height * tilesize));
th / (height * tilesize), 1f); mesh.setProjectionMatrix(Draw.proj());
mesh.setProjectionMatrix(Core.batch.getProjectionMatrix());
mesh.render(Core.atlas.getTextures().first()); mesh.render(Core.atlas.getTextures().first());
} }
} }
Graphics.begin();
} }
public void updatePoint(int x, int y){ 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 bw = editor.getMap().read(wx, wy, DataPosition.wall);
byte btr = editor.getMap().read(wx, wy, DataPosition.rotationTeam); byte btr = editor.getMap().read(wx, wy, DataPosition.rotationTeam);
byte elev = editor.getMap().read(wx, wy, DataPosition.elevation); byte elev = editor.getMap().read(wx, wy, DataPosition.elevation);
byte rotation = Bits.getLeftByte(btr); byte rotation = Pack.leftByte(btr);
Team team = Team.all[Bits.getRightByte(btr)]; Team team = Team.all[Pack.rightByte(btr)];
Block floor = content.block(bf); Block floor = content.block(bf);
Block wall = content.block(bw); Block wall = content.block(bw);
@@ -125,12 +121,12 @@ public class MapRenderer implements Disposable{
if(wall.rotate){ if(wall.rotate){
mesh.draw((wx % chunksize) + (wy % chunksize) * chunksize, region, mesh.draw((wx % chunksize) + (wy % chunksize) * chunksize, region,
wx * tilesize + wall.offset(), wy * tilesize + wall.offset(), wx * tilesize + wall.offset(), wy * tilesize + wall.offset(),
region.getRegionWidth(), region.getRegionHeight(), rotation * 90 - 90); region.getWidth(), region.getHeight(), rotation * 90 - 90);
}else{ }else{
mesh.draw((wx % chunksize) + (wy % chunksize) * chunksize, region, mesh.draw((wx % chunksize) + (wy % chunksize) * chunksize, region,
wx * tilesize + wall.offset() + (tilesize - region.getRegionWidth())/2f, wx * tilesize + wall.offset() + (tilesize - region.getWidth())/2f,
wy * tilesize + wall.offset() + (tilesize - region.getRegionHeight())/2f, wy * tilesize + wall.offset() + (tilesize - region.getHeight())/2f,
region.getRegionWidth(), region.getRegionHeight()); region.getWidth(), region.getHeight());
} }
}else{ }else{
region = floor.getEditorIcon(); region = floor.getEditorIcon();
@@ -142,24 +138,24 @@ public class MapRenderer implements Disposable{
if(wall.update || wall.destructible){ if(wall.update || wall.destructible){
mesh.setColor(team.color); mesh.setColor(team.color);
region = Draw.region("block-border"); region = Core.atlas.find("block-border");
}else if(elev > 0 && check){ }else if(elev > 0 && check){
mesh.setColor(tmpColor.fromHsv((360f * elev / 127f * 4f) % 360f, 0.5f + (elev / 4f) % 0.5f, 1f)); 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){ }else if(elev == -1){
region = Draw.region("block-slope"); region = Core.atlas.find("block-slope");
}else{ }else{
region = Draw.region("clear"); region = Core.atlas.find("clear");
} }
mesh.draw((wx % chunksize) + (wy % chunksize) * chunksize + chunksize * chunksize, region, mesh.draw((wx % chunksize) + (wy % chunksize) * chunksize + chunksize * chunksize, region,
wx * tilesize - (wall.size/3) * tilesize, wy * tilesize - (wall.size/3) * tilesize, wx * tilesize - (wall.size/3) * tilesize, wy * tilesize - (wall.size/3) * tilesize,
region.getRegionWidth(), region.getRegionHeight()); region.getWidth(), region.getHeight());
mesh.setColor(Color.WHITE); mesh.setColor(Color.WHITE);
} }
private boolean checkElevation(byte elev, int x, int y){ 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; int wx = x + p.x, wy = y + p.y;
if(!Structs.inBounds(wx, wy, editor.getMap().width(), editor.getMap().height())){ if(!Structs.inBounds(wx, wy, editor.getMap().width(), editor.getMap().height())){
return true; return true;
@@ -2,11 +2,11 @@ package io.anuke.mindustry.editor;
import io.anuke.mindustry.maps.MapTileData; import io.anuke.mindustry.maps.MapTileData;
import io.anuke.mindustry.ui.dialogs.FloatingDialog; import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import io.anuke.ucore.function.BiConsumer; import io.anuke.arc.function.BiConsumer;
import io.anuke.ucore.scene.ui.ButtonGroup; import io.anuke.arc.scene.ui.ButtonGroup;
import io.anuke.ucore.scene.ui.TextButton; import io.anuke.arc.scene.ui.TextButton;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.ucore.util.Mathf; import io.anuke.arc.math.Mathf;
public class MapResizeDialog extends FloatingDialog{ public class MapResizeDialog extends FloatingDialog{
int[] validMapSizes = {200, 300, 400, 500}; int[] validMapSizes = {200, 300, 400, 500};
@@ -3,9 +3,9 @@ package io.anuke.mindustry.editor;
import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.core.Platform;
import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.maps.Map;
import io.anuke.mindustry.ui.dialogs.FloatingDialog; import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import io.anuke.ucore.function.Consumer; import io.anuke.arc.function.Consumer;
import io.anuke.ucore.scene.ui.TextButton; import io.anuke.arc.scene.ui.TextButton;
import io.anuke.ucore.scene.ui.TextField; import io.anuke.arc.scene.ui.TextField;
import static io.anuke.mindustry.Vars.ui; import static io.anuke.mindustry.Vars.ui;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
+50 -78
View File
@@ -1,32 +1,27 @@
package io.anuke.mindustry.editor; package io.anuke.mindustry.editor;
import com.badlogic.gdx.Input.Buttons; import io.anuke.arc.Core;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.collection.Array;
import com.badlogic.gdx.graphics.g2d.Batch; import io.anuke.arc.graphics.Color;
import com.badlogic.gdx.input.GestureDetector; import io.anuke.arc.graphics.g2d.Draw;
import com.badlogic.gdx.input.GestureDetector.GestureListener; import io.anuke.arc.graphics.g2d.Lines;
import com.badlogic.gdx.math.Bresenham2; import io.anuke.arc.graphics.g2d.ScissorStack;
import com.badlogic.gdx.math.GridPoint2; import io.anuke.arc.input.GestureDetector;
import com.badlogic.gdx.math.Rectangle; import io.anuke.arc.input.GestureDetector.GestureListener;
import com.badlogic.gdx.math.Vector2; import io.anuke.arc.input.KeyCode;
import com.badlogic.gdx.utils.Array; 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.editor.DrawOperation.TileOperation;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.input.Binding;
import io.anuke.mindustry.ui.GridImage; 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.mobile;
import static io.anuke.mindustry.Vars.ui; 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++){ for(int i = 0; i < MapEditor.brushSizes.length; i++){
float size = MapEditor.brushSizes[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)); Core.input.getInputProcessors().insert(0, new GestureDetector(20, 0.5f, 2, 0.15f, this));
setTouchable(Touchable.enabled); touchable(Touchable.enabled);
addListener(new InputListener(){ addListener(new InputListener(){
@@ -74,16 +69,16 @@ public class MapView extends Element implements GestureListener{
} }
@Override @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){ if(pointer != 0){
return false; return false;
} }
if(!mobile && button != Buttons.LEFT && button != Buttons.MIDDLE){ if(!mobile && button != KeyCode.MOUSE_LEFT && button != KeyCode.MOUSE_MIDDLE){
return true; return true;
} }
if(button == Buttons.MIDDLE){ if(button == KeyCode.MOUSE_MIDDLE){
lastTool = tool; lastTool = tool;
tool = EditorTool.zoom; tool = EditorTool.zoom;
} }
@@ -95,7 +90,7 @@ public class MapView extends Element implements GestureListener{
updated = false; updated = false;
GridPoint2 p = project(x, y); Point2 p = project(x, y);
lastx = p.x; lastx = p.x;
lasty = p.y; lasty = p.y;
startx = p.x; startx = p.x;
@@ -112,19 +107,19 @@ public class MapView extends Element implements GestureListener{
} }
@Override @Override
public void touchUp(InputEvent event, float x, float y, int pointer, int button){ public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button){
if(!mobile && button != Buttons.LEFT && button != Buttons.MIDDLE){ if(!mobile && button != KeyCode.MOUSE_LEFT && button != KeyCode.MOUSE_MIDDLE){
return; return;
} }
drawing = false; drawing = false;
GridPoint2 p = project(x, y); Point2 p = project(x, y);
if(tool == EditorTool.line){ if(tool == EditorTool.line){
ui.editor.resetSaved(); ui.editor.resetSaved();
Array<GridPoint2> points = br.line(startx, starty, p.x, p.y); Array<Point2> points = br.line(startx, starty, p.x, p.y);
for(GridPoint2 point : points){ for(Point2 point : points){
editor.draw(point.x, point.y); editor.draw(point.x, point.y);
} }
updated = true; updated = true;
@@ -149,12 +144,12 @@ public class MapView extends Element implements GestureListener{
mousex = x; mousex = x;
mousey = y; mousey = y;
GridPoint2 p = project(x, y); Point2 p = project(x, y);
if(drawing && tool.draggable){ if(drawing && tool.draggable){
ui.editor.resetSaved(); ui.editor.resetSaved();
Array<GridPoint2> points = br.line(lastx, lasty, p.x, p.y); Array<Point2> points = br.line(lastx, lasty, p.x, p.y);
for(GridPoint2 point : points){ for(Point2 point : points){
tool.touched(editor, point.x, point.y); tool.touched(editor, point.x, point.y);
} }
updated = true; updated = true;
@@ -214,16 +209,16 @@ public class MapView extends Element implements GestureListener{
super.act(delta); super.act(delta);
if(Core.scene.getKeyboardFocus() == null || !(Core.scene.getKeyboardFocus() instanceof TextField) && if(Core.scene.getKeyboardFocus() == null || !(Core.scene.getKeyboardFocus() instanceof TextField) &&
!Inputs.keyDown(io.anuke.ucore.input.Input.CONTROL_LEFT)){ !Core.input.keyDown(KeyCode.CONTROL_LEFT)){
float ax = Inputs.getAxis("move_x"); float ax = Core.input.axis(Binding.move_x);
float ay = Inputs.getAxis("move_y"); float ay = Core.input.axis(Binding.move_y);
offsetx -= ax * 15f / zoom; offsetx -= ax * 15f / zoom;
offsety -= ay * 15f / zoom; offsety -= ay * 15f / zoom;
} }
if(ui.editor.hasPane()) return; if(ui.editor.hasPane()) return;
zoom += Inputs.scroll() / 10f * zoom; zoom += Core.input.axis(KeyCode.SCROLL) / 10f * zoom;
clampZoom(); clampZoom();
} }
@@ -231,7 +226,7 @@ public class MapView extends Element implements GestureListener{
zoom = Mathf.clamp(zoom, 0.2f, 12f); 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 ratio = 1f / ((float) editor.getMap().width() / editor.getMap().height());
float size = Math.min(width, height); float size = Math.min(width, height);
float sclwidth = size * zoom; float sclwidth = size * zoom;
@@ -258,7 +253,7 @@ public class MapView extends Element implements GestureListener{
} }
@Override @Override
public void draw(Batch batch, float alpha){ public void draw(){
float ratio = 1f / ((float) editor.getMap().width() / editor.getMap().height()); float ratio = 1f / ((float) editor.getMap().width() / editor.getMap().height());
float size = Math.min(width, height); float size = Math.min(width, height);
float sclwidth = size * zoom; float sclwidth = size * zoom;
@@ -268,7 +263,9 @@ public class MapView extends Element implements GestureListener{
image.setImageSize(editor.getMap().width(), editor.getMap().height()); 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); Draw.color(Palette.remove);
Lines.stroke(2f); Lines.stroke(2f);
@@ -279,7 +276,7 @@ public class MapView extends Element implements GestureListener{
if(grid){ if(grid){
Draw.color(Color.GRAY); Draw.color(Color.GRAY);
image.setBounds(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); image.setBounds(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight);
image.draw(batch, alpha); image.draw();
Draw.color(); Draw.color();
} }
@@ -307,13 +304,13 @@ public class MapView extends Element implements GestureListener{
} }
if(tool.edit && (!mobile || drawing)){ 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); Vector2 v = unproject(p.x, p.y).add(x, y);
Lines.poly(brushPolygons[index], v.x, v.y, scaling); Lines.poly(brushPolygons[index], v.x, v.y, scaling);
} }
}else{ }else{
if((tool.edit || tool == EditorTool.line) && (!mobile || drawing)){ 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); Vector2 v = unproject(p.x, p.y).add(x, y);
float offset = (editor.getDrawBlock().size % 2 == 0 ? scaling / 2f : 0f); float offset = (editor.getDrawBlock().size % 2 == 0 ? scaling / 2f : 0f);
Lines.square( Lines.square(
@@ -323,51 +320,26 @@ public class MapView extends Element implements GestureListener{
} }
} }
Graphics.endClip();
Draw.color(Palette.accent); Draw.color(Palette.accent);
Lines.stroke(Unit.dp.scl(3f)); Lines.stroke(Unit.dp.scl(3f));
Lines.rect(x, y, width, height); Lines.rect(x, y, width, height);
Draw.reset(); Draw.reset();
ScissorStack.popScissors();
} }
private boolean active(){ private boolean active(){
return Core.scene.getKeyboardFocus() != null return Core.scene.getKeyboardFocus() != null
&& Core.scene.getKeyboardFocus().isDescendantOf(ui.editor) && Core.scene.getKeyboardFocus().isDescendantOf(ui.editor)
&& ui.editor.isShown() && tool == EditorTool.zoom && && ui.editor.isShown() && tool == EditorTool.zoom &&
Core.scene.hit(Graphics.mouse().x, Graphics.mouse().y, true) == this; Core.scene.hit(Core.input.mouse().x, Core.input.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;
} }
@Override @Override
public boolean pan(float x, float y, float deltaX, float deltaY){ public boolean pan(float x, float y, float deltaX, float deltaY){
if(!active()) return false; if(!active()) return false;
offsetx += deltaX / zoom; offsetx += deltaX / zoom;
offsety -= deltaY / zoom; offsety += deltaY / zoom;
return false;
}
@Override
public boolean panStop(float x, float y, int pointer, int button){
return false; return false;
} }
@@ -1,6 +1,6 @@
package io.anuke.mindustry.editor; package io.anuke.mindustry.editor;
import com.badlogic.gdx.utils.Array; import io.anuke.arc.collection.Array;
public class OperationStack{ public class OperationStack{
private final static int maxSize = 10; private final static int maxSize = 10;
@@ -22,7 +22,7 @@ public class OperationStack{
stack.add(action); stack.add(action);
if(stack.size > maxSize){ if(stack.size > maxSize){
stack.removeIndex(0); stack.removeAt(0);
} }
} }
@@ -1,11 +1,17 @@
package io.anuke.mindustry.entities; package io.anuke.mindustry.entities;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.entities.Effects;
import com.badlogic.gdx.math.Rectangle; import io.anuke.arc.entities.Effects.Effect;
import com.badlogic.gdx.math.Vector2; 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.bullets.TurretBullets;
import io.anuke.mindustry.content.fx.ExplosionFx; 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.bullet.Bullet;
import io.anuke.mindustry.entities.effect.Fire; import io.anuke.mindustry.entities.effect.Fire;
import io.anuke.mindustry.entities.effect.Lightning; 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.gen.Call;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.world.Tile; 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.*; import static io.anuke.mindustry.Vars.*;
@@ -28,26 +26,26 @@ import static io.anuke.mindustry.Vars.*;
public class Damage{ public class Damage{
private static Rectangle rect = new Rectangle(); private static Rectangle rect = new Rectangle();
private static Rectangle hitrect = 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.*/ /**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){ 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++){ for(int i = 0; i < Mathf.clamp(power / 20, 0, 6); i++){
int branches = 5 + Mathf.clamp((int) (power / 30), 1, 20); 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))); x, y, Mathf.random(360f), branches + Mathf.range(2)));
} }
for(int i = 0; i < Mathf.clamp(flammability / 4, 0, 30); i++){ 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); int waves = Mathf.clamp((int) (explosiveness / 4), 0, 30);
for(int i = 0; i < waves; i++){ for(int i = 0; i < waves; i++){
int f = i; int f = i;
Timers.run(i * 2f, () -> { Time.run(i * 2f, () -> {
threads.run(() -> Damage.damage(x, y, Mathf.clamp(radius + explosiveness, 0, 50f) * ((f + 1f) / waves), explosiveness / 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)); Effects.effect(ExplosionFx.blockExplosionSmoke, x + Mathf.range(radius), y + Mathf.range(radius));
}); });
} }
@@ -119,7 +117,7 @@ public class Damage{
other.width += expand * 2; other.width += expand * 2;
other.height += 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){ if(vec != null){
Effects.effect(effect, vec.x, vec.y); 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.*/ /**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){ public static void damage(Team team, float x, float y, float radius, float damage){
Consumer<Unit> cons = entity -> { Consumer<Unit> cons = entity -> {
if(entity.team == team || entity.distanceTo(x, y) > radius){ if(entity.team == team || entity.dst(x, y) > radius){
return; return;
} }
float amount = calculateDamage(x, y, entity.x, entity.y, radius, damage); float amount = calculateDamage(x, y, entity.x, entity.y, radius, damage);
@@ -180,8 +178,8 @@ public class Damage{
int trad = (int) (radius / tilesize); int trad = (int) (radius / tilesize);
for(int dx = -trad; dx <= trad; dx++){ for(int dx = -trad; dx <= trad; dx++){
for(int dy = -trad; dy <= trad; dy++){ for(int dy = -trad; dy <= trad; dy++){
Tile tile = world.tile(Mathf.scl2(x, tilesize) + dx, Mathf.scl2(y, tilesize) + dy); 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())) && Vector2.dst(dx, dy, 0, 0) <= trad){ 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); float amount = calculateDamage(x, y, tile.worldx(), tile.worldy(), radius, damage);
tile.entity.damage(amount); 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){ 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 falloff = 0.4f;
float scaled = Mathf.lerp(1f - dist / radius, 1f, falloff); float scaled = Mathf.lerp(1f - dist / radius, 1f, falloff);
return damage * scaled; return damage * scaled;
@@ -1,13 +1,24 @@
package io.anuke.mindustry.entities; 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.Loc;
import io.anuke.annotations.Annotations.Remote; 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.Mechs;
import io.anuke.mindustry.content.fx.UnitFx; import io.anuke.mindustry.content.fx.UnitFx;
import io.anuke.mindustry.entities.effect.ScorchDecal; 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.game.Team;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette; 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.io.TypeIO;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.NetConnection; 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.Tile;
import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.storage.CoreBlock.CoreEntity; 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.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -63,7 +67,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
public NetConnection con; public NetConnection con;
public int playerIndex = 0; public int playerIndex = 0;
public boolean isLocal = false; public boolean isLocal = false;
public Timer timer = new Timer(4); public Interval timer = new Interval(4);
public TargetTrait target; public TargetTrait target;
public TargetTrait moveTarget; public TargetTrait moveTarget;
@@ -71,8 +75,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
private Queue<BuildRequest> placeQueue = new Queue<>(); private Queue<BuildRequest> placeQueue = new Queue<>();
private Tile mining; private Tile mining;
private CarriableTrait carrying; private CarriableTrait carrying;
private Trail trail = new Trail(12); private Vector2 movement = new Vector2();
private Vector2 movement = new Translator();
private boolean moved; private boolean moved;
//endregion //endregion
@@ -112,7 +115,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
} }
@Override @Override
public Timer getTimer(){ public Interval getTimer(){
return timer; return timer;
} }
@@ -150,7 +153,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
} }
if(interpolator.target.dst(interpolator.last) > 1f){ if(interpolator.target.dst(interpolator.last) > 1f){
walktime += Timers.delta(); walktime += Time.delta();
} }
} }
@@ -282,7 +285,6 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
@Override @Override
public void drawShadow(float offsetX, float offsetY){ 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);
@@ -292,8 +294,6 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
public void draw(){ public void draw(){
if(dead) return; if(dead) return;
float x = snappedX(), y = snappedY();
if(!movement.isZero() && moved && !state.isPaused()){ if(!movement.isZero() && moved && !state.isPaused()){
walktime += movement.len() / 0.7f * getFloorOn().speedMultiplier; walktime += movement.len() / 0.7f * getFloorOn().speedMultiplier;
baseRotation = Mathf.slerpDelta(baseRotation, movement.angle(), 0.13f); baseRotation = Mathf.slerpDelta(baseRotation, movement.angle(), 0.13f);
@@ -319,7 +319,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
Draw.rect(mech.legRegion, Draw.rect(mech.legRegion,
x + Angles.trnsx(baseRotation, ft * i + boostTrnsY, -boostTrnsX * i), x + Angles.trnsx(baseRotation, ft * i + boostTrnsY, -boostTrnsX * i),
y + Angles.trnsy(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); mech.legRegion.getWidth() * i, mech.legRegion.getHeight() - Mathf.clamp(ft * i, 0, 2), baseRotation - 90 + boostAng * i);
} }
Draw.rect(mech.baseRegion, x, y, baseRotation - 90); Draw.rect(mech.baseRegion, x, y, baseRotation - 90);
@@ -337,10 +337,10 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
for(int i : Mathf.signs){ for(int i : Mathf.signs){
float tra = rotation - 90, trY = -mech.weapon.getRecoil(this, i > 0) + mech.weaponOffsetY; 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, Draw.rect(mech.weapon.equipRegion,
x + Angles.trnsx(tra, (mech.weaponOffsetX + mech.spreadX(this)) * i, trY), 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); y + Angles.trnsy(tra, (mech.weaponOffsetX + mech.spreadX(this)) * i, trY), w, mech.weapon.equipRegion.getHeight(), rotation - 90);
} }
float backTrns = 4f, itemSize = 5f; float backTrns = 4f, itemSize = 5f;
@@ -363,9 +363,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
@Override @Override
public void drawStats(){ public void drawStats(){
float x = snappedX(), y = snappedY(); Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Time.time(), healthf() * 5f, 1f - healthf()));
Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Timers.time(), healthf() * 5f, 1f - healthf()));
Draw.alpha(hitTime / hitDuration); Draw.alpha(hitTime / hitDuration);
Draw.rect(getPowerCellRegion(), x + Angles.trnsx(rotation, mech.cellTrnsY, 0f), y + Angles.trnsy(rotation, mech.cellTrnsY, 0f), rotation - 90); Draw.rect(getPowerCellRegion(), x + Angles.trnsx(rotation, mech.cellTrnsY, 0f), y + Angles.trnsy(rotation, mech.cellTrnsY, 0f), rotation - 90);
Draw.color(); Draw.color();
@@ -376,50 +374,35 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
if(dead) return; if(dead) return;
drawBuilding(this); 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(){ 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(); boolean ints = font.usesIntegerPositions();
Core.font.setUseIntegerPositions(false); font.setUseIntegerPositions(false);
Draw.tscl(0.25f / io.anuke.ucore.scene.ui.layout.Unit.dp.scl(1f)); font.getData().setScale(0.25f / io.anuke.arc.scene.ui.layout.Unit.dp.scl(1f));
layout.setText(Core.font, name); layout.setText(font, name);
Draw.color(0f, 0f, 0f, 0.3f); 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.color();
Draw.tcolor(color); font.setColor(color);
Draw.text(name, x, y + 8);
font.draw(name, x, y + 8, 0, Align.center, false);
if(isAdmin){ if(isAdmin){
float s = 3f; float s = 3f;
Draw.color(color.r * 0.5f, color.g * 0.5f, color.b * 0.5f, 1f); 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.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(); Draw.reset();
Pooling.free(layout); Pools.free(layout);
Draw.tscl(1f); font.getData().setScale(1f);
Core.font.setUseIntegerPositions(ints); 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. */
@@ -431,11 +414,9 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
Block block = world.tile(request.x, request.y).target().block(); Block block = world.tile(request.x, request.y).target().block();
//draw removal request //draw removal request
Lines.stroke(2f); Lines.stroke(2f, Palette.removeBack);
Draw.color(Palette.removeBack); float rad = Mathf.absin(Time.time(), 7f, 1f) + block.size * tilesize / 2f - 1;
float rad = Mathf.absin(Timers.time(), 7f, 1f) + block.size * tilesize / 2f - 1;
Lines.square( Lines.square(
request.x * tilesize + block.offset(), request.x * tilesize + block.offset(),
@@ -450,11 +431,9 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
rad); rad);
}else{ }else{
//draw place request //draw place request
Lines.stroke(2f); Lines.stroke(2f, Palette.accentBack);
Draw.color(Palette.accentBack); float rad = Mathf.absin(Time.time(), 7f, 1f) - 2f + request.recipe.result.size * tilesize / 2f;
float rad = Mathf.absin(Timers.time(), 7f, 1f) - 2f + request.recipe.result.size * tilesize / 2f;
Lines.square( Lines.square(
request.x * tilesize + request.recipe.result.offset(), request.x * tilesize + request.recipe.result.offset(),
@@ -479,7 +458,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
@Override @Override
public void update(){ public void update(){
hitTime -= Timers.delta(); hitTime -= Time.delta();
if(Float.isNaN(x) || Float.isNaN(y)){ if(Float.isNaN(x) || Float.isNaN(y)){
velocity.set(0f, 0f); velocity.set(0f, 0f);
@@ -552,14 +531,14 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
updateBuilding(this); updateBuilding(this);
x = Mathf.clamp(x, tilesize, world.width() * tilesize - tilesize); x = Mathf.clamp(x, 0, world.width() * tilesize - tilesize);
y = Mathf.clamp(y, tilesize, world.height() * tilesize - tilesize); y = Mathf.clamp(y, 0, world.height() * tilesize - tilesize);
} }
protected void updateMech(){ protected void updateMech(){
Tile tile = world.tileWorld(x, y); 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 player is in solid block
if(tile != null && tile.solid()){ if(tile != null && tile.solid()){
@@ -579,7 +558,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
} }
//drop from carrier on key press //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(!mech.flying){
if(getCarrier() != null){ if(getCarrier() != null){
Call.dropSelf(this); Call.dropSelf(this);
@@ -597,21 +576,19 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
movement.setZero(); movement.setZero();
String section = control.input(playerIndex).section; float xa = Core.input.axis(Binding.move_x);
float ya = Core.input.axis(Binding.move_y);
float xa = Inputs.getAxis(section, "move_x"); if(!Core.input.keyDown(Binding.gridMode)){
float ya = Inputs.getAxis(section, "move_y");
if(!Inputs.keyDown("gridMode")){
movement.y += ya * speed; movement.y += ya * speed;
movement.x += xa * 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; pointerX = vec.x;
pointerY = vec.y; pointerY = vec.y;
updateShooting(); updateShooting();
movement.limit(speed).scl(Timers.delta()); movement.limit(speed).scl(Time.delta());
if(getCarrier() == null){ if(getCarrier() == null){
if(!ui.chatfrag.chatOpen()){ if(!ui.chatfrag.chatOpen()){
@@ -619,7 +596,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
} }
float prex = x, prey = y; float prex = x, prey = y;
updateVelocityStatus(); updateVelocityStatus();
moved = distanceTo(prex, prey) > 0.001f; moved = dst(prex, prey) > 0.001f;
}else{ }else{
velocity.setZero(); velocity.setZero();
x = Mathf.lerpDelta(x, getCarrier().getX(), 0.1f); x = Mathf.lerpDelta(x, getCarrier().getX(), 0.1f);
@@ -647,7 +624,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
protected void updateFlying(){ protected void updateFlying(){
if(Units.invalidateTarget(target, this) && !(target instanceof TileEntity && ((TileEntity) target).damaged() && target.getTeam() == team && 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; target = null;
} }
@@ -664,7 +641,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
velocity.setAngle(Mathf.slerpDelta(velocity.angle(), angleTo(moveTarget), 0.1f)); velocity.setAngle(Mathf.slerpDelta(velocity.angle(), angleTo(moveTarget), 0.1f));
} }
if(distanceTo(moveTarget) < 2f){ if(dst(moveTarget) < 2f){
if(moveTarget instanceof CarriableTrait){ if(moveTarget instanceof CarriableTrait){
carry((CarriableTrait) moveTarget); carry((CarriableTrait) moveTarget);
}else if(tapping){ }else if(tapping){
@@ -687,7 +664,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.set(targetX - x, targetY - y).limit(isBoosting && !mech.flying ? mech.boostSpeed : mech.speed);
movement.setAngle(Mathf.slerp(movement.angle(), velocity.angle(), 0.05f)); movement.setAngle(Mathf.slerp(movement.angle(), velocity.angle(), 0.05f));
if(distanceTo(targetX, targetY) < attractDst){ if(dst(targetX, targetY) < attractDst){
movement.setZero(); movement.setZero();
} }
@@ -699,24 +676,24 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
rect.width += expansion * 2f; rect.width += expansion * 2f;
rect.height += 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){ 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){ }else if(target == null){
rotation = Mathf.slerpDelta(rotation, velocity.angle(), velocity.len() / 10f); rotation = Mathf.slerpDelta(rotation, velocity.angle(), velocity.len() / 10f);
} }
float lx = x, ly = y; float lx = x, ly = y;
updateVelocityStatus(); updateVelocityStatus();
moved = distanceTo(lx, ly) > 0.001f && !isCarried(); moved = dst(lx, ly) > 0.001f && !isCarried();
if(mech.flying){ if(mech.flying){
//hovering effect //hovering effect
x += Mathf.sin(Timers.time() + id * 999, 25f, 0.08f); x += Mathf.sin(Time.time() + id * 999, 25f, 0.08f);
y += Mathf.cos(Timers.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 //update shooting if not building, not mining and there's ammo left
@@ -726,12 +703,12 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
if(mobile){ if(mobile){
if(target == null){ if(target == null){
isShooting = false; isShooting = false;
if(Settings.getBool("autotarget")){ if(Core.settings.getBool("autotarget")){
target = Units.getClosestTarget(team, x, y, getWeapon().getAmmo().getRange()); target = Units.getClosestTarget(team, x, y, getWeapon().getAmmo().getRange());
if(mech.canHeal && target == null){ if(mech.canHeal && target == null){
target = Geometry.findClosest(x, y, world.indexer.getDamaged(Team.blue)); 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; target = null;
}else if(target != null){ }else if(target != null){
target = ((Tile) target).entity; target = ((Tile) target).entity;
@@ -743,7 +720,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
} }
} }
}else if(target.isValid() || (target instanceof TileEntity && ((TileEntity) target).damaged() && target.getTeam() == team && }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 //rotate toward and shoot the target
if(mech.turnCursor){ if(mech.turnCursor){
rotation = Mathf.slerpDelta(rotation, angleTo(target), 0.2f); rotation = Mathf.slerpDelta(rotation, angleTo(target), 0.2f);
@@ -760,7 +737,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
} }
}else if(isShooting()){ }else if(isShooting()){
Vector2 vec = Graphics.world(control.input(playerIndex).getMouseX(), Vector2 vec = Core.input.mouseWorld(control.input(playerIndex).getMouseX(),
control.input(playerIndex).getMouseY()); control.input(playerIndex).getMouseY());
pointerX = vec.x; pointerX = vec.x;
pointerY = vec.y; pointerY = vec.y;
@@ -787,7 +764,6 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
inventory.clear(); inventory.clear();
placeQueue.clear(); placeQueue.clear();
dead = true; dead = true;
trail.clear();
target = null; target = null;
moveTarget = null; moveTarget = null;
carrier = null; carrier = null;
@@ -872,7 +848,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
public void write(DataOutput buffer) throws IOException{ public void write(DataOutput buffer) throws IOException{
super.writeSave(buffer, !isLocal); super.writeSave(buffer, !isLocal);
TypeIO.writeStringData(buffer, name); //TODO writing strings is very inefficient 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.writeInt(Color.rgba8888(color));
buffer.writeByte(mech.id); buffer.writeByte(mech.id);
buffer.writeInt(mining == null ? -1 : mining.pos()); buffer.writeInt(mining == null ? -1 : mining.pos());
@@ -1,8 +1,8 @@
package io.anuke.mindustry.entities; 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.mindustry.entities.traits.TargetTrait;
import io.anuke.ucore.util.Mathf;
/** /**
* Class for predicting shoot angles based on velocities of targets. * Class for predicting shoot angles based on velocities of targets.
@@ -1,15 +1,14 @@
package io.anuke.mindustry.entities; package io.anuke.mindustry.entities;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.collection.Array;
import com.badlogic.gdx.utils.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.content.StatusEffects;
import io.anuke.mindustry.entities.traits.Saveable; import io.anuke.mindustry.entities.traits.Saveable;
import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.type.ContentType;
import io.anuke.mindustry.type.StatusEffect; 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.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -21,9 +20,9 @@ import static io.anuke.mindustry.Vars.content;
*/ */
public class StatusController implements Saveable{ public class StatusController implements Saveable{
private static final StatusEntry globalResult = new StatusEntry(); private static final StatusEntry globalResult = new StatusEntry();
private static final Array<StatusEntry> removals = new ThreadArray<>(); private static final Array<StatusEntry> removals = new Array<>();
private Array<StatusEntry> statuses = new ThreadArray<>(); private Array<StatusEntry> statuses = new Array<>();
private float speedMultiplier; private float speedMultiplier;
private float damageMultiplier; private float damageMultiplier;
@@ -57,7 +56,7 @@ public class StatusController implements Saveable{
} }
//otherwise, no opposites found, add direct effect //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); entry.set(effect, newTime);
statuses.add(entry); statuses.add(entry);
} }
@@ -88,10 +87,10 @@ public class StatusController implements Saveable{
removals.clear(); removals.clear();
for(StatusEntry entry : statuses){ 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){ if(entry.time <= 0){
Pooling.free(entry); Pools.free(entry);
removals.add(entry); removals.add(entry);
}else{ }else{
speedMultiplier *= entry.effect.speedMultiplier; speedMultiplier *= entry.effect.speedMultiplier;
@@ -137,7 +136,7 @@ public class StatusController implements Saveable{
@Override @Override
public void readSave(DataInput stream) throws IOException{ public void readSave(DataInput stream) throws IOException{
for(StatusEntry effect : statuses){ for(StatusEntry effect : statuses){
Pooling.free(effect); Pools.free(effect);
} }
statuses.clear(); statuses.clear();
@@ -146,7 +145,7 @@ public class StatusController implements Saveable{
for(int i = 0; i < amount; i++){ for(int i = 0; i < amount; i++){
byte id = stream.readByte(); byte id = stream.readByte();
float time = stream.readShort() / 2f; 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); entry.set(content.getByID(ContentType.status, id), time);
statuses.add(entry); statuses.add(entry);
} }
@@ -1,11 +1,18 @@
package io.anuke.mindustry.entities; 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.Loc;
import io.anuke.annotations.Annotations.Remote; 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.content.fx.Fx;
import io.anuke.mindustry.entities.bullet.Bullet; import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.traits.TargetTrait; 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.ItemModule;
import io.anuke.mindustry.world.modules.LiquidModule; import io.anuke.mindustry.world.modules.LiquidModule;
import io.anuke.mindustry.world.modules.PowerModule; 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.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -42,7 +42,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
public static int sleepingEntities = 0; public static int sleepingEntities = 0;
public Tile tile; public Tile tile;
public Timer timer; public Interval timer;
public float health; public float health;
public float timeScale = 1f, timeScaleDuration; public float timeScale = 1f, timeScaleDuration;
@@ -78,7 +78,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
health = tile.block().health; health = tile.block().health;
timer = new Timer(tile.block().timers); timer = new Interval(tile.block().timers);
if(added){ if(added){
add(); add();
@@ -89,12 +89,12 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
/**Scaled delta.*/ /**Scaled delta.*/
public float 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.*/ /**Call when nothing is happening to the entity. This increments the internal sleep timer.*/
public void sleep(){ public void sleep(){
sleepTime += Timers.delta(); sleepTime += Time.delta();
if(!sleeping && sleepTime >= timeToSleep){ if(!sleeping && sleepTime >= timeToSleep){
remove(); remove();
sleeping = true; sleeping = true;
@@ -169,8 +169,8 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
public void removeFromProximity(){ public void removeFromProximity(){
tile.block().onProximityRemoved(tile); tile.block().onProximityRemoved(tile);
GridPoint2[] nearby = Edges.getEdges(tile.block().size); Point2[] nearby = Edges.getEdges(tile.block().size);
for(GridPoint2 point : nearby){ for(Point2 point : nearby){
Tile other = world.tile(tile.x + point.x, tile.y + point.y); Tile other = world.tile(tile.x + point.x, tile.y + point.y);
//remove this tile from all nearby tile's proximities //remove this tile from all nearby tile's proximities
if(other != null){ if(other != null){
@@ -187,8 +187,8 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
tmpTiles.clear(); tmpTiles.clear();
proximity.clear(); proximity.clear();
GridPoint2[] nearby = Edges.getEdges(tile.block().size); Point2[] nearby = Edges.getEdges(tile.block().size);
for(GridPoint2 point : nearby){ for(Point2 point : nearby){
Tile other = world.tile(tile.x + point.x, tile.y + point.y); Tile other = world.tile(tile.x + point.x, tile.y + point.y);
if(other == null) continue; if(other == null) continue;
@@ -258,19 +258,19 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
@Override @Override
public Vector2 getVelocity(){ public Vector2 getVelocity(){
return Vector2.Zero; return Vector2.ZERO;
} }
@Override @Override
public void update(){ public void update(){
//TODO better smoke effect, this one is awful //TODO better smoke effect, this one is awful
if(health != 0 && health < tile.block().health && !(tile.block() instanceof Wall) && 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)); Effects.effect(Fx.smoke, x + Mathf.range(4), y + Mathf.range(4));
} }
timeScaleDuration -= Timers.delta(); timeScaleDuration -= Time.delta();
if(timeScaleDuration <= 0f || !tile.block().canOverdrive){ if(timeScaleDuration <= 0f || !tile.block().canOverdrive){
timeScale = 1f; timeScale = 1f;
} }
+27 -26
View File
@@ -1,9 +1,20 @@
package io.anuke.mindustry.entities; package io.anuke.mindustry.entities;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.Core;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.arc.entities.Effects;
import com.badlogic.gdx.math.Rectangle; import io.anuke.arc.entities.impl.DestructibleEntity;
import com.badlogic.gdx.math.Vector2; 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.content.blocks.Blocks;
import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.game.Team; 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.Pos;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor; 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.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -194,7 +195,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
Units.getNearby(queryRect, t -> { Units.getNearby(queryRect, t -> {
if(t == this || t.getCarrier() == this || getCarrier() == t || t.isFlying() != isFlying()) return; 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()))); moveVector.set(x, y).sub(t.getX(), t.getY()).setLength(1f * (1f - (dst / queryRect.getWidth())));
applyImpulse(moveVector.x, moveVector.y); applyImpulse(moveVector.x, moveVector.y);
}); });
@@ -235,11 +236,11 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
status.update(this); 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()){ if(isFlying()){
x += velocity.x * Timers.delta(); x += velocity.x * Time.delta();
y += velocity.y * Timers.delta(); y += velocity.y * Time.delta();
}else{ }else{
boolean onLiquid = floor.isLiquid; 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); 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){ if(onLiquid && floor.drownTime > 0){
drownTime += Timers.delta() * 1f / floor.drownTime; drownTime += Time.delta() * 1f / floor.drownTime;
if(Mathf.chance(Timers.delta() * 0.05f)){ if(Mathf.chance(Time.delta() * 0.05f)){
Effects.effect(floor.drownUpdateEffect, floor.liquidColor, x, y); Effects.effect(floor.drownUpdateEffect, floor.liquidColor, x, y);
} }
}else{ }else{
@@ -283,12 +284,12 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
} }
float px = x, py = y; 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(px - x) <= 0.0001f) velocity.x = 0f;
if(Math.abs(py - y) <= 0.0001f) velocity.y = 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){ 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){ 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){ public void damage(float amount, boolean withEffect){
@@ -317,14 +318,14 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
} }
public void drawStats(){ 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.alpha(hitTime);
Draw.rect(getPowerCellRegion(), x, y, rotation - 90); Draw.rect(getPowerCellRegion(), x, y, rotation - 90);
Draw.color(); Draw.color();
} }
public TextureRegion getPowerCellRegion(){ public TextureRegion getPowerCellRegion(){
return Draw.region("power-cell"); return Core.atlas.find("power-cell");
} }
public void drawAll(){ public void drawAll(){
+13 -13
View File
@@ -1,18 +1,18 @@
package io.anuke.mindustry.entities; package io.anuke.mindustry.entities;
import com.badlogic.gdx.math.Rectangle; import io.anuke.arc.collection.EnumSet;
import com.badlogic.gdx.math.Vector2; 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.traits.TargetTrait;
import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; 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.*; import static io.anuke.mindustry.Vars.*;
@@ -38,7 +38,7 @@ public class Units{
* @return whether the target is invalid * @return whether the target is invalid
*/ */
public static boolean invalidateTarget(TargetTrait target, Team team, float x, float y, float range){ 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)}*/ /**See {@link #invalidateTarget(TargetTrait, Team, float, float, float)}*/
@@ -165,7 +165,7 @@ public class Units{
if(e.isDead() || !predicate.test(e)) if(e.isDead() || !predicate.test(e))
return; 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(dist < range){
if(result == null || dist < cdist){ if(result == null || dist < cdist){
result = e; result = e;
@@ -188,7 +188,7 @@ public class Units{
if(!predicate.test(e)) if(!predicate.test(e))
return; 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(dist < range){
if(result == null || dist < cdist){ if(result == null || dist < cdist){
result = e; result = e;
@@ -221,7 +221,7 @@ public class Units{
EntityGroup<BaseUnit> group = unitGroups[team.ordinal()]; EntityGroup<BaseUnit> group = unitGroups[team.ordinal()];
if(!group.isEmpty()){ if(!group.isEmpty()){
EntityQuery.getNearby(group, rect, entity -> { EntityQuery.getNearby(group, rect, entity -> {
if(entity.distanceTo(x, y) <= radius){ if(entity.dst(x, y) <= radius){
cons.accept((Unit) entity); cons.accept((Unit) entity);
} }
}); });
@@ -229,7 +229,7 @@ public class Units{
//now check all players //now check all players
EntityQuery.getNearby(playerGroup, rect, player -> { 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); cons.accept((Unit) player);
} }
}); });
@@ -1,9 +1,9 @@
package io.anuke.mindustry.entities.bullet; package io.anuke.mindustry.entities.bullet;
import io.anuke.mindustry.content.fx.BulletFx; import io.anuke.mindustry.content.fx.BulletFx;
import io.anuke.ucore.core.Effects; import io.anuke.arc.entities.Effects;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.arc.entities.Effects.Effect;
import io.anuke.ucore.graphics.Draw; import io.anuke.arc.graphics.g2d.Draw;
//TODO scale velocity depending on fslope() //TODO scale velocity depending on fslope()
public class ArtilleryBulletType extends BasicBulletType{ public class ArtilleryBulletType extends BasicBulletType{
@@ -1,16 +1,17 @@
package io.anuke.mindustry.entities.bullet; package io.anuke.mindustry.entities.bullet;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.Core;
import com.badlogic.gdx.graphics.g2d.TextureRegion; 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.Damage;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.entities.traits.TargetTrait; import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.graphics.Palette; 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. * A BulletType for most ammo-based bullets shot from turrets and units.
@@ -47,8 +48,8 @@ public class BasicBulletType extends BulletType{
@Override @Override
public void load(){ public void load(){
backRegion = Draw.region(bulletSprite + "-back"); backRegion = Core.atlas.find(bulletSprite + "-back");
frontRegion = Draw.region(bulletSprite); frontRegion = Core.atlas.find(bulletSprite);
} }
@Override @Override
@@ -69,7 +70,7 @@ public class BasicBulletType extends BulletType{
if(homingPower > 0.0001f){ if(homingPower > 0.0001f){
TargetTrait target = Units.getClosestTarget(b.getTeam(), b.x, b.y, homingRange); TargetTrait target = Units.getClosestTarget(b.getTeam(), b.x, b.y, homingRange);
if(target != null){ 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()));
} }
} }
} }
@@ -1,8 +1,17 @@
package io.anuke.mindustry.entities.bullet; package io.anuke.mindustry.entities.bullet;
import com.badlogic.gdx.math.Vector2;
import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote; 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.Unit;
import io.anuke.mindustry.entities.effect.Lightning; import io.anuke.mindustry.entities.effect.Lightning;
import io.anuke.mindustry.entities.traits.AbsorbTrait; 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.entities.traits.TeamTrait;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.world.Tile; 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.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -28,7 +28,7 @@ import static io.anuke.mindustry.Vars.*;
public class Bullet extends BulletEntity<BulletType> implements TeamTrait, SyncTrait, AbsorbTrait{ public class Bullet extends BulletEntity<BulletType> implements TeamTrait, SyncTrait, AbsorbTrait{
private static Vector2 vector = new Vector2(); private static Vector2 vector = new Vector2();
public Timer timer = new Timer(3); public Interval timer = new Interval(3);
private float lifeScl; private float lifeScl;
private Team team; private Team team;
private Object data; private Object data;
@@ -55,21 +55,21 @@ public class Bullet extends BulletEntity<BulletType> 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){ 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.type = type;
bullet.owner = owner; bullet.owner = owner;
bullet.data = data; bullet.data = data;
bullet.velocity.set(0, type.speed).setAngle(angle).scl(velocityScl); bullet.velocity.set(0, type.speed).setAngle(angle).scl(velocityScl);
if(type.keepVelocity){ 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.team = team;
bullet.type = type; bullet.type = type;
bullet.lifeScl = lifetimeScl; 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(); bullet.add();
return bullet; return bullet;
@@ -236,7 +236,7 @@ public class Bullet extends BulletEntity<BulletType> implements TeamTrait, SyncT
@Override @Override
protected void updateLife(){ protected void updateLife(){
time += Timers.delta() * 1f/(lifeScl); time += Time.delta() * 1f/(lifeScl);
time = Mathf.clamp(time, 0, type.lifetime()); time = Mathf.clamp(time, 0, type.lifetime());
if(time >= type.lifetime){ if(time >= type.lifetime){
@@ -259,7 +259,7 @@ public class Bullet extends BulletEntity<BulletType> implements TeamTrait, SyncT
@Override @Override
public void removed(){ public void removed(){
Pooling.free(this); Pools.free(this);
} }
@Override @Override
@@ -1,15 +1,15 @@
package io.anuke.mindustry.entities.bullet; 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.StatusEffects;
import io.anuke.mindustry.content.fx.BulletFx; import io.anuke.mindustry.content.fx.BulletFx;
import io.anuke.mindustry.game.Content; import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.type.ContentType;
import io.anuke.mindustry.type.StatusEffect; import io.anuke.mindustry.type.StatusEffect;
import io.anuke.mindustry.world.Tile; 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<Bullet>{ public abstract class BulletType extends Content implements BaseBulletType<Bullet>{
public float lifetime; public float lifetime;
@@ -45,7 +45,7 @@ public abstract class BulletType extends Content implements BaseBulletType<Bulle
/**Whether velocity is inherited from the shooter.*/ /**Whether velocity is inherited from the shooter.*/
public boolean keepVelocity = true; public boolean keepVelocity = true;
protected Translator vector = new Translator(); protected Vector2 vector = new Vector2();
public BulletType(float speed, float damage){ public BulletType(float speed, float damage){
this.speed = speed; this.speed = speed;
@@ -1,9 +1,9 @@
package io.anuke.mindustry.entities.bullet; package io.anuke.mindustry.entities.bullet;
import com.badlogic.gdx.math.Rectangle; import io.anuke.arc.math.geom.Rectangle;
import io.anuke.mindustry.content.fx.BulletFx; import io.anuke.mindustry.content.fx.BulletFx;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
import io.anuke.ucore.core.Timers; import io.anuke.arc.util.Time;
public abstract class FlakBulletType extends BasicBulletType{ public abstract class FlakBulletType extends BasicBulletType{
protected static Rectangle rect = new Rectangle(); protected static Rectangle rect = new Rectangle();
@@ -27,9 +27,9 @@ public abstract class FlakBulletType extends BasicBulletType{
Units.getNearbyEnemies(b.getTeam(), rect.setSize(explodeRange*2f).setCenter(b.x, b.y), unit -> { Units.getNearbyEnemies(b.getTeam(), rect.setSize(explodeRange*2f).setCenter(b.x, b.y), unit -> {
if(b.getData() instanceof Float) return; if(b.getData() instanceof Float) return;
if(unit.distanceTo(b) < explodeRange){ if(unit.dst(b) < explodeRange){
b.setData(0); b.setData(0);
Timers.run(5f, () -> { Time.run(5f, () -> {
if(b.getData() instanceof Integer){ if(b.getData() instanceof Integer){
b.time(b.lifetime()); b.time(b.lifetime());
} }
@@ -1,18 +1,18 @@
package io.anuke.mindustry.entities.bullet; package io.anuke.mindustry.entities.bullet;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.entities.Effects;
import com.badlogic.gdx.math.GridPoint2; 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.BulletFx;
import io.anuke.mindustry.content.fx.Fx; import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.entities.effect.Fire; import io.anuke.mindustry.entities.effect.Fire;
import io.anuke.mindustry.entities.effect.Puddle; import io.anuke.mindustry.entities.effect.Puddle;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile; 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.tilesize;
import static io.anuke.mindustry.Vars.world; 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){ if(liquid.temperature <= 0.5f && liquid.flammability < 0.3f){
float intensity = 400f; float intensity = 400f;
Fire.extinguish(world.tileWorld(hitx, hity), intensity); 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); Fire.extinguish(world.tileWorld(hitx + p.x * tilesize, hity + p.y * tilesize), intensity);
} }
} }
@@ -1,11 +1,11 @@
package io.anuke.mindustry.entities.bullet; 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.content.fx.BulletFx;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.ucore.core.Effects; import io.anuke.arc.entities.Effects;
import io.anuke.ucore.core.Timers; import io.anuke.arc.util.Time;
import io.anuke.ucore.util.Mathf; import io.anuke.arc.math.Mathf;
public class MissileBulletType extends BasicBulletType{ public class MissileBulletType extends BasicBulletType{
protected Color trailColor = Palette.missileYellowBack; protected Color trailColor = Palette.missileYellowBack;
@@ -21,7 +21,7 @@ public class MissileBulletType extends BasicBulletType{
public void update(Bullet b){ public void update(Bullet b){
super.update(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); Effects.effect(BulletFx.missileTrail, trailColor, b.x, b.y, 2f);
} }
} }
@@ -1,12 +1,12 @@
package io.anuke.mindustry.entities.effect; 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.mindustry.entities.traits.BelowLiquidTrait;
import io.anuke.ucore.entities.EntityGroup; import io.anuke.arc.entities.EntityGroup;
import io.anuke.ucore.entities.impl.TimedEntity; import io.anuke.arc.entities.impl.TimedEntity;
import io.anuke.ucore.entities.trait.DrawTrait; import io.anuke.arc.entities.trait.DrawTrait;
import io.anuke.ucore.graphics.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.ucore.util.Mathf; import io.anuke.arc.math.Mathf;
import static io.anuke.mindustry.Vars.groundEffectGroup; import static io.anuke.mindustry.Vars.groundEffectGroup;
@@ -1,10 +1,18 @@
package io.anuke.mindustry.entities.effect; 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.Loc;
import io.anuke.annotations.Annotations.Remote; 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.StatusEffects;
import io.anuke.mindustry.content.bullets.TurretBullets; import io.anuke.mindustry.content.bullets.TurretBullets;
import io.anuke.mindustry.content.fx.EnvironmentFx; 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.net.Net;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; 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.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -51,7 +51,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
Fire fire = map.get(tile.pos()); Fire fire = map.get(tile.pos());
if(fire == null){ if(fire == null){
fire = Pooling.obtain(Fire.class, Fire::new); fire = Pools.obtain(Fire.class, Fire::new);
fire.tile = tile; fire.tile = tile;
fire.lifetime = baseLifetime; fire.lifetime = baseLifetime;
fire.set(tile.worldx(), tile.worldy()); 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){ public static void extinguish(Tile tile, float intensity){
if(tile != null && map.containsKey(tile.pos())){ 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 @Override
public void update(){ 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)); 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)); 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; return;
} }
time = Mathf.clamp(time + Timers.delta(), 0, lifetime()); time = Mathf.clamp(time + Time.delta(), 0, lifetime());
if(time >= lifetime() || tile == null){ if(time >= lifetime() || tile == null){
Call.onFireRemoved(getID()); Call.onFireRemoved(getID());
@@ -118,7 +118,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
float flammability = baseFlammability + puddleFlammability; float flammability = baseFlammability + puddleFlammability;
if(!damage && flammability <= 0){ if(!damage && flammability <= 0){
time += Timers.delta() * 8; time += Time.delta() * 8;
} }
if(baseFlammability < 0 || block != tile.block()){ if(baseFlammability < 0 || block != tile.block()){
@@ -127,20 +127,20 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
} }
if(damage){ 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))){ if(flammability > 1f && Mathf.chance(spreadChance * Time.delta() * Mathf.clamp(flammability / 5f, 0.3f, 2f))){
GridPoint2 p = Mathf.select(Geometry.d4); Point2 p = Geometry.d4[Mathf.random(3)];
Tile other = world.tile(tile.x + p.x, tile.y + p.y); Tile other = world.tile(tile.x + p.x, tile.y + p.y);
create(other); 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)); 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); Puddle p = Puddle.getPuddle(tile);
if(p != null){ if(p != null){
puddleFlammability = p.getFlammability() / 3f; puddleFlammability = p.getFlammability() / 3f;
@@ -1,13 +1,13 @@
package io.anuke.mindustry.entities.effect; 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.Vars;
import io.anuke.mindustry.world.Tile; 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. * 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; GroundEffect effect = (GroundEffect) this.effect;
if(effect.isStatic){ if(effect.isStatic){
time += Timers.delta(); time += Time.delta();
time = Mathf.clamp(time, 0, effect.staticLife); time = Mathf.clamp(time, 0, effect.staticLife);
@@ -1,26 +1,25 @@
package io.anuke.mindustry.entities.effect; 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.Loc;
import io.anuke.annotations.Annotations.Remote; 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.entities.Unit;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Tile; 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.effectGroup;
import static io.anuke.mindustry.Vars.threads;
public class ItemTransfer extends TimedEntity implements DrawTrait{ public class ItemTransfer extends TimedEntity implements DrawTrait{
private Vector2 from = new Vector2(); private Vector2 from = new Vector2();
@@ -28,7 +27,7 @@ public class ItemTransfer extends TimedEntity implements DrawTrait{
private Vector2 tovec = new Vector2(); private Vector2 tovec = new Vector2();
private Item item; private Item item;
private float seed; private float seed;
private PosTrait to; private Position to;
private Runnable done; private Runnable done;
public ItemTransfer(){ 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){ 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; if(tile == null || tile.entity == null || tile.entity.items == null) return;
for(int i = 0; i < Mathf.clamp(amount / 3, 1, 8); i++){ 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); tile.entity.items.add(item, amount);
} }
public static void create(Item item, float fromx, float fromy, PosTrait to, Runnable done){ public static void create(Item item, float fromx, float fromy, Position to, Runnable done){
ItemTransfer tr = Pooling.obtain(ItemTransfer.class, ItemTransfer::new); ItemTransfer tr = Pools.obtain(ItemTransfer.class, ItemTransfer::new);
tr.item = item; tr.item = item;
tr.from.set(fromx, fromy); tr.from.set(fromx, fromy);
tr.to = to; tr.to = to;
@@ -86,9 +85,9 @@ public class ItemTransfer extends TimedEntity implements DrawTrait{
@Override @Override
public void removed(){ public void removed(){
if(done != null){ if(done != null){
threads.run(done); done.run();
} }
Pooling.free(this); Pools.free(this);
} }
@Override @Override
@@ -108,8 +107,7 @@ public class ItemTransfer extends TimedEntity implements DrawTrait{
public void draw(){ public void draw(){
float length = fslope() * 6f; float length = fslope() * 6f;
float angle = current.set(x, y).sub(from).angle(); float angle = current.set(x, y).sub(from).angle();
Draw.color(Palette.accent); Lines.stroke(fslope() * 2f, Palette.accent);
Lines.stroke(fslope() * 2f);
Lines.circle(x, y, fslope() * 2f); Lines.circle(x, y, fslope() * 2f);
Lines.lineAngleCenter(x, y, angle, length); Lines.lineAngleCenter(x, y, angle, length);
@@ -1,11 +1,24 @@
package io.anuke.mindustry.entities.effect; 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.Loc;
import io.anuke.annotations.Annotations.Remote; 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.content.bullets.TurretBullets;
import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.Units; 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.game.Team;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette; 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.DataInput;
import java.io.DataOutput; 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 class Lightning extends TimedEntity implements DrawTrait, SyncTrait, TimeTrait{
public static final float lifetime = 10f; 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 Rectangle rect = new Rectangle();
private static final Array<Unit> entities = new Array<>(); private static final Array<Unit> entities = new Array<>();
private static final IntSet hit = new IntSet(); 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 final float hitRange = 30f;
private static int lastSeed = 0; private static int lastSeed = 0;
private Array<PosTrait> lines = new Array<>(); private Array<Position> lines = new Array<>();
private Color color = Palette.lancerLaser; private Color color = Palette.lancerLaser;
/**For pooling use only. Do not call directly!*/ /**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) @Remote(called = Loc.server)
public static void createLighting(int seed, Team team, Color color, float damage, float x, float y, float rotation, int length){ 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; Float dmg = damage;
l.x = x; l.x = x;
@@ -68,7 +73,7 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time
for (int i = 0; i < length/2; i++) { for (int i = 0; i < length/2; i++) {
Bullet.create(TurretBullets.damageLightning, l, team, x, y, 0f, 1f, 1f, dmg); 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); rect.setSize(hitRange).setCenter(x, y);
entities.clear(); entities.clear();
@@ -120,15 +125,17 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time
@Override @Override
public void removed(){ public void removed(){
super.removed(); super.removed();
Pooling.free(this); Pools.free(this);
} }
@Override @Override
public void draw(){ public void draw(){
float lx = x, ly = y; float lx = x, ly = y;
Draw.color(color, Color.WHITE, fin()); Draw.color(color, Color.WHITE, fin());
//TODO this is really, really bad rendering
/*
for(int i = 0; i < lines.size; i++){ for(int i = 0; i < lines.size; i++){
PosTrait v = lines.get(i); Position v = lines.get(i);
float f = (float) i / lines.size; 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.line(lx, ly, v.getX(), v.getY());
Lines.stroke(3f * fout() * (1f - f)); Lines.stroke(3f * fout() * (1f - f));
// Lines.lineAngleCenter(lx, ly, Angles.angle(lx, ly, v.getX(), v.getY()) + 90f, 20f);
lx = v.getX(); lx = v.getX();
ly = v.getY(); ly = v.getY();
} }*/
Draw.color(); Draw.color();
} }
@@ -1,12 +1,23 @@
package io.anuke.mindustry.entities.effect; 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.Loc;
import io.anuke.annotations.Annotations.Remote; 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.Liquids;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.content.bullets.TurretBullets; 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.net.Net;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile; 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.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -85,10 +84,10 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
Puddle p = map.get(tile.pos()); 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, Effects.effect(BlockFx.ripple, tile.floor().liquidDrop.color,
(tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f); (tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f);
p.lastRipple = Timers.time(); p.lastRipple = Time.time();
} }
return; return;
} }
@@ -97,7 +96,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
if(p == null){ if(p == null){
if(Net.client()) return; //not clientside. 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.tile = tile;
puddle.liquid = liquid; puddle.liquid = liquid;
puddle.amount = amount; puddle.amount = amount;
@@ -108,9 +107,9 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
}else if(p.liquid == liquid){ }else if(p.liquid == liquid){
p.accepting = Math.max(amount, p.accepting); p.accepting = Math.max(amount, p.accepting);
if(generation == 0 && p.lastRipple <= 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); 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{ }else{
p.amount += reactPuddle(p.liquid, liquid, amount, p.tile, p.x, p.y); 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 //update code
float addSpeed = accepting > 0 ? 3f : 0f; float addSpeed = accepting > 0 ? 3f : 0f;
amount -= Timers.delta() * (1f - liquid.viscosity) / (5f + addSpeed); amount -= Time.delta() * (1f - liquid.viscosity) / (5f + addSpeed);
amount += accepting; amount += accepting;
accepting = 0f; accepting = 0f;
if(amount >= maxLiquid / 1.5f && generation < maxGeneration){ if(amount >= maxLiquid / 1.5f && generation < maxGeneration){
float deposited = Math.min((amount - maxLiquid / 1.5f) / 4f, 0.3f) * Timers.delta(); float deposited = Math.min((amount - maxLiquid / 1.5f) / 4f, 0.3f) * Time.delta();
for(GridPoint2 point : Geometry.d4){ for(Point2 point : Geometry.d4){
Tile other = world.tile(tile.x + point.x, tile.y + point.y); Tile other = world.tile(tile.x + point.x, tile.y + point.y);
if(other != null && other.block() == Blocks.air && !other.hasCliffs()){ if(other != null && other.block() == Blocks.air && !other.hasCliffs()){
deposit(other, tile, liquid, deposited, generation + 1); 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); Fire.create(tile);
} }
updateTime = 20f; updateTime = 20f;
} }
updateTime -= Timers.delta(); updateTime -= Time.delta();
} }
@Override @Override
@@ -232,11 +231,11 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
float smag = onLiquid ? 0.8f : 0f; float smag = onLiquid ? 0.8f : 0f;
float sscl = 20f; float sscl = 20f;
Draw.color(Hue.shift(tmp.set(liquid.color), 2, -0.05f)); Draw.color(tmp.set(liquid.color).shiftValue(-0.05f));
Fill.circle(x + Mathf.sin(Timers.time() + seeds * 532, sscl, smag), y + Mathf.sin(Timers.time() + seeds * 53, sscl, smag), f * 8f); 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) -> { Angles.randLenVectors(id, 3, f * 6f, (ex, ey) -> {
Fill.circle(x + ex + Mathf.sin(Timers.time() + seeds * 532, sscl, smag), Fill.circle(x + ex + Mathf.sin(Time.time() + seeds * 532, sscl, smag),
y + ey + Mathf.sin(Timers.time() + seeds * 53, sscl, smag), f * 5f); y + ey + Mathf.sin(Time.time() + seeds * 53, sscl, smag), f * 5f);
seeds++; seeds++;
}); });
Draw.color(); Draw.color();
@@ -1,7 +1,8 @@
package io.anuke.mindustry.entities.effect; package io.anuke.mindustry.entities.effect;
import io.anuke.ucore.graphics.Draw; import io.anuke.arc.Core;
import io.anuke.ucore.util.Mathf; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.arc.math.Mathf;
public class RubbleDecal extends Decal{ public class RubbleDecal extends Decal{
private int size; private int size;
@@ -20,7 +21,7 @@ public class RubbleDecal extends Decal{
public void drawDecal(){ public void drawDecal(){
String region = "rubble-" + size + "-" + Mathf.randomSeed(id, 0, 1); String region = "rubble-" + size + "-" + Mathf.randomSeed(id, 0, 1);
if(!Draw.hasRegion(region)){ if(!Core.atlas.has(region)){
remove(); remove();
return; return;
} }
@@ -1,10 +1,11 @@
package io.anuke.mindustry.entities.effect; 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.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; import static io.anuke.mindustry.Vars.world;
@@ -15,7 +16,7 @@ public class ScorchDecal extends Decal{
public static void create(float x, float y){ public static void create(float x, float y){
if(regions[0] == null){ if(regions[0] == null){
for(int i = 0; i < regions.length; i++){ 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)]; TextureRegion region = regions[Mathf.randomSeed(id - i, 0, scorches - 1)];
float rotation = Mathf.randomSeed(id + i, 0, 360); float rotation = Mathf.randomSeed(id + i, 0, 360);
float space = 1.5f + Mathf.randomSeed(id + i + 1, 0, 20) / 10f; 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);
} }
} }
} }
@@ -1,7 +1,7 @@
package io.anuke.mindustry.entities.traits; package io.anuke.mindustry.entities.traits;
import io.anuke.ucore.entities.trait.DamageTrait; import io.anuke.arc.entities.trait.DamageTrait;
import io.anuke.ucore.entities.trait.Entity; import io.anuke.arc.entities.trait.Entity;
public interface AbsorbTrait extends Entity, TeamTrait, DamageTrait{ public interface AbsorbTrait extends Entity, TeamTrait, DamageTrait{
void absorb(); void absorb();
@@ -1,9 +1,19 @@
package io.anuke.mindustry.entities.traits; package io.anuke.mindustry.entities.traits;
import com.badlogic.gdx.Gdx; import io.anuke.arc.Core;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.Events;
import com.badlogic.gdx.utils.Array; import io.anuke.arc.collection.Array;
import com.badlogic.gdx.utils.Queue; 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.Vars;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.content.fx.BlockFx; 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.game.EventType.BuildSelectEvent;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.graphics.Shapes;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Recipe; 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.Tile;
import io.anuke.mindustry.world.blocks.BuildBlock; import io.anuke.mindustry.world.blocks.BuildBlock;
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; 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.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -44,6 +45,7 @@ import static io.anuke.mindustry.Vars.*;
*/ */
public interface BuilderTrait extends Entity{ public interface BuilderTrait extends Entity{
//these are not instance variables! //these are not instance variables!
Vector2[] tmptr = new Vector2[]{new Vector2(), new Vector2(), new Vector2(), new Vector2()};
float placeDistance = 150f; float placeDistance = 150f;
float mineDistance = 70f; float mineDistance = 70f;
Array<BuildRequest> removal = new Array<>(); Array<BuildRequest> removal = new Array<>();
@@ -202,7 +204,7 @@ public interface BuilderTrait extends Entity{
Tile tile = world.tile(current.x, current.y); Tile tile = world.tile(current.x, current.y);
if(unit.distanceTo(tile) > placeDistance){ if(unit.dst(tile) > placeDistance){
return; return;
} }
@@ -232,7 +234,7 @@ public interface BuilderTrait extends Entity{
return; return;
} }
if(unit.distanceTo(tile) <= placeDistance){ if(unit.dst(tile) <= placeDistance){
unit.rotation = Mathf.slerpDelta(unit.rotation, unit.angleTo(entity), 0.4f); unit.rotation = Mathf.slerpDelta(unit.rotation, unit.angleTo(entity), 0.4f);
} }
@@ -240,9 +242,9 @@ public interface BuilderTrait extends Entity{
if(!Net.client()){ if(!Net.client()){
//deconstructing is 2x as fast //deconstructing is 2x as fast
if(current.breaking){ 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{ }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(); current.progress = entity.progress();
@@ -251,7 +253,7 @@ public interface BuilderTrait extends Entity{
} }
if(!current.initialized){ 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; current.initialized = true;
} }
} }
@@ -261,16 +263,16 @@ public interface BuilderTrait extends Entity{
Tile tile = getMineTile(); Tile tile = getMineTile();
TileEntity core = unit.getClosestCore(); 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)){ || tile.floor().drops == null || !unit.inventory.canAcceptItem(tile.floor().drops.item) || !canMine(tile.floor().drops.item)){
setMineTile(null); setMineTile(null);
}else{ }else{
Item item = tile.floor().drops.item; Item item = tile.floor().drops.item;
unit.rotation = Mathf.slerpDelta(unit.rotation, unit.angleTo(tile.worldx(), tile.worldy()), 0.4f); 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, Call.transferItemTo(item, 1,
tile.worldx() + Mathf.range(tilesize / 2f), tile.worldx() + Mathf.range(tilesize / 2f),
tile.worldy() + Mathf.range(tilesize / 2f), core.tile); tile.worldy() + Mathf.range(tilesize / 2f), core.tile);
@@ -282,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, Effects.effect(BlockFx.pulverizeSmall,
tile.worldx() + Mathf.range(tilesize / 2f), tile.worldx() + Mathf.range(tilesize / 2f),
tile.worldy() + Mathf.range(tilesize / 2f), 0f, item.color); tile.worldy() + Mathf.range(tilesize / 2f), 0f, item.color);
@@ -304,12 +306,12 @@ public interface BuilderTrait extends Entity{
Tile tile = world.tile(request.x, request.y); Tile tile = world.tile(request.x, request.y);
if(unit.distanceTo(tile) > placeDistance){ if(unit.dst(tile) > placeDistance){
return; return;
} }
Draw.color(Palette.accent); Draw.color(Palette.accent);
float focusLen = 3.8f + Mathf.absin(Timers.time(), 1.1f, 0.6f); float focusLen = 3.8f + Mathf.absin(Time.time(), 1.1f, 0.6f);
float px = unit.x + Angles.trnsx(unit.rotation, focusLen); float px = unit.x + Angles.trnsx(unit.rotation, focusLen);
float py = unit.y + Angles.trnsy(unit.rotation, focusLen); float py = unit.y + Angles.trnsy(unit.rotation, focusLen);
@@ -332,7 +334,7 @@ public interface BuilderTrait extends Entity{
Lines.line(px, py, x1, y1); Lines.line(px, py, x1, y1);
Lines.line(px, py, x3, y3); 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(); Draw.color();
} }
@@ -343,22 +345,23 @@ public interface BuilderTrait extends Entity{
if(tile == null) return; 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 swingScl = 12f, swingMag = tilesize / 8f;
float flashScl = 0.3f; float flashScl = 0.3f;
float px = unit.x + Angles.trnsx(unit.rotation, focusLen); float px = unit.x + Angles.trnsx(unit.rotation, focusLen);
float py = unit.y + Angles.trnsy(unit.rotation, focusLen); float py = unit.y + Angles.trnsy(unit.rotation, focusLen);
float ex = tile.worldx() + Mathf.sin(Timers.time() + 48, swingScl, swingMag); float ex = tile.worldx() + Mathf.sin(Time.time() + 48, swingScl, swingMag);
float ey = tile.worldy() + Mathf.sin(Timers.time() + 48, swingScl + 2f, 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); Shapes.laser("minelaser", "minelaser-end", px, py, ex, ey);
if(unit instanceof Player && ((Player) unit).isLocal){ if(unit instanceof Player && ((Player) unit).isLocal){
Draw.color(Palette.accent); Lines.stroke(1f, Palette.accent);
Lines.poly(tile.worldx(), tile.worldy(), 4, tilesize / 2f * Mathf.sqrt2, Timers.time()); Lines.poly(tile.worldx(), tile.worldy(), 4, tilesize / 2f * Mathf.sqrt2, Time.time());
} }
Draw.color(); Draw.color();
@@ -1,6 +1,6 @@
package io.anuke.mindustry.entities.traits; 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{ public interface CarriableTrait extends TeamTrait, TargetTrait, SolidTrait{
@@ -5,8 +5,8 @@ import io.anuke.annotations.Annotations.Remote;
import io.anuke.mindustry.content.fx.UnitFx; import io.anuke.mindustry.content.fx.UnitFx;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.ucore.core.Effects; import io.anuke.arc.entities.Effects;
import io.anuke.ucore.entities.trait.SolidTrait; import io.anuke.arc.entities.trait.SolidTrait;
public interface CarryTrait extends TeamTrait, SolidTrait, TargetTrait{ public interface CarryTrait extends TeamTrait, SolidTrait, TargetTrait{
@@ -1,6 +1,6 @@
package io.anuke.mindustry.entities.traits; 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. * Marks an entity as serializable.
@@ -1,12 +1,12 @@
package io.anuke.mindustry.entities.traits; 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.mindustry.type.Weapon;
import io.anuke.ucore.entities.trait.VelocityTrait;
import io.anuke.ucore.util.Timer;
public interface ShooterTrait extends VelocityTrait, TeamTrait, InventoryTrait{ public interface ShooterTrait extends VelocityTrait, TeamTrait, InventoryTrait{
Timer getTimer(); Interval getTimer();
int getShootTimer(boolean left); int getShootTimer(boolean left);
@@ -2,9 +2,9 @@ package io.anuke.mindustry.entities.traits;
import io.anuke.mindustry.core.NetClient; import io.anuke.mindustry.core.NetClient;
import io.anuke.mindustry.net.Interpolator; import io.anuke.mindustry.net.Interpolator;
import io.anuke.ucore.core.Core; import io.anuke.arc.Core;
import io.anuke.ucore.entities.trait.Entity; import io.anuke.arc.entities.trait.Entity;
import io.anuke.ucore.util.Tmp; import io.anuke.arc.util.Tmp;
import java.io.DataInput; import java.io.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -33,8 +33,7 @@ public interface SyncTrait extends Entity, TypeTrait{
if(isClipped()){ if(isClipped()){
//move off screen when no longer in bounds //move off screen when no longer in bounds
Tmp.r1.setSize(Core.camera.viewportWidth * Core.camera.zoom * NetClient.viewScale, Tmp.r1.setSize(Core.camera.width * NetClient.viewScale, Core.camera.height * NetClient.viewScale)
Core.camera.viewportHeight * Core.camera.zoom * NetClient.viewScale)
.setCenter(Core.camera.position.x, Core.camera.position.y); .setCenter(Core.camera.position.x, Core.camera.position.y);
if(!Tmp.r1.contains(getX(), getY()) && !Tmp.r1.contains(getInterpolator().last.x, getInterpolator().last.y)){ if(!Tmp.r1.contains(getX(), getY()) && !Tmp.r1.contains(getInterpolator().last.x, getInterpolator().last.y)){
@@ -1,14 +1,14 @@
package io.anuke.mindustry.entities.traits; 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.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. * Base interface for targetable entities.
*/ */
public interface TargetTrait extends PosTrait, VelocityTrait{ public interface TargetTrait extends Position, VelocityTrait{
boolean isDead(); boolean isDead();
@@ -1,7 +1,7 @@
package io.anuke.mindustry.entities.traits; package io.anuke.mindustry.entities.traits;
import io.anuke.mindustry.game.Team; 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{ public interface TeamTrait extends Entity{
Team getTeam(); Team getTeam();
@@ -1,8 +1,8 @@
package io.anuke.mindustry.entities.traits; package io.anuke.mindustry.entities.traits;
import com.badlogic.gdx.utils.Array; import io.anuke.arc.collection.Array;
import com.badlogic.gdx.utils.ObjectIntMap; import io.anuke.arc.collection.ObjectIntMap;
import io.anuke.ucore.function.Supplier; import io.anuke.arc.function.Supplier;
public interface TypeTrait{ public interface TypeTrait{
int[] lastRegisteredID = {0}; int[] lastRegisteredID = {0};
@@ -1,9 +1,19 @@
package io.anuke.mindustry.entities.units; 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.Loc;
import io.anuke.annotations.Annotations.Remote; 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.arc.util.Timer;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.content.fx.ExplosionFx; import io.anuke.mindustry.content.fx.ExplosionFx;
import io.anuke.mindustry.entities.Damage; import io.anuke.mindustry.entities.Damage;
@@ -24,11 +34,6 @@ import io.anuke.mindustry.type.Weapon;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.units.CommandCenter.CommandCenterEntity; import io.anuke.mindustry.world.blocks.units.CommandCenter.CommandCenterEntity;
import io.anuke.mindustry.world.meta.BlockFlag; 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.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -46,7 +51,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
protected static final int timerShootRight = timerIndex++; protected static final int timerShootRight = timerIndex++;
protected UnitType type; protected UnitType type;
protected Timer timer = new Timer(5); protected Interval timer = new Interval(5);
protected StateMachine state = new StateMachine(); protected StateMachine state = new StateMachine();
protected TargetTrait target; protected TargetTrait target;
@@ -77,7 +82,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
Effects.shake(2f, 2f, unit); Effects.shake(2f, 2f, unit);
//must run afterwards so the unit's group is not null when sending the removal packet //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 @Override
@@ -222,7 +227,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
} }
@Override @Override
public Timer getTimer(){ public Interval getTimer(){
return timer; return timer;
} }
@@ -282,7 +287,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
@Override @Override
public void update(){ public void update(){
hitTime -= Timers.delta(); hitTime -= Time.delta();
if(isDead()){ if(isDead()){
updateRespawning(); updateRespawning();
@@ -1,26 +1,25 @@
package io.anuke.mindustry.entities.units; 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.Predict;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.entities.traits.CarriableTrait; import io.anuke.mindustry.entities.traits.CarriableTrait;
import io.anuke.mindustry.entities.traits.CarryTrait; import io.anuke.mindustry.entities.traits.CarryTrait;
import io.anuke.mindustry.graphics.Trail;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.type.AmmoType;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockFlag; 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; import static io.anuke.mindustry.Vars.world;
public abstract class FlyingUnit extends BaseUnit implements CarryTrait{ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
protected static Translator vec = new Translator(); protected static Vector2 vec = new Vector2();
protected static float wobblyness = 0.6f;
protected Trail trail = new Trail(8);
protected CarriableTrait carrying; protected CarriableTrait carrying;
protected final UnitState protected final UnitState
@@ -75,8 +74,8 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
}else{ }else{
attack(150f); attack(150f);
if((Mathf.angNear(angleTo(target), rotation, 15f) || !getWeapon().getAmmo().bullet.keepVelocity) //bombers don't care about rotation if((Angles.near(angleTo(target), rotation, 15f) || !getWeapon().getAmmo().bullet.keepVelocity) //bombers don't care about rotation
&& distanceTo(target) < Math.max(getWeapon().getAmmo().getRange(), type.range)){ && dst(target) < Math.max(getWeapon().getAmmo().getRange(), type.range)){
AmmoType ammo = getWeapon().getAmmo(); AmmoType ammo = getWeapon().getAmmo();
Vector2 to = Predict.intercept(FlyingUnit.this, target, ammo.bullet.speed); 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){ 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(); updateRotation();
wobble(); wobble();
} }
trail.update(x + Angles.trnsx(rotation + 180f, 6f) + Mathf.range(wobblyness),
y + Angles.trnsy(rotation + 180f, 6f) + Mathf.range(wobblyness));
} }
@Override @Override
@@ -169,11 +165,6 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
Draw.alpha(1f); Draw.alpha(1f);
} }
@Override
public void drawOver(){
trail.draw(type.trailColor, 5f);
}
@Override @Override
public void behavior(){ public void behavior(){
if(health <= health * type.retreatPercent && !isCommanded() && if(health <= health * type.retreatPercent && !isCommanded() &&
@@ -200,11 +191,11 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
protected void wobble(){ protected void wobble(){
if(Net.client()) return; if(Net.client()) return;
x += Mathf.sin(Timers.time() + id * 999, 25f, 0.08f)*Timers.delta(); x += Mathf.sin(Time.time() + id * 999, 25f, 0.08f)*Time.delta();
y += Mathf.cos(Timers.time() + id * 999, 25f, 0.08f)*Timers.delta(); y += Mathf.cos(Time.time() + id * 999, 25f, 0.08f)*Time.delta();
if(velocity.len() <= 0.05f){ 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.rotate((circleLength - vec.len()) / circleLength * 180f);
} }
vec.setLength(speed * Timers.delta()); vec.setLength(speed * Time.delta());
velocity.add(vec); velocity.add(vec);
} }
@@ -235,9 +226,9 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
vec.set(target.getX() - x, target.getY() - y); 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); if(length < 0) vec.rotate(180f);
velocity.add(vec); 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.setAngle(Mathf.slerpDelta(velocity.angle(), vec.angle(), 0.44f));
} }
vec.setLength(type.speed * Timers.delta()); vec.setLength(type.speed * Time.delta());
velocity.add(vec); velocity.add(vec);
} }
@@ -1,7 +1,11 @@
package io.anuke.mindustry.entities.units; package io.anuke.mindustry.entities.units;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.graphics.Color;
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.Vector2;
import io.anuke.arc.util.Time;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.Predict; import io.anuke.mindustry.entities.Predict;
import io.anuke.mindustry.entities.TileEntity; 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.type.Weapon;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor; 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.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -26,7 +25,7 @@ import static io.anuke.mindustry.Vars.content;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
public abstract class GroundUnit extends BaseUnit{ public abstract class GroundUnit extends BaseUnit{
protected static Translator vec = new Translator(); protected static Vector2 vec = new Vector2();
protected float walkTime; protected float walkTime;
protected float stuckTime; protected float stuckTime;
@@ -42,7 +41,7 @@ public abstract class GroundUnit extends BaseUnit{
public void update(){ public void update(){
TileEntity core = getClosestEnemyCore(); 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){ if(core != null && dst < getWeapon().getAmmo().getRange() / 1.1f){
target = core; target = core;
@@ -57,7 +56,7 @@ public abstract class GroundUnit extends BaseUnit{
public void update(){ public void update(){
TileEntity target = getClosestCore(); TileEntity target = getClosestCore();
if(target != null){ if(target != null){
if(distanceTo(target) > 400f){ if(dst(target) > 400f){
moveAwayFromCore(); moveAwayFromCore();
}else{ }else{
patrol(); patrol();
@@ -119,14 +118,14 @@ public abstract class GroundUnit extends BaseUnit{
public void update(){ public void update(){
super.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()){ if(!velocity.isZero()){
baseRotation = Mathf.slerpDelta(baseRotation, velocity.angle(), 0.05f); baseRotation = Mathf.slerpDelta(baseRotation, velocity.angle(), 0.05f);
} }
if(stuckTime < 1f){ 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(!Units.invalidateTarget(target, this)){
if(distanceTo(target) < getWeapon().getAmmo().getRange()){ if(dst(target) < getWeapon().getAmmo().getRange()){
rotate(angleTo(target)); rotate(angleTo(target));
if(Mathf.angNear(angleTo(target), rotation, 13f)){ if(Angles.near(angleTo(target), rotation, 13f)){
AmmoType ammo = getWeapon().getAmmo(); AmmoType ammo = getWeapon().getAmmo();
Vector2 to = Predict.intercept(GroundUnit.this, target, ammo.bullet.speed); Vector2 to = Predict.intercept(GroundUnit.this, target, ammo.bullet.speed);
@@ -238,12 +237,12 @@ public abstract class GroundUnit extends BaseUnit{
} }
protected void patrol(){ protected void patrol(){
vec.trns(baseRotation, type.speed * Timers.delta()); vec.trns(baseRotation, type.speed * Time.delta());
velocity.add(vec.x, vec.y); velocity.add(vec.x, vec.y);
vec.trns(baseRotation, type.hitsizeTile); vec.trns(baseRotation, type.hitsizeTile);
Tile tile = world.tileWorld(x + vec.x, y + vec.y); Tile tile = world.tileWorld(x + vec.x, y + vec.y);
if((tile == null || tile.solid() || tile.floor().drownTime > 0) || stuckTime > 10f){ 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); 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.rotate((circleLength - vec.len()) / circleLength * 180f);
} }
vec.setLength(type.speed * Timers.delta()); vec.setLength(type.speed * Time.delta());
velocity.add(vec); velocity.add(vec);
} }
@@ -272,7 +271,7 @@ public abstract class GroundUnit extends BaseUnit{
float angle = angleTo(targetTile); 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); rotation = Mathf.slerpDelta(rotation, angle, type.rotatespeed);
} }
@@ -292,11 +291,11 @@ public abstract class GroundUnit extends BaseUnit{
Tile targetTile = world.pathfinder.getTargetTile(enemy, tile); Tile targetTile = world.pathfinder.getTargetTile(enemy, tile);
TileEntity core = getClosestCore(); 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); 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); rotation = Mathf.slerpDelta(rotation, angle, type.rotatespeed);
} }
} }
@@ -1,24 +1,22 @@
package io.anuke.mindustry.entities.units; package io.anuke.mindustry.entities.units;
import com.badlogic.gdx.math.Vector2; import io.anuke.arc.Core;
import io.anuke.ucore.util.Translator; import io.anuke.arc.math.geom.Vector2;
import static io.anuke.mindustry.Vars.threads;
/** /**
* Used to group entities together, for formations and such. * Used to group entities together, for formations and such.
* Usually, squads are used by units spawned in the same wave. * Usually, squads are used by units spawned in the same wave.
*/ */
public class Squad{ public class Squad{
public Vector2 direction = new Translator(); public Vector2 direction = new Vector2();
public int units; public int units;
private long lastUpdated; private long lastUpdated;
protected void update(){ protected void update(){
if(threads.getFrameID() != lastUpdated){ if(Core.graphics.getFrameId() != lastUpdated){
direction.setZero(); direction.setZero();
lastUpdated = threads.getFrameID(); lastUpdated = Core.graphics.getFrameId();
} }
} }
} }
@@ -1,6 +1,6 @@
package io.anuke.mindustry.entities.units; package io.anuke.mindustry.entities.units;
import io.anuke.ucore.util.Bundles; import io.anuke.arc.Core;
public enum UnitCommand{ public enum UnitCommand{
attack, retreat, patrol; attack, retreat, patrol;
@@ -8,7 +8,7 @@ public enum UnitCommand{
private final String localized; private final String localized;
UnitCommand(){ UnitCommand(){
localized = Bundles.get("command." + name()); localized = Core.bundle.get("command." + name());
} }
public String localized(){ public String localized(){
@@ -5,7 +5,7 @@ import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.ucore.util.Mathf; import io.anuke.arc.math.Mathf;
public class UnitDrops{ public class UnitDrops{
private static Item[] dropTable; private static Item[] dropTable;
@@ -1,8 +1,13 @@
package io.anuke.mindustry.entities.units; package io.anuke.mindustry.entities.units;
import com.badlogic.gdx.graphics.Color; import io.anuke.arc.Core;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.arc.collection.ObjectSet;
import com.badlogic.gdx.utils.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.Items;
import io.anuke.mindustry.content.Weapons; import io.anuke.mindustry.content.Weapons;
import io.anuke.mindustry.entities.traits.TypeTrait; 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.Item;
import io.anuke.mindustry.type.Weapon; import io.anuke.mindustry.type.Weapon;
import io.anuke.mindustry.ui.ContentDisplay; 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{ public class UnitType extends UnlockableContent{
protected final Supplier<? extends BaseUnit> constructor; protected final Supplier<? extends BaseUnit> constructor;
@@ -51,11 +50,11 @@ public class UnitType extends UnlockableContent{
public <T extends BaseUnit> UnitType(String name, Class<T> type, Supplier<T> mainConstructor){ public <T extends BaseUnit> UnitType(String name, Class<T> type, Supplier<T> mainConstructor){
this.name = name; this.name = name;
this.constructor = mainConstructor; this.constructor = mainConstructor;
this.description = Bundles.getOrNull("unit." + name + ".description"); this.description = Core.bundle.getOrNull("unit." + name + ".description");
TypeTrait.registerType(type, mainConstructor); 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("Warning: unit '" + name + "' is missing a localized name. Add the follow to bundle.properties:");
Log.err("unit." + this.name + ".name=" + Strings.capitalize(name.replace('-', '_'))); Log.err("unit." + this.name + ".name=" + Strings.capitalize(name.replace('-', '_')));
} }
@@ -68,7 +67,7 @@ public class UnitType extends UnlockableContent{
@Override @Override
public String localizedName(){ public String localizedName(){
return Bundles.get("unit." + name + ".name"); return Core.bundle.get("unit." + name + ".name");
} }
@Override @Override
@@ -78,12 +77,12 @@ public class UnitType extends UnlockableContent{
@Override @Override
public void load(){ public void load(){
iconRegion = Draw.region("unit-icon-" + name); iconRegion = Core.atlas.find("unit-icon-" + name);
region = Draw.region(name); region = Core.atlas.find(name);
if(!isFlying){ if(!isFlying){
legRegion = Draw.region(name + "-leg"); legRegion = Core.atlas.find(name + "-leg");
baseRegion = Draw.region(name + "-base"); baseRegion = Core.atlas.find(name + "-base");
} }
} }
@@ -1,8 +1,11 @@
package io.anuke.mindustry.entities.units.types; package io.anuke.mindustry.entities.units.types;
import com.badlogic.gdx.math.Vector2;
import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote; import io.anuke.annotations.Annotations.Remote;
import io.anuke.arc.Core;
import io.anuke.arc.entities.Effects;
import io.anuke.arc.math.Angles;
import io.anuke.arc.math.geom.Vector2;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.content.fx.UnitFx; import io.anuke.mindustry.content.fx.UnitFx;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
@@ -15,14 +18,13 @@ import io.anuke.mindustry.entities.units.UnitState;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.AmmoType; 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.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
import java.io.IOException; import java.io.IOException;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.headless;
import static io.anuke.mindustry.Vars.players;
public class AlphaDrone extends FlyingUnit { public class AlphaDrone extends FlyingUnit {
static final float followDistance = 80f; static final float followDistance = 80f;
@@ -44,7 +46,7 @@ public class AlphaDrone extends FlyingUnit {
} }
target = last; target = last;
if(distanceTo(leader) < followDistance){ if(dst(leader) < followDistance){
targetClosest(); targetClosest();
}else{ }else{
target = null; target = null;
@@ -53,7 +55,7 @@ public class AlphaDrone extends FlyingUnit {
if(target != null){ if(target != null){
attack(50f); attack(50f);
if((Mathf.angNear(angleTo(target), rotation, 15f) && distanceTo(target) < getWeapon().getAmmo().getRange())){ if((Angles.near(angleTo(target), rotation, 15f) && dst(target) < getWeapon().getAmmo().getRange())){
AmmoType ammo = getWeapon().getAmmo(); AmmoType ammo = getWeapon().getAmmo();
Vector2 to = Predict.intercept(AlphaDrone.this, target, ammo.bullet.speed); Vector2 to = Predict.intercept(AlphaDrone.this, target, ammo.bullet.speed);
@@ -61,7 +63,7 @@ public class AlphaDrone extends FlyingUnit {
} }
} }
if(!leader.isShooting && distanceTo(leader) < 7f){ if(!leader.isShooting && dst(leader) < 7f){
Call.onAlphaDroneFade(AlphaDrone.this); Call.onAlphaDroneFade(AlphaDrone.this);
} }
} }
@@ -72,7 +74,7 @@ public class AlphaDrone extends FlyingUnit {
if(drone == null) return; if(drone == null) return;
Effects.effect(UnitFx.pickup, drone); Effects.effect(UnitFx.pickup, drone);
//must run afterwards so the unit's group is not null when sending the removal packet //must run afterwards so the unit's group is not null when sending the removal packet
threads.runDelay(drone::remove); Core.app.post(drone::remove);
} }
@Override @Override
@@ -1,6 +1,11 @@
package io.anuke.mindustry.entities.units.types; 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.content.blocks.Blocks;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.entities.TileEntity; 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.entities.units.UnitState;
import io.anuke.mindustry.game.EventType.BuildSelectEvent; import io.anuke.mindustry.game.EventType.BuildSelectEvent;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.ItemType; 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;
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
import io.anuke.mindustry.world.meta.BlockFlag; 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.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -63,7 +62,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
if(core == null) return; if(core == null) return;
if((entity.progress() < 1f || entity.progress() > 0f) && entity.tile.block() instanceof BuildBlock){ //building is valid 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){ if(isBreaking){
getPlaceQueue().addLast(new BuildRequest(entity.tile.x, entity.tile.y)); getPlaceQueue().addLast(new BuildRequest(entity.tile.x, entity.tile.y));
}else{ }else{
@@ -108,7 +107,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
if(target == null) return; if(target == null) return;
if(target.distanceTo(Drone.this) > type.range){ if(target.dst(Drone.this) > type.range){
circle(type.range*0.9f); circle(type.range*0.9f);
}else{ }else{
getWeapon().update(Drone.this, target.getX(), target.getY()); getWeapon().update(Drone.this, target.getX(), target.getY());
@@ -158,7 +157,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
if(target instanceof Tile){ if(target instanceof Tile){
moveTo(type.range / 1.5f); moveTo(type.range / 1.5f);
if(distanceTo(target) < type.range && mineTile != target){ if(dst(target) < type.range && mineTile != target){
setMineTile((Tile) target); setMineTile((Tile) target);
} }
@@ -196,7 +195,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
TileEntity tile = (TileEntity) target; 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){ 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); Call.transferItemTo(inventory.getItem().item, inventory.getItem().amount, x, y, tile.tile);
inventory.clearItem(); inventory.clearItem();
@@ -254,7 +253,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
} }
private void notifyPlaced(BuildEntity entity, boolean isBreaking){ 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){ if(!state.is(build) && dist / type.maxVelocity < entity.buildCost * 0.9f){
target = entity; target = entity;
@@ -311,7 +310,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
@Override @Override
protected void updateRotation(){ 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); rotation = Mathf.slerpDelta(rotation, angleTo(target), 0.3f);
}else{ }else{
rotation = Mathf.slerpDelta(rotation, velocity.angle(), 0.3f); rotation = Mathf.slerpDelta(rotation, velocity.angle(), 0.3f);
@@ -333,7 +332,6 @@ public class Drone extends FlyingUnit implements BuilderTrait{
@Override @Override
public void drawOver(){ public void drawOver(){
trail.draw(Palette.lightTrail, 3f);
drawBuilding(this); drawBuilding(this);
} }

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