Source reformat

This commit is contained in:
Anuken
2019-04-08 09:03:18 -04:00
parent 4a96b9bb00
commit b40beb0d1d
331 changed files with 2822 additions and 3274 deletions

View File

@@ -1,11 +1,10 @@
jdk: jdk:
- openjdk8 - openjdk8
script: script:
- "git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc" - "git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc"
- "./gradlew test" - "./gradlew test"
- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}" - "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}"
- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}" - "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}"
deploy: deploy:
provider: releases provider: releases
@@ -14,8 +13,8 @@ deploy:
api_key: api_key:
secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg= secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg=
file: file:
- "desktop/build/libs/desktop-release.jar" - "desktop/build/libs/desktop-release.jar"
- "server/build/libs/server-release.jar" - "server/build/libs/server-release.jar"
on: on:
repo: Anuken/Mindustry repo: Anuken/Mindustry
tags: true tags: true

View File

@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.anuke.mindustry"> package="io.anuke.mindustry">
<uses-feature android:glEsVersion="0x00020000" android:required="true" /> <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET"/>
<application <application
android:resizeableActivity="false" android:resizeableActivity="false"
@@ -16,16 +16,16 @@
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" /> <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"
android:screenOrientation="user" android:screenOrientation="user"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout"> android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
@@ -33,7 +33,7 @@
<category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/> <category android:name="android.intent.category.BROWSABLE"/>
<data android:mimeType="application/octet-stream"/> <data android:mimeType="application/octet-stream"/>
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap" /> <data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap"/>
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
@@ -41,28 +41,28 @@
<category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/> <category android:name="android.intent.category.BROWSABLE"/>
<data android:mimeType="application/octet-stream"/> <data android:mimeType="application/octet-stream"/>
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav" /> <data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav"/>
</intent-filter> </intent-filter>
<intent-filter android:icon="@mipmap/ic_launcher" <intent-filter android:icon="@mipmap/ic_launcher"
android:label="Mindustry Map" android:label="Mindustry Map"
android:priority="1"> android:priority="1">
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap" android:mimeType="*/*" /> <data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap" android:mimeType="*/*"/>
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav" android:mimeType="*/*" /> <data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav" android:mimeType="*/*"/>
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".DonationsActivity" <activity android:name=".DonationsActivity"
android:theme="@style/GdxTheme" /> android:theme="@style/GdxTheme"/>
</application> </application>

View File

@@ -1,30 +1,30 @@
buildscript { buildscript{
repositories { repositories{
mavenLocal() mavenLocal()
mavenCentral() mavenCentral()
google() google()
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
jcenter() jcenter()
} }
dependencies { dependencies{
classpath 'com.android.tools.build:gradle:3.3.2' classpath 'com.android.tools.build:gradle:3.3.2'
} }
} }
apply plugin: "com.android.application" apply plugin: "com.android.application"
configurations { natives } configurations{ natives }
repositories { repositories{
mavenCentral() mavenCentral()
jcenter() jcenter()
maven { maven{
url "https://maven.google.com" url "https://maven.google.com"
} }
} }
dependencies { dependencies{
implementation project(":core") implementation project(":core")
implementation project(":net") implementation project(":net")
@@ -46,14 +46,14 @@ task deploy(type: Copy){
from "build/outputs/apk/release/android-release.apk" from "build/outputs/apk/release/android-release.apk"
into "../deploy/" into "../deploy/"
rename ("android-release.apk", appName + "-android-" + getVersionString() + ".apk") rename("android-release.apk", appName + "-android-" + getVersionString() + ".apk")
} }
android { android{
buildToolsVersion '28.0.3' buildToolsVersion '28.0.3'
compileSdkVersion 28 compileSdkVersion 28
sourceSets { sourceSets{
main { main{
manifest.srcFile 'AndroidManifest.xml' manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src'] java.srcDirs = ['src']
aidl.srcDirs = ['src'] aidl.srcDirs = ['src']
@@ -65,11 +65,11 @@ android {
androidTest.setRoot('tests') androidTest.setRoot('tests')
} }
packagingOptions { packagingOptions{
exclude 'META-INF/robovm/ios/robovm.xml' exclude 'META-INF/robovm/ios/robovm.xml'
} }
defaultConfig { defaultConfig{
def vfile = file('../core/assets/version.properties') def vfile = file('../core/assets/version.properties')
def code = 0 def code = 0
@@ -93,16 +93,16 @@ android {
versionName versionNameResult versionName versionNameResult
} }
compileOptions { compileOptions{
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
} }
flavorDimensions "google" flavorDimensions "google"
signingConfigs { signingConfigs{
release { release{
if(project.hasProperty("RELEASE_STORE_FILE")) { if(project.hasProperty("RELEASE_STORE_FILE")){
storeFile file(RELEASE_STORE_FILE) storeFile file(RELEASE_STORE_FILE)
storePassword RELEASE_STORE_PASSWORD storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS keyAlias RELEASE_KEY_ALIAS
@@ -113,8 +113,8 @@ android {
} }
} }
buildTypes { buildTypes{
release { release{
signingConfig signingConfigs.release signingConfig signingConfigs.release
} }
} }
@@ -122,22 +122,22 @@ android {
// called every time gradle gets executed, takes the native dependencies of // called every time gradle gets executed, takes the native dependencies of
// the natives configuration, and extracts them to the proper libs/ folders // the natives configuration, and extracts them to the proper libs/ folders
// so they get packed with the APK. // so they get packed with the APK.
task copyAndroidNatives() { task copyAndroidNatives(){
file("libs/armeabi/").mkdirs() file("libs/armeabi/").mkdirs()
file("libs/armeabi-v7a/").mkdirs() file("libs/armeabi-v7a/").mkdirs()
file("libs/arm64-v8a/").mkdirs() file("libs/arm64-v8a/").mkdirs()
file("libs/x86_64/").mkdirs() file("libs/x86_64/").mkdirs()
file("libs/x86/").mkdirs() file("libs/x86/").mkdirs()
configurations.natives.files.each { jar -> configurations.natives.files.each{ jar ->
def outputDir = null def outputDir = null
if (jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a") if(jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a")
if (jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a") if(jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")
if (jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi") if(jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi")
if (jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64") if(jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64")
if (jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86") if(jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86")
if (outputDir != null) { if(outputDir != null){
copy { copy{
from zipTree(jar) from zipTree(jar)
into outputDir into outputDir
include "*.so" include "*.so"
@@ -146,21 +146,21 @@ task copyAndroidNatives() {
} }
} }
task run(type: Exec) { task run(type: Exec){
def path def path
def localProperties = project.file("../local.properties") def localProperties = project.file("../local.properties")
if (localProperties.exists()) { if(localProperties.exists()){
Properties properties = new Properties() Properties properties = new Properties()
localProperties.withInputStream { instr -> localProperties.withInputStream{ instr ->
properties.load(instr) properties.load(instr)
} }
def sdkDir = properties.getProperty('sdk.dir') def sdkDir = properties.getProperty('sdk.dir')
if (sdkDir) { if(sdkDir){
path = sdkDir path = sdkDir
} else { }else{
path = "$System.env.ANDROID_HOME" path = "$System.env.ANDROID_HOME"
} }
} else { }else{
path = "$System.env.ANDROID_HOME" path = "$System.env.ANDROID_HOME"
} }
@@ -169,19 +169,19 @@ task run(type: Exec) {
} }
// sets up the Android Idea project, using the old Ant based build. // sets up the Android Idea project, using the old Ant based build.
idea { idea{
module { module{
sourceDirs += file("src") sourceDirs += file("src")
scopes = [COMPILE: [plus: [project.configurations.compile]]] scopes = [COMPILE: [plus: [project.configurations.compile]]]
iml { iml{
withXml { withXml{
def node = it.asNode() def node = it.asNode()
def builder = NodeBuilder.newInstance() def builder = NodeBuilder.newInstance()
builder.current = node builder.current = node
builder.component(name: "FacetManager") { builder.component(name: "FacetManager"){
facet(type: "android", name: "Android") { facet(type: "android", name: "Android"){
configuration { configuration{
option(name: "UPDATE_PROPERTY_FILES", value: "true") option(name: "UPDATE_PROPERTY_FILES", value: "true")
} }
} }

View File

@@ -9,6 +9,5 @@
# #
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target. # Project target.
target=android-19 target=android-19

View File

@@ -18,18 +18,15 @@ import io.anuke.arc.function.Consumer;
import io.anuke.arc.scene.ui.layout.Unit; import io.anuke.arc.scene.ui.layout.Unit;
import io.anuke.arc.util.Strings; import io.anuke.arc.util.Strings;
import io.anuke.arc.util.serialization.Base64Coder; 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.net.KryoClient;
import io.anuke.net.KryoServer;
import java.io.File; import java.io.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -59,7 +56,7 @@ public class AndroidLauncher extends AndroidApplication{
int len = s.length(); int len = s.length();
byte[] data = new byte[len / 2]; byte[] data = new byte[len / 2];
for(int i = 0; i < len; i += 2){ for(int i = 0; i < len; i += 2){
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) data[i / 2] = (byte)((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i + 1), 16)); + Character.digit(s.charAt(i + 1), 16));
} }
String result = new String(Base64Coder.encode(data)); String result = new String(Base64Coder.encode(data));
@@ -184,7 +181,7 @@ public class AndroidLauncher extends AndroidApplication{
} }
private boolean isTablet(Context context){ private boolean isTablet(Context context){
TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
return manager != null && manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE; return manager != null && manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE;
} }
} }

View File

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

View File

@@ -1,9 +1,6 @@
package io.anuke.annotations; package io.anuke.annotations;
import java.lang.annotation.ElementType; import java.lang.annotation.*;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public class Annotations{ public class Annotations{
@@ -19,25 +16,25 @@ public class Annotations{
} }
/** Marks a class as serializable.*/ /** Marks a class as serializable. */
@Target(ElementType.TYPE) @Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface Serialize{ public @interface Serialize{
} }
/** Marks a class as a special value type struct. Class name must end in 'Struct'.*/ /** Marks a class as a special value type struct. Class name must end in 'Struct'. */
@Target(ElementType.TYPE) @Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface Struct{ public @interface Struct{
} }
/**Marks a field of a struct. Optional.*/ /** Marks a field of a struct. Optional. */
@Target(ElementType.FIELD) @Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface StructField{ public @interface StructField{
/**Size of a struct field in bits. Not valid on booleans or floating point numbers.*/ /** Size of a struct field in bits. Not valid on booleans or floating point numbers. */
int value(); int value();
} }

View File

@@ -1,7 +1,5 @@
package io.anuke.annotations; package io.anuke.annotations;
import io.anuke.annotations.MethodEntry;
import java.util.ArrayList; import java.util.ArrayList;
/** Represents a class witha list method entries to include in it. */ /** Represents a class witha list method entries to include in it. */

View File

@@ -1,8 +1,6 @@
package io.anuke.annotations; package io.anuke.annotations;
import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.*;
import io.anuke.annotations.Annotations.PacketPriority;
import io.anuke.annotations.Annotations.Variant;
import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.ExecutableElement;

View File

@@ -1,18 +1,13 @@
package io.anuke.annotations; package io.anuke.annotations;
import com.squareup.javapoet.FieldSpec; import com.squareup.javapoet.*;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.TypeSpec;
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.annotations.IOFinder.ClassSerializer; import io.anuke.annotations.IOFinder.ClassSerializer;
import javax.annotation.processing.*; import javax.annotation.processing.*;
import javax.lang.model.SourceVersion; import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element; import javax.lang.model.element.*;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind; import javax.tools.Diagnostic.Kind;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -21,14 +16,14 @@ import java.util.stream.Collectors;
/** The annotation processor for generating remote method call code. */ /** The annotation processor for generating remote method call code. */
@SupportedSourceVersion(SourceVersion.RELEASE_8) @SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes({ @SupportedAnnotationTypes({
"io.anuke.annotations.Annotations.Remote", "io.anuke.annotations.Annotations.Remote",
"io.anuke.annotations.Annotations.WriteClass", "io.anuke.annotations.Annotations.WriteClass",
"io.anuke.annotations.Annotations.ReadClass", "io.anuke.annotations.Annotations.ReadClass",
}) })
public class RemoteMethodAnnotationProcessor extends AbstractProcessor{ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
/** Maximum size of each event packet. */ /** Maximum size of each event packet. */
public static final int maxPacketSize = 4096; public static final int maxPacketSize = 4096;
/** Warning on top of each autogenerated file.*/ /** Warning on top of each autogenerated file. */
public static final String autogenWarning = "Autogenerated file. Do not modify!\n"; public static final String autogenWarning = "Autogenerated file. Do not modify!\n";
/** Name of the base package to put all the generated classes. */ /** Name of the base package to put all the generated classes. */
private static final String packageName = "io.anuke.mindustry.gen"; private static final String packageName = "io.anuke.mindustry.gen";
@@ -37,7 +32,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
private static final String readServerName = "RemoteReadServer"; private static final String readServerName = "RemoteReadServer";
/** Name of class that handles reading and invoking packets on the client. */ /** Name of class that handles reading and invoking packets on the client. */
private static final String readClientName = "RemoteReadClient"; private static final String readClientName = "RemoteReadClient";
/**Simple class name of generated class name.*/ /** Simple class name of generated class name. */
private static final String callLocation = "Call"; private static final String callLocation = "Call";
/** Processing round number. */ /** Processing round number. */
@@ -115,7 +110,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
//create and add entry //create and add entry
MethodEntry method = new MethodEntry(entry.name, Utils.getMethodName(element), annotation.targets(), annotation.variants(), MethodEntry method = new MethodEntry(entry.name, Utils.getMethodName(element), annotation.targets(), annotation.variants(),
annotation.called(), annotation.unreliable(), annotation.forward(), lastMethodID++, (ExecutableElement) element, annotation.priority()); annotation.called(), annotation.unreliable(), annotation.forward(), lastMethodID++, (ExecutableElement)element, annotation.priority());
entry.methods.add(method); entry.methods.add(method);
methods.add(method); methods.add(method);
@@ -140,7 +135,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
TypeSpec.Builder hashBuilder = TypeSpec.classBuilder("MethodHash").addModifiers(Modifier.PUBLIC); TypeSpec.Builder hashBuilder = TypeSpec.classBuilder("MethodHash").addModifiers(Modifier.PUBLIC);
hashBuilder.addJavadoc(autogenWarning); hashBuilder.addJavadoc(autogenWarning);
hashBuilder.addField(FieldSpec.builder(int.class, "HASH", Modifier.STATIC, Modifier.PUBLIC, Modifier.FINAL) hashBuilder.addField(FieldSpec.builder(int.class, "HASH", Modifier.STATIC, Modifier.PUBLIC, Modifier.FINAL)
.initializer("$1L", Objects.hash(methods)).build()); .initializer("$1L", Objects.hash(methods)).build());
//build and write resulting hash class //build and write resulting hash class
TypeSpec spec = hashBuilder.build(); TypeSpec spec = hashBuilder.build();

View File

@@ -3,9 +3,7 @@ package io.anuke.annotations;
import com.squareup.javapoet.*; import com.squareup.javapoet.*;
import io.anuke.annotations.IOFinder.ClassSerializer; import io.anuke.annotations.IOFinder.ClassSerializer;
import javax.lang.model.element.Modifier; import javax.lang.model.element.*;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.tools.Diagnostic.Kind; import javax.tools.Diagnostic.Kind;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
@@ -25,24 +23,23 @@ public class RemoteReadGenerator{
/** /**
* Generates a class for reading remote invoke packets. * Generates a class for reading remote invoke packets.
*
* @param entries List of methods to use. * @param entries List of methods to use.
* @param className Simple target class name. * @param className Simple target class name.
* @param packageName Full target package name. * @param packageName Full target package name.
* @param needsPlayer Whether this read method requires a reference to the player sender. * @param needsPlayer Whether this read method requires a reference to the player sender.
*/ */
public void generateFor(List<MethodEntry> entries, String className, String packageName, boolean needsPlayer) public void generateFor(List<MethodEntry> entries, String className, String packageName, boolean needsPlayer)
throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException{ throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException{
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC); TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning); classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning);
//create main method builder //create main method builder
MethodSpec.Builder readMethod = MethodSpec.methodBuilder("readPacket") MethodSpec.Builder readMethod = MethodSpec.methodBuilder("readPacket")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC) .addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.addParameter(ByteBuffer.class, "buffer") //buffer to read form .addParameter(ByteBuffer.class, "buffer") //buffer to read form
.addParameter(int.class, "id") //ID of method type to read .addParameter(int.class, "id") //ID of method type to read
.returns(void.class); .returns(void.class);
if(needsPlayer){ if(needsPlayer){
//since the player type isn't loaded yet, creating a type def is necessary //since the player type isn't loaded yet, creating a type def is necessary
@@ -115,13 +112,13 @@ public class RemoteReadGenerator{
//execute the relevant method before the forward //execute the relevant method before the forward
//if it throws a ValidateException, the method won't be forwarded //if it throws a ValidateException, the method won't be forwarded
readBlock.addStatement("$N." + entry.element.getSimpleName() + "(" + varResult.toString() + ")", ((TypeElement) entry.element.getEnclosingElement()).getQualifiedName().toString()); readBlock.addStatement("$N." + entry.element.getSimpleName() + "(" + varResult.toString() + ")", ((TypeElement)entry.element.getEnclosingElement()).getQualifiedName().toString());
//call forwarded method, don't forward on the client reader //call forwarded method, don't forward on the client reader
if(entry.forward && entry.where.isServer && needsPlayer){ if(entry.forward && entry.where.isServer && needsPlayer){
//call forwarded method //call forwarded method
readBlock.addStatement(packageName + "." + entry.className + "." + entry.element.getSimpleName() + readBlock.addStatement(packageName + "." + entry.className + "." + entry.element.getSimpleName() +
"__forward(player.con.id" + (varResult.length() == 0 ? "" : ", ") + varResult.toString() + ")"); "__forward(player.con.id" + (varResult.length() == 0 ? "" : ", ") + varResult.toString() + ")");
} }
readBlock.nextControlFlow("catch (java.lang.Exception e)"); readBlock.nextControlFlow("catch (java.lang.Exception e)");

View File

@@ -4,10 +4,7 @@ import com.squareup.javapoet.*;
import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.IOFinder.ClassSerializer; import io.anuke.annotations.IOFinder.ClassSerializer;
import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.*;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.tools.Diagnostic.Kind; import javax.tools.Diagnostic.Kind;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@@ -33,7 +30,7 @@ public class RemoteWriteGenerator{
//add temporary write buffer //add temporary write buffer
classBuilder.addField(FieldSpec.builder(ByteBuffer.class, "TEMP_BUFFER", Modifier.STATIC, Modifier.PRIVATE, Modifier.FINAL) classBuilder.addField(FieldSpec.builder(ByteBuffer.class, "TEMP_BUFFER", Modifier.STATIC, Modifier.PRIVATE, Modifier.FINAL)
.initializer("ByteBuffer.allocate($1L)", RemoteMethodAnnotationProcessor.maxPacketSize).build()); .initializer("ByteBuffer.allocate($1L)", RemoteMethodAnnotationProcessor.maxPacketSize).build());
//go through each method entry in this class //go through each method entry in this class
for(MethodEntry methodEntry : entry.methods){ for(MethodEntry methodEntry : entry.methods){
@@ -65,8 +62,8 @@ public class RemoteWriteGenerator{
//create builder //create builder
MethodSpec.Builder method = MethodSpec.methodBuilder(elem.getSimpleName().toString() + (forwarded ? "__forward" : "")) //add except suffix when forwarding MethodSpec.Builder method = MethodSpec.methodBuilder(elem.getSimpleName().toString() + (forwarded ? "__forward" : "")) //add except suffix when forwarding
.addModifiers(Modifier.STATIC, Modifier.SYNCHRONIZED) .addModifiers(Modifier.STATIC, Modifier.SYNCHRONIZED)
.returns(void.class); .returns(void.class);
//forwarded methods aren't intended for use, and are not public //forwarded methods aren't intended for use, and are not public
if(!forwarded){ if(!forwarded){
@@ -119,7 +116,7 @@ public class RemoteWriteGenerator{
//add the statement to call it //add the statement to call it
method.addStatement("$N." + elem.getSimpleName() + "(" + results.toString() + ")", method.addStatement("$N." + elem.getSimpleName() + "(" + results.toString() + ")",
((TypeElement) elem.getEnclosingElement()).getQualifiedName().toString()); ((TypeElement)elem.getEnclosingElement()).getQualifiedName().toString());
if(methodEntry.local != Loc.both){ if(methodEntry.local != Loc.both){
method.endControlFlow(); method.endControlFlow();
@@ -170,7 +167,7 @@ public class RemoteWriteGenerator{
method.addStatement("TEMP_BUFFER.put(" + varName + " ? (byte)1 : 0)"); method.addStatement("TEMP_BUFFER.put(" + varName + " ? (byte)1 : 0)");
}else{ }else{
method.addStatement("TEMP_BUFFER.put" + method.addStatement("TEMP_BUFFER.put" +
capName + "(" + varName + ")"); capName + "(" + varName + ")");
} }
}else{ }else{
//else, try and find a serializer //else, try and find a serializer
@@ -209,7 +206,7 @@ public class RemoteWriteGenerator{
//send the actual packet //send the actual packet
method.addStatement("io.anuke.mindustry.net.Net." + sendString + "packet, " + method.addStatement("io.anuke.mindustry.net.Net." + sendString + "packet, " +
(methodEntry.unreliable ? "io.anuke.mindustry.net.Net.SendMode.udp" : "io.anuke.mindustry.net.Net.SendMode.tcp") + ")"); (methodEntry.unreliable ? "io.anuke.mindustry.net.Net.SendMode.udp" : "io.anuke.mindustry.net.Net.SendMode.tcp") + ")");
//end check for server/client //end check for server/client
@@ -221,7 +218,7 @@ public class RemoteWriteGenerator{
private String getCheckString(Loc loc){ private String getCheckString(Loc loc){
return loc.isClient && loc.isServer ? "io.anuke.mindustry.net.Net.server() || io.anuke.mindustry.net.Net.client()" : return loc.isClient && loc.isServer ? "io.anuke.mindustry.net.Net.server() || io.anuke.mindustry.net.Net.client()" :
loc.isClient ? "io.anuke.mindustry.net.Net.client()" : loc.isClient ? "io.anuke.mindustry.net.Net.client()" :
loc.isServer ? "io.anuke.mindustry.net.Net.server()" : "false"; loc.isServer ? "io.anuke.mindustry.net.Net.server()" : "false";
} }
} }

View File

@@ -5,13 +5,9 @@ import io.anuke.annotations.Annotations.Serialize;
import javax.annotation.processing.*; import javax.annotation.processing.*;
import javax.lang.model.SourceVersion; import javax.lang.model.SourceVersion;
import javax.lang.model.element.Modifier; import javax.lang.model.element.*;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.util.ElementFilter; import javax.lang.model.util.ElementFilter;
import java.io.DataInput; import java.io.*;
import java.io.DataOutput;
import java.io.IOException;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@@ -21,7 +17,7 @@ import java.util.Set;
"io.anuke.annotations.Annotations.Serialize" "io.anuke.annotations.Annotations.Serialize"
}) })
public class SerializeAnnotationProcessor extends AbstractProcessor{ public class SerializeAnnotationProcessor extends AbstractProcessor{
/**Target class name.*/ /** Target class name. */
private static final String className = "Serialization"; private static final String className = "Serialization";
/** Name of the base package to put all the generated classes. */ /** Name of the base package to put all the generated classes. */
private static final String packageName = "io.anuke.mindustry.gen"; private static final String packageName = "io.anuke.mindustry.gen";
@@ -58,8 +54,8 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
classBuilder.addField(jsonType, "bjson", Modifier.STATIC, Modifier.PRIVATE); classBuilder.addField(jsonType, "bjson", Modifier.STATIC, Modifier.PRIVATE);
classBuilder.addField(ubJsonReaderType, "bjsonReader", Modifier.STATIC, Modifier.PRIVATE); classBuilder.addField(ubJsonReaderType, "bjsonReader", Modifier.STATIC, Modifier.PRIVATE);
classBuilder.addStaticBlock(CodeBlock.builder() classBuilder.addStaticBlock(CodeBlock.builder()
.addStatement("bjson = new " + jsonType + "()") .addStatement("bjson = new " + jsonType + "()")
.addStatement("bjsonReader = new " + ubJsonReaderType + "()") .addStatement("bjsonReader = new " + ubJsonReaderType + "()")
.build()); .build());
for(TypeElement elem : elements){ for(TypeElement elem : elements){
@@ -99,7 +95,8 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
List<VariableElement> fields = ElementFilter.fieldsIn(Utils.elementUtils.getAllMembers(elem)); List<VariableElement> fields = ElementFilter.fieldsIn(Utils.elementUtils.getAllMembers(elem));
for(VariableElement field : fields){ for(VariableElement field : fields){
if(field.getModifiers().contains(Modifier.STATIC) || field.getModifiers().contains(Modifier.TRANSIENT) || field.getModifiers().contains(Modifier.PRIVATE)) continue; if(field.getModifiers().contains(Modifier.STATIC) || field.getModifiers().contains(Modifier.TRANSIENT) || field.getModifiers().contains(Modifier.PRIVATE))
continue;
String name = field.getSimpleName().toString(); String name = field.getSimpleName().toString();
String typeName = Utils.typeUtils.erasure(field.asType()).toString().replace('$', '.'); String typeName = Utils.typeUtils.erasure(field.asType()).toString().replace('$', '.');
@@ -109,11 +106,11 @@ 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 + "()");
jsonWriteMethod.addStatement("json.writeValue(\"" + name + "\", object." + name +")"); jsonWriteMethod.addStatement("json.writeValue(\"" + name + "\", object." + name + ")");
jsonReadMethod.addStatement("if(value.has(\"" + name + "\")) object." + name + "= value.get" + capName + "(\"" + name + "\")"); jsonReadMethod.addStatement("if(value.has(\"" + name + "\")) object." + name + "= value.get" + capName + "(\"" + name + "\")");
}else{ }else{
writeMethod.addStatement("io.anuke.arc.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.arc.Core.settings.getSerializer(" + typeName+ ".class).read(stream)"); readMethod.addStatement("object." + name + " = (" + typeName + ")io.anuke.arc.Core.settings.getSerializer(" + typeName + ".class).read(stream)");
} }
} }
@@ -123,7 +120,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.arc.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());
name(writeMethod, "write" + simpleTypeName); name(writeMethod, "write" + simpleTypeName);
name(readMethod, "read" + simpleTypeName); name(readMethod, "read" + simpleTypeName);

View File

@@ -1,28 +1,25 @@
package io.anuke.annotations; package io.anuke.annotations;
import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.*;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeName;
import com.squareup.javapoet.TypeSpec;
import io.anuke.annotations.Annotations.Struct; import io.anuke.annotations.Annotations.Struct;
import io.anuke.annotations.Annotations.StructField; import io.anuke.annotations.Annotations.StructField;
import javax.annotation.processing.*; import javax.annotation.processing.*;
import javax.lang.model.SourceVersion; import javax.lang.model.SourceVersion;
import javax.lang.model.element.Modifier; import javax.lang.model.element.*;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeKind;
import javax.lang.model.util.ElementFilter; import javax.lang.model.util.ElementFilter;
import javax.tools.Diagnostic.Kind; import javax.tools.Diagnostic.Kind;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
/**Generates ""value types"" classes that are packed into integer primitives of the most aproppriate size. /**
* It would be nice if Java didn't make crazy hacks like this necessary.*/ * Generates ""value types"" classes that are packed into integer primitives of the most aproppriate size.
* It would be nice if Java didn't make crazy hacks like this necessary.
*/
@SupportedSourceVersion(SourceVersion.RELEASE_8) @SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes({ @SupportedAnnotationTypes({
"io.anuke.annotations.Annotations.Struct" "io.anuke.annotations.Annotations.Struct"
}) })
public class StructAnnotationProcessor extends AbstractProcessor{ public class StructAnnotationProcessor extends AbstractProcessor{
/** Name of the base package to put all the generated classes. */ /** Name of the base package to put all the generated classes. */
@@ -57,7 +54,7 @@ public class StructAnnotationProcessor extends AbstractProcessor{
String structParam = structName.toLowerCase(); String structParam = structName.toLowerCase();
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(structName) TypeSpec.Builder classBuilder = TypeSpec.classBuilder(structName)
.addModifiers(Modifier.FINAL, Modifier.PUBLIC); .addModifiers(Modifier.FINAL, Modifier.PUBLIC);
try{ try{
List<VariableElement> variables = ElementFilter.fieldsIn(elem.getEnclosedElements()); List<VariableElement> variables = ElementFilter.fieldsIn(elem.getEnclosedElements());
@@ -92,14 +89,14 @@ public class StructAnnotationProcessor extends AbstractProcessor{
//[get] field(structType) : fieldType //[get] field(structType) : fieldType
MethodSpec.Builder getter = MethodSpec.methodBuilder(var.getSimpleName().toString()) MethodSpec.Builder getter = MethodSpec.methodBuilder(var.getSimpleName().toString())
.addModifiers(Modifier.STATIC, Modifier.PUBLIC) .addModifiers(Modifier.STATIC, Modifier.PUBLIC)
.returns(varType) .returns(varType)
.addParameter(structType, structParam); .addParameter(structType, structParam);
//[set] field(structType, fieldType) : structType //[set] field(structType, fieldType) : structType
MethodSpec.Builder setter = MethodSpec.methodBuilder(var.getSimpleName().toString()) MethodSpec.Builder setter = MethodSpec.methodBuilder(var.getSimpleName().toString())
.addModifiers(Modifier.STATIC, Modifier.PUBLIC) .addModifiers(Modifier.STATIC, Modifier.PUBLIC)
.returns(structType) .returns(structType)
.addParameter(structType, structParam).addParameter(varType, "value"); .addParameter(structType, structParam).addParameter(varType, "value");
//[getter] //[getter]
if(varType == TypeName.BOOLEAN){ if(varType == TypeName.BOOLEAN){
@@ -209,7 +206,7 @@ public class StructAnnotationProcessor extends AbstractProcessor{
throw new IllegalArgumentException("Too many fields, must fit in 64 bits. Curent size: " + size); throw new IllegalArgumentException("Too many fields, must fit in 64 bits. Curent size: " + size);
} }
/**returns a type's element size in bits.*/ /** returns a type's element size in bits. */
static int typeSize(TypeKind kind) throws IllegalArgumentException{ static int typeSize(TypeKind kind) throws IllegalArgumentException{
switch(kind){ switch(kind){
case BOOLEAN: case BOOLEAN:

View File

@@ -14,11 +14,11 @@ public class Utils{
public static Messager messager; public static Messager messager;
public static String getMethodName(Element element){ public static String getMethodName(Element element){
return ((TypeElement) element.getEnclosingElement()).getQualifiedName().toString() + "." + element.getSimpleName(); return ((TypeElement)element.getEnclosingElement()).getQualifiedName().toString() + "." + element.getSimpleName();
} }
public static boolean isPrimitive(String type){ public static boolean isPrimitive(String type){
return type.equals("boolean") || type.equals("byte") || type.equals("short") || type.equals("int") return type.equals("boolean") || type.equals("byte") || type.equals("short") || type.equals("int")
|| type.equals("long") || type.equals("float") || type.equals("double") || type.equals("char"); || type.equals("long") || type.equals("float") || type.equals("double") || type.equals("char");
} }
} }

View File

@@ -27,7 +27,7 @@ allprojects{
gdxVersion = '1.9.9' gdxVersion = '1.9.9'
roboVMVersion = '2.3.6' roboVMVersion = '2.3.6'
arcHash = null arcHash = null
debugged = { debugged = {
return new File(projectDir.parent, '../debug').exists() && !project.hasProperty("release") return new File(projectDir.parent, '../debug').exists() && !project.hasProperty("release")
} }
@@ -89,7 +89,8 @@ allprojects{
try{ try{
pfile.createNewFile() pfile.createNewFile()
}catch(Exception ignored){} }catch(Exception ignored){
}
if(pfile.exists()){ if(pfile.exists()){
props.load(new FileInputStream(pfile)) props.load(new FileInputStream(pfile))
@@ -121,7 +122,7 @@ project(":desktop"){
dependencies{ dependencies{
compile project(":core") compile project(":core")
compile project(":net") compile project(":net")
if(debugged()) compile project(":debug") if(debugged()) compile project(":debug")
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
@@ -157,9 +158,9 @@ project(":ios"){
compile project(":core") compile project(":core")
compile project(":net") compile project(":net")
compileOnly project(":annotations") compileOnly project(":annotations")
compile arcModule("backends:backend-robovm") compile arcModule("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-platform:$gdxVersion:natives-ios" compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"

View File

@@ -1,8 +1,8 @@
{ {
duplicatePadding: true, duplicatePadding: true,
combineSubdirectories: true, combineSubdirectories: true,
flattenPaths: true, flattenPaths: true,
maxWidth: 2048, maxWidth: 2048,
maxHeight: 2048, maxHeight: 2048,
fast: true, fast: true
} }

View File

@@ -1,8 +1,8 @@
{ {
duplicatePadding: true, duplicatePadding: true,
combineSubdirectories: true, combineSubdirectories: true,
flattenPaths: true, flattenPaths: true,
maxWidth: 1024, maxWidth: 1024,
maxHeight: 1024, maxHeight: 1024,
fast: true, fast: true
} }

View File

@@ -1,8 +1,8 @@
{ {
duplicatePadding: true, duplicatePadding: true,
combineSubdirectories: true, combineSubdirectories: true,
flattenPaths: true, flattenPaths: true,
maxWidth: 2048, maxWidth: 2048,
maxHeight: 2048, maxHeight: 2048,
fast: true, fast: true
} }

View File

@@ -1,8 +1,8 @@
{ {
duplicatePadding: true, duplicatePadding: true,
combineSubdirectories: true, combineSubdirectories: true,
flattenPaths: true, flattenPaths: true,
maxWidth: 1024, maxWidth: 1024,
maxHeight: 1024, maxHeight: 1024,
fast: true, fast: true
} }

View File

@@ -1,8 +1,8 @@
{ {
duplicatePadding: true, duplicatePadding: true,
combineSubdirectories: true, combineSubdirectories: true,
flattenPaths: true, flattenPaths: true,
maxWidth: 2048, maxWidth: 2048,
maxHeight: 2048, maxHeight: 2048,
fast: true, fast: true
} }

View File

@@ -615,8 +615,8 @@ block.moss.name = Moss
block.spore-moss.name = Spore Moss block.spore-moss.name = Spore Moss
block.shalerocks.name = Shale Rocks block.shalerocks.name = Shale Rocks
block.scrap-wall.name = Scrap Wall block.scrap-wall.name = Scrap Wall
block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-large.name = Large Scrap Wall
block.scrap-wall-huge.name = Huge Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall
block.scrap-wall-gigantic.name = Gigantic Scrap Wall block.scrap-wall-gigantic.name = Gigantic Scrap Wall
block.thruster.name = Thruster block.thruster.name = Thruster
block.kiln.name = Kiln block.kiln.name = Kiln

View File

@@ -14,7 +14,6 @@ screenshot = 화면 캡쳐가 {0} 경로에 저장되었습니다.
gameover = 게임 오버 gameover = 게임 오버
gameover.pvp = [accent]{0}[] 팀이 승리했습니다! gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
highscore = [accent]최고점수 달성! highscore = [accent]최고점수 달성!
stat.wave = 웨이브 성공:[accent]{0} stat.wave = 웨이브 성공:[accent]{0}
stat.enemiesDestroyed = 파괴한 적 수:[accent]{0} stat.enemiesDestroyed = 파괴한 적 수:[accent]{0}
stat.built = 건설한 건물 수:[accent]{0} stat.built = 건설한 건물 수:[accent]{0}
@@ -22,10 +21,8 @@ stat.destroyed = 파괴된 건물 수:[accent]{0}
stat.deconstructed = 파괴한 건물 수:[accent]{0} stat.deconstructed = 파괴한 건물 수:[accent]{0}
stat.delivered = 획득한 자원: stat.delivered = 획득한 자원:
stat.rank = 최종 기록: [accent]{0} stat.rank = 최종 기록: [accent]{0}
placeline = 블록을 선택하셨습니다.\n][accent]몇초간 설치 시작지점을 누르고[] 원하는 방향을 향해 드래그 하면 [accent]일렬로[] 설치할 수 있습니다.\n한번 해 보세요. placeline = 블록을 선택하셨습니다.\n][accent]몇초간 설치 시작지점을 누르고[] 원하는 방향을 향해 드래그 하면 [accent]일렬로[] 설치할 수 있습니다.\n한번 해 보세요.
removearea = 블록 제거모드를 선택하셨습니다.\n[accent]몇초간 제거 시작지점을 누르고[] 원하는 구역 끝을 향해 드래그 하면 [accent]직사각형[] 안에 있는 모든 건물을 제거할 수 있습니다.\n한번 해 보세요. removearea = 블록 제거모드를 선택하셨습니다.\n[accent]몇초간 제거 시작지점을 누르고[] 원하는 구역 끝을 향해 드래그 하면 [accent]직사각형[] 안에 있는 모든 건물을 제거할 수 있습니다.\n한번 해 보세요.
launcheditems = [accent]출격 아이템 launcheditems = [accent]출격 아이템
map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까?\n map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까?\n
level.highscore = 최고 점수: [accent]{0} level.highscore = 최고 점수: [accent]{0}
@@ -284,7 +281,6 @@ tutorial = 게임 방법
editor = 편집기 editor = 편집기
mapeditor = 맵 편집기 mapeditor = 맵 편집기
donate = 기부 donate = 기부
abandon = 포기 abandon = 포기
abandon.text = 이 구역과 모든 자원이 적에게 빼앗길 것입니다. abandon.text = 이 구역과 모든 자원이 적에게 빼앗길 것입니다.
locked = 잠김 locked = 잠김
@@ -306,7 +302,6 @@ zone.config.complete = 웨이브 {0} 달성:\n로드아웃 설정 잠금 해제
zone.resources = 자원 감지됨: zone.resources = 자원 감지됨:
add = 추가... add = 추가...
boss.health = 보스 체력 boss.health = 보스 체력
connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[] connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[]
error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요? error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요?
error.invalidaddress = 잘못된 주소입니다. error.invalidaddress = 잘못된 주소입니다.
@@ -316,7 +311,6 @@ error.alreadyconnected = 이미 접속중입니다.
error.mapnotfound = 맵 파일을 찾을 수 없습니다! error.mapnotfound = 맵 파일을 찾을 수 없습니다!
error.io = 네트워크 I/O 오류. error.io = 네트워크 I/O 오류.
error.any = 알 수 없는 네트워크 오류. error.any = 알 수 없는 네트워크 오류.
zone.groundZero.name = 그라운드 제로 zone.groundZero.name = 그라운드 제로
zone.craters.name = 분화구 zone.craters.name = 분화구
zone.frozenForest.name = 얼어붙은 숲 zone.frozenForest.name = 얼어붙은 숲
@@ -324,7 +318,6 @@ zone.ruinousShores.name = 파멸의 기슭
zone.stainedMountains.name = 얼룩진 산맥 zone.stainedMountains.name = 얼룩진 산맥
zone.desolateRift.name = 황량한 강 zone.desolateRift.name = 황량한 강
zone.nuclearComplex.name = 핵 생산 단지 zone.nuclearComplex.name = 핵 생산 단지
settings.language = 언어 settings.language = 언어
settings.reset = 설정 초기화 settings.reset = 설정 초기화
settings.rebind = 키 재설정 settings.rebind = 키 재설정
@@ -384,7 +377,6 @@ bar.heat = 발열
bar.power = 전력 bar.power = 전력
bar.progress = 건설 진행 bar.progress = 건설 진행
bar.spawned = 유닛: {0}/{1} bar.spawned = 유닛: {0}/{1}
bullet.damage = [stat]{0}[lightgray] 데미지 bullet.damage = [stat]{0}[lightgray] 데미지
bullet.splashdamage = [stat]{0}[lightgray] area 데미지 ~[stat] {1}[lightgray] 타일 bullet.splashdamage = [stat]{0}[lightgray] area 데미지 ~[stat] {1}[lightgray] 타일
bullet.incendiary = [stat]방화 bullet.incendiary = [stat]방화
@@ -396,7 +388,6 @@ bullet.freezing = [stat]동결
bullet.tarred = [stat]타르 bullet.tarred = [stat]타르
bullet.multiplier = [stat]{0}[lightgray]x 탄약 배율 bullet.multiplier = [stat]{0}[lightgray]x 탄약 배율
bullet.reload = [stat]{0}[lightgray]x 사격 속도 bullet.reload = [stat]{0}[lightgray]x 사격 속도
unit.blocks = 블록 unit.blocks = 블록
unit.powersecond = 전력/초 unit.powersecond = 전력/초
unit.liquidsecond = 액체/초 unit.liquidsecond = 액체/초
@@ -497,7 +488,6 @@ mode.pvp.description = 실제 플레이어와 PvP를 합니다.
mode.attack.name = 공격 mode.attack.name = 공격
mode.attack.description = 일정 시간마다 적이 오는 단계가 없으며, 적의 기지를 파괴하는 것을 목표로 합니다. mode.attack.description = 일정 시간마다 적이 오는 단계가 없으며, 적의 기지를 파괴하는 것을 목표로 합니다.
mode.custom = 커스텀 규칙 mode.custom = 커스텀 규칙
rules.infiniteresources = 무한 자원 rules.infiniteresources = 무한 자원
rules.wavetimer = 웨이브 타이머 rules.wavetimer = 웨이브 타이머
rules.waves = 웨이브 rules.waves = 웨이브
@@ -512,7 +502,6 @@ rules.respawntime = 리스폰 시간:[LIGHT_GRAY] (초)
rules.wavespacing = 웨이브 간격:[LIGHT_GRAY] (초) rules.wavespacing = 웨이브 간격:[LIGHT_GRAY] (초)
rules.buildcostmultiplier = 건설 소모 배율 rules.buildcostmultiplier = 건설 소모 배율
rules.buildspeedmultiplier = 건설 속도 배율 rules.buildspeedmultiplier = 건설 속도 배율
content.item.name = 아이템 content.item.name = 아이템
content.liquid.name = 액체 content.liquid.name = 액체
content.unit.name = 유닛 content.unit.name = 유닛
@@ -597,7 +586,6 @@ mech.buildspeed = [LIGHT_GRAY]건설 속도: {0}%
liquid.heatcapacity = [LIGHT_GRAY]발열 용량: {0} liquid.heatcapacity = [LIGHT_GRAY]발열 용량: {0}
liquid.viscosity = [LIGHT_GRAY]점도: {0} liquid.viscosity = [LIGHT_GRAY]점도: {0}
liquid.temperature = [LIGHT_GRAY]온도: {0} liquid.temperature = [LIGHT_GRAY]온도: {0}
block.grass.name = 잔디 block.grass.name = 잔디
block.salt.name = 소금 block.salt.name = 소금
block.sandrocks.name = 모래 바위 block.sandrocks.name = 모래 바위
@@ -896,7 +884,6 @@ block.wraith-factory.description = 빠른 뺑소니 요격기 유닛을 생산
block.ghoul-factory.description = 중탄두 폭격기를 생산합니다. block.ghoul-factory.description = 중탄두 폭격기를 생산합니다.
block.dagger-factory.description = 기본 지상 유닛을 생산합니다. block.dagger-factory.description = 기본 지상 유닛을 생산합니다.
block.titan-factory.description = 첨단 장갑 지상부대를 생산합니다. block.titan-factory.description = 첨단 장갑 지상부대를 생산합니다.
block.fortress-factory.description = 중대포 지상부대를 생산합니다. block.fortress-factory.description = 중대포 지상부대를 생산합니다.
block.revenant-factory.description = 중량의 레이저 포대를 가진 공중부대를 생산합니다. block.revenant-factory.description = 중량의 레이저 포대를 가진 공중부대를 생산합니다.
block.repair-point.description = 주변에서 가장 가까운 손상된 유닛을 지속적으로 치료합니다. block.repair-point.description = 주변에서 가장 가까운 손상된 유닛을 지속적으로 치료합니다.

View File

@@ -1,8 +1,6 @@
package io.anuke.mindustry; package io.anuke.mindustry;
import io.anuke.arc.ApplicationCore; import io.anuke.arc.*;
import io.anuke.arc.Core;
import io.anuke.arc.Events;
import io.anuke.arc.util.Log; import io.anuke.arc.util.Log;
import io.anuke.arc.util.Time; import io.anuke.arc.util.Time;
import io.anuke.mindustry.core.*; import io.anuke.mindustry.core.*;
@@ -55,7 +53,7 @@ public class Mindustry extends ApplicationCore{
int fpsCap = Core.settings.getInt("fpscap", 125); int fpsCap = Core.settings.getInt("fpscap", 125);
if(fpsCap <= 120){ if(fpsCap <= 120){
long target = (1000 * 1000000)/fpsCap; //target in nanos long target = (1000 * 1000000) / fpsCap; //target in nanos
long elapsed = Time.timeSinceNanos(lastFrameTime); long elapsed = Time.timeSinceNanos(lastFrameTime);
if(elapsed < target){ if(elapsed < target){
try{ try{

View File

@@ -14,12 +14,8 @@ import io.anuke.mindustry.entities.effect.Puddle;
import io.anuke.mindustry.entities.impl.EffectEntity; import io.anuke.mindustry.entities.impl.EffectEntity;
import io.anuke.mindustry.entities.traits.DrawTrait; import io.anuke.mindustry.entities.traits.DrawTrait;
import io.anuke.mindustry.entities.traits.SyncTrait; import io.anuke.mindustry.entities.traits.SyncTrait;
import io.anuke.mindustry.entities.type.BaseUnit; import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.game.*;
import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.game.GlobalData;
import io.anuke.mindustry.game.Team;
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;
@@ -30,95 +26,95 @@ import java.util.Locale;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class Vars{ public class Vars{
/**IO buffer size.*/ /** IO buffer size. */
public static final int bufferSize = 8192; public static final int bufferSize = 8192;
/**global charset*/ /** global charset */
public static final Charset charset = Charset.forName("UTF-8"); public static final Charset charset = Charset.forName("UTF-8");
/**main application name, capitalized*/ /** main application name, capitalized */
public static final String appName = "Mindustry"; public static final String appName = "Mindustry";
/**URL for itch.io donations.*/ /** URL for itch.io donations. */
public static final String donationURL = "https://anuke.itch.io/mindustry/purchase"; public static final String donationURL = "https://anuke.itch.io/mindustry/purchase";
/**URL for discord invite.*/ /** 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*/ /** 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*/ /** 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*/ /** 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";
/**maximum distance between mine and core that supports automatic transferring*/ /** maximum distance between mine and core that supports automatic transferring */
public static final float mineTransferRange = 220f; public static final float mineTransferRange = 220f;
/**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/sectors*/ /** team of the enemy in waves/sectors */
public static final Team waveTeam = Team.red; public static final Team waveTeam = Team.red;
/**how many times longer a boss wave takes*/ /** how many times longer a boss wave takes */
public static final float bossWaveMultiplier = 3f; public static final float bossWaveMultiplier = 3f;
/**how many times longer a launch wave takes*/ /** how many times longer a launch wave takes */
public static final float launchWaveMultiplier = 2f; public static final float launchWaveMultiplier = 2f;
/**max chat message length*/ /** max chat message length */
public static final int maxTextLength = 150; public static final int maxTextLength = 150;
/**max player name length in bytes*/ /** 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.*/ /** displayed item size when ingame, TODO remove. */
public static final float itemSize = 5f; public static final float itemSize = 5f;
/**extra padding around the world; units outside this bound will begin to self-destruct.*/ /** extra padding around the world; units outside this bound will begin to self-destruct. */
public static final float worldBounds = 100f; public static final float worldBounds = 100f;
/**units outside of this bound will simply die instantly*/ /** units outside of this bound will simply die instantly */
public static final float finalWorldBounds = worldBounds + 500; public static final float finalWorldBounds = worldBounds + 500;
/**ticks spent out of bound until self destruct.*/ /** ticks spent out of bound until self destruct. */
public static final float boundsCountdown = 60*7; public static final float boundsCountdown = 60 * 7;
/**for map generator dialog*/ /** for map generator dialog */
public static boolean updateEditorOnChange = false; public static boolean updateEditorOnChange = false;
/**size of tiles in units*/ /** size of tiles in units */
public static final int tilesize = 8; public static final int tilesize = 8;
/**all choosable player colors in join/host dialog*/ /** 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"),
Color.valueOf("fff0e7"), Color.valueOf("fff0e7"),
Color.valueOf("7d2953"), Color.valueOf("7d2953"),
Color.valueOf("ff074e"), Color.valueOf("ff074e"),
Color.valueOf("ff072a"), Color.valueOf("ff072a"),
Color.valueOf("ff76a6"), Color.valueOf("ff76a6"),
Color.valueOf("a95238"), Color.valueOf("a95238"),
Color.valueOf("ffa108"), Color.valueOf("ffa108"),
Color.valueOf("feeb2c"), Color.valueOf("feeb2c"),
Color.valueOf("ffcaa8"), Color.valueOf("ffcaa8"),
Color.valueOf("008551"), Color.valueOf("008551"),
Color.valueOf("00e339"), Color.valueOf("00e339"),
Color.valueOf("423c7b"), Color.valueOf("423c7b"),
Color.valueOf("4b5ef1"), Color.valueOf("4b5ef1"),
Color.valueOf("2cabfe"), Color.valueOf("2cabfe"),
}; };
/**default server port*/ /** default server port */
public static final int port = 6567; public static final int port = 6567;
/**if true, UI is not drawn*/ /** 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*/ /** if true, game is set up in mobile mode, even on desktop. used for debugging */
public static boolean testMobile; public static boolean testMobile;
/**whether the game is running on a mobile device*/ /** 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*/ /** 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*/ /** whether the game is running on an Android device */
public static boolean android; public static boolean android;
/**whether the game is running on a headless server*/ /** whether the game is running on a headless server */
public static boolean headless; public static boolean headless;
/**application data directory, equivalent to {@link io.anuke.arc.Settings#getDataDirectory()}*/ /** application data directory, equivalent to {@link io.anuke.arc.Settings#getDataDirectory()} */
public static FileHandle dataDirectory; public static FileHandle dataDirectory;
/**data subdirectory used for screenshots*/ /** data subdirectory used for screenshots */
public static FileHandle screenshotDirectory; public static FileHandle screenshotDirectory;
/**data subdirectory used for custom mmaps*/ /** data subdirectory used for custom mmaps */
public static FileHandle customMapDirectory; public static FileHandle customMapDirectory;
/**data subdirectory used for saves*/ /** data subdirectory used for saves */
public static FileHandle saveDirectory; public static FileHandle saveDirectory;
/**map file extension*/ /** map file extension */
public static final String mapExtension = "mmap"; public static final String mapExtension = "mmap";
/**save file extension*/ /** save file extension */
public static final String saveExtension = "msav"; public static final String saveExtension = "msav";
/**list of all locales that can be switched to*/ /** list of all locales that can be switched to */
public static Locale[] locales; public static Locale[] locales;
public static ContentLoader content; public static ContentLoader content;
@@ -143,7 +139,7 @@ public class Vars{
public static EntityGroup<Fire> fireGroup; public static EntityGroup<Fire> fireGroup;
public static EntityGroup<BaseUnit>[] unitGroups; public static EntityGroup<BaseUnit>[] unitGroups;
/**all local players, currently only has one player. may be used for local co-op in the future*/ /** all local players, currently only has one player. may be used for local co-op in the future */
public static Player player; public static Player player;
public static void init(){ public static void init(){

View File

@@ -17,31 +17,31 @@ import io.anuke.mindustry.world.meta.BlockFlag;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
/**Class used for indexing special target blocks for AI.*/ /** Class used for indexing special target blocks for AI. */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class BlockIndexer{ public class BlockIndexer{
/**Size of one ore quadrant.*/ /** Size of one ore quadrant. */
private final static int oreQuadrantSize = 20; private final static int oreQuadrantSize = 20;
/**Size of one structure quadrant.*/ /** Size of one structure quadrant. */
private final static int structQuadrantSize = 12; private final static int structQuadrantSize = 12;
/**Set of all ores that are being scanned.*/ /** Set of all ores that are being scanned. */
private final ObjectSet<Item> scanOres = ObjectSet.with(Item.getAllOres().toArray(Item.class)); private final ObjectSet<Item> scanOres = ObjectSet.with(Item.getAllOres().toArray(Item.class));
private final ObjectSet<Item> itemSet = new ObjectSet<>(); private final ObjectSet<Item> itemSet = new ObjectSet<>();
/**Stores all ore quadtrants on the map.*/ /** Stores all ore quadtrants on the map. */
private ObjectMap<Item, ObjectSet<Tile>> ores; private ObjectMap<Item, ObjectSet<Tile>> ores;
/**Tags all quadrants.*/ /** Tags all quadrants. */
private Bits[] structQuadrants; private Bits[] structQuadrants;
/**Stores all damaged tile entities by team.*/ /** Stores all damaged tile entities by team. */
private ObjectSet<Tile>[] damagedTiles = new ObjectSet[Team.all.length]; private ObjectSet<Tile>[] damagedTiles = new ObjectSet[Team.all.length];
/**Maps teams to a map of flagged tiles by type.*/ /** Maps teams to a map of flagged tiles by type. */
private ObjectSet<Tile>[][] flagMap = new ObjectSet[Team.all.length][BlockFlag.all.length]; private ObjectSet<Tile>[][] flagMap = new ObjectSet[Team.all.length][BlockFlag.all.length];
/**Maps tile positions to their last known tile index data.*/ /** Maps tile positions to their last known tile index data. */
private IntMap<TileIndex> typeMap = new IntMap<>(); private IntMap<TileIndex> typeMap = new IntMap<>();
/**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 Array<>(); private Array<Tile> returnArray = new Array<>();
public BlockIndexer(){ public BlockIndexer(){
@@ -72,7 +72,7 @@ public class BlockIndexer{
//create bitset for each team type that contains each quadrant //create bitset for each team type that contains each quadrant
structQuadrants = new Bits[Team.all.length]; structQuadrants = new Bits[Team.all.length];
for(int i = 0; i < Team.all.length; i++){ for(int i = 0; i < Team.all.length; i++){
structQuadrants[i] = new Bits(Mathf.ceil(world.width() / (float) structQuadrantSize) * Mathf.ceil(world.height() / (float) structQuadrantSize)); structQuadrants[i] = new Bits(Mathf.ceil(world.width() / (float)structQuadrantSize) * Mathf.ceil(world.height() / (float)structQuadrantSize));
} }
for(int x = 0; x < world.width(); x++){ for(int x = 0; x < world.width(); x++){
@@ -101,7 +101,7 @@ public class BlockIndexer{
return flagMap[team.ordinal()]; return flagMap[team.ordinal()];
} }
/**Returns all damaged tiles by team.*/ /** Returns all damaged tiles by team. */
public ObjectSet<Tile> getDamaged(Team team){ public ObjectSet<Tile> getDamaged(Team team){
returnArray.clear(); returnArray.clear();
@@ -123,12 +123,12 @@ public class BlockIndexer{
return set; return set;
} }
/**Get all allied blocks with a flag.*/ /** Get all allied blocks with a flag. */
public ObjectSet<Tile> getAllied(Team team, BlockFlag type){ public ObjectSet<Tile> getAllied(Team team, BlockFlag type){
return flagMap[team.ordinal()][type.ordinal()]; return flagMap[team.ordinal()][type.ordinal()];
} }
/**Get all enemy blocks with a flag.*/ /** Get all enemy blocks with a flag. */
public Array<Tile> getEnemy(Team team, BlockFlag type){ public Array<Tile> getEnemy(Team team, BlockFlag type){
returnArray.clear(); returnArray.clear();
for(Team enemy : state.teams.enemiesOf(team)){ for(Team enemy : state.teams.enemiesOf(team)){
@@ -154,8 +154,8 @@ public class BlockIndexer{
TileEntity closest = null; TileEntity closest = null;
float dst = 0; float dst = 0;
for(int rx = Math.max((int) ((x - range) / tilesize / structQuadrantSize), 0); rx <= (int) ((x + range) / tilesize / structQuadrantSize) && rx < quadWidth(); rx++){ for(int rx = Math.max((int)((x - range) / tilesize / structQuadrantSize), 0); rx <= (int)((x + range) / tilesize / structQuadrantSize) && rx < quadWidth(); rx++){
for(int ry = Math.max((int) ((y - range) / tilesize / structQuadrantSize), 0); ry <= (int) ((y + range) / tilesize / structQuadrantSize) && ry < quadHeight(); ry++){ for(int ry = Math.max((int)((y - range) / tilesize / structQuadrantSize), 0); ry <= (int)((y + range) / tilesize / structQuadrantSize) && ry < quadHeight(); ry++){
if(!getQuad(team, rx, ry)) continue; if(!getQuad(team, rx, ry)) continue;
@@ -167,7 +167,8 @@ public class BlockIndexer{
other = other.target(); other = other.target();
if(other.entity == null || other.getTeam() != team || !pred.test(other) || !other.block().targetable) continue; if(other.entity == null || other.getTeam() != team || !pred.test(other) || !other.block().targetable)
continue;
TileEntity e = other.entity; TileEntity e = other.entity;
@@ -194,7 +195,7 @@ public class BlockIndexer{
return ores.get(item, emptySet); return ores.get(item, emptySet);
} }
/**Find the closest ore block relative to a position.*/ /** Find the closest ore block relative to a position. */
public Tile findClosestOre(float xp, float yp, Item item){ public Tile findClosestOre(float xp, float yp, Item item){
Tile tile = Geometry.findClosest(xp, yp, world.indexer.getOrePositions(item)); Tile tile = Geometry.findClosest(xp, yp, world.indexer.getOrePositions(item));
@@ -214,7 +215,7 @@ public class BlockIndexer{
private void process(Tile tile){ private void process(Tile tile){
if(tile.block().flags.size() > 0 && if(tile.block().flags.size() > 0 &&
tile.getTeam() != Team.none){ tile.getTeam() != Team.none){
ObjectSet<Tile>[] map = getFlagged(tile.getTeam()); ObjectSet<Tile>[] map = getFlagged(tile.getTeam());
for(BlockFlag flag : tile.block().flags){ for(BlockFlag flag : tile.block().flags){
@@ -235,13 +236,13 @@ public class BlockIndexer{
itemSet.clear(); itemSet.clear();
Tile rounded = world.tile(Mathf.clamp(quadrantX * oreQuadrantSize + oreQuadrantSize / 2, 0, world.width() - 1), Tile rounded = world.tile(Mathf.clamp(quadrantX * oreQuadrantSize + oreQuadrantSize / 2, 0, world.width() - 1),
Mathf.clamp(quadrantY * oreQuadrantSize + oreQuadrantSize / 2, 0, world.height() - 1)); Mathf.clamp(quadrantY * oreQuadrantSize + oreQuadrantSize / 2, 0, world.height() - 1));
//find all items that this quadrant contains //find all items that this quadrant contains
for(int x = quadrantX * structQuadrantSize; x < world.width() && x < (quadrantX + 1) * structQuadrantSize; x++){ for(int x = quadrantX * structQuadrantSize; x < world.width() && x < (quadrantX + 1) * structQuadrantSize; x++){
for(int y = quadrantY * structQuadrantSize; y < world.height() && y < (quadrantY + 1) * structQuadrantSize; y++){ for(int y = quadrantY * structQuadrantSize; y < world.height() && y < (quadrantY + 1) * structQuadrantSize; y++){
Tile result = world.tile(x, y); Tile result = world.tile(x, y);
if( result == null || result.drop() == null || !scanOres.contains(result.drop())) continue; if(result == null || result.drop() == null || !scanOres.contains(result.drop())) continue;
itemSet.add(result.drop()); itemSet.add(result.drop());
} }
@@ -294,16 +295,16 @@ public class BlockIndexer{
} }
private boolean getQuad(Team team, int quadrantX, int quadrantY){ private boolean getQuad(Team team, int quadrantX, int quadrantY){
int index = quadrantX + quadrantY * Mathf.ceil(world.width() / (float) structQuadrantSize); int index = quadrantX + quadrantY * Mathf.ceil(world.width() / (float)structQuadrantSize);
return structQuadrants[team.ordinal()].get(index); return structQuadrants[team.ordinal()].get(index);
} }
private int quadWidth(){ private int quadWidth(){
return Mathf.ceil(world.width() / (float) structQuadrantSize); return Mathf.ceil(world.width() / (float)structQuadrantSize);
} }
private int quadHeight(){ private int quadHeight(){
return Mathf.ceil(world.height() / (float) structQuadrantSize); return Mathf.ceil(world.height() / (float)structQuadrantSize);
} }
private void scanOres(){ private void scanOres(){
@@ -324,9 +325,9 @@ public class BlockIndexer{
//add position of quadrant to list when an ore is found //add position of quadrant to list when an ore is found
if(tile.drop() != null && scanOres.contains(tile.drop()) && tile.block() == Blocks.air){ if(tile.drop() != null && scanOres.contains(tile.drop()) && tile.block() == Blocks.air){
ores.get(tile.drop()).add(world.tile( ores.get(tile.drop()).add(world.tile(
//make sure to clamp quadrant middle position, since it might go off bounds //make sure to clamp quadrant middle position, since it might go off bounds
Mathf.clamp(qx * oreQuadrantSize + oreQuadrantSize / 2, 0, world.width() - 1), Mathf.clamp(qx * oreQuadrantSize + oreQuadrantSize / 2, 0, world.width() - 1),
Mathf.clamp(qy * oreQuadrantSize + oreQuadrantSize / 2, 0, world.height() - 1))); Mathf.clamp(qy * oreQuadrantSize + oreQuadrantSize / 2, 0, world.height() - 1)));
} }
} }
} }

View File

@@ -65,9 +65,9 @@ public class Pathfinder{
Tile other = world.tile(dx, dy); Tile other = world.tile(dx, dy);
if(other == null) continue; if(other == null) continue;
if(values[dx][dy] < value && (target == null || values[dx][dy]< tl) && if(values[dx][dy] < value && (target == null || values[dx][dy] < tl) &&
!other.solid() && !other.solid() &&
!(point.x != 0 && point.y != 0 && (world.solid(tile.x + point.x, tile.y) || world.solid(tile.x, tile.y + point.y)))){ //diagonal corner trap !(point.x != 0 && point.y != 0 && (world.solid(tile.x + point.x, tile.y) || world.solid(tile.x, tile.y + point.y)))){ //diagonal corner trap
target = other; target = other;
tl = values[dx][dy]; tl = values[dx][dy];
} }
@@ -86,8 +86,10 @@ public class Pathfinder{
return (!tile.solid()) || (tile.breakable() && (tile.target().getTeam() != team)); return (!tile.solid()) || (tile.breakable() && (tile.target().getTeam() != team));
} }
/**Clears the frontier, increments the search and sets up all flow sources. /**
* This only occurs for active teams.*/ * Clears the frontier, increments the search and sets up all flow sources.
* This only occurs for active teams.
*/
private void update(Tile tile, Team team){ private void update(Tile tile, Team team){
//make sure team exists //make sure team exists
if(paths != null && paths[team.ordinal()] != null && paths[team.ordinal()].weights != null){ if(paths != null && paths[team.ordinal()] != null && paths[team.ordinal()].weights != null){
@@ -126,7 +128,7 @@ public class Pathfinder{
Tile tile = world.tile(x, y); Tile tile = world.tile(x, y);
if(state.teams.areEnemies(tile.getTeam(), team) if(state.teams.areEnemies(tile.getTeam(), team)
&& tile.block().flags.contains(BlockFlag.target)){ && tile.block().flags.contains(BlockFlag.target)){
path.frontier.addFirst(tile.pos()); path.frontier.addFirst(tile.pos());
path.weights[x][y] = 0; path.weights[x][y] = 0;
path.searches[x][y] = (short)path.search; path.searches[x][y] = (short)path.search;
@@ -162,7 +164,7 @@ public class Pathfinder{
Tile other = world.tile(dx, dy); Tile other = world.tile(dx, dy);
if(other != null && (path.weights[dx][dy] > cost + other.cost || path.searches[dx][dy] < path.search) if(other != null && (path.weights[dx][dy] > cost + other.cost || path.searches[dx][dy] < path.search)
&& passable(other, team)){ && passable(other, team)){
if(other.cost < 0) throw new IllegalArgumentException("Tile cost cannot be negative! " + other); if(other.cost < 0) throw new IllegalArgumentException("Tile cost cannot be negative! " + other);
path.frontier.addFirst(Pos.get(dx, dy)); path.frontier.addFirst(Pos.get(dx, dy));
path.weights[dx][dy] = cost + other.cost; path.weights[dx][dy] = cost + other.cost;

View File

@@ -16,9 +16,7 @@ import io.anuke.mindustry.game.SpawnGroup;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Pos;
import java.io.DataInput; import java.io.*;
import java.io.DataOutput;
import java.io.IOException;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -56,7 +54,7 @@ public class WaveSpawner{
return groundSpawns.size; return groundSpawns.size;
} }
/**@return true if the player is near a ground spawn point.*/ /** @return true if the player is near a ground spawn point. */
public boolean playerNear(){ public boolean playerNear(){
return groundSpawns.count(g -> Mathf.dst(g.x * tilesize, g.y * tilesize, player.x, player.y) < maxShockwaveDst) > 0; return groundSpawns.count(g -> Mathf.dst(g.x * tilesize, g.y * tilesize, player.x, player.y) < maxShockwaveDst) > 0;
} }
@@ -88,7 +86,7 @@ public class WaveSpawner{
for(GroundSpawn spawn : groundSpawns){ for(GroundSpawn spawn : groundSpawns){
spawnX = spawn.x * tilesize; spawnX = spawn.x * tilesize;
spawnY = spawn.y * tilesize; spawnY = spawn.y * tilesize;
spread = tilesize*2; spread = tilesize * 2;
for(int i = 0; i < spawned; i++){ for(int i = 0; i < spawned; i++){
Tmp.v1.rnd(spread); Tmp.v1.rnd(spread);
@@ -96,7 +94,7 @@ public class WaveSpawner{
BaseUnit unit = group.createUnit(waveTeam); BaseUnit unit = group.createUnit(waveTeam);
unit.set(spawnX + Tmp.v1.x, spawnY + Tmp.v1.y); unit.set(spawnX + Tmp.v1.x, spawnY + Tmp.v1.y);
Time.run(Math.min(i*5, 60*2), () -> shockwave(unit)); Time.run(Math.min(i * 5, 60 * 2), () -> shockwave(unit));
} }
Time.run(20f, () -> Effects.effect(Fx.spawnShockwave, spawn.x * tilesize, spawn.y * tilesize)); Time.run(20f, () -> Effects.effect(Fx.spawnShockwave, spawn.x * tilesize, spawn.y * tilesize));
//would be interesting to see player structures survive this without hacks //would be interesting to see player structures survive this without hacks
@@ -125,7 +123,7 @@ public class WaveSpawner{
//hide spawnpoints, they have served their purpose //hide spawnpoints, they have served their purpose
world.tile(x, y).setBlock(Blocks.air); world.tile(x, y).setBlock(Blocks.air);
Log.info("Add spawn "+ x + " " + y); Log.info("Add spawn " + x + " " + y);
} }
} }
} }
@@ -145,7 +143,7 @@ public class WaveSpawner{
groundSpawns.add(spawn); groundSpawns.add(spawn);
FlyerSpawn fspawn = new FlyerSpawn(); FlyerSpawn fspawn = new FlyerSpawn();
fspawn.angle = Angles.angle(world.width()/2f, world.height()/2f, x, y); fspawn.angle = Angles.angle(world.width() / 2f, world.height() / 2f, x, y);
flySpawns.add(fspawn); flySpawns.add(fspawn);
} }

View File

@@ -2,18 +2,12 @@ package io.anuke.mindustry.content;
import io.anuke.arc.Core; import io.anuke.arc.Core;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.graphics.g2d.Lines;
import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.mindustry.graphics.CacheLayer; import io.anuke.mindustry.graphics.*;
import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.type.*;
import io.anuke.mindustry.graphics.Shaders;
import io.anuke.mindustry.type.Category;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.LiquidStack;
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.*;
@@ -23,13 +17,8 @@ import io.anuke.mindustry.world.blocks.distribution.*;
import io.anuke.mindustry.world.blocks.power.*; import io.anuke.mindustry.world.blocks.power.*;
import io.anuke.mindustry.world.blocks.production.*; import io.anuke.mindustry.world.blocks.production.*;
import io.anuke.mindustry.world.blocks.sandbox.*; import io.anuke.mindustry.world.blocks.sandbox.*;
import io.anuke.mindustry.world.blocks.storage.CoreBlock; import io.anuke.mindustry.world.blocks.storage.*;
import io.anuke.mindustry.world.blocks.storage.LaunchPad; import io.anuke.mindustry.world.blocks.units.*;
import io.anuke.mindustry.world.blocks.storage.Unloader;
import io.anuke.mindustry.world.blocks.storage.Vault;
import io.anuke.mindustry.world.blocks.units.MechPad;
import io.anuke.mindustry.world.blocks.units.RepairPoint;
import io.anuke.mindustry.world.blocks.units.UnitFactory;
import io.anuke.mindustry.world.consumers.ConsumeLiquidFilter; import io.anuke.mindustry.world.consumers.ConsumeLiquidFilter;
import io.anuke.mindustry.world.meta.Attribute; import io.anuke.mindustry.world.meta.Attribute;
import io.anuke.mindustry.world.modules.LiquidModule; import io.anuke.mindustry.world.modules.LiquidModule;
@@ -91,15 +80,25 @@ public class Blocks implements ContentList{
public void load(){ public void load(){
//region environment //region environment
air = new Floor("air"){{ air = new Floor("air"){
{
alwaysReplace = true; alwaysReplace = true;
hasShadow = false; hasShadow = false;
} }
public void draw(Tile tile){} public void draw(Tile tile){
public void load(){} }
public void init(){}
public boolean isHidden(){ return true; } public void load(){
}
public void init(){
}
public boolean isHidden(){
return true;
}
public TextureRegion[] variantRegions(){ public TextureRegion[] variantRegions(){
if(variantRegions == null){ if(variantRegions == null){
variantRegions = new TextureRegion[]{Core.atlas.find("clear")}; variantRegions = new TextureRegion[]{Core.atlas.find("clear")};
@@ -111,7 +110,8 @@ public class Blocks implements ContentList{
part = new BlockPart(); part = new BlockPart();
spawn = new Block("spawn"){ spawn = new Block("spawn"){
public void drawShadow(Tile tile){} public void drawShadow(Tile tile){
}
}; };
//Registers build blocks from size 1-6 //Registers build blocks from size 1-6
@@ -593,10 +593,10 @@ public class Blocks implements ContentList{
separator = new Separator("separator"){{ separator = new Separator("separator"){{
requirements(Category.crafting, ItemStack.with(Items.copper, 60, Items.titanium, 50)); requirements(Category.crafting, ItemStack.with(Items.copper, 60, Items.titanium, 50));
results = ItemStack.with( results = ItemStack.with(
Items.copper, 5, Items.copper, 5,
Items.lead, 3, Items.lead, 3,
Items.graphite, 2, Items.graphite, 2,
Items.titanium, 2 Items.titanium, 2
); );
hasPower = true; hasPower = true;
craftTime = 35f; craftTime = 35f;
@@ -630,7 +630,7 @@ public class Blocks implements ContentList{
} }
int liquidRegion = reg("-liquid"); int liquidRegion = reg("-liquid");
int topRegion =reg("-top"); int topRegion = reg("-top");
drawIcons = () -> new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-top")}; drawIcons = () -> new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-top")};
@@ -638,7 +638,7 @@ public class Blocks implements ContentList{
GenericCrafterEntity entity = tile.entity(); GenericCrafterEntity entity = tile.entity();
Draw.rect(region, tile.drawx(), tile.drawy()); Draw.rect(region, tile.drawx(), tile.drawy());
Draw.rect(reg(frameRegions[(int) Mathf.absin(entity.totalProgress, 5f, 2.999f)]), tile.drawx(), tile.drawy()); Draw.rect(reg(frameRegions[(int)Mathf.absin(entity.totalProgress, 5f, 2.999f)]), tile.drawx(), tile.drawy());
Draw.color(Color.CLEAR, tile.entity.liquids.current().color, tile.entity.liquids.total() / liquidCapacity); Draw.color(Color.CLEAR, tile.entity.liquids.current().color, tile.entity.liquids.total() / liquidCapacity);
Draw.rect(reg(liquidRegion), tile.drawx(), tile.drawy()); Draw.rect(reg(liquidRegion), tile.drawx(), tile.drawy());
Draw.color(); Draw.color();
@@ -1244,10 +1244,10 @@ public class Blocks implements ContentList{
duo = new DoubleTurret("duo"){{ duo = new DoubleTurret("duo"){{
requirements(Category.turret, ItemStack.with(Items.copper, 70), true); requirements(Category.turret, ItemStack.with(Items.copper, 70), true);
ammo( ammo(
Items.copper, Bullets.standardCopper, Items.copper, Bullets.standardCopper,
Items.graphite, Bullets.standardDense, Items.graphite, Bullets.standardDense,
Items.pyratite, Bullets.standardIncendiary, Items.pyratite, Bullets.standardIncendiary,
Items.silicon, Bullets.standardHoming Items.silicon, Bullets.standardHoming
); );
reload = 20f; reload = 20f;
restitution = 0.03f; restitution = 0.03f;
@@ -1262,8 +1262,8 @@ public class Blocks implements ContentList{
scatter = new BurstTurret("scatter"){{ scatter = new BurstTurret("scatter"){{
requirements(Category.turret, ItemStack.with(Items.copper, 170, Items.lead, 90)); requirements(Category.turret, ItemStack.with(Items.copper, 170, Items.lead, 90));
ammo( ammo(
Items.scrap, Bullets.flakScrap, Items.scrap, Bullets.flakScrap,
Items.lead, Bullets.flakLead Items.lead, Bullets.flakLead
); );
reload = 15f; reload = 15f;
range = 180f; range = 180f;
@@ -1277,14 +1277,14 @@ public class Blocks implements ContentList{
inaccuracy = 17f; inaccuracy = 17f;
shootCone = 35f; shootCone = 35f;
health = 260*size*size; health = 260 * size * size;
}}; }};
scorch = new ItemTurret("scorch"){{ scorch = new ItemTurret("scorch"){{
requirements(Category.turret, ItemStack.with(Items.copper, 50, Items.graphite, 45)); requirements(Category.turret, ItemStack.with(Items.copper, 50, Items.graphite, 45));
ammo( ammo(
Items.coal, Bullets.basicFlame, Items.coal, Bullets.basicFlame,
Items.pyratite, Bullets.pyraFlame Items.pyratite, Bullets.pyraFlame
); );
recoil = 0f; recoil = 0f;
reload = 4f; reload = 4f;
@@ -1298,9 +1298,9 @@ public class Blocks implements ContentList{
hail = new ArtilleryTurret("hail"){{ hail = new ArtilleryTurret("hail"){{
requirements(Category.turret, ItemStack.with(Items.copper, 80, Items.graphite, 35)); requirements(Category.turret, ItemStack.with(Items.copper, 80, Items.graphite, 35));
ammo( ammo(
Items.graphite, Bullets.artilleryDense, Items.graphite, Bullets.artilleryDense,
Items.silicon, Bullets.artilleryHoming, Items.silicon, Bullets.artilleryHoming,
Items.pyratite, Bullets.artlleryIncendiary Items.pyratite, Bullets.artlleryIncendiary
); );
reload = 60f; reload = 60f;
recoil = 2f; recoil = 2f;
@@ -1313,10 +1313,10 @@ public class Blocks implements ContentList{
wave = new LiquidTurret("wave"){{ wave = new LiquidTurret("wave"){{
requirements(Category.turret, ItemStack.with(Items.metaglass, 90, Items.lead, 150)); requirements(Category.turret, ItemStack.with(Items.metaglass, 90, Items.lead, 150));
ammo( ammo(
Liquids.water, Bullets.waterShot, Liquids.water, Bullets.waterShot,
Liquids.slag, Bullets.slagShot, Liquids.slag, Bullets.slagShot,
Liquids.cryofluid, Bullets.cryoShot, Liquids.cryofluid, Bullets.cryoShot,
Liquids.oil, Bullets.oilShot Liquids.oil, Bullets.oilShot
); );
size = 2; size = 2;
recoil = 0f; recoil = 0f;
@@ -1325,7 +1325,7 @@ public class Blocks implements ContentList{
shootCone = 50f; shootCone = 50f;
shootEffect = Fx.shootLiquid; shootEffect = Fx.shootLiquid;
range = 110f; range = 110f;
health = 250*size*size; health = 250 * size * size;
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);
@@ -1356,7 +1356,7 @@ public class Blocks implements ContentList{
chargeBeginEffect = Fx.lancerLaserChargeBegin; chargeBeginEffect = Fx.lancerLaserChargeBegin;
heatColor = Color.RED; heatColor = Color.RED;
size = 2; size = 2;
health = 280*size*size; health = 280 * size * size;
targetAir = false; targetAir = false;
}}; }};
@@ -1380,9 +1380,9 @@ public class Blocks implements ContentList{
swarmer = new BurstTurret("swarmer"){{ swarmer = new BurstTurret("swarmer"){{
requirements(Category.turret, ItemStack.with(Items.graphite, 70, Items.titanium, 70, Items.plastanium, 90, Items.silicon, 60)); requirements(Category.turret, ItemStack.with(Items.graphite, 70, Items.titanium, 70, Items.plastanium, 90, Items.silicon, 60));
ammo( ammo(
Items.blastCompound, Bullets.missileExplosive, Items.blastCompound, Bullets.missileExplosive,
Items.pyratite, Bullets.missileIncendiary, Items.pyratite, Bullets.missileIncendiary,
Items.surgealloy, Bullets.missileSurge Items.surgealloy, Bullets.missileSurge
); );
reload = 50f; reload = 50f;
shots = 4; shots = 4;
@@ -1391,17 +1391,17 @@ public class Blocks implements ContentList{
range = 140f; range = 140f;
xRand = 6f; xRand = 6f;
size = 2; size = 2;
health = 300*size*size; health = 300 * size * size;
}}; }};
salvo = new BurstTurret("salvo"){{ salvo = new BurstTurret("salvo"){{
requirements(Category.turret, ItemStack.with(Items.copper, 210, Items.graphite, 190, Items.titanium, 120)); requirements(Category.turret, ItemStack.with(Items.copper, 210, Items.graphite, 190, Items.titanium, 120));
ammo( ammo(
Items.copper, Bullets.standardCopper, Items.copper, Bullets.standardCopper,
Items.graphite, Bullets.standardDense, Items.graphite, Bullets.standardDense,
Items.pyratite, Bullets.standardIncendiary, Items.pyratite, Bullets.standardIncendiary,
Items.silicon, Bullets.standardHoming, Items.silicon, Bullets.standardHoming,
Items.thorium, Bullets.standardThorium Items.thorium, Bullets.standardThorium
); );
size = 2; size = 2;
@@ -1421,11 +1421,11 @@ public class Blocks implements ContentList{
ripple = new ArtilleryTurret("ripple"){{ ripple = new ArtilleryTurret("ripple"){{
requirements(Category.turret, ItemStack.with(Items.copper, 300, Items.graphite, 270, Items.titanium, 120)); requirements(Category.turret, ItemStack.with(Items.copper, 300, Items.graphite, 270, Items.titanium, 120));
ammo( ammo(
Items.graphite, Bullets.artilleryDense, Items.graphite, Bullets.artilleryDense,
Items.silicon, Bullets.artilleryHoming, Items.silicon, Bullets.artilleryHoming,
Items.pyratite, Bullets.artlleryIncendiary, Items.pyratite, Bullets.artlleryIncendiary,
Items.blastCompound, Bullets.artilleryExplosive, Items.blastCompound, Bullets.artilleryExplosive,
Items.plastanium, Bullets.arilleryPlastic Items.plastanium, Bullets.arilleryPlastic
); );
size = 3; size = 3;
shots = 4; shots = 4;
@@ -1446,9 +1446,9 @@ public class Blocks implements ContentList{
cyclone = new ItemTurret("cyclone"){{ cyclone = new ItemTurret("cyclone"){{
requirements(Category.turret, ItemStack.with(Items.copper, 400, Items.titanium, 250, Items.plastanium, 160)); requirements(Category.turret, ItemStack.with(Items.copper, 400, Items.titanium, 250, Items.plastanium, 160));
ammo( ammo(
Items.blastCompound, Bullets.flakExplosive, Items.blastCompound, Bullets.flakExplosive,
Items.plastanium, Bullets.flakPlastic, Items.plastanium, Bullets.flakPlastic,
Items.surgealloy, Bullets.flakSurge Items.surgealloy, Bullets.flakSurge
); );
xRand = 4f; xRand = 4f;
reload = 6f; reload = 6f;
@@ -1478,9 +1478,9 @@ public class Blocks implements ContentList{
spectre = new DoubleTurret("spectre"){{ spectre = new DoubleTurret("spectre"){{
requirements(Category.turret, ItemStack.with(Items.copper, 700, Items.graphite, 600, Items.surgealloy, 500, Items.plastanium, 350, Items.thorium, 500)); requirements(Category.turret, ItemStack.with(Items.copper, 700, Items.graphite, 600, Items.surgealloy, 500, Items.plastanium, 350, Items.thorium, 500));
ammo( ammo(
Items.graphite, Bullets.standardDenseBig, Items.graphite, Bullets.standardDenseBig,
Items.pyratite, Bullets.standardIncendiaryBig, Items.pyratite, Bullets.standardIncendiaryBig,
Items.thorium, Bullets.standardThoriumBig Items.thorium, Bullets.standardThoriumBig
); );
reload = 6f; reload = 6f;
coolantMultiplier = 0.5f; coolantMultiplier = 0.5f;

View File

@@ -1,20 +1,15 @@
package io.anuke.mindustry.content; package io.anuke.mindustry.content;
import io.anuke.mindustry.entities.Effects;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.CapStyle; import io.anuke.arc.graphics.g2d.*;
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.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.util.Time; import io.anuke.arc.util.Time;
import io.anuke.arc.util.Tmp; import io.anuke.arc.util.Tmp;
import io.anuke.mindustry.entities.Damage; import io.anuke.mindustry.entities.Damage;
import io.anuke.mindustry.entities.type.Unit; import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.bullet.*;
import io.anuke.mindustry.entities.effect.Fire; import io.anuke.mindustry.entities.effect.*;
import io.anuke.mindustry.entities.effect.Lightning; import io.anuke.mindustry.entities.type.Unit;
import io.anuke.mindustry.entities.effect.Puddle;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.graphics.Pal;
import io.anuke.mindustry.graphics.Shapes; import io.anuke.mindustry.graphics.Shapes;
@@ -37,7 +32,7 @@ public class Bullets implements ContentList{
//standard //standard
standardCopper, standardDense, standardThorium, standardHoming, standardIncendiary, standardMechSmall, standardCopper, standardDense, standardThorium, standardHoming, standardIncendiary, standardMechSmall,
standardGlaive, standardDenseBig, standardThoriumBig, standardIncendiaryBig, standardGlaive, standardDenseBig, standardThoriumBig, standardIncendiaryBig,
//electric //electric
lancerLaser, meltdownLaser, lightning, arc, damageLightning, lancerLaser, meltdownLaser, lightning, arc, damageLightning,
@@ -562,7 +557,7 @@ public class Bullets implements ContentList{
public void hit(Bullet b, float hitx, float hity){ public void hit(Bullet b, float hitx, float hity){
Effects.effect(hitEffect, colors[2], hitx, hity); Effects.effect(hitEffect, colors[2], hitx, hity);
if(Mathf.chance(0.4)){ if(Mathf.chance(0.4)){
Fire.create(world.tileWorld(hitx+Mathf.range(5f), hity+Mathf.range(5f))); Fire.create(world.tileWorld(hitx + Mathf.range(5f), hity + Mathf.range(5f)));
} }
} }
@@ -586,6 +581,7 @@ public class Bullets implements ContentList{
fuseShot = new BulletType(0.01f, 70){ fuseShot = new BulletType(0.01f, 70){
int rays = 3; int rays = 3;
float rayLength = 80f; float rayLength = 80f;
{ {
hitEffect = Fx.hitFuse; hitEffect = Fx.hitFuse;
lifetime = 13f; lifetime = 13f;
@@ -594,23 +590,23 @@ public class Bullets implements ContentList{
} }
@Override @Override
public void init(Bullet b) { public void init(Bullet b){
for (int i = 0; i < rays; i++) { for(int i = 0; i < rays; i++){
Damage.collideLine(b, b.getTeam(), hitEffect, b.x, b.y, b.rot(), rayLength - Math.abs(i - (rays/2))*20f); Damage.collideLine(b, b.getTeam(), hitEffect, b.x, b.y, b.rot(), rayLength - Math.abs(i - (rays / 2)) * 20f);
} }
} }
@Override @Override
public void draw(Bullet b) { public void draw(Bullet b){
super.draw(b); super.draw(b);
Draw.color(Color.WHITE, Pal.surge, b.fin()); Draw.color(Color.WHITE, Pal.surge, b.fin());
for(int i = 0; i < 7; i++){ for(int i = 0; i < 7; i++){
Tmp.v1.trns(b.rot(), i * 8f); Tmp.v1.trns(b.rot(), i * 8f);
float sl = Mathf.clamp(b.fout()-0.5f) * (80f - i *10); float sl = Mathf.clamp(b.fout() - 0.5f) * (80f - i * 10);
Shapes.tri(b.x + Tmp.v1.x, b.y + Tmp.v1.y, 4f, sl, b.rot() + 90); Shapes.tri(b.x + Tmp.v1.x, b.y + Tmp.v1.y, 4f, sl, b.rot() + 90);
Shapes.tri(b.x + Tmp.v1.x, b.y + Tmp.v1.y, 4f, sl, b.rot() - 90); Shapes.tri(b.x + Tmp.v1.x, b.y + Tmp.v1.y, 4f, sl, b.rot() - 90);
} }
Shapes.tri(b.x, b.y, 13f, (rayLength+50) * b.fout(), b.rot()); Shapes.tri(b.x, b.y, 13f, (rayLength + 50) * b.fout(), b.rot());
Shapes.tri(b.x, b.y, 13f, 10f * b.fout(), b.rot() + 180f); Shapes.tri(b.x, b.y, 13f, 10f * b.fout(), b.rot() + 180f);
Draw.reset(); Draw.reset();
} }
@@ -665,14 +661,16 @@ public class Bullets implements ContentList{
} }
}; };
arc = new BulletType(0.001f, 25){{ arc = new BulletType(0.001f, 25){
{
lifetime = 1; lifetime = 1;
despawnEffect = Fx.none; despawnEffect = Fx.none;
hitEffect = Fx.hitLancer; hitEffect = Fx.hitLancer;
} }
@Override @Override
public void draw(Bullet b){} public void draw(Bullet b){
}
@Override @Override
public void init(Bullet b){ public void init(Bullet b){
@@ -709,7 +707,8 @@ public class Bullets implements ContentList{
incendSpread = 10f; incendSpread = 10f;
}}; }};
bombOil = new BombBulletType(2f, 3f, "shell"){{ bombOil = new BombBulletType(2f, 3f, "shell"){
{
bulletWidth = 8f; bulletWidth = 8f;
bulletHeight = 12f; bulletHeight = 12f;
hitEffect = Fx.pulverize; hitEffect = Fx.pulverize;
@@ -728,7 +727,8 @@ public class Bullets implements ContentList{
} }
}; };
explode = new BombBulletType(2f, 3f, "clear"){{ explode = new BombBulletType(2f, 3f, "clear"){
{
hitEffect = Fx.pulverize; hitEffect = Fx.pulverize;
lifetime = 23f; lifetime = 23f;
speed = 1f; speed = 1f;

View File

@@ -2,9 +2,7 @@ package io.anuke.mindustry.content;
import io.anuke.arc.Core; import io.anuke.arc.Core;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.*;
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.Angles;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.util.Tmp; import io.anuke.arc.util.Tmp;
@@ -39,18 +37,19 @@ public class Fx implements ContentList{
@Override @Override
public void load(){ public void load(){
none = new Effect(0, 0f, e -> {}); none = new Effect(0, 0f, e -> {
});
unitSpawn = new Effect(30f, e -> { unitSpawn = new Effect(30f, e -> {
if(!(e.data instanceof BaseUnit)) return; if(!(e.data instanceof BaseUnit)) return;
Draw.alpha(e.fin()); Draw.alpha(e.fin());
float scl = 1f + e.fout()*2f; float scl = 1f + e.fout() * 2f;
BaseUnit unit = (BaseUnit)e.data; BaseUnit unit = (BaseUnit)e.data;
Draw.rect(unit.getIconRegion(), e.x, e.y, Draw.rect(unit.getIconRegion(), e.x, e.y,
unit.getIconRegion().getWidth() * Draw.scl * scl, unit.getIconRegion().getWidth() * Draw.scl * scl, 180f); unit.getIconRegion().getWidth() * Draw.scl * scl, unit.getIconRegion().getWidth() * Draw.scl * scl, 180f);
Draw.reset(); Draw.reset();
}); });
@@ -74,7 +73,7 @@ public class Fx implements ContentList{
Lines.stroke(3f - e.fin() * 2f); Lines.stroke(3f - e.fin() * 2f);
Lines.square(e.x, e.y, tilesize / 2f * e.rotation + e.fin() * 3f); Lines.square(e.x, e.y, tilesize / 2f * e.rotation + e.fin() * 3f);
Angles.randLenVectors(e.id, 3 + (int) (e.rotation * 3), e.rotation * 2f + (tilesize * e.rotation) * e.finpow(), (x, y) -> { Angles.randLenVectors(e.id, 3 + (int)(e.rotation * 3), e.rotation * 2f + (tilesize * e.rotation) * e.finpow(), (x, y) -> {
Fill.square(e.x + x, e.y + y, 1f + e.fout() * (3f + e.rotation)); Fill.square(e.x + x, e.y + y, 1f + e.fout() * (3f + e.rotation));
}); });
Draw.reset(); Draw.reset();
@@ -113,7 +112,7 @@ public class Fx implements ContentList{
Lines.poly(e.x, e.y, 4, 5f + e.fin() * 60f); Lines.poly(e.x, e.y, 4, 5f + e.fin() * 60f);
Draw.reset(); Draw.reset();
}); });
vtolHover = new Effect(40f, e -> { vtolHover = new Effect(40f, e -> {
float len = e.finpow() * 10f; float len = e.finpow() * 10f;
float ang = e.rotation + Mathf.randomSeedRange(e.id, 30f); float ang = e.rotation + Mathf.randomSeedRange(e.id, 30f);
@@ -179,7 +178,7 @@ public class Fx implements ContentList{
e.scaled(7f, s -> { e.scaled(7f, s -> {
Lines.stroke(0.5f + s.fout()); Lines.stroke(0.5f + s.fout());
Lines.circle(e.x, e.y, s.fin()*5f); Lines.circle(e.x, e.y, s.fin() * 5f);
}); });
@@ -198,7 +197,7 @@ public class Fx implements ContentList{
e.scaled(7f, s -> { e.scaled(7f, s -> {
Lines.stroke(0.5f + s.fout()); Lines.stroke(0.5f + s.fout());
Lines.circle(e.x, e.y, s.fin()*7f); Lines.circle(e.x, e.y, s.fin() * 7f);
}); });
@@ -273,7 +272,7 @@ public class Fx implements ContentList{
hitLaser = new Effect(8, e -> { hitLaser = new Effect(8, e -> {
Draw.color(Color.WHITE, Pal.heal, e.fin()); Draw.color(Color.WHITE, Pal.heal, e.fin());
Lines.stroke(0.5f + e.fout()); Lines.stroke(0.5f + e.fout());
Lines.circle(e.x, e.y, e.fin()*5f); Lines.circle(e.x, e.y, e.fin() * 5f);
Draw.reset(); Draw.reset();
}); });
@@ -539,7 +538,7 @@ public class Fx implements ContentList{
Draw.color(Pal.accent); Draw.color(Pal.accent);
Angles.randLenVectors(e.id, 2, 1f + e.fin() * 2f, (x, y) -> { Angles.randLenVectors(e.id, 2, 1f + e.fin() * 2f, (x, y) -> {
Fill.square(e.x + x, e.y + y, e.fout() * 2.3f+0.5f); Fill.square(e.x + x, e.y + y, e.fout() * 2.3f + 0.5f);
}); });
Draw.color(); Draw.color();
@@ -549,7 +548,7 @@ public class Fx implements ContentList{
float length = 20f * e.finpow(); float length = 20f * e.finpow();
float size = 7f * e.fout(); float size = 7f * e.fout();
Draw.rect(((Item) e.data).icon(Icon.large), e.x + Angles.trnsx(e.rotation, length), e.y + Angles.trnsy(e.rotation, length), size, size); Draw.rect(((Item)e.data).icon(Icon.large), e.x + Angles.trnsx(e.rotation, length), e.y + Angles.trnsy(e.rotation, length), size, size);
}); });
@@ -614,23 +613,23 @@ public class Fx implements ContentList{
dynamicExplosion = new Effect(30, e -> { dynamicExplosion = new Effect(30, e -> {
float intensity = e.rotation; float intensity = e.rotation;
e.scaled(5 + intensity*2, i -> { e.scaled(5 + intensity * 2, i -> {
Lines.stroke(3.1f * i.fout()); Lines.stroke(3.1f * i.fout());
Lines.poly(e.x, e.y, (int)(20 * intensity), (3f + i.fin() * 14f) * intensity); Lines.poly(e.x, e.y, (int)(20 * intensity), (3f + i.fin() * 14f) * intensity);
}); });
Draw.color(Color.GRAY); Draw.color(Color.GRAY);
Angles.randLenVectors(e.id, e.finpow(), (int)(6 * intensity), 21f*intensity, (x, y, in, out) -> { Angles.randLenVectors(e.id, e.finpow(), (int)(6 * intensity), 21f * intensity, (x, y, in, out) -> {
Fill.circle(e.x + x, e.y + y, out * (2f+intensity) * 3 + 0.5f); Fill.circle(e.x + x, e.y + y, out * (2f + intensity) * 3 + 0.5f);
Fill.circle(e.x + x / 2f, e.y + y / 2f, out * (intensity) * 3); Fill.circle(e.x + x / 2f, e.y + y / 2f, out * (intensity) * 3);
}); });
Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.GRAY, e.fin()); Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.GRAY, e.fin());
Lines.stroke((1.7f * e.fout()) * (1f + (intensity - 1f) / 2f)); Lines.stroke((1.7f * e.fout()) * (1f + (intensity - 1f) / 2f));
Angles.randLenVectors(e.id + 1, e.finpow(), (int)(9*intensity), 40f*intensity, (x, y, in, out) -> { Angles.randLenVectors(e.id + 1, e.finpow(), (int)(9 * intensity), 40f * intensity, (x, y, in, out) -> {
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + out * 4 * (3f+intensity)); Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + out * 4 * (3f + intensity));
}); });
Draw.reset(); Draw.reset();
@@ -772,8 +771,8 @@ public class Fx 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;
Fill.rect(e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), Fill.rect(e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()),
e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), 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);
Draw.color(); Draw.color();
}); });
@@ -785,9 +784,9 @@ public class Fx implements ContentList{
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(Core.atlas.find("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);
} }
Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin()); Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin());
@@ -808,10 +807,10 @@ public class Fx implements ContentList{
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(Core.atlas.find("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,
rot + e.fin() * 30f * i + Mathf.randomSeedRange(e.id + i + 9, 40f * e.fin())); rot + e.fin() * 30f * i + Mathf.randomSeedRange(e.id + i + 9, 40f * e.fin()));
} }
Draw.color(Color.LIGHT_GRAY); Draw.color(Color.LIGHT_GRAY);
@@ -1178,7 +1177,7 @@ public class Fx implements ContentList{
healBlock = new Effect(20, e -> { healBlock = new Effect(20, e -> {
Draw.color(Pal.heal); Draw.color(Pal.heal);
Lines.stroke(2f * e.fout() + 0.5f); Lines.stroke(2f * e.fout() + 0.5f);
Lines.square(e.x, e.y, 1f + (e.fin() * e.rotation * tilesize/2f-1f)); Lines.square(e.x, e.y, 1f + (e.fin() * e.rotation * tilesize / 2f - 1f));
Draw.color(); Draw.color();
}); });

View File

@@ -21,7 +21,7 @@ import io.anuke.mindustry.type.Weapon;
public class Mechs implements ContentList{ public class Mechs implements ContentList{
public static Mech alpha, delta, tau, omega, dart, javelin, trident, glaive; public static Mech alpha, delta, tau, omega, dart, javelin, trident, glaive;
/**These are not new mechs, just re-assignments for convenience.*/ /** These are not new mechs, just re-assignments for convenience. */
public static Mech starterDesktop, starterMobile; public static Mech starterDesktop, starterMobile;
@Override @Override
@@ -137,7 +137,7 @@ public class Mechs implements ContentList{
if(player.timer.get(Player.timerAbility, healReload)){ if(player.timer.get(Player.timerAbility, healReload)){
wasHealed = false; wasHealed = false;
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.dst(player) <= healRange){ if(unit.dst(player) <= healRange){
if(unit.health < unit.maxHealth()){ if(unit.health < unit.maxHealth()){
@@ -192,7 +192,7 @@ public class Mechs implements ContentList{
@Override @Override
public float spreadX(Player player){ public float spreadX(Player player){
return player.shootHeat*2f; return player.shootHeat * 2f;
} }
@Override @Override
@@ -203,7 +203,7 @@ public class Mechs implements ContentList{
@Override @Override
public void updateAlt(Player player){ public void updateAlt(Player player){
float scl = 1f - player.shootHeat/2f; float scl = 1f - player.shootHeat / 2f;
player.velocity().scl(scl); player.velocity().scl(scl);
} }
@@ -257,6 +257,7 @@ public class Mechs implements ContentList{
float minV = 3.6f; float minV = 3.6f;
float maxV = 6f; float maxV = 6f;
TextureRegion shield; TextureRegion shield;
{ {
drillPower = -1; drillPower = -1;
speed = 0.11f; speed = 0.11f;
@@ -292,7 +293,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(Time.delta() * (0.15*scl))){ if(Mathf.chance(Time.delta() * (0.15 * scl))){
Effects.effect(Fx.hitLancer, Pal.lancerLaser, player.x, player.y); Effects.effect(Fx.hitLancer, Pal.lancerLaser, player.x, player.y);
Lightning.create(player.getTeam(), Pal.lancerLaser, 10f, Lightning.create(player.getTeam(), Pal.lancerLaser, 10f,
player.x + player.velocity().x, player.y + player.velocity().y, player.rotation, 14); player.x + player.velocity().x, player.y + player.velocity().y, player.rotation, 14);
@@ -304,9 +305,9 @@ public class Mechs implements ContentList{
float scl = scld(player); float scl = scld(player);
if(scl < 0.01f) return; if(scl < 0.01f) return;
Draw.color(Pal.lancerLaser); Draw.color(Pal.lancerLaser);
Draw.alpha(scl/2f); Draw.alpha(scl / 2f);
Draw.blend(Blending.additive); Draw.blend(Blending.additive);
Draw.rect(shield, player.x + Mathf.range(scl/2f), player.y + Mathf.range(scl/2f), player.rotation - 90); Draw.rect(shield, player.x + Mathf.range(scl / 2f), player.y + Mathf.range(scl / 2f), player.rotation - 90);
Draw.blend(); Draw.blend();
} }

View File

@@ -1,7 +1,7 @@
package io.anuke.mindustry.content; package io.anuke.mindustry.content;
import io.anuke.mindustry.entities.Effects;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.mindustry.type.StatusEffect; import io.anuke.mindustry.type.StatusEffect;

View File

@@ -88,7 +88,6 @@ public class TechTree implements ContentList{
}); });
node(copperWall, () -> { node(copperWall, () -> {
node(copperWallLarge); node(copperWallLarge);
node(titaniumWall, () -> { node(titaniumWall, () -> {
@@ -172,7 +171,6 @@ public class TechTree implements ContentList{
}); });
node(mechanicalPump, () -> { node(mechanicalPump, () -> {
node(conduit, () -> { node(conduit, () -> {
node(liquidJunction, () -> { node(liquidJunction, () -> {
@@ -275,12 +273,13 @@ public class TechTree implements ContentList{
for(int i = 0; i < requirements.length; i++){ for(int i = 0; i < requirements.length; i++){
requirements[i] = new ItemStack(block.buildRequirements[i].item, block.buildRequirements[i].amount * 5); requirements[i] = new ItemStack(block.buildRequirements[i].item, block.buildRequirements[i].amount * 5);
} }
return new TechNode(block, requirements, children); return new TechNode(block, requirements, children);
} }
private TechNode node(Block block){ private TechNode node(Block block){
return node(block, () -> {}); return node(block, () -> {
});
} }
public static class TechNode{ public static class TechNode{

View File

@@ -8,9 +8,9 @@ import io.anuke.mindustry.type.Weapon;
public class UnitTypes implements ContentList{ public class UnitTypes implements ContentList{
public static UnitType public static UnitType
spirit, phantom, spirit, phantom,
wraith, ghoul, revenant, lich, reaper, wraith, ghoul, revenant, lich, reaper,
dagger, crawler, titan, fortress, eruptor, chaosArray, eradicator; dagger, crawler, titan, fortress, eruptor, chaosArray, eradicator;
@Override @Override
public void load(){ public void load(){

View File

@@ -4,9 +4,7 @@ import io.anuke.mindustry.game.ContentList;
import io.anuke.mindustry.game.Rules; import io.anuke.mindustry.game.Rules;
import io.anuke.mindustry.maps.generators.MapGenerator; import io.anuke.mindustry.maps.generators.MapGenerator;
import io.anuke.mindustry.maps.generators.MapGenerator.Decoration; import io.anuke.mindustry.maps.generators.MapGenerator.Decoration;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.*;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.Zone;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
public class Zones implements ContentList{ public class Zones implements ContentList{
@@ -44,7 +42,7 @@ public class Zones implements ContentList{
}}; }};
frozenForest = new Zone("frozenForest", new MapGenerator("frozenForest", 1) frozenForest = new Zone("frozenForest", new MapGenerator("frozenForest", 1)
.decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.02))){{ .decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.02))){{
loadout = Loadouts.basicFoundation; loadout = Loadouts.basicFoundation;
baseLaunchCost = ItemStack.with(); baseLaunchCost = ItemStack.with();
startingItems = ItemStack.list(Items.copper, 400); startingItems = ItemStack.list(Items.copper, 400);
@@ -89,8 +87,8 @@ public class Zones implements ContentList{
}};*/ }};*/
stainedMountains = new Zone("stainedMountains", new MapGenerator("stainedMountains", 2) stainedMountains = new Zone("stainedMountains", new MapGenerator("stainedMountains", 2)
.dist(0f, false) .dist(0f, false)
.decor(new Decoration(Blocks.moss, Blocks.shaleBoulder, 0.02))){{ .decor(new Decoration(Blocks.moss, Blocks.shaleBoulder, 0.02))){{
loadout = Loadouts.basicFoundation; loadout = Loadouts.basicFoundation;
baseLaunchCost = ItemStack.with(); baseLaunchCost = ItemStack.with();
startingItems = ItemStack.list(Items.copper, 400, Items.lead, 100); startingItems = ItemStack.list(Items.copper, 400, Items.lead, 100);

View File

@@ -1,8 +1,6 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import io.anuke.arc.collection.Array; import io.anuke.arc.collection.*;
import io.anuke.arc.collection.ObjectMap;
import io.anuke.arc.collection.ObjectSet;
import io.anuke.arc.function.Consumer; import io.anuke.arc.function.Consumer;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.Pixmap; import io.anuke.arc.graphics.Pixmap;
@@ -10,14 +8,10 @@ import io.anuke.arc.util.Log;
import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.*;
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;
import io.anuke.mindustry.entities.effect.Fire; import io.anuke.mindustry.entities.effect.*;
import io.anuke.mindustry.entities.effect.Lightning;
import io.anuke.mindustry.entities.effect.Puddle;
import io.anuke.mindustry.entities.traits.TypeTrait; import io.anuke.mindustry.entities.traits.TypeTrait;
import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.entities.type.Player;
import io.anuke.mindustry.game.Content; import io.anuke.mindustry.game.*;
import io.anuke.mindustry.game.ContentList;
import io.anuke.mindustry.game.MappableContent;
import io.anuke.mindustry.type.*; import io.anuke.mindustry.type.*;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.LegacyColorMapper; import io.anuke.mindustry.world.LegacyColorMapper;
@@ -58,7 +52,7 @@ public class ContentLoader{
verbose = true; verbose = true;
} }
/**Creates all content types.*/ /** Creates all content types. */
public void load(){ public void load(){
if(loaded){ if(loaded){
Log.info("Content already loaded, skipping."); Log.info("Content already loaded, skipping.");
@@ -69,7 +63,7 @@ public class ContentLoader{
for(ContentType type : ContentType.values()){ for(ContentType type : ContentType.values()){
contentMap[type.ordinal()] = new Array<>(); contentMap[type.ordinal()] = new Array<>();
contentNameMap[type.ordinal()] = new ObjectMap<>(); contentNameMap[type.ordinal()] = new ObjectMap<>();
} }
for(ContentList list : content){ for(ContentList list : content){
@@ -82,13 +76,13 @@ public class ContentLoader{
for(Content c : contentMap[type.ordinal()]){ for(Content c : contentMap[type.ordinal()]){
if(c instanceof MappableContent){ if(c instanceof MappableContent){
String name = ((MappableContent) c).name; String name = ((MappableContent)c).name;
if(contentNameMap[type.ordinal()].containsKey(name)){ if(contentNameMap[type.ordinal()].containsKey(name)){
throw new IllegalArgumentException("Two content objects cannot have the same name! (issue: '" + name + "')"); throw new IllegalArgumentException("Two content objects cannot have the same name! (issue: '" + name + "')");
} }
contentNameMap[type.ordinal()].put(name, (MappableContent) c); contentNameMap[type.ordinal()].put(name, (MappableContent)c);
} }
total ++; total++;
} }
} }
@@ -119,7 +113,7 @@ public class ContentLoader{
loaded = true; loaded = true;
} }
/**Initializes all content with the specified function.*/ /** Initializes all content with the specified function. */
public void initialize(Consumer<Content> callable){ public void initialize(Consumer<Content> callable){
if(initialization.contains(callable)) return; if(initialization.contains(callable)) return;
@@ -132,7 +126,7 @@ public class ContentLoader{
initialization.add(callable); initialization.add(callable);
} }
/**Loads block colors.*/ /** Loads block colors. */
public void loadColors(){ public void loadColors(){
Pixmap pixmap = new Pixmap(files.internal("sprites/block_colors.png")); Pixmap pixmap = new Pixmap(files.internal("sprites/block_colors.png"));
for(int i = 0; i < 256; i++){ for(int i = 0; i < 256; i++){
@@ -193,7 +187,7 @@ public class ContentLoader{
} }
public <T extends Content> Array<T> getBy(ContentType type){ public <T extends Content> Array<T> getBy(ContentType type){
return (Array<T>) contentMap[type.ordinal()]; return (Array<T>)contentMap[type.ordinal()];
} }
//utility methods, just makes things a bit shorter //utility methods, just makes things a bit shorter
@@ -203,7 +197,7 @@ public class ContentLoader{
} }
public Block block(int id){ public Block block(int id){
return (Block) getByID(ContentType.block, id); return (Block)getByID(ContentType.block, id);
} }
public Array<Item> items(){ public Array<Item> items(){
@@ -211,7 +205,7 @@ public class ContentLoader{
} }
public Item item(int id){ public Item item(int id){
return (Item) getByID(ContentType.item, id); return (Item)getByID(ContentType.item, id);
} }
public Array<Liquid> liquids(){ public Array<Liquid> liquids(){
@@ -219,7 +213,7 @@ public class ContentLoader{
} }
public Liquid liquid(int id){ public Liquid liquid(int id){
return (Liquid) getByID(ContentType.liquid, id); return (Liquid)getByID(ContentType.liquid, id);
} }
public Array<BulletType> bullets(){ public Array<BulletType> bullets(){
@@ -227,7 +221,7 @@ public class ContentLoader{
} }
public BulletType bullet(int id){ public BulletType bullet(int id){
return (BulletType) getByID(ContentType.bullet, id); return (BulletType)getByID(ContentType.bullet, id);
} }
public Array<Zone> zones(){ public Array<Zone> zones(){
@@ -250,5 +244,9 @@ public class ContentLoader{
TypeTrait.registerType(Lightning.class, Lightning::new); TypeTrait.registerType(Lightning.class, Lightning::new);
} }
private class ImpendingDoomException extends RuntimeException{ ImpendingDoomException(String s){ super(s); }} private class ImpendingDoomException extends RuntimeException{
ImpendingDoomException(String s){
super(s);
}
}
} }

View File

@@ -1,8 +1,6 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import io.anuke.arc.ApplicationListener; import io.anuke.arc.*;
import io.anuke.arc.Core;
import io.anuke.arc.Events;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.GL20; import io.anuke.arc.graphics.GL20;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Draw;
@@ -16,16 +14,10 @@ import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.EntityQuery; import io.anuke.mindustry.entities.EntityQuery;
import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.entities.type.Player;
import io.anuke.mindustry.game.Content; import io.anuke.mindustry.game.*;
import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.EventType.*;
import io.anuke.mindustry.game.GlobalData;
import io.anuke.mindustry.game.Rules;
import io.anuke.mindustry.game.Saves;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.input.Binding; import io.anuke.mindustry.input.*;
import io.anuke.mindustry.input.DesktopInput;
import io.anuke.mindustry.input.InputHandler;
import io.anuke.mindustry.input.MobileInput;
import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.maps.Map;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
@@ -152,20 +144,20 @@ public class Control implements ApplicationListener{
if(e.breaking){ if(e.breaking){
state.stats.buildingsDeconstructed++; state.stats.buildingsDeconstructed++;
}else{ }else{
state.stats.buildingsBuilt ++; state.stats.buildingsBuilt++;
} }
} }
}); });
Events.on(BlockDestroyEvent.class, e -> { Events.on(BlockDestroyEvent.class, e -> {
if(e.tile.getTeam() == player.getTeam()){ if(e.tile.getTeam() == player.getTeam()){
state.stats.buildingsDestroyed ++; state.stats.buildingsDestroyed++;
} }
}); });
Events.on(UnitDestroyEvent.class, e -> { Events.on(UnitDestroyEvent.class, e -> {
if(e.unit.getTeam() != player.getTeam()){ if(e.unit.getTeam() != player.getTeam()){
state.stats.enemyUnitsDestroyed ++; state.stats.enemyUnitsDestroyed++;
} }
}); });
@@ -252,9 +244,9 @@ public class Control implements ApplicationListener{
Core.settings.save(); Core.settings.save();
}).size(100f, 60f); }).size(100f, 60f);
dialog.cont.add("Reminder: The alpha version you are about to play is very unstable, and is [accent]not representative of the final v4 release.[]\n\n " + dialog.cont.add("Reminder: The alpha version you are about to play is very unstable, and is [accent]not representative of the final v4 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" +
"All current art and UI is unfinished, and will be changed before release. " + "All current art and UI is unfinished, and will be changed before release. " +
"\n\n[accent]Saves may be corrupted without warning between updates.").wrap().width(400f); "\n\n[accent]Saves may be corrupted without warning between updates.").wrap().width(400f);
dialog.show(); dialog.show();
}); });
} }
@@ -309,7 +301,7 @@ public class Control implements ApplicationListener{
Time.update(); Time.update();
} }
if(!scene.hasDialog() && !(scene.root.getChildren().peek() instanceof Dialog) &&Core.input.keyTap(KeyCode.BACK)){ if(!scene.hasDialog() && !(scene.root.getChildren().peek() instanceof Dialog) && Core.input.keyTap(KeyCode.BACK)){
Platform.instance.hide(); Platform.instance.hide();
} }
} }

View File

@@ -3,30 +3,28 @@ package io.anuke.mindustry.core;
import io.anuke.arc.Events; import io.anuke.arc.Events;
import io.anuke.mindustry.entities.type.BaseUnit; import io.anuke.mindustry.entities.type.BaseUnit;
import io.anuke.mindustry.game.EventType.StateChangeEvent; import io.anuke.mindustry.game.EventType.StateChangeEvent;
import io.anuke.mindustry.game.Rules; import io.anuke.mindustry.game.*;
import io.anuke.mindustry.game.Stats;
import io.anuke.mindustry.game.Teams;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
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;
public class GameState{ public class GameState{
/**Current wave number, can be anything in non-wave modes.*/ /** Current wave number, can be anything in non-wave modes. */
public int wave = 1; public int wave = 1;
/**Wave countdown in ticks.*/ /** Wave countdown in ticks. */
public float wavetime; public float wavetime;
/**Whether the game is in game over state.*/ /** Whether the game is in game over state. */
public boolean gameOver = false, launched = false; public boolean gameOver = false, launched = false;
/**The current game rules.*/ /** The current game rules. */
public Rules rules = new Rules(); public Rules rules = new Rules();
/**Statistics for this save/game. Displayed after game over.*/ /** Statistics for this save/game. Displayed after game over. */
public Stats stats = new Stats(); public Stats stats = new Stats();
/**Team data. Gets reset every new game.*/ /** Team data. Gets reset every new game. */
public Teams teams = new Teams(); public Teams teams = new Teams();
/**Number of enemies in the game; only used clientside in servers.*/ /** Number of enemies in the game; only used clientside in servers. */
public int enemies; public int enemies;
/**Current game state.*/ /** Current game state. */
private State state = State.menu; private State state = State.menu;
public int enemies(){ public int enemies(){

View File

@@ -8,15 +8,9 @@ import io.anuke.arc.collection.ObjectSet.ObjectSetIterator;
import io.anuke.arc.util.Time; import io.anuke.arc.util.Time;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.Entities;
import io.anuke.mindustry.entities.EntityGroup;
import io.anuke.mindustry.entities.EntityQuery;
import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.game.EventType.GameOverEvent; import io.anuke.mindustry.game.EventType.*;
import io.anuke.mindustry.game.EventType.PlayEvent;
import io.anuke.mindustry.game.EventType.ResetEvent;
import io.anuke.mindustry.game.EventType.WaveEvent;
import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.*;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
@@ -51,7 +45,7 @@ public class Logic implements ApplicationListener{
}); });
} }
/**Handles the event of content being used by either the player or some block.*/ /** Handles the event of content being used by either the player or some block. */
public void handleContent(UnlockableContent content){ public void handleContent(UnlockableContent content){
if(!headless){ if(!headless){
data.unlockContent(content); data.unlockContent(content);
@@ -85,7 +79,7 @@ public class Logic implements ApplicationListener{
world.spawner.spawnEnemies(); world.spawner.spawnEnemies();
state.wave++; state.wave++;
state.wavetime = world.isZone() && world.getZone().isBossWave(state.wave) ? state.rules.waveSpacing * bossWaveMultiplier : state.wavetime = world.isZone() && world.getZone().isBossWave(state.wave) ? state.rules.waveSpacing * bossWaveMultiplier :
world.isZone() && world.getZone().isLaunchWave(state.wave) ? state.rules.waveSpacing * launchWaveMultiplier : state.rules.waveSpacing; world.isZone() && world.getZone().isLaunchWave(state.wave) ? state.rules.waveSpacing * launchWaveMultiplier : state.rules.waveSpacing;
Events.fire(new WaveEvent()); Events.fire(new WaveEvent());
} }

View File

@@ -1,17 +1,12 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.*;
import io.anuke.annotations.Annotations.PacketPriority;
import io.anuke.annotations.Annotations.Remote;
import io.anuke.annotations.Annotations.Variant;
import io.anuke.arc.ApplicationListener; import io.anuke.arc.ApplicationListener;
import io.anuke.arc.Core; import io.anuke.arc.Core;
import io.anuke.arc.collection.IntSet; import io.anuke.arc.collection.IntSet;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.math.RandomXS128; import io.anuke.arc.math.RandomXS128;
import io.anuke.arc.util.Interval; import io.anuke.arc.util.*;
import io.anuke.arc.util.Log;
import io.anuke.arc.util.Time;
import io.anuke.arc.util.io.ReusableByteArrayInputStream; import io.anuke.arc.util.io.ReusableByteArrayInputStream;
import io.anuke.arc.util.serialization.Base64Coder; import io.anuke.arc.util.serialization.Base64Coder;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
@@ -25,11 +20,9 @@ import io.anuke.mindustry.entities.type.Player;
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.RemoteReadClient; import io.anuke.mindustry.gen.RemoteReadClient;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.*;
import io.anuke.mindustry.net.Net.SendMode; import io.anuke.mindustry.net.Net.SendMode;
import io.anuke.mindustry.net.NetworkIO;
import io.anuke.mindustry.net.Packets.*; import io.anuke.mindustry.net.Packets.*;
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;
@@ -45,18 +38,18 @@ public class NetClient implements ApplicationListener{
public final static float viewScale = 2f; public final static float viewScale = 2f;
private Interval timer = new Interval(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. */
private boolean quiet = false; private boolean quiet = false;
/**Counter for data timeout.*/ /** Counter for data timeout. */
private float timeoutTime = 0f; private float timeoutTime = 0f;
/**Last sent client snapshot ID.*/ /** Last sent client snapshot ID. */
private int lastSent; private int lastSent;
/**List of entities that were removed, and need not be added while syncing.*/ /** List of entities that were removed, and need not be added while syncing. */
private IntSet removed = new IntSet(); private IntSet removed = new IntSet();
/**Byte stream for reading in snapshots.*/ /** Byte stream for reading in snapshots. */
private ReusableByteArrayInputStream byteStream = new ReusableByteArrayInputStream(); private ReusableByteArrayInputStream byteStream = new ReusableByteArrayInputStream();
private DataInputStream dataStream = new DataInputStream(byteStream); private DataInputStream dataStream = new DataInputStream(byteStream);
@@ -210,7 +203,7 @@ public class NetClient implements ApplicationListener{
int id = input.readInt(); int id = input.readInt();
byte typeID = input.readByte(); byte typeID = input.readByte();
SyncTrait entity = (SyncTrait) group.getByID(id); SyncTrait entity = (SyncTrait)group.getByID(id);
boolean add = false; boolean add = false;
if(entity == null && id == player.id){ if(entity == null && id == player.id){
@@ -220,7 +213,7 @@ public class NetClient implements ApplicationListener{
//entity must not be added yet, so create it //entity must not be added yet, so create it
if(entity == null){ if(entity == null){
entity = (SyncTrait) TypeTrait.getTypeByID(typeID).get(); //create entity from supplier entity = (SyncTrait)TypeTrait.getTypeByID(typeID).get(); //create entity from supplier
entity.resetID(id); entity.resetID(id);
if(!netClient.isEntityUsed(entity.getID())){ if(!netClient.isEntityUsed(entity.getID())){
add = true; add = true;
@@ -323,7 +316,7 @@ public class NetClient implements ApplicationListener{
Net.disconnect(); Net.disconnect();
} }
/**When set, any disconnects will be ignored and no dialogs will be shown.*/ /** When set, any disconnects will be ignored and no dialogs will be shown. */
public void setQuiet(){ public void setQuiet(){
quiet = true; quiet = true;
} }
@@ -349,13 +342,13 @@ public class NetClient implements ApplicationListener{
} }
Call.onClientShapshot(lastSent++, player.x, player.y, Call.onClientShapshot(lastSent++, player.x, player.y,
player.pointerX, player.pointerY, player.rotation, player.baseRotation, player.pointerX, player.pointerY, player.rotation, player.baseRotation,
player.velocity().x, player.velocity().y, player.velocity().x, player.velocity().y,
player.getMineTile(), player.getMineTile(),
player.isBoosting, player.isShooting, ui.chatfrag.chatOpen(), player.isBoosting, player.isShooting, ui.chatfrag.chatOpen(),
requests, requests,
Core.camera.position.x, Core.camera.position.y, Core.camera.position.x, Core.camera.position.y,
Core.camera.width * viewScale, Core.camera.height * viewScale); Core.camera.width * viewScale, Core.camera.height * viewScale);
} }
if(timer.get(1, 60)){ if(timer.get(1, 60)){

View File

@@ -4,26 +4,19 @@ 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.ApplicationListener;
import io.anuke.arc.Events; import io.anuke.arc.Events;
import io.anuke.arc.collection.Array; import io.anuke.arc.collection.*;
import io.anuke.arc.collection.IntMap;
import io.anuke.arc.collection.ObjectSet;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.Colors; import io.anuke.arc.graphics.Colors;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Rectangle; import io.anuke.arc.math.geom.Rectangle;
import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.math.geom.Vector2;
import io.anuke.arc.util.Log; import io.anuke.arc.util.*;
import io.anuke.arc.util.Structs;
import io.anuke.arc.util.Time;
import io.anuke.arc.util.Tmp;
import io.anuke.arc.util.io.ByteBufferOutput; import io.anuke.arc.util.io.ByteBufferOutput;
import io.anuke.arc.util.io.CountableByteArrayOutputStream; import io.anuke.arc.util.io.CountableByteArrayOutputStream;
import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Blocks;
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.Entities; import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.EntityGroup;
import io.anuke.mindustry.entities.EntityQuery;
import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest;
import io.anuke.mindustry.entities.traits.Entity; import io.anuke.mindustry.entities.traits.Entity;
import io.anuke.mindustry.entities.traits.SyncTrait; import io.anuke.mindustry.entities.traits.SyncTrait;
@@ -33,44 +26,40 @@ 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.Administration; import io.anuke.mindustry.net.*;
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 java.io.ByteArrayInputStream; import java.io.*;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.zip.DeflaterOutputStream; import java.util.zip.DeflaterOutputStream;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
import java.lang.StringBuilder;
public class NetServer implements ApplicationListener{ public class NetServer implements ApplicationListener{
public final static int maxSnapshotSize = 430; public final static int maxSnapshotSize = 430;
private final static float serverSyncTime = 30, kickDuration = 30 * 1000; private final static float serverSyncTime = 30, kickDuration = 30 * 1000;
private final static Vector2 vector = new Vector2(); private final static Vector2 vector = new Vector2();
private final static Rectangle viewport = new Rectangle(); private final static Rectangle viewport = new Rectangle();
private final static Array<Entity> returnArray = new Array<>(); private final static Array<Entity> returnArray = new Array<>();
/**If a player goes away of their server-side coordinates by this distance, they get teleported back.*/ /** If a player goes away of their server-side coordinates by this distance, they get teleported back. */
private final static float correctDist = 16f; private final static float correctDist = 16f;
public final Administration admins = new Administration(); public final Administration admins = new Administration();
/**Maps connection IDs to players.*/ /** Maps connection IDs to players. */
private IntMap<Player> connections = new IntMap<>(); private IntMap<Player> connections = new IntMap<>();
private boolean closing = false; private boolean closing = false;
private ByteBuffer writeBuffer = ByteBuffer.allocate(127); private ByteBuffer writeBuffer = ByteBuffer.allocate(127);
private ByteBufferOutput outputBuffer = new ByteBufferOutput(writeBuffer); private ByteBufferOutput outputBuffer = new ByteBufferOutput(writeBuffer);
/**Stream for writing player sync data to.*/ /** Stream for writing player sync data to. */
private CountableByteArrayOutputStream syncStream = new CountableByteArrayOutputStream(); private CountableByteArrayOutputStream syncStream = new CountableByteArrayOutputStream();
/**Data stream for writing player sync data to.*/ /** Data stream for writing player sync data to. */
private DataOutputStream dataStream = new DataOutputStream(syncStream); private DataOutputStream dataStream = new DataOutputStream(syncStream);
public NetServer(){ public NetServer(){
@@ -100,7 +89,7 @@ public class NetServer implements ApplicationListener{
NetConnection connection = Net.getConnection(id); NetConnection connection = Net.getConnection(id);
if(connection == null || if(connection == null ||
admins.isIPBanned(connection.address)) return; admins.isIPBanned(connection.address)) return;
if(connection.hasBegunConnecting){ if(connection.hasBegunConnecting){
kick(id, KickReason.idInUse); kick(id, KickReason.idInUse);
@@ -215,7 +204,7 @@ public class NetServer implements ApplicationListener{
int count = 0; int count = 0;
for(Player other : players){ for(Player other : players){
if(other.getTeam() == team){ if(other.getTeam() == team){
count ++; count++;
} }
} }
return count; return count;
@@ -262,16 +251,16 @@ public class NetServer implements ApplicationListener{
@Remote(targets = Loc.client, unreliable = true) @Remote(targets = Loc.client, unreliable = true)
public static void onClientShapshot( public static void onClientShapshot(
Player player, Player player,
int snapshotID, int snapshotID,
float x, float y, float x, float y,
float pointerX, float pointerY, float pointerX, float pointerY,
float rotation, float baseRotation, float rotation, float baseRotation,
float xVelocity, float yVelocity, float xVelocity, float yVelocity,
Tile mining, Tile mining,
boolean boosting, boolean shooting, boolean chatting, boolean boosting, boolean shooting, boolean chatting,
BuildRequest[] requests, BuildRequest[] requests,
float viewX, float viewY, float viewWidth, float viewHeight float viewX, float viewY, float viewWidth, float viewHeight
){ ){
NetConnection connection = player.con; NetConnection connection = player.con;
if(connection == null || snapshotID < connection.lastRecievedClientSnapshot) return; if(connection == null || snapshotID < connection.lastRecievedClientSnapshot) return;
@@ -348,7 +337,7 @@ public class NetServer implements ApplicationListener{
if(!player.isAdmin){ if(!player.isAdmin){
Log.warn("ACCESS DENIED: Player {0} / {1} attempted to perform admin action without proper security access.", Log.warn("ACCESS DENIED: Player {0} / {1} attempted to perform admin action without proper security access.",
player.name, player.con.address); player.name, player.con.address);
return; return;
} }
@@ -394,7 +383,7 @@ public class NetServer implements ApplicationListener{
int used = 0; int used = 0;
for(Team t : Team.all){ for(Team t : Team.all){
if(playerGroup.count(p -> p.getTeam() == t) > 0){ if(playerGroup.count(p -> p.getTeam() == t) > 0){
used ++; used++;
} }
} }
return used < 2; return used < 2;
@@ -472,7 +461,7 @@ public class NetServer implements ApplicationListener{
for(EntityGroup<?> group : Entities.getAllGroups()){ for(EntityGroup<?> group : Entities.getAllGroups()){
if(group.isEmpty() || !(group.all().get(0) instanceof SyncTrait)) continue; if(group.isEmpty() || !(group.all().get(0) instanceof SyncTrait)) continue;
//clipping is done by representatives //clipping is done by representatives
SyncTrait represent = (SyncTrait) group.all().get(0); SyncTrait represent = (SyncTrait)group.all().get(0);
//make sure mapping is enabled for this group //make sure mapping is enabled for this group
if(!group.mappingEnabled()){ if(!group.mappingEnabled()){
@@ -482,13 +471,13 @@ public class NetServer implements ApplicationListener{
returnArray.clear(); returnArray.clear();
if(represent.isClipped()){ if(represent.isClipped()){
EntityQuery.getNearby(group, viewport, entity -> { EntityQuery.getNearby(group, viewport, entity -> {
if(((SyncTrait) entity).isSyncing() && viewport.overlaps(Tmp.r3.setSize(((SyncTrait)entity).clipSize(), ((SyncTrait)entity).clipSize()).setCenter(entity.getX(), entity.getY()))){ if(((SyncTrait)entity).isSyncing() && viewport.overlaps(Tmp.r3.setSize(((SyncTrait)entity).clipSize(), ((SyncTrait)entity).clipSize()).setCenter(entity.getX(), entity.getY()))){
returnArray.add(entity); returnArray.add(entity);
} }
}); });
}else{ }else{
for(Entity entity : group.all()){ for(Entity entity : group.all()){
if(((SyncTrait) entity).isSyncing()){ if(((SyncTrait)entity).isSyncing()){
returnArray.add(entity); returnArray.add(entity);
} }
} }
@@ -501,10 +490,10 @@ public class NetServer implements ApplicationListener{
for(Entity entity : returnArray){ for(Entity entity : returnArray){
//write all entities now //write all entities now
dataStream.writeInt(entity.getID()); //write id dataStream.writeInt(entity.getID()); //write id
dataStream.writeByte(((SyncTrait) entity).getTypeID()); //write type ID dataStream.writeByte(((SyncTrait)entity).getTypeID()); //write type ID
((SyncTrait) entity).write(dataStream); //write entity ((SyncTrait)entity).write(dataStream); //write entity
sent ++; sent++;
if(syncStream.position() > maxSnapshotSize){ if(syncStream.position() > maxSnapshotSize){
dataStream.close(); dataStream.close();
@@ -579,7 +568,7 @@ public class NetServer implements ApplicationListener{
try{ try{
//iterate through each player //iterate through each player
for(int i = 0; i < playerGroup.size(); i ++){ for(int i = 0; i < playerGroup.size(); i++){
Player player = playerGroup.all().get(i); Player player = playerGroup.all().get(i);
if(player.isLocal) continue; if(player.isLocal) continue;

View File

@@ -10,15 +10,17 @@ import io.anuke.arc.util.serialization.Base64Coder;
import static io.anuke.mindustry.Vars.mobile; import static io.anuke.mindustry.Vars.mobile;
public abstract class Platform { public abstract class Platform{
/**Each separate game platform should set this instance to their own implementation.*/ /** Each separate game platform should set this instance to their own implementation. */
public static Platform instance = new Platform() {}; public static Platform instance = new Platform(){
};
/**Add a text input dialog that should show up after the field is tapped.*/ /** Add a text input dialog that should show up after the field is tapped. */
public void addDialog(TextField field){ public void addDialog(TextField field){
addDialog(field, 16); addDialog(field, 16);
} }
/**See addDialog().*/
/** See addDialog(). */
public void addDialog(TextField field, int maxLength){ public void addDialog(TextField field, int maxLength){
if(!mobile) return; //this is mobile only, desktop doesn't need dialogs if(!mobile) return; //this is mobile only, desktop doesn't need dialogs
@@ -35,13 +37,17 @@ public abstract class Platform {
Core.input.getTextInput(input); Core.input.getTextInput(input);
}); });
} }
/**Update discord RPC.*/
public void updateRPC(){} /** Update discord RPC. */
/**Whether donating is supported.*/ public void updateRPC(){
}
/** Whether donating is supported. */
public boolean canDonate(){ public boolean canDonate(){
return false; return false;
} }
/**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 = Core.settings.getString("uuid", ""); String uuid = Core.settings.getString("uuid", "");
if(uuid.isEmpty()){ if(uuid.isEmpty()){
@@ -54,25 +60,31 @@ public abstract class Platform {
} }
return uuid; return uuid;
} }
/**Only used for iOS or android: open the share menu for a map or save.*/
public void shareFile(FileHandle file){}
/**Show a file chooser. Desktop only. /** Only used for iOS or android: open the share menu for a map or save. */
* public void shareFile(FileHandle file){
}
/**
* Show a file chooser. Desktop only.
* @param text File chooser title text * @param text File chooser title text
* @param content Description of the type of files to be loaded * @param content Description of the type of files to be loaded
* @param cons Selection listener * @param cons Selection listener
* @param open Whether to open or save files * @param open Whether to open or save files
* @param filetype File extension to filter * @param filetype File extension to filter
*/ */
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, String filetype){} public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, String filetype){
}
/**Hide the app. Android only.*/ /** Hide the app. Android only. */
public void hide(){} public void hide(){
}
/**Forces the app into landscape mode. Currently Android only.*/ /** Forces the app into landscape mode. Currently Android only. */
public void beginForceLandscape(){} public void beginForceLandscape(){
}
/**Stops forcing the app into landscape orientation. Currently Android only.*/ /** Stops forcing the app into landscape orientation. Currently Android only. */
public void endForceLandscape(){} public void endForceLandscape(){
}
} }

View File

@@ -5,37 +5,22 @@ import io.anuke.arc.Core;
import io.anuke.arc.files.FileHandle; import io.anuke.arc.files.FileHandle;
import io.anuke.arc.function.Consumer; import io.anuke.arc.function.Consumer;
import io.anuke.arc.function.Predicate; import io.anuke.arc.function.Predicate;
import io.anuke.arc.graphics.Camera; import io.anuke.arc.graphics.*;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.graphics.Pixmap;
import io.anuke.arc.graphics.PixmapIO;
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.graphics.glutils.FrameBuffer; import io.anuke.arc.graphics.glutils.FrameBuffer;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Rectangle; import io.anuke.arc.math.geom.Rectangle;
import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.math.geom.Vector2;
import io.anuke.arc.util.BufferUtils; import io.anuke.arc.util.*;
import io.anuke.arc.util.ScreenUtils;
import io.anuke.arc.util.Time;
import io.anuke.arc.util.Tmp;
import io.anuke.arc.util.pooling.Pools; import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.EntityDraw;
import io.anuke.mindustry.entities.EntityGroup;
import io.anuke.mindustry.entities.effect.GroundEffectEntity; import io.anuke.mindustry.entities.effect.GroundEffectEntity;
import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect; import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect;
import io.anuke.mindustry.entities.impl.EffectEntity; import io.anuke.mindustry.entities.impl.EffectEntity;
import io.anuke.mindustry.entities.traits.BelowLiquidTrait; import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.entities.traits.DrawTrait; import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.entities.traits.Entity;
import io.anuke.mindustry.entities.type.BaseUnit;
import io.anuke.mindustry.entities.type.Player;
import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.entities.type.Unit;
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.mindustry.world.blocks.defense.ForceProjector.ShieldEntity;
@@ -84,7 +69,7 @@ public class Renderer implements ApplicationListener{
entity.id++; entity.id++;
entity.set(x, y); entity.set(x, y);
if(data instanceof Entity){ if(data instanceof Entity){
entity.setParent((Entity) data); entity.setParent((Entity)data);
} }
effectGroup.add(entity); effectGroup.add(entity);
}else{ }else{
@@ -96,7 +81,7 @@ public class Renderer implements ApplicationListener{
entity.data = data; entity.data = data;
entity.set(x, y); entity.set(x, y);
if(data instanceof Entity){ if(data instanceof Entity){
entity.setParent((Entity) data); entity.setParent((Entity)data);
} }
groundEffectGroup.add(entity); groundEffectGroup.add(entity);
} }
@@ -281,7 +266,7 @@ public class Renderer implements ApplicationListener{
EntityGroup<BaseUnit> group = unitGroups[team.ordinal()]; EntityGroup<BaseUnit> group = unitGroups[team.ordinal()];
if(group.count(p -> p.isFlying() == flying) + if(group.count(p -> p.isFlying() == flying) +
playerGroup.count(p -> p.isFlying() == flying && p.getTeam() == team) == 0 && flying) continue; playerGroup.count(p -> p.isFlying() == flying && p.getTeam() == team) == 0 && flying) continue;
drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawUnder); drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawUnder);
drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team && !p.isDead(), Unit::drawUnder); drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team && !p.isDead(), Unit::drawUnder);
@@ -329,7 +314,7 @@ public class Renderer implements ApplicationListener{
public void takeMapScreenshot(){ public void takeMapScreenshot(){
drawGroundShadows(); drawGroundShadows();
int w = world.width()*tilesize, h = world.height()*tilesize; int w = world.width() * tilesize, h = world.height() * tilesize;
int memory = w * h * 4 / 1024 / 1024; int memory = w * h * 4 / 1024 / 1024;
if(memory >= 65){ if(memory >= 65){
@@ -348,8 +333,8 @@ public class Renderer implements ApplicationListener{
disableUI = true; disableUI = true;
camera.width = w; camera.width = w;
camera.height = h; camera.height = h;
camera.position.x = w/2f + tilesize/2f; camera.position.x = w / 2f + tilesize / 2f;
camera.position.y = h/2f + tilesize/2f; camera.position.y = h / 2f + tilesize / 2f;
Draw.flush(); Draw.flush();
buffer.begin(); buffer.begin();
draw(); draw();
@@ -361,7 +346,7 @@ public class Renderer implements ApplicationListener{
camera.position.set(px, py); camera.position.set(px, py);
buffer.begin(); buffer.begin();
byte[] lines = ScreenUtils.getFrameBufferPixels(0, 0, w, h, true); byte[] lines = ScreenUtils.getFrameBufferPixels(0, 0, w, h, true);
for(int i = 0; i < lines.length; i+= 4){ for(int i = 0; i < lines.length; i += 4){
lines[i + 3] = (byte)255; lines[i + 3] = (byte)255;
} }
buffer.end(); buffer.end();

View File

@@ -1,8 +1,6 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import io.anuke.arc.ApplicationListener; import io.anuke.arc.*;
import io.anuke.arc.Core;
import io.anuke.arc.Events;
import io.anuke.arc.Graphics.Cursor; import io.anuke.arc.Graphics.Cursor;
import io.anuke.arc.Graphics.Cursor.SystemCursor; import io.anuke.arc.Graphics.Cursor.SystemCursor;
import io.anuke.arc.freetype.FreeTypeFontGenerator; import io.anuke.arc.freetype.FreeTypeFontGenerator;
@@ -13,19 +11,13 @@ import io.anuke.arc.graphics.Colors;
import io.anuke.arc.graphics.g2d.BitmapFont; import io.anuke.arc.graphics.g2d.BitmapFont;
import io.anuke.arc.input.KeyCode; import io.anuke.arc.input.KeyCode;
import io.anuke.arc.math.Interpolation; import io.anuke.arc.math.Interpolation;
import io.anuke.arc.scene.Group; import io.anuke.arc.scene.*;
import io.anuke.arc.scene.Scene;
import io.anuke.arc.scene.Skin;
import io.anuke.arc.scene.actions.Actions; import io.anuke.arc.scene.actions.Actions;
import io.anuke.arc.scene.ui.Dialog; import io.anuke.arc.scene.ui.*;
import io.anuke.arc.scene.ui.TextField;
import io.anuke.arc.scene.ui.TextField.TextFieldFilter; 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.Table;
import io.anuke.arc.scene.ui.layout.Unit; import io.anuke.arc.scene.ui.layout.Unit;
import io.anuke.arc.util.Align; import io.anuke.arc.util.*;
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.Pal; import io.anuke.mindustry.graphics.Pal;
@@ -84,21 +76,21 @@ public class UI implements ApplicationListener{
Core.input.addProcessor(Core.scene); Core.input.addProcessor(Core.scene);
Dialog.setShowAction(() -> sequence( Dialog.setShowAction(() -> sequence(
alpha(0f), alpha(0f),
originCenter(), originCenter(),
moveToAligned(Core.graphics.getWidth() / 2f, Core.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),
fadeIn(0.1f, Interpolation.fade) fadeIn(0.1f, Interpolation.fade)
) )
)); ));
Dialog.setHideAction(() -> sequence( Dialog.setHideAction(() -> sequence(
parallel( parallel(
scaleTo(0.01f, 0.01f, 0.1f, Interpolation.fade), scaleTo(0.01f, 0.01f, 0.1f, Interpolation.fade),
fadeOut(0.1f, Interpolation.fade) fadeOut(0.1f, Interpolation.fade)
) )
)); ));
TooltipManager.getInstance().animations = false; TooltipManager.getInstance().animations = false;
@@ -126,11 +118,11 @@ public class UI implements ApplicationListener{
Core.graphics.restoreCursor(); Core.graphics.restoreCursor();
} }
void generateFonts(Skin skin){ void generateFonts(Skin skin){
generator = new FreeTypeFontGenerator(Core.files.internal("fonts/font.ttf")); generator = new FreeTypeFontGenerator(Core.files.internal("fonts/font.ttf"));
FreeTypeFontParameter param = new FreeTypeFontParameter(); FreeTypeFontParameter param = new FreeTypeFontParameter();
param.size = (int)(9*2 * Math.max(Unit.dp.scl(1f), 0.5f)); param.size = (int)(9 * 2 * Math.max(Unit.dp.scl(1f), 0.5f));
param.shadowColor = Color.DARK_GRAY; param.shadowColor = Color.DARK_GRAY;
param.shadowOffsetY = 2; param.shadowOffsetY = 2;
param.incremental = true; param.incremental = true;

View File

@@ -1,20 +1,14 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import io.anuke.annotations.Annotations.Nullable; import io.anuke.annotations.Annotations.Nullable;
import io.anuke.arc.ApplicationListener; import io.anuke.arc.*;
import io.anuke.arc.Core;
import io.anuke.arc.Events;
import io.anuke.arc.collection.Array; import io.anuke.arc.collection.Array;
import io.anuke.arc.collection.IntArray; import io.anuke.arc.collection.IntArray;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Geometry;
import io.anuke.arc.math.geom.Point2; import io.anuke.arc.math.geom.Point2;
import io.anuke.arc.util.Log; import io.anuke.arc.util.*;
import io.anuke.arc.util.Structs; import io.anuke.mindustry.ai.*;
import io.anuke.arc.util.Tmp;
import io.anuke.mindustry.ai.BlockIndexer;
import io.anuke.mindustry.ai.Pathfinder;
import io.anuke.mindustry.ai.WaveSpawner;
import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.EntityQuery; import io.anuke.mindustry.entities.EntityQuery;
@@ -22,16 +16,10 @@ 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;
import io.anuke.mindustry.io.MapIO; import io.anuke.mindustry.io.MapIO;
import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.maps.*;
import io.anuke.mindustry.maps.MapException;
import io.anuke.mindustry.maps.Maps;
import io.anuke.mindustry.maps.generators.Generator; import io.anuke.mindustry.maps.generators.Generator;
import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.type.*;
import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.world.*;
import io.anuke.mindustry.type.Zone;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Pos;
import io.anuke.mindustry.world.Tile;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -97,11 +85,13 @@ public class World implements ApplicationListener{
return tiles == null ? 0 : tiles[0].length; return tiles == null ? 0 : tiles[0].length;
} }
public @Nullable Tile tile(int pos){ public @Nullable
Tile tile(int pos){
return tiles == null ? null : tile(Pos.x(pos), Pos.y(pos)); return tiles == null ? null : tile(Pos.x(pos), Pos.y(pos));
} }
public @Nullable Tile tile(int x, int y){ public @Nullable
Tile tile(int x, int y){
if(tiles == null){ if(tiles == null){
return null; return null;
} }
@@ -113,7 +103,8 @@ public class World implements ApplicationListener{
return tiles[x][y]; return tiles[x][y];
} }
public @Nullable Tile tileWorld(float x, float y){ public @Nullable
Tile tileWorld(float x, float y){
return tile(Math.round(x / tilesize), Math.round(y / tilesize)); return tile(Math.round(x / tilesize), Math.round(y / tilesize));
} }
@@ -161,7 +152,7 @@ public class World implements ApplicationListener{
generating = true; generating = true;
} }
/**Call to signal the beginning of loading the map with a custom set of tiles.*/ /** Call to signal the beginning of loading the map with a custom set of tiles. */
public void beginMapLoad(Tile[][] tiles){ public void beginMapLoad(Tile[][] tiles){
this.tiles = tiles; this.tiles = tiles;
generating = true; generating = true;
@@ -185,7 +176,7 @@ public class World implements ApplicationListener{
addDarkness(tiles); addDarkness(tiles);
EntityQuery.resizeTree(-finalWorldBounds, -finalWorldBounds, tiles.length * tilesize + finalWorldBounds*2, tiles[0].length * tilesize + finalWorldBounds*2); EntityQuery.resizeTree(-finalWorldBounds, -finalWorldBounds, tiles.length * tilesize + finalWorldBounds * 2, tiles[0].length * tilesize + finalWorldBounds * 2);
generating = false; generating = false;
Events.fire(new WorldLoadEvent()); Events.fire(new WorldLoadEvent());
@@ -326,7 +317,7 @@ public class World implements ApplicationListener{
if(!(worldx == tile.x && worldy == tile.y)){ if(!(worldx == tile.x && worldy == tile.y)){
Tile toplace = world.tile(worldx, worldy); Tile toplace = world.tile(worldx, worldy);
if(toplace != null){ if(toplace != null){
toplace.setLinked((byte) (dx + offsetx), (byte) (dy + offsety)); toplace.setLinked((byte)(dx + offsetx), (byte)(dy + offsety));
toplace.setTeam(team); toplace.setTeam(team);
} }
} }
@@ -341,7 +332,7 @@ public class World implements ApplicationListener{
if(!Structs.inBounds(x, y, oldWidth, oldHeight)) return -1; if(!Structs.inBounds(x, y, oldWidth, oldHeight)) return -1;
x += shiftX; x += shiftX;
y += shiftY; y += shiftY;
return y*newWidth + x; return y * newWidth + x;
} }
/** /**
@@ -349,12 +340,11 @@ public class World implements ApplicationListener{
*/ */
public Point2 raycastWorld(float x, float y, float x2, float y2){ public Point2 raycastWorld(float x, float y, float x2, float y2){
return raycast(Math.round(x / tilesize), Math.round(y / tilesize), return raycast(Math.round(x / tilesize), Math.round(y / tilesize),
Math.round(x2 / tilesize), Math.round(y2 / tilesize)); Math.round(x2 / tilesize), Math.round(y2 / tilesize));
} }
/** /**
* Input is in block coordinates, not world coordinates. * Input is in block coordinates, not world coordinates.
*
* @return null if no collisions found, block position otherwise. * @return null if no collisions found, block position otherwise.
*/ */
public Point2 raycast(int x0f, int y0f, int x1, int y1){ public Point2 raycast(int x0f, int y0f, int x1, int y1){
@@ -422,7 +412,7 @@ public class World implements ApplicationListener{
} }
} }
/**Loads raw map tile data into a Tile[][] array, setting up multiblocks, cliffs and ores. */ /** Loads raw map tile data into a Tile[][] array, setting up multiblocks, cliffs and ores. */
void loadTileData(Tile[][] tiles){ void loadTileData(Tile[][] tiles){
prepareTiles(tiles); prepareTiles(tiles);
} }
@@ -471,10 +461,12 @@ public class World implements ApplicationListener{
} }
} }
/**'Prepares' a tile array by:<br> /**
* 'Prepares' a tile array by:<br>
* - setting up multiblocks<br> * - setting up multiblocks<br>
* - updating occlusion<br> * - updating occlusion<br>
* Usually used before placing structures on a tile array.*/ * Usually used before placing structures on a tile array.
*/
public void prepareTiles(Tile[][] tiles){ public void prepareTiles(Tile[][] tiles){
//find multiblocks //find multiblocks
@@ -510,7 +502,7 @@ public class World implements ApplicationListener{
if(!(worldx == x && worldy == y)){ if(!(worldx == x && worldy == y)){
Tile toplace = world.tile(worldx, worldy); Tile toplace = world.tile(worldx, worldy);
if(toplace != null){ if(toplace != null){
toplace.setLinked((byte) (dx + offsetx), (byte) (dy + offsety)); toplace.setLinked((byte)(dx + offsetx), (byte)(dy + offsety));
toplace.setTeam(team); toplace.setTeam(team);
} }
} }

View File

@@ -8,10 +8,7 @@ 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.OreBlock; import io.anuke.mindustry.world.blocks.OreBlock;
import io.anuke.mindustry.world.modules.ConsumeModule; import io.anuke.mindustry.world.modules.*;
import io.anuke.mindustry.world.modules.ItemModule;
import io.anuke.mindustry.world.modules.LiquidModule;
import io.anuke.mindustry.world.modules.PowerModule;
import static io.anuke.mindustry.Vars.ui; import static io.anuke.mindustry.Vars.ui;
@@ -49,7 +46,7 @@ public class EditorTile extends Tile{
@Override @Override
public void setBlock(Block type){ public void setBlock(Block type){
Block previous =wall; Block previous = wall;
if(previous == type) return; if(previous == type) return;
super.setBlock(type); super.setBlock(type);
op(TileOp.get(x, y, (byte)OpType.block.ordinal(), previous.id, type.id)); op(TileOp.get(x, y, (byte)OpType.block.ordinal(), previous.id, type.id));

View File

@@ -7,12 +7,8 @@ import io.anuke.arc.input.KeyCode;
import io.anuke.arc.util.Pack; import io.anuke.arc.util.Pack;
import io.anuke.arc.util.Structs; import io.anuke.arc.util.Structs;
import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.*;
import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.blocks.*;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.BlockPart;
import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.OreBlock;
public enum EditorTool{ public enum EditorTool{
pick{ pick{

View File

@@ -68,7 +68,7 @@ public class MapEditor{
//adds missing blockparts //adds missing blockparts
public void checkLinkedTiles(){ public void checkLinkedTiles(){
//clear block parts first //clear block parts first
for(int x = 0; x < width(); x ++){ for(int x = 0; x < width(); x++){
for(int y = 0; y < height(); y++){ for(int y = 0; y < height(); y++){
if(tiles[x][y].block() == Blocks.part){ if(tiles[x][y].block() == Blocks.part){
tiles[x][y].setBlock(Blocks.air); tiles[x][y].setBlock(Blocks.air);
@@ -78,8 +78,8 @@ public class MapEditor{
} }
//set up missing blockparts //set up missing blockparts
for(int x = 0; x < width(); x ++){ for(int x = 0; x < width(); x++){
for(int y = 0; y < height(); y ++){ for(int y = 0; y < height(); y++){
Block drawBlock = tiles[x][y].block(); Block drawBlock = tiles[x][y].block();
if(drawBlock.isMultiblock()){ if(drawBlock.isMultiblock()){
int offsetx = -(drawBlock.size - 1) / 2; int offsetx = -(drawBlock.size - 1) / 2;
@@ -92,7 +92,7 @@ public class MapEditor{
if(Structs.inBounds(worldx, worldy, width(), height()) && !(dx + offsetx == 0 && dy + offsety == 0)){ if(Structs.inBounds(worldx, worldy, width(), height()) && !(dx + offsetx == 0 && dy + offsety == 0)){
Tile tile = tiles[worldx][worldy]; Tile tile = tiles[worldx][worldy];
tile.setBlock(Blocks.part); tile.setBlock(Blocks.part);
tile.setLinkByte(Pack.byteByte((byte) (dx + offsetx + 8), (byte) (dy + offsety + 8))); tile.setLinkByte(Pack.byteByte((byte)(dx + offsetx + 8), (byte)(dy + offsety + 8)));
} }
} }
} }
@@ -107,7 +107,7 @@ public class MapEditor{
loading = false; loading = false;
} }
/**Creates a 2-D array of EditorTiles with stone as the floor block.*/ /** Creates a 2-D array of EditorTiles with stone as the floor block. */
public Tile[][] createTiles(int width, int height){ public Tile[][] createTiles(int width, int height){
tiles = new Tile[width][height]; tiles = new Tile[width][height];
@@ -179,9 +179,9 @@ public class MapEditor{
boolean isfloor = drawBlock instanceof Floor && drawBlock != Blocks.air; boolean isfloor = drawBlock instanceof Floor && drawBlock != Blocks.air;
if(drawBlock.isMultiblock()){ if(drawBlock.isMultiblock()){
x = Mathf.clamp(x, (drawBlock.size-1)/2, width() - drawBlock.size/2 - 1); x = Mathf.clamp(x, (drawBlock.size - 1) / 2, width() - drawBlock.size / 2 - 1);
y = Mathf.clamp(y, (drawBlock.size-1)/2, height() - drawBlock.size/2 - 1); y = Mathf.clamp(y, (drawBlock.size - 1) / 2, height() - drawBlock.size / 2 - 1);
int offsetx = -(drawBlock.size - 1) / 2; int offsetx = -(drawBlock.size - 1) / 2;
int offsety = -(drawBlock.size - 1) / 2; int offsety = -(drawBlock.size - 1) / 2;
@@ -197,7 +197,7 @@ public class MapEditor{
if(i == 1){ if(i == 1){
tile.setBlock(Blocks.part); tile.setBlock(Blocks.part);
tile.setLinkByte(Pack.byteByte((byte) (dx + offsetx + 8), (byte) (dy + offsety + 8))); tile.setLinkByte(Pack.byteByte((byte)(dx + offsetx + 8), (byte)(dy + offsety + 8)));
}else{ }else{
byte link = tile.getLinkByte(); byte link = tile.getLinkByte();
Block block = tile.block(); Block block = tile.block();
@@ -279,7 +279,7 @@ public class MapEditor{
clearOp(); clearOp();
Tile[][] previous = tiles; Tile[][] previous = tiles;
int offsetX = -(width - width())/2, offsetY = -(height - height())/2; int offsetX = -(width - width()) / 2, offsetY = -(height - height()) / 2;
loading = true; loading = true;
tiles = new Tile[width][height]; tiles = new Tile[width][height];

View File

@@ -85,49 +85,49 @@ public class MapEditorDialog extends Dialog implements Disposable{
t.row(); t.row();
t.addImageTextButton("$editor.import", "icon-load-map", isize, () -> t.addImageTextButton("$editor.import", "icon-load-map", isize, () ->
createDialog("$editor.import", createDialog("$editor.import",
"$editor.importmap", "$editor.importmap.description", "icon-load-map", (Runnable) loadDialog::show, "$editor.importmap", "$editor.importmap.description", "icon-load-map", (Runnable)loadDialog::show,
"$editor.importfile", "$editor.importfile.description", "icon-file", (Runnable) () -> "$editor.importfile", "$editor.importfile.description", "icon-file", (Runnable)() ->
Platform.instance.showFileChooser("$editor.loadmap", "Map Files", file -> ui.loadAnd(() -> { Platform.instance.showFileChooser("$editor.loadmap", "Map Files", file -> ui.loadAnd(() -> {
try{ try{
//TODO what if it's an image? users should be warned for their stupidity //TODO what if it's an image? users should be warned for their stupidity
editor.beginEdit(MapIO.readMap(file, true)); editor.beginEdit(MapIO.readMap(file, true));
}catch(Exception e){ }catch(Exception e){
ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, false))); ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, false)));
Log.err(e); Log.err(e);
} }
}), true, mapExtension), }), true, mapExtension),
"$editor.importimage", "$editor.importimage.description", "icon-file-image", (Runnable)() -> "$editor.importimage", "$editor.importimage.description", "icon-file-image", (Runnable)() ->
Platform.instance.showFileChooser("$loadimage", "Image Files", file -> Platform.instance.showFileChooser("$loadimage", "Image Files", file ->
ui.loadAnd(() -> { ui.loadAnd(() -> {
try{ try{
Pixmap pixmap = new Pixmap(file); Pixmap pixmap = new Pixmap(file);
Tile[][] tiles = editor.createTiles(pixmap.getWidth(), pixmap.getHeight()); Tile[][] tiles = editor.createTiles(pixmap.getWidth(), pixmap.getHeight());
editor.load(() -> MapIO.readLegacyPixmap(pixmap, tiles)); editor.load(() -> MapIO.readLegacyPixmap(pixmap, tiles));
editor.beginEdit(tiles); editor.beginEdit(tiles);
}catch (Exception e){ }catch(Exception e){
ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, false))); ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, false)));
Log.err(e); Log.err(e);
} }
}), true, "png"))); }), true, "png")));
t.addImageTextButton("$editor.export", "icon-save-map", isize, () -> t.addImageTextButton("$editor.export", "icon-save-map", isize, () ->
Platform.instance.showFileChooser("$editor.savemap", "Map Files", file -> { Platform.instance.showFileChooser("$editor.savemap", "Map Files", file -> {
file = file.parent().child(file.nameWithoutExtension() + "." + mapExtension); file = file.parent().child(file.nameWithoutExtension() + "." + mapExtension);
FileHandle result = file; FileHandle result = file;
ui.loadAnd(() -> { ui.loadAnd(() -> {
try{ try{
if(!editor.getTags().containsKey("name")){ if(!editor.getTags().containsKey("name")){
editor.getTags().put("name", result.nameWithoutExtension()); editor.getTags().put("name", result.nameWithoutExtension());
} }
MapIO.writeMap(result, editor.createMap(result), editor.tiles()); MapIO.writeMap(result, editor.createMap(result), editor.tiles());
}catch(Exception e){ }catch(Exception e){
ui.showError(Core.bundle.format("editor.errorsave", Strings.parseException(e, false))); ui.showError(Core.bundle.format("editor.errorsave", Strings.parseException(e, false)));
Log.err(e); Log.err(e);
} }
}); });
}, false, mapExtension)); }, false, mapExtension));
}); });
menu.cont.row(); menu.cont.row();
@@ -146,14 +146,14 @@ public class MapEditorDialog extends Dialog implements Disposable{
}); });
loadDialog = new MapLoadDialog(map -> loadDialog = new MapLoadDialog(map ->
ui.loadAnd(() -> { ui.loadAnd(() -> {
try{ try{
editor.beginEdit(map); editor.beginEdit(map);
}catch(Exception e){ }catch(Exception e){
ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, false))); ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, false)));
Log.err(e); Log.err(e);
} }
})); }));
setFillParent(true); setFillParent(true);
@@ -239,10 +239,10 @@ public class MapEditorDialog extends Dialog implements Disposable{
dialog.cont.defaults().size(360f, h).padBottom(5).padRight(5).padLeft(5); dialog.cont.defaults().size(360f, h).padBottom(5).padRight(5).padLeft(5);
for(int i = 0; i < arguments.length; i += 4){ for(int i = 0; i < arguments.length; i += 4){
String name = (String) arguments[i]; String name = (String)arguments[i];
String description = (String) arguments[i + 1]; String description = (String)arguments[i + 1];
String iconname = (String) arguments[i + 2]; String iconname = (String)arguments[i + 2];
Runnable listenable = (Runnable) arguments[i + 3]; Runnable listenable = (Runnable)arguments[i + 3];
TextButton button = dialog.cont.addButton(name, () -> { TextButton button = dialog.cont.addButton(name, () -> {
listenable.run(); listenable.run();
@@ -306,8 +306,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(Core.graphics.getHeight(), Core.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(Core.graphics.getDisplayMode().height / amount, baseSize); Math.min(Core.graphics.getDisplayMode().height / amount, baseSize);
clearChildren(); clearChildren();
table(cont -> { table(cont -> {
@@ -374,7 +374,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
tools.row(); tools.row();
tools.table("underline", t -> t.add("$editor.teams")) tools.table("underline", t -> t.add("$editor.teams"))
.colspan(3).height(40).width(size * 3f + 3f).padBottom(3); .colspan(3).height(40).width(size * 3f + 3f).padBottom(3);
tools.row(); tools.row();
@@ -401,7 +401,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
mid.table("underline", t -> { mid.table("underline", t -> {
Slider slider = new Slider(0, MapEditor.brushSizes.length - 1, 1, false); Slider slider = new Slider(0, MapEditor.brushSizes.length - 1, 1, false);
slider.moved(f -> editor.brushSize = MapEditor.brushSizes[(int) (float) f]); slider.moved(f -> editor.brushSize = MapEditor.brushSizes[(int)(float)f]);
t.top(); t.top();
t.add("$editor.brush"); t.add("$editor.brush");

View File

@@ -62,7 +62,7 @@ public class MapGenerateDialog extends FloatingDialog{
update(); update();
}).size(160f, 64f); }).size(160f, 64f);
buttons.addImageTextButton("$add", "icon-add", 14*2, this::showAdd).height(64f).width(140f); buttons.addImageTextButton("$add", "icon-add", 14 * 2, this::showAdd).height(64f).width(140f);
} }
void setup(){ void setup(){
@@ -120,24 +120,24 @@ public class MapGenerateDialog extends FloatingDialog{
t.table(b -> { t.table(b -> {
b.left(); b.left();
b.defaults().size(50f); b.defaults().size(50f);
b.addImageButton("icon-refresh", 14*2, () -> { b.addImageButton("icon-refresh", 14 * 2, () -> {
filter.randomize(); filter.randomize();
update(); update();
}); });
b.addImageButton("icon-arrow-up", 10*2, () -> { b.addImageButton("icon-arrow-up", 10 * 2, () -> {
int idx = filters.indexOf(filter); int idx = filters.indexOf(filter);
filters.swap(idx, Math.max(0, idx - 1)); filters.swap(idx, Math.max(0, idx - 1));
rebuildFilters(); rebuildFilters();
update(); update();
}); });
b.addImageButton("icon-arrow-down", 10*2, () -> { b.addImageButton("icon-arrow-down", 10 * 2, () -> {
int idx = filters.indexOf(filter); int idx = filters.indexOf(filter);
filters.swap(idx, Math.min(filters.size-1, idx + 1)); filters.swap(idx, Math.min(filters.size - 1, idx + 1));
rebuildFilters(); rebuildFilters();
update(); update();
}); });
b.addImageButton("icon-trash", 14*2, () -> { b.addImageButton("icon-trash", 14 * 2, () -> {
filters.remove(filter); filters.remove(filter);
rebuildFilters(); rebuildFilters();
update(); update();

View File

@@ -1,14 +1,12 @@
package io.anuke.mindustry.editor; package io.anuke.mindustry.editor;
import io.anuke.arc.function.Consumer;
import io.anuke.arc.scene.ui.*;
import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.arc.util.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.arc.function.Consumer;
import io.anuke.arc.scene.ui.ButtonGroup;
import io.anuke.arc.scene.ui.ScrollPane;
import io.anuke.arc.scene.ui.TextButton;
import io.anuke.arc.scene.ui.layout.Table;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;

View File

@@ -40,7 +40,7 @@ public class MapRenderer implements Disposable{
} }
} }
chunks = new IndexedRenderer[(int) Math.ceil((float) width / chunksize)][(int) Math.ceil((float) height / chunksize)]; chunks = new IndexedRenderer[(int)Math.ceil((float)width / chunksize)][(int)Math.ceil((float)height / chunksize)];
for(int x = 0; x < chunks.length; x++){ for(int x = 0; x < chunks.length; x++){
for(int y = 0; y < chunks[0].length; y++){ for(int y = 0; y < chunks[0].length; y++){
@@ -115,38 +115,38 @@ public class MapRenderer implements Disposable{
if(wall.rotate){ if(wall.rotate){
mesh.draw(idxWall, region, mesh.draw(idxWall, region,
wx * tilesize + wall.offset(), wy * tilesize + wall.offset(), wx * tilesize + wall.offset(), wy * tilesize + wall.offset(),
region.getWidth() * Draw.scl, region.getHeight() * Draw.scl, tile.getRotation() * 90 - 90); region.getWidth() * Draw.scl, region.getHeight() * Draw.scl, tile.getRotation() * 90 - 90);
}else{ }else{
mesh.draw(idxWall, region, mesh.draw(idxWall, region,
wx * tilesize + wall.offset() + (tilesize - region.getWidth() * Draw.scl)/2f, wx * tilesize + wall.offset() + (tilesize - region.getWidth() * Draw.scl) / 2f,
wy * tilesize + wall.offset() + (tilesize - region.getHeight() * Draw.scl)/2f, wy * tilesize + wall.offset() + (tilesize - region.getHeight() * Draw.scl) / 2f,
region.getWidth() * Draw.scl, region.getHeight() * Draw.scl); region.getWidth() * Draw.scl, region.getHeight() * Draw.scl);
} }
}else{ }else{
region = floor.editorVariantRegions()[Mathf.randomSeed(idxWall, 0, floor.editorVariantRegions().length-1)]; region = floor.editorVariantRegions()[Mathf.randomSeed(idxWall, 0, floor.editorVariantRegions().length - 1)];
mesh.draw(idxWall, region, wx * tilesize, wy * tilesize, 8, 8); mesh.draw(idxWall, region, wx * tilesize, wy * tilesize, 8, 8);
} }
float offsetX = -(wall.size/3)*tilesize, offsetY = -(wall.size/3) * tilesize; float offsetX = -(wall.size / 3) * tilesize, offsetY = -(wall.size / 3) * tilesize;
if(wall.update || wall.destructible){ if(wall.update || wall.destructible){
mesh.setColor(team.color); mesh.setColor(team.color);
region = Core.atlas.find("block-border-editor"); region = Core.atlas.find("block-border-editor");
}else if(!wall.synthetic() && wall != Blocks.air){ }else if(!wall.synthetic() && wall != Blocks.air){
region = !Core.atlas.isFound(wall.editorIcon()) ? Core.atlas.find("clear-editor") : wall.editorIcon(); region = !Core.atlas.isFound(wall.editorIcon()) ? Core.atlas.find("clear-editor") : wall.editorIcon();
offsetX = tilesize/2f - region.getWidth()/2f * Draw.scl; offsetX = tilesize / 2f - region.getWidth() / 2f * Draw.scl;
offsetY = tilesize/2f - region.getHeight()/2f * Draw.scl; offsetY = tilesize / 2f - region.getHeight() / 2f * Draw.scl;
}else if(wall == Blocks.air && tile.ore() != null){ }else if(wall == Blocks.air && tile.ore() != null){
region = tile.ore().editorVariantRegions()[Mathf.randomSeed(idxWall, 0, tile.ore().editorVariantRegions().length-1)]; region = tile.ore().editorVariantRegions()[Mathf.randomSeed(idxWall, 0, tile.ore().editorVariantRegions().length - 1)];
}else{ }else{
region = Core.atlas.find("clear-editor"); region = Core.atlas.find("clear-editor");
} }
mesh.draw(idxDecal, region, mesh.draw(idxDecal, region,
wx * tilesize + offsetX, wy * tilesize + offsetY, wx * tilesize + offsetX, wy * tilesize + offsetY,
region.getWidth() * Draw.scl, region.getHeight() * Draw.scl); region.getWidth() * Draw.scl, region.getHeight() * Draw.scl);
mesh.setColor(Color.WHITE); mesh.setColor(Color.WHITE);
} }

View File

@@ -1,11 +1,11 @@
package io.anuke.mindustry.editor; package io.anuke.mindustry.editor;
import io.anuke.mindustry.core.Platform;
import io.anuke.mindustry.maps.Map;
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import io.anuke.arc.function.Consumer; import io.anuke.arc.function.Consumer;
import io.anuke.arc.scene.ui.TextButton; import io.anuke.arc.scene.ui.TextButton;
import io.anuke.arc.scene.ui.TextField; import io.anuke.arc.scene.ui.TextField;
import io.anuke.mindustry.core.Platform;
import io.anuke.mindustry.maps.Map;
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
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;

View File

@@ -3,18 +3,14 @@ package io.anuke.mindustry.editor;
import io.anuke.arc.Core; import io.anuke.arc.Core;
import io.anuke.arc.collection.Array; import io.anuke.arc.collection.Array;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.graphics.g2d.Lines;
import io.anuke.arc.graphics.g2d.ScissorStack;
import io.anuke.arc.input.GestureDetector; import io.anuke.arc.input.GestureDetector;
import io.anuke.arc.input.GestureDetector.GestureListener; import io.anuke.arc.input.GestureDetector.GestureListener;
import io.anuke.arc.input.KeyCode; import io.anuke.arc.input.KeyCode;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.*; import io.anuke.arc.math.geom.*;
import io.anuke.arc.scene.Element; import io.anuke.arc.scene.Element;
import io.anuke.arc.scene.event.InputEvent; import io.anuke.arc.scene.event.*;
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.TextField;
import io.anuke.arc.scene.ui.layout.Unit; import io.anuke.arc.scene.ui.layout.Unit;
import io.anuke.arc.util.Tmp; import io.anuke.arc.util.Tmp;
@@ -69,6 +65,7 @@ public class MapView extends Element implements GestureListener{
return false; return false;
} }
@Override @Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){ public boolean touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){
if(pointer != 0){ if(pointer != 0){
@@ -196,7 +193,7 @@ 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) &&
!Core.input.keyDown(KeyCode.CONTROL_LEFT)){ !Core.input.keyDown(KeyCode.CONTROL_LEFT)){
float ax = Core.input.axis(Binding.move_x); float ax = Core.input.axis(Binding.move_x);
float ay = Core.input.axis(Binding.move_y); float ay = Core.input.axis(Binding.move_y);
offsetx -= ax * 15f / zoom; offsetx -= ax * 15f / zoom;
@@ -224,7 +221,7 @@ public class MapView extends Element implements GestureListener{
} }
private Point2 project(float x, float y){ private Point2 project(float x, float y){
float ratio = 1f / ((float) editor.width() / editor.height()); float ratio = 1f / ((float)editor.width() / editor.height());
float size = Math.min(width, height); float size = Math.min(width, height);
float sclwidth = size * zoom; float sclwidth = size * zoom;
float sclheight = size * zoom * ratio; float sclheight = size * zoom * ratio;
@@ -232,26 +229,26 @@ public class MapView extends Element implements GestureListener{
y = (y - getHeight() / 2 + sclheight / 2 - offsety * zoom) / sclheight * editor.height(); y = (y - getHeight() / 2 + sclheight / 2 - offsety * zoom) / sclheight * editor.height();
if(editor.drawBlock.size % 2 == 0 && tool != EditorTool.eraser){ if(editor.drawBlock.size % 2 == 0 && tool != EditorTool.eraser){
return Tmp.g1.set((int) (x - 0.5f), (int) (y - 0.5f)); return Tmp.g1.set((int)(x - 0.5f), (int)(y - 0.5f));
}else{ }else{
return Tmp.g1.set((int) x, (int) y); return Tmp.g1.set((int)x, (int)y);
} }
} }
private Vector2 unproject(int x, int y){ private Vector2 unproject(int x, int y){
float ratio = 1f / ((float) editor.width() / editor.height()); float ratio = 1f / ((float)editor.width() / editor.height());
float size = Math.min(width, height); float size = Math.min(width, height);
float sclwidth = size * zoom; float sclwidth = size * zoom;
float sclheight = size * zoom * ratio; float sclheight = size * zoom * ratio;
float px = ((float) x / editor.width()) * sclwidth + offsetx * zoom - sclwidth / 2 + getWidth() / 2; float px = ((float)x / editor.width()) * sclwidth + offsetx * zoom - sclwidth / 2 + getWidth() / 2;
float py = ((float) (y) / editor.height()) * sclheight float py = ((float)(y) / editor.height()) * sclheight
+ offsety * zoom - sclheight / 2 + getHeight() / 2; + offsety * zoom - sclheight / 2 + getHeight() / 2;
return vec.set(px, py); return vec.set(px, py);
} }
@Override @Override
public void draw(){ public void draw(){
float ratio = 1f / ((float) editor.width() / editor.height()); float ratio = 1f / ((float)editor.width() / editor.height());
float size = Math.min(width, height); float size = Math.min(width, height);
float sclwidth = size * zoom; float sclwidth = size * zoom;
float sclheight = size * zoom * ratio; float sclheight = size * zoom * ratio;
@@ -317,9 +314,9 @@ public class MapView extends Element implements GestureListener{
Vector2 v = unproject(p.x, p.y).add(x, y); Vector2 v = unproject(p.x, p.y).add(x, y);
float offset = (editor.drawBlock.size % 2 == 0 ? scaling / 2f : 0f); float offset = (editor.drawBlock.size % 2 == 0 ? scaling / 2f : 0f);
Lines.square( Lines.square(
v.x + scaling / 2f + offset, v.x + scaling / 2f + offset,
v.y + scaling / 2f + offset, v.y + scaling / 2f + offset,
scaling * editor.drawBlock.size / 2f); scaling * editor.drawBlock.size / 2f);
} }
} }
@@ -334,9 +331,9 @@ public class MapView extends Element implements GestureListener{
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(Core.input.mouse().x, Core.input.mouse().y, true) == this; Core.scene.hit(Core.input.mouse().x, Core.input.mouse().y, true) == this;
} }
@Override @Override

View File

@@ -7,9 +7,7 @@ import io.anuke.arc.input.KeyCode;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.scene.ui.TextField.TextFieldFilter; import io.anuke.arc.scene.ui.TextField.TextFieldFilter;
import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.arc.util.Align; import io.anuke.arc.util.*;
import io.anuke.arc.util.Strings;
import io.anuke.arc.util.Time;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.content.StatusEffects; import io.anuke.mindustry.content.StatusEffects;
import io.anuke.mindustry.content.UnitTypes; import io.anuke.mindustry.content.UnitTypes;
@@ -47,7 +45,7 @@ public class WaveInfoDialog extends FloatingDialog{
}); });
keyDown(key -> { keyDown(key -> {
if(key == KeyCode.ESCAPE || key == KeyCode.BACK) { if(key == KeyCode.ESCAPE || key == KeyCode.BACK){
Core.app.post(this::hide); Core.app.post(this::hide);
} }
}); });
@@ -74,7 +72,7 @@ public class WaveInfoDialog extends FloatingDialog{
dialog.hide(); dialog.hide();
}).disabled(b -> Core.app.getClipboard().getContents() == null || Core.app.getClipboard().getContents().isEmpty()); }).disabled(b -> Core.app.getClipboard().getContents() == null || Core.app.getClipboard().getContents().isEmpty());
dialog.cont.row(); dialog.cont.row();
dialog.cont.addButton("$settings.reset", () -> ui.showConfirm("$confirm", "$settings.clear.confirm", () ->{ dialog.cont.addButton("$settings.reset", () -> ui.showConfirm("$confirm", "$settings.clear.confirm", () -> {
groups = null; groups = null;
buildGroups(); buildGroups();
dialog.hide(); dialog.hide();
@@ -100,7 +98,8 @@ public class WaveInfoDialog extends FloatingDialog{
cont.table("clear", m -> { cont.table("clear", m -> {
m.add("$waves.preview").color(Color.LIGHT_GRAY).growX().center().get().setAlignment(Align.center, Align.center); m.add("$waves.preview").color(Color.LIGHT_GRAY).growX().center().get().setAlignment(Align.center, Align.center);
m.row(); m.row();
m.addButton("-", () -> {}).update(t -> { m.addButton("-", () -> {
}).update(t -> {
if(t.getClickListener().isPressed()){ if(t.getClickListener().isPressed()){
updateTimer += Time.delta(); updateTimer += Time.delta();
if(updateTimer >= updatePeriod){ if(updateTimer >= updatePeriod){
@@ -113,11 +112,12 @@ public class WaveInfoDialog extends FloatingDialog{
m.row(); m.row();
m.pane(t -> preview = t).grow().get().setScrollingDisabled(true, false); m.pane(t -> preview = t).grow().get().setScrollingDisabled(true, false);
m.row(); m.row();
m.addButton("+", () -> {}).update(t -> { m.addButton("+", () -> {
}).update(t -> {
if(t.getClickListener().isPressed()){ if(t.getClickListener().isPressed()){
updateTimer += Time.delta(); updateTimer += Time.delta();
if(updateTimer >= updatePeriod){ if(updateTimer >= updatePeriod){
start ++; start++;
updateTimer = 0f; updateTimer = 0f;
updateWaves(); updateWaves();
} }
@@ -146,10 +146,10 @@ public class WaveInfoDialog extends FloatingDialog{
t.row(); t.row();
t.table(spawns -> { t.table(spawns -> {
spawns.addField("" + (group.begin + 1), TextFieldFilter.digitsOnly, text -> { spawns.addField("" + (group.begin + 1), TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePostiveInt(text)){ if(Strings.canParsePostiveInt(text)){
group.begin = Strings.parseInt(text) - 1; group.begin = Strings.parseInt(text) - 1;
updateWaves(); updateWaves();
} }
}).width(100f); }).width(100f);
spawns.add("$waves.to").padLeft(4).padRight(4); spawns.add("$waves.to").padLeft(4).padRight(4);
spawns.addField(group.end == never ? "" : (group.end + 1) + "", TextFieldFilter.digitsOnly, text -> { spawns.addField(group.end == never ? "" : (group.end + 1) + "", TextFieldFilter.digitsOnly, text -> {
@@ -184,7 +184,7 @@ public class WaveInfoDialog extends FloatingDialog{
}).width(80f); }).width(80f);
a.add(" + "); a.add(" + ");
a.addField(Strings.fixed(Math.max((Mathf.isZero(group.unitScaling) ? 0 : 1f/group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> { a.addField(Strings.fixed(Math.max((Mathf.isZero(group.unitScaling) ? 0 : 1f / group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> {
if(Strings.canParsePositiveFloat(text)){ if(Strings.canParsePositiveFloat(text)){
group.unitScaling = 1f / Strings.parseFloat(text); group.unitScaling = 1f / Strings.parseFloat(text);
updateWaves(); updateWaves();
@@ -228,7 +228,7 @@ public class WaveInfoDialog extends FloatingDialog{
dialog.hide(); dialog.hide();
buildGroups(); buildGroups();
}).pad(2).margin(12f).fillX(); }).pad(2).margin(12f).fillX();
if(++i % 3 == 0)dialog.cont.row(); if(++i % 3 == 0) dialog.cont.row();
} }
dialog.show(); dialog.show();
} }
@@ -239,10 +239,10 @@ public class WaveInfoDialog extends FloatingDialog{
Array<SpawnGroup> groups = (this.groups == null ? DefaultWaves.get() : this.groups); Array<SpawnGroup> groups = (this.groups == null ? DefaultWaves.get() : this.groups);
for(int i = start; i < displayed + start; i ++){ for(int i = start; i < displayed + start; i++){
int wave = i; int wave = i;
preview.table("underline", table -> { preview.table("underline", table -> {
table.add((wave+1) + "").color(Pal.accent).center().colspan(2).get().setAlignment(Align.center, Align.center); table.add((wave + 1) + "").color(Pal.accent).center().colspan(2).get().setAlignment(Align.center, Align.center);
table.row(); table.row();
int[] spawned = new int[Vars.content.getBy(ContentType.unit).size]; int[] spawned = new int[Vars.content.getBy(ContentType.unit).size];

View File

@@ -11,14 +11,14 @@ public class DistortFilter extends GenerateFilter{
{ {
options( options(
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 400f), new SliderOption("scale", () -> scl, f -> scl = f, 1f, 400f),
new SliderOption("mag", () -> mag, f -> mag = f, 0.5f, 100f) new SliderOption("mag", () -> mag, f -> mag = f, 0.5f, 100f)
); );
} }
@Override @Override
public void apply(){ public void apply(){
DummyTile tile = in.tile(in.x / (in.scaling) + (noise(in.x, in.y, scl, mag)-mag/2f)/in.scaling, in.y / (in.scaling) + (noise(in.x, in.y+o, scl, mag)-mag/2f)/in.scaling); DummyTile tile = in.tile(in.x / (in.scaling) + (noise(in.x, in.y, scl, mag) - mag / 2f) / in.scaling, in.y / (in.scaling) + (noise(in.x, in.y + o, scl, mag) - mag / 2f) / in.scaling);
in.floor = content.block(tile.floor); in.floor = content.block(tile.floor);
if(!content.block(tile.block).synthetic() && !in.block.synthetic()) in.block = content.block(tile.block); if(!content.block(tile.block).synthetic() && !in.block.synthetic()) in.block = content.block(tile.block);

View File

@@ -20,7 +20,9 @@ public abstract class FilterOption{
public static final Predicate<Block> oresOnly = b -> b instanceof OreBlock && Core.atlas.isFound(b.icon(Icon.full)); public static final Predicate<Block> oresOnly = b -> b instanceof OreBlock && Core.atlas.isFound(b.icon(Icon.full));
public abstract void build(Table table); public abstract void build(Table table);
public Runnable changed = () -> {};
public Runnable changed = () -> {
};
static class SliderOption extends FilterOption{ static class SliderOption extends FilterOption{
final String name; final String name;
@@ -40,7 +42,7 @@ public abstract class FilterOption{
public void build(Table table){ public void build(Table table){
table.add("$filter.option." + name); table.add("$filter.option." + name);
table.row(); table.row();
Slider slider = table.addSlider(min, max, (max-min)/200f, setter).growX().get(); Slider slider = table.addSlider(min, max, (max - min) / 200f, setter).growX().get();
slider.setValue(getter.get()); slider.setValue(getter.get());
if(updateEditorOnChange){ if(updateEditorOnChange){
slider.changed(changed); slider.changed(changed);
@@ -65,14 +67,14 @@ public abstract class FilterOption{
@Override @Override
public void build(Table table){ public void build(Table table){
table.addButton(b -> b.addImage(supplier.get().icon(Icon.small)).update(i -> ((TextureRegionDrawable)i.getDrawable()).setRegion(supplier.get().icon(Icon.small))).size(8*3), () -> { table.addButton(b -> b.addImage(supplier.get().icon(Icon.small)).update(i -> ((TextureRegionDrawable)i.getDrawable()).setRegion(supplier.get().icon(Icon.small))).size(8 * 3), () -> {
FloatingDialog dialog = new FloatingDialog(""); FloatingDialog dialog = new FloatingDialog("");
dialog.setFillParent(false); dialog.setFillParent(false);
int i = 0; int i = 0;
for(Block block : Vars.content.blocks()){ for(Block block : Vars.content.blocks()){
if(!filter.test(block)) continue; if(!filter.test(block)) continue;
dialog.cont.addImage(block.icon(Icon.medium)).size(8*4).pad(3).get().clicked(() -> { dialog.cont.addImage(block.icon(Icon.medium)).size(8 * 4).pad(3).get().clicked(() -> {
consumer.accept(block); consumer.accept(block);
dialog.hide(); dialog.hide();
changed.run(); changed.run();

View File

@@ -11,7 +11,7 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.Floor;
public abstract class GenerateFilter{ public abstract class GenerateFilter{
protected float o = (float)(Math.random()*10000000.0); protected float o = (float)(Math.random() * 10000000.0);
protected long seed; protected long seed;
protected GenerateInput in; protected GenerateInput in;
@@ -20,15 +20,15 @@ public abstract class GenerateFilter{
protected abstract void apply(); protected abstract void apply();
protected float noise(float x, float y, float scl, float mag){ protected float noise(float x, float y, float scl, float mag){
return (float)in.noise.octaveNoise2D(1f, 0f, 1f/scl, x + o, y + o)*mag; return (float)in.noise.octaveNoise2D(1f, 0f, 1f / scl, x + o, y + o) * mag;
} }
protected float noise(float x, float y, float scl, float mag, float octaves, float persistence){ protected float noise(float x, float y, float scl, float mag, float octaves, float persistence){
return (float)in.noise.octaveNoise2D(octaves, persistence, 1f/scl, x + o, y + o)*mag; return (float)in.noise.octaveNoise2D(octaves, persistence, 1f / scl, x + o, y + o) * mag;
} }
protected float rnoise(float x, float y, float scl, float mag){ protected float rnoise(float x, float y, float scl, float mag){
return in.pnoise.getValue((int)(x + o), (int)(y + o), 1f/scl)*mag; return in.pnoise.getValue((int)(x + o), (int)(y + o), 1f / scl) * mag;
} }
public void randomize(){ public void randomize(){

View File

@@ -14,12 +14,12 @@ public class NoiseFilter extends GenerateFilter{
{ {
options( options(
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f), new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f),
new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f), new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f),
new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f), new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f),
new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f), new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly), new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly),
new BlockOption("wall", () -> block, b -> block = b, wallsOnly) new BlockOption("wall", () -> block, b -> block = b, wallsOnly)
); );
} }

View File

@@ -4,7 +4,8 @@ import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.editor.generation.FilterOption.SliderOption; import io.anuke.mindustry.editor.generation.FilterOption.SliderOption;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import static io.anuke.mindustry.editor.generation.FilterOption.*; import static io.anuke.mindustry.editor.generation.FilterOption.BlockOption;
import static io.anuke.mindustry.editor.generation.FilterOption.oresOnly;
public class OreFilter extends GenerateFilter{ public class OreFilter extends GenerateFilter{
float scl = 40, threshold = 0.8f, octaves = 3f, falloff = 0.5f; float scl = 40, threshold = 0.8f, octaves = 3f, falloff = 0.5f;
@@ -12,11 +13,11 @@ public class OreFilter extends GenerateFilter{
{ {
options( options(
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f), new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f),
new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f), new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f),
new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f), new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f),
new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f), new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f),
new BlockOption("ore", () -> ore, b -> ore = b, oresOnly) new BlockOption("ore", () -> ore, b -> ore = b, oresOnly)
); );
} }

View File

@@ -14,12 +14,12 @@ public class RiverNoiseFilter extends GenerateFilter{
{ {
options( options(
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f), new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f),
new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f), new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f),
new SliderOption("threshold2", () -> threshold2, f -> threshold2 = f, 0f, 1f), new SliderOption("threshold2", () -> threshold2, f -> threshold2 = f, 0f, 1f),
new BlockOption("block", () -> block, b -> block = b, wallsOnly), new BlockOption("block", () -> block, b -> block = b, wallsOnly),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly), new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly),
new BlockOption("floor2", () -> floor2, b -> floor2 = b, floorsOnly) new BlockOption("floor2", () -> floor2, b -> floor2 = b, floorsOnly)
); );
} }

View File

@@ -14,16 +14,16 @@ public class ScatterFilter extends GenerateFilter{
{ {
options( options(
new SliderOption("chance", () -> chance, f -> chance = f, 0f, 1f), new SliderOption("chance", () -> chance, f -> chance = f, 0f, 1f),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly), new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly),
new BlockOption("block", () -> block, b -> block = b, wallsOnly) new BlockOption("block", () -> block, b -> block = b, wallsOnly)
); );
} }
@Override @Override
public void apply(){ public void apply(){
if(in.srcfloor == floor && in.srcblock == Blocks.air && chance() <= chance){ if(in.srcfloor == floor && in.srcblock == Blocks.air && chance() <= chance){
in.block = block; in.block = block;
} }
} }

View File

@@ -15,20 +15,20 @@ public class TerrainFilter extends GenerateFilter{
{ {
options( options(
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f), new SliderOption("scale", () -> scl, f -> scl = f, 1f, 500f),
new SliderOption("mag", () -> magnitude, f -> magnitude = f, 0f, 2f), new SliderOption("mag", () -> magnitude, f -> magnitude = f, 0f, 2f),
new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f), new SliderOption("threshold", () -> threshold, f -> threshold = f, 0f, 1f),
new SliderOption("circle-scale", () -> circleScl, f -> circleScl = f, 0f, 3f), new SliderOption("circle-scale", () -> circleScl, f -> circleScl = f, 0f, 3f),
new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f), new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f),
new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f), new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly), new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly),
new BlockOption("wall", () -> block, b -> block = b, wallsOnly) new BlockOption("wall", () -> block, b -> block = b, wallsOnly)
); );
} }
@Override @Override
public void apply(){ public void apply(){
float noise = noise(in.x, in.y, scl, magnitude, octaves, falloff) + Mathf.dst((float) in.x / in.editor.width(), (float) in.y / in.editor.height(), 0.5f, 0.5f) * circleScl; float noise = noise(in.x, in.y, scl, magnitude, octaves, falloff) + Mathf.dst((float)in.x / in.editor.width(), (float)in.y / in.editor.height(), 0.5f, 0.5f) * circleScl;
in.floor = floor; in.floor = floor;
in.ore = Blocks.air; in.ore = Blocks.air;

View File

@@ -7,10 +7,7 @@ import io.anuke.arc.function.Consumer;
import io.anuke.arc.function.Predicate; import io.anuke.arc.function.Predicate;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.*;
import io.anuke.arc.math.geom.Point2;
import io.anuke.arc.math.geom.Rectangle;
import io.anuke.arc.math.geom.Vector2;
import io.anuke.arc.util.Time; import io.anuke.arc.util.Time;
import io.anuke.mindustry.content.Bullets; import io.anuke.mindustry.content.Bullets;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
@@ -27,7 +24,7 @@ import io.anuke.mindustry.world.Tile;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
/**Utility class for damaging in an area.*/ /** Utility class for damaging in an area. */
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();
@@ -35,19 +32,19 @@ public class Damage{
private static GridBits bits = new GridBits(30, 30); private static GridBits bits = new GridBits(30, 30);
private static IntQueue propagation = new IntQueue(); private static IntQueue propagation = new IntQueue();
/**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);
Time.run(i * 2f + Mathf.random(4f), () -> Lightning.create(Team.none, Pal.power, 3, Time.run(i * 2f + Mathf.random(4f), () -> Lightning.create(Team.none, Pal.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++){
Time.run(i / 2f, () -> Call.createBullet(Bullets.fireball, x, y, Mathf.random(360f))); Time.run(i / 2f, () -> Call.createBullet(Bullets.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;
@@ -67,7 +64,7 @@ public class Damage{
float shake = Math.min(explosiveness / 4f + 3f, 9f); float shake = Math.min(explosiveness / 4f + 3f, 9f);
Effects.shake(shake, shake, x, y); Effects.shake(shake, shake, x, y);
Effects.effect(Fx.dynamicExplosion, x, y, radius/8f); Effects.effect(Fx.dynamicExplosion, x, y, radius / 8f);
} }
public static void createIncend(float x, float y, float range, int amount){ public static void createIncend(float x, float y, float range, int amount){
@@ -136,7 +133,7 @@ public class Damage{
Units.getNearbyEnemies(team, rect, cons); Units.getNearbyEnemies(team, rect, cons);
} }
/**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 damageUnits(Team team, float x, float y, float size, float damage, Predicate<io.anuke.mindustry.entities.type.Unit> predicate, Consumer<io.anuke.mindustry.entities.type.Unit> acceptor){ public static void damageUnits(Team team, float x, float y, float size, float damage, Predicate<io.anuke.mindustry.entities.type.Unit> predicate, Consumer<io.anuke.mindustry.entities.type.Unit> acceptor){
Consumer<io.anuke.mindustry.entities.type.Unit> cons = entity -> { Consumer<io.anuke.mindustry.entities.type.Unit> cons = entity -> {
if(!predicate.test(entity)) return; if(!predicate.test(entity)) return;
@@ -157,17 +154,17 @@ public class Damage{
} }
} }
/**Damages everything in a radius.*/ /** Damages everything in a radius. */
public static void damage(float x, float y, float radius, float damage){ public static void damage(float x, float y, float radius, float damage){
damage(null, x, y, radius, damage, false); damage(null, x, y, radius, damage, false);
} }
/**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){
damage(team, x, y, radius, damage, false); damage(team, x, y, radius, damage, false);
} }
/**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, boolean complete){ public static void damage(Team team, float x, float y, float radius, float damage, boolean complete){
Consumer<Unit> cons = entity -> { Consumer<Unit> cons = entity -> {
if(entity.getTeam() == team || entity.dst(x, y) > radius){ if(entity.getTeam() == team || entity.dst(x, y) > radius){
@@ -201,11 +198,11 @@ public class Damage{
public static void tileDamage(Team team, int startx, int starty, int radius, float baseDamage){ public static void tileDamage(Team team, int startx, int starty, int radius, float baseDamage){
bits.clear(); bits.clear();
propagation.clear(); propagation.clear();
int bitOffset = bits.width()/2; int bitOffset = bits.width() / 2;
propagation.addFirst(PropCell.get((byte)0, (byte)0, (short)baseDamage)); propagation.addFirst(PropCell.get((byte)0, (byte)0, (short)baseDamage));
//clamp radius to fit bits //clamp radius to fit bits
radius = Math.min(radius, bits.width()/2); radius = Math.min(radius, bits.width() / 2);
while(!propagation.isEmpty()){ while(!propagation.isEmpty()){
int prop = propagation.removeLast(); int prop = propagation.removeLast();
@@ -242,7 +239,7 @@ public class Damage{
} }
private static void completeDamage(Team team, float x, float y, float radius, float damage){ private static void completeDamage(Team team, float x, float y, float radius, float 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(Math.round(x / tilesize) + dx, Math.round(y / tilesize) + dy); Tile tile = world.tile(Math.round(x / tilesize) + dx, Math.round(y / tilesize) + dy);

View File

@@ -3,10 +3,7 @@ package io.anuke.mindustry.entities;
import io.anuke.arc.collection.Array; import io.anuke.arc.collection.Array;
import io.anuke.arc.collection.IntSet; import io.anuke.arc.collection.IntSet;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.*;
import io.anuke.arc.math.geom.QuadTree;
import io.anuke.arc.math.geom.Rectangle;
import io.anuke.arc.math.geom.Vector2;
import io.anuke.mindustry.entities.traits.Entity; import io.anuke.mindustry.entities.traits.Entity;
import io.anuke.mindustry.entities.traits.SolidTrait; import io.anuke.mindustry.entities.traits.SolidTrait;
@@ -135,7 +132,7 @@ public class EntityCollisions{
for(Entity entity : group.all()){ for(Entity entity : group.all()){
if(entity instanceof SolidTrait){ if(entity instanceof SolidTrait){
SolidTrait s = (SolidTrait) entity; SolidTrait s = (SolidTrait)entity;
s.lastPosition().set(s.getX(), s.getY()); s.lastPosition().set(s.getX(), s.getY());
tree.insert(s); tree.insert(s);
} }
@@ -144,8 +141,8 @@ public class EntityCollisions{
private void checkCollide(Entity entity, Entity other){ private void checkCollide(Entity entity, Entity other){
SolidTrait a = (SolidTrait) entity; SolidTrait a = (SolidTrait)entity;
SolidTrait b = (SolidTrait) other; SolidTrait b = (SolidTrait)other;
a.hitbox(this.r1); a.hitbox(this.r1);
b.hitbox(this.r2); b.hitbox(this.r2);
@@ -228,7 +225,7 @@ public class EntityCollisions{
if(!(entity instanceof SolidTrait) || collided.contains(entity.getID())) if(!(entity instanceof SolidTrait) || collided.contains(entity.getID()))
continue; continue;
SolidTrait solid = (SolidTrait) entity; SolidTrait solid = (SolidTrait)entity;
solid.hitbox(r1); solid.hitbox(r1);
r1.x += (solid.lastPosition().x - solid.getX()); r1.x += (solid.lastPosition().x - solid.getX());

View File

@@ -46,7 +46,7 @@ public class EntityDraw{
for(Entity e : group.all()){ for(Entity e : group.all()){
if(!(e instanceof DrawTrait) || !toDraw.test((T)e) || !e.isAdded()) continue; if(!(e instanceof DrawTrait) || !toDraw.test((T)e) || !e.isAdded()) continue;
if(!clip || rect.setSize(((DrawTrait) e).drawSize()).setCenter(e.getX(), e.getY()).overlaps(viewport)){ if(!clip || rect.setSize(((DrawTrait)e).drawSize()).setCenter(e.getX(), e.getY()).overlaps(viewport)){
cons.accept((T)e); cons.accept((T)e);
} }
} }

View File

@@ -180,7 +180,7 @@ public class EntityGroup<T extends Entity>{
return null; return null;
} }
/**Returns the logic-only array for iteration.*/ /** Returns the logic-only array for iteration. */
public Array<T> all(){ public Array<T> all(){
return entityArray; return entityArray;
} }

View File

@@ -74,7 +74,7 @@ public class EntityQuery{
float cdist = 0f; float cdist = 0f;
Array<SolidTrait> entities = getNearby(group, x, y, range * 2f); Array<SolidTrait> entities = getNearby(group, x, y, range * 2f);
for(int i = 0; i < entities.size; i++){ for(int i = 0; i < entities.size; i++){
T e = (T) entities.get(i); T e = (T)entities.get(i);
if(!pred.test(e)) if(!pred.test(e))
continue; continue;

View File

@@ -14,7 +14,6 @@ public class Predict{
/** /**
* Calculates of intercept of a stationary and moving target. Do not call from multiple threads! * Calculates of intercept of a stationary and moving target. Do not call from multiple threads!
*
* @param srcx X of shooter * @param srcx X of shooter
* @param srcy Y of shooter * @param srcy Y of shooter
* @param dstx X of target * @param dstx X of target
@@ -28,7 +27,7 @@ public class Predict{
dstvx /= Time.delta(); dstvx /= Time.delta();
dstvy /= Time.delta(); dstvy /= Time.delta();
float tx = dstx - srcx, float tx = dstx - srcx,
ty = dsty - srcy; ty = dsty - srcy;
// Get quadratic equation components // Get quadratic equation components
float a = dstvx * dstvx + dstvy * dstvy - v * v; float a = dstvx * dstvx + dstvy * dstvy - v * v;
@@ -57,8 +56,8 @@ public class Predict{
*/ */
public static Vector2 intercept(TargetTrait src, TargetTrait dst, float v){ public static Vector2 intercept(TargetTrait src, TargetTrait dst, float v){
return intercept(src.getX(), src.getY(), dst.getX(), dst.getY(), return intercept(src.getX(), src.getY(), dst.getX(), dst.getY(),
dst.getTargetVelocityX() - src.getTargetVelocityX(), dst.getTargetVelocityX() - src.getTargetVelocityX(),
dst.getTargetVelocityY() - src.getTargetVelocityY(), v); dst.getTargetVelocityY() - src.getTargetVelocityY(), v);
} }
private static Vector2 quad(float a, float b, float c){ private static Vector2 quad(float a, float b, float c){

View File

@@ -7,10 +7,7 @@ import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Geometry;
import io.anuke.arc.math.geom.Rectangle; 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.type.Player; import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.entities.type.BaseUnit;
import io.anuke.mindustry.entities.type.Unit;
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;
@@ -29,7 +26,6 @@ public class Units{
/** /**
* Validates a target. * Validates a target.
*
* @param target The target to validate * @param target The target to validate
* @param team The team of the thing doing tha targeting * @param team The team of the thing doing tha targeting
* @param x The X position of the thing doign the targeting * @param x The X position of the thing doign the targeting
@@ -41,17 +37,17 @@ public class Units{
return target == null || (range != Float.MAX_VALUE && target.dst(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)} */
public static boolean invalidateTarget(TargetTrait target, Team team, float x, float y){ public static boolean invalidateTarget(TargetTrait target, Team team, float x, float y){
return invalidateTarget(target, team, x, y, Float.MAX_VALUE); return invalidateTarget(target, team, x, y, Float.MAX_VALUE);
} }
/**See {@link #invalidateTarget(TargetTrait, Team, float, float, float)}*/ /** See {@link #invalidateTarget(TargetTrait, Team, float, float, float)} */
public static boolean invalidateTarget(TargetTrait target, Unit targeter){ public static boolean invalidateTarget(TargetTrait target, Unit targeter){
return invalidateTarget(target, targeter.getTeam(), targeter.x, targeter.y, targeter.getWeapon().bullet.range()); return invalidateTarget(target, targeter.getTeam(), targeter.x, targeter.y, targeter.getWeapon().bullet.range());
} }
/**Returns whether there are any entities on this tile.*/ /** Returns whether there are any entities on this tile. */
public static boolean anyEntities(Tile tile){ public static boolean anyEntities(Tile tile){
Block type = tile.block(); Block type = tile.block();
rect.setSize(type.size * tilesize, type.size * tilesize); rect.setSize(type.size * tilesize, type.size * tilesize);
@@ -60,7 +56,7 @@ public class Units{
return anyEntities(rect); return anyEntities(rect);
} }
/**Can be called from any thread.*/ /** Can be called from any thread. */
public static boolean anyEntities(Rectangle rect){ public static boolean anyEntities(Rectangle rect){
boolResult = false; boolResult = false;
@@ -78,7 +74,7 @@ public class Units{
return boolResult; return boolResult;
} }
/**Returns whether there are any entities on this tile, with the hitbox expanded.*/ /** Returns whether there are any entities on this tile, with the hitbox expanded. */
public static boolean anyEntities(Tile tile, float expansion, Predicate<Unit> pred){ public static boolean anyEntities(Tile tile, float expansion, Predicate<Unit> pred){
Block type = tile.block(); Block type = tile.block();
rect.setSize(type.size * tilesize + expansion, type.size * tilesize + expansion); rect.setSize(type.size * tilesize + expansion, type.size * tilesize + expansion);
@@ -100,18 +96,18 @@ public class Units{
return value[0]; return value[0];
} }
/**Returns the neareset damaged tile.*/ /** Returns the neareset damaged tile. */
public static TileEntity findDamagedTile(Team team, float x, float y){ public static TileEntity findDamagedTile(Team team, float x, float y){
Tile tile = Geometry.findClosest(x, y, world.indexer.getDamaged(team)); Tile tile = Geometry.findClosest(x, y, world.indexer.getDamaged(team));
return tile == null ? null : tile.entity; return tile == null ? null : tile.entity;
} }
/**Returns the neareset ally tile in a range.*/ /** Returns the neareset ally tile in a range. */
public static TileEntity findAllyTile(Team team, float x, float y, float range, Predicate<Tile> pred){ public static TileEntity findAllyTile(Team team, float x, float y, float range, Predicate<Tile> pred){
return world.indexer.findTile(team, x, y, range, pred); return world.indexer.findTile(team, x, y, range, pred);
} }
/**Returns the neareset enemy tile in a range.*/ /** Returns the neareset enemy tile in a range. */
public static TileEntity findEnemyTile(Team team, float x, float y, float range, Predicate<Tile> pred){ public static TileEntity findEnemyTile(Team team, float x, float y, float range, Predicate<Tile> pred){
if(team == Team.none) return null; if(team == Team.none) return null;
@@ -124,7 +120,7 @@ public class Units{
return null; return null;
} }
/**Iterates over all units on all teams, including players.*/ /** Iterates over all units on all teams, including players. */
public static void allUnits(Consumer<Unit> cons){ public static void allUnits(Consumer<Unit> cons){
//check all unit groups first //check all unit groups first
for(EntityGroup<BaseUnit> group : unitGroups){ for(EntityGroup<BaseUnit> group : unitGroups){
@@ -141,17 +137,17 @@ public class Units{
} }
} }
/**Returns the closest target enemy. First, units are checked, then tile entities.*/ /** Returns the closest target enemy. First, units are checked, then tile entities. */
public static TargetTrait getClosestTarget(Team team, float x, float y, float range){ public static TargetTrait getClosestTarget(Team team, float x, float y, float range){
return getClosestTarget(team, x, y, range, Unit::isValid); return getClosestTarget(team, x, y, range, Unit::isValid);
} }
/**Returns the closest target enemy. First, units are checked, then tile entities.*/ /** Returns the closest target enemy. First, units are checked, then tile entities. */
public static TargetTrait getClosestTarget(Team team, float x, float y, float range, Predicate<Unit> unitPred){ public static TargetTrait getClosestTarget(Team team, float x, float y, float range, Predicate<Unit> unitPred){
return getClosestTarget(team, x, y, range, unitPred, t -> true); return getClosestTarget(team, x, y, range, unitPred, t -> true);
} }
/**Returns the closest target enemy. First, units are checked, then tile entities.*/ /** Returns the closest target enemy. First, units are checked, then tile entities. */
public static TargetTrait getClosestTarget(Team team, float x, float y, float range, Predicate<Unit> unitPred, Predicate<Tile> tilePred){ public static TargetTrait getClosestTarget(Team team, float x, float y, float range, Predicate<Unit> unitPred, Predicate<Tile> tilePred){
Unit unit = getClosestEnemy(team, x, y, range, unitPred); Unit unit = getClosestEnemy(team, x, y, range, unitPred);
if(unit != null){ if(unit != null){
@@ -161,7 +157,7 @@ public class Units{
} }
} }
/**Returns the closest enemy of this team. Filter by predicate.*/ /** Returns the closest enemy of this team. Filter by predicate. */
public static Unit getClosestEnemy(Team team, float x, float y, float range, Predicate<Unit> predicate){ public static Unit getClosestEnemy(Team team, float x, float y, float range, Predicate<Unit> predicate){
if(team == Team.none) return null; if(team == Team.none) return null;
@@ -186,7 +182,7 @@ public class Units{
return result; return result;
} }
/**Returns the closest ally of this team. Filter by predicate.*/ /** Returns the closest ally of this team. Filter by predicate. */
public static Unit getClosest(Team team, float x, float y, float range, Predicate<Unit> predicate){ public static Unit getClosest(Team team, float x, float y, float range, Predicate<Unit> predicate){
result = null; result = null;
cdist = 0f; cdist = 0f;
@@ -209,21 +205,21 @@ public class Units{
return result; return result;
} }
/**Iterates over all units in a rectangle.*/ /** Iterates over all units in a rectangle. */
public static void getNearby(Team team, Rectangle rect, Consumer<Unit> cons){ public static void getNearby(Team team, Rectangle rect, Consumer<Unit> cons){
EntityGroup<BaseUnit> group = unitGroups[team.ordinal()]; EntityGroup<BaseUnit> group = unitGroups[team.ordinal()];
if(!group.isEmpty()){ if(!group.isEmpty()){
EntityQuery.getNearby(group, rect, entity -> cons.accept((Unit) entity)); EntityQuery.getNearby(group, rect, entity -> cons.accept((Unit)entity));
} }
//now check all players //now check all players
EntityQuery.getNearby(playerGroup, rect, player -> { EntityQuery.getNearby(playerGroup, rect, player -> {
if(((Unit) player).getTeam() == team) cons.accept((Unit) player); if(((Unit)player).getTeam() == team) cons.accept((Unit)player);
}); });
} }
/**Iterates over all units in a circle around this position.*/ /** Iterates over all units in a circle around this position. */
public static void getNearby(Team team, float x, float y, float radius, Consumer<Unit> cons){ public static void getNearby(Team team, float x, float y, float radius, Consumer<Unit> cons){
rect.setSize(radius * 2).setCenter(x, y); rect.setSize(radius * 2).setCenter(x, y);
@@ -231,53 +227,53 @@ public class Units{
if(!group.isEmpty()){ if(!group.isEmpty()){
EntityQuery.getNearby(group, rect, entity -> { EntityQuery.getNearby(group, rect, entity -> {
if(entity.dst(x, y) <= radius){ if(entity.dst(x, y) <= radius){
cons.accept((Unit) entity); cons.accept((Unit)entity);
} }
}); });
} }
//now check all players //now check all players
EntityQuery.getNearby(playerGroup, rect, player -> { EntityQuery.getNearby(playerGroup, rect, player -> {
if(((Unit) player).getTeam() == team && player.dst(x, y) <= radius){ if(((Unit)player).getTeam() == team && player.dst(x, y) <= radius){
cons.accept((Unit) player); cons.accept((Unit)player);
} }
}); });
} }
/**Iterates over all units in a rectangle.*/ /** Iterates over all units in a rectangle. */
public static void getNearby(Rectangle rect, Consumer<Unit> cons){ public static void getNearby(Rectangle rect, Consumer<Unit> cons){
for(Team team : Team.all){ for(Team team : Team.all){
EntityGroup<BaseUnit> group = unitGroups[team.ordinal()]; EntityGroup<BaseUnit> group = unitGroups[team.ordinal()];
if(!group.isEmpty()){ if(!group.isEmpty()){
EntityQuery.getNearby(group, rect, entity -> cons.accept((Unit) entity)); EntityQuery.getNearby(group, rect, entity -> cons.accept((Unit)entity));
} }
} }
//now check all enemy players //now check all enemy players
EntityQuery.getNearby(playerGroup, rect, player -> cons.accept((Unit) player)); EntityQuery.getNearby(playerGroup, rect, player -> cons.accept((Unit)player));
} }
/**Iterates over all units that are enemies of this team.*/ /** Iterates over all units that are enemies of this team. */
public static void getNearbyEnemies(Team team, Rectangle rect, Consumer<Unit> cons){ public static void getNearbyEnemies(Team team, Rectangle rect, Consumer<Unit> cons){
EnumSet<Team> targets = state.teams.enemiesOf(team); EnumSet<Team> targets = state.teams.enemiesOf(team);
for(Team other : targets){ for(Team other : targets){
EntityGroup<BaseUnit> group = unitGroups[other.ordinal()]; EntityGroup<BaseUnit> group = unitGroups[other.ordinal()];
if(!group.isEmpty()){ if(!group.isEmpty()){
EntityQuery.getNearby(group, rect, entity -> cons.accept((Unit) entity)); EntityQuery.getNearby(group, rect, entity -> cons.accept((Unit)entity));
} }
} }
//now check all enemy players //now check all enemy players
EntityQuery.getNearby(playerGroup, rect, player -> { EntityQuery.getNearby(playerGroup, rect, player -> {
if(targets.contains(((Player) player).getTeam())){ if(targets.contains(((Player)player).getTeam())){
cons.accept((Unit) player); cons.accept((Unit)player);
} }
}); });
} }
/**Iterates over all units.*/ /** Iterates over all units. */
public static void getAllUnits(Consumer<Unit> cons){ public static void getAllUnits(Consumer<Unit> cons){
for(Team team : Team.all){ for(Team team : Team.all){

View File

@@ -1,9 +1,9 @@
package io.anuke.mindustry.entities.bullet; package io.anuke.mindustry.entities.bullet;
import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.Effects.Effect;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.Effects.Effect;
//TODO scale velocity depending on fslope() //TODO scale velocity depending on fslope()
public class ArtilleryBulletType extends BasicBulletType{ public class ArtilleryBulletType extends BasicBulletType{

View File

@@ -6,7 +6,7 @@ import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.graphics.Pal;
/**An extended BulletType for most ammo-based bullets shot from turrets and units.*/ /** An extended BulletType for most ammo-based bullets shot from turrets and units. */
public class BasicBulletType extends BulletType{ public class BasicBulletType extends BulletType{
public Color backColor = Pal.bulletYellowBack, frontColor = Pal.bulletYellow; public Color backColor = Pal.bulletYellowBack, frontColor = Pal.bulletYellow;
public float bulletWidth = 5f, bulletHeight = 7f; public float bulletWidth = 5f, bulletHeight = 7f;

View File

@@ -5,9 +5,7 @@ import io.anuke.annotations.Annotations.Remote;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Rectangle; import io.anuke.arc.math.geom.Rectangle;
import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.math.geom.Vector2;
import io.anuke.arc.util.Interval; import io.anuke.arc.util.*;
import io.anuke.arc.util.Time;
import io.anuke.arc.util.Tmp;
import io.anuke.arc.util.pooling.Pool.Poolable; import io.anuke.arc.util.pooling.Pool.Poolable;
import io.anuke.arc.util.pooling.Pools; import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.entities.EntityGroup; import io.anuke.mindustry.entities.EntityGroup;
@@ -18,9 +16,7 @@ import io.anuke.mindustry.entities.type.Unit;
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 java.io.DataInput; import java.io.*;
import java.io.DataOutput;
import java.io.IOException;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -36,7 +32,7 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool
protected Entity owner; protected Entity owner;
protected float time; protected float time;
/**Internal use only!*/ /** Internal use only! */
public Bullet(){ public Bullet(){
} }
@@ -64,7 +60,7 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool
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).velocity() : Vector2.ZERO); bullet.velocity.add(owner instanceof VelocityTrait ? ((VelocityTrait)owner).velocity() : Vector2.ZERO);
} }
bullet.team = team; bullet.team = team;
@@ -85,13 +81,13 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool
return create(type, parent.owner, parent.team, x, y, angle, velocityScl); return create(type, parent.owner, parent.team, x, y, angle, velocityScl);
} }
/**Internal use only.*/ /** Internal use only. */
@Remote(called = Loc.server, unreliable = true) @Remote(called = Loc.server, unreliable = true)
public static void createBullet(BulletType type, float x, float y, float angle){ public static void createBullet(BulletType type, float x, float y, float angle){
create(type, null, Team.none, x, y, angle); create(type, null, Team.none, x, y, angle);
} }
/**ok*/ /** ok */
@Remote(called = Loc.server, unreliable = true) @Remote(called = Loc.server, unreliable = true)
public static void createBullet(BulletType type, Team team, float x, float y, float angle){ public static void createBullet(BulletType type, Team team, float x, float y, float angle){
create(type, null, team, x, y, angle); create(type, null, team, x, y, angle);
@@ -133,7 +129,7 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool
public float damageMultiplier(){ public float damageMultiplier(){
if(owner instanceof Unit){ if(owner instanceof Unit){
return ((Unit) owner).getDamageMultipler(); return ((Unit)owner).getDamageMultipler();
} }
return 1f; return 1f;
} }
@@ -194,7 +190,7 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool
@Override @Override
public boolean collides(SolidTrait other){ public boolean collides(SolidTrait other){
return type.collides && (other != owner && !(other instanceof DamageTrait)) && !supressCollision && !(other instanceof Unit && ((Unit) other).isFlying() && !type.collidesAir); return type.collides && (other != owner && !(other instanceof DamageTrait)) && !supressCollision && !(other instanceof Unit && ((Unit)other).isFlying() && !type.collidesAir);
} }
@Override @Override
@@ -203,7 +199,7 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool
type.hit(this, x, y); type.hit(this, x, y);
if(other instanceof Unit){ if(other instanceof Unit){
Unit unit = (Unit) other; Unit unit = (Unit)other;
unit.velocity().add(Tmp.v3.set(other.getX(), other.getY()).sub(x, y).setLength(type.knockback / unit.mass())); unit.velocity().add(Tmp.v3.set(other.getX(), other.getY()).sub(x, y).setLength(type.knockback / unit.mass()));
unit.applyEffect(type.status, type.statusDuration); unit.applyEffect(type.status, type.statusDuration);
} }
@@ -218,7 +214,7 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool
velocity.scl(Mathf.clamp(1f - type.drag * Time.delta())); velocity.scl(Mathf.clamp(1f - type.drag * Time.delta()));
time += Time.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){
@@ -336,12 +332,12 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool
velocity.limit(f); velocity.limit(f);
} }
/** Sets the bullet's rotation in degrees.*/ /** Sets the bullet's rotation in degrees. */
public void rot(float angle){ public void rot(float angle){
velocity.setAngle(angle); velocity.setAngle(angle);
} }
/** @return the bullet's rotation.*/ /** @return the bullet's rotation. */
public float rot(){ public float rot(){
float angle = Mathf.atan2(velocity.x, velocity.y) * Mathf.radiansToDegrees; float angle = Mathf.atan2(velocity.x, velocity.y) * Mathf.radiansToDegrees;
if(angle < 0) angle += 360; if(angle < 0) angle += 360;

View File

@@ -4,10 +4,8 @@ import io.anuke.arc.math.Angles;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.content.StatusEffects; import io.anuke.mindustry.content.StatusEffects;
import io.anuke.mindustry.entities.Damage; import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.Effects.Effect; import io.anuke.mindustry.entities.Effects.Effect;
import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.entities.effect.Lightning; import io.anuke.mindustry.entities.effect.Lightning;
import io.anuke.mindustry.entities.traits.TargetTrait; import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.game.Content; import io.anuke.mindustry.game.Content;
@@ -26,39 +24,39 @@ public abstract class BulletType extends Content{
public boolean pierce; public boolean pierce;
public Effect hitEffect, despawnEffect; public Effect hitEffect, despawnEffect;
/**Effect created when shooting.*/ /** Effect created when shooting. */
public Effect shootEffect = Fx.shootSmall; public Effect shootEffect = Fx.shootSmall;
/**Extra smoke effect created when shooting.*/ /** Extra smoke effect created when shooting. */
public Effect smokeEffect = Fx.shootSmallSmoke; public Effect smokeEffect = Fx.shootSmallSmoke;
/**Extra inaccuracy when firing.*/ /** Extra inaccuracy when firing. */
public float inaccuracy = 0f; public float inaccuracy = 0f;
/**How many bullets get created per ammo item/liquid.*/ /** How many bullets get created per ammo item/liquid. */
public float ammoMultiplier = 1f; public float ammoMultiplier = 1f;
/**Multiplied by turret reload speed to get final shoot speed.*/ /** Multiplied by turret reload speed to get final shoot speed. */
public float reloadMultiplier = 1f; public float reloadMultiplier = 1f;
/**Recoil from shooter entities.*/ /** Recoil from shooter entities. */
public float recoil; public float recoil;
public float splashDamage = 0f; public float splashDamage = 0f;
/**Knockback in velocity.*/ /** Knockback in velocity. */
public float knockback; public float knockback;
/**Whether this bullet hits tiles.*/ /** Whether this bullet hits tiles. */
public boolean hitTiles = true; public boolean hitTiles = true;
/**Status effect applied on hit.*/ /** Status effect applied on hit. */
public StatusEffect status = StatusEffects.none; public StatusEffect status = StatusEffects.none;
/**Intensity of applied status effect in terms of duration.*/ /** Intensity of applied status effect in terms of duration. */
public float statusDuration = 60 * 1f; public float statusDuration = 60 * 1f;
/**Whether to sync this bullet to clients.*/ /** Whether to sync this bullet to clients. */
public boolean syncable; public boolean syncable;
/**Whether this bullet type collides with tiles.*/ /** Whether this bullet type collides with tiles. */
public boolean collidesTiles = true; public boolean collidesTiles = true;
/**Whether this bullet type collides with tiles that are of the same team.*/ /** Whether this bullet type collides with tiles that are of the same team. */
public boolean collidesTeam = false; public boolean collidesTeam = false;
/**Whether this bullet type collides with air units.*/ /** Whether this bullet type collides with air units. */
public boolean collidesAir = true; public boolean collidesAir = true;
/**Whether this bullet types collides with anything at all.*/ /** Whether this bullet types collides with anything at all. */
public boolean collides = true; public boolean collides = true;
/**Whether velocity is inherited from the shooter.*/ /** Whether velocity is inherited from the shooter. */
public boolean keepVelocity = true; public boolean keepVelocity = true;
//additional effects //additional effects
@@ -67,7 +65,7 @@ public abstract class BulletType extends Content{
public float fragVelocityMin = 0.2f, fragVelocityMax = 1f; public float fragVelocityMin = 0.2f, fragVelocityMax = 1f;
public BulletType fragBullet = null; public BulletType fragBullet = null;
/**Use a negative value to disable splash damage.*/ /** Use a negative value to disable splash damage. */
public float splashDamageRadius = -1f; public float splashDamageRadius = -1f;
public int incendAmount = 0; public int incendAmount = 0;
@@ -90,7 +88,7 @@ public abstract class BulletType extends Content{
despawnEffect = Fx.hitBulletSmall; despawnEffect = Fx.hitBulletSmall;
} }
/**Returns maximum distance the bullet this bullet type has can travel.*/ /** Returns maximum distance the bullet this bullet type has can travel. */
public float range(){ public float range(){
return speed * lifetime * (1f - drag); return speed * lifetime * (1f - drag);
} }
@@ -136,7 +134,7 @@ public abstract class BulletType extends Content{
hit(b); hit(b);
} }
for (int i = 0; i < lightining; i++) { for(int i = 0; i < lightining; i++){
Lightning.create(b.getTeam(), Pal.surge, damage, b.x, b.y, Mathf.random(360f), lightningLength); Lightning.create(b.getTeam(), Pal.surge, damage, b.x, b.y, Mathf.random(360f), lightningLength);
} }
} }

View File

@@ -1,9 +1,9 @@
package io.anuke.mindustry.entities.bullet; package io.anuke.mindustry.entities.bullet;
import io.anuke.arc.math.geom.Rectangle; import io.anuke.arc.math.geom.Rectangle;
import io.anuke.arc.util.Time;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
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();
@@ -24,7 +24,7 @@ public abstract class FlakBulletType extends BasicBulletType{
if(b.getData() instanceof Integer) return; if(b.getData() instanceof Integer) return;
if(b.timer.get(2, 6)){ if(b.timer.get(2, 6)){
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.dst(b) < explodeRange){ if(unit.dst(b) < explodeRange){

View File

@@ -1,6 +1,5 @@
package io.anuke.mindustry.entities.bullet; package io.anuke.mindustry.entities.bullet;
import io.anuke.mindustry.entities.Effects;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.arc.graphics.g2d.Fill; import io.anuke.arc.graphics.g2d.Fill;
@@ -8,6 +7,7 @@ import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Geometry;
import io.anuke.arc.math.geom.Point2; import io.anuke.arc.math.geom.Point2;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.entities.Effects;
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;
@@ -35,11 +35,11 @@ public class LiquidBulletType extends BulletType{
@Override @Override
public float range(){ public float range(){
return speed * lifetime /2f; return speed * lifetime / 2f;
} }
@Override @Override
public void update(Bullet b) { public void update(Bullet b){
super.update(b); super.update(b);
if(liquid.canExtinguish()){ if(liquid.canExtinguish()){

View File

@@ -1,11 +1,11 @@
package io.anuke.mindustry.entities.bullet; package io.anuke.mindustry.entities.bullet;
import io.anuke.mindustry.entities.Effects;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.arc.math.Angles; import io.anuke.arc.math.Angles;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.graphics.Pal;
import io.anuke.mindustry.world.blocks.distribution.MassDriver.DriverBulletData; import io.anuke.mindustry.world.blocks.distribution.MassDriver.DriverBulletData;
@@ -45,7 +45,7 @@ public class MassDriverBolt extends BulletType{
float hitDst = 7f; float hitDst = 7f;
DriverBulletData data = (DriverBulletData) b.getData(); DriverBulletData data = (DriverBulletData)b.getData();
//if the target is dead, just keep flying until the bullet explodes //if the target is dead, just keep flying until the bullet explodes
if(data.to.isDead()){ if(data.to.isDead()){
@@ -87,7 +87,7 @@ public class MassDriverBolt extends BulletType{
if(!(b.getData() instanceof DriverBulletData)) return; if(!(b.getData() instanceof DriverBulletData)) return;
DriverBulletData data = (DriverBulletData) b.getData(); DriverBulletData data = (DriverBulletData)b.getData();
data.to.isRecieving = false; data.to.isRecieving = false;
for(int i = 0; i < data.items.length; i++){ for(int i = 0; i < data.items.length; i++){

View File

@@ -1,11 +1,11 @@
package io.anuke.mindustry.entities.bullet; package io.anuke.mindustry.entities.bullet;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.graphics.Pal;
import io.anuke.mindustry.entities.Effects;
import io.anuke.arc.util.Time;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.util.Time;
import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.graphics.Pal;
public class MissileBulletType extends BasicBulletType{ public class MissileBulletType extends BasicBulletType{
protected Color trailColor = Pal.missileYellowBack; protected Color trailColor = Pal.missileYellowBack;

View File

@@ -1,12 +1,12 @@
package io.anuke.mindustry.entities.effect; package io.anuke.mindustry.entities.effect;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.entities.traits.BelowLiquidTrait;
import io.anuke.mindustry.entities.EntityGroup;
import io.anuke.mindustry.entities.impl.TimedEntity;
import io.anuke.mindustry.entities.traits.DrawTrait;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.mindustry.entities.EntityGroup;
import io.anuke.mindustry.entities.impl.TimedEntity;
import io.anuke.mindustry.entities.traits.BelowLiquidTrait;
import io.anuke.mindustry.entities.traits.DrawTrait;
import static io.anuke.mindustry.Vars.groundEffectGroup; import static io.anuke.mindustry.Vars.groundEffectGroup;

View File

@@ -3,9 +3,6 @@ package io.anuke.mindustry.entities.effect;
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.collection.IntMap;
import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.EntityGroup;
import io.anuke.mindustry.entities.impl.TimedEntity;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Geometry;
import io.anuke.arc.math.geom.Point2; import io.anuke.arc.math.geom.Point2;
@@ -13,22 +10,17 @@ import io.anuke.arc.util.Structs;
import io.anuke.arc.util.Time; import io.anuke.arc.util.Time;
import io.anuke.arc.util.pooling.Pool.Poolable; import io.anuke.arc.util.pooling.Pool.Poolable;
import io.anuke.arc.util.pooling.Pools; import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.content.Bullets; import io.anuke.mindustry.content.*;
import io.anuke.mindustry.content.StatusEffects; import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.impl.TimedEntity;
import io.anuke.mindustry.entities.Damage;
import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.entities.traits.SaveTrait; import io.anuke.mindustry.entities.traits.SaveTrait;
import io.anuke.mindustry.entities.traits.SyncTrait; import io.anuke.mindustry.entities.traits.SyncTrait;
import io.anuke.mindustry.entities.type.TileEntity;
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.world.Block; import io.anuke.mindustry.world.*;
import io.anuke.mindustry.world.Pos;
import io.anuke.mindustry.world.Tile;
import java.io.DataInput; import java.io.*;
import java.io.DataOutput;
import java.io.IOException;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -42,10 +34,11 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
private float baseFlammability = -1, puddleFlammability; private float baseFlammability = -1, puddleFlammability;
private float lifetime; private float lifetime;
/**Deserialization use only!*/ /** Deserialization use only! */
public Fire(){} public Fire(){
}
/**Start a fire on the tile. If there already is a file there, refreshes its lifetime.*/ /** Start a fire on the tile. If there already is a file there, refreshes its lifetime. */
public static void create(Tile tile){ public static void create(Tile tile){
if(Net.client() || tile == null) return; //not clientside. if(Net.client() || tile == null) return; //not clientside.
@@ -153,8 +146,8 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
entity.damage(0.4f); entity.damage(0.4f);
} }
Damage.damageUnits(null, tile.worldx(), tile.worldy(), tilesize, 3f, Damage.damageUnits(null, tile.worldx(), tile.worldy(), tilesize, 3f,
unit -> !unit.isFlying() && !unit.isImmune(StatusEffects.burning), unit -> !unit.isFlying() && !unit.isImmune(StatusEffects.burning),
unit -> unit.applyEffect(StatusEffects.burning, 60 * 5)); unit -> unit.applyEffect(StatusEffects.burning, 60 * 5));
} }
} }

View File

@@ -1,12 +1,12 @@
package io.anuke.mindustry.entities.effect; package io.anuke.mindustry.entities.effect;
import io.anuke.arc.math.Mathf;
import io.anuke.arc.util.Time;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.Effects.Effect; import io.anuke.mindustry.entities.Effects.Effect;
import io.anuke.mindustry.entities.Effects.EffectRenderer; import io.anuke.mindustry.entities.Effects.EffectRenderer;
import io.anuke.mindustry.entities.impl.EffectEntity; import io.anuke.mindustry.entities.impl.EffectEntity;
import io.anuke.arc.math.Mathf;
import io.anuke.arc.util.Time;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
/** /**
@@ -17,7 +17,7 @@ public class GroundEffectEntity extends EffectEntity{
@Override @Override
public void update(){ public void update(){
GroundEffect effect = (GroundEffect) this.effect; GroundEffect effect = (GroundEffect)this.effect;
if(effect.isStatic){ if(effect.isStatic){
time += Time.delta(); time += Time.delta();
@@ -41,7 +41,7 @@ public class GroundEffectEntity extends EffectEntity{
@Override @Override
public void draw(){ public void draw(){
GroundEffect effect = (GroundEffect) this.effect; GroundEffect effect = (GroundEffect)this.effect;
if(once && effect.isStatic) if(once && effect.isStatic)
Effects.renderEffect(id, effect, color, lifetime(), rotation, x, y, data); Effects.renderEffect(id, effect, color, lifetime(), rotation, x, y, data);

View File

@@ -2,18 +2,16 @@ package io.anuke.mindustry.entities.effect;
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.entities.EntityGroup; import io.anuke.arc.graphics.g2d.*;
import io.anuke.mindustry.entities.impl.TimedEntity;
import io.anuke.mindustry.entities.traits.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.Interpolation;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Position; import io.anuke.arc.math.geom.Position;
import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.math.geom.Vector2;
import io.anuke.arc.util.Time; import io.anuke.arc.util.Time;
import io.anuke.arc.util.pooling.Pools; import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.entities.EntityGroup;
import io.anuke.mindustry.entities.impl.TimedEntity;
import io.anuke.mindustry.entities.traits.DrawTrait;
import io.anuke.mindustry.entities.type.Unit; import io.anuke.mindustry.entities.type.Unit;
import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.graphics.Pal;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;

View File

@@ -4,27 +4,18 @@ 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.Array;
import io.anuke.arc.collection.IntSet; import io.anuke.arc.collection.IntSet;
import io.anuke.arc.graphics.g2d.Fill;
import io.anuke.arc.graphics.g2d.Lines;
import io.anuke.mindustry.entities.EntityGroup;
import io.anuke.mindustry.entities.impl.TimedEntity;
import io.anuke.mindustry.entities.traits.DrawTrait;
import io.anuke.mindustry.entities.traits.TimeTrait;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.math.Angles; import io.anuke.arc.math.*;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.*;
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.arc.util.pooling.Pools;
import io.anuke.mindustry.content.Bullets; import io.anuke.mindustry.content.Bullets;
import io.anuke.mindustry.entities.type.Unit; import io.anuke.mindustry.entities.EntityGroup;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.entities.bullet.Bullet; import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.traits.SyncTrait; import io.anuke.mindustry.entities.impl.TimedEntity;
import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.entities.type.Unit;
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.Pal; import io.anuke.mindustry.graphics.Pal;
@@ -48,16 +39,16 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time
private Array<Position> lines = new Array<>(); private Array<Position> lines = new Array<>();
private Color color = Pal.lancerLaser; private Color color = Pal.lancerLaser;
/**For pooling use only. Do not call directly!*/ /** For pooling use only. Do not call directly! */
public Lightning(){ public Lightning(){
} }
/**Create a lighting branch at a location. Use Team.none to damage everyone.*/ /** Create a lighting branch at a location. Use Team.none to damage everyone. */
public static void create(Team team, Color color, float damage, float x, float y, float targetAngle, int length){ public static void create(Team team, Color color, float damage, float x, float y, float targetAngle, int length){
Call.createLighting(lastSeed++, team, color, damage, x, y, targetAngle, length); Call.createLighting(lastSeed++, team, color, damage, x, y, targetAngle, length);
} }
/**Do not invoke!*/ /** Do not invoke! */
@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){
@@ -72,7 +63,7 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time
random.setSeed(seed); random.setSeed(seed);
hit.clear(); hit.clear();
for (int i = 0; i < length/2; i++) { for(int i = 0; i < length / 2; i++){
Bullet.create(Bullets.damageLightning, l, team, x, y, 0f, 1f, 1f, dmg); Bullet.create(Bullets.damageLightning, l, team, x, y, 0f, 1f, 1f, dmg);
l.lines.add(new Vector2(x + Mathf.range(3f), y + Mathf.range(3f))); l.lines.add(new Vector2(x + Mathf.range(3f), y + Mathf.range(3f)));
@@ -94,8 +85,8 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time
y = furthest.y; y = furthest.y;
}else{ }else{
rotation += random.range(20f); rotation += random.range(20f);
x += Angles.trnsx(rotation, hitRange/2f); x += Angles.trnsx(rotation, hitRange / 2f);
y += Angles.trnsy(rotation, hitRange/2f); y += Angles.trnsy(rotation, hitRange / 2f);
} }
} }
} }
@@ -106,10 +97,12 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time
} }
@Override @Override
public void write(DataOutput data){} public void write(DataOutput data){
}
@Override @Override
public void read(DataInput data){} public void read(DataInput data){
}
@Override @Override
public float lifetime(){ public float lifetime(){
@@ -144,7 +137,7 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time
int i = 0; int i = 0;
for(Position p : lines){ for(Position p : lines){
Fill.square(p.getX(), p.getY(), (5f - (float)i++/lines.size*2f) * fout(), 45); Fill.square(p.getX(), p.getY(), (5f - (float)i++ / lines.size * 2f) * fout(), 45);
} }
Draw.reset(); Draw.reset();
} }

View File

@@ -3,36 +3,25 @@ package io.anuke.mindustry.entities.effect;
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.collection.IntMap;
import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.EntityGroup;
import io.anuke.mindustry.entities.impl.SolidEntity;
import io.anuke.mindustry.entities.traits.DrawTrait;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.arc.graphics.g2d.Fill; import io.anuke.arc.graphics.g2d.Fill;
import io.anuke.arc.math.Angles; import io.anuke.arc.math.Angles;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.*;
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.Time;
import io.anuke.arc.util.pooling.Pool.Poolable; import io.anuke.arc.util.pooling.Pool.Poolable;
import io.anuke.arc.util.pooling.Pools; import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.content.*;
import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.content.Bullets; import io.anuke.mindustry.entities.impl.SolidEntity;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.entities.traits.SaveTrait;
import io.anuke.mindustry.entities.traits.SyncTrait;
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.Liquid; import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import java.io.DataInput; import java.io.*;
import java.io.DataOutput;
import java.io.IOException;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -55,21 +44,21 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
private float accepting; private float accepting;
private byte generation; private byte generation;
/**Deserialization use only!*/ /** Deserialization use only! */
public Puddle(){ public Puddle(){
} }
/**Deposists a puddle between tile and source.*/ /** Deposists a puddle between tile and source. */
public static void deposit(Tile tile, Tile source, Liquid liquid, float amount){ public static void deposit(Tile tile, Tile source, Liquid liquid, float amount){
deposit(tile, source, liquid, amount, 0); deposit(tile, source, liquid, amount, 0);
} }
/**Deposists a puddle at a tile.*/ /** Deposists a puddle at a tile. */
public static void deposit(Tile tile, Liquid liquid, float amount){ public static void deposit(Tile tile, Liquid liquid, float amount){
deposit(tile, tile, liquid, amount, 0); deposit(tile, tile, liquid, amount, 0);
} }
/**Returns the puddle on the specified tile. May return null.*/ /** Returns the puddle on the specified tile. May return null. */
public static Puddle getPuddle(Tile tile){ public static Puddle getPuddle(Tile tile){
return map.get(tile.pos()); return map.get(tile.pos());
} }
@@ -79,13 +68,13 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
if(tile.floor().isLiquid && !canStayOn(liquid, tile.floor().liquidDrop)){ if(tile.floor().isLiquid && !canStayOn(liquid, tile.floor().liquidDrop)){
reactPuddle(tile.floor().liquidDrop, liquid, amount, tile, reactPuddle(tile.floor().liquidDrop, liquid, amount, tile,
(tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f); (tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f);
Puddle p = map.get(tile.pos()); Puddle p = map.get(tile.pos());
if(generation == 0 && p != null && p.lastRipple <= Time.time() - 40f){ if(generation == 0 && p != null && p.lastRipple <= Time.time() - 40f){
Effects.effect(Fx.ripple, tile.floor().liquidDrop.color, Effects.effect(Fx.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 = Time.time(); p.lastRipple = Time.time();
} }
return; return;
@@ -99,14 +88,14 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
puddle.tile = tile; puddle.tile = tile;
puddle.liquid = liquid; puddle.liquid = liquid;
puddle.amount = amount; puddle.amount = amount;
puddle.generation = (byte) generation; puddle.generation = (byte)generation;
puddle.set((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f); puddle.set((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f);
puddle.add(); puddle.add();
map.put(tile.pos(), puddle); map.put(tile.pos(), puddle);
}else if(p.liquid == liquid){ }else if(p.liquid == liquid){
p.accepting = Math.max(amount, p.accepting); p.accepting = Math.max(amount, p.accepting);
if(generation == 0 && p.lastRipple <= Time.time() - 40f && p.amount >= maxLiquid / 2f){ if(generation == 0 && p.lastRipple <= Time.time() - 40f && p.amount >= maxLiquid / 2f){
Effects.effect(Fx.ripple, p.liquid.color, (tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f); Effects.effect(Fx.ripple, p.liquid.color, (tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f);
p.lastRipple = Time.time(); p.lastRipple = Time.time();
} }
@@ -123,10 +112,10 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
return liquid == Liquids.oil && other == Liquids.water; return liquid == Liquids.oil && other == Liquids.water;
} }
/**Reacts two liquids together at a location.*/ /** Reacts two liquids together at a location. */
private static float reactPuddle(Liquid dest, Liquid liquid, float amount, Tile tile, float x, float y){ private static float reactPuddle(Liquid dest, Liquid liquid, float amount, Tile tile, float x, float y){
if((dest.flammability > 0.3f && liquid.temperature > 0.7f) || if((dest.flammability > 0.3f && liquid.temperature > 0.7f) ||
(liquid.flammability > 0.3f && dest.temperature > 0.7f)){ //flammable liquid + hot liquid (liquid.flammability > 0.3f && dest.temperature > 0.7f)){ //flammable liquid + hot liquid
Fire.create(tile); Fire.create(tile);
if(Mathf.chance(0.006 * amount)){ if(Mathf.chance(0.006 * amount)){
Call.createBullet(Bullets.fireball, x, y, Mathf.random(360f)); Call.createBullet(Bullets.fireball, x, y, Mathf.random(360f));
@@ -234,7 +223,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
Fill.circle(x + Mathf.sin(Time.time() + seeds * 532, sscl, smag), y + Mathf.sin(Time.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(Time.time() + seeds * 532, sscl, smag), Fill.circle(x + ex + Mathf.sin(Time.time() + seeds * 532, sscl, smag),
y + ey + Mathf.sin(Time.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();
@@ -295,7 +284,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
data.writeFloat(x); data.writeFloat(x);
data.writeFloat(y); data.writeFloat(y);
data.writeByte(liquid.id); data.writeByte(liquid.id);
data.writeShort((short) (amount * 4)); data.writeShort((short)(amount * 4));
data.writeInt(tile.pos()); data.writeInt(tile.pos());
} }

View File

@@ -11,7 +11,7 @@ public class RubbleDecal extends Decal{
private static final TextureRegion[][] regions = new TextureRegion[16][0]; private static final TextureRegion[][] regions = new TextureRegion[16][0];
private TextureRegion region; private TextureRegion region;
/**Creates a rubble effect at a position. Provide a block size to use.*/ /** Creates a rubble effect at a position. Provide a block size to use. */
public static void create(float x, float y, int size){ public static void create(float x, float y, int size){
if(headless) return; if(headless) return;

View File

@@ -40,10 +40,10 @@ public class ScorchDecal extends Decal{
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.rect(region, Draw.rect(region,
x + Angles.trnsx(rotation, space), x + Angles.trnsx(rotation, space),
y + Angles.trnsy(rotation, space) + region.getHeight()/2f*Draw.scl, y + Angles.trnsy(rotation, space) + region.getHeight() / 2f * Draw.scl,
region.getWidth() * Draw.scl, region.getWidth() * Draw.scl,
region.getHeight() * Draw.scl, region.getHeight() * Draw.scl,
region.getWidth()/2f*Draw.scl, 0, rotation - 90); region.getWidth() / 2f * Draw.scl, 0, rotation - 90);
} }
} }
} }

View File

@@ -1,9 +1,7 @@
package io.anuke.mindustry.entities.impl; package io.anuke.mindustry.entities.impl;
import io.anuke.mindustry.entities.traits.DamageTrait; import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.entities.traits.HealthTrait;
import io.anuke.mindustry.entities.traits.SolidTrait;
public abstract class DestructibleEntity extends SolidEntity implements HealthTrait{ public abstract class DestructibleEntity extends SolidEntity implements HealthTrait{
public transient boolean dead; public transient boolean dead;
@@ -18,7 +16,7 @@ public abstract class DestructibleEntity extends SolidEntity implements HealthTr
public void collision(SolidTrait other, float x, float y){ public void collision(SolidTrait other, float x, float y){
if(other instanceof DamageTrait){ if(other instanceof DamageTrait){
onHit(other); onHit(other);
damage(((DamageTrait) other).damage()); damage(((DamageTrait)other).damage());
} }
} }

View File

@@ -5,9 +5,7 @@ import io.anuke.arc.Events;
import io.anuke.arc.collection.Array; import io.anuke.arc.collection.Array;
import io.anuke.arc.collection.Queue; import io.anuke.arc.collection.Queue;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.*;
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.Angles;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.math.geom.Vector2;
@@ -16,29 +14,23 @@ import io.anuke.mindustry.Vars;
import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.entities.type.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.Pal; import io.anuke.mindustry.graphics.Pal;
import io.anuke.mindustry.graphics.Shapes; 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.world.Block; import io.anuke.mindustry.world.*;
import io.anuke.mindustry.world.Build;
import io.anuke.mindustry.world.Pos;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.BuildBlock; import io.anuke.mindustry.world.blocks.BuildBlock;
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
import java.io.DataInput; import java.io.*;
import java.io.DataOutput;
import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
import static io.anuke.mindustry.entities.traits.BuilderTrait.BuildDataStatic.*; import static io.anuke.mindustry.entities.traits.BuilderTrait.BuildDataStatic.removal;
import static io.anuke.mindustry.entities.traits.BuilderTrait.BuildDataStatic.tmptr;
/** /**
* Interface for units that build, break or mine things. * Interface for units that build, break or mine things.
@@ -54,25 +46,25 @@ public interface BuilderTrait extends Entity, TeamTrait{
static Vector2[] tmptr = new Vector2[]{new Vector2(), new Vector2(), new Vector2(), new Vector2()}; static Vector2[] tmptr = new Vector2[]{new Vector2(), new Vector2(), new Vector2(), new Vector2()};
} }
/**Returns the queue for storing build requests.*/ /** Returns the queue for storing build requests. */
Queue<BuildRequest> getPlaceQueue(); Queue<BuildRequest> getPlaceQueue();
/**Returns the tile this builder is currently mining.*/ /** Returns the tile this builder is currently mining. */
Tile getMineTile(); Tile getMineTile();
/**Sets the tile this builder is currently mining.*/ /** Sets the tile this builder is currently mining. */
void setMineTile(Tile tile); void setMineTile(Tile tile);
/**Returns the minining speed of this miner. 1 = standard, 0.5 = half speed, 2 = double speed, etc.*/ /** Returns the minining speed of this miner. 1 = standard, 0.5 = half speed, 2 = double speed, etc. */
float getMinePower(); float getMinePower();
/**Build power, can be any float. 1 = builds recipes in normal time, 0 = doesn't build at all.*/ /** Build power, can be any float. 1 = builds recipes in normal time, 0 = doesn't build at all. */
float getBuildPower(Tile tile); float getBuildPower(Tile tile);
/**Returns whether or not this builder can mine a specific item type.*/ /** Returns whether or not this builder can mine a specific item type. */
boolean canMine(Item item); boolean canMine(Item item);
/**Whether this type of builder can begin creating new blocks.*/ /** Whether this type of builder can begin creating new blocks. */
default boolean canCreateBlocks(){ default boolean canCreateBlocks(){
return true; return true;
} }
@@ -106,13 +98,13 @@ public interface BuilderTrait extends Entity, TeamTrait{
float progress = input.readFloat(); float progress = input.readFloat();
BuildRequest request; BuildRequest request;
if(type == 1){ //remove if(type == 1){ //remove
request = new BuildRequest(Pos.x(position), Pos.y(position)); request = new BuildRequest(Pos.x(position), Pos.y(position));
}else{ //place }else{ //place
byte block = input.readByte(); byte block = input.readByte();
byte rotation = input.readByte(); byte rotation = input.readByte();
request = new BuildRequest(Pos.x(position), Pos.y(position), rotation, content.block(block)); request = new BuildRequest(Pos.x(position), Pos.y(position), rotation, content.block(block));
} }
request.progress = progress; request.progress = progress;
@@ -124,17 +116,17 @@ public interface BuilderTrait extends Entity, TeamTrait{
} }
} }
/**Return whether this builder's place queue contains items.*/ /** Return whether this builder's place queue contains items. */
default boolean isBuilding(){ default boolean isBuilding(){
return getPlaceQueue().size != 0; return getPlaceQueue().size != 0;
} }
/**Clears the placement queue.*/ /** Clears the placement queue. */
default void clearBuilding(){ default void clearBuilding(){
getPlaceQueue().clear(); getPlaceQueue().clear();
} }
/**Add another build requests to the tail of the queue, if it doesn't exist there yet.*/ /** Add another build requests to the tail of the queue, if it doesn't exist there yet. */
default void addBuildRequest(BuildRequest place){ default void addBuildRequest(BuildRequest place){
for(BuildRequest request : getPlaceQueue()){ for(BuildRequest request : getPlaceQueue()){
if(request.x == place.x && request.y == place.y){ if(request.x == place.x && request.y == place.y){
@@ -172,8 +164,8 @@ public interface BuilderTrait extends Entity, TeamTrait{
for(BuildRequest request : removal){ for(BuildRequest request : removal){
if(!((request.breaking && world.tile(request.x, request.y).block() == Blocks.air) || if(!((request.breaking && world.tile(request.x, request.y).block() == Blocks.air) ||
(!request.breaking && (world.tile(request.x, request.y).getRotation() == request.rotation || !request.block.rotate) (!request.breaking && (world.tile(request.x, request.y).getRotation() == request.rotation || !request.block.rotate)
&& world.tile(request.x, request.y).block() == request.block))){ && world.tile(request.x, request.y).block() == request.block))){
getPlaceQueue().addLast(request); getPlaceQueue().addLast(request);
} }
} }
@@ -249,14 +241,14 @@ public interface BuilderTrait extends Entity, TeamTrait{
} }
} }
/**Do not call directly.*/ /** Do not call directly. */
default void updateMining(){ default void updateMining(){
Unit unit = (Unit)this; Unit unit = (Unit)this;
Tile tile = getMineTile(); Tile tile = getMineTile();
TileEntity core = unit.getClosestCore(); TileEntity core = unit.getClosestCore();
if(core == null || tile.block() != Blocks.air || dst(tile.worldx(), tile.worldy()) > mineDistance if(core == null || tile.block() != Blocks.air || dst(tile.worldx(), tile.worldy()) > mineDistance
|| tile.drop() == null || !unit.acceptsItem(tile.drop()) || !canMine(tile.drop())){ || tile.drop() == null || !unit.acceptsItem(tile.drop()) || !canMine(tile.drop())){
setMineTile(null); setMineTile(null);
}else{ }else{
Item item = tile.drop(); Item item = tile.drop();
@@ -266,25 +258,25 @@ public interface BuilderTrait extends Entity, TeamTrait{
if(unit.dst(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);
}else if(unit.acceptsItem(item)){ }else if(unit.acceptsItem(item)){
Call.transferItemToUnit(item, Call.transferItemToUnit(item,
tile.worldx() + Mathf.range(tilesize / 2f), tile.worldx() + Mathf.range(tilesize / 2f),
tile.worldy() + Mathf.range(tilesize / 2f), tile.worldy() + Mathf.range(tilesize / 2f),
unit); unit);
} }
} }
if(Mathf.chance(0.06 * Time.delta())){ if(Mathf.chance(0.06 * Time.delta())){
Effects.effect(Fx.pulverizeSmall, Effects.effect(Fx.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);
} }
} }
} }
/**Draw placement effects for an entity. This includes mining*/ /** Draw placement effects for an entity. This includes mining */
default void drawBuilding(){ default void drawBuilding(){
Unit unit = (Unit)this; Unit unit = (Unit)this;
BuildRequest request; BuildRequest request;
@@ -317,10 +309,10 @@ public interface BuilderTrait extends Entity, TeamTrait{
tmptr[3].set(tile.drawx() + sz, tile.drawy() + sz); tmptr[3].set(tile.drawx() + sz, tile.drawy() + sz);
Arrays.sort(tmptr, (a, b) -> -Float.compare(Angles.angleDist(Angles.angle(unit.x, unit.y, a.x, a.y), ang), Arrays.sort(tmptr, (a, b) -> -Float.compare(Angles.angleDist(Angles.angle(unit.x, unit.y, a.x, a.y), ang),
Angles.angleDist(Angles.angle(unit.x, unit.y, b.x, b.y), ang))); Angles.angleDist(Angles.angle(unit.x, unit.y, b.x, b.y), ang)));
float x1 = tmptr[0].x, y1 = tmptr[0].y, float x1 = tmptr[0].x, y1 = tmptr[0].y,
x3 = tmptr[1].x, y3 = tmptr[1].y; x3 = tmptr[1].x, y3 = tmptr[1].y;
Draw.alpha(1f); Draw.alpha(1f);
@@ -332,7 +324,7 @@ public interface BuilderTrait extends Entity, TeamTrait{
Draw.color(); Draw.color();
} }
/**Internal use only.*/ /** Internal use only. */
default void drawMining(){ default void drawMining(){
Unit unit = (Unit)this; Unit unit = (Unit)this;
Tile tile = getMineTile(); Tile tile = getMineTile();
@@ -353,7 +345,7 @@ public interface BuilderTrait extends Entity, TeamTrait{
Shapes.laser("minelaser", "minelaser-end", px, py, ex, ey, 0.75f); Shapes.laser("minelaser", "minelaser-end", px, py, ex, ey, 0.75f);
if(unit instanceof Player && ((Player) unit).isLocal){ if(unit instanceof Player && ((Player)unit).isLocal){
Lines.stroke(1f, Pal.accent); Lines.stroke(1f, Pal.accent);
Lines.poly(tile.worldx(), tile.worldy(), 4, tilesize / 2f * Mathf.sqrt2, Time.time()); Lines.poly(tile.worldx(), tile.worldy(), 4, tilesize / 2f * Mathf.sqrt2, Time.time());
} }
@@ -361,7 +353,7 @@ public interface BuilderTrait extends Entity, TeamTrait{
Draw.color(); Draw.color();
} }
/**Class for storing build requests. Can be either a place or remove request.*/ /** Class for storing build requests. Can be either a place or remove request. */
class BuildRequest{ class BuildRequest{
public final int x, y, rotation; public final int x, y, rotation;
public final Block block; public final Block block;
@@ -370,7 +362,7 @@ public interface BuilderTrait extends Entity, TeamTrait{
public float progress; public float progress;
public boolean initialized; public boolean initialized;
/**This creates a build request.*/ /** This creates a build request. */
public BuildRequest(int x, int y, int rotation, Block block){ public BuildRequest(int x, int y, int rotation, Block block){
this.x = x; this.x = x;
this.y = y; this.y = y;
@@ -379,7 +371,7 @@ public interface BuilderTrait extends Entity, TeamTrait{
this.breaking = false; this.breaking = false;
} }
/**This creates a remove request.*/ /** This creates a remove request. */
public BuildRequest(int x, int y){ public BuildRequest(int x, int y){
this.x = x; this.x = x;
this.y = y; this.y = y;

View File

@@ -1,8 +1,6 @@
package io.anuke.mindustry.entities.traits; package io.anuke.mindustry.entities.traits;
import java.io.DataInput; import java.io.*;
import java.io.DataOutput;
import java.io.IOException;
public interface Saveable{ public interface Saveable{
void writeSave(DataOutput stream) throws IOException; void writeSave(DataOutput stream) throws IOException;

View File

@@ -1,11 +1,9 @@
package io.anuke.mindustry.entities.traits; package io.anuke.mindustry.entities.traits;
import io.anuke.mindustry.entities.EntityQuery; import io.anuke.arc.math.geom.*;
import io.anuke.arc.math.geom.Position;
import io.anuke.arc.math.geom.QuadTree.QuadTreeObject; import io.anuke.arc.math.geom.QuadTree.QuadTreeObject;
import io.anuke.arc.math.geom.Rectangle; import io.anuke.mindustry.entities.EntityQuery;
import io.anuke.arc.math.geom.Vector2;
public interface SolidTrait extends QuadTreeObject, MoveTrait, VelocityTrait, Entity, Position{ public interface SolidTrait extends QuadTreeObject, MoveTrait, VelocityTrait, Entity, Position{
@@ -35,7 +33,8 @@ public interface SolidTrait extends QuadTreeObject, MoveTrait, VelocityTrait, En
return true; return true;
} }
default void collision(SolidTrait other, float x, float y){} default void collision(SolidTrait other, float x, float y){
}
default void move(float x, float y){ default void move(float x, float y){
EntityQuery.collisions().move(this, x, y); EntityQuery.collisions().move(this, x, y);

View File

@@ -1,17 +1,15 @@
package io.anuke.mindustry.entities.traits; package io.anuke.mindustry.entities.traits;
import io.anuke.mindustry.core.NetClient;
import io.anuke.mindustry.net.Interpolator;
import io.anuke.arc.Core; import io.anuke.arc.Core;
import io.anuke.arc.util.Tmp; import io.anuke.arc.util.Tmp;
import io.anuke.mindustry.core.NetClient;
import io.anuke.mindustry.net.Interpolator;
import java.io.DataInput; import java.io.*;
import java.io.DataOutput;
import java.io.IOException;
public interface SyncTrait extends Entity, TypeTrait{ public interface SyncTrait extends Entity, TypeTrait{
/**Sets the position of this entity and updated the interpolator.*/ /** Sets the position of this entity and updated the interpolator. */
default void setNet(float x, float y){ default void setNet(float x, float y){
set(x, y); set(x, y);
@@ -24,7 +22,7 @@ public interface SyncTrait extends Entity, TypeTrait{
} }
} }
/**Interpolate entity position only. Override if you need to interpolate rotations or other values.*/ /** Interpolate entity position only. Override if you need to interpolate rotations or other values. */
default void interpolate(){ default void interpolate(){
if(getInterpolator() == null){ if(getInterpolator() == null){
throw new RuntimeException("This entity must have an interpolator to interpolate()!"); throw new RuntimeException("This entity must have an interpolator to interpolate()!");
@@ -47,17 +45,17 @@ public interface SyncTrait extends Entity, TypeTrait{
setY(getInterpolator().pos.y); setY(getInterpolator().pos.y);
} }
/**Return the interpolator used for smoothing the position. Optional.*/ /** Return the interpolator used for smoothing the position. Optional. */
default Interpolator getInterpolator(){ default Interpolator getInterpolator(){
return null; return null;
} }
/**Whether syncing is enabled for this entity; true by default.*/ /** Whether syncing is enabled for this entity; true by default. */
default boolean isSyncing(){ default boolean isSyncing(){
return true; return true;
} }
/**Whether this entity is clipped and not synced when out of viewport.*/ /** Whether this entity is clipped and not synced when out of viewport. */
default boolean isClipped(){ default boolean isClipped(){
return true; return true;
} }

View File

@@ -14,14 +14,14 @@ public interface TargetTrait extends Position, VelocityTrait{
default float getTargetVelocityX(){ default float getTargetVelocityX(){
if(this instanceof SolidTrait){ if(this instanceof SolidTrait){
return ((SolidTrait) this).getDeltaX(); return ((SolidTrait)this).getDeltaX();
} }
return velocity().x; return velocity().x;
} }
default float getTargetVelocityY(){ default float getTargetVelocityY(){
if(this instanceof SolidTrait){ if(this instanceof SolidTrait){
return ((SolidTrait) this).getDeltaY(); return ((SolidTrait)this).getDeltaY();
} }
return velocity().y; return velocity().y;
} }

View File

@@ -28,7 +28,7 @@ public interface VelocityTrait extends MoveTrait{
velocity().scl(1f - drag() * Time.delta()); velocity().scl(1f - drag() * Time.delta());
if(this instanceof SolidTrait){ if(this instanceof SolidTrait){
((SolidTrait) this).move(velocity().x * Time.delta(), velocity().y * Time.delta()); ((SolidTrait)this).move(velocity().x * Time.delta(), velocity().y * Time.delta());
}else{ }else{
moveBy(velocity().x * Time.delta(), velocity().y * Time.delta()); moveBy(velocity().x * Time.delta(), velocity().y * Time.delta());
} }

View File

@@ -29,7 +29,7 @@ import java.io.*;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
/**Base class for AI units.*/ /** Base class for AI units. */
public abstract class BaseUnit extends Unit implements ShooterTrait{ public abstract class BaseUnit extends Unit implements ShooterTrait{
protected static int timerIndex = 0; protected static int timerIndex = 0;
@@ -45,7 +45,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
protected int spawner = noSpawner; protected int spawner = noSpawner;
/**internal constructor used for deserialization, DO NOT USE*/ /** internal constructor used for deserialization, DO NOT USE */
public BaseUnit(){ public BaseUnit(){
} }
@@ -78,7 +78,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
return type.drag; return type.drag;
} }
/**Initialize the type and team of this unit. Only call once!*/ /** Initialize the type and team of this unit. Only call once! */
public void init(UnitType type, Team team){ public void init(UnitType type, Team team){
if(this.type != null) throw new RuntimeException("This unit is already initialized!"); if(this.type != null) throw new RuntimeException("This unit is already initialized!");
@@ -99,7 +99,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
} }
public boolean targetHasFlag(BlockFlag flag){ public boolean targetHasFlag(BlockFlag flag){
return target instanceof TileEntity && ((TileEntity) target).tile.block().flags.contains(flag); return target instanceof TileEntity && ((TileEntity)target).tile.block().flags.contains(flag);
} }
public void setState(UnitState state){ public void setState(UnitState state){
@@ -112,14 +112,14 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
} }
} }
/**Only runs when the unit has a target.*/ /** Only runs when the unit has a target. */
public void behavior(){ public void behavior(){
} }
public void updateTargeting(){ public void updateTargeting(){
if(target == null || (target instanceof Unit && (target.isDead() || target.getTeam() == team)) if(target == null || (target instanceof Unit && (target.isDead() || target.getTeam() == team))
|| (target instanceof TileEntity && ((TileEntity) target).tile.entity == null)){ || (target instanceof TileEntity && ((TileEntity)target).tile.entity == null)){
target = null; target = null;
} }
} }
@@ -166,9 +166,9 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
float angT = i == 0 ? 0 : Mathf.randomSeedRange(i + 2, 60f); float angT = i == 0 ? 0 : Mathf.randomSeedRange(i + 2, 60f);
float lenT = i == 0 ? 0 : Mathf.randomSeedRange(i + 3, 1f) - 1f; float lenT = i == 0 ? 0 : Mathf.randomSeedRange(i + 3, 1f) - 1f;
Draw.rect(item.item.icon(Item.Icon.large), Draw.rect(item.item.icon(Item.Icon.large),
x + Angles.trnsx(rotation + 180f + angT, backTrns + lenT), x + Angles.trnsx(rotation + 180f + angT, backTrns + lenT),
y + Angles.trnsy(rotation + 180f + angT, backTrns + lenT), y + Angles.trnsy(rotation + 180f + angT, backTrns + lenT),
itemSize, itemSize, rotation); itemSize, itemSize, rotation);
} }
} }
} }

View File

@@ -127,11 +127,11 @@ public abstract class FlyingUnit extends BaseUnit{
public void drawEngine(){ public void drawEngine(){
Draw.color(Pal.engine); Draw.color(Pal.engine);
Fill.circle(x + Angles.trnsx(rotation + 180, type.engineOffset), y + Angles.trnsy(rotation + 180, type.engineOffset), Fill.circle(x + Angles.trnsx(rotation + 180, type.engineOffset), y + Angles.trnsy(rotation + 180, type.engineOffset),
type.engineSize + Mathf.absin(Time.time(), 2f, type.engineSize/4f)); type.engineSize + Mathf.absin(Time.time(), 2f, type.engineSize / 4f));
Draw.color(Color.WHITE); Draw.color(Color.WHITE);
Fill.circle(x + Angles.trnsx(rotation + 180, type.engineOffset-1f), y + Angles.trnsy(rotation + 180, type.engineOffset-1f), Fill.circle(x + Angles.trnsx(rotation + 180, type.engineOffset - 1f), y + Angles.trnsy(rotation + 180, type.engineOffset - 1f),
(type.engineSize + Mathf.absin(Time.time(), 2f, type.engineSize/4f)) / 2f); (type.engineSize + Mathf.absin(Time.time(), 2f, type.engineSize / 4f)) / 2f);
Draw.color(); Draw.color();
} }
@@ -141,7 +141,7 @@ public abstract class FlyingUnit extends BaseUnit{
if(Units.invalidateTarget(target, this)){ if(Units.invalidateTarget(target, this)){
for(boolean left : Mathf.booleans){ for(boolean left : Mathf.booleans){
int wi = Mathf.num(left); int wi = Mathf.num(left);
weaponAngles[wi] = Mathf.slerpDelta(weaponAngles[wi],rotation, 0.1f); weaponAngles[wi] = Mathf.slerpDelta(weaponAngles[wi], rotation, 0.1f);
} }
} }
} }
@@ -154,8 +154,8 @@ public abstract class FlyingUnit extends BaseUnit{
protected void wobble(){ protected void wobble(){
if(Net.client()) return; if(Net.client()) return;
x += Mathf.sin(Time.time() + id * 999, 25f, 0.05f)*Time.delta(); x += Mathf.sin(Time.time() + id * 999, 25f, 0.05f) * Time.delta();
y += Mathf.cos(Time.time() + id * 999, 25f, 0.05f)*Time.delta(); y += Mathf.cos(Time.time() + id * 999, 25f, 0.05f) * Time.delta();
if(velocity.len() <= 0.05f){ if(velocity.len() <= 0.05f){
//rotation += Mathf.sin(Time.time() + id * 99, 10f, 2f * type.speed)*Time.delta(); //rotation += Mathf.sin(Time.time() + id * 99, 10f, 2f * type.speed)*Time.delta();

View File

@@ -111,7 +111,7 @@ public abstract class GroundUnit extends BaseUnit{
public void draw(){ public void draw(){
Draw.mixcol(Color.WHITE, hitTime / hitDuration); Draw.mixcol(Color.WHITE, hitTime / hitDuration);
float ft = Mathf.sin(walkTime * type.speed*5f, 6f, 2f + type.hitsize/15f); float ft = Mathf.sin(walkTime * type.speed * 5f, 6f, 2f + type.hitsize / 15f);
Floor floor = getFloorOn(); Floor floor = getFloorOn();
@@ -121,9 +121,9 @@ public abstract class GroundUnit extends BaseUnit{
for(int i : Mathf.signs){ for(int i : Mathf.signs){
Draw.rect(type.legRegion, Draw.rect(type.legRegion,
x + Angles.trnsx(baseRotation, ft * i), x + Angles.trnsx(baseRotation, ft * i),
y + Angles.trnsy(baseRotation, ft * i), y + Angles.trnsy(baseRotation, ft * i),
type.legRegion.getWidth() * i * Draw.scl, type.legRegion.getHeight() * Draw.scl - Mathf.clamp(ft * i, 0, 2), baseRotation - 90); type.legRegion.getWidth() * i * Draw.scl, type.legRegion.getHeight() * Draw.scl - Mathf.clamp(ft * i, 0, 2), baseRotation - 90);
} }
if(floor.isLiquid){ if(floor.isLiquid){
@@ -138,10 +138,10 @@ public abstract class GroundUnit extends BaseUnit{
for(int i : Mathf.signs){ for(int i : Mathf.signs){
float tra = rotation - 90, trY = -type.weapon.getRecoil(this, i > 0) + type.weaponOffsetY; float tra = rotation - 90, trY = -type.weapon.getRecoil(this, i > 0) + type.weaponOffsetY;
float w = - i * type.weapon.region.getWidth() * Draw.scl; float w = -i * type.weapon.region.getWidth() * Draw.scl;
Draw.rect(type.weapon.region, Draw.rect(type.weapon.region,
x + Angles.trnsx(tra, getWeapon().width * i, trY), x + Angles.trnsx(tra, getWeapon().width * i, trY),
y + Angles.trnsy(tra, getWeapon().width * i, trY), w, type.weapon.region.getHeight() * Draw.scl, rotation - 90); y + Angles.trnsy(tra, getWeapon().width * i, trY), w, type.weapon.region.getHeight() * Draw.scl, rotation - 90);
} }
drawItems(); drawItems();
@@ -211,7 +211,7 @@ public abstract class GroundUnit extends BaseUnit{
if(tile == targetTile) return; if(tile == targetTile) return;
velocity.add(vec.trns(angleTo(targetTile), type.speed*Time.delta())); velocity.add(vec.trns(angleTo(targetTile), type.speed * Time.delta()));
if(Units.invalidateTarget(target, this)){ if(Units.invalidateTarget(target, this)){
rotation = Mathf.slerpDelta(rotation, baseRotation, type.rotatespeed); rotation = Mathf.slerpDelta(rotation, baseRotation, type.rotatespeed);
} }
@@ -235,7 +235,7 @@ public abstract class GroundUnit extends BaseUnit{
if(tile == targetTile || core == null || dst(core) < 90f) return; if(tile == targetTile || core == null || dst(core) < 90f) return;
velocity.add(vec.trns(angleTo(targetTile), type.speed*Time.delta())); velocity.add(vec.trns(angleTo(targetTile), type.speed * Time.delta()));
rotation = Mathf.slerpDelta(rotation, baseRotation, type.rotatespeed); rotation = Mathf.slerpDelta(rotation, baseRotation, type.rotatespeed);
} }
} }

View File

@@ -365,11 +365,11 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
float size = mech.engineSize * (mech.flying ? 1f : boostHeat); float size = mech.engineSize * (mech.flying ? 1f : boostHeat);
Draw.color(mech.engineColor); Draw.color(mech.engineColor);
Fill.circle(x + Angles.trnsx(rotation + 180, mech.engineOffset), y + Angles.trnsy(rotation + 180, mech.engineOffset), Fill.circle(x + Angles.trnsx(rotation + 180, mech.engineOffset), y + Angles.trnsy(rotation + 180, mech.engineOffset),
size + Mathf.absin(Time.time(), 2f, size/4f)); size + Mathf.absin(Time.time(), 2f, size / 4f));
Draw.color(Color.WHITE); Draw.color(Color.WHITE);
Fill.circle(x + Angles.trnsx(rotation + 180, mech.engineOffset-1f), y + Angles.trnsy(rotation + 180, mech.engineOffset-1f), Fill.circle(x + Angles.trnsx(rotation + 180, mech.engineOffset - 1f), y + Angles.trnsy(rotation + 180, mech.engineOffset - 1f),
(size + Mathf.absin(Time.time(), 2f, size/4f)) / 2f); (size + Mathf.absin(Time.time(), 2f, size / 4f)) / 2f);
Draw.color(); Draw.color();
} }
@@ -443,15 +443,16 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
TextureRegion region = draw.region; TextureRegion region = draw.region;
Draw.rect(region, Draw.rect(region,
request.x * tilesize + request.block.offset(), request.y * tilesize + request.block.offset(), request.x * tilesize + request.block.offset(), request.y * tilesize + request.block.offset(),
region.getWidth() * 1f * Draw.scl * draw.scalex, region.getWidth() * 1f * Draw.scl * draw.scalex,
region.getHeight() * 1f * Draw.scl * draw.scaley, request.block.rotate ? draw.rotation * 90 : 0); region.getHeight() * 1f * Draw.scl * draw.scaley, request.block.rotate ? draw.rotation * 90 : 0);
Draw.color(Pal.accent); Draw.color(Pal.accent);
for(int i = 0; i < 4; i++){ for(int i = 0; i < 4; i++){
Point2 p = Geometry.d8edge[i]; Point2 p = Geometry.d8edge[i];
float offset = -Math.max(request.block.size-1, 0)/2f * tilesize; float offset = -Math.max(request.block.size - 1, 0) / 2f * tilesize;
if(i % 2 == 0) Draw.rect("block-select", request.x * tilesize + request.block.offset() + offset * p.x, request.y * tilesize + request.block.offset() + offset * p.y, i * 90); if(i % 2 == 0)
Draw.rect("block-select", request.x * tilesize + request.block.offset() + offset * p.x, request.y * tilesize + request.block.offset() + offset * p.y, i * 90);
} }
Draw.color(); Draw.color();
@@ -615,7 +616,7 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
} }
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 && dst(target) < getWeapon().bullet.range())){ mech.canHeal && dst(target) < getWeapon().bullet.range())){
target = null; target = null;
} }
@@ -635,7 +636,7 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
if(dst(moveTarget) < 2f){ if(dst(moveTarget) < 2f){
if(tapping){ if(tapping){
Tile tile = ((TileEntity) moveTarget).tile; Tile tile = ((TileEntity)moveTarget).tile;
tile.block().tapped(tile, this); tile.block().tapped(tile, this);
} }
@@ -695,7 +696,7 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
if(target != null && dst(target) > getWeapon().bullet.range()){ if(target != null && dst(target) > getWeapon().bullet.range()){
target = null; target = null;
}else if(target != null){ }else if(target != null){
target = ((Tile) target).entity; target = ((Tile)target).entity;
} }
} }
@@ -703,7 +704,7 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
setMineTile(null); setMineTile(null);
} }
} }
}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 && dst(target) < getWeapon().bullet.range())){ mech.canHeal && dst(target) < getWeapon().bullet.range())){
//rotate toward and shoot the target //rotate toward and shoot the target
if(mech.turnCursor){ if(mech.turnCursor){
@@ -840,7 +841,7 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
buffer.writeByte(mech.id); buffer.writeByte(mech.id);
buffer.writeInt(mining == null ? noSpawner : mining.pos()); buffer.writeInt(mining == null ? noSpawner : mining.pos());
buffer.writeInt(spawner == null ? noSpawner : spawner.getTile().pos()); buffer.writeInt(spawner == null ? noSpawner : spawner.getTile().pos());
buffer.writeShort((short) (baseRotation * 2)); buffer.writeShort((short)(baseRotation * 2));
writeBuilding(buffer); writeBuilding(buffer);
} }

View File

@@ -20,18 +20,11 @@ import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.game.EventType.BlockDestroyEvent; import io.anuke.mindustry.game.EventType.BlockDestroyEvent;
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.world.Block; import io.anuke.mindustry.world.*;
import io.anuke.mindustry.world.Edges;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.defense.Wall; import io.anuke.mindustry.world.blocks.defense.Wall;
import io.anuke.mindustry.world.modules.ConsumeModule; import io.anuke.mindustry.world.modules.*;
import io.anuke.mindustry.world.modules.ItemModule;
import io.anuke.mindustry.world.modules.LiquidModule;
import io.anuke.mindustry.world.modules.PowerModule;
import java.io.DataInput; import java.io.*;
import java.io.DataOutput;
import java.io.IOException;
import static io.anuke.mindustry.Vars.tileGroup; import static io.anuke.mindustry.Vars.tileGroup;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
@@ -39,7 +32,7 @@ import static io.anuke.mindustry.Vars.world;
public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
public static final float timeToSleep = 60f * 4; //4 seconds to fall asleep public static final float timeToSleep = 60f * 4; //4 seconds to fall asleep
private static final ObjectSet<Tile> tmpTiles = new ObjectSet<>(); private static final ObjectSet<Tile> tmpTiles = new ObjectSet<>();
/**This value is only used for debugging.*/ /** This value is only used for debugging. */
public static int sleepingEntities = 0; public static int sleepingEntities = 0;
public Tile tile; public Tile tile;
@@ -53,7 +46,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
public LiquidModule liquids; public LiquidModule liquids;
public ConsumeModule cons; public ConsumeModule cons;
/**List of (cached) tiles with entities in proximity, used for outputting to*/ /** List of (cached) tiles with entities in proximity, used for outputting to */
private Array<Tile> proximity = new Array<>(8); private Array<Tile> proximity = new Array<>(8);
private boolean dead = false; private boolean dead = false;
private boolean sleeping; private boolean sleeping;
@@ -76,7 +69,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
tile.entity.onDeath(); tile.entity.onDeath();
} }
/**Sets this tile entity data to this tile, and adds it if necessary.*/ /** Sets this tile entity data to this tile, and adds it if necessary. */
public TileEntity init(Tile tile, boolean shouldAdd){ public TileEntity init(Tile tile, boolean shouldAdd){
this.tile = tile; this.tile = tile;
x = tile.drawx(); x = tile.drawx();
@@ -93,12 +86,12 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
return this; return this;
} }
/**Scaled delta.*/ /** Scaled delta. */
public float delta(){ public float delta(){
return Time.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 += Time.delta(); sleepTime += Time.delta();
if(!sleeping && sleepTime >= timeToSleep){ if(!sleeping && sleepTime >= timeToSleep){
@@ -108,7 +101,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
} }
} }
/**Call when this entity is updating. This wakes it up.*/ /** Call when this entity is updating. This wakes it up. */
public void noSleep(){ public void noSleep(){
sleepTime = 0f; sleepTime = 0f;
if(sleeping){ if(sleeping){
@@ -126,13 +119,17 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
return dead || tile.entity != this; return dead || tile.entity != this;
} }
public void write(DataOutput stream) throws IOException{} public void write(DataOutput stream) throws IOException{
}
public void writeConfig(DataOutput stream) throws IOException{} public void writeConfig(DataOutput stream) throws IOException{
}
public void read(DataInput stream) throws IOException{} public void read(DataInput stream) throws IOException{
}
public void readConfig(DataInput stream) throws IOException{} public void readConfig(DataInput stream) throws IOException{
}
public boolean collide(Bullet other){ public boolean collide(Bullet other){
return true; return true;
@@ -269,7 +266,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
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 < block.health && !(block instanceof Wall) && if(health != 0 && health < block.health && !(block instanceof Wall) &&
Mathf.chance(0.009f * Time.delta() * (1f - health / block.health))){ Mathf.chance(0.009f * Time.delta() * (1f - health / 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));
} }

View File

@@ -24,26 +24,21 @@ import io.anuke.mindustry.game.Teams.TeamData;
import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.graphics.Pal;
import io.anuke.mindustry.net.Interpolator; import io.anuke.mindustry.net.Interpolator;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.*;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.StatusEffect;
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 java.io.DataInput; import java.io.*;
import java.io.DataOutput;
import java.io.IOException;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
public abstract class Unit extends DestructibleEntity implements SaveTrait, TargetTrait, SyncTrait, DrawTrait, TeamTrait{ public abstract class Unit extends DestructibleEntity implements SaveTrait, TargetTrait, SyncTrait, DrawTrait, TeamTrait{
/**Total duration of hit flash effect*/ /** Total duration of hit flash effect */
public static final float hitDuration = 9f; public static final float hitDuration = 9f;
/**Percision divisor of velocity, used when writing. For example a value of '2' would mean the percision is 1/2 = 0.5-size chunks.*/ /** Percision divisor of velocity, used when writing. For example a value of '2' would mean the percision is 1/2 = 0.5-size chunks. */
public static final float velocityPercision = 8f; public static final float velocityPercision = 8f;
/**Maximum absolute value of a velocity vector component.*/ /** Maximum absolute value of a velocity vector component. */
public static final float maxAbsVelocity = 127f / velocityPercision; public static final float maxAbsVelocity = 127f / velocityPercision;
public static final int noSpawner = Pos.get(-1, 1); public static final int noSpawner = Pos.get(-1, 1);
@@ -106,9 +101,9 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
if(isDead()) return false; if(isDead()) return false;
if(other instanceof DamageTrait){ if(other instanceof DamageTrait){
return other instanceof TeamTrait && state.teams.areEnemies((((TeamTrait) other).getTeam()), team); return other instanceof TeamTrait && state.teams.areEnemies((((TeamTrait)other).getTeam()), team);
}else{ }else{
return other instanceof Unit && ((Unit) other).isFlying() == isFlying(); return other instanceof Unit && ((Unit)other).isFlying() == isFlying();
} }
} }
@@ -198,10 +193,10 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
stream.writeBoolean(isDead()); stream.writeBoolean(isDead());
stream.writeFloat(net ? interpolator.target.x : x); stream.writeFloat(net ? interpolator.target.x : x);
stream.writeFloat(net ? interpolator.target.y : y); stream.writeFloat(net ? interpolator.target.y : y);
stream.writeByte((byte) (Mathf.clamp(velocity.x, -maxAbsVelocity, maxAbsVelocity) * velocityPercision)); stream.writeByte((byte)(Mathf.clamp(velocity.x, -maxAbsVelocity, maxAbsVelocity) * velocityPercision));
stream.writeByte((byte) (Mathf.clamp(velocity.y, -maxAbsVelocity, maxAbsVelocity) * velocityPercision)); stream.writeByte((byte)(Mathf.clamp(velocity.y, -maxAbsVelocity, maxAbsVelocity) * velocityPercision));
stream.writeShort((short) (rotation * 2)); stream.writeShort((short)(rotation * 2));
stream.writeShort((short) health); stream.writeShort((short)health);
stream.writeByte(item.item.id); stream.writeByte(item.item.id);
stream.writeShort((short)item.amount); stream.writeShort((short)item.amount);
status.writeSave(stream); status.writeSave(stream);
@@ -258,10 +253,10 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
moveVector.setZero(); moveVector.setZero();
for(int cx = -rad; cx <= rad; cx++){ for(int cx = -rad; cx <= rad; cx++){
for(int cy = -rad; cy <= rad; cy++){ for(int cy = -rad; cy <= rad; cy++){
Tile tile = world.tileWorld(x + cx*tilesize, y + cy*tilesize); Tile tile = world.tileWorld(x + cx * tilesize, y + cy * tilesize);
if(tile == null) continue; if(tile == null) continue;
int weight = flying ? tile.airWeight : tile.weight; int weight = flying ? tile.airWeight : tile.weight;
float scl = (rad - Mathf.dst(tile.worldx(), tile.worldy(), x, y)/(8f * 1.2f * Mathf.sqrt2)) * 0.1f; float scl = (rad - Mathf.dst(tile.worldx(), tile.worldy(), x, y) / (8f * 1.2f * Mathf.sqrt2)) * 0.1f;
moveVector.add(Mathf.sign(x - tile.worldx()) * scaling * weight * scl, Mathf.sign(y - tile.worldy()) * scaling * weight * scl); moveVector.add(Mathf.sign(x - tile.worldx()) * scaling * weight * scl, Mathf.sign(y - tile.worldy()) * scaling * weight * scl);
} }
@@ -301,12 +296,13 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
public Floor getFloorOn(){ public Floor getFloorOn(){
Tile tile = world.tileWorld(x, y); Tile tile = world.tileWorld(x, y);
return tile == null ? (Floor) Blocks.air : tile.floor(); return tile == null ? (Floor)Blocks.air : tile.floor();
} }
public void onRespawn(Tile tile){} public void onRespawn(Tile tile){
}
/**Updates velocity and status effects.*/ /** Updates velocity and status effects. */
public void updateVelocityStatus(){ public void updateVelocityStatus(){
Floor floor = getFloorOn(); Floor floor = getFloorOn();
@@ -314,7 +310,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
status.update(this); status.update(this);
velocity.limit(maxVelocity()).scl(1f + (status.getSpeedMultiplier()-1f) * Time.delta()); velocity.limit(maxVelocity()).scl(1f + (status.getSpeedMultiplier() - 1f) * Time.delta());
if(x < -finalWorldBounds || y < -finalWorldBounds || x >= world.width() * tilesize + finalWorldBounds || y >= world.height() * tilesize + finalWorldBounds){ if(x < -finalWorldBounds || y < -finalWorldBounds || x >= world.width() * tilesize + finalWorldBounds || y >= world.height() * tilesize + finalWorldBounds){
kill(); kill();
@@ -420,7 +416,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
} }
public void drawStats(){ public void drawStats(){
Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Time.time(), healthf()*5f, 1f - healthf())); Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Time.time(), healthf() * 5f, 1f - healthf()));
Draw.rect(getPowerCellRegion(), x, y, rotation - 90); Draw.rect(getPowerCellRegion(), x, y, rotation - 90);
Draw.color(); Draw.color();
} }

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