Compare commits
150 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
33d4ab9edb | ||
|
|
f7f2b3438c | ||
|
|
0ed7934df0 | ||
|
|
55920e6242 | ||
|
|
820920e5f9 | ||
|
|
8e21c627a7 | ||
|
|
6973ed7d55 | ||
|
|
0980495a28 | ||
|
|
5c6b659ce3 | ||
|
|
35e263223d | ||
|
|
07ba378095 | ||
|
|
6e10f86546 | ||
|
|
fc6ee11ffe | ||
|
|
84cd87370f | ||
|
|
822fe9ab7a | ||
|
|
57b22a9cab | ||
|
|
278c4f17e5 | ||
|
|
b0d4607798 | ||
|
|
3f7dc66ac0 | ||
|
|
1c2b1fb757 | ||
|
|
eb31483a15 | ||
|
|
8fb7cdaba6 | ||
|
|
61d81046ae | ||
|
|
0c3d7e09e0 | ||
|
|
a9f9ddcacf | ||
|
|
a559c3581e | ||
|
|
dd5389c738 | ||
|
|
ac25e17286 | ||
|
|
9de4c89e76 | ||
|
|
2f6846d8c3 | ||
|
|
c3e60531c4 | ||
|
|
44aff82a6c | ||
|
|
7619e7643d | ||
|
|
353ef05b93 | ||
|
|
2801e4ed80 | ||
|
|
173dd0a90e | ||
|
|
e5412aeb1b | ||
|
|
0eec955a3d | ||
|
|
47038ac06d | ||
|
|
8041c305ad | ||
|
|
e0d249898e | ||
|
|
a1f5982a85 | ||
|
|
3c688d3fec | ||
|
|
889a9a7a05 | ||
|
|
ce6c39b7aa | ||
|
|
2a1fdded72 | ||
|
|
2b757fe107 | ||
|
|
a8d78453ff | ||
|
|
2b88396aac | ||
|
|
f856ad16ba | ||
|
|
f36d47c13f | ||
|
|
4f98bc95a2 | ||
|
|
ec3dc867c1 | ||
|
|
7fea7e91aa | ||
|
|
1ea545ccb2 | ||
|
|
e5e2d0ab03 | ||
|
|
c94e7aa031 | ||
|
|
5d1af6fb76 | ||
|
|
3b400ac3f3 | ||
|
|
308176ee81 | ||
|
|
8a84ebb58d | ||
|
|
158d11d3ba | ||
|
|
beec1eeaba | ||
|
|
63a1f4e2de | ||
|
|
7d845951e9 | ||
|
|
48d9ea6aa1 | ||
|
|
ae83e604ba | ||
|
|
c156968be6 | ||
|
|
effe2312e0 | ||
|
|
1c389dc7f8 | ||
|
|
972ca71978 | ||
|
|
fb35adb494 | ||
|
|
22813b71ff | ||
|
|
02243d1f5c | ||
|
|
e2b2e8fb4e | ||
|
|
390ceb8887 | ||
|
|
2167a3d7fe | ||
|
|
6f2033a455 | ||
|
|
2ae7863cae | ||
|
|
02b42c51da | ||
|
|
0ba26b22c0 | ||
|
|
017552f573 | ||
|
|
01a3c772e7 | ||
|
|
5693605f31 | ||
|
|
481881aa8b | ||
|
|
544660c4bb | ||
|
|
3d8d84177b | ||
|
|
789e354400 | ||
|
|
4fdb817d4a | ||
|
|
4055361501 | ||
|
|
416007593f | ||
|
|
4ed9f10c1b | ||
|
|
178cb12f85 | ||
|
|
c0582cd527 | ||
|
|
39e47db8c7 | ||
|
|
ed4156850b | ||
|
|
5364522a5a | ||
|
|
3382d56590 | ||
|
|
1e30c46322 | ||
|
|
3eb72d6d86 | ||
|
|
2d01c41159 | ||
|
|
0b3dddcc9e | ||
|
|
bc7085826e | ||
|
|
f78ee66049 | ||
|
|
fecaf768ab | ||
|
|
ec59cb602c | ||
|
|
2ea1671739 | ||
|
|
f7e4936445 | ||
|
|
d37e8c2e75 | ||
|
|
fb8dcc5f86 | ||
|
|
4c4c361093 | ||
|
|
9c29706297 | ||
|
|
4dcac119d8 | ||
|
|
f9dfd5b0b5 | ||
|
|
10dcd9cb2d | ||
|
|
c80e800ac9 | ||
|
|
eafcbf0914 | ||
|
|
4f561a3875 | ||
|
|
5cc92506c9 | ||
|
|
2c8eb1e5b8 | ||
|
|
6c18634b0d | ||
|
|
c7bd9dd0fa | ||
|
|
d8ec231a5e | ||
|
|
5c803594fb | ||
|
|
cececa190a | ||
|
|
38a3f1839e | ||
|
|
2eb57ab680 | ||
|
|
f6f1ddb826 | ||
|
|
fcdbd4b117 | ||
|
|
a5c44e7998 | ||
|
|
8afea88023 | ||
|
|
75443e4dfc | ||
|
|
fbfb491dca | ||
|
|
082c17da85 | ||
|
|
88ebf4f9db | ||
|
|
18825b1697 | ||
|
|
551b11877d | ||
|
|
0bd1b4eedc | ||
|
|
d401d7838c | ||
|
|
8b2e273d41 | ||
|
|
bdff6f9560 | ||
|
|
bb500a53ef | ||
|
|
7ff0811764 | ||
|
|
36b49b6d8b | ||
|
|
e8edfb1170 | ||
|
|
bc6fcbc86d | ||
|
|
8853ca303e | ||
|
|
914a6fc89b | ||
|
|
028be85468 | ||
|
|
5ffc285e1c |
3
.github/workflows/deployment.yml
vendored
@@ -47,7 +47,8 @@ jobs:
|
|||||||
git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
|
git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
|
||||||
cd ../MindustryBuilds
|
cd ../MindustryBuilds
|
||||||
echo "Updating version to ${RELEASE_VERSION:1}"
|
echo "Updating version to ${RELEASE_VERSION:1}"
|
||||||
echo versionName=7-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${GITHUB_RUN_NUMBER} > version_fdroid.txt
|
BNUM=$(($GITHUB_RUN_NUMBER + 1000))
|
||||||
|
echo versionName=7-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${BNUM} > version_fdroid.txt
|
||||||
git add .
|
git add .
|
||||||
git commit -m "Updating to build ${RELEASE_VERSION:1}"
|
git commit -m "Updating to build ${RELEASE_VERSION:1}"
|
||||||
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds
|
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds
|
||||||
|
|||||||
1
.gitignore
vendored
@@ -1,4 +1,5 @@
|
|||||||
logs/
|
logs/
|
||||||
|
/fastlane/metadata/android/en-US/changelogs/
|
||||||
/core/assets/mindustry-saves/
|
/core/assets/mindustry-saves/
|
||||||
/core/assets/mindustry-maps/
|
/core/assets/mindustry-maps/
|
||||||
/core/assets/bundles/output/
|
/core/assets/bundles/output/
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
android:isGame="true"
|
android:isGame="true"
|
||||||
|
android:theme="@style/ArcTheme"
|
||||||
android:usesCleartextTraffic="true"
|
android:usesCleartextTraffic="true"
|
||||||
android:appCategory="game"
|
android:appCategory="game"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
|
|||||||
@@ -100,6 +100,9 @@ android{
|
|||||||
all{
|
all{
|
||||||
minifyEnabled = true
|
minifyEnabled = true
|
||||||
shrinkResources = true
|
shrinkResources = true
|
||||||
|
//this is the ONLY WAY I could find to force r8 to keep its filthy hands off of my default interfaces.
|
||||||
|
//may have undesirable side effects
|
||||||
|
debuggable = true
|
||||||
proguardFiles("proguard-rules.pro")
|
proguardFiles("proguard-rules.pro")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
11
android/res/values-v21/styles.xml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<style name="ArcTheme" parent="android:Theme.Material.NoActionBar">
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||||
|
<item name="android:windowAnimationStyle">@android:style/Animation</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
10
android/res/values/styles.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<resources>
|
||||||
|
<style name="ArcTheme" parent="android:Theme">
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||||
|
<item name="android:windowAnimationStyle">@android:style/Animation</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
@@ -84,9 +84,9 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
try{
|
try{
|
||||||
//try to load own class first
|
//try to load own class first
|
||||||
loadedClass = findClass(name);
|
loadedClass = findClass(name);
|
||||||
}catch(ClassNotFoundException e){
|
}catch(ClassNotFoundException | NoClassDefFoundError e){
|
||||||
//use parent if not found
|
//use parent if not found
|
||||||
loadedClass = super.loadClass(name, resolve);
|
return parent.loadClass(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package mindustry.annotations.impl;
|
package mindustry.annotations.impl;
|
||||||
|
|
||||||
|
import arc.*;
|
||||||
|
import arc.audio.*;
|
||||||
import arc.files.*;
|
import arc.files.*;
|
||||||
import arc.scene.style.*;
|
import arc.scene.style.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
@@ -87,18 +89,18 @@ public class AssetsProcess extends BaseProcessor{
|
|||||||
filename = filename.substring(0, filename.indexOf("."));
|
filename = filename.substring(0, filename.indexOf("."));
|
||||||
|
|
||||||
String sfilen = filename;
|
String sfilen = filename;
|
||||||
String dtype = p.name().endsWith(".9.png") ? "arc.scene.style.NinePatchDrawable" : "arc.scene.style.TextureRegionDrawable";
|
String dtype = "arc.scene.style.Drawable";
|
||||||
|
|
||||||
String varname = capitalize(sfilen);
|
String varname = capitalize(sfilen);
|
||||||
|
|
||||||
if(SourceVersion.isKeyword(varname)) varname += "s";
|
if(SourceVersion.isKeyword(varname)) varname += "s";
|
||||||
|
|
||||||
type.addField(ClassName.bestGuess(dtype), varname, Modifier.STATIC, Modifier.PUBLIC);
|
type.addField(ClassName.bestGuess(dtype), varname, Modifier.STATIC, Modifier.PUBLIC);
|
||||||
load.addStatement(varname + " = (" + dtype + ")arc.Core.atlas.drawable($S)", sfilen);
|
load.addStatement(varname + " = arc.Core.atlas.drawable($S)", sfilen);
|
||||||
});
|
});
|
||||||
|
|
||||||
for(Element elem : elements){
|
for(Element elem : elements){
|
||||||
Seq.with(((TypeElement)elem).getEnclosedElements()).each(e -> e.getKind() == ElementKind.FIELD, field -> {
|
Seq.with(elem.getEnclosedElements()).each(e -> e.getKind() == ElementKind.FIELD, field -> {
|
||||||
String fname = field.getSimpleName().toString();
|
String fname = field.getSimpleName().toString();
|
||||||
if(fname.startsWith("default")){
|
if(fname.startsWith("default")){
|
||||||
loadStyles.addStatement("arc.Core.scene.addStyle(" + field.asType().toString() + ".class, mindustry.ui.Styles." + fname + ")");
|
loadStyles.addStatement("arc.Core.scene.addStyle(" + field.asType().toString() + ".class, mindustry.ui.Styles." + fname + ")");
|
||||||
@@ -118,13 +120,35 @@ public class AssetsProcess extends BaseProcessor{
|
|||||||
void processSounds(String classname, String path, String rtype) throws Exception{
|
void processSounds(String classname, String path, String rtype) throws Exception{
|
||||||
TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC);
|
||||||
MethodSpec.Builder loadBegin = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
MethodSpec.Builder loadBegin = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
CodeBlock.Builder staticb = CodeBlock.builder();
|
||||||
|
|
||||||
|
type.addField(FieldSpec.builder(IntMap.class, "idToSound", Modifier.STATIC, Modifier.PRIVATE).initializer("new IntMap()").build());
|
||||||
|
type.addField(FieldSpec.builder(ObjectIntMap.class, "soundToId", Modifier.STATIC, Modifier.PRIVATE).initializer("new ObjectIntMap()").build());
|
||||||
|
|
||||||
|
type.addMethod(MethodSpec.methodBuilder("getSoundId")
|
||||||
|
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||||
|
.addParameter(Sound.class, "sound")
|
||||||
|
.returns(int.class)
|
||||||
|
.addStatement("return soundToId.get(sound, -1)").build());
|
||||||
|
|
||||||
|
type.addMethod(MethodSpec.methodBuilder("getSound")
|
||||||
|
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||||
|
.addParameter(int.class, "id")
|
||||||
|
.returns(Sound.class)
|
||||||
|
.addStatement("return (Sound)idToSound.get(id, () -> Sounds.none)").build());
|
||||||
|
|
||||||
HashSet<String> names = new HashSet<>();
|
HashSet<String> names = new HashSet<>();
|
||||||
Fi.get(path).walk(p -> {
|
Seq<Fi> files = new Seq<>();
|
||||||
|
Fi.get(path).walk(files::add);
|
||||||
|
|
||||||
|
files.sortComparing(Fi::name);
|
||||||
|
int id = 0;
|
||||||
|
|
||||||
|
for(Fi p : files){
|
||||||
String name = p.nameWithoutExtension();
|
String name = p.nameWithoutExtension();
|
||||||
|
|
||||||
if(names.contains(name)){
|
if(names.contains(name)){
|
||||||
BaseProcessor.err("Duplicate file name: " + p.toString() + "!");
|
BaseProcessor.err("Duplicate file name: " + p + "!");
|
||||||
}else{
|
}else{
|
||||||
names.add(name);
|
names.add(name);
|
||||||
}
|
}
|
||||||
@@ -133,14 +157,20 @@ public class AssetsProcess extends BaseProcessor{
|
|||||||
|
|
||||||
String filepath = path.substring(path.lastIndexOf("/") + 1) + p.path().substring(p.path().lastIndexOf(path) + path.length());
|
String filepath = path.substring(path.lastIndexOf("/") + 1) + p.path().substring(p.path().lastIndexOf(path) + path.length());
|
||||||
|
|
||||||
String filename = "\"" + filepath + "\"";
|
staticb.addStatement("soundToId.put($L, $L)", name, id);
|
||||||
loadBegin.addStatement("arc.Core.assets.load(" + filename + ", " + rtype + ".class).loaded = a -> " + name + " = (" + rtype + ")a", filepath, filepath.replace(".ogg", ".mp3"));
|
|
||||||
|
|
||||||
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.audio." + rtype.substring(rtype.lastIndexOf(".") + 1) + "()").build());
|
loadBegin.addStatement("$T.assets.load($S, $L.class).loaded = a -> { $L = ($L)a; soundToId.put(a, $L); idToSound.put($L, a); }",
|
||||||
});
|
Core.class, filepath, rtype, name, rtype, id, id);
|
||||||
|
|
||||||
|
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new " + rtype + "()").build());
|
||||||
|
|
||||||
|
id ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
type.addStaticBlock(staticb.build());
|
||||||
|
|
||||||
if(classname.equals("Sounds")){
|
if(classname.equals("Sounds")){
|
||||||
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.audio." + rtype.substring(rtype.lastIndexOf(".") + 1) + "()").build());
|
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new " + rtype + "()").build());
|
||||||
}
|
}
|
||||||
|
|
||||||
type.addMethod(loadBegin.build());
|
type.addMethod(loadBegin.build());
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.sun.tools.javac.code.Attribute.Enum;
|
|||||||
import com.sun.tools.javac.code.Attribute.Error;
|
import com.sun.tools.javac.code.Attribute.Error;
|
||||||
import com.sun.tools.javac.code.Attribute.Visitor;
|
import com.sun.tools.javac.code.Attribute.Visitor;
|
||||||
import com.sun.tools.javac.code.Attribute.*;
|
import com.sun.tools.javac.code.Attribute.*;
|
||||||
|
import com.sun.tools.javac.code.Scope.*;
|
||||||
import com.sun.tools.javac.code.Type;
|
import com.sun.tools.javac.code.Type;
|
||||||
import com.sun.tools.javac.code.Symbol.*;
|
import com.sun.tools.javac.code.Symbol.*;
|
||||||
import com.sun.tools.javac.code.Type.ArrayType;
|
import com.sun.tools.javac.code.Type.ArrayType;
|
||||||
@@ -64,36 +65,13 @@ public class AnnotationProxyMaker{
|
|||||||
LinkedHashMap map = new LinkedHashMap();
|
LinkedHashMap map = new LinkedHashMap();
|
||||||
ClassSymbol cl = (ClassSymbol)this.anno.type.tsym;
|
ClassSymbol cl = (ClassSymbol)this.anno.type.tsym;
|
||||||
|
|
||||||
//try to use Java 8 API for this if possible
|
for(Symbol s : cl.members().getSymbols(LookupKind.NON_RECURSIVE)){
|
||||||
try{
|
if(s.getKind() == ElementKind.METHOD){
|
||||||
Class entryClass = Class.forName("com.sun.tools.javac.code.Scope$Entry");
|
MethodSymbol var4 = (MethodSymbol)s;
|
||||||
Object members = cl.members();
|
Attribute var5 = var4.getDefaultValue();
|
||||||
Field field = members.getClass().getField("elems");
|
if(var5 != null){
|
||||||
Object elems = field.get(members);
|
map.put(var4, var5);
|
||||||
Field siblingField = entryClass.getField("sibling");
|
|
||||||
Field symField = entryClass.getField("sym");
|
|
||||||
for(Object currEntry = elems; currEntry != null; currEntry = siblingField.get(currEntry)){
|
|
||||||
handleSymbol((Symbol)symField.get(currEntry), map);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}catch(Throwable e){
|
|
||||||
//otherwise try other API
|
|
||||||
|
|
||||||
try{
|
|
||||||
Class lookupClass = Class.forName("com.sun.tools.javac.code.Scope$LookupKind");
|
|
||||||
Field nonRecField = lookupClass.getField("NON_RECURSIVE");
|
|
||||||
Object nonRec = nonRecField.get(null);
|
|
||||||
Scope scope = cl.members();
|
|
||||||
Method getSyms = scope.getClass().getMethod("getSymbols", lookupClass);
|
|
||||||
Iterable<Symbol> it = (Iterable<Symbol>)getSyms.invoke(scope, nonRec);
|
|
||||||
Iterator<Symbol> i = it.iterator();
|
|
||||||
while(i.hasNext()){
|
|
||||||
handleSymbol(i.next(), map);
|
|
||||||
}
|
|
||||||
|
|
||||||
}catch(Throwable death){
|
|
||||||
//I tried
|
|
||||||
throw new RuntimeException(death);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,17 +82,6 @@ public class AnnotationProxyMaker{
|
|||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleSymbol(Symbol sym, LinkedHashMap map){
|
|
||||||
|
|
||||||
if(sym.getKind() == ElementKind.METHOD){
|
|
||||||
MethodSymbol var4 = (MethodSymbol)sym;
|
|
||||||
Attribute var5 = var4.getDefaultValue();
|
|
||||||
if(var5 != null){
|
|
||||||
map.put(var4, var5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Object generateValue(MethodSymbol var1, Attribute var2){
|
private Object generateValue(MethodSymbol var1, Attribute var2){
|
||||||
AnnotationProxyMaker.ValueVisitor var3 = new AnnotationProxyMaker.ValueVisitor(var1);
|
AnnotationProxyMaker.ValueVisitor var3 = new AnnotationProxyMaker.ValueVisitor(var1);
|
||||||
return var3.getValue(var2);
|
return var3.getValue(var2);
|
||||||
|
|||||||
@@ -12,6 +12,10 @@ import java.lang.Class;
|
|||||||
import java.lang.annotation.*;
|
import java.lang.annotation.*;
|
||||||
import java.lang.reflect.*;
|
import java.lang.reflect.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper over Element with added utility functions.
|
||||||
|
* I would have preferred to use extension methods for this, but Java doesn't have any.
|
||||||
|
* */
|
||||||
public class Selement<T extends Element>{
|
public class Selement<T extends Element>{
|
||||||
public final T e;
|
public final T e;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:collided,type:arc.struct.IntSeq},{name:damage,type:float},{name:data,type:java.lang.Object},{name:fdata,type:float},{name:lifetime,type:float},{name:owner,type:mindustry.gen.Entityc},{name:rotation,type:float},{name:team,type:mindustry.game.Team},{name:time,type:float},{name:type,type:mindustry.entities.bullet.BulletType},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/alpha/2.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/arkyid/2.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/beta/2.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/block/6.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:6,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/corvus/6.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:6,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/flare/6.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:6,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/gamma/2.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/mace/6.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:6,fields:[{name:ammo,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/mega/4.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:4,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq<mindustry.world.blocks.payloads.Payload>},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/mono/5.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:5,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/nova/4.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:4,fields:[{name:ammo,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/oct/4.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:4,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq<mindustry.world.blocks.payloads.Payload>},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/poly/4.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:4,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/pulsar/2.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/quad/5.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:5,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq<mindustry.world.blocks.payloads.Payload>},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/quasar/2.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/risso/6.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:6,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/spiroct/5.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:5,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/toxopid/2.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]}
|
||||||
@@ -57,7 +57,7 @@ allprojects{
|
|||||||
if(!project.hasProperty("versionType")) versionType = 'official'
|
if(!project.hasProperty("versionType")) versionType = 'official'
|
||||||
appName = 'Mindustry'
|
appName = 'Mindustry'
|
||||||
steamworksVersion = '0b86023401880bb5e586bc404bedbaae9b1f1c94'
|
steamworksVersion = '0b86023401880bb5e586bc404bedbaae9b1f1c94'
|
||||||
rhinoVersion = '55bf0dac1cfa7770672fd26112512c733ca9d5dc'
|
rhinoVersion = '9f792d202471fb3789eab7bb261fec13d67287e2'
|
||||||
|
|
||||||
loadVersionProps = {
|
loadVersionProps = {
|
||||||
return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }
|
return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }
|
||||||
@@ -501,9 +501,11 @@ task deployAll{
|
|||||||
dependsOn "desktop:packrWindows64"
|
dependsOn "desktop:packrWindows64"
|
||||||
dependsOn "desktop:packrWindows32"
|
dependsOn "desktop:packrWindows32"
|
||||||
dependsOn "desktop:packrMacOS"
|
dependsOn "desktop:packrMacOS"
|
||||||
|
if(versionModifier != "steam"){
|
||||||
dependsOn "server:deploy"
|
dependsOn "server:deploy"
|
||||||
dependsOn "android:deploy"
|
dependsOn "android:deploy"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
task resolveDependencies{
|
task resolveDependencies{
|
||||||
doLast{
|
doLast{
|
||||||
|
|||||||
BIN
core/assets-raw/sprites/blocks/defense/force-projector-team.png
Normal file
|
After Width: | Height: | Size: 751 B |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.2 KiB |
BIN
core/assets-raw/sprites/ui/slider-back.9.png
Normal file
|
After Width: | Height: | Size: 197 B |
|
Before Width: | Height: | Size: 118 B After Width: | Height: | Size: 117 B |
|
Before Width: | Height: | Size: 123 B After Width: | Height: | Size: 120 B |
|
Before Width: | Height: | Size: 122 B After Width: | Height: | Size: 120 B |
|
Before Width: | Height: | Size: 72 B |
@@ -101,6 +101,7 @@ customgame = Custom Game
|
|||||||
newgame = New Game
|
newgame = New Game
|
||||||
none = <none>
|
none = <none>
|
||||||
none.found = [lightgray]<none found>
|
none.found = [lightgray]<none found>
|
||||||
|
none.inmap = [lightgray]<none in map>
|
||||||
minimap = Minimap
|
minimap = Minimap
|
||||||
position = Position
|
position = Position
|
||||||
close = Close
|
close = Close
|
||||||
@@ -806,6 +807,7 @@ bullet.reload = [stat]{0}[lightgray]x fire rate
|
|||||||
unit.blocks = blocks
|
unit.blocks = blocks
|
||||||
unit.blockssquared = blocks²
|
unit.blockssquared = blocks²
|
||||||
unit.powersecond = power units/second
|
unit.powersecond = power units/second
|
||||||
|
unit.tilessecond = tiles/second
|
||||||
unit.liquidsecond = liquid units/second
|
unit.liquidsecond = liquid units/second
|
||||||
unit.itemssecond = items/second
|
unit.itemssecond = items/second
|
||||||
unit.liquidunits = liquid units
|
unit.liquidunits = liquid units
|
||||||
@@ -994,6 +996,7 @@ rules.wavetimer = Wave Timer
|
|||||||
rules.waves = Waves
|
rules.waves = Waves
|
||||||
rules.attack = Attack Mode
|
rules.attack = Attack Mode
|
||||||
rules.buildai = AI Building
|
rules.buildai = AI Building
|
||||||
|
rules.cleanupdeadteams = Clean Up Defeated Team Buildings (PvP)
|
||||||
rules.corecapture = Capture Core On Destruction
|
rules.corecapture = Capture Core On Destruction
|
||||||
rules.polygoncoreprotection = Polygonal Core Protection
|
rules.polygoncoreprotection = Polygonal Core Protection
|
||||||
rules.enemyCheat = Infinite AI (Red Team) Resources
|
rules.enemyCheat = Infinite AI (Red Team) Resources
|
||||||
@@ -1592,7 +1595,7 @@ lst.set = Set a variable.
|
|||||||
lst.operation = Perform an operation on 1-2 variables.
|
lst.operation = Perform an operation on 1-2 variables.
|
||||||
lst.end = Jump to the top of the instruction stack.
|
lst.end = Jump to the top of the instruction stack.
|
||||||
lst.wait = Wait a certain number of seconds.
|
lst.wait = Wait a certain number of seconds.
|
||||||
lst.lookup = Look up a item/liquid/unit/block type by ID.\nTotal counts of each type can be accessed with:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
|
lst.lookup = Look up an item/liquid/unit/block type by ID.\nTotal counts of each type can be accessed with:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
|
||||||
lst.jump = Conditionally jump to another statement.
|
lst.jump = Conditionally jump to another statement.
|
||||||
lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[].
|
lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[].
|
||||||
lst.unitcontrol = Control the currently bound unit.
|
lst.unitcontrol = Control the currently bound unit.
|
||||||
|
|||||||
@@ -41,11 +41,13 @@ be.ignore = Ignorar
|
|||||||
be.noupdates = No se encontraron actualizaciones.
|
be.noupdates = No se encontraron actualizaciones.
|
||||||
be.check = Buscar actualizaciones
|
be.check = Buscar actualizaciones
|
||||||
|
|
||||||
mod.featured.title = Explorador de mods
|
mods.browser = Explorador de Mods
|
||||||
mod.featured.dialog.title = Explorador de Mods
|
|
||||||
mods.browser.selected = Mod seleccionado
|
mods.browser.selected = Mod seleccionado
|
||||||
mods.browser.add = Installar Mod
|
mods.browser.add = Instalar
|
||||||
mods.github.open = Abrir en Github
|
mods.browser.reinstall = Reinstalar
|
||||||
|
mods.github.open = Repositorio
|
||||||
|
mods.browser.sortdate = Más recientes
|
||||||
|
mods.browser.sortstars = Mejor valorados
|
||||||
|
|
||||||
schematic = Plantilla
|
schematic = Plantilla
|
||||||
schematic.add = Guardar plantilla...
|
schematic.add = Guardar plantilla...
|
||||||
@@ -55,16 +57,24 @@ schematic.exists = Ya existe una plantilla con ese nombre.
|
|||||||
schematic.import = Importar plantilla...
|
schematic.import = Importar plantilla...
|
||||||
schematic.exportfile = Exportar archivo
|
schematic.exportfile = Exportar archivo
|
||||||
schematic.importfile = Importar archivo
|
schematic.importfile = Importar archivo
|
||||||
schematic.browseworkshop = Buscar en el Steam Workshop
|
schematic.browseworkshop = Buscar en Steam Workshop
|
||||||
schematic.copy = Copiar al portapapeles.
|
schematic.copy = Copiar al portapapeles.
|
||||||
schematic.copy.import = Importar desde el portapapeles.
|
schematic.copy.import = Importar desde el portapapeles.
|
||||||
schematic.shareworkshop = Compartir en el Steam Workshop
|
schematic.shareworkshop = Compartir en Steam Workshop
|
||||||
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Girar plantilla
|
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Girar plantilla
|
||||||
schematic.saved = Plantilla guardada.
|
schematic.saved = Plantilla guardada.
|
||||||
schematic.delete.confirm = Se borrará ésta plantilla.
|
schematic.delete.confirm = Se borrará ésta plantilla.
|
||||||
schematic.rename = Renombrar plantilla
|
schematic.rename = Renombrar plantilla
|
||||||
schematic.info = {0}x{1}, {2} bloques
|
schematic.info = {0}x{1}, {2} bloques
|
||||||
schematic.disabled = [scarlet]Plantillas desactivadas.[]\nNo puedes usar plantillas en este [accent]mapa[] o [accent]servidor.
|
schematic.disabled = [scarlet]Plantillas desactivadas.[]\nNo puedes usar plantillas en este [accent]mapa[] o [accent]servidor.
|
||||||
|
schematic.tags = Etiquetas:
|
||||||
|
schematic.edittags = Editar Etiquetas
|
||||||
|
schematic.addtag = Añadir Etiqueta
|
||||||
|
schematic.texttag = Texto de Etiqueta
|
||||||
|
schematic.icontag = Icono de Etiqueta
|
||||||
|
schematic.renametag = Renombrar Etiqueta
|
||||||
|
schematic.tagdelconfirm = ¿Eliminar ésta etiqueta?
|
||||||
|
schematic.tagexists = Esa etiqueta ya existe.
|
||||||
|
|
||||||
stats = Estadísticas
|
stats = Estadísticas
|
||||||
stat.wave = Oleadas Derrotadas:[accent] {0}
|
stat.wave = Oleadas Derrotadas:[accent] {0}
|
||||||
@@ -77,12 +87,12 @@ stat.playtime = Tiempo jugado:[accent] {0}
|
|||||||
stat.rank = Rango final: [accent]{0}
|
stat.rank = Rango final: [accent]{0}
|
||||||
|
|
||||||
globalitems = [accent]Recursos Totales
|
globalitems = [accent]Recursos Totales
|
||||||
map.delete = ¿Estás seguro de que quieres borrar el mapa "[accent]{0}[]"?
|
map.delete = ¿Quieres borrar el mapa "[accent]{0}[]"?
|
||||||
level.highscore = Puntuación más alta: [accent]{0}
|
level.highscore = Puntuación más alta: [accent]{0}
|
||||||
level.select = Selección de nivel
|
level.select = Selección de Nivel
|
||||||
level.mode = Modo de juego:
|
level.mode = Modo de juego:
|
||||||
coreattack = < ¡El núcleo está bajo ataque! >
|
coreattack = < ¡El núcleo está bajo ataque! >
|
||||||
nearpoint = [[ [scarlet]ABANDONA EL PUNTO DE APARICIÓN INMEDIATAMENTE[] ]\nRiesgo de aniquilación inminente
|
nearpoint = [[ [scarlet]ABANDONA EL PUNTO DE ATERRIZAJE INMEDIATAMENTE[] ]\nRiesgo de aniquilación inminente
|
||||||
database = Base de datos
|
database = Base de datos
|
||||||
savegame = Guardar Partida
|
savegame = Guardar Partida
|
||||||
loadgame = Cargar Partida
|
loadgame = Cargar Partida
|
||||||
@@ -90,6 +100,7 @@ joingame = Unirse a Partida
|
|||||||
customgame = Crear Partida
|
customgame = Crear Partida
|
||||||
newgame = Nueva Partida
|
newgame = Nueva Partida
|
||||||
none = <no hay>
|
none = <no hay>
|
||||||
|
none.found = [lightgray]<no hay coincidencias>
|
||||||
minimap = Minimapa
|
minimap = Minimapa
|
||||||
position = Posición
|
position = Posición
|
||||||
close = Cerrar
|
close = Cerrar
|
||||||
@@ -110,17 +121,20 @@ committingchanges = Confirmando Cambios
|
|||||||
done = Hecho
|
done = Hecho
|
||||||
feature.unsupported = Tu dispositivo no es compatible con esta función.
|
feature.unsupported = Tu dispositivo no es compatible con esta función.
|
||||||
|
|
||||||
mods.alphainfo = Ten en cuenta que los mods estan en fase Alpha, y[scarlet] pueden tener varios errores[].\nReporta cualquier error que encuentres en la página de GitHub de Mindustry.
|
mods.initfailed = [red]⚠[] La anterior ejecución de Mindustry encontró un fallo al inicializarse. Seguramente fue causado por algún mod erróneo.\n\nPara evitar un bucle de erroes al iniciar el juego, [red]se han desactivado todos los mods.[]\n\nPuedes desactivar ésta medida de seguridad desde [accent]Opciones->Juego->Desactivar mods si el juego encuentra un error al iniciarse.[].
|
||||||
mods = Mods
|
mods = Mods
|
||||||
mods.none = [lightgray]¡No se encontraron Mods!
|
mods.none = [lightgray]¡No se encontraron Mods!
|
||||||
mods.guide = Guía de Modding
|
mods.guide = Guía sobre Mods
|
||||||
mods.report = Reportar Error
|
mods.report = Reportar Error
|
||||||
mods.openfolder = Abrir carpeta de mods
|
mods.openfolder = Abrir carpeta de mods
|
||||||
|
mods.viewcontent = Ver Contenido
|
||||||
mods.reload = Recargar
|
mods.reload = Recargar
|
||||||
mods.reloadexit = A continuación se cerrará el juego para recargar los mods.
|
mods.reloadexit = A continuación se cerrará el juego para recargar los mods.
|
||||||
|
mod.installed = [[Instalado]
|
||||||
mod.display = [gray]Mod:[orange] {0}
|
mod.display = [gray]Mod:[orange] {0}
|
||||||
mod.enabled = [lightgray]Activado
|
mod.enabled = [lightgray]Activado
|
||||||
mod.disabled = [scarlet]Desactivado
|
mod.disabled = [scarlet]Desactivado
|
||||||
|
mod.multiplayer.compatible = [gray]Compatible con Multijugador
|
||||||
mod.disable = Desactivar
|
mod.disable = Desactivar
|
||||||
mod.content = Contenido:
|
mod.content = Contenido:
|
||||||
mod.delete.error = No se pudo elminar el mod. Tal vez esté en uso por el juego.
|
mod.delete.error = No se pudo elminar el mod. Tal vez esté en uso por el juego.
|
||||||
@@ -130,20 +144,20 @@ mod.missingdependencies = [scarlet]Dependencias faltantes: {0}
|
|||||||
mod.erroredcontent = [scarlet]Contenido erróneo
|
mod.erroredcontent = [scarlet]Contenido erróneo
|
||||||
mod.errors = Ha ocurrido un fallo al cargar el contenido.
|
mod.errors = Ha ocurrido un fallo al cargar el contenido.
|
||||||
mod.noerrorplay = [scarlet]Se están ejecutando algunos mods con fallos.[]Deshabilítalos o arregla los errores antes de jugar.
|
mod.noerrorplay = [scarlet]Se están ejecutando algunos mods con fallos.[]Deshabilítalos o arregla los errores antes de jugar.
|
||||||
mod.nowdisabled = [scarlet]Al/Los Mod/s '{0}'le esta/n faltando dependencias:[accent] {1}\n[lightgray]Estos mods necesitan descargarse primero.\nEste mod será automaticamente desactivado.
|
mod.nowdisabled = [scarlet]El mod '{0}' necesita ejecutarse junto a otros mods de los que depende:[accent] {1}\n[lightgray]Es necesario descargar primero estos mods.\nEste mod será automaticamente desactivado.
|
||||||
mod.enable = Activar
|
mod.enable = Activar
|
||||||
mod.requiresrestart = El juego se cerrará para aplicar los mods.
|
mod.requiresrestart = El juego se cerrará para aplicar los mods.
|
||||||
mod.reloadrequired = [scarlet]Se requiere volver a cargar
|
mod.reloadrequired = [scarlet]Es necesario Reiniciar
|
||||||
mod.import = Importar mod
|
mod.import = Importar mod
|
||||||
mod.import.file = Importar archivo
|
mod.import.file = Importar archivo
|
||||||
mod.import.github = Importar Mod de Github
|
mod.import.github = Importar desde Github
|
||||||
mod.jarwarn = [scarlet]Los mods JAR pueden no ser seguros.[]\n¡Asegúrate de haberlos descargado de una fuente en la que confíes!
|
mod.jarwarn = [scarlet]Los mods JAR pueden no ser seguros.[]\n¡Asegúrate de haberlos descargado de una fuente en la que confíes!
|
||||||
mod.item.remove = Este objeto es parte del[accent] '{0}'[] mod. Para eliminarlo, desinstala ese mod.
|
mod.item.remove = Este objeto es parte del[accent] '{0}'[] mod. Para eliminarlo, desinstala ese mod.
|
||||||
mod.remove.confirm = Este mod va a ser eliminado.\n¿Quieres continuar?
|
mod.remove.confirm = Este mod va a ser eliminado.\n¿Quieres continuar?
|
||||||
mod.author = [lightgray]Autor:[] {0}
|
mod.author = [lightgray]Autor:[] {0}
|
||||||
mod.missing = Esta partida guardada usa mods que has actualizado recientemente o que no tienes instalados. Se puede corromper la partida guardada. ¿Quieres cargarla a pesar de ello?\n[lightgray]Mods:\n{0}
|
mod.missing = Esta partida guardada usa mods que has actualizado recientemente o que no tienes instalados. Se puede corromper la partida guardada. ¿Quieres cargarla a pesar de ello?\n[lightgray]Mods:\n{0}
|
||||||
mod.preview.missing = Antes de publicar este mod en el Steam Workshop, debe añadir una imagen de vista previa.\nAñada una imagen con nombre[accent] preview.png[] en la carpeta del mod e intente nuevamente.
|
mod.preview.missing = Antes de publicar este mod en Steam Workshop, debes añadir una imagen de vista previa.\nAñade una imagen llamada[accent] preview.png[] en la carpeta del mod e inténtalo de nuevo.
|
||||||
mod.folder.missing = Solo los mods en forma de carpeta se pueden publicar en el Steam Workshop.\nPara convertir cualquier mod en una carpeta, simplemente descomprima su archivo a una carpeta y elimine el zip anterior, luego reinicie su juego o vuelva a cargar sus mods.
|
mod.folder.missing = Sólo los mods en forma de carpeta se pueden publicar en Steam Workshop.\nPara convertir cualquier mod en una carpeta, descomprime su archivo a una carpeta y elimina el zip anterior, luego reinicia el juego o vuelve a cargar tus mods.
|
||||||
mod.scripts.disable = Tu dispositivo no es compatible con mods con scripts. Debes deshabilitar esos mods para jugar.
|
mod.scripts.disable = Tu dispositivo no es compatible con mods con scripts. Debes deshabilitar esos mods para jugar.
|
||||||
|
|
||||||
about.button = Acerca de...
|
about.button = Acerca de...
|
||||||
@@ -214,6 +228,8 @@ trace.ip = IP: [accent]{0}
|
|||||||
trace.id = ID Única: [accent]{0}
|
trace.id = ID Única: [accent]{0}
|
||||||
trace.mobile = Cliente de móvil: [accent]{0}
|
trace.mobile = Cliente de móvil: [accent]{0}
|
||||||
trace.modclient = Cliente Personalizado: [accent]{0}
|
trace.modclient = Cliente Personalizado: [accent]{0}
|
||||||
|
trace.times.joined = Se ha unido [accent]{0} []veces
|
||||||
|
trace.times.kicked = Fue expulsado [accent]{0} []veces
|
||||||
invalidid = ¡ID de cliente inválida! Por favor, envía un informe del error.
|
invalidid = ¡ID de cliente inválida! Por favor, envía un informe del error.
|
||||||
server.bans = Expulsiones
|
server.bans = Expulsiones
|
||||||
server.bans.none = No se ha baneado a ningún usuario aún
|
server.bans.none = No se ha baneado a ningún usuario aún
|
||||||
@@ -222,16 +238,16 @@ server.admins.none = ¡No hay ningún administrador!
|
|||||||
server.add = Agregar Servidor
|
server.add = Agregar Servidor
|
||||||
server.delete = ¿Estás seguro de querer borrar este servidor?
|
server.delete = ¿Estás seguro de querer borrar este servidor?
|
||||||
server.edit = Editar Servidor
|
server.edit = Editar Servidor
|
||||||
server.outdated = [crimson]¡Servidor desactualizado![]
|
server.outdated = [scarlet]¡Servidor Desactualizado![]
|
||||||
server.outdated.client = [crimson]¡Cliente desactualizado![]
|
server.outdated.client = [scarlet]¡Cliente Desactualizado![]
|
||||||
server.version = [lightgray]Versión: {0}
|
server.version = [gray]v{0} {1}
|
||||||
server.custombuild = [accent]Versión personalizada
|
server.custombuild = [accent]Versión Personalizada
|
||||||
confirmban = ¿Quieres banear a este jugador?
|
confirmban = ¿Quieres banear a "{0}[white]"?
|
||||||
confirmkick = ¿Estás seguro de querer expulsar este jugador?
|
confirmkick = ¿Quieres expulsar a "{0}[white]"?
|
||||||
confirmvotekick = ¿Estás de acuerdo en expulsar este jugador?
|
confirmvotekick = ¿Estás a favor de expulsar a "{0}[white]"?
|
||||||
confirmunban = ¿Quieres desbanear a este jugador?
|
confirmunban = ¿Quieres desbanear a este jugador?
|
||||||
confirmadmin = ¿Quieres hacer administrador a este jugador?
|
confirmadmin = ¿Quieres hacer administrador a "{0}[white]"?
|
||||||
confirmunadmin = ¿Quieres quitar los permisos de administrador a este jugador?
|
confirmunadmin = ¿Quieres quitarle los permisos de administrador a "{0}[white]"?
|
||||||
joingame.title = Unirse a Partida
|
joingame.title = Unirse a Partida
|
||||||
joingame.ip = IP:
|
joingame.ip = IP:
|
||||||
disconnect = Desconectado.
|
disconnect = Desconectado.
|
||||||
@@ -287,6 +303,7 @@ cancel = Cancelar
|
|||||||
openlink = Abrir Enlace
|
openlink = Abrir Enlace
|
||||||
copylink = Copiar Enlace
|
copylink = Copiar Enlace
|
||||||
back = Atrás
|
back = Atrás
|
||||||
|
max = Máximo
|
||||||
crash.export = Exportar Registros de errores
|
crash.export = Exportar Registros de errores
|
||||||
crash.none = No se encontraron Registros de errores.
|
crash.none = No se encontraron Registros de errores.
|
||||||
crash.exported = Registros de errores exportados.
|
crash.exported = Registros de errores exportados.
|
||||||
@@ -361,7 +378,6 @@ editor.center = Centrar
|
|||||||
workshop = Steam Workshop
|
workshop = Steam Workshop
|
||||||
waves.title = Oleadas
|
waves.title = Oleadas
|
||||||
waves.remove = Borrar
|
waves.remove = Borrar
|
||||||
waves.never = <nunca>
|
|
||||||
waves.every = cada
|
waves.every = cada
|
||||||
waves.waves = oleada(s)
|
waves.waves = oleada(s)
|
||||||
waves.perspawn = por lugar de aparición
|
waves.perspawn = por lugar de aparición
|
||||||
@@ -444,6 +460,7 @@ toolmode.drawteams = Dibujar Equipos
|
|||||||
toolmode.drawteams.description = Dibuja equipos en lugar de bloques.
|
toolmode.drawteams.description = Dibuja equipos en lugar de bloques.
|
||||||
|
|
||||||
filters.empty = [lightgray]¡No hay filtros! Añade uno con el botón de abajo.
|
filters.empty = [lightgray]¡No hay filtros! Añade uno con el botón de abajo.
|
||||||
|
|
||||||
filter.distort = Distorsionar
|
filter.distort = Distorsionar
|
||||||
filter.noise = Ruido
|
filter.noise = Ruido
|
||||||
filter.enemyspawn = Punto de aparición enemigo
|
filter.enemyspawn = Punto de aparición enemigo
|
||||||
@@ -460,19 +477,22 @@ filter.clear = Despejar
|
|||||||
filter.option.ignore = Ignorar
|
filter.option.ignore = Ignorar
|
||||||
filter.scatter = Dispersar
|
filter.scatter = Dispersar
|
||||||
filter.terrain = Terreno
|
filter.terrain = Terreno
|
||||||
|
|
||||||
filter.option.scale = Escala
|
filter.option.scale = Escala
|
||||||
filter.option.chance = Probabilidad
|
filter.option.chance = Probabilidad
|
||||||
filter.option.mag = Magnitud
|
filter.option.mag = Magnitud
|
||||||
filter.option.threshold = Umbral
|
filter.option.threshold = Umbral
|
||||||
filter.option.circle-scale = Escala del círculo
|
filter.option.circle-scale = Escala del círculo
|
||||||
filter.option.octaves = Continuidad
|
filter.option.octaves = Continuidad
|
||||||
filter.option.falloff = Aterrizaje
|
filter.option.falloff = Caída
|
||||||
filter.option.angle = Ángulo
|
filter.option.angle = Ángulo
|
||||||
|
filter.option.rotate = Rotación
|
||||||
filter.option.amount = Cantidad
|
filter.option.amount = Cantidad
|
||||||
filter.option.block = Bloque
|
filter.option.block = Bloque
|
||||||
filter.option.floor = Suelo
|
filter.option.floor = Suelo
|
||||||
filter.option.flooronto = Suelo objetivo
|
filter.option.flooronto = Suelo objetivo
|
||||||
filter.option.target = Target
|
filter.option.target = Objetivo
|
||||||
|
filter.option.replacement = Reemplazo
|
||||||
filter.option.wall = Muro
|
filter.option.wall = Muro
|
||||||
filter.option.ore = Veta
|
filter.option.ore = Veta
|
||||||
filter.option.floor2 = Terreno secundario
|
filter.option.floor2 = Terreno secundario
|
||||||
@@ -484,11 +504,12 @@ width = Ancho:
|
|||||||
height = Alto:
|
height = Alto:
|
||||||
menu = Menú
|
menu = Menú
|
||||||
play = Jugar
|
play = Jugar
|
||||||
campaign = Continuar Campaña
|
campaign = Campaña
|
||||||
load = Cargar
|
load = Cargar
|
||||||
save = Guardar
|
save = Guardar
|
||||||
fps = FPS: {0}
|
fps = FPS: {0}
|
||||||
ping = Ping: {0}ms
|
ping = Ping: {0}ms
|
||||||
|
tps = TPS: {0}
|
||||||
memory = Mem: {0}mb
|
memory = Mem: {0}mb
|
||||||
memory2 = Mem:\n {0}mb +\n {1}mb
|
memory2 = Mem:\n {0}mb +\n {1}mb
|
||||||
language.restart = Reinicia el juego para que los cambios en el idioma tengan efecto.
|
language.restart = Reinicia el juego para que los cambios en el idioma tengan efecto.
|
||||||
@@ -565,6 +586,7 @@ sector.attacked = Sector [accent]{0}[white] bajo ataque[]!
|
|||||||
sector.lost = ¡Sector [accent]{0}[white] perdido[]!
|
sector.lost = ¡Sector [accent]{0}[white] perdido[]!
|
||||||
#nota: el espacio en blanco en la línea siguiente es intencionado
|
#nota: el espacio en blanco en la línea siguiente es intencionado
|
||||||
sector.captured = ¡Sector [accent]{0}[white] capturado[]!
|
sector.captured = ¡Sector [accent]{0}[white] capturado[]!
|
||||||
|
sector.changeicon = Cambiar Icono
|
||||||
|
|
||||||
threat.low = Baja
|
threat.low = Baja
|
||||||
threat.medium = Media
|
threat.medium = Media
|
||||||
@@ -611,6 +633,20 @@ sector.extractionOutpost.description = Una base remota, construida por el enemig
|
|||||||
sector.impact0078.description = Aquí yacen las ruinas de la primera estación de transporte interestelar en estar operativa del sistema.\n\nRecupera todo lo posible de los escombros. Investiga cualquier tecnología intacta.
|
sector.impact0078.description = Aquí yacen las ruinas de la primera estación de transporte interestelar en estar operativa del sistema.\n\nRecupera todo lo posible de los escombros. Investiga cualquier tecnología intacta.
|
||||||
sector.planetaryTerminal.description = El objetivo final.\n\nÉsta base costera alberga una estructura capaz de lanzar Núcleos a planeteas locales. Está extremadamente bien protegida.\n\nProduce unidades navales. Acaba con el enemigo lo antes posible. Analiza la estructura de lanzamiento.
|
sector.planetaryTerminal.description = El objetivo final.\n\nÉsta base costera alberga una estructura capaz de lanzar Núcleos a planeteas locales. Está extremadamente bien protegida.\n\nProduce unidades navales. Acaba con el enemigo lo antes posible. Analiza la estructura de lanzamiento.
|
||||||
|
|
||||||
|
status.burning.name = En llamas
|
||||||
|
status.freezing.name = Congelado
|
||||||
|
status.wet.name = Húmedo
|
||||||
|
status.muddy.name = Fangoso
|
||||||
|
status.melting.name = Fundido
|
||||||
|
status.sapped.name = Debilitado
|
||||||
|
status.electrified.name = Electrificado
|
||||||
|
status.spore-slowed.name = Ralentizado
|
||||||
|
status.tarred.name = Alquitranado
|
||||||
|
status.overclock.name = Sobrecargado
|
||||||
|
status.shocked.name = Aturdido
|
||||||
|
status.blasted.name = Explotado
|
||||||
|
status.unmoving.name = Inmóvil
|
||||||
|
|
||||||
settings.language = Idioma
|
settings.language = Idioma
|
||||||
settings.data = Datos del Juego
|
settings.data = Datos del Juego
|
||||||
settings.reset = Reiniciar a los valores por defecto
|
settings.reset = Reiniciar a los valores por defecto
|
||||||
@@ -632,6 +668,7 @@ settings.clearcampaignsaves.confirm = ¿Quieres borrar tus partidas guardadas en
|
|||||||
paused = [accent] < Pausado >
|
paused = [accent] < Pausado >
|
||||||
clear = Vaciar
|
clear = Vaciar
|
||||||
banned = [scarlet]Baneado
|
banned = [scarlet]Baneado
|
||||||
|
unsupported.environment = [scarlet]Entorno no válido
|
||||||
yes = Sí
|
yes = Sí
|
||||||
no = No
|
no = No
|
||||||
info.title = Información
|
info.title = Información
|
||||||
@@ -641,12 +678,14 @@ unit.nobuild = [scarlet]Esta unidad no puede construir
|
|||||||
lastaccessed = [lightgray]Último usado: {0}
|
lastaccessed = [lightgray]Último usado: {0}
|
||||||
block.unknown = [lightgray]???
|
block.unknown = [lightgray]???
|
||||||
|
|
||||||
|
stat.showinmap = <cargar mapa para mostrar>
|
||||||
stat.description = Objetivo
|
stat.description = Objetivo
|
||||||
stat.input = Entrada
|
stat.input = Entrada
|
||||||
stat.output = Salida
|
stat.output = Salida
|
||||||
stat.booster = Potenciador
|
stat.booster = Potenciador
|
||||||
stat.tiles = Terreno requerido
|
stat.tiles = Terreno requerido
|
||||||
stat.affinities = Afinidades
|
stat.affinities = Afinidades
|
||||||
|
stat.opposites = Opuestos
|
||||||
stat.powercapacity = Capacidad de Energía
|
stat.powercapacity = Capacidad de Energía
|
||||||
stat.powershot = Energía/Disparo
|
stat.powershot = Energía/Disparo
|
||||||
stat.damage = Daño
|
stat.damage = Daño
|
||||||
@@ -669,6 +708,7 @@ stat.memorycapacity = Capacidad de memoria
|
|||||||
stat.basepowergeneration = Generación de energía
|
stat.basepowergeneration = Generación de energía
|
||||||
stat.productiontime = Tiempo de producción
|
stat.productiontime = Tiempo de producción
|
||||||
stat.repairtime = Tiempo para Reparar Bloque Completamente
|
stat.repairtime = Tiempo para Reparar Bloque Completamente
|
||||||
|
stat.repairspeed = Velocidad de Reparación
|
||||||
stat.weapons = Armas
|
stat.weapons = Armas
|
||||||
stat.bullet = Proyectil
|
stat.bullet = Proyectil
|
||||||
stat.speedincrease = Aumento de Velocidad
|
stat.speedincrease = Aumento de Velocidad
|
||||||
@@ -705,15 +745,24 @@ stat.minetier = Nivel de taladro
|
|||||||
stat.payloadcapacity = Capacidad de carga
|
stat.payloadcapacity = Capacidad de carga
|
||||||
stat.commandlimit = Límite de comando
|
stat.commandlimit = Límite de comando
|
||||||
stat.abilities = Habilidades
|
stat.abilities = Habilidades
|
||||||
stat.canboost = Tiene Propulsores
|
stat.canboost = Potenciador
|
||||||
stat.flying = Aéreo
|
stat.flying = Aéreo
|
||||||
|
stat.ammouse = Usa Munición
|
||||||
|
stat.damagemultiplier = Multiplicador de Daño
|
||||||
|
stat.healthmultiplier = Multiplicador de Vida
|
||||||
|
stat.speedmultiplier = Multiplicador de Velocidad
|
||||||
|
stat.reloadmultiplier = Multiplicador de Recarga
|
||||||
|
stat.buildspeedmultiplier = Multiplicador de Velocidad de Construcción
|
||||||
|
stat.reactive = Reacciona
|
||||||
|
stat.healing = Sanador
|
||||||
|
|
||||||
ability.forcefield = Campo de Fuerza
|
ability.forcefield = Campo de Escudo
|
||||||
ability.repairfield = Campo de Reparación
|
ability.repairfield = Campo de Reparación
|
||||||
ability.statusfield = Campo de Estado
|
ability.statusfield = {0} Campo de aceleración
|
||||||
ability.unitspawn = {0} Fábrica de Drones
|
ability.unitspawn = {0} Fábrica
|
||||||
ability.shieldregenfield = Campo de Regeneración de Escudos
|
ability.shieldregenfield = Regeneración de Armaduras
|
||||||
ability.movelightning = Movimiento Relámpago
|
ability.movelightning = Movimiento Relámpago
|
||||||
|
ability.energyfield = Campo de Energía: [accent]{0}[] daño ~ [accent]{1}[] bloques / [accent]{2}[] objetivos
|
||||||
|
|
||||||
bar.drilltierreq = Requiere un taladro mejor
|
bar.drilltierreq = Requiere un taladro mejor
|
||||||
bar.noresources = Recursos insuficientes
|
bar.noresources = Recursos insuficientes
|
||||||
@@ -736,29 +785,28 @@ bar.power = Energía
|
|||||||
bar.progress = Progreso de construcción
|
bar.progress = Progreso de construcción
|
||||||
bar.input = Entrada
|
bar.input = Entrada
|
||||||
bar.output = Salida
|
bar.output = Salida
|
||||||
|
bar.strength = [stat]{0}[lightgray]x fuerza
|
||||||
|
|
||||||
units.processorcontrol = [lightgray]Controlado por Procesador
|
units.processorcontrol = [lightgray]Controlado por Procesador
|
||||||
|
|
||||||
bullet.damage = [stat]{0}[lightgray] Daño
|
bullet.damage = [stat]{0}[lightgray] Daño
|
||||||
bullet.splashdamage = [stat]{0}[lightgray] daño de área ~[stat] {1}[lightgray] casillas
|
bullet.splashdamage = [stat]{0}[lightgray] área daño ~[stat] {1}[lightgray] bloques
|
||||||
bullet.incendiary = [stat]Incendiaria
|
bullet.incendiary = [stat]Incendiaria
|
||||||
bullet.sapping = [stat]Oxidante
|
|
||||||
bullet.homing = [stat]Rastreadora
|
bullet.homing = [stat]Rastreadora
|
||||||
bullet.shock = [stat]Electrizante
|
|
||||||
bullet.frag = [stat]De fragmentación
|
bullet.frag = [stat]De fragmentación
|
||||||
|
bullet.lightning = [stat]{0}[lightgray]x rayo ~ [stat]{1}[lightgray] daño
|
||||||
bullet.buildingdamage = [stat]{0}%[lightgray] daño a estructuras
|
bullet.buildingdamage = [stat]{0}%[lightgray] daño a estructuras
|
||||||
bullet.knockback = [stat]{0}[lightgray] Empuje
|
bullet.knockback = [stat]{0}[lightgray] empuje
|
||||||
bullet.pierce = [stat]{0}[lightgray]x penetración
|
bullet.pierce = [stat]{0}[lightgray]x perforación
|
||||||
bullet.infinitepierce = [stat]Penetrante
|
bullet.infinitepierce = [stat]Perforante
|
||||||
bullet.healpercent = [stat]{0}[lightgray]% reparación
|
bullet.healpercent = [stat]{0}[lightgray]% reparación
|
||||||
bullet.freezing = [stat]Congelación
|
|
||||||
bullet.tarred = [stat]Ralentizado
|
|
||||||
bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munición
|
bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munición
|
||||||
bullet.reload = [stat]{0}[lightgray]x cadencia de fuego
|
bullet.reload = [stat]{0}[lightgray]x cadencia de fuego
|
||||||
|
|
||||||
unit.blocks = bloques
|
unit.blocks = bloques
|
||||||
unit.blockssquared = bloques²
|
unit.blockssquared = bloques²
|
||||||
unit.powersecond = unidades de energía/segundo
|
unit.powersecond = unidades de energía/segundo
|
||||||
|
unit.tilessecond = bloques/segundo
|
||||||
unit.liquidsecond = unidades de líquido/segundo
|
unit.liquidsecond = unidades de líquido/segundo
|
||||||
unit.itemssecond = objetos/segundo
|
unit.itemssecond = objetos/segundo
|
||||||
unit.liquidunits = unidades de líquido
|
unit.liquidunits = unidades de líquido
|
||||||
@@ -775,6 +823,7 @@ unit.items = objetos
|
|||||||
unit.thousands = k
|
unit.thousands = k
|
||||||
unit.millions = M
|
unit.millions = M
|
||||||
unit.billions = b
|
unit.billions = b
|
||||||
|
unit.pershot = /disparo
|
||||||
category.purpose = Objetivo
|
category.purpose = Objetivo
|
||||||
category.general = General
|
category.general = General
|
||||||
category.power = Energía
|
category.power = Energía
|
||||||
@@ -788,10 +837,13 @@ setting.shadows.name = Sombras
|
|||||||
setting.blockreplace.name = Sugerir bloques al construir
|
setting.blockreplace.name = Sugerir bloques al construir
|
||||||
setting.linear.name = Filtrado Lineal
|
setting.linear.name = Filtrado Lineal
|
||||||
setting.hints.name = Consejos
|
setting.hints.name = Consejos
|
||||||
|
setting.logichints.name = Consejos sobre "Bloques Lógicos"
|
||||||
setting.flow.name = Mostrar tasa de flujo de recursos
|
setting.flow.name = Mostrar tasa de flujo de recursos
|
||||||
setting.backgroundpause.name = Pausar en segundo plano
|
setting.backgroundpause.name = Pausar en segundo plano
|
||||||
setting.buildautopause.name = Auto-pausar construcción
|
setting.buildautopause.name = Auto-pausar construcción
|
||||||
setting.animatedwater.name = Animaciones de Terreno
|
setting.doubletapmine.name = Doble-Click para Extraer minerales
|
||||||
|
setting.modcrashdisable.name = Desactivar Mods si se cuelga el juego
|
||||||
|
setting.animatedwater.name = Animación de Terreno
|
||||||
setting.animatedshields.name = Animación de Escudos
|
setting.animatedshields.name = Animación de Escudos
|
||||||
setting.antialias.name = Antialias[lightgray] (necesita un reinicio)[]
|
setting.antialias.name = Antialias[lightgray] (necesita un reinicio)[]
|
||||||
setting.playerindicators.name = Indicadores de Jugadores
|
setting.playerindicators.name = Indicadores de Jugadores
|
||||||
@@ -844,6 +896,7 @@ setting.bridgeopacity.name = Opacidad de Puentes Transportadores
|
|||||||
setting.playerchat.name = Mostrar el chat de burbuja
|
setting.playerchat.name = Mostrar el chat de burbuja
|
||||||
setting.showweather.name = Efectos visuales climáticos
|
setting.showweather.name = Efectos visuales climáticos
|
||||||
public.confirm = ¿Quieres hacer pública tu partida?\n[lightgray]Esto se puede cambiar más tarde en "Configuración->Juego->Visibilidad pública de la partida".
|
public.confirm = ¿Quieres hacer pública tu partida?\n[lightgray]Esto se puede cambiar más tarde en "Configuración->Juego->Visibilidad pública de la partida".
|
||||||
|
public.confirm.really = ¡Si quieres jugar con amigos, usa [green]Invitar a Amigos[] en lugar de un [scarlet]Servidor Público[]!\n¿De verdad quieres hacer [scarlet]pública[] tu partida?
|
||||||
public.beta = Recuerda que no puedes crear partidas públicas en las versiones beta del juego.
|
public.beta = Recuerda que no puedes crear partidas públicas en las versiones beta del juego.
|
||||||
uiscale.reset = La escala de la interfaz ha sido modificada.\nPulsa "OK" para conservar esta escala.\n[scarlet]Se desharán los cambios automáticamente en [accent] {0}[] segundos...
|
uiscale.reset = La escala de la interfaz ha sido modificada.\nPulsa "OK" para conservar esta escala.\n[scarlet]Se desharán los cambios automáticamente en [accent] {0}[] segundos...
|
||||||
uiscale.cancel = Cancelar y Salir
|
uiscale.cancel = Cancelar y Salir
|
||||||
@@ -908,7 +961,8 @@ keybind.pause.name = Pausa
|
|||||||
keybind.pause_building.name = Pausar/Reanudar construcción
|
keybind.pause_building.name = Pausar/Reanudar construcción
|
||||||
keybind.minimap.name = Minimapa
|
keybind.minimap.name = Minimapa
|
||||||
keybind.planet_map.name = Mapa del Planeta
|
keybind.planet_map.name = Mapa del Planeta
|
||||||
keybind.research.name = Investigaciones
|
keybind.research.name = Investigar
|
||||||
|
keybind.block_info.name = Información del Bloque
|
||||||
keybind.chat.name = Chat
|
keybind.chat.name = Chat
|
||||||
keybind.player_list.name = Lista de jugadores
|
keybind.player_list.name = Lista de jugadores
|
||||||
keybind.console.name = Consola
|
keybind.console.name = Consola
|
||||||
@@ -935,18 +989,23 @@ mode.custom = Normas personalizadas
|
|||||||
|
|
||||||
rules.infiniteresources = Recursos infinitos
|
rules.infiniteresources = Recursos infinitos
|
||||||
rules.reactorexplosions = Los reactores pueden explotar
|
rules.reactorexplosions = Los reactores pueden explotar
|
||||||
|
rules.coreincinerates = Núcleos inceran exceso de recursos
|
||||||
rules.schematic = Permitir Plantillas
|
rules.schematic = Permitir Plantillas
|
||||||
rules.wavetimer = Temporizador de Oleadas
|
rules.wavetimer = Temporizador de Oleadas
|
||||||
rules.waves = Oleadas
|
rules.waves = Oleadas
|
||||||
rules.attack = Ataque
|
rules.attack = Asalto
|
||||||
rules.buildai = La IA enemiga puede construir
|
rules.buildai = Contrucción de IA
|
||||||
rules.enemyCheat = La IA enemiga tiene recursos infinitos
|
rules.corecapture = Capturar Núcleo al Destruirlo
|
||||||
rules.blockhealthmultiplier = Multiplicador de salud de bloque
|
rules.polygoncoreprotection = Protección de Núcleo Poligonal
|
||||||
rules.blockdamagemultiplier = Multiplicador de daño de bloque
|
rules.enemyCheat = La IA (Equipo Rojo) tiene recursos infinitos
|
||||||
|
rules.blockhealthmultiplier = Multiplicador de Salud de Bloque
|
||||||
|
rules.blockdamagemultiplier = Multiplicador de Daño de Bloque
|
||||||
rules.unitbuildspeedmultiplier = Multiplicador de velocidad de creación de unidades
|
rules.unitbuildspeedmultiplier = Multiplicador de velocidad de creación de unidades
|
||||||
rules.unithealthmultiplier = Multiplicador de la vida de las unidades
|
rules.unithealthmultiplier = Multiplicador de Vida de Unidades
|
||||||
rules.unitdamagemultiplier = Multiplicador del daño de unidades
|
rules.unitdamagemultiplier = Multiplicador de Daño de Unidades
|
||||||
rules.enemycorebuildradius = Radio de No-Construcción del Núcleo Enemigo:[lightgray] (casillas)
|
rules.unitcapvariable = Núcleos alteran el Límite de Unidades
|
||||||
|
rules.unitcap = Límite Base de Unidades
|
||||||
|
rules.enemycorebuildradius = Radio de No-Construcción del Núcleo Enemigo:[lightgray] (bloques)
|
||||||
rules.wavespacing = Tiempo entre oleadas:[lightgray] (seg)
|
rules.wavespacing = Tiempo entre oleadas:[lightgray] (seg)
|
||||||
rules.buildcostmultiplier = Multiplicador de coste de construcción
|
rules.buildcostmultiplier = Multiplicador de coste de construcción
|
||||||
rules.buildspeedmultiplier = Multiplicador de velocidad de construcción
|
rules.buildspeedmultiplier = Multiplicador de velocidad de construcción
|
||||||
@@ -967,12 +1026,14 @@ rules.explosions = Daño de explosiones de Bloques/Unidades
|
|||||||
rules.ambientlight = Iluminación ambiental
|
rules.ambientlight = Iluminación ambiental
|
||||||
rules.weather = Clima
|
rules.weather = Clima
|
||||||
rules.weather.frequency = Frequencia:
|
rules.weather.frequency = Frequencia:
|
||||||
|
rules.weather.always = Siempre
|
||||||
rules.weather.duration = Duracion:
|
rules.weather.duration = Duracion:
|
||||||
|
|
||||||
content.item.name = Objetos
|
content.item.name = Objetos
|
||||||
content.liquid.name = Líquidos
|
content.liquid.name = Líquidos
|
||||||
content.unit.name = Unidades
|
content.unit.name = Unidades
|
||||||
content.block.name = Bloques
|
content.block.name = Bloques
|
||||||
|
content.status.name = Alteraciones de Estado
|
||||||
content.sector.name = Sectores
|
content.sector.name = Sectores
|
||||||
|
|
||||||
item.copper.name = Cobre
|
item.copper.name = Cobre
|
||||||
@@ -983,7 +1044,7 @@ item.titanium.name = Titanio
|
|||||||
item.thorium.name = Torio
|
item.thorium.name = Torio
|
||||||
item.silicon.name = Silicio
|
item.silicon.name = Silicio
|
||||||
item.plastanium.name = Plastanio
|
item.plastanium.name = Plastanio
|
||||||
item.phase-fabric.name = Tejido de fase
|
item.phase-fabric.name = Tejido de Fase
|
||||||
item.surge-alloy.name = Aleación Eléctrica
|
item.surge-alloy.name = Aleación Eléctrica
|
||||||
item.spore-pod.name = Vaina de Esporas
|
item.spore-pod.name = Vaina de Esporas
|
||||||
item.sand.name = Arena
|
item.sand.name = Arena
|
||||||
@@ -991,11 +1052,12 @@ item.blast-compound.name = Compuesto Explosivo
|
|||||||
item.pyratite.name = Pirotita
|
item.pyratite.name = Pirotita
|
||||||
item.metaglass.name = Metacristal
|
item.metaglass.name = Metacristal
|
||||||
item.scrap.name = Chatarra
|
item.scrap.name = Chatarra
|
||||||
|
|
||||||
liquid.water.name = Agua
|
liquid.water.name = Agua
|
||||||
liquid.slag.name = Magma
|
liquid.slag.name = Magma
|
||||||
liquid.oil.name = Petróleo
|
liquid.oil.name = Petróleo
|
||||||
liquid.cryofluid.name = Líquido criogénico
|
liquid.cryofluid.name = Líquido criogénico
|
||||||
#Names of Units and Turrets look better untranslated, since they are propper/own names
|
#Names of Units and Turrets looks better untranslated, since they are propper/own names
|
||||||
unit.dagger.name = Dagger
|
unit.dagger.name = Dagger
|
||||||
unit.mace.name = Mace
|
unit.mace.name = Mace
|
||||||
unit.fortress.name = Fortress
|
unit.fortress.name = Fortress
|
||||||
@@ -1022,6 +1084,11 @@ unit.minke.name = Minke
|
|||||||
unit.bryde.name = Bryde
|
unit.bryde.name = Bryde
|
||||||
unit.sei.name = Sei
|
unit.sei.name = Sei
|
||||||
unit.omura.name = Omura
|
unit.omura.name = Omura
|
||||||
|
unit.retusa.name = Retusa
|
||||||
|
unit.oxynoe.name = Oxynoe
|
||||||
|
unit.cyerce.name = Cyerce
|
||||||
|
unit.aegires.name = Aegires
|
||||||
|
unit.navanax.name = Navanax
|
||||||
unit.alpha.name = Alpha
|
unit.alpha.name = Alpha
|
||||||
unit.beta.name = Beta
|
unit.beta.name = Beta
|
||||||
unit.gamma.name = Gamma
|
unit.gamma.name = Gamma
|
||||||
@@ -1082,23 +1149,25 @@ block.sand-water.name = Agua con arena
|
|||||||
block.darksand-water.name = Agua con arena oscura
|
block.darksand-water.name = Agua con arena oscura
|
||||||
block.char.name = Cenizas
|
block.char.name = Cenizas
|
||||||
block.dacite.name = Dacita
|
block.dacite.name = Dacita
|
||||||
block.dacite-wall.name = Bloque de dacita
|
block.rhyolite.name = Riolita
|
||||||
block.dacite-boulder.name = Roca de dacita
|
block.dacite-wall.name = Bloque de Dacita
|
||||||
|
block.dacite-boulder.name = Roca de Dacita
|
||||||
block.ice-snow.name = Hielo-Nieve
|
block.ice-snow.name = Hielo-Nieve
|
||||||
block.stone-wall.name = Bloque de piedra
|
block.stone-wall.name = Bloque de Piedra
|
||||||
block.ice-wall.name = Bloque de hielo
|
block.ice-wall.name = Bloque de Hielo
|
||||||
block.snow-wall.name = Bloque de nieve
|
block.snow-wall.name = Bloque de Nieve
|
||||||
block.dune-wall.name = Bloque de arena
|
block.dune-wall.name = Bloque de Arena
|
||||||
block.pine.name = Pino
|
block.pine.name = Pino
|
||||||
block.dirt.name = Tierra
|
block.dirt.name = Tierra
|
||||||
block.dirt-wall.name = Bloque de tierra
|
block.dirt-wall.name = Bloque de tierra
|
||||||
block.mud.name = Lodo
|
block.mud.name = Lodo
|
||||||
block.white-tree-dead.name = Árbol Blanco Muerto
|
block.white-tree-dead.name = Árbol Blanco Muerto
|
||||||
block.white-tree.name = Árbol Blanco
|
block.white-tree.name = Árbol Blanco
|
||||||
block.spore-cluster.name = Concentración de Esporas
|
block.spore-cluster.name = Esporas
|
||||||
block.metal-floor.name = Suelo de Metal
|
block.metal-floor.name = Suelo de Metal 1
|
||||||
block.metal-floor-2.name = Suelo de Metal 2
|
block.metal-floor-2.name = Suelo de Metal 2
|
||||||
block.metal-floor-3.name = Suelo de Metal 3
|
block.metal-floor-3.name = Suelo de Metal 3
|
||||||
|
block.metal-floor-4.name = Suelo de Metal 4
|
||||||
block.metal-floor-5.name = Suelo de Metal 5
|
block.metal-floor-5.name = Suelo de Metal 5
|
||||||
block.metal-floor-damaged.name = Suelo de Metal dañado
|
block.metal-floor-damaged.name = Suelo de Metal dañado
|
||||||
block.dark-panel-1.name = Panel Oscuro 1
|
block.dark-panel-1.name = Panel Oscuro 1
|
||||||
@@ -1189,6 +1258,7 @@ block.solar-panel.name = Panel Solar
|
|||||||
block.solar-panel-large.name = Panel Solar Grande
|
block.solar-panel-large.name = Panel Solar Grande
|
||||||
block.oil-extractor.name = Extractor de Petróleo
|
block.oil-extractor.name = Extractor de Petróleo
|
||||||
block.repair-point.name = Punto de Reparación de Unidades
|
block.repair-point.name = Punto de Reparación de Unidades
|
||||||
|
block.repair-turret.name = Torreta Reparadora
|
||||||
block.pulse-conduit.name = Conducto de Pulso
|
block.pulse-conduit.name = Conducto de Pulso
|
||||||
block.plated-conduit.name = Conducto Acorazado
|
block.plated-conduit.name = Conducto Acorazado
|
||||||
block.phase-conduit.name = Conducto de Fase
|
block.phase-conduit.name = Conducto de Fase
|
||||||
@@ -1221,16 +1291,22 @@ block.container.name = Contenedor
|
|||||||
block.launch-pad.name = Plataforma de Lanzamiento
|
block.launch-pad.name = Plataforma de Lanzamiento
|
||||||
block.launch-pad-large.name = Plataforma de Lanzamiento Grande
|
block.launch-pad-large.name = Plataforma de Lanzamiento Grande
|
||||||
block.segment.name = Segment
|
block.segment.name = Segment
|
||||||
block.command-center.name = Centro de comando
|
block.command-center.name = Centro de Comando
|
||||||
block.ground-factory.name = Fábrica terrestre
|
block.ground-factory.name = Fábrica Terrestre
|
||||||
block.air-factory.name = Fábrica aérea
|
block.air-factory.name = Fábrica Aérea
|
||||||
block.naval-factory.name = Fábrica naval
|
block.naval-factory.name = Fábrica naval
|
||||||
block.additive-reconstructor.name = Reconstructor aditivo
|
block.additive-reconstructor.name = Reconstructor Aditivo
|
||||||
block.multiplicative-reconstructor.name = Reconstructor multiplicativo
|
block.multiplicative-reconstructor.name = Reconstructor Multiplicativo
|
||||||
block.exponential-reconstructor.name = Reconstructor exponencial
|
block.exponential-reconstructor.name = Reconstructor Exponencial
|
||||||
block.tetrative-reconstructor.name = Reconstructor tetrativo
|
block.tetrative-reconstructor.name = Reconstructor Tetrativo
|
||||||
block.payload-conveyor.name = Transportador de carga
|
block.payload-conveyor.name = Cinta Transportadora de Carga
|
||||||
block.payload-router.name = Enrutador de carga
|
block.payload-router.name = Enrutador de Carga
|
||||||
|
block.duct.name = Túnel
|
||||||
|
block.duct-router.name = Túnel Enrutador
|
||||||
|
block.duct-bridge.name = Túnel Puente
|
||||||
|
block.payload-propulsion-tower.name = Torre de Propulsión de Bloques
|
||||||
|
block.payload-void.name = Vacío de Bloques
|
||||||
|
block.payload-source.name = Fuente de Bloques
|
||||||
block.disassembler.name = Desensamblador
|
block.disassembler.name = Desensamblador
|
||||||
block.silicon-crucible.name = Crisol de silicio
|
block.silicon-crucible.name = Crisol de silicio
|
||||||
block.overdrive-dome.name = Campo de Aceleración
|
block.overdrive-dome.name = Campo de Aceleración
|
||||||
@@ -1252,7 +1328,6 @@ block.memory-bank.name = Servidor de memoria
|
|||||||
team.blue.name = azul
|
team.blue.name = azul
|
||||||
team.crux.name = crux
|
team.crux.name = crux
|
||||||
team.sharded.name = sharded
|
team.sharded.name = sharded
|
||||||
team.orange.name = naranja
|
|
||||||
team.derelict.name = delerict
|
team.derelict.name = delerict
|
||||||
team.green.name = verde
|
team.green.name = verde
|
||||||
team.purple.name = morado
|
team.purple.name = morado
|
||||||
@@ -1273,6 +1348,7 @@ hint.placeConveyor.mobile = Las cintas transportadoras pueden mover objetos de l
|
|||||||
hint.placeTurret = Construye \uf861 [accent]Torretas[] para defender tu base de los enemigos.\n\nLas torretas necesitan munición - en este caso, \uf838cobre.\nUsa cintas transportadoras y taladros para abastecerlas con cobre.
|
hint.placeTurret = Construye \uf861 [accent]Torretas[] para defender tu base de los enemigos.\n\nLas torretas necesitan munición - en este caso, \uf838cobre.\nUsa cintas transportadoras y taladros para abastecerlas con cobre.
|
||||||
hint.breaking = Pulsa [accent]Clic-derecho[] y arrastra para destruir bloques.
|
hint.breaking = Pulsa [accent]Clic-derecho[] y arrastra para destruir bloques.
|
||||||
hint.breaking.mobile = Activa el botón con el \ue817 [accent]martillo[] situado abajo a la derecha y selecciona bloques para eliminarlos.\n\nMantén el dedo un segundo y arrastra para eliminar bloques directamente en esa selección.
|
hint.breaking.mobile = Activa el botón con el \ue817 [accent]martillo[] situado abajo a la derecha y selecciona bloques para eliminarlos.\n\nMantén el dedo un segundo y arrastra para eliminar bloques directamente en esa selección.
|
||||||
|
hint.blockInfo = Puedes visualizar información de un bloque seleccionándolo en el [accent]menú de construcción[], mediante el botón [accent][[?][] en la derecha.
|
||||||
hint.research = Usa el botón \ue875 [accent]Investigación[] para acceder al menú de descubrimientos tecnológicos.
|
hint.research = Usa el botón \ue875 [accent]Investigación[] para acceder al menú de descubrimientos tecnológicos.
|
||||||
hint.research.mobile = Usa el botón \ue875 [accent]Investigación[] para acceder al menú de descubrimientos tecnológicos.
|
hint.research.mobile = Usa el botón \ue875 [accent]Investigación[] para acceder al menú de descubrimientos tecnológicos.
|
||||||
hint.unitControl = Mantén [accent][[L-ctrl][] y [accent]haz clic[] sobre unidades o torretas aliadas para controlarlas manualmente.
|
hint.unitControl = Mantén [accent][[L-ctrl][] y [accent]haz clic[] sobre unidades o torretas aliadas para controlarlas manualmente.
|
||||||
@@ -1319,7 +1395,7 @@ item.spore-pod.details = Esporas. Es algo parecido a una forma de vida sintétic
|
|||||||
item.blast-compound.description = Usado en bombas y munición explosiva.
|
item.blast-compound.description = Usado en bombas y munición explosiva.
|
||||||
item.pyratite.description = Usado en armas incendiarias y generadores de combustión.
|
item.pyratite.description = Usado en armas incendiarias y generadores de combustión.
|
||||||
|
|
||||||
liquid.water.description = Usada comúnmente para enfriar máquinas y para procesar residuos.
|
liquid.water.description = Usada para enfriar máquinas y para procesar residuos.
|
||||||
liquid.slag.description = Diferentes tipos de metales fundidos mezclados. Puede ser separado en sus minerales constituyentes, o disparado a unidades enemigas como arma.
|
liquid.slag.description = Diferentes tipos de metales fundidos mezclados. Puede ser separado en sus minerales constituyentes, o disparado a unidades enemigas como arma.
|
||||||
liquid.oil.description = Se utiliza en producción de materiales avanzados, y en munición incendiaria.
|
liquid.oil.description = Se utiliza en producción de materiales avanzados, y en munición incendiaria.
|
||||||
liquid.cryofluid.description = Usado como refrigerante para reactores, torretas, y fábricas.
|
liquid.cryofluid.description = Usado como refrigerante para reactores, torretas, y fábricas.
|
||||||
@@ -1502,3 +1578,155 @@ unit.omura.description = Dispara rayos contínuos perforantes. Construye unidade
|
|||||||
unit.alpha.description = Defiende el núcleo Shard de los enemigos. Construye estructuras.
|
unit.alpha.description = Defiende el núcleo Shard de los enemigos. Construye estructuras.
|
||||||
unit.beta.description = Defiende el núcleo Foundation de los enemigos. Construye estructuras.
|
unit.beta.description = Defiende el núcleo Foundation de los enemigos. Construye estructuras.
|
||||||
unit.gamma.description = Defiende el núcleo Nucleus de los enemigos. Construye estructuras.
|
unit.gamma.description = Defiende el núcleo Nucleus de los enemigos. Construye estructuras.
|
||||||
|
|
||||||
|
lst.read = Lee un número desde una unidad de memoria conectada.
|
||||||
|
lst.write = Escribe un número en una unidad de memoria conectada.
|
||||||
|
lst.print = Añade texto a la cola para impresión.\nNo mostrará nada hasta que se use [accent]Ejecutar Imprimir[].
|
||||||
|
lst.draw = Añade una operación a la cola de gráfico.\nNo mostrará nada hasta que se use [accent]Ejecutar Gráfico[].
|
||||||
|
lst.drawflush = Ejecución en cola de operaciones [accent]Gráfico[] a un monitor gráfico.
|
||||||
|
lst.printflush = Ejecución en cola de operaciones [accent]Imprimir[] a un bloque de mensaje.
|
||||||
|
lst.getlink = Obtiene el número de enlace de procesador. Inicia en 0.
|
||||||
|
lst.control = Controla el estado de un bloque.
|
||||||
|
lst.radar = Localiza unidades alrededor de un bloque con rango.
|
||||||
|
lst.sensor = Recopila datos de un bloque o unidad.
|
||||||
|
lst.set = Establece una variable.
|
||||||
|
lst.operation = Realiza una operación sobre 1-2 variables.
|
||||||
|
lst.end = Salta al inicio de la lista de instrucciones.
|
||||||
|
lst.wait = Espera unos segundos.
|
||||||
|
lst.lookup = Busca un objeto/líquido/unidad/tipo de bloque por ID.\nSe puede acceder al número total de cada tipo con:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
|
||||||
|
lst.jump = Salta a otra instrucción.
|
||||||
|
lst.unitbind = Se enlaza a la siguiente unidad de un tipo, y la almacena en [accent]@unit[].
|
||||||
|
lst.unitcontrol = Controla la unidad actualmente enlazada.
|
||||||
|
lst.unitradar = Localiza unidades alrededor de la unidad actualmente enlazada.
|
||||||
|
lst.unitlocate = Localiza un tipo específico de posición/bloque en cualquier lugar del mapa.\nRequiere una unidad enlazada.
|
||||||
|
|
||||||
|
logic.nounitbuild = [red]No se permite la construcción de bloques de categoría lógica.
|
||||||
|
|
||||||
|
lenum.type = El tipo de bloque/unidad\nEjemplo: "para cualquier enrutador", devolverá [accent]@router[].\nNo es una cadena de texto.
|
||||||
|
lenum.shoot = Dispara a una posición.
|
||||||
|
lenum.shootp = Dispara a una unidad/bloque con predicción de velocidad.
|
||||||
|
lenum.config = Configuración de bloque, por ejemplo: clasificador.
|
||||||
|
lenum.enabled = Si el bloque está activado o no.
|
||||||
|
|
||||||
|
laccess.color = Color del iluminador.
|
||||||
|
laccess.controller = Controlador de unidad. Si se controla mediante un procesador, devuelve dicho procesador.\nSi está en formación, devuelve su líder.\nDe otra forma, devuelve la misma unidad.
|
||||||
|
laccess.dead = Si una unidad/bloque es destruída o inválida.
|
||||||
|
laccess.controlled = Devuelve:\n[accent]@ctrlProcessor[] si el control de la unidad lo tiene un procesador\n[accent]@ctrlPlayer[] si el control de la unidad/bloque lo tiene un jugador\n[accent]@ctrlFormation[] si la unidad está en formación\nDe otra forma, devuelve 0.
|
||||||
|
laccess.commanded = [red]En desuso. ¡Será eliminado![]\nUsa [accent]controlado[] en su lugar.
|
||||||
|
laccess.progress = Progreso de una acción, 0 a 1.\nDevuelve de una producción, recarga de una torreta o progreso de una construcción.
|
||||||
|
|
||||||
|
graphicstype.clear = Llena el monitor con un color.
|
||||||
|
graphicstype.color = Establece el color para próximas operaciones de gráficos.
|
||||||
|
graphicstype.stroke = Establece el ancho de la línea.
|
||||||
|
graphicstype.line = Segmento de la línea del gráfico.
|
||||||
|
graphicstype.rect = Rellena un rectángulo.
|
||||||
|
graphicstype.linerect = Dibuja las aristas de un rectángulo.
|
||||||
|
graphicstype.poly = Rellena un polígono regular.
|
||||||
|
graphicstype.linepoly = Dibuja las aristas de un polígono regular.
|
||||||
|
graphicstype.triangle = Rellena un triángulo.
|
||||||
|
graphicstype.image = Dibuja una imágen de un contenido.\nEjemplo: [accent]@router[] o [accent]@dagger[].
|
||||||
|
|
||||||
|
lenum.always = Siempre "true".
|
||||||
|
lenum.idiv = División de un número entero.
|
||||||
|
lenum.div = División.\nDevuelve [accent]null[] al dividir entre cero.
|
||||||
|
lenum.mod = Modulo.
|
||||||
|
lenum.equal = Igual. Coacciona tipos.\nObjetos no-nulos coaccionados con números pasan a 1, si no coinciden pasan a 0.
|
||||||
|
lenum.notequal = No igual. Coacciona tipos.
|
||||||
|
lenum.strictequal = Igualdad estricta. No coacciona tipos.\nSe puede usar para comprobar si un resultado es [accent]null[].
|
||||||
|
lenum.shl = Cambia bits a izquierda.
|
||||||
|
lenum.shr = Cambia bits a derecha.
|
||||||
|
lenum.or = Comprobación bit a bit OR.
|
||||||
|
lenum.land = Comprobación lógica AND.
|
||||||
|
lenum.and = Comprobación bit a bit AND.
|
||||||
|
lenum.not = Comprobación bit a bit invertida.
|
||||||
|
lenum.xor = Comprobación bit a bit XOR.
|
||||||
|
|
||||||
|
lenum.min = Mínimo de dos números.
|
||||||
|
lenum.max = Máximo de dos números.
|
||||||
|
lenum.angle = Ángulo del vector en grados.
|
||||||
|
lenum.len = Longitud del vector.
|
||||||
|
|
||||||
|
lenum.sin = Seno, en grados.
|
||||||
|
lenum.cos = Coseno, en grados.
|
||||||
|
lenum.tan = Tangente, en grados.
|
||||||
|
|
||||||
|
lenum.asin = Arco seno, en grados.
|
||||||
|
lenum.acos = Arco coseno, en grados.
|
||||||
|
lenum.atan = Arco tangente, en grados.
|
||||||
|
|
||||||
|
#not a typo, look up 'range notation'
|
||||||
|
lenum.rand = Número decimal aleatorio en un rango [0, valor).
|
||||||
|
lenum.log = Logaritmo natural (ln).
|
||||||
|
lenum.log10 = Logaritmo en base 10.
|
||||||
|
lenum.noise = Ruido simplex 2D.
|
||||||
|
lenum.abs = Valor absoluto.
|
||||||
|
lenum.sqrt = Raíz cuadrada.
|
||||||
|
|
||||||
|
lenum.any = Cualquier unidad.
|
||||||
|
lenum.ally = Unidad aliada.
|
||||||
|
lenum.attacker = Unidad con un arma.
|
||||||
|
lenum.enemy = Unidad enemiga.
|
||||||
|
lenum.boss = Unidad guardián (Jefe).
|
||||||
|
lenum.flying = Unidad aérea.
|
||||||
|
lenum.ground = Unidad terrestre.
|
||||||
|
lenum.player = Unidad controlada por un jugador.
|
||||||
|
|
||||||
|
lenum.ore = Depósito mineral.
|
||||||
|
lenum.damaged = Bloque aliado dañado.
|
||||||
|
lenum.spawn = Punto de aterrizaje enemigo.\nPuede ser un núcleo o una posición.
|
||||||
|
lenum.building = Un bloque de una categoría específica.
|
||||||
|
|
||||||
|
lenum.core = Cualquier núcleo.
|
||||||
|
lenum.storage = Bloque de almacenamiento, ejemplo: Contenedor.
|
||||||
|
lenum.generator = Bloques que generan energía.
|
||||||
|
lenum.factory = Bloques que transforman recursos.
|
||||||
|
lenum.repair = Puntos de reparación.
|
||||||
|
lenum.rally = Centro de comando.
|
||||||
|
lenum.battery = Cualquier batería.
|
||||||
|
lenum.resupply = Puntos de reabastecimiento.\nSólo es relevante cuando [accent]"Unidades necesitan munición"[] está activada.
|
||||||
|
lenum.reactor = Reactor de Impacto/Torio.
|
||||||
|
lenum.turret = Cualquier torreta.
|
||||||
|
|
||||||
|
sensor.in = El bloque/unidad a detectar.
|
||||||
|
|
||||||
|
radar.from = Bloque del que detectar.\nEl rango del sensor está limitado por el rango de dicha construcción.
|
||||||
|
radar.target = Filtro de unidades a detectar.
|
||||||
|
radar.and = Filtros adicionales.
|
||||||
|
radar.order = Orden para ordenar. 0 para invertir.
|
||||||
|
radar.sort = Métrica a usar al ordenar resultados.
|
||||||
|
radar.output = Variable en la que escribir la salida de una unidad.
|
||||||
|
|
||||||
|
unitradar.target = Filtro para detectar unidades.
|
||||||
|
unitradar.and = Filtros adicionales.
|
||||||
|
unitradar.order = Orden para ordenar. 0 para invertir.
|
||||||
|
unitradar.sort = Métrica a usar al ordenar resultados.
|
||||||
|
unitradar.output = Variable en la que escribir la salida de una unidad.
|
||||||
|
|
||||||
|
control.of = Bloque a controlar.
|
||||||
|
control.unit = Unidad/bloque al que apuntar.
|
||||||
|
control.shoot = Cuándo disparar.
|
||||||
|
|
||||||
|
unitlocate.enemy = Cuándo localizar construcciones enemigas.
|
||||||
|
unitlocate.found = Cuándo el objeto es encontrado.
|
||||||
|
unitlocate.building = Variable de salida para contrucciones localizadas.
|
||||||
|
unitlocate.outx = Coordenada X devuelta.
|
||||||
|
unitlocate.outy = Coordenada Y devuelta.
|
||||||
|
unitlocate.group = Grupo de bloque a buscar.
|
||||||
|
|
||||||
|
lenum.idle = No se mueve, pero seguirá construyendo/extrayendo minerales.\nEs el estado por defecto.
|
||||||
|
lenum.stop = Deja de moverse/extraer minerales/contruir.
|
||||||
|
lenum.move = Moverse a una posición exacta.
|
||||||
|
lenum.approach = Aproximarse a una posición con un radio.
|
||||||
|
lenum.pathfind = Establece una ruta hasta el punto de aterrizaje enemigo.
|
||||||
|
lenum.target = Dispara a una posición.
|
||||||
|
lenum.targetp = Dispara a un objetivo con predicción de velocidad.
|
||||||
|
lenum.itemdrop = Suelta un objeto.
|
||||||
|
lenum.itemtake = Recoge un objeto de una construcción.
|
||||||
|
lenum.paydrop = Suelta la carga actual.
|
||||||
|
lenum.paytake = Recoge bloques o unidades en la posición actual como carga a trasnportar.
|
||||||
|
lenum.flag = Etiqueta numérica de la unidad.
|
||||||
|
lenum.mine = Extrae minerales de una posición.
|
||||||
|
lenum.build = Construye una estructura.
|
||||||
|
lenum.getblock = Obtiene la construcción y su categoría en unas coordenadas específicas.\nLa unidad debe estar en el rango de su posición.\nLos bloques no-construcciones tendrán el tipo [accent]@solid[].
|
||||||
|
lenum.within = Comprueba si una unidad se encuentra cerca de una posición.
|
||||||
|
lenum.boost = Inicia/Detiene potenciación.
|
||||||
|
|||||||
@@ -807,6 +807,7 @@ bullet.reload = [stat]{0}[lightgray]x vitesse de tir
|
|||||||
unit.blocks = blocs
|
unit.blocks = blocs
|
||||||
unit.blockssquared = blocs²
|
unit.blockssquared = blocs²
|
||||||
unit.powersecond = unités d'énergie/seconde
|
unit.powersecond = unités d'énergie/seconde
|
||||||
|
unit.tilessecond = tuiles/seconde
|
||||||
unit.liquidsecond = unités de liquide/seconde
|
unit.liquidsecond = unités de liquide/seconde
|
||||||
unit.itemssecond = objets/seconde
|
unit.itemssecond = objets/seconde
|
||||||
unit.liquidunits = unités de liquide
|
unit.liquidunits = unités de liquide
|
||||||
@@ -1601,6 +1602,8 @@ lst.sensor = Récupère des données depuis un bâtiment ou une unité.
|
|||||||
lst.set = Définit une variable.
|
lst.set = Définit une variable.
|
||||||
lst.operation = Effectue une opération sur 1 ou 2 variables.
|
lst.operation = Effectue une opération sur 1 ou 2 variables.
|
||||||
lst.end = Saute au sommet de la série d’instructions.
|
lst.end = Saute au sommet de la série d’instructions.
|
||||||
|
lst.wait = Attendre un certain nombre de secondes.
|
||||||
|
lst.lookup = Recherche d'un type d'objet/liquide/unité/bloc par ID.\nLe nombre total de chaque type peut être consulté avec:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
|
||||||
lst.jump = Saute conditionnellement vers une autre instruction.
|
lst.jump = Saute conditionnellement vers une autre instruction.
|
||||||
lst.unitbind = Se lie à une unité du type donné et la stocke dans [accent]@unit[].
|
lst.unitbind = Se lie à une unité du type donné et la stocke dans [accent]@unit[].
|
||||||
lst.unitcontrol = Contrôle l'unité actuellement liée.
|
lst.unitcontrol = Contrôle l'unité actuellement liée.
|
||||||
|
|||||||
@@ -1591,6 +1591,8 @@ lst.sensor = Mengambil data dari bangunan atau unit.
|
|||||||
lst.set = Menentukan sebuah variabel.
|
lst.set = Menentukan sebuah variabel.
|
||||||
lst.operation = Melakukan operasi pada 1-2 variabel.
|
lst.operation = Melakukan operasi pada 1-2 variabel.
|
||||||
lst.end = Loncati ke awal dari tumpukan perintah.
|
lst.end = Loncati ke awal dari tumpukan perintah.
|
||||||
|
lst.wait = Memberi jeda dalam detik yang ditentukan.
|
||||||
|
lst.lookup = Mencari tipe barang/cairan/unit/blok dengan ID.\nJumlah hitungan dari setiap tipe dapat dilihat dengan:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
|
||||||
lst.jump = Loncati secara bersyarat ke pernyataan berikutnya.
|
lst.jump = Loncati secara bersyarat ke pernyataan berikutnya.
|
||||||
lst.unitbind = Menautkan ke unit jenis berikutnya, dan menyimpannya di [accent]@unit[].
|
lst.unitbind = Menautkan ke unit jenis berikutnya, dan menyimpannya di [accent]@unit[].
|
||||||
lst.unitcontrol = Mengendalikan unit yang saat ini dihubungkan.
|
lst.unitcontrol = Mengendalikan unit yang saat ini dihubungkan.
|
||||||
|
|||||||
@@ -100,7 +100,8 @@ joingame = 게임 참여
|
|||||||
customgame = 사용자 지정 게임
|
customgame = 사용자 지정 게임
|
||||||
newgame = 새 게임
|
newgame = 새 게임
|
||||||
none = < 없음 >
|
none = < 없음 >
|
||||||
none.found = [lightgray]< 없거나 찾을 수 없음 >
|
none.found = [lightgray]< 찾을 수 없음 >
|
||||||
|
none.inmap = [lightgray]< 맵에 없음 >
|
||||||
minimap = 미니맵
|
minimap = 미니맵
|
||||||
position = 위치
|
position = 위치
|
||||||
close = 닫기
|
close = 닫기
|
||||||
@@ -806,6 +807,7 @@ bullet.reload = [stat]{0}[lightgray]배 발사 속도
|
|||||||
unit.blocks = 블록
|
unit.blocks = 블록
|
||||||
unit.blockssquared = 블록²
|
unit.blockssquared = 블록²
|
||||||
unit.powersecond = 전력/초
|
unit.powersecond = 전력/초
|
||||||
|
unit.tilessecond = 타일/초
|
||||||
unit.liquidsecond = 액체/초
|
unit.liquidsecond = 액체/초
|
||||||
unit.itemssecond = 자원/초
|
unit.itemssecond = 자원/초
|
||||||
unit.liquidunits = 액체
|
unit.liquidunits = 액체
|
||||||
|
|||||||
@@ -806,6 +806,7 @@ bullet.reload = [stat]{0}[lightgray]x скорость стрельбы
|
|||||||
unit.blocks = блоков
|
unit.blocks = блоков
|
||||||
unit.blockssquared = блоков²
|
unit.blockssquared = блоков²
|
||||||
unit.powersecond = единиц энергии/секунду
|
unit.powersecond = единиц энергии/секунду
|
||||||
|
unit.tilessecond = плиток/секунду
|
||||||
unit.liquidsecond = жидкостных единиц/секунду
|
unit.liquidsecond = жидкостных единиц/секунду
|
||||||
unit.itemssecond = предметов/секунду
|
unit.itemssecond = предметов/секунду
|
||||||
unit.liquidunits = жидкостных единиц
|
unit.liquidunits = жидкостных единиц
|
||||||
@@ -1570,7 +1571,7 @@ unit.mega.description = Автоматически ремонтирует пов
|
|||||||
unit.quad.description = Сбрасывает большие бомбы на наземные цели, восстанавливая союзные постройки и повреждая врагов. Может переносить единицы среднего размера.
|
unit.quad.description = Сбрасывает большие бомбы на наземные цели, восстанавливая союзные постройки и повреждая врагов. Может переносить единицы среднего размера.
|
||||||
unit.oct.description = Защищает союзников поблизости при помощи своего восстанавливающегося щита. Может переносить большинство наземных единиц.
|
unit.oct.description = Защищает союзников поблизости при помощи своего восстанавливающегося щита. Может переносить большинство наземных единиц.
|
||||||
unit.risso.description = Стреляет залпами ракет и пуль по всем врагам поблизости.
|
unit.risso.description = Стреляет залпами ракет и пуль по всем врагам поблизости.
|
||||||
unit.minke.description = Стреляет зажигательными снарядами и стандартными пулями по наземным целям.
|
unit.minke.description = Стреляет артиллерийскими снарядами и стандартными пулями по наземным целям.
|
||||||
unit.bryde.description = Стреляет дальнобойными артиллерийскими снарядами и ракетами по врагам.
|
unit.bryde.description = Стреляет дальнобойными артиллерийскими снарядами и ракетами по врагам.
|
||||||
unit.sei.description = Стреляет залпами ракет и бронебойных пуль по врагам.
|
unit.sei.description = Стреляет залпами ракет и бронебойных пуль по врагам.
|
||||||
unit.omura.description = Стреляет дальнобойным пробивающим снарядом из рельсотрона по врагам. Производит единицы «Вспышка».
|
unit.omura.description = Стреляет дальнобойным пробивающим снарядом из рельсотрона по врагам. Производит единицы «Вспышка».
|
||||||
@@ -1591,6 +1592,8 @@ lst.sensor = Получает данные из постройки или еди
|
|||||||
lst.set = Устанавливает переменную.
|
lst.set = Устанавливает переменную.
|
||||||
lst.operation = Совершает операцию над 1-2 переменными.
|
lst.operation = Совершает операцию над 1-2 переменными.
|
||||||
lst.end = Переходит к началу стека операций.
|
lst.end = Переходит к началу стека операций.
|
||||||
|
lst.wait = Ждёт определённое количество секунд.
|
||||||
|
lst.lookup = Находит тип предмета/жидкости/единицы/блока по ID.\nОбщее количество каждого типа может быть получено при помощи:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
|
||||||
lst.jump = Условно переходит к другой операции.
|
lst.jump = Условно переходит к другой операции.
|
||||||
lst.unitbind = Привязывается к единице определённого типа и сохраняет её в [accent]@unit[].
|
lst.unitbind = Привязывается к единице определённого типа и сохраняет её в [accent]@unit[].
|
||||||
lst.unitcontrol = Управляет привязанной в данный момент единицей.
|
lst.unitcontrol = Управляет привязанной в данный момент единицей.
|
||||||
|
|||||||
@@ -460,6 +460,7 @@ toolmode.drawteams = Takım Çiz
|
|||||||
toolmode.drawteams.description = Bloklar yerine takımları çizer..
|
toolmode.drawteams.description = Bloklar yerine takımları çizer..
|
||||||
|
|
||||||
filters.empty = [lightgray]Hiç filtre yok! Aşağıdaki butonla bir adet ekleyin.
|
filters.empty = [lightgray]Hiç filtre yok! Aşağıdaki butonla bir adet ekleyin.
|
||||||
|
|
||||||
filter.distort = Çarpıt
|
filter.distort = Çarpıt
|
||||||
filter.noise = Gürültü
|
filter.noise = Gürültü
|
||||||
filter.enemyspawn = Düşman Doğma Alanı Seçimi
|
filter.enemyspawn = Düşman Doğma Alanı Seçimi
|
||||||
@@ -476,6 +477,7 @@ filter.clear = Temizle
|
|||||||
filter.option.ignore = Yoksay
|
filter.option.ignore = Yoksay
|
||||||
filter.scatter = Saç
|
filter.scatter = Saç
|
||||||
filter.terrain = Arazi
|
filter.terrain = Arazi
|
||||||
|
|
||||||
filter.option.scale = Ölçek
|
filter.option.scale = Ölçek
|
||||||
filter.option.chance = Şans
|
filter.option.chance = Şans
|
||||||
filter.option.mag = Genlik
|
filter.option.mag = Genlik
|
||||||
@@ -490,6 +492,7 @@ filter.option.block = Blok
|
|||||||
filter.option.floor = Zemin
|
filter.option.floor = Zemin
|
||||||
filter.option.flooronto = Hedef Zemin
|
filter.option.flooronto = Hedef Zemin
|
||||||
filter.option.target = Target
|
filter.option.target = Target
|
||||||
|
filter.option.replacement = Değiştirme
|
||||||
filter.option.wall = Duvar
|
filter.option.wall = Duvar
|
||||||
filter.option.ore = Maden
|
filter.option.ore = Maden
|
||||||
filter.option.floor2 = İkincil Duvar
|
filter.option.floor2 = İkincil Duvar
|
||||||
@@ -675,6 +678,7 @@ unit.nobuild = [scarlet]Birlik inşa edemiyor
|
|||||||
lastaccessed = [lightgray]Son Erişme: {0}
|
lastaccessed = [lightgray]Son Erişme: {0}
|
||||||
block.unknown = [lightgray]???
|
block.unknown = [lightgray]???
|
||||||
|
|
||||||
|
stat.showinmap = <görüntülenecek haritayı yükle>
|
||||||
stat.description = Amaç
|
stat.description = Amaç
|
||||||
stat.input = Giriş
|
stat.input = Giriş
|
||||||
stat.output = Çıkış
|
stat.output = Çıkış
|
||||||
@@ -991,6 +995,7 @@ rules.waves = Dalgalar
|
|||||||
rules.attack = Saldırı Modu
|
rules.attack = Saldırı Modu
|
||||||
rules.buildai = Yapay Zeka İnşası
|
rules.buildai = Yapay Zeka İnşası
|
||||||
rules.corecapture = Yıkımca Çekirdeği Elegeçir
|
rules.corecapture = Yıkımca Çekirdeği Elegeçir
|
||||||
|
rules.polygoncoreprotection = Çokgenli Çekirdek Koruması
|
||||||
rules.enemyCheat = Sonsuz AI (Kırmızı Takım) Kaynakları
|
rules.enemyCheat = Sonsuz AI (Kırmızı Takım) Kaynakları
|
||||||
rules.blockhealthmultiplier = Blok Canı Çarpanı
|
rules.blockhealthmultiplier = Blok Canı Çarpanı
|
||||||
rules.blockdamagemultiplier = Blok Hasarı Çarpanı
|
rules.blockdamagemultiplier = Blok Hasarı Çarpanı
|
||||||
@@ -1161,7 +1166,8 @@ block.spore-cluster.name = Spor Kümesi
|
|||||||
block.metal-floor.name = Metal Zemin 1
|
block.metal-floor.name = Metal Zemin 1
|
||||||
block.metal-floor-2.name = Metal Zemin 2
|
block.metal-floor-2.name = Metal Zemin 2
|
||||||
block.metal-floor-3.name = Metal Zemin 3
|
block.metal-floor-3.name = Metal Zemin 3
|
||||||
block.metal-floor-5.name = Metal Zemin 4
|
block.metal-floor-4.name = Metal Zemin 4
|
||||||
|
block.metal-floor-5.name = Metal Zemin 5
|
||||||
block.metal-floor-damaged.name = Hasarlı Metal Zemin
|
block.metal-floor-damaged.name = Hasarlı Metal Zemin
|
||||||
block.dark-panel-1.name = Kara Panel 1
|
block.dark-panel-1.name = Kara Panel 1
|
||||||
block.dark-panel-2.name = Kara Panel 2
|
block.dark-panel-2.name = Kara Panel 2
|
||||||
|
|||||||
@@ -126,3 +126,4 @@ Skat
|
|||||||
WilloIzCitron
|
WilloIzCitron
|
||||||
SAMBUYYA
|
SAMBUYYA
|
||||||
genNAowl
|
genNAowl
|
||||||
|
TranquillyUnpleasant
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 239 KiB After Width: | Height: | Size: 125 KiB |
|
Before Width: | Height: | Size: 447 KiB After Width: | Height: | Size: 268 KiB |
|
Before Width: | Height: | Size: 398 KiB After Width: | Height: | Size: 222 KiB |
|
Before Width: | Height: | Size: 316 KiB After Width: | Height: | Size: 171 KiB |
|
Before Width: | Height: | Size: 229 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 147 KiB |
@@ -155,6 +155,7 @@ const BlockBuildBeginEvent = Packages.mindustry.game.EventType.BlockBuildBeginEv
|
|||||||
const ResearchEvent = Packages.mindustry.game.EventType.ResearchEvent
|
const ResearchEvent = Packages.mindustry.game.EventType.ResearchEvent
|
||||||
const UnlockEvent = Packages.mindustry.game.EventType.UnlockEvent
|
const UnlockEvent = Packages.mindustry.game.EventType.UnlockEvent
|
||||||
const StateChangeEvent = Packages.mindustry.game.EventType.StateChangeEvent
|
const StateChangeEvent = Packages.mindustry.game.EventType.StateChangeEvent
|
||||||
|
const CoreChangeEvent = Packages.mindustry.game.EventType.CoreChangeEvent
|
||||||
const TileChangeEvent = Packages.mindustry.game.EventType.TileChangeEvent
|
const TileChangeEvent = Packages.mindustry.game.EventType.TileChangeEvent
|
||||||
const TilePreChangeEvent = Packages.mindustry.game.EventType.TilePreChangeEvent
|
const TilePreChangeEvent = Packages.mindustry.game.EventType.TilePreChangeEvent
|
||||||
const GameOverEvent = Packages.mindustry.game.EventType.GameOverEvent
|
const GameOverEvent = Packages.mindustry.game.EventType.GameOverEvent
|
||||||
@@ -166,6 +167,7 @@ const DepositEvent = Packages.mindustry.game.EventType.DepositEvent
|
|||||||
const WithdrawEvent = Packages.mindustry.game.EventType.WithdrawEvent
|
const WithdrawEvent = Packages.mindustry.game.EventType.WithdrawEvent
|
||||||
const SectorCaptureEvent = Packages.mindustry.game.EventType.SectorCaptureEvent
|
const SectorCaptureEvent = Packages.mindustry.game.EventType.SectorCaptureEvent
|
||||||
const PlayerChatEvent = Packages.mindustry.game.EventType.PlayerChatEvent
|
const PlayerChatEvent = Packages.mindustry.game.EventType.PlayerChatEvent
|
||||||
|
const MenuOptionChooseEvent = Packages.mindustry.game.EventType.MenuOptionChooseEvent
|
||||||
const ClientPreConnectEvent = Packages.mindustry.game.EventType.ClientPreConnectEvent
|
const ClientPreConnectEvent = Packages.mindustry.game.EventType.ClientPreConnectEvent
|
||||||
const CommandIssueEvent = Packages.mindustry.game.EventType.CommandIssueEvent
|
const CommandIssueEvent = Packages.mindustry.game.EventType.CommandIssueEvent
|
||||||
const SchematicCreateEvent = Packages.mindustry.game.EventType.SchematicCreateEvent
|
const SchematicCreateEvent = Packages.mindustry.game.EventType.SchematicCreateEvent
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ void main(){
|
|||||||
vec4 color = texture2D(u_texture, c);
|
vec4 color = texture2D(u_texture, c);
|
||||||
|
|
||||||
if(noise > 0.54 && noise < 0.68){
|
if(noise > 0.54 && noise < 0.68){
|
||||||
color.rgb *= 1.4;
|
color.rgb *= vec3(1.4);
|
||||||
}else if(!(noise > 0.40 && noise < 0.54)){
|
}else if(!(noise > 0.40 && noise < 0.54)){
|
||||||
color.rgb *= 1.2;
|
color.rgb *= vec3(1.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
gl_FragColor = color;
|
gl_FragColor = color;
|
||||||
|
|||||||
BIN
core/assets/sounds/mineDeploy.ogg
Normal file
BIN
core/assets/sounds/plantBreak.ogg
Normal file
BIN
core/assets/sounds/rockBreak.ogg
Normal file
@@ -1,12 +0,0 @@
|
|||||||
#convert from stereo to mono
|
|
||||||
cd assets/sounds/
|
|
||||||
for i in *.ogg; do
|
|
||||||
echo $i
|
|
||||||
ffmpeg -i "$i" -ac 1 "OUT_$i"
|
|
||||||
done
|
|
||||||
|
|
||||||
find . -type f ! -name "OUT_*" -delete
|
|
||||||
|
|
||||||
for file in OUT_*; do mv "$file" "${file#OUT_}"; done;
|
|
||||||
|
|
||||||
cd ../../
|
|
||||||
@@ -55,7 +55,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
|
|||||||
Log.info("[GL] Max texture size: @", maxTextureSize);
|
Log.info("[GL] Max texture size: @", maxTextureSize);
|
||||||
Log.info("[GL] Using @ context.", gl30 != null ? "OpenGL 3" : "OpenGL 2");
|
Log.info("[GL] Using @ context.", gl30 != null ? "OpenGL 3" : "OpenGL 2");
|
||||||
if(maxTextureSize < 4096) Log.warn("[GL] Your maximum texture size is below the recommended minimum of 4096. This will cause severe performance issues.");
|
if(maxTextureSize < 4096) Log.warn("[GL] Your maximum texture size is below the recommended minimum of 4096. This will cause severe performance issues.");
|
||||||
Log.info("[JAVA] Version: @", System.getProperty("java.version"));
|
Log.info("[JAVA] Version: @", OS.javaVersion);
|
||||||
|
|
||||||
Time.setDeltaProvider(() -> {
|
Time.setDeltaProvider(() -> {
|
||||||
float result = Core.graphics.getDeltaTime() * 60f;
|
float result = Core.graphics.getDeltaTime() * 60f;
|
||||||
|
|||||||
@@ -24,10 +24,8 @@ import mindustry.logic.*;
|
|||||||
import mindustry.maps.Map;
|
import mindustry.maps.Map;
|
||||||
import mindustry.maps.*;
|
import mindustry.maps.*;
|
||||||
import mindustry.mod.*;
|
import mindustry.mod.*;
|
||||||
import mindustry.net.Net;
|
|
||||||
import mindustry.net.*;
|
import mindustry.net.*;
|
||||||
import mindustry.service.*;
|
import mindustry.service.*;
|
||||||
import mindustry.world.*;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.charset.*;
|
import java.nio.charset.*;
|
||||||
@@ -113,8 +111,6 @@ public class Vars implements Loadable{
|
|||||||
public static final float tilePayload = tilesize * tilesize;
|
public static final float tilePayload = tilesize * tilesize;
|
||||||
/** icon sizes for UI */
|
/** icon sizes for UI */
|
||||||
public static final float iconXLarge = 8*6f, iconLarge = 8*5f, iconMed = 8*4f, iconSmall = 8*3f;
|
public static final float iconXLarge = 8*6f, iconLarge = 8*5f, iconMed = 8*4f, iconSmall = 8*3f;
|
||||||
/** tile used in certain situations, instead of null */
|
|
||||||
public static Tile emptyTile;
|
|
||||||
/** for map generator dialog */
|
/** for map generator dialog */
|
||||||
public static boolean updateEditorOnChange = false;
|
public static boolean updateEditorOnChange = false;
|
||||||
/** all choosable player colors in join/host dialog */
|
/** all choosable player colors in join/host dialog */
|
||||||
@@ -148,6 +144,8 @@ public class Vars implements Loadable{
|
|||||||
public static int maxTextureSize = 2048;
|
public static int maxTextureSize = 2048;
|
||||||
/** Whether to show the core landing animation. */
|
/** Whether to show the core landing animation. */
|
||||||
public static boolean showLandAnimation = true;
|
public static boolean showLandAnimation = true;
|
||||||
|
/** Whether to check for memory use before taking screenshots. */
|
||||||
|
public static boolean checkScreenshotMemory = true;
|
||||||
/** Whether to prompt the user to confirm exiting. */
|
/** Whether to prompt the user to confirm exiting. */
|
||||||
public static boolean confirmExit = true;
|
public static boolean confirmExit = true;
|
||||||
/** if true, UI is not drawn */
|
/** if true, UI is not drawn */
|
||||||
@@ -276,7 +274,6 @@ public class Vars implements Loadable{
|
|||||||
schematicDirectory = dataDirectory.child("schematics/");
|
schematicDirectory = dataDirectory.child("schematics/");
|
||||||
bebuildDirectory = dataDirectory.child("be_builds/");
|
bebuildDirectory = dataDirectory.child("be_builds/");
|
||||||
emptyMap = new Map(new StringMap());
|
emptyMap = new Map(new StringMap());
|
||||||
emptyTile = null;
|
|
||||||
|
|
||||||
if(tree == null) tree = new FileTree();
|
if(tree == null) tree = new FileTree();
|
||||||
if(mods == null) mods = new Mods();
|
if(mods == null) mods = new Mods();
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ public class BlockIndexer{
|
|||||||
private Seq<Building> breturnArray = new Seq<>(Building.class);
|
private Seq<Building> breturnArray = new Seq<>(Building.class);
|
||||||
|
|
||||||
public BlockIndexer(){
|
public BlockIndexer(){
|
||||||
|
clearFlags();
|
||||||
|
|
||||||
Events.on(TilePreChangeEvent.class, event -> {
|
Events.on(TilePreChangeEvent.class, event -> {
|
||||||
removeIndex(event.tile);
|
removeIndex(event.tile);
|
||||||
@@ -62,11 +63,7 @@ public class BlockIndexer{
|
|||||||
flagMap = new TileArray[Team.all.length][BlockFlag.all.length];
|
flagMap = new TileArray[Team.all.length][BlockFlag.all.length];
|
||||||
activeTeams = new Seq<>(Team.class);
|
activeTeams = new Seq<>(Team.class);
|
||||||
|
|
||||||
for(int i = 0; i < flagMap.length; i++){
|
clearFlags();
|
||||||
for(int j = 0; j < BlockFlag.all.length; j++){
|
|
||||||
flagMap[i][j] = new TileArray();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
allOres.clear();
|
allOres.clear();
|
||||||
ores = new IntSeq[content.items().size][][];
|
ores = new IntSeq[content.items().size][][];
|
||||||
@@ -106,7 +103,7 @@ public class BlockIndexer{
|
|||||||
|
|
||||||
public void removeIndex(Tile tile){
|
public void removeIndex(Tile tile){
|
||||||
var team = tile.team();
|
var team = tile.team();
|
||||||
if(team != Team.derelict && tile.isCenter()){
|
if(tile.build != null && tile.isCenter()){
|
||||||
var flags = tile.block().flags;
|
var flags = tile.block().flags;
|
||||||
var data = team.data();
|
var data = team.data();
|
||||||
|
|
||||||
@@ -160,6 +157,14 @@ public class BlockIndexer{
|
|||||||
return blocksPresent != null && blocksPresent[block.id];
|
return blocksPresent != null && blocksPresent[block.id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void clearFlags(){
|
||||||
|
for(int i = 0; i < flagMap.length; i++){
|
||||||
|
for(int j = 0; j < BlockFlag.all.length; j++){
|
||||||
|
flagMap[i][j] = new TileArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private TileArray[] getFlagged(Team team){
|
private TileArray[] getFlagged(Team team){
|
||||||
return flagMap[team.id];
|
return flagMap[team.id];
|
||||||
}
|
}
|
||||||
@@ -285,7 +290,7 @@ public class BlockIndexer{
|
|||||||
for(int i = 0; i < activeTeams.size; i++){
|
for(int i = 0; i < activeTeams.size; i++){
|
||||||
Team enemy = activeTeams.items[i];
|
Team enemy = activeTeams.items[i];
|
||||||
|
|
||||||
if(enemy == team || team == Team.derelict) continue;
|
if(enemy == team || (team == Team.derelict && !state.rules.coreCapture)) continue;
|
||||||
|
|
||||||
Building entity = indexer.findTile(enemy, x, y, range, pred, true);
|
Building entity = indexer.findTile(enemy, x, y, range, pred, true);
|
||||||
if(entity != null){
|
if(entity != null){
|
||||||
@@ -360,7 +365,7 @@ public class BlockIndexer{
|
|||||||
private void process(Tile tile){
|
private void process(Tile tile){
|
||||||
var team = tile.team();
|
var team = tile.team();
|
||||||
//only process entity changes with centered tiles
|
//only process entity changes with centered tiles
|
||||||
if(tile.isCenter() && team != Team.derelict){
|
if(tile.isCenter() && tile.build != null){
|
||||||
var data = team.data();
|
var data = team.data();
|
||||||
if(tile.block().flags.size() > 0 && tile.isCenter()){
|
if(tile.block().flags.size() > 0 && tile.isCenter()){
|
||||||
TileArray[] map = getFlagged(team);
|
TileArray[] map = getFlagged(team);
|
||||||
|
|||||||
@@ -119,9 +119,11 @@ public class Pathfinder implements Runnable{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int tid = tile.getTeamID();
|
||||||
|
|
||||||
return PathTile.get(
|
return PathTile.get(
|
||||||
tile.build == null || !solid || tile.block() instanceof CoreBlock ? 0 : Math.min((int)(tile.build.health / 40), 80),
|
tile.build == null || !solid || tile.block() instanceof CoreBlock ? 0 : Math.min((int)(tile.build.health / 40), 80),
|
||||||
tile.getTeamID(),
|
tid == 0 && tile.build != null && state.rules.coreCapture ? 255 : tid, //use teamid = 255 when core capture is enabled to mark out derelict structures
|
||||||
solid,
|
solid,
|
||||||
tile.floor().isLiquid,
|
tile.floor().isLiquid,
|
||||||
tile.staticDarkness() >= 2 || (tile.floor().solid && tile.block() == Blocks.air),
|
tile.staticDarkness() >= 2 || (tile.floor().solid && tile.block() == Blocks.air),
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ public class BuilderAI extends AIController{
|
|||||||
@Nullable Unit following;
|
@Nullable Unit following;
|
||||||
@Nullable Teamc enemy;
|
@Nullable Teamc enemy;
|
||||||
float retreatTimer;
|
float retreatTimer;
|
||||||
|
@Nullable BlockPlan lastPlan;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateMovement(){
|
public void updateMovement(){
|
||||||
@@ -43,6 +44,7 @@ public class BuilderAI extends AIController{
|
|||||||
//set to follower's first build plan, whatever that is
|
//set to follower's first build plan, whatever that is
|
||||||
unit.plans.clear();
|
unit.plans.clear();
|
||||||
unit.plans.addFirst(following.buildPlan());
|
unit.plans.addFirst(following.buildPlan());
|
||||||
|
lastPlan = null;
|
||||||
}else if(unit.buildPlan() == null){
|
}else if(unit.buildPlan() == null){
|
||||||
//not following anyone or building
|
//not following anyone or building
|
||||||
if(timer.get(timerTarget4, 40)){
|
if(timer.get(timerTarget4, 40)){
|
||||||
@@ -78,10 +80,11 @@ public class BuilderAI extends AIController{
|
|||||||
}
|
}
|
||||||
|
|
||||||
boolean valid =
|
boolean valid =
|
||||||
(req.tile() != null && req.tile().build instanceof ConstructBuild cons && cons.current == req.block) ||
|
!(lastPlan != null && lastPlan.removed) &&
|
||||||
|
((req.tile() != null && req.tile().build instanceof ConstructBuild cons && cons.current == req.block) ||
|
||||||
(req.breaking ?
|
(req.breaking ?
|
||||||
Build.validBreak(unit.team(), req.x, req.y) :
|
Build.validBreak(unit.team(), req.x, req.y) :
|
||||||
Build.validPlace(req.block, unit.team(), req.x, req.y, req.rotation));
|
Build.validPlace(req.block, unit.team(), req.x, req.y, req.rotation)));
|
||||||
|
|
||||||
if(valid){
|
if(valid){
|
||||||
//move toward the request
|
//move toward the request
|
||||||
@@ -89,6 +92,7 @@ public class BuilderAI extends AIController{
|
|||||||
}else{
|
}else{
|
||||||
//discard invalid request
|
//discard invalid request
|
||||||
unit.plans.removeFirst();
|
unit.plans.removeFirst();
|
||||||
|
lastPlan = null;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
|
|
||||||
@@ -127,6 +131,7 @@ public class BuilderAI extends AIController{
|
|||||||
if(world.tile(block.x, block.y) != null && world.tile(block.x, block.y).block().id == block.block){
|
if(world.tile(block.x, block.y) != null && world.tile(block.x, block.y).block().id == block.block){
|
||||||
blocks.removeFirst();
|
blocks.removeFirst();
|
||||||
}else if(Build.validPlace(content.block(block.block), unit.team(), block.x, block.y, block.rotation)){ //it's valid.
|
}else if(Build.validPlace(content.block(block.block), unit.team(), block.x, block.y, block.rotation)){ //it's valid.
|
||||||
|
lastPlan = block;
|
||||||
//add build request.
|
//add build request.
|
||||||
unit.addBuild(new BuildPlan(block.x, block.y, block.rotation, content.block(block.block), block.config));
|
unit.addBuild(new BuildPlan(block.x, block.y, block.rotation, content.block(block.block), block.config));
|
||||||
//shift build plan to tail so next unit builds something else.
|
//shift build plan to tail so next unit builds something else.
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ public class LogicAI extends AIController{
|
|||||||
//look where moving if there's nothing to aim at
|
//look where moving if there's nothing to aim at
|
||||||
if(!shoot){
|
if(!shoot){
|
||||||
unit.lookAt(unit.prefRotation());
|
unit.lookAt(unit.prefRotation());
|
||||||
}else if(unit.hasWeapons() && unit.mounts.length > 0){ //if there is, look at the object
|
}else if(unit.hasWeapons() && unit.mounts.length > 0 && !unit.mounts[0].weapon.ignoreRotation){ //if there is, look at the object
|
||||||
unit.lookAt(unit.mounts[0].aimX, unit.mounts[0].aimY);
|
unit.lookAt(unit.mounts[0].aimX, unit.mounts[0].aimY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ public class Blocks implements ContentList{
|
|||||||
melter, separator, disassembler, sporePress, pulverizer, incinerator, coalCentrifuge,
|
melter, separator, disassembler, sporePress, pulverizer, incinerator, coalCentrifuge,
|
||||||
|
|
||||||
//sandbox
|
//sandbox
|
||||||
powerSource, powerVoid, itemSource, itemVoid, liquidSource, liquidVoid, payloadVoid, payloadSource, illuminator,
|
powerSource, powerVoid, itemSource, itemVoid, liquidSource, liquidVoid, payloadSource, payloadVoid, illuminator,
|
||||||
|
|
||||||
//defense
|
//defense
|
||||||
copperWall, copperWallLarge, titaniumWall, titaniumWallLarge, plastaniumWall, plastaniumWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge,
|
copperWall, copperWallLarge, titaniumWall, titaniumWallLarge, plastaniumWall, plastaniumWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge,
|
||||||
@@ -235,7 +235,6 @@ public class Blocks implements ContentList{
|
|||||||
magmarock = new Floor("magmarock"){{
|
magmarock = new Floor("magmarock"){{
|
||||||
attributes.set(Attribute.heat, 0.75f);
|
attributes.set(Attribute.heat, 0.75f);
|
||||||
attributes.set(Attribute.water, -0.75f);
|
attributes.set(Attribute.water, -0.75f);
|
||||||
updateEffect = Fx.magmasmoke;
|
|
||||||
blendGroup = basalt;
|
blendGroup = basalt;
|
||||||
|
|
||||||
emitLight = true;
|
emitLight = true;
|
||||||
@@ -369,6 +368,7 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
sporeCluster = new Prop("spore-cluster"){{
|
sporeCluster = new Prop("spore-cluster"){{
|
||||||
variants = 3;
|
variants = 3;
|
||||||
|
breakSound = Sounds.plantBreak;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
boulder = new Prop("boulder"){{
|
boulder = new Prop("boulder"){{
|
||||||
@@ -426,6 +426,9 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
darkMetal = new StaticWall("dark-metal");
|
darkMetal = new StaticWall("dark-metal");
|
||||||
|
|
||||||
|
Seq.with(metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor4, metalFloor5, darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6)
|
||||||
|
.each(b -> b.asFloor().wall = darkMetal);
|
||||||
|
|
||||||
pebbles = new DoubleOverlayFloor("pebbles");
|
pebbles = new DoubleOverlayFloor("pebbles");
|
||||||
|
|
||||||
tendrils = new OverlayFloor("tendrils");
|
tendrils = new OverlayFloor("tendrils");
|
||||||
@@ -659,12 +662,12 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
disassembler = new Separator("disassembler"){{
|
disassembler = new Separator("disassembler"){{
|
||||||
requirements(Category.crafting, with(Items.graphite, 140, Items.titanium, 100, Items.silicon, 150, Items.surgeAlloy, 70));
|
requirements(Category.crafting, with(Items.plastanium, 40, Items.titanium, 100, Items.silicon, 150, Items.thorium, 80));
|
||||||
results = with(
|
results = with(
|
||||||
Items.sand, 4,
|
Items.sand, 4,
|
||||||
Items.graphite, 2,
|
Items.graphite, 2,
|
||||||
Items.titanium, 2,
|
Items.titanium, 2,
|
||||||
Items.thorium, 1
|
Items.thorium, 2
|
||||||
);
|
);
|
||||||
hasPower = true;
|
hasPower = true;
|
||||||
craftTime = 15f;
|
craftTime = 15f;
|
||||||
@@ -1610,7 +1613,7 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
size = 2;
|
size = 2;
|
||||||
range = 190f;
|
range = 190f;
|
||||||
reloadTime = 34f;
|
reloadTime = 31f;
|
||||||
restitution = 0.03f;
|
restitution = 0.03f;
|
||||||
ammoEjectBack = 3f;
|
ammoEjectBack = 3f;
|
||||||
cooldown = 0.03f;
|
cooldown = 0.03f;
|
||||||
@@ -1978,25 +1981,25 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
repairPoint = new RepairPoint("repair-point"){{
|
repairPoint = new RepairPoint("repair-point"){{
|
||||||
requirements(Category.units, with(Items.lead, 20, Items.copper, 20, Items.silicon, 15));
|
requirements(Category.units, with(Items.lead, 30, Items.copper, 30, Items.silicon, 20));
|
||||||
repairSpeed = 0.5f;
|
repairSpeed = 0.45f;
|
||||||
repairRadius = 65f;
|
repairRadius = 60f;
|
||||||
beamWidth = 0.73f;
|
beamWidth = 0.73f;
|
||||||
powerUse = 1f;
|
powerUse = 1f;
|
||||||
pulseRadius = 5f;
|
pulseRadius = 5f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
repairTurret = new RepairPoint("repair-turret"){{
|
repairTurret = new RepairPoint("repair-turret"){{
|
||||||
requirements(Category.units, with(Items.silicon, 70, Items.thorium, 60, Items.plastanium, 60));
|
requirements(Category.units, with(Items.silicon, 90, Items.thorium, 80, Items.plastanium, 60));
|
||||||
size = 2;
|
size = 2;
|
||||||
length = 6f;
|
length = 6f;
|
||||||
repairSpeed = 4f;
|
repairSpeed = 3f;
|
||||||
repairRadius = 140f;
|
repairRadius = 145f;
|
||||||
powerUse = 5f;
|
powerUse = 5f;
|
||||||
beamWidth = 1.1f;
|
beamWidth = 1.1f;
|
||||||
pulseRadius = 6.1f;
|
pulseRadius = 6.1f;
|
||||||
coolantUse = 0.15f;
|
coolantUse = 0.16f;
|
||||||
coolantMultiplier = 1.7f;
|
coolantMultiplier = 1.6f;
|
||||||
acceptCoolant = true;
|
acceptCoolant = true;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
@@ -2068,12 +2071,12 @@ public class Blocks implements ContentList{
|
|||||||
alwaysUnlocked = true;
|
alwaysUnlocked = true;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
payloadVoid = new PayloadVoid("payload-void"){{
|
payloadSource = new PayloadSource("payload-source"){{
|
||||||
requirements(Category.units, BuildVisibility.sandboxOnly, with());
|
requirements(Category.units, BuildVisibility.sandboxOnly, with());
|
||||||
size = 5;
|
size = 5;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
payloadSource = new PayloadSource("payload-source"){{
|
payloadVoid = new PayloadVoid("payload-void"){{
|
||||||
requirements(Category.units, BuildVisibility.sandboxOnly, with());
|
requirements(Category.units, BuildVisibility.sandboxOnly, with());
|
||||||
size = 5;
|
size = 5;
|
||||||
}};
|
}};
|
||||||
|
|||||||
@@ -854,7 +854,7 @@ public class Fx{
|
|||||||
fireRemove = new Effect(70f, e -> {
|
fireRemove = new Effect(70f, e -> {
|
||||||
if(Fire.regions[0] == null) return;
|
if(Fire.regions[0] == null) return;
|
||||||
alpha(e.fout());
|
alpha(e.fout());
|
||||||
rect(Fire.regions[((int)(e.rotation + e.fin() * Fire.frames)) % Fire.frames], e.x, e.y);
|
rect(Fire.regions[((int)(e.rotation + e.fin() * Fire.frames)) % Fire.frames], e.x + Mathf.randomSeedRange((int)e.y, 2), e.y + Mathf.randomSeedRange((int)e.x, 2));
|
||||||
Drawf.light(e.x, e.y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * e.fout());
|
Drawf.light(e.x, e.y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * e.fout());
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ public class StatusEffects implements ContentList{
|
|||||||
|
|
||||||
affinity(blasted, ((unit, result, time) -> {
|
affinity(blasted, ((unit, result, time) -> {
|
||||||
unit.damagePierce(transitionDamage);
|
unit.damagePierce(transitionDamage);
|
||||||
result.set(freezing, time);
|
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
}};
|
}};
|
||||||
@@ -75,7 +74,6 @@ public class StatusEffects implements ContentList{
|
|||||||
if(unit.team == state.rules.waveTeam){
|
if(unit.team == state.rules.waveTeam){
|
||||||
Events.fire(Trigger.shock);
|
Events.fire(Trigger.shock);
|
||||||
}
|
}
|
||||||
result.set(wet, time);
|
|
||||||
}));
|
}));
|
||||||
opposite(burning, melting);
|
opposite(burning, melting);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ public class UnitTypes implements ContentList{
|
|||||||
mace = new UnitType("mace"){{
|
mace = new UnitType("mace"){{
|
||||||
speed = 0.45f;
|
speed = 0.45f;
|
||||||
hitSize = 10f;
|
hitSize = 10f;
|
||||||
health = 530;
|
health = 540;
|
||||||
armor = 4f;
|
armor = 4f;
|
||||||
|
|
||||||
immunities.add(StatusEffects.burning);
|
immunities.add(StatusEffects.burning);
|
||||||
@@ -96,7 +96,7 @@ public class UnitTypes implements ContentList{
|
|||||||
top = false;
|
top = false;
|
||||||
shootSound = Sounds.flame;
|
shootSound = Sounds.flame;
|
||||||
shootY = 2f;
|
shootY = 2f;
|
||||||
reload = 12f;
|
reload = 11f;
|
||||||
recoil = 1f;
|
recoil = 1f;
|
||||||
ejectEffect = Fx.none;
|
ejectEffect = Fx.none;
|
||||||
bullet = new BulletType(4.1f, 32f){{
|
bullet = new BulletType(4.1f, 32f){{
|
||||||
@@ -120,7 +120,7 @@ public class UnitTypes implements ContentList{
|
|||||||
hitSize = 13f;
|
hitSize = 13f;
|
||||||
rotateSpeed = 3f;
|
rotateSpeed = 3f;
|
||||||
targetAir = false;
|
targetAir = false;
|
||||||
health = 820;
|
health = 900;
|
||||||
armor = 9f;
|
armor = 9f;
|
||||||
mechFrontSway = 0.55f;
|
mechFrontSway = 0.55f;
|
||||||
|
|
||||||
@@ -133,15 +133,15 @@ public class UnitTypes implements ContentList{
|
|||||||
shake = 2f;
|
shake = 2f;
|
||||||
ejectEffect = Fx.casing2;
|
ejectEffect = Fx.casing2;
|
||||||
shootSound = Sounds.artillery;
|
shootSound = Sounds.artillery;
|
||||||
bullet = new ArtilleryBulletType(2f, 8, "shell"){{
|
bullet = new ArtilleryBulletType(2f, 20, "shell"){{
|
||||||
hitEffect = Fx.blastExplosion;
|
hitEffect = Fx.blastExplosion;
|
||||||
knockback = 0.8f;
|
knockback = 0.8f;
|
||||||
lifetime = 120f;
|
lifetime = 120f;
|
||||||
width = height = 14f;
|
width = height = 14f;
|
||||||
collides = true;
|
collides = true;
|
||||||
collidesTiles = true;
|
collidesTiles = true;
|
||||||
splashDamageRadius = 30f;
|
splashDamageRadius = 35f;
|
||||||
splashDamage = 60f;
|
splashDamage = 80f;
|
||||||
backColor = Pal.bulletYellowBack;
|
backColor = Pal.bulletYellowBack;
|
||||||
frontColor = Pal.bulletYellow;
|
frontColor = Pal.bulletYellow;
|
||||||
}};
|
}};
|
||||||
@@ -572,7 +572,7 @@ public class UnitTypes implements ContentList{
|
|||||||
speed = 1f;
|
speed = 1f;
|
||||||
splashDamageRadius = 60f;
|
splashDamageRadius = 60f;
|
||||||
instantDisappear = true;
|
instantDisappear = true;
|
||||||
splashDamage = 88f;
|
splashDamage = 90f;
|
||||||
killShooter = true;
|
killShooter = true;
|
||||||
hittable = false;
|
hittable = false;
|
||||||
collidesAir = true;
|
collidesAir = true;
|
||||||
@@ -581,7 +581,7 @@ public class UnitTypes implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
atrax = new UnitType("atrax"){{
|
atrax = new UnitType("atrax"){{
|
||||||
speed = 0.5f;
|
speed = 0.54f;
|
||||||
drag = 0.4f;
|
drag = 0.4f;
|
||||||
hitSize = 13f;
|
hitSize = 13f;
|
||||||
rotateSpeed = 3f;
|
rotateSpeed = 3f;
|
||||||
@@ -621,7 +621,7 @@ public class UnitTypes implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
spiroct = new UnitType("spiroct"){{
|
spiroct = new UnitType("spiroct"){{
|
||||||
speed = 0.45f;
|
speed = 0.48f;
|
||||||
drag = 0.4f;
|
drag = 0.4f;
|
||||||
hitSize = 15f;
|
hitSize = 15f;
|
||||||
rotateSpeed = 3f;
|
rotateSpeed = 3f;
|
||||||
@@ -1125,10 +1125,10 @@ public class UnitTypes implements ContentList{
|
|||||||
BulletType fragBullet = new FlakBulletType(4f, 5){{
|
BulletType fragBullet = new FlakBulletType(4f, 5){{
|
||||||
shootEffect = Fx.shootBig;
|
shootEffect = Fx.shootBig;
|
||||||
ammoMultiplier = 4f;
|
ammoMultiplier = 4f;
|
||||||
splashDamage = 50f;
|
splashDamage = 60f;
|
||||||
splashDamageRadius = 25f;
|
splashDamageRadius = 25f;
|
||||||
collidesGround = true;
|
collidesGround = true;
|
||||||
lifetime = 38f;
|
lifetime = 47f;
|
||||||
|
|
||||||
status = StatusEffects.blasted;
|
status = StatusEffects.blasted;
|
||||||
statusDuration = 60f;
|
statusDuration = 60f;
|
||||||
@@ -1148,12 +1148,12 @@ public class UnitTypes implements ContentList{
|
|||||||
rotate = true;
|
rotate = true;
|
||||||
|
|
||||||
bullet = new LaserBulletType(){{
|
bullet = new LaserBulletType(){{
|
||||||
damage = 100f;
|
damage = 110f;
|
||||||
sideAngle = 20f;
|
sideAngle = 20f;
|
||||||
sideWidth = 1.5f;
|
sideWidth = 1.5f;
|
||||||
sideLength = 80f;
|
sideLength = 80f;
|
||||||
width = 25f;
|
width = 25f;
|
||||||
length = 200f;
|
length = 230f;
|
||||||
shootEffect = Fx.shockwave;
|
shootEffect = Fx.shockwave;
|
||||||
colors = new Color[]{Color.valueOf("ec7458aa"), Color.valueOf("ff9c5a"), Color.white};
|
colors = new Color[]{Color.valueOf("ec7458aa"), Color.valueOf("ff9c5a"), Color.white};
|
||||||
}};
|
}};
|
||||||
@@ -1780,6 +1780,7 @@ public class UnitTypes implements ContentList{
|
|||||||
shots = 3;
|
shots = 3;
|
||||||
shotDelay = 7f;
|
shotDelay = 7f;
|
||||||
x = y = shootX = shootY = 0f;
|
x = y = shootX = shootY = 0f;
|
||||||
|
shootSound = Sounds.mineDeploy;
|
||||||
|
|
||||||
bullet = new BasicBulletType(){{
|
bullet = new BasicBulletType(){{
|
||||||
sprite = "mine-bullet";
|
sprite = "mine-bullet";
|
||||||
@@ -2047,7 +2048,6 @@ public class UnitTypes implements ContentList{
|
|||||||
buildSpeed = 3f;
|
buildSpeed = 3f;
|
||||||
|
|
||||||
abilities.add(new EnergyFieldAbility(35f, 65f, 180f){{
|
abilities.add(new EnergyFieldAbility(35f, 65f, 180f){{
|
||||||
repair = 35f;
|
|
||||||
statusDuration = 60f * 6f;
|
statusDuration = 60f * 6f;
|
||||||
maxTargets = 25;
|
maxTargets = 25;
|
||||||
}});
|
}});
|
||||||
@@ -2113,7 +2113,7 @@ public class UnitTypes implements ContentList{
|
|||||||
|
|
||||||
bullet = new ContinuousLaserBulletType(){{
|
bullet = new ContinuousLaserBulletType(){{
|
||||||
maxRange = 90f;
|
maxRange = 90f;
|
||||||
damage = 26f;
|
damage = 27f;
|
||||||
length = 95f;
|
length = 95f;
|
||||||
hitEffect = Fx.hitMeltHeal;
|
hitEffect = Fx.hitMeltHeal;
|
||||||
drawSize = 200f;
|
drawSize = 200f;
|
||||||
@@ -2144,24 +2144,27 @@ public class UnitTypes implements ContentList{
|
|||||||
x = 70f/4f;
|
x = 70f/4f;
|
||||||
y = -26f/4f;
|
y = -26f/4f;
|
||||||
|
|
||||||
reload = 70f;
|
reload = 65f;
|
||||||
shake = 3f;
|
shake = 3f;
|
||||||
rotateSpeed = 2f;
|
rotateSpeed = 2f;
|
||||||
shadow = 30f;
|
shadow = 30f;
|
||||||
shootY = 7f;
|
shootY = 7f;
|
||||||
recoil = 4f;
|
recoil = 4f;
|
||||||
cooldownTime = reload - 10f;
|
cooldownTime = reload - 10f;
|
||||||
|
//TODO better sound
|
||||||
|
shootSound = Sounds.laser;
|
||||||
|
|
||||||
bullet = new EmpBulletType(){{
|
bullet = new EmpBulletType(){{
|
||||||
float rad = 100f;
|
float rad = 100f;
|
||||||
|
|
||||||
|
scaleVelocity = true;
|
||||||
lightOpacity = 0.7f;
|
lightOpacity = 0.7f;
|
||||||
unitDamageScl = 0.8f;
|
unitDamageScl = 0.8f;
|
||||||
healPercent = 20f;
|
healPercent = 20f;
|
||||||
timeIncrease = 3f;
|
timeIncrease = 3f;
|
||||||
timeDuration = 60f * 20f;
|
timeDuration = 60f * 20f;
|
||||||
powerDamageScl = 3f;
|
powerDamageScl = 3f;
|
||||||
damage = 50;
|
damage = 60;
|
||||||
hitColor = lightColor = Pal.heal;
|
hitColor = lightColor = Pal.heal;
|
||||||
lightRadius = 70f;
|
lightRadius = 70f;
|
||||||
clipSize = 250f;
|
clipSize = 250f;
|
||||||
@@ -2177,11 +2180,12 @@ public class UnitTypes implements ContentList{
|
|||||||
trailWidth = 6f;
|
trailWidth = 6f;
|
||||||
trailColor = Pal.heal;
|
trailColor = Pal.heal;
|
||||||
trailInterval = 3f;
|
trailInterval = 3f;
|
||||||
splashDamage = 60f;
|
splashDamage = 70f;
|
||||||
splashDamageRadius = rad;
|
splashDamageRadius = rad;
|
||||||
hitShake = 4f;
|
hitShake = 4f;
|
||||||
trailRotation = true;
|
trailRotation = true;
|
||||||
status = StatusEffects.electrified;
|
status = StatusEffects.electrified;
|
||||||
|
hitSound = Sounds.plasmaboom;
|
||||||
|
|
||||||
trailEffect = new Effect(16f, e -> {
|
trailEffect = new Effect(16f, e -> {
|
||||||
color(Pal.heal);
|
color(Pal.heal);
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ public class Logic implements ApplicationListener{
|
|||||||
BlockPlan b = it.next();
|
BlockPlan b = it.next();
|
||||||
Block block = content.block(b.block);
|
Block block = content.block(b.block);
|
||||||
if(event.tile.block().bounds(event.tile.x, event.tile.y, Tmp.r1).overlaps(block.bounds(b.x, b.y, Tmp.r2))){
|
if(event.tile.block().bounds(event.tile.x, event.tile.y, Tmp.r1).overlaps(block.bounds(b.x, b.y, Tmp.r2))){
|
||||||
|
b.removed = true;
|
||||||
it.remove();
|
it.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -128,25 +129,7 @@ public class Logic implements ApplicationListener{
|
|||||||
|
|
||||||
Events.on(SectorCaptureEvent.class, e -> {
|
Events.on(SectorCaptureEvent.class, e -> {
|
||||||
if(!net.client() && e.sector == state.getSector() && e.sector.isBeingPlayed()){
|
if(!net.client() && e.sector == state.getSector() && e.sector.isBeingPlayed()){
|
||||||
for(Tile tile : world.tiles){
|
state.rules.waveTeam.data().destroyToDerelict();
|
||||||
//convert all blocks to neutral, randomly killing them
|
|
||||||
if(tile.isCenter() && tile.build != null && tile.build.team == state.rules.waveTeam){
|
|
||||||
Building b = tile.build;
|
|
||||||
Call.setTeam(b, Team.derelict);
|
|
||||||
Time.run(Mathf.random(0f, 60f * 6f), () -> {
|
|
||||||
if(Mathf.chance(0.25)){
|
|
||||||
b.kill();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//kill all units
|
|
||||||
Groups.unit.each(u -> {
|
|
||||||
if(u.team == state.rules.waveTeam){
|
|
||||||
Time.run(Mathf.random(0f, 60f * 5f), u::kill);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -162,6 +145,12 @@ public class Logic implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//listen to core changes; if all cores have been destroyed, set to derelict.
|
||||||
|
Events.on(CoreChangeEvent.class, e -> Core.app.post(() -> {
|
||||||
|
if(state.rules.cleanupDeadTeams && state.rules.pvp && !e.core.isAdded() && e.core.team != Team.derelict && e.core.team.cores().isEmpty()){
|
||||||
|
e.core.team.data().destroyToDerelict();
|
||||||
|
}
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Adds starting items, resets wave time, and sets state to playing. */
|
/** Adds starting items, resets wave time, and sets state to playing. */
|
||||||
@@ -247,11 +236,11 @@ public class Logic implements ApplicationListener{
|
|||||||
Events.fire(new GameOverEvent(state.rules.waveTeam));
|
Events.fire(new GameOverEvent(state.rules.waveTeam));
|
||||||
}else if(state.rules.attackMode){
|
}else if(state.rules.attackMode){
|
||||||
//count # of teams alive
|
//count # of teams alive
|
||||||
int countAlive = state.teams.getActive().count(TeamData::hasCore);
|
int countAlive = state.teams.getActive().count(t -> t.hasCore() && t.team != Team.derelict);
|
||||||
|
|
||||||
if((countAlive <= 1 || (!state.rules.pvp && state.rules.defaultTeam.core() == null)) && !state.gameOver){
|
if((countAlive <= 1 || (!state.rules.pvp && state.rules.defaultTeam.core() == null)) && !state.gameOver){
|
||||||
//find team that won
|
//find team that won
|
||||||
TeamData left = state.teams.getActive().find(TeamData::hasCore);
|
TeamData left = state.teams.getActive().find(t -> t.hasCore() && t.team != Team.derelict);
|
||||||
Events.fire(new GameOverEvent(left == null ? Team.derelict : left.team));
|
Events.fire(new GameOverEvent(left == null ? Team.derelict : left.team));
|
||||||
state.gameOver = true;
|
state.gameOver = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -159,6 +159,22 @@ public class NetClient implements ApplicationListener{
|
|||||||
clientPacketReliable(type, contents);
|
clientPacketReliable(type, contents);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO enable in build 129
|
||||||
|
/*
|
||||||
|
@Remote(variants = Variant.both, unreliable = true)
|
||||||
|
public static void sound(Sound sound, float volume, float pitch, float pan){
|
||||||
|
if(sound == null) return;
|
||||||
|
|
||||||
|
sound.play(volume * Core.settings.getInt("sfxvol") / 100f, pitch, pan);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Remote(variants = Variant.both, unreliable = true)
|
||||||
|
public static void soundAt(Sound sound, float x, float y, float volume, float pitch){
|
||||||
|
if(sound == null) return;
|
||||||
|
|
||||||
|
sound.at(x, y, pitch, volume);
|
||||||
|
}*/
|
||||||
|
|
||||||
@Remote(variants = Variant.both, unreliable = true)
|
@Remote(variants = Variant.both, unreliable = true)
|
||||||
public static void effect(Effect effect, float x, float y, float rotation, Color color){
|
public static void effect(Effect effect, float x, float y, float rotation, Color color){
|
||||||
if(effect == null) return;
|
if(effect == null) return;
|
||||||
|
|||||||
@@ -344,8 +344,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
boolean checkPass(){
|
boolean checkPass(){
|
||||||
if(votes >= votesRequired()){
|
if(votes >= votesRequired()){
|
||||||
Call.sendMessage(Strings.format("[orange]Vote passed.[scarlet] @[orange] will be banned from the server for @ minutes.", target.name, (kickDuration / 60)));
|
Call.sendMessage(Strings.format("[orange]Vote passed.[scarlet] @[orange] will be banned from the server for @ minutes.", target.name, (kickDuration / 60)));
|
||||||
target.getInfo().lastKicked = Time.millis() + kickDuration * 1000;
|
Groups.player.each(p -> p.uuid().equals(target.uuid()), p -> p.kick(KickReason.vote, kickDuration * 1000));
|
||||||
Groups.player.each(p -> p.uuid().equals(target.uuid()), p -> p.kick(KickReason.vote));
|
|
||||||
map[0] = null;
|
map[0] = null;
|
||||||
task.cancel();
|
task.cancel();
|
||||||
return true;
|
return true;
|
||||||
@@ -472,6 +471,10 @@ public class NetServer implements ApplicationListener{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!player.dead() && player.unit().isCommanding()){
|
||||||
|
player.unit().clearCommand();
|
||||||
|
}
|
||||||
|
|
||||||
player.getInfo().lastSyncTime = Time.millis();
|
player.getInfo().lastSyncTime = Time.millis();
|
||||||
Call.worldDataBegin(player.con);
|
Call.worldDataBegin(player.con);
|
||||||
netServer.sendWorldData(player);
|
netServer.sendWorldData(player);
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import arc.scene.ui.layout.*;
|
|||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import arc.util.async.*;
|
import arc.util.async.*;
|
||||||
|
import mindustry.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.game.EventType.*;
|
import mindustry.game.EventType.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
@@ -355,7 +356,7 @@ public class Renderer implements ApplicationListener{
|
|||||||
int w = world.width() * tilesize, h = world.height() * tilesize;
|
int w = world.width() * tilesize, h = world.height() * tilesize;
|
||||||
int memory = w * h * 4 / 1024 / 1024;
|
int memory = w * h * 4 / 1024 / 1024;
|
||||||
|
|
||||||
if(memory >= (mobile ? 65 : 120)){
|
if(Vars.checkScreenshotMemory && memory >= (mobile ? 65 : 120)){
|
||||||
ui.showInfo("@screenshot.invalid");
|
ui.showInfo("@screenshot.invalid");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ import static arc.scene.actions.Actions.*;
|
|||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class UI implements ApplicationListener, Loadable{
|
public class UI implements ApplicationListener, Loadable{
|
||||||
private static String billions, millions, thousands;
|
public static String billions, millions, thousands;
|
||||||
|
|
||||||
public static PixmapPacker packer;
|
public static PixmapPacker packer;
|
||||||
|
|
||||||
|
|||||||
@@ -525,8 +525,7 @@ public class World{
|
|||||||
|
|
||||||
private class Context implements WorldContext{
|
private class Context implements WorldContext{
|
||||||
|
|
||||||
Context(){
|
Context(){}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Tile tile(int index){
|
public Tile tile(int index){
|
||||||
@@ -579,7 +578,7 @@ public class World{
|
|||||||
|
|
||||||
for(GenerateFilter filter : filters){
|
for(GenerateFilter filter : filters){
|
||||||
filter.randomize();
|
filter.randomize();
|
||||||
input.begin(filter, width(), height(), (x, y) -> tiles.getn(x, y));
|
input.begin(width(), height(), (x, y) -> tiles.getn(x, y));
|
||||||
filter.apply(tiles, input);
|
filter.apply(tiles, input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import mindustry.game.*;
|
|||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
import mindustry.io.*;
|
import mindustry.io.*;
|
||||||
|
import mindustry.maps.*;
|
||||||
import mindustry.maps.filters.*;
|
import mindustry.maps.filters.*;
|
||||||
import mindustry.maps.filters.GenerateFilter.*;
|
import mindustry.maps.filters.GenerateFilter.*;
|
||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
@@ -26,12 +27,6 @@ import static mindustry.Vars.*;
|
|||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class MapGenerateDialog extends BaseDialog{
|
public class MapGenerateDialog extends BaseDialog{
|
||||||
final Prov<GenerateFilter>[] filterTypes = new Prov[]{
|
|
||||||
NoiseFilter::new, ScatterFilter::new, TerrainFilter::new, DistortFilter::new,
|
|
||||||
RiverNoiseFilter::new, OreFilter::new, OreMedianFilter::new, MedianFilter::new,
|
|
||||||
BlendFilter::new, MirrorFilter::new, ClearFilter::new, CoreSpawnFilter::new,
|
|
||||||
EnemySpawnFilter::new, SpawnPathFilter::new
|
|
||||||
};
|
|
||||||
final boolean applied;
|
final boolean applied;
|
||||||
|
|
||||||
Pixmap pixmap;
|
Pixmap pixmap;
|
||||||
@@ -158,7 +153,7 @@ public class MapGenerateDialog extends BaseDialog{
|
|||||||
long[] writeTiles = new long[editor.width() * editor.height()];
|
long[] writeTiles = new long[editor.width() * editor.height()];
|
||||||
|
|
||||||
for(GenerateFilter filter : filters){
|
for(GenerateFilter filter : filters){
|
||||||
input.begin(filter, editor.width(), editor.height(), editor::tile);
|
input.begin(editor.width(), editor.height(), editor::tile);
|
||||||
|
|
||||||
//write to buffer
|
//write to buffer
|
||||||
for(int x = 0; x < editor.width(); x++){
|
for(int x = 0; x < editor.width(); x++){
|
||||||
@@ -333,7 +328,7 @@ public class MapGenerateDialog extends BaseDialog{
|
|||||||
p.marginRight(14);
|
p.marginRight(14);
|
||||||
p.defaults().size(195f, 56f);
|
p.defaults().size(195f, 56f);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for(var gen : filterTypes){
|
for(var gen : Maps.allFilterTypes){
|
||||||
var filter = gen.get();
|
var filter = gen.get();
|
||||||
var icon = filter.icon();
|
var icon = filter.icon();
|
||||||
|
|
||||||
@@ -414,7 +409,7 @@ public class MapGenerateDialog extends BaseDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(var filter : copy){
|
for(var filter : copy){
|
||||||
input.begin(filter, editor.width(), editor.height(), (x, y) -> unpack(buffer1[Mathf.clamp(x / scaling, 0, pixmap.width -1) + w* Mathf.clamp(y / scaling, 0, pixmap.height -1)]));
|
input.begin(editor.width(), editor.height(), (x, y) -> unpack(buffer1[Mathf.clamp(x / scaling, 0, pixmap.width -1) + w* Mathf.clamp(y / scaling, 0, pixmap.height -1)]));
|
||||||
|
|
||||||
//read from buffer1 and write to buffer2
|
//read from buffer1 and write to buffer2
|
||||||
pixmap.each((px, py) -> {
|
pixmap.each((px, py) -> {
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ public class WaveGraph extends Table{
|
|||||||
|
|
||||||
for(int i = 0; i < values.length; i++){
|
for(int i = 0; i < values.length; i++){
|
||||||
int val = values[i][type.id];
|
int val = values[i][type.id];
|
||||||
float cx = graphX + i*spacing, cy = 2f + graphY + val * (graphH - 4f) / max;
|
float cx = graphX + i*spacing, cy = graphY + val * graphH / max;
|
||||||
Lines.linePoint(cx, cy);
|
Lines.linePoint(cx, cy);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ public class WaveGraph extends Table{
|
|||||||
sum += values[i][type.id];
|
sum += values[i][type.id];
|
||||||
}
|
}
|
||||||
|
|
||||||
float cx = graphX + i*spacing, cy = 2f + graphY + sum * (graphH - 4f) / maxTotal;
|
float cx = graphX + i*spacing, cy = graphY + sum * graphH / maxTotal;
|
||||||
Lines.linePoint(cx, cy);
|
Lines.linePoint(cx, cy);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ public class WaveGraph extends Table{
|
|||||||
sum += (type.health) * values[i][type.id];
|
sum += (type.health) * values[i][type.id];
|
||||||
}
|
}
|
||||||
|
|
||||||
float cx = graphX + i*spacing, cy = 2f + graphY + sum * (graphH - 4f) / maxHealth;
|
float cx = graphX + i*spacing, cy = graphY + sum * graphH / maxHealth;
|
||||||
Lines.linePoint(cx, cy);
|
Lines.linePoint(cx, cy);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,29 +92,29 @@ public class WaveGraph extends Table{
|
|||||||
}
|
}
|
||||||
|
|
||||||
//how many numbers can fit here
|
//how many numbers can fit here
|
||||||
float totalMarks = (height - offsetY - getMarginBottom() *2f - 1f) / (lay.height * 2);
|
float totalMarks = (graphH - getMarginBottom() *2f) / (lay.height * 2);
|
||||||
|
|
||||||
int markSpace = Math.max(1, Mathf.ceil(max / totalMarks));
|
int markSpace = Math.max(1, Mathf.ceil(max / totalMarks));
|
||||||
|
|
||||||
Draw.color(Color.lightGray);
|
Draw.color(Color.lightGray);
|
||||||
for(int i = 0; i < max; i += markSpace){
|
for(int i = 0; i < max; i += markSpace){
|
||||||
float cy = 2f + y + i * (height - 4f) / max + offsetY, cx = x + offsetX;
|
float cy = graphY + i * graphH / max, cx = graphX;
|
||||||
//Lines.line(cx, cy, cx + len, cy);
|
//Lines.line(cx, cy, cx + len, cy);
|
||||||
|
|
||||||
lay.setText(font, "" + i);
|
lay.setText(font, "" + i);
|
||||||
|
|
||||||
font.draw("" + i, cx, cy + lay.height/2f - Scl.scl(3f), Align.right);
|
font.draw("" + i, cx, cy + lay.height/2f, Align.right);
|
||||||
}
|
}
|
||||||
|
|
||||||
float len = Scl.scl(4f);
|
float len = Scl.scl(4f);
|
||||||
font.setColor(Color.lightGray);
|
font.setColor(Color.lightGray);
|
||||||
|
|
||||||
for(int i = 0; i < values.length; i++){
|
for(int i = 0; i < values.length; i++){
|
||||||
float cy = y + fh, cx = x + graphW / (values.length - 1) * i + offsetX;
|
float cy = y + fh, cx = graphX + graphW / (values.length - 1) * i;
|
||||||
|
|
||||||
Lines.line(cx, cy, cx, cy + len);
|
Lines.line(cx, cy, cx, cy + len);
|
||||||
if(i == values.length/2){
|
if(i == values.length/2){
|
||||||
font.draw("" + (i + from + 1), cx, cy - 2f, Align.center);
|
font.draw("" + (i + from + 1), cx, cy - Scl.scl(2f), Align.center);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
font.setColor(Color.white);
|
font.setColor(Color.white);
|
||||||
|
|||||||
@@ -52,22 +52,22 @@ public class Puddles{
|
|||||||
Puddle p = map.get(tile.pos());
|
Puddle p = map.get(tile.pos());
|
||||||
if(p == null){
|
if(p == null){
|
||||||
Puddle puddle = Puddle.create();
|
Puddle puddle = Puddle.create();
|
||||||
puddle.tile(tile);
|
puddle.tile = tile;
|
||||||
puddle.liquid(liquid);
|
puddle.liquid = liquid;
|
||||||
puddle.amount(amount);
|
puddle.amount = amount;
|
||||||
puddle.generation(generation);
|
puddle.generation = generation;
|
||||||
puddle.set((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f);
|
puddle.set((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f);
|
||||||
puddle.add();
|
puddle.add();
|
||||||
map.put(tile.pos(), puddle);
|
map.put(tile.pos(), puddle);
|
||||||
}else if(p.liquid() == liquid){
|
}else if(p.liquid == liquid){
|
||||||
p.accepting(Math.max(amount, p.accepting()));
|
p.accepting = Math.max(amount, p.accepting);
|
||||||
|
|
||||||
if(generation == 0 && p.lastRipple <= Time.time - 40f && p.amount() >= maxLiquid / 2f){
|
if(generation == 0 && p.lastRipple <= Time.time - 40f && p.amount >= maxLiquid / 2f){
|
||||||
Fx.ripple.at((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f, 1f, p.liquid().color);
|
Fx.ripple.at((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f, 1f, p.liquid.color);
|
||||||
p.lastRipple = Time.time;
|
p.lastRipple = Time.time;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
p.amount(p.amount() + reactPuddle(p.liquid(), liquid, amount, p.tile(), (p.x() + source.worldx())/2f, (p.y() + source.worldy())/2f));
|
p.amount += reactPuddle(p.liquid, liquid, amount, p.tile, (p.x + source.worldx())/2f, (p.y + source.worldy())/2f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package mindustry.entities.abilities;
|
package mindustry.entities.abilities;
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
|
import arc.audio.*;
|
||||||
import arc.graphics.*;
|
import arc.graphics.*;
|
||||||
import arc.graphics.g2d.*;
|
import arc.graphics.g2d.*;
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
@@ -16,14 +17,15 @@ import mindustry.type.*;
|
|||||||
public class EnergyFieldAbility extends Ability{
|
public class EnergyFieldAbility extends Ability{
|
||||||
private static final Seq<Healthc> all = new Seq<>();
|
private static final Seq<Healthc> all = new Seq<>();
|
||||||
|
|
||||||
public float damage = 1, repair = 20f, reload = 100, range = 60;
|
public float damage = 1, reload = 100, range = 60;
|
||||||
public Effect healEffect = Fx.heal, hitEffect = Fx.hitLaserBlast, damageEffect = Fx.chainLightning;
|
public Effect healEffect = Fx.heal, hitEffect = Fx.hitLaserBlast, damageEffect = Fx.chainLightning;
|
||||||
public StatusEffect status = StatusEffects.electrified;
|
public StatusEffect status = StatusEffects.electrified;
|
||||||
|
public Sound shootSound = Sounds.spark;
|
||||||
public float statusDuration = 60f * 6f;
|
public float statusDuration = 60f * 6f;
|
||||||
public float x, y;
|
public float x, y;
|
||||||
public boolean hitBuildings = true;
|
public boolean hitBuildings = true;
|
||||||
public int maxTargets = 25;
|
public int maxTargets = 25;
|
||||||
public float healPercent = 3f;
|
public float healPercent = 2.5f;
|
||||||
|
|
||||||
public float layer = Layer.bullet - 0.001f, blinkScl = 20f;
|
public float layer = Layer.bullet - 0.001f, blinkScl = 20f;
|
||||||
public float effectRadius = 5f, sectorRad = 0.14f, rotateSpeed = 0.5f;
|
public float effectRadius = 5f, sectorRad = 0.14f, rotateSpeed = 0.5f;
|
||||||
@@ -139,6 +141,10 @@ public class EnergyFieldAbility extends Ability{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(anyNearby){
|
||||||
|
shootSound.at(unit);
|
||||||
|
}
|
||||||
|
|
||||||
timer = 0f;
|
timer = 0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ public class BulletType extends Content implements Cloneable{
|
|||||||
public boolean collides = true;
|
public boolean collides = true;
|
||||||
/** Whether velocity is inherited from the shooter. */
|
/** Whether velocity is inherited from the shooter. */
|
||||||
public boolean keepVelocity = true;
|
public boolean keepVelocity = true;
|
||||||
/** Whether to scale velocity to disappear at the target position. Used for artillery. */
|
/** Whether to scale lifetime (not actually velocity!) to disappear at the target position. Used for artillery. */
|
||||||
public boolean scaleVelocity;
|
public boolean scaleVelocity;
|
||||||
/** Whether this bullet can be hit by point defense. */
|
/** Whether this bullet can be hit by point defense. */
|
||||||
public boolean hittable = true;
|
public boolean hittable = true;
|
||||||
@@ -232,8 +232,8 @@ public class BulletType extends Content implements Cloneable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(entity instanceof Unit unit){
|
if(entity instanceof Unit unit){
|
||||||
Tmp.v3.set(unit).sub(b.x, b.y).nor().scl(knockback * 80f);
|
Tmp.v3.set(unit).sub(b).nor().scl(knockback * 80f);
|
||||||
if(impact) Tmp.v3.setAngle(b.rotation());
|
if(impact) Tmp.v3.setAngle(b.rotation() + (knockback < 0 ? 180f : 0f));
|
||||||
unit.impulse(Tmp.v3);
|
unit.impulse(Tmp.v3);
|
||||||
unit.apply(status, statusDuration);
|
unit.apply(status, statusDuration);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package mindustry.entities.comp;
|
package mindustry.entities.comp;
|
||||||
|
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
|
import arc.util.*;
|
||||||
import mindustry.annotations.Annotations.*;
|
import mindustry.annotations.Annotations.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
|
|
||||||
@@ -8,7 +9,7 @@ import static mindustry.Vars.*;
|
|||||||
|
|
||||||
@Component
|
@Component
|
||||||
abstract class BoundedComp implements Velc, Posc, Healthc, Flyingc{
|
abstract class BoundedComp implements Velc, Posc, Healthc, Flyingc{
|
||||||
static final float warpDst = 40f;
|
static final float warpDst = 30f;
|
||||||
|
|
||||||
@Import float x, y;
|
@Import float x, y;
|
||||||
|
|
||||||
@@ -24,7 +25,7 @@ abstract class BoundedComp implements Velc, Posc, Healthc, Flyingc{
|
|||||||
if(x > world.unitWidth()) dx -= (x - world.unitWidth())/warpDst;
|
if(x > world.unitWidth()) dx -= (x - world.unitWidth())/warpDst;
|
||||||
if(y > world.unitHeight()) dy -= (y - world.unitHeight())/warpDst;
|
if(y > world.unitHeight()) dy -= (y - world.unitHeight())/warpDst;
|
||||||
|
|
||||||
velAddNet(dx, dy);
|
velAddNet(dx * Time.delta, dy * Time.delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
//clamp position if not flying
|
//clamp position if not flying
|
||||||
|
|||||||
@@ -106,7 +106,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
|
|
||||||
/** Sets up all the necessary variables, but does not add this entity anywhere. */
|
/** Sets up all the necessary variables, but does not add this entity anywhere. */
|
||||||
public Building create(Block block, Team team){
|
public Building create(Block block, Team team){
|
||||||
this.tile = emptyTile;
|
|
||||||
this.block = block;
|
this.block = block;
|
||||||
this.team = team;
|
this.team = team;
|
||||||
|
|
||||||
@@ -1443,7 +1442,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
@Override
|
@Override
|
||||||
public void killed(){
|
public void killed(){
|
||||||
Events.fire(new BlockDestroyEvent(tile));
|
Events.fire(new BlockDestroyEvent(tile));
|
||||||
block.breakSound.at(tile);
|
block.destroySound.at(tile);
|
||||||
onDestroyed();
|
onDestroyed();
|
||||||
tile.remove();
|
tile.remove();
|
||||||
remove();
|
remove();
|
||||||
|
|||||||
@@ -44,6 +44,13 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//bullets always considered local
|
||||||
|
@Override
|
||||||
|
@Replace
|
||||||
|
public boolean isLocal(){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(){
|
public void add(){
|
||||||
type.init(self());
|
type.init(self());
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ abstract class FireComp implements Timedc, Posc, Syncc, Drawc{
|
|||||||
public static final TextureRegion[] regions = new TextureRegion[frames];
|
public static final TextureRegion[] regions = new TextureRegion[frames];
|
||||||
|
|
||||||
@Import float time, lifetime, x, y;
|
@Import float time, lifetime, x, y;
|
||||||
|
@Import int id;
|
||||||
|
|
||||||
Tile tile;
|
Tile tile;
|
||||||
private transient Block block;
|
private transient Block block;
|
||||||
@@ -116,7 +117,7 @@ abstract class FireComp implements Timedc, Posc, Syncc, Drawc{
|
|||||||
|
|
||||||
Draw.alpha(Mathf.clamp(warmup / warmupDuration));
|
Draw.alpha(Mathf.clamp(warmup / warmupDuration));
|
||||||
Draw.z(Layer.effect);
|
Draw.z(Layer.effect);
|
||||||
Draw.rect(regions[Math.min((int)animation, regions.length - 1)], x, y);
|
Draw.rect(regions[Math.min((int)animation, regions.length - 1)], x + Mathf.randomSeedRange((int)y, 2), y + Mathf.randomSeedRange((int)x, 2));
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
|
|
||||||
Drawf.light(x, y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * Mathf.clamp(warmup / warmupDuration));
|
Drawf.light(x, y, 50f + Mathf.absin(5f, 5f), Pal.lightFlame, 0.6f * Mathf.clamp(warmup / warmupDuration));
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package mindustry.entities.comp;
|
package mindustry.entities.comp;
|
||||||
|
|
||||||
import arc.math.*;
|
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import mindustry.annotations.Annotations.*;
|
import mindustry.annotations.Annotations.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
@@ -34,7 +33,7 @@ abstract class HealthComp implements Entityc, Posc{
|
|||||||
void kill(){
|
void kill(){
|
||||||
if(dead) return;
|
if(dead) return;
|
||||||
|
|
||||||
health = 0;
|
health = Math.min(health, 0);
|
||||||
dead = true;
|
dead = true;
|
||||||
killed();
|
killed();
|
||||||
remove();
|
remove();
|
||||||
@@ -86,7 +85,7 @@ abstract class HealthComp implements Entityc, Posc{
|
|||||||
}
|
}
|
||||||
|
|
||||||
void clampHealth(){
|
void clampHealth(){
|
||||||
health = Mathf.clamp(health, 0, maxHealth);
|
health = Math.min(health, maxHealth);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Heals by a flat amount. */
|
/** Heals by a flat amount. */
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package mindustry.entities.comp;
|
|||||||
|
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
|
import arc.util.*;
|
||||||
import mindustry.annotations.Annotations.*;
|
import mindustry.annotations.Annotations.*;
|
||||||
import mindustry.async.PhysicsProcess.*;
|
import mindustry.async.PhysicsProcess.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
|
|||||||
@@ -51,13 +51,11 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
|
|||||||
return unit.canBuild();
|
return unit.canBuild();
|
||||||
}
|
}
|
||||||
|
|
||||||
public @Nullable
|
public @Nullable CoreBuild closestCore(){
|
||||||
CoreBuild closestCore(){
|
|
||||||
return state.teams.closestCore(x, y, team);
|
return state.teams.closestCore(x, y, team);
|
||||||
}
|
}
|
||||||
|
|
||||||
public @Nullable
|
public @Nullable CoreBuild core(){
|
||||||
CoreBuild core(){
|
|
||||||
return team.core();
|
return team.core();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,6 +238,10 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
|
|||||||
con.kick(reason);
|
con.kick(reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void kick(KickReason reason, long duration){
|
||||||
|
con.kick(reason, duration);
|
||||||
|
}
|
||||||
|
|
||||||
void kick(String reason){
|
void kick(String reason){
|
||||||
con.kick(reason);
|
con.kick(reason);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ abstract class ShieldComp implements Healthc, Posc{
|
|||||||
|
|
||||||
/** Absorbs health damage. */
|
/** Absorbs health damage. */
|
||||||
float shield;
|
float shield;
|
||||||
/** Subtracts an amount from damage. */
|
/** Subtracts an amount from damage. No need to save. */
|
||||||
float armor;
|
transient float armor;
|
||||||
/** Shield opacity. */
|
/** Shield opacity. */
|
||||||
transient float shieldAlpha = 0f;
|
transient float shieldAlpha = 0f;
|
||||||
|
|
||||||
|
|||||||
@@ -397,7 +397,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
|||||||
//move down
|
//move down
|
||||||
elevation -= type.fallSpeed * Time.delta;
|
elevation -= type.fallSpeed * Time.delta;
|
||||||
|
|
||||||
if(isGrounded()){
|
if(isGrounded() || health <= -maxHealth){
|
||||||
Call.unitDestroy(id);
|
Call.unitDestroy(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -528,7 +528,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
|||||||
@Override
|
@Override
|
||||||
public void killed(){
|
public void killed(){
|
||||||
wasPlayer = isLocal();
|
wasPlayer = isLocal();
|
||||||
health = 0;
|
health = Math.min(health, 0);
|
||||||
dead = true;
|
dead = true;
|
||||||
|
|
||||||
//don't waste time when the unit is already on the ground, just destroy it
|
//don't waste time when the unit is already on the ground, just destroy it
|
||||||
|
|||||||
@@ -13,14 +13,17 @@ import static mindustry.Vars.*;
|
|||||||
abstract class VelComp implements Posc{
|
abstract class VelComp implements Posc{
|
||||||
@Import float x, y;
|
@Import float x, y;
|
||||||
|
|
||||||
//TODO @SyncLocal this? does it even need to be sent?
|
@SyncLocal Vec2 vel = new Vec2();
|
||||||
transient final Vec2 vel = new Vec2();
|
|
||||||
transient float drag = 0f;
|
transient float drag = 0f;
|
||||||
|
|
||||||
//velocity needs to be called first, as it affects delta and lastPosition
|
//velocity needs to be called first, as it affects delta and lastPosition
|
||||||
@MethodPriority(-1)
|
@MethodPriority(-1)
|
||||||
@Override
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
|
//do not update velocity on the client at all, unless it's non-interpolated
|
||||||
|
//velocity conflicts with interpolation.
|
||||||
|
if(!net.client() || isLocal()){
|
||||||
float px = x, py = y;
|
float px = x, py = y;
|
||||||
move(vel.x * Time.delta, vel.y * Time.delta);
|
move(vel.x * Time.delta, vel.y * Time.delta);
|
||||||
if(Mathf.equal(px, x)) vel.x = 0;
|
if(Mathf.equal(px, x)) vel.x = 0;
|
||||||
@@ -28,6 +31,7 @@ abstract class VelComp implements Posc{
|
|||||||
|
|
||||||
vel.scl(Math.max(1f - drag * Time.delta, 0));
|
vel.scl(Math.max(1f - drag * Time.delta, 0));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** @return function to use for check solid state. if null, no checking is done. */
|
/** @return function to use for check solid state. if null, no checking is done. */
|
||||||
@Nullable
|
@Nullable
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import static mindustry.Vars.*;
|
|||||||
|
|
||||||
@Component
|
@Component
|
||||||
abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{
|
abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{
|
||||||
@Import float x, y, rotation;
|
@Import float x, y, rotation, speedMultiplier;
|
||||||
@Import UnitType type;
|
@Import UnitType type;
|
||||||
|
|
||||||
private transient Trail tleft = new Trail(1), tright = new Trail(1);
|
private transient Trail tleft = new Trail(1), tright = new Trail(1);
|
||||||
@@ -74,7 +74,7 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{
|
|||||||
@Replace
|
@Replace
|
||||||
public float floorSpeedMultiplier(){
|
public float floorSpeedMultiplier(){
|
||||||
Floor on = isFlying() ? Blocks.air.asFloor() : floorOn();
|
Floor on = isFlying() ? Blocks.air.asFloor() : floorOn();
|
||||||
return on.isDeep() ? 1.3f : 1f;
|
return (on.isDeep() ? 1.3f : 1f) * speedMultiplier;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onLiquid(){
|
public boolean onLiquid(){
|
||||||
|
|||||||
@@ -70,6 +70,8 @@ public class Rules{
|
|||||||
public float enemyCoreBuildRadius = 400f;
|
public float enemyCoreBuildRadius = 400f;
|
||||||
/** If true, no-build zones are calculated based on the closest core. */
|
/** If true, no-build zones are calculated based on the closest core. */
|
||||||
public boolean polygonCoreProtection = false;
|
public boolean polygonCoreProtection = false;
|
||||||
|
/** If true, dead teams in PvP automatically have their blocks & units converted to derelict upon death. */
|
||||||
|
public boolean cleanupDeadTeams = true;
|
||||||
/** Radius around enemy wave drop zones.*/
|
/** Radius around enemy wave drop zones.*/
|
||||||
public float dropZoneRadius = 300f;
|
public float dropZoneRadius = 300f;
|
||||||
/** Time between waves in ticks. */
|
/** Time between waves in ticks. */
|
||||||
@@ -114,22 +116,6 @@ public class Rules{
|
|||||||
/** special tags for additional info. */
|
/** special tags for additional info. */
|
||||||
public StringMap tags = new StringMap();
|
public StringMap tags = new StringMap();
|
||||||
|
|
||||||
/** A team-specific ruleset. */
|
|
||||||
public static class TeamRule{
|
|
||||||
/** Whether to use building AI. */
|
|
||||||
public boolean ai;
|
|
||||||
/** TODO Tier of blocks/designs that the AI uses for building. [0, 1] */
|
|
||||||
public float aiTier = 1f;
|
|
||||||
/** Whether, when AI is enabled, ships should be spawned from the core. */
|
|
||||||
public boolean aiCoreSpawn = true;
|
|
||||||
/** If true, blocks don't require power or resources. */
|
|
||||||
public boolean cheat;
|
|
||||||
/** If true, resources are not consumed when building. */
|
|
||||||
public boolean infiniteResources;
|
|
||||||
/** If true, this team has infinite unit ammo. */
|
|
||||||
public boolean infiniteAmmo;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Copies this ruleset exactly. Not efficient at all, do not use often. */
|
/** Copies this ruleset exactly. Not efficient at all, do not use often. */
|
||||||
public Rules copy(){
|
public Rules copy(){
|
||||||
return JsonIO.copy(this);
|
return JsonIO.copy(this);
|
||||||
@@ -150,6 +136,22 @@ public class Rules{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** A team-specific ruleset. */
|
||||||
|
public static class TeamRule{
|
||||||
|
/** Whether to use building AI. */
|
||||||
|
public boolean ai;
|
||||||
|
/** TODO Tier of blocks/designs that the AI uses for building. [0, 1] */
|
||||||
|
public float aiTier = 1f;
|
||||||
|
/** Whether, when AI is enabled, ships should be spawned from the core. */
|
||||||
|
public boolean aiCoreSpawn = true;
|
||||||
|
/** If true, blocks don't require power or resources. */
|
||||||
|
public boolean cheat;
|
||||||
|
/** If true, resources are not consumed when building. */
|
||||||
|
public boolean infiniteResources;
|
||||||
|
/** If true, this team has infinite unit ammo. */
|
||||||
|
public boolean infiniteAmmo;
|
||||||
|
}
|
||||||
|
|
||||||
/** A simple map for storing TeamRules in an efficient way without hashing. */
|
/** A simple map for storing TeamRules in an efficient way without hashing. */
|
||||||
public static class TeamRules implements JsonSerializable{
|
public static class TeamRules implements JsonSerializable{
|
||||||
final TeamRule[] values = new TeamRule[Team.all.length];
|
final TeamRule[] values = new TeamRule[Team.all.length];
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ public class Team implements Comparable<Team>{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEnemy(Team other){
|
public boolean isEnemy(Team other){
|
||||||
return state.teams.areEnemies(this, other);
|
return this != other;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Seq<CoreBuild> cores(){
|
public Seq<CoreBuild> cores(){
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package mindustry.game;
|
package mindustry.game;
|
||||||
|
|
||||||
import arc.func.*;
|
import arc.func.*;
|
||||||
|
import arc.math.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
import arc.struct.Queue;
|
import arc.struct.Queue;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
@@ -49,7 +50,7 @@ public class Teams{
|
|||||||
|
|
||||||
public boolean eachEnemyCore(Team team, Boolf<CoreBuild> ret){
|
public boolean eachEnemyCore(Team team, Boolf<CoreBuild> ret){
|
||||||
for(TeamData data : active){
|
for(TeamData data : active){
|
||||||
if(areEnemies(team, data.team)){
|
if(team != data.team){
|
||||||
for(CoreBuild tile : data.cores){
|
for(CoreBuild tile : data.cores){
|
||||||
if(ret.get(tile)){
|
if(ret.get(tile)){
|
||||||
return true;
|
return true;
|
||||||
@@ -62,7 +63,7 @@ public class Teams{
|
|||||||
|
|
||||||
public void eachEnemyCore(Team team, Cons<Building> ret){
|
public void eachEnemyCore(Team team, Cons<Building> ret){
|
||||||
for(TeamData data : active){
|
for(TeamData data : active){
|
||||||
if(areEnemies(team, data.team)){
|
if(team != data.team){
|
||||||
for(Building tile : data.cores){
|
for(Building tile : data.cores){
|
||||||
ret.get(tile);
|
ret.get(tile);
|
||||||
}
|
}
|
||||||
@@ -91,11 +92,6 @@ public class Teams{
|
|||||||
return get(team).active();
|
return get(team).active();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns whether {@param other} is an enemy of {@param #team}. */
|
|
||||||
public boolean areEnemies(Team team, Team other){
|
|
||||||
return team != other;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean canInteract(Team team, Team other){
|
public boolean canInteract(Team team, Team other){
|
||||||
return team == other || other == Team.derelict;
|
return team == other || other == Team.derelict;
|
||||||
}
|
}
|
||||||
@@ -216,7 +212,7 @@ public class Teams{
|
|||||||
Seq<Team> enemies = new Seq<>();
|
Seq<Team> enemies = new Seq<>();
|
||||||
|
|
||||||
for(TeamData other : active){
|
for(TeamData other : active){
|
||||||
if(areEnemies(data.team, other.team)){
|
if(data.team != other.team){
|
||||||
enemies.add(other.team);
|
enemies.add(other.team);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -265,6 +261,34 @@ public class Teams{
|
|||||||
this.ai = new BaseAI(this);
|
this.ai = new BaseAI(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Destroys this team's presence on the map, killing part of its buildings and converting everything to 'derelict'. */
|
||||||
|
public void destroyToDerelict(){
|
||||||
|
|
||||||
|
//grab all buildings from quadtree.
|
||||||
|
var builds = new Seq<Building>();
|
||||||
|
if(buildings != null){
|
||||||
|
buildings.getObjects(builds);
|
||||||
|
}
|
||||||
|
|
||||||
|
//convert all team tiles to neutral, randomly killing them
|
||||||
|
for(var b : builds){
|
||||||
|
//TODO this may cause a lot of packet spam, optimize?
|
||||||
|
Call.setTeam(b, Team.derelict);
|
||||||
|
|
||||||
|
if(Mathf.chance(0.25)){
|
||||||
|
Time.run(Mathf.random(0f, 60f * 6f), b::kill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//kill all units randomly
|
||||||
|
units.each(u -> Time.run(Mathf.random(0f, 60f * 5f), () -> {
|
||||||
|
//ensure unit hasn't switched teams for whatever reason
|
||||||
|
if(u.team == team){
|
||||||
|
u.kill();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public Seq<Unit> unitCache(UnitType type){
|
public Seq<Unit> unitCache(UnitType type){
|
||||||
if(unitsByType == null || unitsByType.length <= type.id || unitsByType[type.id] == null) return null;
|
if(unitsByType == null || unitsByType.length <= type.id || unitsByType[type.id] == null) return null;
|
||||||
@@ -325,6 +349,7 @@ public class Teams{
|
|||||||
public static class BlockPlan{
|
public static class BlockPlan{
|
||||||
public final short x, y, rotation, block;
|
public final short x, y, rotation, block;
|
||||||
public final Object config;
|
public final Object config;
|
||||||
|
public boolean removed;
|
||||||
|
|
||||||
public BlockPlan(int x, int y, short rotation, short block, Object config){
|
public BlockPlan(int x, int y, short rotation, short block, Object config){
|
||||||
this.x = (short)x;
|
this.x = (short)x;
|
||||||
|
|||||||
@@ -339,7 +339,7 @@ public class BlockRenderer{
|
|||||||
Draw.z(Layer.block);
|
Draw.z(Layer.block);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(renderer.drawStatus && block.consumes.any()){
|
if(entity.team == player.team() && renderer.drawStatus && block.consumes.any()){
|
||||||
entity.drawStatus();
|
entity.drawStatus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
|
|
||||||
for(int pos : positions){
|
for(int pos : positions){
|
||||||
if(req.x == Point2.x(pos) && req.y == Point2.y(pos)){
|
if(req.x == Point2.x(pos) && req.y == Point2.y(pos)){
|
||||||
|
req.removed = true;
|
||||||
it.remove();
|
it.remove();
|
||||||
continue outer;
|
continue outer;
|
||||||
}
|
}
|
||||||
@@ -893,6 +894,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
Block block = content.block(req.block);
|
Block block = content.block(req.block);
|
||||||
if(block.bounds(req.x, req.y, Tmp.r2).overlaps(Tmp.r1)){
|
if(block.bounds(req.x, req.y, Tmp.r2).overlaps(Tmp.r1)){
|
||||||
removed.add(Point2.pack(req.x, req.y));
|
removed.add(Point2.pack(req.x, req.y));
|
||||||
|
req.removed = true;
|
||||||
broken.remove();
|
broken.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1242,12 +1244,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
diagonal = !diagonal;
|
diagonal = !diagonal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int endRotation = -1;
|
||||||
if(diagonal){
|
if(diagonal){
|
||||||
var start = world.build(startX, startY);
|
var start = world.build(startX, startY);
|
||||||
var end = world.build(endX, endY);
|
var end = world.build(endX, endY);
|
||||||
if(block != null && start instanceof ChainedBuilding && end instanceof ChainedBuilding
|
if(block != null && start instanceof ChainedBuilding && end instanceof ChainedBuilding
|
||||||
&& block.canReplace(end.block) && block.canReplace(start.block)){
|
&& block.canReplace(end.block) && block.canReplace(start.block)){
|
||||||
points = Placement.upgradeLine(startX, startY, endX, endY);
|
points = Placement.upgradeLine(startX, startY, endX, endY);
|
||||||
|
endRotation = end.rotation;
|
||||||
}else{
|
}else{
|
||||||
points = Placement.pathfindLine(block != null && block.conveyorPlacement, startX, startY, endX, endY);
|
points = Placement.pathfindLine(block != null && block.conveyorPlacement, startX, startY, endX, endY);
|
||||||
}
|
}
|
||||||
@@ -1281,6 +1285,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
int result = baseRotation;
|
int result = baseRotation;
|
||||||
if(next != null){
|
if(next != null){
|
||||||
result = Tile.relativeTo(point.x, point.y, next.x, next.y);
|
result = Tile.relativeTo(point.x, point.y, next.x, next.y);
|
||||||
|
}else if(endRotation != -1){
|
||||||
|
result = endRotation;
|
||||||
}else if(block.conveyorPlacement && i > 0){
|
}else if(block.conveyorPlacement && i > 0){
|
||||||
Point2 prev = points.get(i - 1);
|
Point2 prev = points.get(i - 1);
|
||||||
result = Tile.relativeTo(prev.x, prev.y, point.x, point.y);
|
result = Tile.relativeTo(prev.x, prev.y, point.x, point.y);
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
package mindustry.io;
|
package mindustry.io;
|
||||||
|
|
||||||
|
import arc.util.*;
|
||||||
import arc.util.serialization.*;
|
import arc.util.serialization.*;
|
||||||
import arc.util.serialization.Json.*;
|
import arc.util.serialization.Json.*;
|
||||||
import mindustry.*;
|
import mindustry.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.ctype.*;
|
import mindustry.ctype.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
|
import mindustry.maps.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
import mindustry.world.meta.*;
|
import mindustry.world.meta.*;
|
||||||
@@ -215,6 +217,12 @@ public class JsonIO{
|
|||||||
return item != null ? item : liquid;
|
return item != null ? item : liquid;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//use short names for all filter types
|
||||||
|
for(var filter : Maps.allFilterTypes){
|
||||||
|
var i = filter.get();
|
||||||
|
json.addClassTag(Strings.camelize(i.getClass().getSimpleName().replace("Filter", "")), i.getClass());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static class CustomJson extends Json{
|
static class CustomJson extends Json{
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package mindustry.io;
|
package mindustry.io;
|
||||||
|
|
||||||
|
import arc.audio.*;
|
||||||
import arc.graphics.*;
|
import arc.graphics.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
@@ -501,6 +502,15 @@ public class TypeIO{
|
|||||||
return id == -1 ? null : content.item(id);
|
return id == -1 ? null : content.item(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//note that only the standard sound constants in Sounds are supported; modded sounds are not.
|
||||||
|
public static void writeSound(Writes write, Sound sound){
|
||||||
|
write.s(Sounds.getSoundId(sound));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Sound readSound(Reads read){
|
||||||
|
return Sounds.getSound(read.s());
|
||||||
|
}
|
||||||
|
|
||||||
public static void writeWeather(Writes write, Weather item){
|
public static void writeWeather(Writes write, Weather item){
|
||||||
write.s(item == null ? -1 : item.id);
|
write.s(item == null ? -1 : item.id);
|
||||||
}
|
}
|
||||||
@@ -633,7 +643,7 @@ public class TypeIO{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Representes a building that has not been resolved yet. */
|
/** Represents a building that has not been resolved yet. */
|
||||||
public static class BuildingBox{
|
public static class BuildingBox{
|
||||||
public int pos;
|
public int pos;
|
||||||
|
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ public class LCanvas extends Table{
|
|||||||
float dst = Math.min(y - this.y, Core.graphics.getHeight() - y);
|
float dst = Math.min(y - this.y, Core.graphics.getHeight() - y);
|
||||||
if(dst < Scl.scl(100f)){ //scroll margin
|
if(dst < Scl.scl(100f)){ //scroll margin
|
||||||
int sign = Mathf.sign(Core.graphics.getHeight()/2f - y);
|
int sign = Mathf.sign(Core.graphics.getHeight()/2f - y);
|
||||||
pane.setScrollY(pane.getScrollY() + sign * Scl.scl(15f));
|
pane.setScrollY(pane.getScrollY() + sign * Scl.scl(15f) * Time.delta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -363,6 +363,9 @@ public class LExecutor{
|
|||||||
float x1 = World.unconv(exec.numf(p1)), y1 = World.unconv(exec.numf(p2)), d1 = World.unconv(exec.numf(p3));
|
float x1 = World.unconv(exec.numf(p1)), y1 = World.unconv(exec.numf(p2)), d1 = World.unconv(exec.numf(p3));
|
||||||
|
|
||||||
switch(type){
|
switch(type){
|
||||||
|
case idle -> {
|
||||||
|
ai.control = type;
|
||||||
|
}
|
||||||
case move, stop, approach -> {
|
case move, stop, approach -> {
|
||||||
ai.control = type;
|
ai.control = type;
|
||||||
ai.moveX = x1;
|
ai.moveX = x1;
|
||||||
|
|||||||
@@ -24,23 +24,30 @@ import mindustry.world.*;
|
|||||||
import mindustry.world.blocks.storage.*;
|
import mindustry.world.blocks.storage.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import java.util.concurrent.*;
|
||||||
|
|
||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class Maps{
|
public class Maps{
|
||||||
|
/** All generation filter types. */
|
||||||
|
public static Prov<GenerateFilter>[] allFilterTypes = new Prov[]{
|
||||||
|
NoiseFilter::new, ScatterFilter::new, TerrainFilter::new, DistortFilter::new,
|
||||||
|
RiverNoiseFilter::new, OreFilter::new, OreMedianFilter::new, MedianFilter::new,
|
||||||
|
BlendFilter::new, MirrorFilter::new, ClearFilter::new, CoreSpawnFilter::new,
|
||||||
|
EnemySpawnFilter::new, SpawnPathFilter::new
|
||||||
|
};
|
||||||
|
|
||||||
/** List of all built-in maps. Filenames only. */
|
/** List of all built-in maps. Filenames only. */
|
||||||
private static String[] defaultMapNames = {"maze", "fortress", "labyrinth", "islands", "tendrils", "caldera", "wasteland", "shattered", "fork", "triad", "mudFlats", "moltenLake", "archipelago", "debrisField", "veins", "glacier", "passage"};
|
private static String[] defaultMapNames = {"maze", "fortress", "labyrinth", "islands", "tendrils", "caldera", "wasteland", "shattered", "fork", "triad", "mudFlats", "moltenLake", "archipelago", "debrisField", "veins", "glacier", "passage"};
|
||||||
/** Maps tagged as PvP */
|
/** Maps tagged as PvP */
|
||||||
static final String[] pvpMaps = {"veins", "glacier", "passage"};
|
private static String[] pvpMaps = {"veins", "glacier", "passage"};
|
||||||
|
|
||||||
/** All maps stored in an ordered array. */
|
/** All maps stored in an ordered array. */
|
||||||
private Seq<Map> maps = new Seq<>();
|
private Seq<Map> maps = new Seq<>();
|
||||||
/** Serializer for meta. */
|
|
||||||
private Json json = new Json();
|
|
||||||
|
|
||||||
private ShuffleMode shuffleMode = ShuffleMode.all;
|
private ShuffleMode shuffleMode = ShuffleMode.all;
|
||||||
private @Nullable MapProvider shuffler;
|
private @Nullable MapProvider shuffler;
|
||||||
|
|
||||||
private AsyncExecutor executor = new AsyncExecutor(2);
|
private ExecutorService executor = Threads.executor(3);
|
||||||
private ObjectSet<Map> previewList = new ObjectSet<>();
|
private ObjectSet<Map> previewList = new ObjectSet<>();
|
||||||
|
|
||||||
public ShuffleMode getShuffleMode(){
|
public ShuffleMode getShuffleMode(){
|
||||||
@@ -352,20 +359,20 @@ public class Maps{
|
|||||||
if(groups == null) return "[]";
|
if(groups == null) return "[]";
|
||||||
|
|
||||||
StringWriter buffer = new StringWriter();
|
StringWriter buffer = new StringWriter();
|
||||||
json.setWriter(new JsonWriter(buffer));
|
JsonIO.json.setWriter(new JsonWriter(buffer));
|
||||||
|
|
||||||
json.writeArrayStart();
|
JsonIO.json.writeArrayStart();
|
||||||
for(int i = 0; i < groups.size; i++){
|
for(int i = 0; i < groups.size; i++){
|
||||||
json.writeObjectStart(SpawnGroup.class, SpawnGroup.class);
|
JsonIO.json.writeObjectStart(SpawnGroup.class, SpawnGroup.class);
|
||||||
groups.get(i).write(json);
|
groups.get(i).write(JsonIO.json);
|
||||||
json.writeObjectEnd();
|
JsonIO.json.writeObjectEnd();
|
||||||
}
|
}
|
||||||
json.writeArrayEnd();
|
JsonIO.json.writeArrayEnd();
|
||||||
return buffer.toString();
|
return buffer.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Seq<SpawnGroup> readWaves(String str){
|
public Seq<SpawnGroup> readWaves(String str){
|
||||||
return str == null ? null : str.equals("[]") ? new Seq<>() : Seq.with(json.fromJson(SpawnGroup[].class, str));
|
return str == null ? null : str.equals("[]") ? new Seq<>() : Seq.with(JsonIO.json.fromJson(SpawnGroup[].class, str));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadPreviews(){
|
public void loadPreviews(){
|
||||||
@@ -422,7 +429,7 @@ public class Maps{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void writeCache(Map map) throws IOException{
|
private void writeCache(Map map) throws IOException{
|
||||||
try(DataOutputStream stream = new DataOutputStream(map.cacheFile().write(false, Streams.DEFAULT_BUFFER_SIZE))){
|
try(DataOutputStream stream = new DataOutputStream(map.cacheFile().write(false, Streams.defaultBufferSize))){
|
||||||
stream.write(0);
|
stream.write(0);
|
||||||
stream.writeInt(map.spawns);
|
stream.writeInt(map.spawns);
|
||||||
stream.write(map.teams.size);
|
stream.write(map.teams.size);
|
||||||
@@ -434,7 +441,7 @@ public class Maps{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void readCache(Map map) throws IOException{
|
private void readCache(Map map) throws IOException{
|
||||||
try(DataInputStream stream = new DataInputStream(map.cacheFile().read(Streams.DEFAULT_BUFFER_SIZE))){
|
try(DataInputStream stream = new DataInputStream(map.cacheFile().read(Streams.defaultBufferSize))){
|
||||||
stream.read(); //version
|
stream.read(); //version
|
||||||
map.spawns = stream.readInt();
|
map.spawns = stream.readInt();
|
||||||
int teamsize = stream.readByte();
|
int teamsize = stream.readByte();
|
||||||
|
|||||||