Merge remote-tracking branch 'origin/4.0' into 4.0

# Conflicts:
#	core/src/io/anuke/mindustry/Vars.java
This commit is contained in:
Anuken
2018-07-13 19:54:20 -04:00
433 changed files with 25227 additions and 23221 deletions

1
.gitignore vendored
View File

@@ -2,6 +2,7 @@
/core/assets/mindustry-saves/
/core/assets/mindustry-maps/
/core/assets/bundles/output/
/deploy/
/desktop/packr-out/
/desktop/packr-export/

View File

@@ -5,13 +5,14 @@ jdk:
android:
components:
- android-26
- android-27
# Additional components
- extra-google-google_play_services
- extra-google-m2repository
- extra-android-m2repository
- addon-google_apis-google-26
- addon-google_apis-google-27
- build-tools-27.0.3
script:
- ./gradlew desktop:dist

View File

@@ -20,7 +20,7 @@
<activity
android:name="io.anuke.mindustry.AndroidLauncher"
android:label="@string/app_name"
android:screenOrientation="sensor"
android:screenOrientation="user"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
<intent-filter>

View File

@@ -49,237 +49,237 @@ import java.util.Locale;
import static io.anuke.mindustry.Vars.*;
public class AndroidLauncher extends AndroidApplication{
public static final int PERMISSION_REQUEST_CODE = 1;
public static final int PERMISSION_REQUEST_CODE = 1;
boolean doubleScaleTablets = true;
FileChooser chooser;
boolean doubleScaleTablets = true;
FileChooser chooser;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
config.useImmersiveMode = true;
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
config.useImmersiveMode = true;
Platform.instance = new Platform(){
DateFormat format = SimpleDateFormat.getDateTimeInstance();
Platform.instance = new Platform(){
DateFormat format = SimpleDateFormat.getDateTimeInstance();
@Override
public boolean hasDiscord() {
return isPackageInstalled("com.discord");
}
@Override
public boolean hasDiscord(){
return isPackageInstalled("com.discord");
}
@Override
public String format(Date date){
return format.format(date);
}
@Override
public String format(Date date){
return format.format(date);
}
@Override
public String format(int number){
return NumberFormat.getIntegerInstance().format(number);
}
@Override
public String format(int number){
return NumberFormat.getIntegerInstance().format(number);
}
@Override
public void addDialog(TextField field, int length){
TextFieldDialogListener.add(field, 0, length);
}
@Override
public void addDialog(TextField field, int length){
TextFieldDialogListener.add(field, 0, length);
}
@Override
public String getLocaleName(Locale locale){
return locale.getDisplayName(locale);
}
@Override
public String getLocaleName(Locale locale){
return locale.getDisplayName(locale);
}
@Override
public void openDonations() {
showDonations();
}
@Override
public void openDonations(){
showDonations();
}
@Override
public ThreadProvider getThreadProvider() {
return new DefaultThreadImpl();
}
@Override
public ThreadProvider getThreadProvider(){
return new DefaultThreadImpl();
}
@Override
public boolean isDebug() {
return false;
}
@Override
public boolean isDebug(){
return false;
}
@Override
public String getUUID() {
try {
String s = Secure.getString(getContext().getContentResolver(),
Secure.ANDROID_ID);
@Override
public String getUUID(){
try{
String s = Secure.getString(getContext().getContentResolver(),
Secure.ANDROID_ID);
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i + 1), 16));
}
int len = s.length();
byte[] data = new byte[len / 2];
for(int i = 0; i < len; i += 2){
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i + 1), 16));
}
String result = new String(Base64Coder.encode(data));
String result = new String(Base64Coder.encode(data));
if(result.equals("AAAAAAAAAOA=")) throw new RuntimeException("Bad UUID.");
if(result.equals("AAAAAAAAAOA=")) throw new RuntimeException("Bad UUID.");
return result;
}catch (Exception e){
return super.getUUID();
}
}
return result;
}catch(Exception e){
return super.getUUID();
}
}
@Override
public void shareFile(FileHandle file){
@Override
public void shareFile(FileHandle file){
}
}
@Override
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, String filetype) {
chooser = new FileChooser(text, file -> file.extension().equalsIgnoreCase(filetype), open, cons);
@Override
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, String filetype){
chooser = new FileChooser(text, file -> file.extension().equalsIgnoreCase(filetype), open, cons);
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
chooser.show();
chooser = null;
}else {
ArrayList<String> perms = new ArrayList<>();
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
chooser.show();
chooser = null;
}else{
ArrayList<String> perms = new ArrayList<>();
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
}
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
}
requestPermissions(perms.toArray(new String[perms.size()]), PERMISSION_REQUEST_CODE);
}
}
requestPermissions(perms.toArray(new String[perms.size()]), PERMISSION_REQUEST_CODE);
}
}
@Override
public void beginForceLandscape() {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
@Override
public void beginForceLandscape(){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
@Override
public void endForceLandscape() {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
@Override
public void endForceLandscape(){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
@Override
public boolean canDonate(){
return true;
}
};
@Override
public boolean canDonate(){
return true;
}
};
try {
ProviderInstaller.installIfNeeded(this);
} catch (GooglePlayServicesRepairableException e) {
GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
apiAvailability.getErrorDialog(this, e.getConnectionStatusCode(), 0).show();
} catch (GooglePlayServicesNotAvailableException e) {
Log.e("SecurityException", "Google Play Services not available.");
}
try{
ProviderInstaller.installIfNeeded(this);
}catch(GooglePlayServicesRepairableException e){
GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
apiAvailability.getErrorDialog(this, e.getConnectionStatusCode(), 0).show();
}catch(GooglePlayServicesNotAvailableException e){
Log.e("SecurityException", "Google Play Services not available.");
}
if(doubleScaleTablets && isTablet(this.getContext())){
Unit.dp.addition = 0.5f;
}
config.hideStatusBar = true;
if(doubleScaleTablets && isTablet(this.getContext())){
Unit.dp.addition = 0.5f;
}
config.hideStatusBar = true;
Net.setClientProvider(new KryoClient());
Net.setServerProvider(new KryoServer());
initialize(new Mindustry(), config);
checkFiles(getIntent());
}
checkFiles(getIntent());
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
if(requestCode == PERMISSION_REQUEST_CODE){
for(int i : grantResults){
if(i != PackageManager.PERMISSION_GRANTED) return;
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){
if(requestCode == PERMISSION_REQUEST_CODE){
for(int i : grantResults){
if(i != PackageManager.PERMISSION_GRANTED) return;
}
if(chooser != null){
chooser.show();
}
}
}
if(chooser != null){
chooser.show();
}
}
}
private void checkFiles(Intent intent){
try {
Uri uri = intent.getData();
if (uri != null) {
File myFile = null;
String scheme = uri.getScheme();
if (scheme.equals("file")) {
String fileName = uri.getEncodedPath();
myFile = new File(fileName);
} else if (!scheme.equals("content")) {
//error
return;
}
private void checkFiles(Intent intent){
try{
Uri uri = intent.getData();
if(uri != null){
File myFile = null;
String scheme = uri.getScheme();
if(scheme.equals("file")){
String fileName = uri.getEncodedPath();
myFile = new File(fileName);
}else if(!scheme.equals("content")){
//error
return;
}
boolean save = uri.getPath().endsWith(saveExtension);
boolean map = uri.getPath().endsWith(mapExtension);
boolean save = uri.getPath().endsWith(saveExtension);
boolean map = uri.getPath().endsWith(mapExtension);
InputStream inStream;
if (myFile != null) inStream = new FileInputStream(myFile);
else inStream = getContentResolver().openInputStream(uri);
InputStream inStream;
if(myFile != null) inStream = new FileInputStream(myFile);
else inStream = getContentResolver().openInputStream(uri);
Gdx.app.postRunnable(() -> {
Gdx.app.postRunnable(() -> {
if(save){ //open save
System.out.println("Opening save.");
FileHandle file = Gdx.files.local("temp-save." + saveExtension);
file.write(inStream, false);
if(save){ //open save
System.out.println("Opening save.");
FileHandle file = Gdx.files.local("temp-save." + saveExtension);
file.write(inStream, false);
if(SaveIO.isSaveValid(file)){
try{
SaveSlot slot = control.getSaves().importSave(file);
ui.load.runLoadSave(slot);
}catch (IOException e){
ui.showError(Bundles.format("text.save.import.fail", Strings.parseException(e, false)));
}
}else{
ui.showError("$text.save.import.invalid");
}
if(SaveIO.isSaveValid(file)){
try{
SaveSlot slot = control.getSaves().importSave(file);
ui.load.runLoadSave(slot);
}catch(IOException e){
ui.showError(Bundles.format("text.save.import.fail", Strings.parseException(e, false)));
}
}else{
ui.showError("$text.save.import.invalid");
}
}else if(map){ //open map
Gdx.app.postRunnable(() -> {
System.out.println("Opening map.");
if (!ui.editor.isShown()) {
ui.editor.show();
}
}else if(map){ //open map
Gdx.app.postRunnable(() -> {
System.out.println("Opening map.");
if(!ui.editor.isShown()){
ui.editor.show();
}
ui.editor.beginEditMap(inStream);
});
}
});
}
ui.editor.beginEditMap(inStream);
});
}
});
}
}catch (IOException e){
e.printStackTrace();
}
}
private boolean isPackageInstalled(String packagename) {
try {
getPackageManager().getPackageInfo(packagename, 0);
return true;
} catch (Exception e) {
return false;
}
}
private boolean isTablet(Context context) {
TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
return manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE;
}
private void showDonations(){
Intent intent = new Intent(this, DonationsActivity.class);
startActivity(intent);
}
}catch(IOException e){
e.printStackTrace();
}
}
private boolean isPackageInstalled(String packagename){
try{
getPackageManager().getPackageInfo(packagename, 0);
return true;
}catch(Exception e){
return false;
}
}
private boolean isTablet(Context context){
TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE;
}
private void showDonations(){
Intent intent = new Intent(this, DonationsActivity.class);
startActivity(intent);
}
}

View File

@@ -11,20 +11,20 @@ import android.widget.EditText;
import com.badlogic.gdx.Gdx;
public class AndroidTextFieldDialog{
private Activity activity;
private EditText userInput;
private AlertDialog.Builder builder;
private TextPromptListener listener;
private boolean isBuild;
private Activity activity;
private EditText userInput;
private AlertDialog.Builder builder;
private TextPromptListener listener;
private boolean isBuild;
public AndroidTextFieldDialog() {
this.activity = (Activity)Gdx.app;
load();
}
public AndroidTextFieldDialog(){
this.activity = (Activity) Gdx.app;
load();
}
public AndroidTextFieldDialog show() {
public AndroidTextFieldDialog show(){
activity.runOnUiThread(() -> {
activity.runOnUiThread(() -> {
AlertDialog dialog = builder.create();
dialog.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
@@ -33,12 +33,12 @@ public class AndroidTextFieldDialog{
});
return this;
}
return this;
}
private AndroidTextFieldDialog load() {
private AndroidTextFieldDialog load(){
activity.runOnUiThread(() -> {
activity.runOnUiThread(() -> {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity);
LayoutInflater li = LayoutInflater.from(activity);
@@ -55,64 +55,65 @@ public class AndroidTextFieldDialog{
isBuild = true;
});
// Wait till TextPrompt is built.
while (!isBuild) {
try {
Thread.sleep(10);
} catch (InterruptedException e) { }
}
// Wait till TextPrompt is built.
while(!isBuild){
try{
Thread.sleep(10);
}catch(InterruptedException e){
}
}
return this;
}
return this;
}
public int getResourceId(String pVariableName, String pVariableType) {
try {
return activity.getResources().getIdentifier(pVariableName, pVariableType, activity.getPackageName());
} catch (Exception e) {
Gdx.app.error("Android Dialogs", "Cannot find resouce with name: " + pVariableName
+ " Did you copy the layouts to /res/layouts and /res/layouts_v14 ?");
e.printStackTrace();
return -1;
}
}
public int getResourceId(String pVariableName, String pVariableType){
try{
return activity.getResources().getIdentifier(pVariableName, pVariableType, activity.getPackageName());
}catch(Exception e){
Gdx.app.error("Android Dialogs", "Cannot find resouce with name: " + pVariableName
+ " Did you copy the layouts to /res/layouts and /res/layouts_v14 ?");
e.printStackTrace();
return -1;
}
}
public AndroidTextFieldDialog setText(CharSequence value) {
userInput.append(value);
return this;
}
public AndroidTextFieldDialog setText(CharSequence value){
userInput.append(value);
return this;
}
public AndroidTextFieldDialog setCancelButtonLabel(CharSequence label) {
builder.setNegativeButton(label, (dialog, id) -> dialog.cancel());
return this;
}
public AndroidTextFieldDialog setCancelButtonLabel(CharSequence label){
builder.setNegativeButton(label, (dialog, id) -> dialog.cancel());
return this;
}
public AndroidTextFieldDialog setConfirmButtonLabel(CharSequence label) {
builder.setPositiveButton(label, (dialog, id) -> {
if (listener != null && !userInput.getText().toString().isEmpty()) {
public AndroidTextFieldDialog setConfirmButtonLabel(CharSequence label){
builder.setPositiveButton(label, (dialog, id) -> {
if(listener != null && !userInput.getText().toString().isEmpty()){
listener.confirm(userInput.getText().toString());
}
});
return this;
}
return this;
}
public AndroidTextFieldDialog setTextPromptListener(TextPromptListener listener) {
this.listener = listener;
return this;
}
public AndroidTextFieldDialog setTextPromptListener(TextPromptListener listener){
this.listener = listener;
return this;
}
public AndroidTextFieldDialog setInputType(int type) {
userInput.setInputType(type);
return this;
}
public AndroidTextFieldDialog setInputType(int type){
userInput.setInputType(type);
return this;
}
public AndroidTextFieldDialog setMaxLength(int length) {
userInput.setFilters(new InputFilter[] { new InputFilter.LengthFilter(length) });
return this;
}
public interface TextPromptListener{
void confirm(String text);
}
public AndroidTextFieldDialog setMaxLength(int length){
userInput.setFilters(new InputFilter[]{new InputFilter.LengthFilter(length)});
return this;
}
public interface TextPromptListener{
void confirm(String text);
}
}

View File

@@ -8,12 +8,9 @@ import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.Button;
import org.sufficientlysecure.donations.DonationsFragment;
public class DonationsActivity extends FragmentActivity {
DonationsFragment donationsFragment;
public class DonationsActivity extends FragmentActivity{
/**
* Google
*/
@@ -21,13 +18,14 @@ public class DonationsActivity extends FragmentActivity {
private static final String[] GOOGLE_CATALOG = new String[]{
"mindustry.donation.1", "mindustry.donation.2", "mindustry.donation.5",
"mindustry.donation.10", "mindustry.donation.15",
"mindustry.donation.25", "mindustry.donation.50" };
"mindustry.donation.25", "mindustry.donation.50"};
DonationsFragment donationsFragment;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setTheme(R.style.GdxTheme);
@@ -35,7 +33,7 @@ public class DonationsActivity extends FragmentActivity {
setContentView(R.layout.donations_activity);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (BuildConfig.DONATIONS_GOOGLE) {
if(BuildConfig.DONATIONS_GOOGLE){
donationsFragment = DonationsFragment.newInstance(BuildConfig.DEBUG, true, GOOGLE_PUBKEY, GOOGLE_CATALOG,
getResources().getStringArray(R.array.donation_google_catalog_values), false, null, null,
null, false, null, null, false, null);
@@ -48,9 +46,10 @@ public class DonationsActivity extends FragmentActivity {
public void onStart(){
super.onStart();
Button b = ((Button)findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button));
b.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
Button b = ((Button) findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button));
b.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
donationsFragment.donateGoogleOnClick(donationsFragment.getView());
b.setEnabled(false);
}
@@ -58,20 +57,19 @@ public class DonationsActivity extends FragmentActivity {
}
/**
* Needed for Google Play In-app Billing. It uses startIntentSenderForResult(). The result is not propagated to
* the Fragment like in startActivityForResult(). Thus we need to propagate manually to our Fragment.
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
Button b = ((Button)findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button));
Button b = ((Button) findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button));
b.setEnabled(true);
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag("donationsFragment");
if (fragment != null) {
if(fragment != null){
fragment.onActivityResult(requestCode, resultCode, data);
//TODO donation event, set settings?
}

View File

@@ -11,57 +11,57 @@ import io.anuke.ucore.scene.event.InputListener;
import io.anuke.ucore.scene.ui.TextField;
public class TextFieldDialogListener extends ClickListener{
private TextField field;
private int type;
private int max;
private TextField field;
private int type;
private int max;
public static void add(TextField field, int type, int max){
field.addListener(new TextFieldDialogListener(field, type, max));
field.addListener(new InputListener(){
public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
Gdx.input.setOnscreenKeyboardVisible(false);
return false;
}
});
}
//type - 0 is text, 1 is numbers, 2 is decimals
public TextFieldDialogListener(TextField field, int type, int max){
this.field = field;
this.type = type;
this.max = max;
}
public static void add(TextField field){
add(field, 0, 16);
}
public static void add(TextField field, int type, int max){
field.addListener(new TextFieldDialogListener(field, type, max));
field.addListener(new InputListener(){
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){
Gdx.input.setOnscreenKeyboardVisible(false);
return false;
}
});
}
//type - 0 is text, 1 is numbers, 2 is decimals
public TextFieldDialogListener(TextField field, int type, int max){
this.field = field;
this.type = type;
this.max = max;
}
public static void add(TextField field){
add(field, 0, 16);
}
public void clicked(final InputEvent event, float x, float y){
if(Gdx.app.getType() == ApplicationType.Desktop) return;
AndroidTextFieldDialog dialog = new AndroidTextFieldDialog();
public void clicked(final InputEvent event, float x, float y){
dialog.setTextPromptListener(text -> {
if(Gdx.app.getType() == ApplicationType.Desktop) return;
AndroidTextFieldDialog dialog = new AndroidTextFieldDialog();
dialog.setTextPromptListener(text -> {
field.clearText();
field.appendText(text);
field.fire(new ChangeListener.ChangeEvent());
Gdx.graphics.requestRendering();
});
if(type == 0){
dialog.setInputType(InputType.TYPE_CLASS_TEXT);
}else if(type == 1){
dialog.setInputType(InputType.TYPE_CLASS_NUMBER);
}else if(type == 2){
dialog.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
}
if(type == 0){
dialog.setInputType(InputType.TYPE_CLASS_TEXT);
}else if(type == 1){
dialog.setInputType(InputType.TYPE_CLASS_NUMBER);
}else if(type == 2){
dialog.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
}
dialog.setConfirmButtonLabel("OK").setText(field.getText());
dialog.setCancelButtonLabel("Cancel");
dialog.setMaxLength(max);
dialog.show();
event.cancel();
dialog.setConfirmButtonLabel("OK").setText(field.getText());
dialog.setCancelButtonLabel("Cancel");
dialog.setMaxLength(max);
dialog.show();
event.cancel();
}
}
}

View File

@@ -9,70 +9,31 @@ import java.lang.annotation.Target;
* Goal: To create a system to send events to the server from the client and vice versa, without creating a new packet type each time.<br>
* These events may optionally also trigger on the caller client/server as well.<br>
*/
public class Annotations {
public class Annotations{
/**Marks a method as invokable remotely across a server/client connection.*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface Remote {
/**Specifies the locations from which this method can be invoked.*/
Loc targets() default Loc.server;
/**Specifies which methods are generated. Only affects server-to-client methods.*/
Variant variants() default Variant.all;
/**The local locations where this method is called locally, when invoked.*/
Loc called() default Loc.none;
/**Whether to forward this packet to all other clients upon recieval. Server only.*/
boolean forward() default false;
/**Whether the packet for this method is sent with UDP instead of TCP.
* UDP is faster, but is prone to packet loss and duplication.*/
boolean unreliable() default false;
/**The simple class name where this method is placed.*/
String in() default "Call";
/**Priority of this event.*/
PacketPriority priority() default PacketPriority.normal;
}
/**Specifies that this method will be used to write classes of the type returned by {@link #value()}.<br>
* This method must return void and have two parameters, the first being of type {@link java.nio.ByteBuffer} and the second
* being the type returned by {@link #value()}.*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface WriteClass {
Class<?> value();
}
/**Specifies that this method will be used to read classes of the type returned by {@link #value()}. <br>
* This method must return the type returned by {@link #value()},
* and have one parameter, being of type {@link java.nio.ByteBuffer}.*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface ReadClass {
Class<?> value();
}
public enum PacketPriority {
/**Gets put in a queue and processed if not connected.*/
public enum PacketPriority{
/** Gets put in a queue and processed if not connected. */
normal,
/**Gets handled immediately, regardless of connection status.*/
/** Gets handled immediately, regardless of connection status. */
high,
/**Does not get handled unless client is connected.*/
/** Does not get handled unless client is connected. */
low
}
/**A set of two booleans, one specifying server and one specifying client.*/
public enum Loc {
/**Method can only be invoked on the client from the server.*/
/** A set of two booleans, one specifying server and one specifying client. */
public enum Loc{
/** Method can only be invoked on the client from the server. */
server(true, false),
/**Method can only be invoked on the server from the client.*/
/** Method can only be invoked on the server from the client. */
client(false, true),
/**Method can be invoked from anywhere*/
/** Method can be invoked from anywhere */
both(true, true),
/**Neither server no client.*/
/** Neither server nor client. */
none(false, false);
/**If true, this method can be invoked ON clients FROM servers.*/
/** If true, this method can be invoked ON clients FROM servers. */
public final boolean isServer;
/**If true, this method can be invoked ON servers FROM clients.*/
/** If true, this method can be invoked ON servers FROM clients. */
public final boolean isClient;
Loc(boolean server, boolean client){
@@ -81,12 +42,12 @@ public class Annotations {
}
}
public enum Variant {
/**Method can only be invoked targeting one player.*/
public enum Variant{
/** Method can only be invoked targeting one player. */
one(true, false),
/**Method can only be invoked targeting all players.*/
/** Method can only be invoked targeting all players. */
all(false, true),
/**Method targets both one player and all players.*/
/** Method targets both one player and all players. */
both(true, true);
public final boolean isOne, isAll;
@@ -96,4 +57,55 @@ public class Annotations {
this.isAll = isAll;
}
}
/** Marks a method as invokable remotely across a server/client connection. */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface Remote{
/** Specifies the locations from which this method can be invoked. */
Loc targets() default Loc.server;
/** Specifies which methods are generated. Only affects server-to-client methods. */
Variant variants() default Variant.all;
/** The local locations where this method is called locally, when invoked. */
Loc called() default Loc.none;
/** Whether to forward this packet to all other clients upon recieval. Client only. */
boolean forward() default false;
/**
* Whether the packet for this method is sent with UDP instead of TCP.
* UDP is faster, but is prone to packet loss and duplication.
*/
boolean unreliable() default false;
/** The simple class name where this method is placed. */
String in() default "Call";
/** Priority of this event. */
PacketPriority priority() default PacketPriority.normal;
}
/**
* Specifies that this method will be used to write classes of the type returned by {@link #value()}.<br>
* This method must return void and have two parameters, the first being of type {@link java.nio.ByteBuffer} and the second
* being the type returned by {@link #value()}.
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface WriteClass{
Class<?> value();
}
/**
* Specifies that this method will be used to read classes of the type returned by {@link #value()}. <br>
* This method must return the type returned by {@link #value()},
* and have one parameter, being of type {@link java.nio.ByteBuffer}.
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface ReadClass{
Class<?> value();
}
}

View File

@@ -2,14 +2,14 @@ package io.anuke.annotations;
import java.util.ArrayList;
/**Represents a class witha list method entries to include in it.*/
public class ClassEntry {
/**All methods in this generated class.*/
/** Represents a class witha list method entries to include in it. */
public class ClassEntry{
/** All methods in this generated class. */
public final ArrayList<MethodEntry> methods = new ArrayList<>();
/**Simple class name.*/
/** Simple class name. */
public final String name;
public ClassEntry(String name) {
public ClassEntry(String name){
this.name = name;
}
}

View File

@@ -10,12 +10,16 @@ import javax.tools.Diagnostic.Kind;
import java.util.HashMap;
import java.util.Set;
/**This class finds reader and writer methods annotated by the {@link io.anuke.annotations.Annotations.WriteClass}
* and {@link io.anuke.annotations.Annotations.ReadClass} annotations.*/
public class IOFinder {
/**
* This class finds reader and writer methods annotated by the {@link io.anuke.annotations.Annotations.WriteClass}
* and {@link io.anuke.annotations.Annotations.ReadClass} annotations.
*/
public class IOFinder{
/**Finds all class serializers for all types and returns them. Logs errors when necessary.
* Maps fully qualified class names to their serializers.*/
/**
* Finds all class serializers for all types and returns them. Logs errors when necessary.
* Maps fully qualified class names to their serializers.
*/
public HashMap<String, ClassSerializer> findSerializers(RoundEnvironment env){
HashMap<String, ClassSerializer> result = new HashMap<>();
@@ -51,33 +55,33 @@ public class IOFinder {
}
private String getValue(WriteClass write){
try {
try{
Class<?> type = write.value();
return type.getName();
}catch (MirroredTypeException e){
}catch(MirroredTypeException e){
return e.getTypeMirror().toString();
}
}
private String getValue(ReadClass read){
try {
try{
Class<?> type = read.value();
return type.getName();
}catch (MirroredTypeException e){
}catch(MirroredTypeException e){
return e.getTypeMirror().toString();
}
}
/**Information about read/write methods for a specific class type.*/
/** Information about read/write methods for a specific class type. */
public static class ClassSerializer{
/**Fully qualified method name of the reader.*/
/** Fully qualified method name of the reader. */
public final String readMethod;
/**Fully qualified method name of the writer.*/
/** Fully qualified method name of the writer. */
public final String writeMethod;
/**Fully qualified class type name.*/
/** Fully qualified class type name. */
public final String classType;
public ClassSerializer(String readMethod, String writeMethod, String classType) {
public ClassSerializer(String readMethod, String writeMethod, String classType){
this.readMethod = readMethod;
this.writeMethod = writeMethod;
this.classType = classType;

View File

@@ -6,32 +6,34 @@ import io.anuke.annotations.Annotations.Variant;
import javax.lang.model.element.ExecutableElement;
/**Class that repesents a remote method to be constructed and put into a class.*/
public class MethodEntry {
/**Simple target class name.*/
/** Class that repesents a remote method to be constructed and put into a class. */
public class MethodEntry{
/** Simple target class name. */
public final String className;
/**Fully qualified target method to call.*/
/** Fully qualified target method to call. */
public final String targetMethod;
/**Whether this method can be called on a client/server.*/
/** Whether this method can be called on a client/server. */
public final Loc where;
/**Whether an additional 'one' and 'all' method variant is generated. At least one of these must be true.
* Only applicable to client (server-invoked) methods.*/
/**
* Whether an additional 'one' and 'all' method variant is generated. At least one of these must be true.
* Only applicable to client (server-invoked) methods.
*/
public final Variant target;
/**Whether this method is called locally as well as remotely.*/
/** Whether this method is called locally as well as remotely. */
public final Loc local;
/**Whether this method is unreliable and uses UDP.*/
/** Whether this method is unreliable and uses UDP. */
public final boolean unreliable;
/**Whether to forward this method call to all other clients when a client invokes it. Server only.*/
/** Whether to forward this method call to all other clients when a client invokes it. Server only. */
public final boolean forward;
/**Unique method ID.*/
/** Unique method ID. */
public final int id;
/**The element method associated with this entry.*/
/** The element method associated with this entry. */
public final ExecutableElement element;
/**The assigned packet priority. Only used in clients.*/
/** The assigned packet priority. Only used in clients. */
public final PacketPriority priority;
public MethodEntry(String className, String targetMethod, Loc where, Variant target,
Loc local, boolean unreliable, boolean forward, int id, ExecutableElement element, PacketPriority priority) {
Loc local, boolean unreliable, boolean forward, int id, ExecutableElement element, PacketPriority priority){
this.className = className;
this.forward = forward;
this.targetMethod = targetMethod;
@@ -45,7 +47,7 @@ public class MethodEntry {
}
@Override
public int hashCode() {
public int hashCode(){
return targetMethod.hashCode();
}
}

View File

@@ -18,25 +18,25 @@ import java.util.*;
import java.util.stream.Collectors;
/**The annotation processor for generating remote method call code.*/
/** The annotation processor for generating remote method call code. */
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes({
"io.anuke.annotations.Annotations.Remote",
"io.anuke.annotations.Annotations.WriteClass",
"io.anuke.annotations.Annotations.ReadClass",
"io.anuke.annotations.Annotations.Remote",
"io.anuke.annotations.Annotations.WriteClass",
"io.anuke.annotations.Annotations.ReadClass",
})
public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
/**Maximum size of each event packet.*/
public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
/** Maximum size of each event packet. */
public static final int maxPacketSize = 4096;
/**Name of the base package to put all the generated classes.*/
/** Name of the base package to put all the generated classes. */
private static final String packageName = "io.anuke.mindustry.gen";
/**Name of class that handles reading and invoking packets on the server.*/
/** Name of class that handles reading and invoking packets on the server. */
private static final String readServerName = "RemoteReadServer";
/**Name of class that handles reading and invoking packets on the client.*/
/** Name of class that handles reading and invoking packets on the client. */
private static final String readClientName = "RemoteReadClient";
/**Processing round number.*/
/** Processing round number. */
private int round;
//class serializers
@@ -51,7 +51,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
private ArrayList<ClassEntry> classes;
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
public synchronized void init(ProcessingEnvironment processingEnv){
super.init(processingEnv);
//put all relevant utils into utils class
Utils.typeUtils = processingEnv.getTypeUtils();
@@ -61,15 +61,15 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
if(round > 1) return false; //only process 2 rounds
round ++;
round++;
try {
try{
//round 1: find all annotations, generate *writers*
if(round == 1) {
if(round == 1){
//get serializers
serializers = new IOFinder().findSerializers(roundEnv);
@@ -88,21 +88,21 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
orderedElements.sort(Comparator.comparing(Object::toString));
//create methods
for (Element element : orderedElements) {
for(Element element : orderedElements){
Remote annotation = element.getAnnotation(Remote.class);
//check for static
if (!element.getModifiers().contains(Modifier.STATIC) || !element.getModifiers().contains(Modifier.PUBLIC)) {
if(!element.getModifiers().contains(Modifier.STATIC) || !element.getModifiers().contains(Modifier.PUBLIC)){
Utils.messager.printMessage(Kind.ERROR, "All @Remote methods must be public and static: ", element);
}
//can't generate none methods
if (annotation.targets() == Loc.none) {
if(annotation.targets() == Loc.none){
Utils.messager.printMessage(Kind.ERROR, "A @Remote method's targets() cannot be equal to 'none':", element);
}
//get and create class entry if needed
if (!classMap.containsKey(annotation.in())) {
if(!classMap.containsKey(annotation.in())){
ClassEntry clas = new ClassEntry(annotation.in());
classMap.put(annotation.in(), clas);
classes.add(clas);
@@ -127,7 +127,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
writegen.generateFor(classes, packageName);
return true;
}else if(round == 2) { //round 2: generate all *readers*
}else if(round == 2){ //round 2: generate all *readers*
RemoteReadGenerator readgen = new RemoteReadGenerator(serializers);
//generate server readers
@@ -147,7 +147,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
return true;
}
}catch (Exception e){
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}

View File

@@ -14,22 +14,25 @@ import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.List;
/**Generates code for reading remote invoke packets on the client and server.*/
public class RemoteReadGenerator {
/** Generates code for reading remote invoke packets on the client and server. */
public class RemoteReadGenerator{
private final HashMap<String, ClassSerializer> serializers;
/**Creates a read generator that uses the supplied serializer setup.*/
public RemoteReadGenerator(HashMap<String, ClassSerializer> serializers) {
/** Creates a read generator that uses the supplied serializer setup. */
public RemoteReadGenerator(HashMap<String, ClassSerializer> serializers){
this.serializers = serializers;
}
/**Generates a class for reading remote invoke packets.
/**
* Generates a class for reading remote invoke packets.
*
* @param entries List of methods to use/
* @param className Simple target class name.
* @param packageName Full target package name.
* @param needsPlayer Whether this read method requires a reference to the player sender.*/
* @param needsPlayer Whether this read method requires a reference to the player sender.
*/
public void generateFor(List<MethodEntry> entries, String className, String packageName, boolean needsPlayer)
throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException {
throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException{
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
@@ -69,10 +72,10 @@ public class RemoteReadGenerator {
StringBuilder varResult = new StringBuilder();
//go through each parameter
for(int i = 0; i < entry.element.getParameters().size(); i ++){
for(int i = 0; i < entry.element.getParameters().size(); i++){
VariableElement var = entry.element.getParameters().get(i);
if(!needsPlayer || i != 0) { //if client, skip first parameter since it's always of type player and doesn't need to be read
if(!needsPlayer || i != 0){ //if client, skip first parameter since it's always of type player and doesn't need to be read
//full type name of parameter
String typeName = var.asType().toString();
//name of parameter
@@ -81,17 +84,17 @@ public class RemoteReadGenerator {
String capName = typeName.equals("byte") ? "" : Character.toUpperCase(typeName.charAt(0)) + typeName.substring(1);
//write primitives automatically
if (Utils.isPrimitive(typeName)) {
if (typeName.equals("boolean")) {
if(Utils.isPrimitive(typeName)){
if(typeName.equals("boolean")){
readBlock.addStatement("boolean " + varName + " = buffer.get() == 1");
} else {
}else{
readBlock.addStatement(typeName + " " + varName + " = buffer.get" + capName + "()");
}
} else {
}else{
//else, try and find a serializer
ClassSerializer ser = serializers.get(typeName);
if (ser == null) { //make sure a serializer exists!
if(ser == null){ //make sure a serializer exists!
Utils.messager.printMessage(Kind.ERROR, "No @ReadClass method to read class type: '" + typeName + "'", var);
return;
}
@@ -121,7 +124,7 @@ public class RemoteReadGenerator {
}
readBlock.nextControlFlow("catch (java.lang.Exception e)");
readBlock.addStatement("throw new java.lang.RuntimeException(\"Failed to to read remote method '"+entry.element.getSimpleName() +"'!\", e)");
readBlock.addStatement("throw new java.lang.RuntimeException(\"Failed to to read remote method '" + entry.element.getSimpleName() + "'!\", e)");
readBlock.endControlFlow();
}

View File

@@ -14,17 +14,17 @@ import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.List;
/**Generates code for writing remote invoke packets on the client and server.*/
public class RemoteWriteGenerator {
/** Generates code for writing remote invoke packets on the client and server. */
public class RemoteWriteGenerator{
private final HashMap<String, ClassSerializer> serializers;
/**Creates a write generator that uses the supplied serializer setup.*/
public RemoteWriteGenerator(HashMap<String, ClassSerializer> serializers) {
/** Creates a write generator that uses the supplied serializer setup. */
public RemoteWriteGenerator(HashMap<String, ClassSerializer> serializers){
this.serializers = serializers;
}
/**Generates all classes in this list.*/
public void generateFor(List<ClassEntry> entries, String packageName) throws IOException {
/** Generates all classes in this list. */
public void generateFor(List<ClassEntry> entries, String packageName) throws IOException{
for(ClassEntry entry : entries){
//create builder
@@ -58,7 +58,7 @@ public class RemoteWriteGenerator {
}
}
/**Creates a specific variant for a method entry.*/
/** Creates a specific variant for a method entry. */
private void writeMethodVariant(TypeSpec.Builder classBuilder, MethodEntry methodEntry, boolean toAll, boolean forwarded){
ExecutableElement elem = methodEntry.element;
@@ -99,7 +99,7 @@ public class RemoteWriteGenerator {
if(!forwarded && methodEntry.local != Loc.none){
//add in local checks
if(methodEntry.local != Loc.both){
method.beginControlFlow("if("+getCheckString(methodEntry.local) + " || !io.anuke.mindustry.net.Net.active())");
method.beginControlFlow("if(" + getCheckString(methodEntry.local) + " || !io.anuke.mindustry.net.Net.active())");
}
//concatenate parameters
@@ -109,16 +109,16 @@ public class RemoteWriteGenerator {
//special case: calling local-only methods uses the local player
if(index == 0 && methodEntry.where == Loc.client){
results.append("io.anuke.mindustry.Vars.players[0]");
}else {
}else{
results.append(var.getSimpleName());
}
if(index != elem.getParameters().size() - 1) results.append(", ");
index ++;
index++;
}
//add the statement to call it
method.addStatement("$N." + elem.getSimpleName() + "(" + results.toString() + ")",
((TypeElement)elem.getEnclosingElement()).getQualifiedName().toString());
((TypeElement) elem.getEnclosingElement()).getQualifiedName().toString());
if(methodEntry.local != Loc.both){
method.endControlFlow();
@@ -126,10 +126,10 @@ public class RemoteWriteGenerator {
}
//start control flow to check if it's actually client/server so no netcode is called
method.beginControlFlow("if("+getCheckString(methodEntry.where)+")");
method.beginControlFlow("if(" + getCheckString(methodEntry.where) + ")");
//add statement to create packet from pool
method.addStatement("$1N packet = $2N.obtain($1N.class)", "io.anuke.mindustry.net.Packets.InvokePacket", "com.badlogic.gdx.utils.Pools");
method.addStatement("$1N packet = $2N.obtain($1N.class)", "io.anuke.mindustry.net.Packets.InvokePacket", "io.anuke.ucore.util.Pooling");
//assign buffer
method.addStatement("packet.writeBuffer = TEMP_BUFFER");
//assign priority
@@ -139,7 +139,7 @@ public class RemoteWriteGenerator {
//rewind buffer
method.addStatement("TEMP_BUFFER.position(0)");
for(int i = 0; i < elem.getParameters().size(); i ++){
for(int i = 0; i < elem.getParameters().size(); i++){
//first argument is skipped as it is always the player caller
if((!methodEntry.where.isServer/* || methodEntry.mode == Loc.both*/) && i == 0){
continue;
@@ -164,7 +164,7 @@ public class RemoteWriteGenerator {
method.beginControlFlow("if(io.anuke.mindustry.net.Net.server())");
}
if(Utils.isPrimitive(typeName)) { //check if it's a primitive, and if so write it
if(Utils.isPrimitive(typeName)){ //check if it's a primitive, and if so write it
if(typeName.equals("boolean")){ //booleans are special
method.addStatement("TEMP_BUFFER.put(" + varName + " ? (byte)1 : 0)");
}else{
@@ -181,7 +181,7 @@ public class RemoteWriteGenerator {
}
//add statement for writing it
method.addStatement(ser.writeMethod + "(TEMP_BUFFER, " + varName +")");
method.addStatement(ser.writeMethod + "(TEMP_BUFFER, " + varName + ")");
}
if(writePlayerSkipCheck){ //write end check
@@ -197,7 +197,7 @@ public class RemoteWriteGenerator {
if(forwarded){ //forward packet
if(!methodEntry.local.isClient){ //if the client doesn't get it called locally, forward it back after validation
sendString = "send(";
}else {
}else{
sendString = "sendExcept(exceptSenderID, ";
}
}else if(toAll){ //send to all players / to server
@@ -207,8 +207,8 @@ public class RemoteWriteGenerator {
}
//send the actual packet
method.addStatement("io.anuke.mindustry.net.Net." + sendString + "packet, "+
(methodEntry.unreliable ? "io.anuke.mindustry.net.Net.SendMode.udp" : "io.anuke.mindustry.net.Net.SendMode.tcp")+")");
method.addStatement("io.anuke.mindustry.net.Net." + sendString + "packet, " +
(methodEntry.unreliable ? "io.anuke.mindustry.net.Net.SendMode.udp" : "io.anuke.mindustry.net.Net.SendMode.tcp") + ")");
//end check for server/client
@@ -220,7 +220,7 @@ public class RemoteWriteGenerator {
private String getCheckString(Loc loc){
return loc.isClient && loc.isServer ? "io.anuke.mindustry.net.Net.server() || io.anuke.mindustry.net.Net.client()" :
loc.isClient ? "io.anuke.mindustry.net.Net.client()" :
loc.isServer ? "io.anuke.mindustry.net.Net.server()" : "false";
loc.isClient ? "io.anuke.mindustry.net.Net.client()" :
loc.isServer ? "io.anuke.mindustry.net.Net.server()" : "false";
}
}

View File

@@ -7,14 +7,14 @@ import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
public class Utils {
public class Utils{
public static Types typeUtils;
public static Elements elementUtils;
public static Filer filer;
public static Messager messager;
public static String getMethodName(Element element){
return ((TypeElement)element.getEnclosingElement()).getQualifiedName().toString() + "." + element.getSimpleName();
return ((TypeElement) element.getEnclosingElement()).getQualifiedName().toString() + "." + element.getSimpleName();
}
public static boolean isPrimitive(String type){

View File

@@ -9,7 +9,7 @@ buildscript {
dependencies {
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.0'
classpath 'de.richsource.gradle.plugins:gwt-gradle-plugin:0.6'
classpath 'com.android.tools.build:gradle:3.1.0'
classpath 'com.android.tools.build:gradle:3.1.3'
classpath "com.badlogicgames.gdx:gdx-tools:1.9.8"
}
}
@@ -27,7 +27,7 @@ allprojects {
gdxVersion = '1.9.8'
roboVMVersion = '2.3.0'
aiVersion = '1.8.1'
uCoreVersion = '2241e5402e'
uCoreVersion = 'c502931313'
getVersionString = {
String buildVersion = getBuildVersion()

View File

Before

Width:  |  Height:  |  Size: 296 B

After

Width:  |  Height:  |  Size: 296 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 B

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

View File

Before

Width:  |  Height:  |  Size: 267 B

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 B

View File

@@ -55,13 +55,7 @@ text.about.button=About
text.name=Name:
text.unlocked=New Block Unlocked!
text.unlocked.plural=New Blocks Unlocked!
text.server.rollback=Rollback
text.server.rollback.numberfield=Rollback Amount:
text.blocks.editlogs=Edit Logs
text.block.editlogsnotfound=[red]There are no edit logs for this location.
text.public=Public
text.players={0} players online
text.server.player.host={0} (host)
text.players.single={0} player online
text.server.mismatch=Packet error: possible client/server version mismatch.\nMake sure you and the host have the\nlatest version of Mindustry!
text.server.closing=[accent]Closing server...
@@ -118,7 +112,6 @@ text.confirmban=Are you sure you want to ban this player?
text.confirmunban=Are you sure you want to unban this player?
text.confirmadmin=Are you sure you want to make this player an admin?
text.confirmunadmin=Are you sure you want to remove admin status from this player?
text.joingame.byip=Join by IP...
text.joingame.title=Join Game
text.joingame.ip=IP:
text.disconnect=Disconnected.
@@ -130,8 +123,7 @@ text.server.port=Port:
text.server.addressinuse=Address already in use!
text.server.invalidport=Invalid port number!
text.server.error=[crimson]Error hosting server: [orange]{0}
text.tutorial.back=< Prev
text.tutorial.next=Next >
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.
text.save.new=New Save
text.save.overwrite=Are you sure you want to overwrite\nthis save slot?
text.overwrite=Overwrite
@@ -141,7 +133,7 @@ text.savefail=Failed to save game!
text.save.delete.confirm=Are you sure you want to delete this save?
text.save.delete=Delete
text.save.export=Export Save
text.save.import.invalid=[orange]This save is invalid!\n\nNote that[scarlet]importing saves with custom maps[orange]\nfrom other devices does not work!
text.save.import.invalid=[orange]This save is invalid!
text.save.import.fail=[crimson]Failed to import save: [orange]{0}
text.save.export.fail=[crimson]Failed to export save: [orange]{0}
text.save.import=Import Save
@@ -226,21 +218,13 @@ text.editor.exportimage.description=Export a map image file
text.editor.loadimage=Import Terrain
text.editor.saveimage=Export Terrain
text.editor.unsaved=[scarlet]You have unsaved changes![]\nAre you sure you want to exit?
text.editor.brushsize=Brush size: {0}
text.editor.noplayerspawn=This map has no player spawnpoint!
text.editor.manyplayerspawns=Maps cannot have more than one\nplayer spawnpoint!
text.editor.manyenemyspawns=Cannot have more than\n{0} enemy spawnpoints!
text.editor.resizemap=Resize Map
text.editor.resizebig=[scarlet]Warning!\n[]Maps larger than 256 units may be laggy and unstable.
text.editor.mapname=Map Name:
text.editor.overwrite=[accent]Warning!\nThis overwrites an existing map.
text.editor.overwrite.confirm=[scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
text.editor.selectmap=Select a map to load:
text.width=Width:
text.height=Height:
text.randomize=Randomize
text.apply=Apply
text.update=Update
text.menu=Menu
text.play=Play
text.load=Load
@@ -269,7 +253,6 @@ text.yes=Yes
text.no=No
text.info.title=[accent]Info
text.error.title=[crimson]An error has occured
text.error.crashmessage=[SCARLET]An unexpected error has occured, which would have caused a crash.\n[]Please report the exact circumstances under which this error occured to the developer: \n[ORANGE]anukendev@gmail.com[]
text.error.crashtitle=An error has occured
text.blocks.blockinfo=Block Info
text.blocks.powercapacity=Power Capacity
@@ -297,6 +280,10 @@ text.blocks.drilltier=Drillables
text.blocks.drillspeed=Base Drill Speed
text.blocks.liquidoutput=Liquid Output
text.blocks.liquiduse=Liquid Use
text.blocks.coolant=Coolant
text.blocks.coolantuse=Coolant Use
text.blocks.inputliquidfuel=Fuel Liquid
text.blocks.liquidfueluse=Liquid Fuel Use
text.blocks.explosive=Highly explosive!
text.blocks.health=Health
text.blocks.inaccuracy=Inaccuracy
@@ -332,7 +319,6 @@ setting.difficulty.insane=insane
setting.difficulty.purge=purge
setting.difficulty.name=Difficulty:
setting.screenshake.name=Screen Shake
setting.smoothcam.name=Smooth Camera
setting.indicators.name=Enemy Indicators
setting.effects.name=Display Effects
setting.sensitivity.name=Controller Sensitivity
@@ -343,10 +329,8 @@ setting.multithread.name=Multithreading
setting.fps.name=Show FPS
setting.vsync.name=VSync
setting.lasers.name=Show Power Lasers
setting.previewopacity.name=Placing Preview Opacity
setting.healthbars.name=Show Entity Health bars
setting.minimap.name=Show Minimap
setting.pixelate.name=Pixelate Screen
setting.musicvol.name=Music Volume
setting.mutemusic.name=Mute Music
setting.sfxvol.name=SFX Volume
@@ -454,15 +438,15 @@ block.conveyor.name=Conveyor
block.titanium-conveyor.name=Titanium Conveyor
block.junction.name=Junction
block.splitter.name=Splitter
block.splitter.description=Outputs items into two opposite directions immediately after they are recieved.
block.splitter.description=Outputs items into three different directions once they are recieved.
block.router.name=Router
block.router.description=Splits items into all 4 directions. Can store items as a buffer.
block.multiplexer.name=Multiplexer
block.multiplexer.description=A router that can split items into 8 directions.
block.distributor.name=Distributor
block.distributor.description=A splitter that can split items into 8 directions.
block.sorter.name=Sorter
block.sorter.description=Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right.
block.overflowgate.name=Overflow Gate
block.overflowgate.description=A combination splitter and router that only outputs to the left and right if the front path is blocked.
block.overflow-gate.name=Overflow Gate
block.overflow-gate.description=A combination splitter and router that only outputs to the left and right if the front path is blocked.
block.bridgeconveyor.name=Bridge Conveyor
block.bridgeconveyor.description=A conveyor that can go over other blocks, for up to two total blocks.
block.smelter.name=Smelter
@@ -512,7 +496,6 @@ block.swarmer.name=Swarmer
block.salvo.name=Salvo
block.ripple.name=Ripple
block.phase-conveyor.name=Phase Conveyor
block.overflow-gate.name=Overflow Gate
block.bridge-conveyor.name=Bridge Conveyor
block.plastanium-compressor.name=Plastanium Compressor
block.pyratite-mixer.name=Pyratite Mixer

View File

@@ -1,479 +1,495 @@
text.about = Erstellt von [ROYAL] Anuken. [] \nUrsprünglich ein Eintrag im [orange] GDL [] MM Jam.\n\nCredits: \n- SFX gemacht mit [yellow] bfxr [] - Musik gemacht von [green] RoccoW [] / gefunden auf [lime] FreeMusicArchive.org [] \n\nBesonderer Dank geht an: \n- [coral] MitchellFJN []: Umfangreicher Spieletest und Feedback \n- [sky] Luxray5474 []: Wiki-Arbeit, Code-Beiträge \n- Alle Beta-Tester auf itch.io und Google Play\n
text.discord = Trete dem Mindustry Discord bei!
text.gameover = Der Kern wurde zerstört.
text.highscore = [YELLOW] Neuer Highscore!
text.lasted = Du hast bis zur folgenden Welle überlebt
text.level.highscore = High Score: [accent] {0}
text.level.delete.title = Löschen bestätigen
text.level.delete = Bist du sicher, dass du die Karte \"[orange] {0}\" löschen möchtest?
text.level.select = Level Auswahl
text.level.mode = Spielmodus:
text.savegame = Spiel speichern
text.loadgame = Spiel laden
text.joingame = Spiel beitreten
text.quit = Verlassen
text.about.button = Info
text.name = Name:
text.public = Öffentlich
text.players = {0} Spieler online
text.players.single = {0} Spieler online
text.server.mismatch = Paketfehler: Mögliche Client / Server-Version stimmt nicht überein. Stell sicher, dass du und der Host die neueste Version von Mindustry haben!
.server.closing = [accent] Server wird geschlossen...
text.server.kicked.kick = Du wurdest vom Server gekickt!
text.server.kicked.invalidPassword = Falsches Passwort.
text.server.connected = {0} ist beigetreten
text.server.disconnected = {0} hat die Verbindung getrennt.
text.nohost = Server kann nicht auf einer benutzerdefinierten Karte gehostet werden!
text.hostserver = Server hosten
text.host = Host
text.hosting = [accent] Server wird geöffnet...
text.hosts.refresh = Aktualisieren
text.hosts.discovering = Suche nach LAN-Spielen
text.server.refreshing = Server wird aktualisiert
text.hosts.none = [lightgray] Keine LAN Spiele gefunden!
text.host.invalid = [scarlet] Kann keine Verbindung zum Host herstellen.
text.server.add = Server hinzufügen
text.server.delete = Bist du dir sicher das du diesen Server löschen möchtest?
text.server.hostname = Host: {0}
text.server.edit = Server bearbeiten
text.joingame.byip = Über IP beitreten ...
text.joingame.title = Spiel beitreten
text.joingame.ip = IP:
text.disconnect = Verbindung unterbrochen.
text.connecting = [accent] Verbindet...
text.connecting.data = [accent] Weltdaten werden geladen...
text.connectfail = [crimson] Verbindung zum Server konnte nicht hergestellt werden: [orange]{0}
text.server.port = Port:
text.server.invalidport = Falscher Port!
text.server.error = [crimson] Fehler beim Hosten des Servers: [orange] {0}
text.tutorial.back = < Zurück
text.tutorial.next = Weiter >
text.save.new = Neuer Spielstand
text.save.overwrite = Möchten du diesen Spielstand wirklich überschreiben?
text.overwrite = Überschreiben
text.save.none = Keine Spielstände gefunden!
text.saveload = [accent] Speichern ...
text.savefail = Fehler beim Speichern des Spiels!
text.save.delete.confirm = Möchtest du diesen Spielstand wirklich löschen?
text.save.delete = Löschen
text.save.export = Spielstand exportieren
text.save.import.invalid = [orange] Dieser Spielstand ist ungültig!
text.save.import.fail = [crimson] Spielstand konnte nicht importiert werden: [orange] {0}
text.save.export.fail = [crimson] Spielstand konnte nicht exportiert werden: [orange] {0}
text.save.import = Spielstand importieren
text.save.newslot = Name speichern:
text.save.rename = Umbenennen
text.save.rename.text = Neuer Name
text.selectslot = Wähle einen Spielstand
text.slot = [accent] Platz {0}
text.save.corrupted = [orange] Datei beschädigt oder ungültig!
text.empty = <leer>
text.on = An
text.off = Aus
text.save.autosave = Automatisches Speichern: {0}
text.save.map = Karte: {0}
text.save.wave = Welle: {0}
text.save.date = Zuletzt gespeichert: {0}
text.confirm = Bestätigen
text.delete = Löschen
text.ok = OK
text.open = Öffnen
text.cancel = Abbruch
text.openlink = Link öffnen
text.back = Zurück
text.quit.confirm = Willst du wirklich aufhören?
text.loading = [accent] Wird geladen ...
text.wave = [orange] Welle {0}
text.wave.waiting = Welle in {0}
text.waiting = Warten...
text.enemies = {0} Feinde
text.enemies.single = {0} Feind
text.loadimage = Bild laden
text.saveimage = Bild speichern
text.editor.badsize = [orange]Ungültige Bildabmessungen! [] Gültige Kartenabmessungen: {0}
text.editor.errorimageload = Fehler beim Laden des Bildes: [orange] {0}
text.editor.errorimagesave = Fehler beim Speichern des Bildes: [orange] {0}
text.editor.generate = Generieren
text.editor.resize = Grösse\nanpassen
text.editor.loadmap = Karte\nladen
text.editor.savemap = Karte\nspeichern
text.editor.loadimage = Bild\nladen
text.editor.saveimage = Bild\nspeichern
text.editor.unsaved = [crimson] Du hast Änderungen nicht gespeichert [] Möchtest du wirklich aufhören?
text.editor.brushsize = Pinselgrösse: {0}
text.editor.noplayerspawn = Diese Karte hat keinen Spielerspawnpunkt!
text.editor.manyplayerspawns = Maps können nicht mehr als einen Spawnpunkt des Spielers haben!
text.editor.manyenemyspawns = Kann nicht mehr als {0} feindliche Spawnpunkte haben!
text.editor.resizemap = Grösse der Karte ändern
text.editor.resizebig = [crimson] Warnung! [] Karten, die grösser als 256 Einheiten sind, können ruckeln und instabil sein.
text.editor.mapname = Map Name
text.editor.overwrite = [accent] Warnung! Dies überschreibt eine vorhandene Map.
text.editor.failoverwrite = [crimson] Die Standardkarte kann nicht überschrieben werden!
text.editor.selectmap = Wähle eine Map zum Laden:
text.width = Breite:
text.height = Höhe:
text.randomize = Zufällig
text.apply = Anwenden
text.update = Aktualisieren
text.menu = Menü
text.play = Spielen
text.load = Laden
text.save = Speichern
text.settings = Einstellungen
text.tutorial = Tutorial
text.editor = Bearbeiter
text.mapeditor = Karten Bearbeiter
text.donate = Spenden
text.settings.reset = Auf Standard zurücksetzen
text.settings.controls = Steuerung
text.settings.game = Spiel
text.settings.sound = Audio
text.settings.graphics = Grafiken
text.upgrades = Verbesserungen
text.purchased = [LIME] Erstellt!
text.weapons = Waffen
text.paused = Pausiert
text.respawn = Respawn in
text.error.title = [crimson] Ein Fehler ist aufgetreten
text.error.crashmessage = [SCARLET] Es ist ein unerwarteter Fehler aufgetreten, der einen Absturz verursacht hätte. [] Bitte geben Sie die genauen Umstände an, unter denen dieser Fehler passiert ist, für den Entwickler: [ORANGE] anukendev@gmail.com []
text.error.crashtitle = EIn Fehler ist aufgetreten!
text.mode.break = Zerstörungsmodus: {0}
text.mode.place = Platzierungsmodus: {0}
placemode.hold.name = Zeile
placemode.areadelete.name = Gebiet
placemode.touchdelete.name = berühren
placemode.holddelete.name = halten
placemode.none.name = keine
placemode.touch.name = berühren
placemode.cursor.name = Mauszeiger
text.blocks.extrainfo = [accent] Extra Blockinfo:
text.blocks.blockinfo = Blockinfo:
text.blocks.powercapacity = Energiekapazität
text.blocks.powershot = Energie / Schuss
text.blocks.powersecond = Energie / Sekunde
text.blocks.powerdraindamage = Energieabnahme / Schaden
text.blocks.shieldradius = Schildradius
text.blocks.itemspeedsecond = Gegenstands Geschwindigkeit / Sekunde
text.blocks.range = Reichweite
text.blocks.size = Grösse
text.blocks.powerliquid = Energie / Flüssigkeit
text.blocks.maxliquidsecond = Max Flüssigkeit / Sekunde
text.blocks.liquidcapacity = Flüssigkeitskapazität
text.blocks.liquidsecond = Flüssigkeit / Sekunde
text.blocks.damageshot = Schaden / Schuss
text.blocks.ammocapacity = Munitionskapazität
text.blocks.ammo = Munition
text.blocks.ammoitem = Munition / Gegenstand
text.blocks.maxitemssecond = Max Gegenstände / Sekunde
text.blocks.powerrange = Energiereichweite
text.blocks.lasertilerange = Laser Reichweite
text.blocks.capacity = Kapazität
text.blocks.itemcapacity = Gegenstand Kapazität
text.blocks.maxpowergenerationsecond = Max Energieerzeugung / Sekunde
text.blocks.powergenerationsecond = Energieerzeugung / Sekunde
text.blocks.generationsecondsitem = Generation Sekunden / Gegenstand
text.blocks.input = Eingabe
text.blocks.inputliquid = Flüssigkeiten Eingabe
text.blocks.inputitem = Eingabe Gegenstand
text.blocks.output = Ausgabe
text.blocks.secondsitem = Sekunden / Item
text.blocks.maxpowertransfersecond = Max Energieübertragung / Sekunde
text.blocks.explosive = Hochexplosiv!
text.blocks.repairssecond = Reparaturen / Sekunde
text.blocks.health = Lebenspunkte
text.blocks.inaccuracy = Ungenauigkeit
text.blocks.shots = Schüsse
text.blocks.shotssecond = Schüsse / Sekunde
text.blocks.fuel = Treibstoff
text.blocks.fuelduration = Treibstoffdauer
text.blocks.maxoutputsecond = Max Ausgabe / Sekunde
text.blocks.inputcapacity = Eingabekapazität
text.blocks.outputcapacity = Ausgabekapazität
text.blocks.poweritem = Energie / Gegenstand
text.placemode = Platzierungsmodus
text.breakmode = Zerstörungsmodus
text.health = Lebenspunkte
setting.difficulty.easy = Leicht
setting.difficulty.normal = Normal
setting.difficulty.hard = Schwer
setting.difficulty.insane = Unmöglich
setting.difficulty.purge = Auslöschung
setting.difficulty.name = Schwierigkeit
setting.screenshake.name = Bildschirm wackeln
setting.smoothcam.name = Glatte Kamera
setting.indicators.name = Feind Indikatoren
setting.effects.name = Effekte anzeigen
setting.sensitivity.name = Kontroller Empfindlichkeit
setting.saveinterval.name = Autosave Häufigkeit
setting.seconds = {0} Sekunden
setting.fps.name = Zeige FPS
setting.vsync.name = VSync
setting.lasers.name = Zeige Energielaser
setting.healthbars.name = Zeige Objekt Lebensbalken
setting.pixelate.name = Pixel Bildschirm
setting.musicvol.name = Musiklautstärke
setting.mutemusic.name = Musik stummschalten
setting.sfxvol.name = Audioeffekte Lautstärke
setting.mutesound.name = Audioeffekte stummschalten
map.maze.name = Labyrinth
map.fortress.name = Festung
map.sinkhole.name = Sinkloch
map.caves.name = Höhlen
map.volcano.name = Vulkan
map.caldera.name = Lavakessel
map.scorch.name = Flammen
map.desert.name = Wüste
map.island.name = Insel
map.grassland.name = Grasland
map.tundra.name = Kältesteppe
map.spiral.name = Spirale
map.tutorial.name = Tutorial
tutorial.intro.text = [gelb] Willkommen zum Tutorial [] Um zu beginnen, drücke 'weiter'.
tutorial.moveDesktop.text = Verwende zum Verschieben die Tasten [orange] [[WASD] []. Halte [orange] Shift [] gedrückt, um zu erhöhen. Halte [orange] CTRL/STRG [] gedrückt, während du das [orange] Scrollrad [] zum Vergrössern oder Verkleinern verwendest.
tutorial.shoot.text = Ziele mit der Maus, halte die [orange] linke Maustaste [] gedrückt, um zu schiessen. Versuche es mit dem [gelben] Ziel [].
tutorial.moveAndroid.text = Um die Ansicht zu verschieben, ziehe einen Finger über den Bildschirm. Drücke und ziehe, um zu vergrössern oder zu verkleinern.
tutorial.placeSelect.text = Versuche, ein [gelbes] Förderband [] aus dem Blockmenü unten rechts auszuwählen.
tutorial.placeConveyorDesktop.text = Verwende das [orange] [[scrollwheel] [], um das Förderband nach vorne zu bewegen [orange] vorwärts [], und platziere es dann an der [gelben] markierten Stelle [] mit [orange] [[linke Maustaste] [].
tutorial.placeConveyorAndroid.text = Verwende die [orange] [[rotieren-Taste] [], um das Förderband nach vorne [orange] zu drehen [], ziehe es mit einem Finger in Position und platziere es dann an der [gelben] markierten Stelle [] mit der [Orange] [[Häkchen][].
tutorial.placeConveyorAndroidInfo.text = Alternativ kannst du das Fadenkreuzsymbol unten links drücken, um zum [orange] [[touch mode] [] zu wechseln, und Blöcke durch Tippen auf den Bildschirm platzieren. Im Touch-Modus können Blöcke mit dem Pfeil unten links gedreht werden. Drücke [gelb] neben [], um es auszuprobieren.
tutorial.placeDrill.text = Wähle nun einen [gelben] Steinbohrer [] an der markierten Stelle aus und platziere ihn.
tutorial.blockInfo.text = Wenn du mehr über einen Block erfahren möchtest, tippe oben rechts auf das [orange] Fragezeichen [], um dessen Beschreibung zu lesen.
tutorial.deselectDesktop.text = Du kannst einen Block mit [Orange] [[Rechte Maustaste] [] abwählen.
tutorial.deselectAndroid.text = Du kannst einen Block abwählen, indem du die [orange] X [] -Taste drücken.
tutorial.drillPlaced.text = Der Bohrer erzeugt nun [gelben] Stein, [] gib den Stein nun auf das Förderband aus und bewege ihn dann in den [gelben] Kern [].
tutorial.drillInfo.text = Verschiedene Erze benötigen unterschiedliche Bohrer. Stein erfordert Steinbohrer, Eisen erfordert Eisenbohrer usw.
tutorial.drillPlaced2.text = Wenn du Gegenstände in den Kern verschiebst, steckst du sie in dein [gelbes] Inventar [] oben links. Das Platzieren von Blöcken verwendet Gegenstände aus deinem Inventar.
tutorial.moreDrills.text = Du kannst so viele Bohrer und Förderer miteinander verbinden wie du lust hast.
tutorial.deleteBlock.text = Du kannst Blöcke löschen, indem du mit der [orange] rechte Maustaste [] auf dem Block klickst, den du löschen möchtest. Versuche, dieses Förderband zu löschen.
tutorial.deleteBlockAndroid.text = Du kannst Blöcke löschen, indem du [orange] das Fadenkreuz [] im [orange] Pausenmodusmenü [] links unten auswählst und auf einen Block tippst. Versuche, dieses Fliessband zu löschen.
tutorial.placeTurret.text = Wähle nun einen [gelben] Turm [] an der [gelben] markierten Stelle [] und platziere ihn.
tutorial.placedTurretAmmo.text = Dieser Turm nimmt nun [gelbe] Munition [] vom Förderband an. Du kannst sehen, wie viel Munition es hat, indem du darüber schweben und den [grünen] grünen Balken [] prüfen.
tutorial.turretExplanation.text = Geschütze schiessen automatisch auf den nächsten Feind in Reichweite, solange sie genug Munition haben.
tutorial.waves.text = Jede [yellow] 60 [] Sekunden wird eine Welle von [coral] Feinden [] an einem bestimmten Orten erscheinen und versuchen, den Kern zu zerstören.
tutorial.coreDestruction.text = Dein Ziel ist es, den Kern [yellow] zu verteidigen. Wenn der Kern zerstört wird, verlierst du [coral] das Spiel [].
tutorial.pausingDesktop.text = Wenn du jemals eine Pause machen möchtest, drücke die [orange] Pause-Taste [] oben links oder [orange]space[], um das Spiel anzuhalten. Du kannst auch Blöcke immer noch auswählen und platzieren, während du das Spiel pausiert ist, aber Sie können sich nicht bewegen oder schiessen.
tutorial.pausingAndroid.text = Wenn du jemals eine Pause machen willst, drück einfach die [orange] Pause-Taste [] oben links, um das Spiel anzuhalten. Sie können immer noch Sachen auswählen und Blöcke während der Pause platzieren.
tutorial.purchaseWeapons.text = Du kannst neue [yellow] Waffen [] für deinen Mech kaufen, indem du das Verbesserungs-Menü unten links öffnest.
tutorial.switchWeapons.text = Schalte Waffen, indem du entweder auf das Symbol unten links klickst oder Nummern verwendest [orange] [[1-9] [].
tutorial.spawnWave.text = Hier kommt die erste Welle. Zerstöre sie.
tutorial.pumpDesc.text = In späteren Wellen müsst du möglicherweise [yellow] Pumpen [] verwenden, um Flüssigkeiten für Generatoren oder Extraktoren zu verteilen.
tutorial.pumpPlace.text = Pumpen arbeiten ähnlich wie Bohrer, ausser dass sie anstelle von Gegenständen Flüssigkeiten produzieren. Versuch mal, eine Pumpe auf das [yellow] gekennzeichnete Öl [] zu setzen.
tutorial.conduitUse.text = Stellen Sie nun eine [orange] Leitungsrohr [] von der Pumpe weg.
tutorial.conduitUse2.text = Und noch ein paar mehr ...
tutorial.conduitUse3.text = Und noch ein paar mehr ...
tutorial.generator.text = Stellen Sie nun einen [orange] Verbrennungsgenerator [] Block am Ende des Leitungsrohres auf.
tutorial.generatorExplain.text = Dieser Generator erzeugt nun [yellow] Energie [] aus dem Öl.
tutorial.lasers.text = Die Energie wird mit [yellow] Energielasern [] verteilt. Drehe und platziere einen hier.
tutorial.laserExplain.text = Der Generator wird nun Energie in den Laserblock bewegen. Ein [yellow] undurchsichtiger [] Strahl bedeutet, dass er gerade Leistung überträgt, und ein [yellow] transparenter [] Strahl bedeutet, dass dies nicht der Fall ist.
tutorial.laserMore.text = Du kannst überprüfen, wie viel Energie ein Block hat, indem du darüber schweben und den [yellow] gelben Balken [] oben prüfen.
tutorial.healingTurret.text = Dieser Laser kann verwendet werden, um einen [lime] -Reparaturgeschütz [] anzutreiben. Platziere einen hier.
tutorial.healingTurretExplain.text = Solange er Kraft hat, repariert dieser Turm in der Nähe Blöcke. [] Wenn du spielst, stelle sicher, dass du so schnell wie möglich einen in deiner Basis bekommst!
tutorial.smeltery.text = Viele Blöcke benötigen [orange] Stahl [], um eine [orange] Schmelzer [] herzustellen. Platziere einen hier.
tutorial.smelterySetup.text = Diese Schmelzer wird nun [orange] Stahl [] aus dem Eingangs-Eisen produzieren, wobei Kohle als Brennstoff verwendet wird.
tutorial.end.text = Und damit ist das Tutorial abgeschlossen! Viel Glück!
keybind.move_x.name = bewege_x
keybind.move_y.name = bewege_y
keybind.select.name = wählen
keybind.break.name = Unterbrechung
keybind.shoot.name = Schiess
keybind.zoom_hold.name = zoomen_halten
keybind.zoom.name = zoomen
keybind.menu.name = Menü
keybind.pause.name = Pause
keybind.dash.name = Bindestrich
keybind.rotate_alt.name = drehen_alt
keybind.rotate.name = Drehen
keybind.weapon_1.name = Waffe_1
keybind.weapon_2.name = Waffe_2
keybind.weapon_3.name = Waffe_3
keybind.weapon_4.name = Waffe_4
keybind.weapon_5.name = Waffe_5
keybind.weapon_6.name = Waffe_6
mode.waves.name = Wellen
mode.sandbox.name = Sandkasten
mode.freebuild.name = Freier Bau
upgrade.standard.name = Standard
upgrade.standard.description = Der Standardmech.
upgrade.blaster.name = Blaster
upgrade.blaster.description = Schiesst eine langsame, schwache Kugel.
upgrade.triblaster.name = Dreifach-Blaster
upgrade.triblaster.description = Schiesst 3 Kugeln in einer Ausbreitung.
upgrade.clustergun.name = Klumpen-Waffe
upgrade.clustergun.description = Schiesst eine ungenaue Verbreitung von explosiven Granaten.
upgrade.beam.name = Strahlkanone
upgrade.beam.description = Schiesst einen weitreichenden durchdringenden Laserstrahl.
upgrade.vulcan.name = Vulkan
upgrade.vulcan.description = Schiesst eine Flut von schnellen Kugeln.
upgrade.shockgun.name = Schock-Waffe
upgrade.shockgun.description = Erschiesst eine verheerende Explosion von geladenen Granatsplittern.
item.stone.name = Stein
item.iron.name = Eisen
item.coal.name = Kohle
item.steel.name = Stahl
item.titanium.name = Titan
item.dirium.name = Dirium
item.thorium.name = Uran
item.sand.name = Sand
liquid.water.name = Wasser
liquid.plasma.name = Plasma
liquid.lava.name = Lava
liquid.oil.name = Öl
block.weaponfactory.name = Waffenfabrik
block.air.name = Luft
block.blockpart.name = Blockteil
block.deepwater.name = tiefes Wasser
block.water.name = Wasser
block.lava.name = Lava
block.oil.name = Öl
block.stone.name = Stein
block.blackstone.name = schwarzer Stein
block.iron.name = Eisen
block.coal.name = Kohle
block.titanium.name = Titan
block.thorium.name = Uran
block.dirt.name = Erde
block.sand.name = Sand
block.ice.name = Eis
block.snow.name = Schnee
block.grass.name = Gras
block.sandblock.name = Sandstein
block.snowblock.name = Schneeblock
block.stoneblock.name = Steinblock
block.blackstoneblock.name = Schwarzer Stein
block.grassblock.name = Grasblock
block.mossblock.name = Moosblock
block.shrub.name = Busch
block.rock.name = Felsen
block.icerock.name = Eisfelsen
block.blackrock.name = Schwarzer Felsen
block.dirtblock.name = Erdblock
block.stonewall.name = Steinwand
block.stonewall.fulldescription = Ein billiger Verteidigungsblock. Nützlich zum Schutz des Kerns und der Geschütztürme in den ersten Wellen.
block.ironwall.name = Eisenwand
block.ironwall.fulldescription = Ein grundlegender Verteidigungsblock. Bietet Schutz vor Feinden.
block.steelwall.name = Stahlwand
block.steelwall.fulldescription = Ein Standard-Verteidigungsblock. Bietet angemessen Schutz vor Feinden.
block.titaniumwall.name = Titanwand
block.titaniumwall.fulldescription = Eine starke Abwehrblockade. Bietet Schutz vor Feinden.
block.duriumwall.name = Diriumwand
block.duriumwall.fulldescription = Eine sehr starke Abwehrblockade. Bietet guten Schutz vor Feinden.
block.compositewall.name = Verbundende Wand
block.steelwall-large.name = grosse Stahlwand
block.steelwall-large.fulldescription = Ein Standard-Verteidigungsblock. Mehrere Blöcke gross.
block.titaniumwall-large.name = grosse Titanwand
block.titaniumwall-large.fulldescription = Eine starke Abwehrblockade. Mehrere Blöcke gross.
block.duriumwall-large.name = grosse Diriumwand
block.duriumwall-large.fulldescription = Eine sehr starke Abwehrblockade. Mehrere Blöcke gross.
block.titaniumshieldwall.name = geschützte Wand
block.titaniumshieldwall.fulldescription = Ein starker Abwehrblock mit einem extra eingebauten Schild. Benötigt Energie. Verwendet Energie, um feindliche Kugeln zu absorbieren. Es wird empfohlen, Verstärker zu verwenden, um diesem Block Energie zuzuführen.
block.repairturret.name = Reparaturgeschütz
block.repairturret.fulldescription = Repariert beschädigte Blöcke in der Nähe in einem langsamen Tempo. Nutzt geringe Mengen an Energie.
block.megarepairturret.name = Reparaturgeschütz II
block.megarepairturret.fulldescription = Repariert in der Nähe beschädigte Blöcke in Reichweite zu einem vernünftigen Preis. Verwendet Energie.
block.shieldgenerator.name = Schildgenerator
block.shieldgenerator.fulldescription = Ein fortgeschrittener Verteidigungsblock. Schützt alle Blöcke in einem Radius vor Angriffen. Bei keinem Betrieb langsamer Strom verbrauch, verliert bei Kugelkontakt jedoch schnell Energie.
block.door.name = Tür
block.door.fulldescription = Ein Block, der durch Antippen geöffnet und geschlossen werden kann.
block.door-large.name = grosse Tür
block.door-large.fulldescription = Ein Block der mehrere Felder gross ist und der durch Antippen geöffnet und geschlossen werden kann.
block.conduit.name = Leitungsrohr
block.conduit.fulldescription = Grundlegender Flüssigkeitstransportblock. Funktioniert wie ein Förderband, aber mit Flüssigkeiten. Am besten mit Pumpen oder anderen Leitungen verwenden. Kann als Brücke für Gegner und Spieler verwendet werden.
block.pulseconduit.name = Pulsleitungsrohr
block.pulseconduit.fulldescription = Fortschrittlicher Flüssigkeitstransportblock. Transportiert Flüssigkeiten schneller und speichert mehr als normale Leitungsrohre.
block.liquidrouter.name = flüssigkeiten verteiler
block.liquidrouter.fulldescription = Funktioniert ähnlich wie ein Router. Akzeptiert Flüssigkeit von einer Seite und gibt sie auf die anderen Seiten aus. Nützlich zum Aufspalten von Flüssigkeit aus eines einzelnen Leitungsrohres in mehrere andere Leitungensrohre.
block.conveyor.name = Förderband
block.conveyor.fulldescription = Grundelement Transport Block. Bewegt Gegenstände nach vorne und legt sie automatisch in Türmen oder ähnliches. Drehbar. Kann als Brücke für Gegner und Spieler verwendet werden.
block.steelconveyor.name = Stahlförderband
block.steelconveyor.fulldescription = Erweiterter Transportblock Bewegt Gegenstände schneller als Standardförderer.
block.poweredconveyor.name = Impulsförderband
block.poweredconveyor.fulldescription = Der ultimative Transportblock für Gegenstände. Bewegt Gegenstände noch schneller als Stahlförderer.
block.router.name = Verteiler
block.router.fulldescription = Akzeptiert Objekte aus einer Richtung und gibt sie in 3 andere Richtungen aus. Kann auch eine bestimmte Anzahl von Gegenständen speichern. Geeignet zum Aufteilen der Materialien von einem Bohrer in mehrere Geschütze.
block.junction.name = Kreuzung
block.junction.fulldescription = Fungiert als Brücke für zwei kreuzende Förderbänder. Nützlich in Situationen mit zwei verschiedenen Förderbänder, die unterschiedliche Materialien zu verschiedenen Orten transportieren.
block.conveyortunnel.name = Förderbandtunnel
block.conveyortunnel.fulldescription = Transportiert Artikel unter Blöcken. Verwendung für einen Tunnel, der in den zu untertunnelnden Block führt, und einen auf der anderen Seite. Stellen Sie sicher, dass beide Tunnel in entgegengesetzte Richtungen weisen, das heisst das die Tunnel voneinander weggucken.
block.liquidjunction.name = flüssigkeite Kreuzung
block.liquidjunction.fulldescription = Funktioniert als Brücke für zwei kreuzende Leitungsrohre. Nützlich in Situationen mit zwei verschiedenen Leitungen, die unterschiedliche Flüssigkeiten zu verschiedenen Orten transportieren.
block.liquiditemjunction.name = Flüssigkeit-Gegenstand-Kreuzung
block.liquiditemjunction.fulldescription = Fungiert als Brücke zum Überqueren von Leitungsrohre und Förderbändern.
block.powerbooster.name = Energieverstärker
block.powerbooster.fulldescription = Verteilt die Energie an alle Blöcke innerhalb seines Radius.
block.powerlaser.name = Energielaser
block.powerlaser.fulldescription = Erzeugt einen Laser, der die Kraft auf den Block davor überträgt. Erzeugt selbst keine Energie. Am besten mit Generatoren oder anderen Lasern verwendet.
block.powerlaserrouter.name = Laser Verteiler
block.powerlaserrouter.fulldescription = Laser, der die Kraft in drei Richtungen gleichzeitig verteilt. Nützlich in Situationen, in denen mehrere Blöcke von einem Generator mit Strom versorgt werden müssen.
block.powerlasercorner.name = Laser-Ecke
block.powerlasercorner.fulldescription = Laser, der die Kraft in zwei Richtungen gleichzeitig verteilt. Nützlich in Situationen, in denen mehrere Blöcke von einem Generator mit Strom versorgt werden müssen und ein Router ungenau ist.
block.teleporter.name = Teleporter
block.teleporter.fulldescription = Erweiterter Transportblock Teleporter geben Gegenstände in andere Teleporter derselben Farbe ein. Tut nichts, wenn keine Teleporter derselben Farbe existieren. Wenn mehrere Teleporter mit derselben Farbe existieren, wird eine zufällige ausgewählt. Verwendet Energie. Tippen, um die Farbe zu ändern.
block.sorter.name = Sortierer
block.sorter.fulldescription = Sortiert den Gegenstand nach Materialart. Das zu akzeptierende Material wird durch die Farbe im Block angezeigt. Alle Artikel, die dem Sortiermaterial entsprechen, werden vorwärts ausgegeben, alles andere wird nach links und rechts ausgegeben.
block.core.name = Kern
block.pump.name = Pumpe
block.pump.fulldescription = Pumpen Flüssigkeiten aus einem Quellblock - meist Wasser, Lava oder Öl. Gibt Flüssigkeit in benachbarte Leitungsrohre aus.
block.fluxpump.name = flux Pumpe
block.fluxpump.fulldescription = Eine erweiterte Version der Pumpe. Speichert mehr Flüssigkeit und pumpt Flüssigkeit schneller.
block.smelter.name = Schmelzer
block.smelter.fulldescription = Der essentielle Bastelblock. Wenn 1x Eisen und 1x Kohle eingegeben wird, wird 1x Stahl ausgegeben.
block.crucible.name = Tiegel
block.crucible.fulldescription = Ein fortgeschrittener Handwerksblock. Braucht Kohle um zu funktionieren. Wenn 1x Titan und 1x Stahl eingegeben wird, wird 1x Dirium ausgegeben.
block.coalpurifier.name = Kohle-Extraktor
block.coalpurifier.fulldescription = Ein einfacher Extraktorblock. Gibt Kohle aus, wenn der Block mit grossen Mengen Wasser und Stein gefüllt wird.
block.titaniumpurifier.name = Titan-Extraktor
block.titaniumpurifier.fulldescription = Ein Standard-Extraktorblock. Gibt Titan aus wenn er mit grossen Mengen Wasser und Eisen gefüllt wird.
block.oilrefinery.name = Ölraffinerie
block.oilrefinery.fulldescription = Veredelt grosse Mengen Öl zu Kohle. Nützlich für die Betankung von Blöcken die Kohle benutzen wie z.b. Waffentürme, wenn Kohleadern knapp sind.
block.stoneformer.name = Steinformer
block.stoneformer.fulldescription = Verfestigt flüssige Lava zu Stein. Nützlich für die Herstellung von grossen Mengen von Stein für Kohle-Extraktor.
block.lavasmelter.name = Lava-Schmelzer
block.lavasmelter.fulldescription = Verwendet Lava, um Eisen zu Stahl schmelzen. Eine Alternative zum Schmelzer. Nützlich in Situationen, in denen Kohle knapp ist.
block.stonedrill.name = Steinbohrer
block.stonedrill.fulldescription = Der wesentliche Bohrer. Wenn er auf Steinplatten gelegt wird, gibt er Steine mit einer langsamen Geschwindigkeit auf endlosen Zeit aus.
block.irondrill.name = Eisenbohrer
block.irondrill.fulldescription = Eine grundlegender Bohrer. Wenn es auf Eisenerz gelegt wird, gibt er Eisen auf endloser Zeit langsam aus.
block.coaldrill.name = Kohlenbohrer
block.coaldrill.fulldescription = Eine grundlegender Bohrer. Wenn es auf Kohleerz platziert wird, gibt er für endloser Zeit langsam Kohle aus.
block.thoriumdrill.name = Uran-Bohrer
block.thoriumdrill.fulldescription = Ein fortgeschrittener Bohrer. Wenn es auf Uranerz platziert wird, gibt er Uran mit einer langsamen Geschwindigkeit auf endloser Zeit ab.
block.titaniumdrill.name = Titan-Bohrer
block.titaniumdrill.fulldescription = Ein fortgeschrittener Bohrer. Wenn es auf Titanerz platziert wird, gibt er Titan langsam aus für undendlich langer Zeit
block.omnidrill.name = Omni-Bohrer
block.omnidrill.fulldescription = Der ultimative Bohrer. Baut in schnellem Tempo jegliches Erz ab.
block.coalgenerator.name = Kohle-Generator
block.coalgenerator.fulldescription = Der wesentliche Generator. Erzeugt Energie aus Kohle. Gibt Energie als Laser an seine 4 Seiten aus.
block.thermalgenerator.name = thermischer Generator
block.thermalgenerator.fulldescription = Erzeugt Energie aus Lava. Gibt Energie als Laser an seine 4 Seiten aus.
block.combustiongenerator.name = Verbrennungsgenerator
block.combustiongenerator.fulldescription = Erzeugt Energie aus Öl. Gibt Energie als Laser an seine 4 Seiten aus.
block.rtgenerator.name = RTG-Generator
block.rtgenerator.fulldescription = Erzeugt geringe Mengen an Energie aus dem radioaktiven Zerfall von Uran. Gibt Energie als Laser an seine 4 Seiten aus.
block.nuclearreactor.name = Kernreaktor
block.nuclearreactor.fulldescription = Eine erweiterte Version des RTG-Generators und der ultimative Energie Generator. Erzeugt Strom aus Uran. Erfordert konstante Wasserkühlung. Sehr heiss; explodiert heftig, wenn zu wenig Kühlmittel zugeführt wird.
block.turret.name = Geschütz
block.turret.fulldescription = Ein einfacher, billiger Turm. Verwendet Stein für Munition. Hat etwas mehr Reichweite als das Doppelgeschütz.
block.doubleturret.name = Doppelgeschütz
block.doubleturret.fulldescription = Eine etwas stärkere Version des Geschützes. Verwendet Stein für Munition. Hat deutlich mehr Schaden, hat aber eine geringere Reichweite. Schiesst zwei Kugeln.
block.machineturret.name = Gatling Geschütz
block.machineturret.fulldescription = Ein Standard-Allround-Turm. Verwendet Eisen für Munition. Hat eine schnelle Feuerrate mit gutem Schaden.
block.shotgunturret.name = Splittergeschütz
block.shotgunturret.fulldescription = Ein Standard-Turm. Verwendet Eisen für Munition. Schiesst 7 Kugeln auf einmal. Geringere Reichweite, aber höhere Schadensleistung als das Gatling Geschütz
block.flameturret.name = Flammenwerfer
block.flameturret.fulldescription = Fortschrittlicher Nahbereichswaffe. Verwendet Kohle für Munition. Hat eine sehr geringe Reichweite, aber sehr hohen Schaden. Gut für Nahkampf. Empfohlen für den Einsatz hinter Mauern.
block.sniperturret.name = Schienenkanone
block.sniperturret.fulldescription = Fortschrittliches Reichweitengeschütz. Verwendet Stahl für Munition. Sehr hoher Schaden, aber niedrige Feuerrate. Teuer zu verwenden, kann aber aufgrund seiner Reichweite weit entfernt von den feindlichen Linien platziert werden.
block.mortarturret.name = Flakgeschütz
block.mortarturret.fulldescription = Fortschrittlicher Flächen-Schaden Turm. Verwendet Kohle für Munition. Sehr langsame Feuerrate und Geschosse, aber sehr hoher Einzelziel- und Flächenschaden. Nützlich gegen grosse Mengen von Feinden.
block.laserturret.name = Laserturm
block.laserturret.fulldescription = Fortschrittlicher Einzelziel-Turm. Verwendet Strom. Guter Allround-Revolver für mittlere Reichweiten. Nur Einzelziel. Verfehlt nie.
block.waveturret.name = Teslakanone
block.waveturret.fulldescription = Erweiterter Mehrfach-Ziele-Turm. Verwendet Strom. Mittlere Reichweite. Verfehlt nie. Im Durchschnitt zu wenig Schaden, aber kann mehrere Feinde gleichzeitig mit Kettenblitz treffen.
block.plasmaturret.name = Plasmageschütz
block.plasmaturret.fulldescription = Hochentwickelte Version des Flammenwerfers. Verwendet Kohle als Munition. Sehr hoher Schaden, niedriger bis mittlerer Reichweite.
block.chainturret.name = Kettengeschütz
block.chainturret.fulldescription = Die ultimative Schnellfeuer Waffe. Verwendet Uran als Munition. Schiesst grosse Kugeln mit hoher Feuerrate. Mittlere Reichweite. Mehrere Felder gross. Hält extrem viel aus.
block.titancannon.name = Titan Kanone
block.titancannon.fulldescription = Die ultimative Langstrecken Kanone. Verwendet Uran als Munition. Schiesst grosse Flächen-Schadenden-Granaten mit einer mittleren Feuerrate ab. Lange Reichweite. Ist mehrere Felder gross. Hält extrem viel aus.
block.playerspawn.name = Spielerspawn
block.enemyspawn.name = Gegnerspawn
text.about=Erstellt von [ROYAL] Anuken. [] \nUrsprünglich ein Eintrag im [orange] GDL [] MM Jam.\n\nCredits: \n- SFX gemacht mit [yellow] bfxr [] - Musik gemacht von [green] RoccoW [] / gefunden auf [lime] FreeMusicArchive.org [] \n\nBesonderer Dank geht an: \n- [coral] MitchellFJN []: Umfangreicher Spieletest und Feedback \n- [sky] Luxray5474 []: Wiki-Arbeit, Code-Beiträge \n- Alle Beta-Tester auf itch.io und Google Play\n
text.discord=Trete dem Mindustry Discord bei!
text.gameover=Der Kern wurde zerstört.
text.highscore=[YELLOW] Neuer Highscore!
text.lasted=Du hast bis zur folgenden Welle überlebt
text.level.highscore=High Score: [accent] {0}
text.level.delete.title=Löschen bestätigen
text.level.select=Level Auswahl
text.level.mode=Spielmodus:
text.savegame=Spiel speichern
text.loadgame=Spiel laden
text.joingame=Spiel beitreten
text.quit=Verlassen
text.about.button=Info
text.name=Name:
text.players={0} Spieler online
text.players.single={0} Spieler online
text.server.mismatch=Paketfehler: Mögliche Client / Server-Version stimmt nicht überein. Stell sicher, dass du und der Host die neueste Version von Mindustry haben!
text.server.kicked.kick=Du wurdest vom Server gekickt!
text.server.kicked.invalidPassword=Falsches Passwort.
text.server.connected={0} ist beigetreten
text.server.disconnected={0} hat die Verbindung getrennt.
text.nohost=Server kann nicht auf einer benutzerdefinierten Karte gehostet werden!
text.hostserver=Server hosten
text.host=Host
text.hosting=[accent] Server wird geöffnet...
text.hosts.refresh=Aktualisieren
text.hosts.discovering=Suche nach LAN-Spielen
text.server.refreshing=Server wird aktualisiert
text.hosts.none=[lightgray] Keine LAN Spiele gefunden!
text.host.invalid=[scarlet] Kann keine Verbindung zum Host herstellen.
text.server.add=Server hinzufügen
text.server.delete=Bist du dir sicher das du diesen Server löschen möchtest?
text.server.hostname=Host: {0}
text.server.edit=Server bearbeiten
text.joingame.title=Spiel beitreten
text.joingame.ip=IP:
text.disconnect=Verbindung unterbrochen.
text.connecting=[accent] Verbindet...
text.connecting.data=[accent] Weltdaten werden geladen...
text.connectfail=[crimson] Verbindung zum Server konnte nicht hergestellt werden: [orange]{0}
text.server.port=Port:
text.server.invalidport=Falscher Port!
text.server.error=[crimson] Fehler beim Hosten des Servers: [orange] {0}
text.save.new=Neuer Spielstand
text.save.overwrite=Möchten du diesen Spielstand wirklich überschreiben?
text.overwrite=Überschreiben
text.save.none=Keine Spielstände gefunden!
text.saveload=[accent] Speichern ...
text.savefail=Fehler beim Speichern des Spiels!
text.save.delete.confirm=Möchtest du diesen Spielstand wirklich löschen?
text.save.delete=Löschen
text.save.export=Spielstand exportieren
text.save.import.invalid=[orange] Dieser Spielstand ist ungültig!
text.save.import.fail=[crimson] Spielstand konnte nicht importiert werden: [orange] {0}
text.save.export.fail=[crimson] Spielstand konnte nicht exportiert werden: [orange] {0}
text.save.import=Spielstand importieren
text.save.newslot=Name speichern:
text.save.rename=Umbenennen
text.save.rename.text=Neuer Name
text.selectslot=Wähle einen Spielstand
text.slot=[accent] Platz {0}
text.save.corrupted=[orange] Datei beschädigt oder ungültig!
text.empty=<leer>
text.on=An
text.off=Aus
text.save.autosave=Automatisches Speichern: {0}
text.save.map=Karte: {0}
text.save.wave=Welle: {0}
text.save.date=Zuletzt gespeichert: {0}
text.confirm=Bestätigen
text.delete=Löschen
text.ok=OK
text.open=Öffnen
text.cancel=Abbruch
text.openlink=Link öffnen
text.back=Zurück
text.quit.confirm=Willst du wirklich aufhören?
text.loading=[accent] Wird geladen ...
text.wave=[orange] Welle {0}
text.wave.waiting=Welle in {0}
text.waiting=Warten...
text.enemies={0} Feinde
text.enemies.single={0} Feind
text.loadimage=Bild laden
text.saveimage=Bild speichern
text.editor.badsize=[orange]Ungültige Bildabmessungen! [] Gültige Kartenabmessungen: {0}
text.editor.errorimageload=Fehler beim Laden des Bildes: [orange] {0}
text.editor.errorimagesave=Fehler beim Speichern des Bildes: [orange] {0}
text.editor.generate=Generieren
text.editor.resize=Grösse\nanpassen
text.editor.loadmap=Karte\nladen
text.editor.savemap=Karte\nspeichern
text.editor.loadimage=Bild\nladen
text.editor.saveimage=Bild\nspeichern
text.editor.unsaved=[crimson] Du hast Änderungen nicht gespeichert [] Möchtest du wirklich aufhören?
text.editor.resizemap=Grösse der Karte ändern
text.editor.mapname=Map Name
text.editor.overwrite=[accent] Warnung! Dies überschreibt eine vorhandene Map.
text.editor.selectmap=Wähle eine Map zum Laden:
text.width=Breite:
text.height=Höhe:
text.menu=Menü
text.play=Spielen
text.load=Laden
text.save=Speichern
text.settings=Einstellungen
text.tutorial=Tutorial
text.editor=Bearbeiter
text.mapeditor=Karten Bearbeiter
text.donate=Spenden
text.settings.reset=Auf Standard zurücksetzen
text.settings.controls=Steuerung
text.settings.game=Spiel
text.settings.sound=Audio
text.settings.graphics=Grafiken
text.upgrades=Verbesserungen
text.purchased=[LIME] Erstellt!
text.weapons=Waffen
text.paused=Pausiert
text.error.title=[crimson] Ein Fehler ist aufgetreten
text.error.crashtitle=EIn Fehler ist aufgetreten!
text.blocks.blockinfo=Blockinfo:
text.blocks.powercapacity=Energiekapazität
text.blocks.powershot=Energie / Schuss
text.blocks.size=Grösse
text.blocks.liquidcapacity=Flüssigkeitskapazität
text.blocks.maxitemssecond=Max Gegenstände / Sekunde
text.blocks.powerrange=Energiereichweite
text.blocks.itemcapacity=Gegenstand Kapazität
text.blocks.inputliquid=Flüssigkeiten Eingabe
text.blocks.inputitem=Eingabe Gegenstand
text.blocks.explosive=Hochexplosiv!
text.blocks.health=Lebenspunkte
text.blocks.inaccuracy=Ungenauigkeit
text.blocks.shots=Schüsse
text.blocks.inputcapacity=Eingabekapazität
text.blocks.outputcapacity=Ausgabekapazität
setting.difficulty.easy=Leicht
setting.difficulty.normal=Normal
setting.difficulty.hard=Schwer
setting.difficulty.insane=Unmöglich
setting.difficulty.purge=Auslöschung
setting.difficulty.name=Schwierigkeit
setting.screenshake.name=Bildschirm wackeln
setting.indicators.name=Feind Indikatoren
setting.effects.name=Effekte anzeigen
setting.sensitivity.name=Kontroller Empfindlichkeit
setting.saveinterval.name=Autosave Häufigkeit
setting.seconds={0} Sekunden
setting.fps.name=Zeige FPS
setting.vsync.name=VSync
setting.lasers.name=Zeige Energielaser
setting.healthbars.name=Zeige Objekt Lebensbalken
setting.musicvol.name=Musiklautstärke
setting.mutemusic.name=Musik stummschalten
setting.sfxvol.name=Audioeffekte Lautstärke
setting.mutesound.name=Audioeffekte stummschalten
map.maze.name=Labyrinth
map.fortress.name=Festung
map.sinkhole.name=Sinkloch
map.caves.name=Höhlen
map.volcano.name=Vulkan
map.caldera.name=Lavakessel
map.scorch.name=Flammen
map.desert.name=Wüste
map.island.name=Insel
map.grassland.name=Grasland
map.tundra.name=Kältesteppe
map.spiral.name=Spirale
map.tutorial.name=Tutorial
keybind.move_x.name=bewege_x
keybind.move_y.name=bewege_y
keybind.select.name=wählen
keybind.break.name=Unterbrechung
keybind.shoot.name=Schiess
keybind.zoom_hold.name=zoomen_halten
keybind.zoom.name=zoomen
keybind.menu.name=Menü
keybind.pause.name=Pause
keybind.dash.name=Bindestrich
keybind.rotate_alt.name=drehen_alt
keybind.rotate.name=Drehen
mode.waves.name=Wellen
mode.sandbox.name=Sandkasten
mode.freebuild.name=Freier Bau
item.stone.name=Stein
item.coal.name=Kohle
item.titanium.name=Titan
item.thorium.name=Uran
item.sand.name=Sand
liquid.water.name=Wasser
liquid.lava.name=Lava
liquid.oil.name=Öl
block.door.name=Tür
block.door-large.name=grosse Tür
block.conduit.name=Leitungsrohr
block.pulseconduit.name=Pulsleitungsrohr
block.liquidrouter.name=flüssigkeiten verteiler
block.conveyor.name=Förderband
block.router.name=Verteiler
block.junction.name=Kreuzung
block.liquidjunction.name=flüssigkeite Kreuzung
block.sorter.name=Sortierer
block.smelter.name=Schmelzer
text.credits=Credits
text.link.discord.description=the official Mindustry discord chatroom
text.link.github.description=Game source code
text.link.dev-builds.description=Unstable development builds
text.link.trello.description=Official trello board for planned features
text.link.itch.io.description=itch.io page with PC downloads and web version
text.link.google-play.description=Google Play store listing
text.link.wiki.description=official Mindustry wiki
text.linkfail=Failed to open link!\nThe URL has been copied to your cliboard.
text.editor.web=The web version does not support the editor!\nDownload the game to use it.
text.web.unsupported=The web version does not support this feature! Download the game to use it.
text.multiplayer.web=This version of the game does not support multiplayer!\nTo play multiplayer from your browser, use the "multiplayer web version" link at the itch.io page.
text.host.web=The web version does not support hosting games! Download the game to use this feature.
text.map.delete=Are you sure you want to delete the map "[orange]{0}[]"?
text.construction.title=Block Construction Guide
text.construction=You've just selected [accent]block construction mode[].\n\nTo begin placing, simply tap a valid location near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Shift the selection[] by holding and dragging any block in the selection.\n- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel construction or selection[] by pressing the X at the bottom left.
text.deconstruction.title=Block Deconstruction Guide
text.deconstruction=You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left.
text.showagain=Don't show again next session
text.unlocks=Unlocks
text.addplayers=Add/Remove Players
text.newgame=New Game
text.maps=Maps
text.maps.none=[LIGHT_GRAY]No maps found!
text.unlocked=New Block Unlocked!
text.unlocked.plural=New Blocks Unlocked!
text.server.closing=[accent]Closing server...
text.server.kicked.fastShoot=You are shooting too quickly.
text.server.kicked.clientOutdated=Outdated client! Update your game!
text.server.kicked.serverOutdated=Outdated server! Ask the host to update!
text.server.kicked.banned=You are banned on this server.
text.server.kicked.recentKick=You have been kicked recently.\nWait before connecting again.
text.server.kicked.nameInUse=There is someone with that name\nalready on this server.
text.server.kicked.nameEmpty=Your name must contain at least one character or number.
text.server.kicked.idInUse=You are already on this server! Connecting with two accounts is not permitted.
text.server.kicked.customClient=This server does not support custom builds. Download an official version.
text.host.info=The [accent]host[] button hosts a server on ports [scarlet]6567[] and [scarlet]6568.[]\nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings.
text.join.info=Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[LIGHT_GRAY]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
text.server.friendlyfire=Friendly Fire
text.trace=Trace Player
text.trace.playername=Player name: [accent]{0}
text.trace.ip=IP: [accent]{0}
text.trace.id=Unique ID: [accent]{0}
text.trace.android=Android Client: [accent]{0}
text.trace.modclient=Custom Client: [accent]{0}
text.trace.totalblocksbroken=Total blocks broken: [accent]{0}
text.trace.structureblocksbroken=Structure blocks broken: [accent]{0}
text.trace.lastblockbroken=Last block broken: [accent]{0}
text.trace.totalblocksplaced=Total blocks placed: [accent]{0}
text.trace.lastblockplaced=Last block placed: [accent]{0}
text.invalidid=Invalid client ID! Submit a bug report.
text.server.bans=Bans
text.server.bans.none=No banned players found!
text.server.admins=Admins
text.server.admins.none=No admins found!
text.server.outdated=[crimson]Outdated Server![]
text.server.outdated.client=[crimson]Outdated Client![]
text.server.version=[lightgray]Version: {0}
text.server.custombuild=[yellow]Custom Build
text.confirmban=Are you sure you want to ban this player?
text.confirmunban=Are you sure you want to unban this player?
text.confirmadmin=Are you sure you want to make this player an admin?
text.confirmunadmin=Are you sure you want to remove admin status from this player?
text.disconnect.data=Failed to load world data!
text.server.addressinuse=Address already in use!
text.save.difficulty=Difficulty: {0}
text.copylink=Copy Link
text.changelog.title=Changelog
text.changelog.loading=Getting changelog...
text.changelog.error.android=[orange]Note that the changelog sometimes does not work on Android 4.4 and below!\nThis is due to an internal Android bug.
text.changelog.error.ios=[orange]The changelog is currently not supported in iOS.
text.changelog.error=[scarlet]Error getting changelog!\nCheck your internet connection.
text.changelog.current=[yellow][[Current version]
text.changelog.latest=[orange][[Latest version]
text.saving=[accent]Saving...
text.unknown=Unknown
text.custom=Custom
text.builtin=Built-In
text.map.delete.confirm=Are you sure you want to delete this map? This action cannot be undone!
text.map.random=[accent]Random Map
text.map.nospawn=This map does not have any cores for the player to spawn in! Add a [ROYAL]blue[] core to this map in the editor.
text.editor.slope=\\
text.editor.openin=Open In Editor
text.editor.oregen=Ore Generation
text.editor.oregen.info=Ore Generation:
text.editor.mapinfo=Map Info
text.editor.author=Author:
text.editor.description=Description:
text.editor.name=Name:
text.editor.teams=Teams
text.editor.elevation=Elevation
text.editor.saved=Saved!
text.editor.save.noname=Your map does not have a name! Set one in the 'map info' menu.
text.editor.save.overwrite=Your map overwrites a built-in map! Pick a different name in the 'map info' menu.
text.editor.import.exists=[scarlet]Unable to import:[] a built-in map named '{0}' already exists!
text.editor.import=Import...
text.editor.importmap=Import Map
text.editor.importmap.description=Import an already existing map
text.editor.importfile=Import File
text.editor.importfile.description=Import an external map file
text.editor.importimage=Import Terrain Image
text.editor.importimage.description=Import an external map image file
text.editor.export=Export...
text.editor.exportfile=Export File
text.editor.exportfile.description=Export a map file
text.editor.exportimage=Export Terrain Image
text.editor.exportimage.description=Export a map image file
text.editor.overwrite.confirm=[scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
text.fps=FPS: {0}
text.tps=TPS: {0}
text.ping=Ping: {0}ms
text.language.restart=Please restart your game for the language settings to take effect.
text.settings.language=Language
text.settings.rebind=Rebind
text.yes=Yes
text.no=No
text.info.title=[accent]Info
text.blocks.targetsair=Targets Air
text.blocks.itemspeed=Units Moved
text.blocks.shootrange=Range
text.blocks.poweruse=Power Use
text.blocks.inputitemcapacity=Input Item Capacity
text.blocks.outputitemcapacity=Input Item Capacity
text.blocks.maxpowergeneration=Max Power Generation
text.blocks.powertransferspeed=Power Transfer
text.blocks.craftspeed=Production Speed
text.blocks.inputliquidaux=Aux Liquid
text.blocks.inputitems=Input Items
text.blocks.outputitem=Output Item
text.blocks.drilltier=Drillables
text.blocks.drillspeed=Base Drill Speed
text.blocks.liquidoutput=Liquid Output
text.blocks.liquiduse=Liquid Use
text.blocks.coolant=Coolant
text.blocks.coolantuse=Coolant Use
text.blocks.inputliquidfuel=Fuel Liquid
text.blocks.liquidfueluse=Liquid Fuel Use
text.blocks.reload=Reload
text.blocks.inputfuel=Fuel
text.blocks.fuelburntime=Fuel Burn Time
text.unit.blocks=blocks
text.unit.powersecond=power units/second
text.unit.liquidsecond=liquid units/second
text.unit.itemssecond=items/second
text.unit.pixelssecond=pixels/second
text.unit.liquidunits=liquid units
text.unit.powerunits=power units
text.unit.degrees=degrees
text.unit.seconds=seconds
text.unit.none=
text.unit.items=items
text.category.general=General
text.category.power=Power
text.category.liquids=Liquids
text.category.items=Items
text.category.crafting=Crafting
text.category.shooting=Shooting
setting.fullscreen.name=Fullscreen
setting.multithread.name=Multithreading
setting.minimap.name=Show Minimap
text.keybind.title=Rebind Keys
keybind.block_info.name=block_info
keybind.chat.name=chat
keybind.player_list.name=player_list
keybind.console.name=console
mode.text.help.title=Description of modes
mode.waves.description=the normal mode. limited resources and automatic incoming waves.
mode.sandbox.description=infinite resources and no timer for waves.
mode.freebuild.description=limited resources and no timer for waves.
content.item.name=Items
content.liquid.name=Liquids
content.unit-type.name=Units
content.recipe.name=Blocks
item.stone.description=A common raw material. Used for separating and refining into other materials, or melting into lava.
item.tungsten.name=Tungsten
item.tungsten.description=A common, but very useful structure material. Used in drills and heat-resistant blocks such as generators and smelteries.
item.lead.name=Lead
item.lead.description=A basic starter material. Used extensively in electronics and liquid transportation blocks.
item.coal.description=A common and readily available fuel.
item.carbide.name=Carbide
item.carbide.description=A tough alloy made with tungsten and carbon. Used in advanced transportation blocks and high-tier drills.
item.titanium.description=A rare super-light metal used extensively in liquid transportation, drills and aircraft.
item.thorium.description=A dense, radioactive metal used as structural support and nuclear fuel.
item.silicon.name=Silicon
item.silcion.description=An extremely useful semiconductor, with applications in solar panels and many complex electronics.
item.plastanium.name=Plastanium
item.plastanium.description=A light, ductile material used in advanced aircraft and fragmentation ammunition.
item.phase-matter.name=Phase Matter
item.surge-alloy.name=Surge Alloy
item.biomatter.name=Biomatter
item.biomatter.description=A clump of organic mush; used for conversion into oil or as a basic fuel.
item.sand.description=A common material that is used extensively in smelting, both in alloying and as a flux.
item.blast-compound.name=Blast Compound
item.blast-compound.description=A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised.
item.pyratite.name=Pyratite
item.pyratite.description=An extremely flammable substance used in incendiary weapons.
liquid.cryofluid.name=Cryofluid
text.item.explosiveness=[LIGHT_GRAY]Explosiveness: {0}
text.item.flammability=[LIGHT_GRAY]Flammability: {0}
text.item.radioactivity=[LIGHT_GRAY]Radioactivity: {0}
text.item.fluxiness=[LIGHT_GRAY]Flux Power: {0}
text.item.hardness=[LIGHT_GRAY]Hardness: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]Heat Capacity: {0}
text.liquid.viscosity=[LIGHT_GRAY]Viscosity: {0}
text.liquid.temperature=[LIGHT_GRAY]Temperature: {0}
block.tungsten-wall.name=Tungsten Wall
block.tungsten-wall-large.name=Large Tungsten Wall
block.carbide-wall.name=Carbide Wall
block.carbide-wall-large.name=Large Carbide Wall
block.thorium-wall.name=Thorium Wall
block.thorium-wall-large.name=Large Thorium Wall
block.duo.name=Duo
block.scorch.name=Scorch
block.hail.name=Hail
block.lancer.name=Lancer
block.titanium-conveyor.name=Titanium Conveyor
block.splitter.name=Splitter
block.splitter.description=Outputs items into two opposite directions immediately after they are recieved.
block.router.description=Splits items into all 4 directions. Can store items as a buffer.
block.distributor.name=Distributor
block.distributor.description=A splitter that can split items into 8 directions.
block.sorter.description=Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right.
block.overflow-gate.name=Overflow Gate
block.overflow-gate.description=A combination splitter and router that only outputs to the left and right if the front path is blocked.
block.bridgeconveyor.name=Bridge Conveyor
block.bridgeconveyor.description=A conveyor that can go over other blocks, for up to two total blocks.
block.arc-smelter.name=Arc Smelter
block.silicon-smelter.name=Silicon Smelter
block.phase-weaver.name=Phase Weaver
block.pulverizer.name=Pulverizer
block.cryofluidmixer.name=Cryofluid Mixer
block.melter.name=Melter
block.incinerator.name=Incinerator
block.biomattercompressor.name=Biomatter Compressor
block.separator.name=Separator
block.centrifuge.name=Centrifuge
block.power-node.name=Power Node
block.power-node-large.name=Large Power Node
block.battery.name=Battery
block.battery-large.name=Large Battery
block.combustion-generator.name=Combustion Generator
block.turbine-generator.name=Turbine Generator
block.tungsten-drill.name=Tungsten Drill
block.carbide-drill.name=Carbide Drill
block.laser-drill.name=Laser Drill
block.water-extractor.name=Water Extractor
block.cultivator.name=Cultivator
block.dart-ship-factory.name=Dart Ship Factory
block.delta-mech-factory.name=Delta Mech Factory
block.dronefactory.name=Drone Factory
block.repairpoint.name=Repair Point
block.resupplypoint.name=Resupply Point
block.liquidtank.name=Liquid Tank
block.bridgeconduit.name=Bridge Conduit
block.mechanical-pump.name=Mechanical Pump
block.itemsource.name=Item Source
block.itemvoid.name=Item Void
block.liquidsource.name=Liquid Source
block.powervoid.name=Power Void
block.powerinfinite.name=Power Infinite
block.unloader.name=Unloader
block.sortedunloader.name=Sorted Unloader
block.vault.name=Vault
block.wave.name=Wave
block.swarmer.name=Swarmer
block.salvo.name=Salvo
block.ripple.name=Ripple
block.phase-conveyor.name=Phase Conveyor
block.bridge-conveyor.name=Bridge Conveyor
block.plastanium-compressor.name=Plastanium Compressor
block.pyratite-mixer.name=Pyratite Mixer
block.blast-mixer.name=Blast Mixer
block.solidifer.name=Solidifer
block.solar-panel.name=Solar Panel
block.solar-panel-large.name=Large Solar Panel
block.oil-extractor.name=Oil Extractor
block.javelin-ship-factory.name=Javelin Ship factory
block.drone-factory.name=Drone Factory
block.fabricator-factory.name=Fabricator Factory
block.repair-point.name=Repair Point
block.resupply-point.name=Resupply Point
block.pulse-conduit.name=Pulse Conduit
block.phase-conduit.name=Phase Conduit
block.liquid-router.name=Liquid Router
block.liquid-tank.name=Liquid Tank
block.liquid-junction.name=Liquid Junction
block.bridge-conduit.name=Bridge Conduit
block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,491 +1,495 @@
text.about = Dibuat oleh [ROYAL]Anuken.[]\nAwalnya masuk di [orange]GDL[] MM Jam.\n\nKredit:\n- SFX dibuat dengan [YELLOW]bfxr[]\n- Musik dibuat oleh [GREEN]RoccoW[] / ditemukan di [lime]FreeMusicArchive.org[]\n\nTerima kasih khusus kepada:\n- [coral]MitchellFJN[]: playtesting dan umpan balik yang luas\n- [sky]Luxray5474[]: pekerjaan wiki, kontribusi kode\n- Semua penguji beta di itch.io dan Google Play\n
text.discord = Bergabunglah dengan Discord Mindustry!
text.gameover = Intinya hancur.
text.highscore = [YELLOW]Rekor baru!
text.lasted = Anda bertahan sampai gelombang
text.level.highscore = Skor Tinggi: [accent]{0}
text.level.delete.title = Konfirmasi Hapus
text.level.delete = Yakin ingin menghapus peta \"[orange]{0}\"?
text.level.select = Pilih Level
text.level.mode = Modus permainan:
text.savegame = Simpan Permainan
text.loadgame = Lanjutkan
text.joingame = Bermain Bersama
text.quit = Keluar
text.about.button = Tentang
text.name = Nama:
text.public = Publik
text.players = {0} pemain online
text.server.player.host = {0} (host)
text.players.single = {0} pemain online
text.server.mismatch = Kesalahan paket: kemungkinan versi client / server tidak sesuai.\nPastikan Anda dan host memiliki versi terbaru Mindustry!
text.server.closing = [accent]Menutup server...
text.server.kicked.kick = Anda telah dikeluarkan dari server!
text.server.kicked.invalidPassword = Kata sandi salah!
text.server.kicked.clientOutdated = Client versi lama! Update game Anda!
text.server.kicked.serverOutdated = Server versi lama! Tanyakan host untuk mengupdate!
text.server.connected = {0} telah bergabung.
text.server.disconnected = {0} telah terputus.
text.nohost = Tidak dapat meng-host server pada peta khusus!
text.hostserver = Host Server
text.host = Host
text.hosting = [accent]Membuka server...
text.hosts.refresh = Segarkan
text.hosts.discovering = Mencari game LAN
text.server.refreshing = Menyegarkan server
text.hosts.none = [lightgray]Tidak ada game LAN yang ditemukan!
text.host.invalid = [scarlet]Tidak dapat terhubung ke host.
text.server.friendlyfire = Tembak Sesama
text.server.add = Tambahkan Server
text.server.delete = Yakin ingin menghapus server ini?
text.server.hostname = Host: {0}
text.server.edit = Sunting Server
text.joingame.byip = Bergabung dengan IP...
text.joingame.title = Bermain Bersama
text.joingame.ip = IP:
text.disconnect = Sambungan terputus.
text.connecting = [accent]Menghubungkan...
text.connecting.data = [accent]Memuat data level...
text.connectfail = [crimson]Gagal terhubung ke server: [orange]{0}
text.server.port = Port:
text.server.addressinuse = Alamat sudah di pakai!
text.server.invalidport = Nomor port salah!
text.server.error = [crimson]Kesalahan server hosting: [orange]{0}
text.tutorial.back = < Sebelumnya
text.tutorial.next = Berikutnya >
text.save.new = Simpan Baru
text.save.overwrite = Yakin ingin mengganti slot simpan ini?
text.overwrite = Ganti
text.save.none = Tidak ada simpanan ditemukan!
text.saveload = [accent]Menyimpan...
text.savefail = Gagal menyimpan game!
text.save.delete.confirm = Yakin ingin menghapus save ini?
text.save.delete = Hapus
text.save.export = Ekspor Simpanan
text.save.import.invalid = [orange]Simpanan ini tidak valid!
text.save.import.fail = [crimson]Gagal mengimpor: [orange]{0}
text.save.export.fail = [crimson]Gagal mengekspor save: [orange]{0}
text.save.import = Impor Simpanan
text.save.newslot = Nama simpanan:
text.save.rename = Ganti nama
text.save.rename.text = Nama baru:
text.selectslot = Pilih simpanan.
text.slot = [accent]Slot{0}
text.save.corrupted = [orange]Simpanan rusak atau tidak valid!
text.empty = <kosong>
text.on = Hidup
text.off = Mati
text.save.autosave = Simpan otomatis: {0}
text.save.map = Peta: {0}
text.save.wave = Gelombang {0}
text.save.date = Terakhir Disimpan: {0}
text.confirm = Konfirmasi
text.delete = Hapus
text.ok = OK
text.open = Buka
text.cancel = Batal
text.openlink = Buka tautan
text.back = Kembali
text.quit.confirm = Anda yakin ingin berhenti?
text.loading = [accent]Memuat...
text.wave = [orange]Gelombang {0}
text.wave.waiting = Gelombang dimulai {0}
text.waiting = Menunggu...
text.enemies = {0} musuh
text.enemies.single = {0} Musuh
text.loadimage = Buka Gambar
text.saveimage = Simpan Gambar
text.oregen = Generator Bijih
text.editor.badsize = [orange]Dimensi gambar tidak valid![]\nDimensi peta yang valid: {0}
text.editor.errorimageload = Kesalahan saat memuat file gambar:\n[orange]{0}
text.editor.errorimagesave = Kesalahan saat menyimpan file gambar:\n[orange]{0}
text.editor.generate = Hasilkan
text.editor.resize = Ubah ukuran
text.editor.loadmap = Buka Peta
text.editor.savemap = Simpan Peta
text.editor.loadimage = Buka Gambar
text.editor.saveimage = Simpan Gambar
text.editor.unsaved = [scarlet]Anda memiliki perubahan yang belum disimpan![]\nYakin ingin keluar?
text.editor.brushsize = Ukuran sikat: {0}
text.editor.noplayerspawn = Peta ini tidak memiliki spawnpoint pemain!
text.editor.manyplayerspawns = Peta tidak bisa memiliki lebih dari satu\nspawnpoint pemain!
text.editor.manyenemyspawns = Tidak dapat memiliki lebih dari\n{0} spawnpoint musuh!
text.editor.resizemap = Ubah ukuran peta
text.editor.resizebig = [scarlet]Peringatan!\n[]Peta yang lebih besar dari 256 unit mungkin nge-lag dan tidak stabil.
text.editor.mapname = Nama Peta:
text.editor.overwrite = [accent]Peringatan!\nIni akan mengganti peta yang ada.
text.editor.failoverwrite = [crimson]Tidak dapat mengganti peta default!
text.editor.selectmap = Pilih peta yang akan dimuat:
text.width = Lebar:
text.height = Tinggi:
text.randomize = Acak
text.apply = Terapkan
text.update = Perbarui
text.menu = Menu
text.play = Main
text.load = Buka
text.save = Simpan
text.language.restart = Silakan mulai ulang permainan Anda agar pengaturan bahasa mulai berlaku.
text.settings.language = Bahasa
text.settings = Pengaturan
text.tutorial = Tutorial
text.editor = Pengedit
text.mapeditor = Pengedit Peta
text.donate = Sumbangkan
text.settings.reset = Atur ulang ke Default
text.settings.controls = Kontrol
text.settings.game = Permainan
text.settings.sound = Suara
text.settings.graphics = Grafis
text.upgrades = Perbaruan
text.purchased = [LIME]Dibuat!
text.weapons = Senjata
text.paused = Jeda
text.respawn = Respawning dalam
text.info.title = [accent]Info
text.error.title = [crimson]Telah terjadi kesalahan
text.error.crashmessage = [SCARLET]Kesalahan tak terduga telah terjadi, yang menyebabkan kerusakan.\n[]Tolong laporkan keadaan yang tepat dimana kesalahan ini terjadi pada pengembang:\n[ORANGE] anukendev@gmail.com[]
text.error.crashtitle = Telah terjadi kesalahan
text.mode.break = Mode penghancur: {0}
text.mode.place = Mode penaruh: {0}
placemode.hold.name = garis
placemode.areadelete.name = area
placemode.touchdelete.name = sentuh
placemode.holddelete.name = tahan
placemode.none.name = tidak ada
placemode.touch.name = sentuh
placemode.cursor.name = kursor
text.blocks.extrainfo = [accent]info tambahan blok:
text.blocks.blockinfo = Info Blok
text.blocks.powercapacity = Kapasitas Tenaga
text.blocks.powershot = Tenaga/tembakan
text.blocks.powersecond = Tenaga/detik
text.blocks.powerdraindamage = Tenaga Dipakai/damage
text.blocks.shieldradius = Radius Perisai
text.blocks.itemspeedsecond = Kecepatan Barang/detik
text.blocks.range = Jangkauan
text.blocks.size = Ukuran
text.blocks.powerliquid = Tenaga/Cairan
text.blocks.maxliquidsecond = Batas cairan/detik
text.blocks.liquidcapacity = Kapasitas cairan
text.blocks.liquidsecond = Cairan/detik
text.blocks.damageshot = Damage/tembakan
text.blocks.ammocapacity = Kapasitas Amunisi
text.blocks.ammo = Amunisi
text.blocks.ammoitem = Amunisi/barang
text.blocks.maxitemssecond = Batas barang/detik
text.blocks.powerrange = Jangkauan tenaga
text.blocks.lasertilerange = Kotak jangkauan laser
text.blocks.capacity = Kapasitas
text.blocks.itemcapacity = Kapasitas Barang
text.blocks.maxpowergenerationsecond = Batas Penghasil Tenaga/detik
text.blocks.powergenerationsecond = Penghasil Tenaga/detik
text.blocks.generationsecondsitem = Waktu Penghasil (detik)/barang
text.blocks.input = Masukan
text.blocks.inputliquid = Cairan yang Masuk
text.blocks.inputitem = Barang yang Masuk
text.blocks.output = Keluar
text.blocks.secondsitem = Detik/barang
text.blocks.maxpowertransfersecond = Batas transfer tenaga/detik
text.blocks.explosive = Mudah meledak!
text.blocks.repairssecond = Perbaikan/detik
text.blocks.health = Darah
text.blocks.inaccuracy = Ketidaktelitian
text.blocks.shots = Tembakan
text.blocks.shotssecond = Tembakan/detik
text.blocks.fuel = Bahan Bakar
text.blocks.fuelduration = Durasi Bahan Bakar
text.blocks.maxoutputsecond = Batas keluar/detik
text.blocks.inputcapacity = Kapasitas masuk
text.blocks.outputcapacity = Kapasitas keluar
text.blocks.poweritem = Tenaga/barang
text.placemode = Mode Penempatan
text.breakmode = Mode Penghancur
text.health = darah
setting.difficulty.easy = mudah
setting.difficulty.normal = normal
setting.difficulty.hard = sulit
setting.difficulty.insane = sangat susah
setting.difficulty.purge = paling susah
setting.difficulty.name = Kesulitan:
setting.screenshake.name = Layar Bergoyang
setting.smoothcam.name = Kamera Halus
setting.indicators.name = Indikator Musuh
setting.effects.name = Efek Tampilan
setting.sensitivity.name = Sensitivitas Pengendali
setting.saveinterval.name = Waktu Simpan Otomatis
setting.seconds = {0} Detik
setting.fullscreen.name = Layar Penuh
setting.fps.name = Tunjukkan FPS
setting.vsync.name = VSync
setting.lasers.name = Tampilkan Laser Tenaga
setting.healthbars.name = Tampilkan Bar Darah Entitas
setting.pixelate.name = Layar Pixel
setting.musicvol.name = Volume Musik
setting.mutemusic.name = Bisukan Musik
setting.sfxvol.name = Volume Suara
setting.mutesound.name = Bisukan Suara
map.maze.name = labirin
map.fortress.name = benteng
map.sinkhole.name = lubang pembuangan
map.caves.name = gua
map.volcano.name = gunung berapi
map.caldera.name = kaldera
map.scorch.name = penghangusan
map.desert.name = gurun
map.island.name = pulau
map.grassland.name = padang rumput
map.tundra.name = tundra
map.spiral.name = spiral
map.tutorial.name = tutorial
tutorial.intro.text = [yellow]Selamat datang di tutorial.[] Untuk memulai, tekan 'berikutnya'.
tutorial.moveDesktop.text = Untuk bergerak, gunakan tombol [orange][[WASD][]. Tahan tombol [orange]shift[] untuk mempercepat. Tahan [orange]CTRL[] saat menggunakan [orange]scrollwheel[] untuk memperbesar atau memperkecil tampilan.
tutorial.shoot.text = Gunakan mouse anda untuk mengarahkan, tahan [orange]tombol kiri mouse[] untuk menembak. Cobalah menembaki [yellow]target[].
tutorial.moveAndroid.text = Untuk menggeser tampilan, seret satu jari ke layar. Jepit dan seret untuk memperbesar atau memperkecil tampilan.
tutorial.placeSelect.text = Coba pilih [yellow]konveyor[] dari menu blok di kanan bawah.
tutorial.placeConveyorDesktop.text = Gunakan [orange][[scrollwheel][] untuk memutar konveyor menghadap [orange]ke depan[], lalu letakkan di [yellow]lokasi yang ditandai[] menggunakan [orange][[tombol kiri mouse]][].
tutorial.placeConveyorAndroid.text = Gunakan [orange][[tombol putar]][] untuk memutar konveyor menghadap [orange]ke depan[], seret ke posisi dengan satu jari, lalu letakkan di [yellow]lokasi yang ditandai[] dengan menggunakan [orange][[tanda centang][].
tutorial.placeConveyorAndroidInfo.text = Sebagai alternatif, Anda dapat menekan ikon crosshair di kiri bawah untuk beralih ke [orange][[mode sentuh]][], dan letakkan blok dengan mengetuk layar. Dalam mode sentuh, blok bisa diputar dengan panah di kiri bawah. Tekan [yellow]berikutnya[] untuk mencobanya.
tutorial.placeDrill.text = Sekarang, pilih dan tempatkan [yellow]pertambangan battu[] di lokasi yang ditandai.
tutorial.blockInfo.text = Jika Anda ingin mempelajari lebih lanjut tentang blok, Anda dapat menekan [orange]tanda tanya[] di bagian kanan atas untuk membaca deskripsinya.
tutorial.deselectDesktop.text = Anda bisa membatalkan pemilihan blok menggunakan [orange][[tombol mouse kanan][].
tutorial.deselectAndroid.text = Anda dapat membatalkan pemilihan blok dengan menekan tombol [orange]X (silang)[].
tutorial.drillPlaced.text = Pertambangannya sekarang akan menghasilkan [yellow]batu[] yang dikeluarkan ke konveyor, lalu memindahkannya ke [yellow]intinya[].
tutorial.drillInfo.text = Bijih yang berbeda membutuhkan pertambangan yang berbeda. Batu membutuhkan pertambangan batu, besi membutuhkan pertambangan besi, dll.
tutorial.drillPlaced2.text = Memindahkan barang ke dalam inti menempatkannya di [yellow]inventaris barang[] Anda, di kiri atas. Menempatkan blok menggunakan barang dari inventaris Anda.
tutorial.moreDrills.text = Anda bisa menghubungkan banyak pertambangan dan konveyor bersama-sama, seperti biasa.
tutorial.deleteBlock.text = Anda dapat menghapus blok dengan mengeklik [orange]tombol mouse kanan[] di blok yang ingin Anda hapus. Coba hapus konveyor ini.
tutorial.deleteBlockAndroid.text = Anda dapat menghapus blok dengan [orange]memilih crosshair[] di [orange]menu mode penghancur[] di kiri bawah dan mengetuk bloknya. Coba hapus konveyor ini.
tutorial.placeTurret.text = Sekarang, pilih dan tempatkan [yellow]turret[] di [yellow]lokasi yang ditandai[].
tutorial.placedTurretAmmo.text = Turret ini sekarang akan menerima [yellow]amunisi[] dari konveyor. Anda dapat melihat berapa banyak amunisi yang dimiliki dengan menggeser kursor di bloknya dan memeriksa di [green]bilah hijau[].
tutorial.turretExplanation.text = Turret secara otomatis akan menembak musuh terdekat dalam jangkauan, selama mereka memiliki cukup amunisi.
tutorial.waves.text = Setiap [yellow]60[] detik, gelombang [coral]musuh[] akan muncul di lokasi tertentu dan berusaha menghancurkan intinya.
tutorial.coreDestruction.text = Tujuan Anda adalah untuk [yellow]mempertahankan intinya[]. Jika intinya hancur, Anda [coral]kalah dalam permainan[].
tutorial.pausingDesktop.text = Jika Anda perlu istirahat sebentar, tekan [orange]tombol jeda[] di bagian kiri atas atau [orange]tombol spasi[] untuk menghentikan sementara permainan. Anda masih bisa memilih dan menempatkan blok sambil berhenti, tapi tidak bisa bergerak atau menembak.
tutorial.pausingAndroid.text = Jika Anda perlu istirahat sebentar, tekan [orange]tombol jeda[] di kiri atas untuk menjeda permainan. Anda masih bisa menghapus dan menempatkan blok sambil berhenti sebentar.
tutorial.purchaseWeapons.text = Anda bisa membeli [yellow]senjata baru[] untuk robot Anda dengan membuka menu upgrade di kiri bawah.
tutorial.switchWeapons.text = Untuk mengganti senjata, klik ikonnya di kiri bawah, atau gunakan angka [orange][[1-9][].
tutorial.spawnWave.text = Gelombang sekarang datang. Hancurkan mereka.
tutorial.pumpDesc.text = Pada gelombang selanjutnya, Anda mungkin perlu menggunakan [yellow]pompa[] untuk mendistribusikan cairan untuk generator atau ekstraktor.
tutorial.pumpPlace.text = Pompa bekerja seperti dengan pertambangan, namun mereka menghasilkan cairan dan bukan barang. Cobalah menempatkan pompa pada [yellow]minyak yang ditunjuk[].
tutorial.conduitUse.text = Sekarang tempatkan [orange]saluran[] yang mengarah jauh dari pompa.
tutorial.conduitUse2.text = Dan beberapa lagi...
tutorial.conduitUse3.text = Dan beberapa lagi...
tutorial.generator.text = Sekarang, tempatkan [orange]blok generator pembakaran[] di ujung saluran.
tutorial.generatorExplain.text = Generator ini sekarang akan menciptakan [yellow]tenaga[] dari minyak.
tutorial.lasers.text = Tenaga didistribusikan menggunakan [yellow]laser tenaga[]. Putar dan tempatkan di sini.
tutorial.laserExplain.text = Generator sekarang akan memindahkan tenaga ke blok laser. Sinar [yellow]terang[] menandakan bahwa saat ini mentransmisikan tenaga, dan sinar [yellow]transparan[] berarti tidak.
tutorial.laserMore.text = Anda dapat memeriksa berapa banyak tenaga yang dimiliki blok dengan memindahkan kursor/mengetuk di atasnya dan memeriksa [yellow]bar kuning[] di bagian atas.
tutorial.healingTurret.text = Laser ini bisa digunakan untuk menyalakan [lime]turret perbaikan[]. Tempatkan satu di sini.
tutorial.healingTurretExplain.text = Selama memiliki tenaga, turret ini akan [lime]memperbaiki blok terdekat[]. Saat bermain, pastikan Anda memasukkannya ke markas Anda secepat mungkin!
tutorial.smeltery.text = Banyak blok yang membutuhkan [orange]baja[] agar dapat dibangun, yang membutuhkan [orange]peleburan[] untuk dibuat. Tempatkan satu di sini.
tutorial.smelterySetup.text = Peleburan ini sekarang akan menghasilkan [orange]baja[] dari besi yang masuk, dengan batubara sebagai bahan bakarnya.
tutorial.tunnelExplain.text = Perhatikan juga bahwa barang-barang itu masuk melalui [orange]blok terowongan[] dan muncul di sisi lain, melewati blok batu. Perlu diingat bahwa terowongan hanya bisa melalui sampai 2 blok.
tutorial.end.text = Dan itu menyimpulkan tutorialnya! Semoga berhasil!
keybind.move_x.name = gerak_x
keybind.move_y.name = gerak_y
keybind.select.name = pilih
keybind.break.name = hapus
keybind.shoot.name = tembak
keybind.zoom_hold.name = perbesar_tahan
keybind.zoom.name = perbesar
keybind.menu.name = menu
keybind.pause.name = jeda
keybind.dash.name = berlari
keybind.rotate_alt.name = putar_alt
keybind.rotate.name = putar
keybind.weapon_1.name = senjata_1
keybind.weapon_2.name = senjata_2
keybind.weapon_3.name = senjata_3
keybind.weapon_4.name = senjata_4
keybind.weapon_5.name = senjata_5
keybind.weapon_6.name = senjata_6
mode.waves.name = gelombang
mode.sandbox.name = sandbox
mode.freebuild.name = freebuild
upgrade.standard.name = standar
upgrade.standard.description = Robot standar.
upgrade.blaster.name = blaster
upgrade.blaster.description = Menembakan sebuah peluru yang lemah dan lambat.
upgrade.triblaster.name = triblaster
upgrade.triblaster.description = Menembakan 3 peluru secara menyebar.
upgrade.clustergun.name = clustergun
upgrade.clustergun.description = Menembakan sebuah granat eksplosif yang tidak akurat.
upgrade.beam.name = meriam sinar
upgrade.beam.description = Menembakan sinar laser jarak jauh.
upgrade.vulcan.name = vulcan
upgrade.vulcan.description = Menembakkan rombongan peluru dengan cepat.
upgrade.shockgun.name = shockgun
upgrade.shockgun.description = Menembakkan ledakan yang menghancurkan dari pecahan peluru yang terisi.
item.stone.name = batu
item.iron.name = besi
item.coal.name = batu bara
item.steel.name = baja
item.titanium.name = titanium
item.dirium.name = dirium
item.thorium.name = thorium
item.sand.name = pasir
liquid.water.name = air
liquid.plasma.name = plasma
liquid.lava.name = lahar
liquid.oil.name = minyak
block.weaponfactory.name = pabrik senjata
block.weaponfactory.fulldescription = Dipakai untuk membuat senjata bagi robot pemain. Klik untuk memakai. Otomatis mengambil sumber daya dari inti.
block.air.name = udara
block.blockpart.name = bagian blok
block.deepwater.name = air dangkal
block.water.name = air
block.lava.name = lahar
block.oil.name = minyak
block.stone.name = batu
block.blackstone.name = batu hitam
block.iron.name = besi
block.coal.name = batu bara
block.titanium.name = titanium
block.thorium.name = thorium
block.dirt.name = tanah
block.sand.name = pasir
block.ice.name = es
block.snow.name = salju
block.grass.name = rumput
block.sandblock.name = blok pasir
block.snowblock.name = blok salju
block.stoneblock.name = blok batu
block.blackstoneblock.name = blok batu hitam
block.grassblock.name = blok rumput
block.mossblock.name = blok lumut
block.shrub.name = belukar
block.rock.name = batu
block.icerock.name = batu es
block.blackrock.name = batu hitam
block.dirtblock.name = blok tanah
block.stonewall.name = dinding batu
block.stonewall.fulldescription = Sebuah blok defensif yang murah. Berguna untuk melindungi inti dan turret di beberapa gelombang pertama.
block.ironwall.name = dinding besi
block.ironwall.fulldescription = Blok defensif dasar. Menyediakan perlindungan dari musuh.
block.steelwall.name = dinding baja
block.steelwall.fulldescription = Sebuah blok defensif standar. Perlindungan yang memadai dari musuh.
block.titaniumwall.name = dinding titanium
block.titaniumwall.fulldescription = Blok pertahanan yang kuat. Menyediakan perlindungan dari musuh.
block.duriumwall.name = dinding dirium
block.duriumwall.fulldescription = Blok pertahanan yang sangat kuat. Menyediakan perlindungan dari musuh.
block.compositewall.name = dinding komposit
block.steelwall-large.name = dinding baja besar
block.steelwall-large.fulldescription = Sebuah blok defensif standar. Membentang beberapa ubin.
block.titaniumwall-large.name = dinding titanium besar
block.titaniumwall-large.fulldescription = Blok pertahanan yang kuat. Membentang beberapa ubin.
block.duriumwall-large.name = dinding dirium yang besar
block.duriumwall-large.fulldescription = Blok pertahanan yang sangat kuat. Membentang beberapa ubin.
block.titaniumshieldwall.name = dinding perisai
block.titaniumshieldwall.fulldescription = Sebuah blok defensif yang kuat, dengan tambahan perisai. Membutuhkan tenaga. Menggunakan energi untuk menyerap peluru musuh. Dianjurkan untuk menggunakan pemercepat tenaga untuk memberi energi pada blok ini.
block.repairturret.name = turret perbaikan
block.repairturret.fulldescription = Memperbaiki blok terdekat yang rusak dengan lambat. Menggunakan sedikit tenaga.
block.megarepairturret.name = perbaikan turret II
block.megarepairturret.fulldescription = Memperbaiki blok yang rusak dengan normal. Menggunakan tenaga.
block.shieldgenerator.name = pembangkit perisai
block.shieldgenerator.fulldescription = Blok defensif yang maju. Mellindungi semua blok dalam radius dari serangan. Menggunakan tenaga dengan lambat saat menganggur, namun menyalurkan energi dengan cepat pada kontak peluru.
block.door.name = pintu
block.door.fulldescription = Blok yang bisa dibuka dan ditutup dengan mengetuknya.
block.door-large.name = pintu besar
block.door-large.fulldescription = Blok yang bisa dibuka dan ditutup dengan mengetuknya.
block.conduit.name = saluran
block.conduit.fulldescription = Blok pengangkut cairan dasar. Bekerja seperti konveyor, tapi dengan cairan. Terbaik digunakan dengan pompa atau saluran lainnya. Bisa digunakan sebagai jembatan di atas cairan untuk musuh dan pemain.
block.pulseconduit.name = saluran cepat
block.pulseconduit.fulldescription = Blok pengangkut cairan tingkat lanjut. Mengangkut cairan lebih cepat dan menyimpan lebih banyak dari pada saluran standar.
block.liquidrouter.name = router cairan
block.liquidrouter.fulldescription = Bekerja seperti router. Menerima masukan cairan dari satu sisi dan mengeluarkannya ke sisi yang lain. Berguna untuk pemisahan cairan dari satu saluran ke beberapa saluran lainnya.
block.conveyor.name = konveyor
block.conveyor.fulldescription = Blok dasar pengangkut barang. Memindahkan barang ke depan dan secara otomatis menyimpannya ke turret, ekstraktor, dan pertambangan. Bisa diputar. Bisa digunakan sebagai jembatan di atas cairan untuk musuh dan pemain.
block.steelconveyor.name = konveyor baja
block.steelconveyor.fulldescription = Blok transportasi barang lanjutan. Memindahkan barang lebih cepat dari konveyor standar.
block.poweredconveyor.name = konveyor cepat
block.poweredconveyor.fulldescription = Blok terbaik untuk pengangkutan barang. Memindahkan barang lebih cepat dari konveyor baja.
block.router.name = router
block.router.fulldescription = Menerima item dari satu arah dan mengeluarkannya ke 3 arah. Bisa juga menyimpan sejumlah barang. Berguna untuk membelah bahan dari satu pertambangan ke beberapa turret.
block.junction.name = persimpangan jalan
block.junction.fulldescription = Bertindak sebagai jembatan untuk dua sabuk persimpangan. Berguna dalam situasi dengan dua konveyor berbeda yang membawa bahan berbeda ke lokasi yang berbeda.
block.conveyortunnel.name = terowongan konveyor
block.conveyortunnel.fulldescription = Memindahkan barang di bawah blok. Untuk menggunakan, tempatkan satu terowongan yang menuju ke terowongan di bawah blok, dan satu di sisi lain. Pastikan kedua terowongan menghadap ke arah yang berlawanan, yaitu menuju blok yang mereka masukkan atau keluarkan.
block.liquidjunction.name = persimpangan cairan
block.liquidjunction.fulldescription = Bertindak sebagai jembatan untuk dua saluran persimpangan. Berguna dalam situasi dengan dua saluran berbeda yang membawa cairan berbeda ke lokasi yang berbeda.
block.liquiditemjunction.name = persimpangan barang-cairan
block.liquiditemjunction.fulldescription = Bertindak sebagai jembatan untuk menyilang saluran dan konveyor.
block.powerbooster.name = pemercepat tenaga
block.powerbooster.fulldescription = Mendistribusikan tenaga ke semua blok dalam radiusnya.
block.powerlaser.name = laser tenaga
block.powerlaser.fulldescription = Membuat laser yang mentransmisikan daya ke blok di depannya. Tidak menghasilkan tenaga itu sendiri. Terbaik digunakan dengan generator atau laser lainnya.
block.powerlaserrouter.name = router laser
block.powerlaserrouter.fulldescription = Laser yang mendistribusikan tenaga ke tiga arah sekaligus. Berguna dalam situasi di mana diperlukan tenaga ke beberapa blok dari satu generator.
block.powerlasercorner.name = sudut laser
block.powerlasercorner.fulldescription = Laser yang mendistribusikan tenaga ke dua arah sekaligus. Berguna dalam situasi di mana diperlukan tenaga ke beberapa blok dari satu generator, dan arah router kurang tepat.
block.teleporter.name = teleporter
block.teleporter.fulldescription = Blok transportasi barang lanjutan. Teleporter memasukkan barang ke teleporter lain dengan warna yang sama. Tidak ada apa-apa jika tidak ada teleporter dengan warna yang sama. Jika beberapa teleporter memiliki warna yang sama, teleporter dipilih secara acak. Menggunakan tenaga. Ketuk/klik untuk mengubah warna.
block.sorter.name = penyortir
block.sorter.fulldescription = Menyortir barang menurut jenis bahannya. Bahan yang diterima ditandai dengan warna di blok. Semua item yang sesuai dengan jenis bahan dilepaskan ke depan, segala sesuatu yang lain dikeluarkan ke kiri dan kanan.
block.core.name = inti
block.pump.name = pompa
block.pump.fulldescription = Memompa cairan dari sumber blok- biasanya air, lahar atau minyak. Mengeluarkan cairan ke saluran terdekat.
block.fluxpump.name = pompa flux
block.fluxpump.fulldescription = Sebuah versi lanjutan dari pompa. Menyimpan lebih banyak cairan dan memompa cairan lebih cepat.
block.smelter.name = peleburan
block.smelter.fulldescription = Blok kerajinan esensial. Saat dimasukkan 1 besi dan 1 batu bara sebagai bahan bakar, akan mengeluarkan satu baja. Disarankan untuk memasukkan besi dan batu bara ke sabuk yang berbeda untuk mencegah penyumbatan.
block.crucible.name = peleburan dirium
block.crucible.fulldescription = Sebuah blok kerajinan yang maju. Saat dimasukkan 1 titanium, 1 baja dan 1 batu bara sebagai bahan bakar, mengeluarkan satu dirium. Disarankan untuk memasukkan batubara, baja dan titanium pada sabuk yang berbeda untuk mencegah penyumbatan.
block.coalpurifier.name = ekstraktor batubara
block.coalpurifier.fulldescription = Blok ekstraktor dasar. mengeluarkan batu bara saat dipasok dengan air dan batu dalam skala yang besar.
block.titaniumpurifier.name = ekstraktor titanium
block.titaniumpurifier.fulldescription = Blok ekstraktor standar. mengeluarkan titanium bila dipasok dengan air dan besi dalam skala yang besar.
block.oilrefinery.name = penyulingan minyak
block.oilrefinery.fulldescription = Menyuling sejumlah minyak menjadi batubara. Berguna untuk memasok turret berbasis batubara saat penambangan batubara langka.
block.stoneformer.name = pembentuk batu
block.stoneformer.fulldescription = Mengubah lahar ke dalam batu. Berguna untuk menghasilkan batu dalam jumlah besar untuk pemurni batu bara.
block.lavasmelter.name = peleburan lava
block.lavasmelter.fulldescription = Menggunakan lahar untuk mengubah besi menjadi baja. Sebuah alternatif untuk peleburan batubara. Berguna dalam situasi di mana pertambangan batubara langka.
block.stonedrill.name = pertambangan batu
block.stonedrill.fulldescription = Pertambangan penting. Saat diletakkan di atas ubin batu, akan menghasilkan batu pada kecepatan yang lambat tanpa batas waktu.
block.irondrill.name = pertambangan besi
block.irondrill.fulldescription = Pertambangan dasar. Saat diletakkan di atas ubin bijih besi, akan mengeluarkan besi pada kecepatan yang lambat tanpa batas waktu.
block.coaldrill.name = pertambangan batubara
block.coaldrill.fulldescription = Pertambangan dasar. Saat ditempatkan di ubin bijih batubara, akan mengeluarkan batu bara pada kecepatan yang lambat tanpa batas waktu.
block.thoriumdrill.name = pertambangan thorium
block.thoriumdrill.fulldescription = Sebuah pertambangan yang canggih. Saat ditempatkan di ubin bijih thorium, akan mengeluarkan thorium pada kecepatan lambat tanpa batas waktu.
block.titaniumdrill.name = pertambangan titanium
block.titaniumdrill.fulldescription = Sebuah pertambangan yang canggih. Saat ditempatkan pada ubin bijih titanium, akan mengeluarkan titanium pada kecepatan lambat tanpa batas waktu.
block.omnidrill.name = pertambangan super
block.omnidrill.fulldescription = Pertambangan yang terbaik. Akan saya tambang bijih apapun itu ditempatkan pada kecepatan tinggi.
block.coalgenerator.name = pembangkit tenaga batubara
block.coalgenerator.fulldescription = Generator penting. Menghasilkan tenaga dari batu bara. Keluarkan tenaga sebagai laser ke 4 sisinya.
block.thermalgenerator.name = pembangkit tenaga panas
block.thermalgenerator.fulldescription = Menghasilkan tenaga dari lahar. Mengeluarkan tenaga sebagai laser ke 4 sisi.
block.combustiongenerator.name = pembangkit tenaga minyak
block.combustiongenerator.fulldescription = Menghasilkan tenaga dari minyak. Mengeluarkan tenaga sebagai laser ke 4 sisi.
block.rtgenerator.name = pembangkit tenaga radioaktif
block.rtgenerator.fulldescription = Menghasilkan sedikit tenaga dari peluruhan radioaktif thorium. Mengeluarkan tenaga sebagai laser ke 4 sisi.
block.nuclearreactor.name = reaktor nuklir
block.nuclearreactor.fulldescription = Versi lanjutan Pembangkit Tenaga Radioaktif, dan generator tenaga tertinggi. Menghasilkan tenaga dari thorium. Membutuhkan pendinginan air konstan. Sangat mudah menguap; akan meledak dengan hebat jika tidak cukup jumlah pendingin yang diberikan.
block.turret.name = turret
block.turret.fulldescription = Sebuah menara dasar yang murah. Menggunakan batu untuk amunisi. Memiliki jangkauan yang sedikit lebih banyak daripada turret ganda.
block.doubleturret.name = turret ganda
block.doubleturret.fulldescription = Versi turret standar yang sedikit lebih bertenaga. Menggunakan batu untuk amunisi. Memberikan damage secara signifikan lebih banyak, namun memiliki jangkauan yang lebih rendah. Menembak dua peluru.
block.machineturret.name = turret cepat
block.machineturret.fulldescription = Sebuah menara standar. Menggunakan besi untuk amunisi. Memiliki tembakan yang cepat dengan damage yang layak.
block.shotgunturret.name = turret split
block.shotgunturret.fulldescription = Sebuah turret standar. Menggunakan besi untuk amunisi. Menembakkan 7 peluru. Jaraknya pendek, namun damage-nya lebih tinggi daripada turret cepat.
block.flameturret.name = turret api
block.flameturret.fulldescription = Turret jarak dekat lanjutan. Menggunakan batubara untuk amunisi. Memiliki jangkauan yang pendek, namun sangat tinggi damage-nya. Bagus untuk jarak dekat. Dianjurkan untuk digunakan dibalik dinding.
block.sniperturret.name = turret railgun
block.sniperturret.fulldescription = Turret jarak jauh lanjutan. Menggunakan baja untuk amunisi. Kerusakan yang sangat tinggi, namun menembak dengan lambat. Mahal untuk digunakan, tapi bisa ditempatkan jauh dari garis musuh karena jangkauannya.
block.mortarturret.name = turret flak
block.mortarturret.fulldescription = Turret dengan akurasi pendek dan damage eksplosif. Menggunakan batubara untuk amunisi. Menembakkan peluru yang meledak lalu menjadi pecahan peluru. Berguna untuk kerumunan musuh yang besar.
block.laserturret.name = turret laser
block.laserturret.fulldescription = Turret satu target. Menggunakan tenaga. Memiliki jarak sedang yang bagus. Target tunggal saja. Tidak pernah meleset.
block.waveturret.name = turret tesla
block.waveturret.fulldescription = Turret target banyak. Menggunakan tenaga. Jaraknya sedang. Tidak pernah meleset. Rata-rata damage-nya kecil, namun bisa menembak beberapa musuh bersamaan dengan petir berantai.
block.plasmaturret.name = turret plasma
block.plasmaturret.fulldescription = Versi yang sangat maju dari turret api. Menggunakan batubara sebagai amunisi. Damage yang sangat tinggi, jaraknya pendek sampai sedang.
block.chainturret.name = turret berantai
block.chainturret.fulldescription = Menara api yang menembak dengan cepat. Menggunakan thorium sebagai amunisi. Menembak peluru besar dengan kecepatan tinggi. Jaraknya sedang. Membentang beberapa ubin. Sangat tangguh.
block.titancannon.name = meriam titan
block.titancannon.fulldescription = Turret jarak jauh terakhir. Menggunakan thorium sebagai amunisi. Menembakkan peluru yang meledak dengan cipratan besar dengan kecepatan sedang. Jarak jauh. Membentang beberapa ubin. Sangat tangguh.
block.playerspawn.name = spawn pemain
block.enemyspawn.name = spawn musuh
text.about=Dibuat oleh [ROYAL]Anuken.[]\nAwalnya masuk di [orange]GDL[] MM Jam.\n\nKredit:\n- SFX dibuat dengan [YELLOW]bfxr[]\n- Musik dibuat oleh [GREEN]RoccoW[] / ditemukan di [lime]FreeMusicArchive.org[]\n\nTerima kasih khusus kepada:\n- [coral]MitchellFJN[]: playtesting dan umpan balik yang luas\n- [sky]Luxray5474[]: pekerjaan wiki, kontribusi kode\n- Semua penguji beta di itch.io dan Google Play\n
text.discord=Bergabunglah dengan Discord Mindustry!
text.gameover=Intinya hancur.
text.highscore=[YELLOW]Rekor baru!
text.lasted=Anda bertahan sampai gelombang
text.level.highscore=Skor Tinggi: [accent]{0}
text.level.delete.title=Konfirmasi Hapus
text.level.select=Pilih Level
text.level.mode=Modus permainan:
text.savegame=Simpan Permainan
text.loadgame=Lanjutkan
text.joingame=Bermain Bersama
text.quit=Keluar
text.about.button=Tentang
text.name=Nama:
text.players={0} pemain online
text.players.single={0} pemain online
text.server.mismatch=Kesalahan paket: kemungkinan versi client / server tidak sesuai.\nPastikan Anda dan host memiliki versi terbaru Mindustry!
text.server.closing=[accent]Menutup server...
text.server.kicked.kick=Anda telah dikeluarkan dari server!
text.server.kicked.invalidPassword=Kata sandi salah!
text.server.kicked.clientOutdated=Client versi lama! Update game Anda!
text.server.kicked.serverOutdated=Server versi lama! Tanyakan host untuk mengupdate!
text.server.connected={0} telah bergabung.
text.server.disconnected={0} telah terputus.
text.nohost=Tidak dapat meng-host server pada peta khusus!
text.hostserver=Host Server
text.host=Host
text.hosting=[accent]Membuka server...
text.hosts.refresh=Segarkan
text.hosts.discovering=Mencari game LAN
text.server.refreshing=Menyegarkan server
text.hosts.none=[lightgray]Tidak ada game LAN yang ditemukan!
text.host.invalid=[scarlet]Tidak dapat terhubung ke host.
text.server.friendlyfire=Tembak Sesama
text.server.add=Tambahkan Server
text.server.delete=Yakin ingin menghapus server ini?
text.server.hostname=Host: {0}
text.server.edit=Sunting Server
text.joingame.title=Bermain Bersama
text.joingame.ip=IP:
text.disconnect=Sambungan terputus.
text.connecting=[accent]Menghubungkan...
text.connecting.data=[accent]Memuat data level...
text.connectfail=[crimson]Gagal terhubung ke server: [orange]{0}
text.server.port=Port:
text.server.addressinuse=Alamat sudah di pakai!
text.server.invalidport=Nomor port salah!
text.server.error=[crimson]Kesalahan server hosting: [orange]{0}
text.save.new=Simpan Baru
text.save.overwrite=Yakin ingin mengganti slot simpan ini?
text.overwrite=Ganti
text.save.none=Tidak ada simpanan ditemukan!
text.saveload=[accent]Menyimpan...
text.savefail=Gagal menyimpan game!
text.save.delete.confirm=Yakin ingin menghapus save ini?
text.save.delete=Hapus
text.save.export=Ekspor Simpanan
text.save.import.invalid=[orange]Simpanan ini tidak valid!
text.save.import.fail=[crimson]Gagal mengimpor: [orange]{0}
text.save.export.fail=[crimson]Gagal mengekspor save: [orange]{0}
text.save.import=Impor Simpanan
text.save.newslot=Nama simpanan:
text.save.rename=Ganti nama
text.save.rename.text=Nama baru:
text.selectslot=Pilih simpanan.
text.slot=[accent]Slot{0}
text.save.corrupted=[orange]Simpanan rusak atau tidak valid!
text.empty=<kosong>
text.on=Hidup
text.off=Mati
text.save.autosave=Simpan otomatis: {0}
text.save.map=Peta: {0}
text.save.wave=Gelombang {0}
text.save.date=Terakhir Disimpan: {0}
text.confirm=Konfirmasi
text.delete=Hapus
text.ok=OK
text.open=Buka
text.cancel=Batal
text.openlink=Buka tautan
text.back=Kembali
text.quit.confirm=Anda yakin ingin berhenti?
text.loading=[accent]Memuat...
text.wave=[orange]Gelombang {0}
text.wave.waiting=Gelombang dimulai {0}
text.waiting=Menunggu...
text.enemies={0} musuh
text.enemies.single={0} Musuh
text.loadimage=Buka Gambar
text.saveimage=Simpan Gambar
text.editor.badsize=[orange]Dimensi gambar tidak valid![]\nDimensi peta yang valid: {0}
text.editor.errorimageload=Kesalahan saat memuat file gambar:\n[orange]{0}
text.editor.errorimagesave=Kesalahan saat menyimpan file gambar:\n[orange]{0}
text.editor.generate=Hasilkan
text.editor.resize=Ubah ukuran
text.editor.loadmap=Buka Peta
text.editor.savemap=Simpan Peta
text.editor.loadimage=Buka Gambar
text.editor.saveimage=Simpan Gambar
text.editor.unsaved=[scarlet]Anda memiliki perubahan yang belum disimpan![]\nYakin ingin keluar?
text.editor.resizemap=Ubah ukuran peta
text.editor.mapname=Nama Peta:
text.editor.overwrite=[accent]Peringatan!\nIni akan mengganti peta yang ada.
text.editor.selectmap=Pilih peta yang akan dimuat:
text.width=Lebar:
text.height=Tinggi:
text.menu=Menu
text.play=Main
text.load=Buka
text.save=Simpan
text.language.restart=Silakan mulai ulang permainan Anda agar pengaturan bahasa mulai berlaku.
text.settings.language=Bahasa
text.settings=Pengaturan
text.tutorial=Tutorial
text.editor=Pengedit
text.mapeditor=Pengedit Peta
text.donate=Sumbangkan
text.settings.reset=Atur ulang ke Default
text.settings.controls=Kontrol
text.settings.game=Permainan
text.settings.sound=Suara
text.settings.graphics=Grafis
text.upgrades=Perbaruan
text.purchased=[LIME]Dibuat!
text.weapons=Senjata
text.paused=Jeda
text.info.title=[accent]Info
text.error.title=[crimson]Telah terjadi kesalahan
text.error.crashtitle=Telah terjadi kesalahan
text.blocks.blockinfo=Info Blok
text.blocks.powercapacity=Kapasitas Tenaga
text.blocks.powershot=Tenaga/tembakan
text.blocks.size=Ukuran
text.blocks.liquidcapacity=Kapasitas cairan
text.blocks.maxitemssecond=Batas barang/detik
text.blocks.powerrange=Jangkauan tenaga
text.blocks.itemcapacity=Kapasitas Barang
text.blocks.inputliquid=Cairan yang Masuk
text.blocks.inputitem=Barang yang Masuk
text.blocks.explosive=Mudah meledak!
text.blocks.health=Darah
text.blocks.inaccuracy=Ketidaktelitian
text.blocks.shots=Tembakan
text.blocks.inputcapacity=Kapasitas masuk
text.blocks.outputcapacity=Kapasitas keluar
setting.difficulty.easy=mudah
setting.difficulty.normal=normal
setting.difficulty.hard=sulit
setting.difficulty.insane=sangat susah
setting.difficulty.purge=paling susah
setting.difficulty.name=Kesulitan:
setting.screenshake.name=Layar Bergoyang
setting.indicators.name=Indikator Musuh
setting.effects.name=Efek Tampilan
setting.sensitivity.name=Sensitivitas Pengendali
setting.saveinterval.name=Waktu Simpan Otomatis
setting.seconds={0} Detik
setting.fullscreen.name=Layar Penuh
setting.fps.name=Tunjukkan FPS
setting.vsync.name=VSync
setting.lasers.name=Tampilkan Laser Tenaga
setting.healthbars.name=Tampilkan Bar Darah Entitas
setting.musicvol.name=Volume Musik
setting.mutemusic.name=Bisukan Musik
setting.sfxvol.name=Volume Suara
setting.mutesound.name=Bisukan Suara
map.maze.name=labirin
map.fortress.name=benteng
map.sinkhole.name=lubang pembuangan
map.caves.name=gua
map.volcano.name=gunung berapi
map.caldera.name=kaldera
map.scorch.name=penghangusan
map.desert.name=gurun
map.island.name=pulau
map.grassland.name=padang rumput
map.tundra.name=tundra
map.spiral.name=spiral
map.tutorial.name=tutorial
keybind.move_x.name=gerak_x
keybind.move_y.name=gerak_y
keybind.select.name=pilih
keybind.break.name=hapus
keybind.shoot.name=tembak
keybind.zoom_hold.name=perbesar_tahan
keybind.zoom.name=perbesar
keybind.menu.name=menu
keybind.pause.name=jeda
keybind.dash.name=berlari
keybind.rotate_alt.name=putar_alt
keybind.rotate.name=putar
mode.waves.name=gelombang
mode.sandbox.name=sandbox
mode.freebuild.name=freebuild
item.stone.name=batu
item.coal.name=batu bara
item.titanium.name=titanium
item.thorium.name=thorium
item.sand.name=pasir
liquid.water.name=air
liquid.lava.name=lahar
liquid.oil.name=minyak
block.door.name=pintu
block.door-large.name=pintu besar
block.conduit.name=saluran
block.pulseconduit.name=saluran cepat
block.liquidrouter.name=router cairan
block.conveyor.name=konveyor
block.router.name=router
block.junction.name=persimpangan jalan
block.liquidjunction.name=persimpangan cairan
block.sorter.name=penyortir
block.smelter.name=peleburan
text.credits=Credits
text.link.discord.description=the official Mindustry discord chatroom
text.link.github.description=Game source code
text.link.dev-builds.description=Unstable development builds
text.link.trello.description=Official trello board for planned features
text.link.itch.io.description=itch.io page with PC downloads and web version
text.link.google-play.description=Google Play store listing
text.link.wiki.description=official Mindustry wiki
text.linkfail=Failed to open link!\nThe URL has been copied to your cliboard.
text.editor.web=The web version does not support the editor!\nDownload the game to use it.
text.web.unsupported=The web version does not support this feature! Download the game to use it.
text.multiplayer.web=This version of the game does not support multiplayer!\nTo play multiplayer from your browser, use the "multiplayer web version" link at the itch.io page.
text.host.web=The web version does not support hosting games! Download the game to use this feature.
text.map.delete=Are you sure you want to delete the map "[orange]{0}[]"?
text.construction.title=Block Construction Guide
text.construction=You've just selected [accent]block construction mode[].\n\nTo begin placing, simply tap a valid location near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Shift the selection[] by holding and dragging any block in the selection.\n- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel construction or selection[] by pressing the X at the bottom left.
text.deconstruction.title=Block Deconstruction Guide
text.deconstruction=You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left.
text.showagain=Don't show again next session
text.unlocks=Unlocks
text.addplayers=Add/Remove Players
text.newgame=New Game
text.maps=Maps
text.maps.none=[LIGHT_GRAY]No maps found!
text.unlocked=New Block Unlocked!
text.unlocked.plural=New Blocks Unlocked!
text.server.kicked.fastShoot=You are shooting too quickly.
text.server.kicked.banned=You are banned on this server.
text.server.kicked.recentKick=You have been kicked recently.\nWait before connecting again.
text.server.kicked.nameInUse=There is someone with that name\nalready on this server.
text.server.kicked.nameEmpty=Your name must contain at least one character or number.
text.server.kicked.idInUse=You are already on this server! Connecting with two accounts is not permitted.
text.server.kicked.customClient=This server does not support custom builds. Download an official version.
text.host.info=The [accent]host[] button hosts a server on ports [scarlet]6567[] and [scarlet]6568.[]\nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings.
text.join.info=Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[LIGHT_GRAY]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
text.trace=Trace Player
text.trace.playername=Player name: [accent]{0}
text.trace.ip=IP: [accent]{0}
text.trace.id=Unique ID: [accent]{0}
text.trace.android=Android Client: [accent]{0}
text.trace.modclient=Custom Client: [accent]{0}
text.trace.totalblocksbroken=Total blocks broken: [accent]{0}
text.trace.structureblocksbroken=Structure blocks broken: [accent]{0}
text.trace.lastblockbroken=Last block broken: [accent]{0}
text.trace.totalblocksplaced=Total blocks placed: [accent]{0}
text.trace.lastblockplaced=Last block placed: [accent]{0}
text.invalidid=Invalid client ID! Submit a bug report.
text.server.bans=Bans
text.server.bans.none=No banned players found!
text.server.admins=Admins
text.server.admins.none=No admins found!
text.server.outdated=[crimson]Outdated Server![]
text.server.outdated.client=[crimson]Outdated Client![]
text.server.version=[lightgray]Version: {0}
text.server.custombuild=[yellow]Custom Build
text.confirmban=Are you sure you want to ban this player?
text.confirmunban=Are you sure you want to unban this player?
text.confirmadmin=Are you sure you want to make this player an admin?
text.confirmunadmin=Are you sure you want to remove admin status from this player?
text.disconnect.data=Failed to load world data!
text.save.difficulty=Difficulty: {0}
text.copylink=Copy Link
text.changelog.title=Changelog
text.changelog.loading=Getting changelog...
text.changelog.error.android=[orange]Note that the changelog sometimes does not work on Android 4.4 and below!\nThis is due to an internal Android bug.
text.changelog.error.ios=[orange]The changelog is currently not supported in iOS.
text.changelog.error=[scarlet]Error getting changelog!\nCheck your internet connection.
text.changelog.current=[yellow][[Current version]
text.changelog.latest=[orange][[Latest version]
text.saving=[accent]Saving...
text.unknown=Unknown
text.custom=Custom
text.builtin=Built-In
text.map.delete.confirm=Are you sure you want to delete this map? This action cannot be undone!
text.map.random=[accent]Random Map
text.map.nospawn=This map does not have any cores for the player to spawn in! Add a [ROYAL]blue[] core to this map in the editor.
text.editor.slope=\\
text.editor.openin=Open In Editor
text.editor.oregen=Ore Generation
text.editor.oregen.info=Ore Generation:
text.editor.mapinfo=Map Info
text.editor.author=Author:
text.editor.description=Description:
text.editor.name=Name:
text.editor.teams=Teams
text.editor.elevation=Elevation
text.editor.saved=Saved!
text.editor.save.noname=Your map does not have a name! Set one in the 'map info' menu.
text.editor.save.overwrite=Your map overwrites a built-in map! Pick a different name in the 'map info' menu.
text.editor.import.exists=[scarlet]Unable to import:[] a built-in map named '{0}' already exists!
text.editor.import=Import...
text.editor.importmap=Import Map
text.editor.importmap.description=Import an already existing map
text.editor.importfile=Import File
text.editor.importfile.description=Import an external map file
text.editor.importimage=Import Terrain Image
text.editor.importimage.description=Import an external map image file
text.editor.export=Export...
text.editor.exportfile=Export File
text.editor.exportfile.description=Export a map file
text.editor.exportimage=Export Terrain Image
text.editor.exportimage.description=Export a map image file
text.editor.overwrite.confirm=[scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
text.fps=FPS: {0}
text.tps=TPS: {0}
text.ping=Ping: {0}ms
text.settings.rebind=Rebind
text.yes=Yes
text.no=No
text.blocks.targetsair=Targets Air
text.blocks.itemspeed=Units Moved
text.blocks.shootrange=Range
text.blocks.poweruse=Power Use
text.blocks.inputitemcapacity=Input Item Capacity
text.blocks.outputitemcapacity=Input Item Capacity
text.blocks.maxpowergeneration=Max Power Generation
text.blocks.powertransferspeed=Power Transfer
text.blocks.craftspeed=Production Speed
text.blocks.inputliquidaux=Aux Liquid
text.blocks.inputitems=Input Items
text.blocks.outputitem=Output Item
text.blocks.drilltier=Drillables
text.blocks.drillspeed=Base Drill Speed
text.blocks.liquidoutput=Liquid Output
text.blocks.liquiduse=Liquid Use
text.blocks.coolant=Coolant
text.blocks.coolantuse=Coolant Use
text.blocks.inputliquidfuel=Fuel Liquid
text.blocks.liquidfueluse=Liquid Fuel Use
text.blocks.reload=Reload
text.blocks.inputfuel=Fuel
text.blocks.fuelburntime=Fuel Burn Time
text.unit.blocks=blocks
text.unit.powersecond=power units/second
text.unit.liquidsecond=liquid units/second
text.unit.itemssecond=items/second
text.unit.pixelssecond=pixels/second
text.unit.liquidunits=liquid units
text.unit.powerunits=power units
text.unit.degrees=degrees
text.unit.seconds=seconds
text.unit.none=
text.unit.items=items
text.category.general=General
text.category.power=Power
text.category.liquids=Liquids
text.category.items=Items
text.category.crafting=Crafting
text.category.shooting=Shooting
setting.multithread.name=Multithreading
setting.minimap.name=Show Minimap
text.keybind.title=Rebind Keys
keybind.block_info.name=block_info
keybind.chat.name=chat
keybind.player_list.name=player_list
keybind.console.name=console
mode.text.help.title=Description of modes
mode.waves.description=the normal mode. limited resources and automatic incoming waves.
mode.sandbox.description=infinite resources and no timer for waves.
mode.freebuild.description=limited resources and no timer for waves.
content.item.name=Items
content.liquid.name=Liquids
content.unit-type.name=Units
content.recipe.name=Blocks
item.stone.description=A common raw material. Used for separating and refining into other materials, or melting into lava.
item.tungsten.name=Tungsten
item.tungsten.description=A common, but very useful structure material. Used in drills and heat-resistant blocks such as generators and smelteries.
item.lead.name=Lead
item.lead.description=A basic starter material. Used extensively in electronics and liquid transportation blocks.
item.coal.description=A common and readily available fuel.
item.carbide.name=Carbide
item.carbide.description=A tough alloy made with tungsten and carbon. Used in advanced transportation blocks and high-tier drills.
item.titanium.description=A rare super-light metal used extensively in liquid transportation, drills and aircraft.
item.thorium.description=A dense, radioactive metal used as structural support and nuclear fuel.
item.silicon.name=Silicon
item.silcion.description=An extremely useful semiconductor, with applications in solar panels and many complex electronics.
item.plastanium.name=Plastanium
item.plastanium.description=A light, ductile material used in advanced aircraft and fragmentation ammunition.
item.phase-matter.name=Phase Matter
item.surge-alloy.name=Surge Alloy
item.biomatter.name=Biomatter
item.biomatter.description=A clump of organic mush; used for conversion into oil or as a basic fuel.
item.sand.description=A common material that is used extensively in smelting, both in alloying and as a flux.
item.blast-compound.name=Blast Compound
item.blast-compound.description=A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised.
item.pyratite.name=Pyratite
item.pyratite.description=An extremely flammable substance used in incendiary weapons.
liquid.cryofluid.name=Cryofluid
text.item.explosiveness=[LIGHT_GRAY]Explosiveness: {0}
text.item.flammability=[LIGHT_GRAY]Flammability: {0}
text.item.radioactivity=[LIGHT_GRAY]Radioactivity: {0}
text.item.fluxiness=[LIGHT_GRAY]Flux Power: {0}
text.item.hardness=[LIGHT_GRAY]Hardness: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]Heat Capacity: {0}
text.liquid.viscosity=[LIGHT_GRAY]Viscosity: {0}
text.liquid.temperature=[LIGHT_GRAY]Temperature: {0}
block.tungsten-wall.name=Tungsten Wall
block.tungsten-wall-large.name=Large Tungsten Wall
block.carbide-wall.name=Carbide Wall
block.carbide-wall-large.name=Large Carbide Wall
block.thorium-wall.name=Thorium Wall
block.thorium-wall-large.name=Large Thorium Wall
block.duo.name=Duo
block.scorch.name=Scorch
block.hail.name=Hail
block.lancer.name=Lancer
block.titanium-conveyor.name=Titanium Conveyor
block.splitter.name=Splitter
block.splitter.description=Outputs items into two opposite directions immediately after they are recieved.
block.router.description=Splits items into all 4 directions. Can store items as a buffer.
block.distributor.name=Distributor
block.distributor.description=A splitter that can split items into 8 directions.
block.sorter.description=Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right.
block.overflow-gate.name=Overflow Gate
block.overflow-gate.description=A combination splitter and router that only outputs to the left and right if the front path is blocked.
block.bridgeconveyor.name=Bridge Conveyor
block.bridgeconveyor.description=A conveyor that can go over other blocks, for up to two total blocks.
block.arc-smelter.name=Arc Smelter
block.silicon-smelter.name=Silicon Smelter
block.phase-weaver.name=Phase Weaver
block.pulverizer.name=Pulverizer
block.cryofluidmixer.name=Cryofluid Mixer
block.melter.name=Melter
block.incinerator.name=Incinerator
block.biomattercompressor.name=Biomatter Compressor
block.separator.name=Separator
block.centrifuge.name=Centrifuge
block.power-node.name=Power Node
block.power-node-large.name=Large Power Node
block.battery.name=Battery
block.battery-large.name=Large Battery
block.combustion-generator.name=Combustion Generator
block.turbine-generator.name=Turbine Generator
block.tungsten-drill.name=Tungsten Drill
block.carbide-drill.name=Carbide Drill
block.laser-drill.name=Laser Drill
block.water-extractor.name=Water Extractor
block.cultivator.name=Cultivator
block.dart-ship-factory.name=Dart Ship Factory
block.delta-mech-factory.name=Delta Mech Factory
block.dronefactory.name=Drone Factory
block.repairpoint.name=Repair Point
block.resupplypoint.name=Resupply Point
block.liquidtank.name=Liquid Tank
block.bridgeconduit.name=Bridge Conduit
block.mechanical-pump.name=Mechanical Pump
block.itemsource.name=Item Source
block.itemvoid.name=Item Void
block.liquidsource.name=Liquid Source
block.powervoid.name=Power Void
block.powerinfinite.name=Power Infinite
block.unloader.name=Unloader
block.sortedunloader.name=Sorted Unloader
block.vault.name=Vault
block.wave.name=Wave
block.swarmer.name=Swarmer
block.salvo.name=Salvo
block.ripple.name=Ripple
block.phase-conveyor.name=Phase Conveyor
block.bridge-conveyor.name=Bridge Conveyor
block.plastanium-compressor.name=Plastanium Compressor
block.pyratite-mixer.name=Pyratite Mixer
block.blast-mixer.name=Blast Mixer
block.solidifer.name=Solidifer
block.solar-panel.name=Solar Panel
block.solar-panel-large.name=Large Solar Panel
block.oil-extractor.name=Oil Extractor
block.javelin-ship-factory.name=Javelin Ship factory
block.drone-factory.name=Drone Factory
block.fabricator-factory.name=Fabricator Factory
block.repair-point.name=Repair Point
block.resupply-point.name=Resupply Point
block.pulse-conduit.name=Pulse Conduit
block.phase-conduit.name=Phase Conduit
block.liquid-router.name=Liquid Router
block.liquid-tank.name=Liquid Tank
block.liquid-junction.name=Liquid Junction
block.bridge-conduit.name=Bridge Conduit
block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,488 +1,495 @@
text.about = Stworzony przez [ROYAL] Anuken. []\nPierwotnie wpis w [orange] GDL [] MM Jam.\n\nNapisy:\n- SFX wykonane z pomocą [YELLOW] bfxr []\n- Muzyka wykonana przez [GREEN] RoccoW [] / znaleziona na [lime] FreeMusicArchive.org []\n\nSpecjalne podziękowania dla:\n- [coral] MitchellFJN []: obszerne testowanie i feedback\n- [niebo] Luxray5474 []: prace związane z wiki, pomoc z kodem\n- Wszystkich beta testerów na itch.io i Google Play\n
text.discord = Odwiedź nasz serwer Discord
text.gameover = Rdzeń został zniszczony.
text.highscore = [YELLOW] Nowy rekord!
text.lasted = Wytrwałeś do fali
text.level.highscore = Rekord: [accent]{0}
text.level.delete.title = Potwierdź kasowanie
text.level.delete = Czy na pewno chcesz usunąć mapę \"[orange]{0}\"?
text.level.select = Wybrany poziom
text.level.mode = Tryb gry:
text.savegame = Zapisz G
text.loadgame = Wczytaj grę
text.joingame = Gra wieloosobowa
text.quit = Wyjdź
text.about.button = O grze
text.name = Nazwa:
text.public = Publiczny
text.players = {0} graczy online
text.server.player.host = {0} (host)
text.players.single = {0} gracz online
text.server.mismatch = Błąd pakietu: możliwa niezgodność wersji klienta/serwera.\nUpewnij się, że Ty i host macie najnowszą wersję Mindustry!
text.server.closing = [accent] Zamykanie serwera ...
text.server.kicked.kick = Zostałeś wyrzucony z serwera!
text.server.kicked.invalidPassword = Nieprawidłowe hasło!
text.server.kicked.clientOutdated = Nieaktualna gra! Zaktualizują ją!
text.server.kicked.serverOutdated = Nieaktualna gra! Zaktualizują ją!
text.server.connected = {0} dołączył do gry .
text.server.disconnected = {0} został rozłączony.
text.nohost = Nie można hostować serwera na mapie niestandardowej!
text.hostserver = Serwer hosta
text.host = Host
text.hosting = [accent] Otwieranie serwera ...
text.hosts.refresh = Odśwież
text.hosts.discovering = Wyszukiwanie gier w sieci LAN
text.server.refreshing = Odświeżanie serwera
text.hosts.none = [lightgray] Brak serwerów w sieci LAN!
text.host.invalid = [scarlet] Nie można połączyć się z hostem.
text.server.friendlyfire = Bratobójczy ogień
text.server.add = Dodaj serwer
text.server.delete = Czy na pewno chcesz usunąć ten serwer?
text.server.hostname = Host: {0}
text.server.edit = Edytuj serwer
text.joingame.byip = Dołącz przez IP...
text.joingame.title = Dołącz do gry
text.joingame.ip = IP:
text.disconnect = Rozłączony.
text.connecting = [accent]Łączenie ...
text.connecting.data = [accent]Ładowanie danych świata...
text.connectfail = [crimson]Nie można połączyć się z serwerem: [orange] {0}
text.server.port = Port:
text.server.addressinuse = Adres jest już w użyciu!
text.server.invalidport = Nieprawidłowy numer portu.
text.server.error = [crimson] Błąd hostowania serwera: [orange] {0}
text.tutorial.back = < Cofnij
text.tutorial.next = Dalej >
text.save.new = Nowy zapis
text.save.overwrite = Czy na pewno chcesz nadpisać zapis gry?
text.overwrite = Nadpisz
text.save.none = Nie znaleziono zapisów gry!
text.saveload = [akcent]Zapisywanie...
text.savefail = Nie udało się zapisać gry!
text.save.delete.confirm = Czy na pewno chcesz usunąć ten zapis gry?
text.save.delete = Usuń
text.save.export = Eksportuj
text.save.import.invalid = [orange]Zapis gry jest niepoprawny!
text.save.import.fail = [crimson]Nie udało się zaimportować zapisu: [orange] {0}
text.save.export.fail = [crimson]Nie można wyeksportować zapisu: [orange] {0}
text.save.import = Importuj
text.save.newslot = Zapisz nazwę:
text.save.rename = Zmień nazwę
text.save.rename.text = Zmień nazwę
text.selectslot = Wybierz zapis.
text.slot = [accent]Slot {0}
text.save.corrupted = [orange]Zapis gry jest uszkodzony lub nieprawidłowy!
text.empty = <pusto>
text.on = Włączone
text.off = Wyłączone
text.save.autosave = Zapisywanie automatyczne
text.save.map = Mapa: {0}
text.save.wave = Fala: {0}
text.save.date = Ostatnio zapisano: {0}
text.confirm = Potwierdź
text.delete = Usuń
text.ok = Ok
text.open = Otwórz
text.cancel = Anuluj
text.openlink = Otwórz link
text.back = Wróć
text.quit.confirm = Czy na pewno chcesz wyjść?
text.loading = [accent]Ładowanie ...
text.wave = [orange]Fala {0}
text.wave.waiting = Fala w {0}
text.waiting = Oczekiwanie...
text.enemies = {0} wrogów
text.enemies.single = {0} wróg
text.loadimage = Załaduj obraz
text.saveimage = Zapisz obraz
text.editor.badsize = [orange]Nieprawidłowe wymiary obrazu![]\nWymiary poprawne: {0}
text.editor.errorimageload = Błąd podczas ładowania pliku obrazu: [orange]{0}
text.editor.errorimagesave = Błąd podczas zapisywania pliku obrazu: [orange]{0}
text.editor.generate = Generuj
text.editor.resize = Zmień rozmiar
text.editor.loadmap = Załaduj mapę
text.editor.savemap = Zapisz mapę
text.editor.loadimage = Załaduj obraz
text.editor.saveimage = Zapisz obraz
text.editor.unsaved = [scarlet]Masz niezapisane zmiany![]\nCzy na pewno chcesz wyjść?
text.editor.brushsize = Rozmiar pędzla: {0}
text.editor.noplayerspawn = Ta mapa nie ma ustawionego spawnu gracza!
text.editor.manyplayerspawns = Mapy nie mogą mieć więcej niż jeden punkt spawnu gracza!
text.editor.manyenemyspawns = Nie może mieć więcej niż {0} punktów spawnu wroga!
text.editor.resizemap = Zmień rozmiar mapy
text.editor.resizebig = [scarlet]Uwaga![]\nMapy większe niż 256 jednostek mogą przycinać i być niestabilne.
text.editor.mapname = Nazwa mapy:
text.editor.overwrite = [accent]Uwaga!\nSpowoduje to nadpisanie istniejącej mapy.
text.editor.failoverwrite = [crimson]Nie można nadpisać mapy podstawowej!
text.editor.selectmap = Wybierz mapę do załadowania:
text.width = Szerokość:
text.height = Wysokość:
text.randomize = Wylosuj
text.apply = Zastosuj
text.update = Zaktualizuj
text.menu = Menu
text.play = Graj
text.load = Wczytaj
text.save = Zapisz
text.language.restart = Uruchom grę ponownie aby ustawiony język zaczął funkcjonować.
text.settings.language = Język
text.settings = Ustawienia
text.tutorial = Poradnik
text.editor = Edytor
text.mapeditor = Edytor map
text.donate = Wspomóż nas
text.settings.reset = Przywróć domyślne
text.settings.controls = Sterowanie
text.settings.game = Gra
text.settings.sound = Dźwięk
text.settings.graphics = Grafika
text.upgrades = Ulepszenia
text.purchased = [LIME]Stworzono!
text.weapons = Bronie
text.paused = Wstrzymano
text.respawn = Odrodzenie za
text.info.title = [accent]Informacje
text.error.title = [crimson]Wystąpił błąd
text.error.crashmessage = [SCARLET]Wystąpił nieoczekiwany błąd, który spowodowałby awarię.[]\nProszę, powiadom dewelopera gry o tym błędzie, pisząc jak do niego doszło: [ORANGE]anukendev@gmail.com[]
text.error.crashtitle = Wystąpił błąd
text.mode.break = Tryb przerw: {0}
text.mode.place = Tryb układania: {0}
placemode.hold.name = linia
placemode.areadelete.name = obszar
placemode.touchdelete.name = Dotyk
placemode.holddelete.name = Przytrzymać
placemode.none.name = żaden
placemode.touch.name = Dotyk
placemode.cursor.name = kursor
text.blocks.extrainfo = [accent]Dodatkowe informacje o bloku:
text.blocks.blockinfo = Informacje o bloku
text.blocks.powercapacity = Moc znamionowa
text.blocks.powershot = moc / strzał
text.blocks.powersecond = moc / sekunda
text.blocks.powerdraindamage = siła ataku / obrażenia
text.blocks.shieldradius = Promień osłony
text.blocks.itemspeedsecond = prędkość / sekundy
text.blocks.range = Zakres
text.blocks.size = Rozmiar
text.blocks.powerliquid = moc / ciecz
text.blocks.maxliquidsecond = maksymalna ilość cieczy / sekunda
text.blocks.liquidcapacity = Pojemność cieczy
text.blocks.liquidsecond = ciecz / sekunda
text.blocks.damageshot = obrażenia / strzał
text.blocks.ammocapacity = Pojemność amunicji
text.blocks.ammo = Amunicja:
text.blocks.ammoitem = amunicja / przedmiot
text.blocks.maxitemssecond = Maksymalna liczba przedmiotów / Sekunda
text.blocks.powerrange = Zakres mocy
text.blocks.lasertilerange = Zasięg lasera
text.blocks.capacity = Wydajność
text.blocks.itemcapacity = Pojemność przedmiotów
text.blocks.maxpowergenerationsecond = maksymalne generowanie energii / sekunda
text.blocks.powergenerationsecond = wytwarzanie energii / sekunda
text.blocks.generationsecondsitem = sekunda / przedmiot
text.blocks.input = Wkład
text.blocks.inputliquid = Potrzebna ciecz
text.blocks.inputitem = Potrzebne przedmioty
text.blocks.output = Wyjście
text.blocks.secondsitem = sekundy / przedmiot
text.blocks.maxpowertransfersecond = maksymalny transfer mocy / sekundę
text.blocks.explosive = Wysoce wybuchowy!
text.blocks.repairssecond = naprawa / sekunda
text.blocks.health = Zdrowie
text.blocks.inaccuracy = Niedokładność
text.blocks.shots = Strzały
text.blocks.shotssecond = Strzały / Sekunda
text.blocks.fuel = Paliwo
text.blocks.fuelduration = Wydajność paliwa
text.blocks.maxoutputsecond = maksymalne wyjście / sekunda
text.blocks.inputcapacity = Pojemność wejściowa
text.blocks.outputcapacity = Wydajność wyjściowa
text.blocks.poweritem = moc / przedmiot
text.placemode = Tryb miejsca
text.breakmode = Tryb przerwania
text.health = Zdrowie:
setting.difficulty.easy = łatwy
setting.difficulty.normal = normalny
setting.difficulty.hard = trudny
setting.difficulty.insane = szalony
setting.difficulty.purge = Czystka
setting.difficulty.name = Poziom trudności
setting.screenshake.name = Trzęsienie się ekranu
setting.smoothcam.name = Płynna kamera
setting.indicators.name = Wskaźniki wroga
setting.effects.name = Wyświetlanie efektów
setting.sensitivity.name = Czułość kontrolera
setting.saveinterval.name = Interwał automatycznego zapisywania
setting.seconds = Sekundy
setting.fps.name = Widoczny licznik FPS
setting.vsync.name = Synchronizacja pionowa
setting.lasers.name = Pokaż lasery zasilające
setting.healthbars.name = Pokaż paski zdrowia jednostki
setting.pixelate.name = Rozpikselizowany obraz
setting.musicvol.name = Głośność muzyki
setting.mutemusic.name = Wycisz muzykę
setting.sfxvol.name = Głośność dźwięków
setting.mutesound.name = Wycisz dźwięki
map.maze.name = labirynt
map.fortress.name = twierdza
map.sinkhole.name = wgłębienie
map.caves.name = jaskinie
map.volcano.name = wulkan
map.caldera.name = kaldera
map.scorch.name = opalacz
map.desert.name = pustynia
map.island.name = wyspa
map.grassland.name = łąka
map.tundra.name = tundra
map.spiral.name = spirala
map.tutorial.name = Poradnik
tutorial.intro.text = [yellow]Witamy w poradniku do gry.[]\nAby rozpocząć, naciśnij \"Dalej\".
tutorial.moveDesktop.text = Aby się poruszać, użyj klawiszy [orange]W A S[] oraz [orange]D[]. Przytrzymaj [orange]shift[], aby przyśpieszyć.\nPrzytrzymując [orange]ctrl[] podczas kręcenia [orange]rolką myszy[] możesz zmieniać poziom przybliżenia mapy.
tutorial.shoot.text = Do celowania używasz kursora myszy.\n[orange]Lewy przycisk myszy[] służy do strzelania. Poćwicz na [yellow]celu[].
tutorial.moveAndroid.text = Aby przesunąć widok, przeciągnij jednym palcem po ekranie. Ściśnij i przeciągnij, aby powiększyć lub pomniejszyć.
tutorial.placeSelect.text = Wybierz [yellow]przenośnik[] z menu blokowego w prawym dolnym rogu.
tutorial.placeConveyorDesktop.text = Użyj [orange]rolki myszy[] aby obrócić przenośnik [orange]do przodu[], a następnie umieść go w [yellow]oznaczonym miejscu[] za pomocą [orange]lewego przycisku myszy[].
tutorial.placeConveyorAndroid.text = Użyj [orange]przycisk obracania[], aby obrócić przenośnik [orange]do przodu[]. Jednym palcem przeciągnij go na [yellow]wskazaną pozycję[], a następnie umieść go za pomocą [orange]znacznika wyboru[].
tutorial.placeConveyorAndroidInfo.text = Możesz też nacisnąć ikonę celownika w lewym dolnym rogu, aby przełączyć na [pomarańczowy] [[tryb dotykowy] [] i umieścić bloki, dotykając ekranu. W trybie dotykowym bloki można obracać strzałką w lewym dolnym rogu. Naciśnij [żółty] następny [], aby go wypróbować.
tutorial.placeDrill.text = Teraz wybierz i umieść [yellow]wiertło do kamienia[] w oznaczonym miejscu.
tutorial.blockInfo.text = Jeśli chcesz się dowiedzieć więcej na temat wybranego bloku, kliknij [orange]znak zapytania[] w prawym górnym rogu, aby przeczytać jego opis.
tutorial.deselectDesktop.text = Możesz anulować wybór bloku za pomocą [orange]prawego przycisku myszy[].
tutorial.deselectAndroid.text = Możesz odznaczyć blok, naciskając przycisk [orange]X[].
tutorial.drillPlaced.text = Wiertło będzie teraz produkować [yellow]kamień[] i podawać go na przenośnik, który przeniesie go do [yellow]rdzenia[]
tutorial.drillInfo.text = Różne rudy wymagają różnych wierteł. Kamień wymaga wiertła do kamieniu, żelazo wymaga wiertła do żelaza, itd.
tutorial.drillPlaced2.text = Przeniesienie przedmiotów do rdzenia powoduje umieszczenie ich w [yellow]inwentarzu przedmiotów[] w lewym górnym rogu. Stawianie bloków te przedmioty zużywa.
tutorial.moreDrills.text = Możesz połączyć wiertła i przenośników w przedstawiony sposób:
tutorial.deleteBlock.text = Możesz usuwać bloki, klikając [orange]prawy przycisk myszy[] na bloku, który chcesz usunąć.\nSpróbuj usunąć [yellow]oznaczony[] przenośnik.
tutorial.deleteBlockAndroid.text = Możesz usuwać bloki za pomocą [orange]krzyżyka[] w [orange]menu przerywania[] w lewym dolnym rogu i stukając w blok.\nSpróbuj usunąć [yellow]oznaczony[] przenośnik.
tutorial.placeTurret.text = Teraz wybierz i umieść [yellow]działko[] w [yellow]zaznaczonym miejscu[].
tutorial.placedTurretAmmo.text = Działko przyjmie teraz [yellow]amunicję[] z przenośnika. Możesz zobaczyć, ile ma amunicji, najeżdżając na działko kursorem i sprawdzając [green]zielony pasek[].
tutorial.turretExplanation.text = Wieżyczki będą strzelać automatycznie do najbliższego wroga w zasięgu, o ile będą miały wystarczającą ilość amunicji.
tutorial.waves.text = Co każde [yellow]60[] sekund, fala [coral]wrogów[] pojawi się w określonym miejscu na mapie i spróbuje zniszczyć rdzeń.
tutorial.coreDestruction.text = Twoim celem jest [yellow]obrona rdzenia[]. Zniszczenie rdzenia jest równoznaczne z [coral]przegraną[].
tutorial.pausingDesktop.text = Jeśli chcesz zrobić przerwę, naciśnij [orange]spację[] lub [orange]przycisk pauzy[] w lewym górnym rogu. Nadal możesz wybierać i wstawiać klocki podczas pauzy, ale nie możesz niszczyć i strzelać.
tutorial.pausingAndroid.text = Jeśli chcesz zrobić przerwę, naciśnij [orange]przycisk pauzy[]. Nadal możesz stawiać i niszczyć bloki.
tutorial.purchaseWeapons.text = Możesz kupić nowe [żółte] bronie [] dla swojego mecha, otwierając menu aktualizacji w lewym dolnym rogu.
tutorial.switchWeapons.text = Zmień broń, klikając jej ikonę w lewym dolnym rogu lub używając cyfr [orange][1-9[].
tutorial.spawnWave.text = Fala wrogów nadchodzi! Zniszcz ich.
tutorial.pumpDesc.text = W późniejszych falach może być konieczne użycie [yellow]pompy[] do rozprowadzania cieczy dla generatorów lub ekstraktorów.
tutorial.pumpPlace.text = Pompy działają podobnie do wierteł, z tym wyjątkiem, że wytwarzają ciecze zamiast ród.\nSpróbuj umieścić pompę na [yellow]oleju[].
tutorial.conduitUse.text = Teraz umieść [orange]rurę[] wychodzącą od pompy.
tutorial.conduitUse2.text = I tak jeszcze jedną...
tutorial.conduitUse3.text = I jeszcze jedeną...
tutorial.generator.text = Teraz umieść [orange]generator spalinowy[] na końcu kanału.
tutorial.generatorExplain.text = Generator ten będzie teraz wytwarzać [yellow]energię[] z oleju.
tutorial.lasers.text = Energia jest dystrybuowana za pomocą [yellow]przekaźników[]. Umieść takowy przekaźnik na [yellow]wskazanej pozycji[].
tutorial.laserExplain.text = Generator przeniesie teraz moc do przekaźnika. Wiązka [orange]nieprzeźroczysta[] oznacza, że aktualnie transmituje moc. Wiązka [yellow]przeźroczysta[] wskazuje na brak przekazywanej energii.
tutorial.laserMore.text = Możesz sprawdzić ile energii przechowuje blok najeżdżając na niego kursorem i sprawdzając [yellow]żółty pasek[].
tutorial.healingTurret.text = Energia może być używany do zasilania [lime]wież naprawczych[]. Umieść takową [yellow]tutaj[].
tutorial.healingTurretExplain.text = Dopóki dostarczana jest do niej energia będzie [lime]naprawiać pobliskie bloki[]. Podczas gry ustawiłeś ją niedaleko swojej bazy tak szybko, jak to tylko możliwe!
tutorial.smeltery.text = Wiele bloków wymaga do pracy [orange]stali[], którą można wytwarzać w [orange]hucie[]. A skoro tak, to postaw ją teraz.
tutorial.smelterySetup.text = Huta wytworzy teraz z żelaza [orange]stal[], wykorzystując węgiel jako paliwo.
tutorial.tunnelExplain.text = Zwróć też uwagę, że przedmioty przechodzą przez [orange]tunel[] i wynurzają się po drugiej stronie, przechodząc przez kamienny blok. Pamiętaj, że tunele mogą przechodzić tylko do 2 bloków.
tutorial.end.text = I na tym poradnik się kończy!\nPozostaje tylko życzyć Ci [orange]powodzenia[]!
keybind.move_x.name = Poruszanie w poziomie
keybind.move_y.name = Poruszanie w pionie
keybind.select.name = Wybieranie
keybind.break.name = Niszczenie
keybind.shoot.name = Strzelanie
keybind.zoom_hold.name = Inicjator przybliżania
keybind.zoom.name = Przybliżanie
keybind.menu.name = menu
keybind.pause.name = pauza
keybind.dash.name = przyśpieszenie
keybind.rotate_alt.name = Obracanie (1)
keybind.rotate.name = Obracanie (2)
keybind.weapon_1.name = Broń 1
keybind.weapon_2.name = Broń 2
keybind.weapon_3.name = Broń 3
keybind.weapon_4.name = Broń 4
keybind.weapon_5.name = Broń 5
keybind.weapon_6.name = Broń 6
mode.waves.name = Fale
mode.sandbox.name = sandbox
mode.freebuild.name = budowanie
upgrade.standard.name = Standardowy
upgrade.standard.description = Standardowy mech.
upgrade.blaster.name = blaster
upgrade.blaster.description = Wystrzeliwuje powolną, słabą kulę.
upgrade.triblaster.name = triblaster
upgrade.triblaster.description = Strzela 3 pociskami w rozprzestrzenianiu.
upgrade.clustergun.name = clustergun
upgrade.clustergun.description = Wystrzeliwuje w różnych kierunkach kilka granatów.
upgrade.beam.name = Działko laserowe
upgrade.beam.description = Strzela laserem o dalekim zasięgu.
upgrade.vulcan.name = wulkan
upgrade.vulcan.description = Wystrzeliwuje grad szybkich pocisków.
upgrade.shockgun.name = Działko elektryczne
upgrade.shockgun.description = Wystrzeliwuje niszczycielski podmuch naładowanych odłamków.
item.stone.name = kamień
item.iron.name = żelazo
item.coal.name = węgiel
item.steel.name = stal
item.titanium.name = tytan
item.dirium.name = dirium
item.thorium.name = uran
item.sand.name = piasek
liquid.water.name = woda
liquid.plasma.name = plazma
liquid.lava.name = lawa
liquid.oil.name = olej
block.weaponfactory.name = fabryka broni
block.air.name = Powietrze.
block.blockpart.name = Kawałek bloku
block.deepwater.name = głęboka woda
block.water.name = woda
block.lava.name = lawa
block.oil.name = olej
block.stone.name = kamień
block.blackstone.name = czarny kamień
block.iron.name = żelazo
block.coal.name = węgiel
block.titanium.name = tytan
block.thorium.name = uran
block.dirt.name = ziemia
block.sand.name = piasek
block.ice.name = lód
block.snow.name = śnieg
block.grass.name = trawa
block.sandblock.name = blok z piasku
block.snowblock.name = blok ze śniegu
block.stoneblock.name = blok z kamienia
block.blackstoneblock.name = blok z czarnego kamienia
block.grassblock.name = blok z trawy
block.mossblock.name = porośnięty blok
block.shrub.name = krzew
block.rock.name = kamyk
block.icerock.name = kamyk lodowy
block.blackrock.name = czarny kamyk
block.dirtblock.name = Brudny blok
block.stonewall.name = Kamienna ściana
block.stonewall.fulldescription = Tani blok obronny. Przydatny do ochrony rdzenia i wież w pierwszych kilku falach.
block.ironwall.name = Żelazna ściana
block.ironwall.fulldescription = Podstawowy blok obronny. Zapewnia ochronę przed wrogami.
block.steelwall.name = stalowa ściana
block.steelwall.fulldescription = Standardowy blok obronny. odpowiednia ochrona przed wrogami.
block.titaniumwall.name = tytanowa ściana
block.titaniumwall.fulldescription = Silny blok obronny. Zapewnia ochronę przed wrogami.
block.duriumwall.name = ściana z dirium
block.duriumwall.fulldescription = Bardzo silny blok obronny. Zapewnia ochronę przed wrogami.
block.compositewall.name = ściana kompozytowa
block.steelwall-large.name = duża stalowa ściana
block.steelwall-large.fulldescription = Standardowy blok obronny. Rozpiętość wielu płytek.
block.titaniumwall-large.name = duża tytanowa ściana
block.titaniumwall-large.fulldescription = Silny blok obronny. Rozpiętość wielu płytek.
block.duriumwall-large.name = duża ściana z dirium
block.duriumwall-large.fulldescription = Bardzo silny blok obronny. Rozpiętość wielu płytek.
block.titaniumshieldwall.name = Ściana z polem obronnym
block.titaniumshieldwall.fulldescription = Silny blok obronny z dodatkową wbudowaną tarczą. Wymaga zasilania. Używa energii do pochłaniania pocisków wroga. W celu dostarczenia zasilania zaleca się stosowanie wzmacniaczy energii.
block.repairturret.name = Wieża naprawcza
block.repairturret.fulldescription = Naprawia pobliskie uszkodzone bloki w niedużej prędkości. Wykorzystuje niewielkie ilości energii.
block.megarepairturret.name = Wieża naprawcza II
block.megarepairturret.fulldescription = Naprawia pobliskie uszkodzone bloki z przyzwoitą prędkośą. Do działania wykorzystuje energię.
block.shieldgenerator.name = Generator tarczy
block.shieldgenerator.fulldescription = Zaawansowany blok obronny. Osłania wszystkie bloki w promieniu przed atakiem wroga. Zużywa energię z niewielką prędkością gdy jest w stanie bezczynności, ale z kolei gdy jest w użyciu, energię pobiera bardzo szybko.
block.door.name = drzwi
block.door.fulldescription = Blok, który można otworzyć i zamknąć poprzez dotknięcie
block.door-large.name = duże drzwi
block.door-large.fulldescription = Blok, który można otworzyć i zamknąć poprzez dotknięcie
block.conduit.name = Rura
block.conduit.fulldescription = Podstawowy blok transportu cieczy. Działa jak przenośnik, tylko że z płynami. Najlepiej stosować z pompami bądź razem innymi rurami.\nMoże być używany jako pomost nad płynami dla wrogów i graczy.
block.pulseconduit.name = Rura impulsowa
block.pulseconduit.fulldescription = Zaawansowany blok transportu cieczy. Transportuje ciecze szybciej i przechowuje więcej niż rury standardowe.
block.liquidrouter.name = Rozdzielacz płynów
block.liquidrouter.fulldescription = Działa podobnie do zwykłego rozdzielacza. Akceptuje wejście cieczy z jednej strony i przekazuje ją na pozostałe strony. Przydatny do rozdzielania cieczy z jednej rury do wielu.
block.conveyor.name = Przenośnik
block.conveyor.fulldescription = Podstawowy blok transportu przedmiotów. Przenosi przedmioty do przodu i automatycznie umieszcza je w blokach. Może być używany jako pomost nad płynami dla wrogów i graczy.
block.steelconveyor.name = Przenośnik stalowy
block.steelconveyor.fulldescription = Zaawansowany blok transportu przedmiotów. Przenosi elementy szybciej niż standardowe przenośniki.
block.poweredconveyor.name = przenośnik impulsowy
block.poweredconveyor.fulldescription = Najszybszy blok transportowy przedmiotów.
block.router.name = Rozdzielacz
block.router.fulldescription = Przyjmuje przedmioty z jednego kierunku i przekazuje je w 3 innych kierunkach. Może również przechowywać pewną liczbę przedmiotów. Przydatny do dzielenia materiałów z jednego wiertła na wiele dział.
block.junction.name = węzeł
block.junction.fulldescription = Działa jako pomost dla dwóch skrzyżowanych przenośników taśmowych. Przydatny w sytuacjach, gdy dwa różne przenośniki przenoszą różne materiały do różnych lokalizacji.
block.conveyortunnel.name = tunel przenośnikowy
block.conveyortunnel.fulldescription = Transportuje przedmiot pod blokami. Aby użyć, umieść jeden tunel prowadzący do bloku, który ma zostać tunelowany, i jeden po drugiej stronie. Upewnij się, że oba tunele są skierowane w przeciwnych kierunkach, czyli w wejście do bloku podającego, a wyjście do bloku odbierającego.
block.liquidjunction.name = Węzeł dla płynów
block.liquidjunction.fulldescription = Skrzyżowanie dla rurociągów. Przydatne w sytuacji, w której transportujemy różne ciecze w rurach, które muszą się przeciąć.
block.liquiditemjunction.name = Węzeł rur i przenośników
block.liquiditemjunction.fulldescription = Skrzyżowanie przenośników taśmowych oraz rur.
block.powerbooster.name = Wzmacniacz energii
block.powerbooster.fulldescription = Dystrybuuje moc do wszystkich bloków w swoim promieniu.
block.powerlaser.name = Przekaźnik
block.powerlaser.fulldescription = Tworzy laser, który przesyła moc do bloku przed nim. Nie generuje energii. Najlepiej stosować z generatorami lub innymi przekaźnikami.
block.powerlaserrouter.name = Duży rozdzielacz energii
block.powerlaserrouter.fulldescription = Przekaźnik, który dystrybuuje energię w trzech kierunkach jednocześnie. Przydatne w sytuacjach, w których wymagane jest zasilanie wielu bloków z jednego generatora.
block.powerlasercorner.name = Rozdzielacz energii
block.powerlasercorner.fulldescription = Przekaźnik, który dystrybuuje energię w dwóch kierunkach jednocześnie. Przydatny w sytuacjach, gdy wymagane jest zasilanie wielu bloków z jednego generatora, a router jest nieprecyzyjny.
block.teleporter.name = teleporter
block.teleporter.fulldescription = Zaawansowany blok transportu przedmiotów. Teleporty przenoszą przedmioty do innych teleportów tego samego koloru. Jeżeli nie istnieją teleporty z tym samym kolorem, to nie niczego nigdzie nie przenosi. Jeśli istnieje wiele teleportów tego samego koloru, wybierany jest losowy. Zużywa energię. Stuknij aby zmienić kolor.
block.sorter.name = Sortownik
block.sorter.fulldescription = Sortuje przedmioty według rodzaju materiału. Materiał do zaakceptowania jest oznaczony w bloku. Wszystkie pasujące przedmioty są wysyłane do przodu, wszystko inne jest wyprowadzane na lewo i na prawo.
block.core.name = Rdzeń
block.pump.name = pompa
block.pump.fulldescription = Pompuje ciecze z bloku źródłowego - zwykle wody, lawy lub oleju. Wyprowadza ciecz do pobliskich rur.
block.fluxpump.name = pompa strumieniowa
block.fluxpump.fulldescription = Zaawansowana wersja pompy. Przechowuje więcej cieczy i szybciej pompuje.
block.smelter.name = huta
block.smelter.fulldescription = Niezbędny blok rzemieślniczy. Po wprowadzeniu 1 żelaza i 1 węgla jako paliwa, wytwarza 1 stal. Zaleca się wprowadzanie żelaza i węgla na różne pasy, aby zapobiec zatkaniu.
block.crucible.name = tygiel
block.crucible.fulldescription = Zaawansowany blok rzemieślniczy. Po wprowadzeniu 1 tytanu, 1 stali i 1 węgla jako paliwa, otrzymuje 1 dirium. Zaleca się wprowadzanie węgla, stali i tytanu z różnych taśm, aby zapobiec zatkaniu.
block.coalpurifier.name = ekstraktor węgla
block.coalpurifier.fulldescription = Wyprowadza węgiel, gdy jest dostarczana duża ilością wody i kamienia.
block.titaniumpurifier.name = ekstraktor tytanu
block.titaniumpurifier.fulldescription = Wyprowadza tytan, gdy jest dostarczana duża ilości wody i żelaza.
block.oilrefinery.name = Rafineria ropy
block.oilrefinery.fulldescription = Rafinuje duże ilości oleju do postaci węgla. Przydatne do napędzania działek napędzanych węglem, gry nie ma w pobliżu wystarcząjacej ilości rud węgla.
block.stoneformer.name = Wytwarzacz kamienia
block.stoneformer.fulldescription = Schładza lawę do postaci kamień. Przydatny do produkcji ogromnych ilości kamienia do oczyszczania węgla.
block.lavasmelter.name = Huta lawowa
block.lavasmelter.fulldescription = Używa lawy, by przekształcić żelazo w stal. Alternatywa dla zwykłych hut. Przydatny w sytuacjach, gdy brakuje węgla.
block.stonedrill.name = wiertło do kamienia
block.stonedrill.fulldescription = Niezbędne wiertło. Po umieszczeniu na kamiennym podłożu, powoli i w nieskończoność wydobywa kamień.
block.irondrill.name = wiertło do żelaza
block.irondrill.fulldescription = Po umieszczeniu na rudzie żelaza, powoli i w nieskończoność wydobywa żelazo.
block.coaldrill.name = wiertło do węgla
block.coaldrill.fulldescription = Po umieszczeniu na rudzie węgla, powoli i w nieskończoność wydobywa węgiel.
block.thoriumdrill.name = wiertło do uranu
block.thoriumdrill.fulldescription = Wiertło zaawansowane. Po umieszczeniu na rudzie uranu, wydobywa uran w wolnym tempie przez czas nieokreślony.
block.titaniumdrill.name = wiertło do tytanu
block.titaniumdrill.fulldescription = Wiertło zaawansowane. Po umieszczeniu na rudzie tytanu, wydobywa tytan w wolnym tempie przez czas nieokreślony.
block.omnidrill.name = omnidril
block.omnidrill.fulldescription = Wiertło wielofunkcyjne. W szybkim tempie wydobywa każdą rudę.
block.coalgenerator.name = generator na węgiel
block.coalgenerator.fulldescription = Niezbędny generator. Generuje energię z węgla na wszystkie strony.
block.thermalgenerator.name = generator termiczny
block.thermalgenerator.fulldescription = Generuje energię z lawy. Generuje energię z węgla na wszystkie strony.
block.combustiongenerator.name = generator spalinowy
block.combustiongenerator.fulldescription = Generuje moc z oleju. Generuje energię z węgla na wszystkie strony.
block.rtgenerator.name = Generator RTG
block.rtgenerator.fulldescription = Generuje niewielkie ilości energii z rozpadu promieniotwórczego uranu. Generuje energię z węgla na wszystkie strony.
block.nuclearreactor.name = reaktor jądrowy
block.nuclearreactor.fulldescription = Zaawansowana wersja generatora RTG i zarazem najlepsze źródło energii. Generuje ją z uranu. Wymaga stałego chłodzenia wodą. Wybucha niemal natychmiast w momencie, gdy dostarczona zostanie niewystarczająca ilość płynu chłodzącego.
block.turret.name = działko
block.turret.fulldescription = Podstawowa, nieduża wieżyczka. Używa kamienia jako amunicji. Ma nieco większy zasięg niż działko podwójne.
block.doubleturret.name = działko podwójne
block.doubleturret.fulldescription = Nieco mocniejsza wersja działka. Używa kamienia jako amunicji. Znacznie więcej obrażeń, ale ma mniejszy zasięg. Wystrzeliwuje dwie kule.
block.machineturret.name = działko szybkostrzelne
block.machineturret.fulldescription = Standardowa, wszechstronna wieża. Używa żelaza jako amunicji. Strzela dość szybko i ma przyzwoite uszkodzenia.
block.shotgunturret.name = działko odłamkowe
block.shotgunturret.fulldescription = Standardowa wieża. Używa żelaza do amunicji. Wystrzeliwuje 7 pocisków. Niższy zasięg, ale większe obrażenia niż działko szybkostrzelne.
block.flameturret.name = miotacz ognia
block.flameturret.fulldescription = Zaawansowana wieżyczka bliskiego zasięgu. Używa węgla jako amunicji. Ma bardzo niski zasięg, ale bardzo duże obrażenia. Dobra na krótkie dystanse. Zalecana do stosowania za ścianami.
block.sniperturret.name = karabin
block.sniperturret.fulldescription = Zaawansowana wieżyczka dalekiego zasięgu. Używa stali jako amunicji. Ma bardzo duże obrażenia, ale niski współczynnik ognia. Kosztowne w użyciu, ale można je umieścić z dala od linii wroga ze względu na jego zasięg.
block.mortarturret.name = Miotacz odłamków
block.mortarturret.fulldescription = Zaawansowana, bardzo dokładne działko rozpryskowe. Używa węgla jako amunicji. Wystrzeliwuje grad eksplodujących pocisków. Przydatny dla dużych hord wrogów.
block.laserturret.name = działo laserowe
block.laserturret.fulldescription = Zaawansowana wieża z jednym celem. Używa energii. Dobra wieża o średnim zasięgu. Atakuje tylko 1 cel i nigdy nie pudłuje.
block.waveturret.name = Działo Tesli
block.waveturret.fulldescription = Zaawansowana wieża celującai. Używa mocy. Średni zasięg. Nigdy nie trafia. Stosuje niskie obrażenia, ale może trafić wielu wrogów jednocześnie z oświetleniem łańcuszkiem.
block.plasmaturret.name = Działo plazmowe
block.plasmaturret.fulldescription = Wysoce zaawansowana wersja miotacza ognia. Używa węgla jako amunicji. Zadaje bardzo duże obrażenia i posiada średni zasięg.
block.chainturret.name = Działo uranowe
block.chainturret.fulldescription = Najlepsze działo szybkiego ognia. Używa uranu jako amunicji. Wystrzeliwuje duże spirale z dużą szybkością. Posiada średni zasięg.
block.titancannon.name = Potężne działo uranowe
block.titancannon.fulldescription = Najlepsze działo dalekiego zasięgu. Używa uranu jako amunicji. Wystrzeliwuje duże pociski z odłamkami. Ma średnią szybkostrzelność i duży promień rażenia.
block.playerspawn.name = Spawn gracza
block.enemyspawn.name = Spawn wroga
text.about=Stworzony przez [ROYAL] Anuken. []\nPierwotnie wpis w [orange] GDL [] MM Jam.\n\nNapisy:\n- SFX wykonane z pomocą [YELLOW] bfxr []\n- Muzyka wykonana przez [GREEN] RoccoW [] / znaleziona na [lime] FreeMusicArchive.org []\n\nSpecjalne podziękowania dla:\n- [coral] MitchellFJN []: obszerne testowanie i feedback\n- [niebo] Luxray5474 []: prace związane z wiki, pomoc z kodem\n- Wszystkich beta testerów na itch.io i Google Play\n
text.discord=Odwiedź nasz serwer Discord
text.gameover=Rdzeń został zniszczony.
text.highscore=[YELLOW] Nowy rekord!
text.lasted=Wytrwałeś do fali
text.level.highscore=Rekord: [accent]{0}
text.level.delete.title=Potwierdź kasowanie
text.level.select=Wybrany poziom
text.level.mode=Tryb gry:
text.savegame=Zapisz Grę
text.loadgame=Wczytaj g
text.joingame=Gra wieloosobowa
text.quit=Wyjdź
text.about.button=O grze
text.name=Nazwa:
text.players={0} graczy online
text.players.single={0} gracz online
text.server.mismatch=Błąd pakietu: możliwa niezgodność wersji klienta/serwera.\nUpewnij się, że Ty i host macie najnowszą wersję Mindustry!
text.server.closing=[accent] Zamykanie serwera ...
text.server.kicked.kick=Zostałeś wyrzucony z serwera!
text.server.kicked.invalidPassword=Nieprawidłowe hasło!
text.server.kicked.clientOutdated=Nieaktualna gra! Zaktualizują ją!
text.server.kicked.serverOutdated=Nieaktualna gra! Zaktualizują ją!
text.server.connected={0} dołączył do gry .
text.server.disconnected={0} został rozłączony.
text.nohost=Nie można hostować serwera na mapie niestandardowej!
text.hostserver=Serwer hosta
text.host=Host
text.hosting=[accent] Otwieranie serwera ...
text.hosts.refresh=Odśwież
text.hosts.discovering=Wyszukiwanie gier w sieci LAN
text.server.refreshing=Odświeżanie serwera
text.hosts.none=[lightgray] Brak serwerów w sieci LAN!
text.host.invalid=[scarlet] Nie można połączyć się z hostem.
text.server.friendlyfire=Bratobójczy ogień
text.server.add=Dodaj serwer
text.server.delete=Czy na pewno chcesz usunąć ten serwer?
text.server.hostname=Host: {0}
text.server.edit=Edytuj serwer
text.joingame.title=Dołącz do gry
text.joingame.ip=IP:
text.disconnect=Rozłączony.
text.connecting=[accent]Łączenie ...
text.connecting.data=[accent]Ładowanie danych świata...
text.connectfail=[crimson]Nie można połączyć się z serwerem: [orange] {0}
text.server.port=Port:
text.server.addressinuse=Adres jest już w użyciu!
text.server.invalidport=Nieprawidłowy numer portu.
text.server.error=[crimson] Błąd hostowania serwera: [orange] {0}
text.save.new=Nowy zapis
text.save.overwrite=Czy na pewno chcesz nadpisać zapis gry?
text.overwrite=Nadpisz
text.save.none=Nie znaleziono zapisów gry!
text.saveload=[akcent]Zapisywanie...
text.savefail=Nie udało się zapisać gry!
text.save.delete.confirm=Czy na pewno chcesz usunąć ten zapis gry?
text.save.delete=Usuń
text.save.export=Eksportuj
text.save.import.invalid=[orange]Zapis gry jest niepoprawny!
text.save.import.fail=[crimson]Nie udało się zaimportować zapisu: [orange] {0}
text.save.export.fail=[crimson]Nie można wyeksportować zapisu: [orange] {0}
text.save.import=Importuj
text.save.newslot=Zapisz nazwę:
text.save.rename=Zmień nazwę
text.save.rename.text=Zmień nazwę
text.selectslot=Wybierz zapis.
text.slot=[accent]Slot {0}
text.save.corrupted=[orange]Zapis gry jest uszkodzony lub nieprawidłowy!
text.empty=<pusto>
text.on=Włączone
text.off=Wyłączone
text.save.autosave=Zapisywanie automatyczne
text.save.map=Mapa: {0}
text.save.wave=Fala: {0}
text.save.date=Ostatnio zapisano: {0}
text.confirm=Potwierdź
text.delete=Usuń
text.ok=Ok
text.open=Otwórz
text.cancel=Anuluj
text.openlink=Otwórz link
text.back=Wróć
text.quit.confirm=Czy na pewno chcesz wyjść?
text.loading=[accent]Ładowanie ...
text.wave=[orange]Fala {0}
text.wave.waiting=Fala w {0}
text.waiting=Oczekiwanie...
text.enemies={0} wrogów
text.enemies.single={0} wróg
text.loadimage=Załaduj obraz
text.saveimage=Zapisz obraz
text.editor.badsize=[orange]Nieprawidłowe wymiary obrazu![]\nWymiary poprawne: {0}
text.editor.errorimageload=Błąd podczas ładowania pliku obrazu: [orange]{0}
text.editor.errorimagesave=Błąd podczas zapisywania pliku obrazu: [orange]{0}
text.editor.generate=Generuj
text.editor.resize=Zmień rozmiar
text.editor.loadmap=Załaduj mapę
text.editor.savemap=Zapisz mapę
text.editor.loadimage=Załaduj obraz
text.editor.saveimage=Zapisz obraz
text.editor.unsaved=[scarlet]Masz niezapisane zmiany![]\nCzy na pewno chcesz wyjść?
text.editor.resizemap=Zmień rozmiar mapy
text.editor.mapname=Nazwa mapy:
text.editor.overwrite=[accent]Uwaga!\nSpowoduje to nadpisanie istniejącej mapy.
text.editor.selectmap=Wybierz mapę do załadowania:
text.width=Szerokość:
text.height=Wysokość:
text.menu=Menu
text.play=Graj
text.load=Wczytaj
text.save=Zapisz
text.language.restart=Uruchom grę ponownie aby ustawiony język zaczął funkcjonować.
text.settings.language=Język
text.settings=Ustawienia
text.tutorial=Poradnik
text.editor=Edytor
text.mapeditor=Edytor map
text.donate=Wspomóż nas
text.settings.reset=Przywróć domyślne
text.settings.controls=Sterowanie
text.settings.game=Gra
text.settings.sound=Dźwięk
text.settings.graphics=Grafika
text.upgrades=Ulepszenia
text.purchased=[LIME]Stworzono!
text.weapons=Bronie
text.paused=Wstrzymano
text.info.title=[accent]Informacje
text.error.title=[crimson]Wystąpił błąd
text.error.crashtitle=Wystąpił błąd
text.blocks.blockinfo=Informacje o bloku
text.blocks.powercapacity=Moc znamionowa
text.blocks.powershot=moc / strzał
text.blocks.size=Rozmiar
text.blocks.liquidcapacity=Pojemność cieczy
text.blocks.maxitemssecond=Maksymalna liczba przedmiotów / Sekunda
text.blocks.powerrange=Zakres mocy
text.blocks.itemcapacity=Pojemność przedmiotów
text.blocks.inputliquid=Potrzebna ciecz
text.blocks.inputitem=Potrzebne przedmioty
text.blocks.explosive=Wysoce wybuchowy!
text.blocks.health=Zdrowie
text.blocks.inaccuracy=Niedokładność
text.blocks.shots=Strzały
text.blocks.inputcapacity=Pojemność wejściowa
text.blocks.outputcapacity=Wydajność wyjściowa
setting.difficulty.easy=łatwy
setting.difficulty.normal=normalny
setting.difficulty.hard=trudny
setting.difficulty.insane=szalony
setting.difficulty.purge=Czystka
setting.difficulty.name=Poziom trudności
setting.screenshake.name=Trzęsienie się ekranu
setting.indicators.name=Wskaźniki wroga
setting.effects.name=Wyświetlanie efektów
setting.sensitivity.name=Czułość kontrolera
setting.saveinterval.name=Interwał automatycznego zapisywania
setting.seconds=Sekundy
setting.fps.name=Widoczny licznik FPS
setting.vsync.name=Synchronizacja pionowa
setting.lasers.name=Pokaż lasery zasilające
setting.healthbars.name=Pokaż paski zdrowia jednostki
setting.musicvol.name=Głośność muzyki
setting.mutemusic.name=Wycisz muzykę
setting.sfxvol.name=Głośność dźwięków
setting.mutesound.name=Wycisz dźwięki
map.maze.name=labirynt
map.fortress.name=twierdza
map.sinkhole.name=wgłębienie
map.caves.name=jaskinie
map.volcano.name=wulkan
map.caldera.name=kaldera
map.scorch.name=opalacz
map.desert.name=pustynia
map.island.name=wyspa
map.grassland.name=łąka
map.tundra.name=tundra
map.spiral.name=spirala
map.tutorial.name=Poradnik
keybind.move_x.name=Poruszanie w poziomie
keybind.move_y.name=Poruszanie w pionie
keybind.select.name=Wybieranie
keybind.break.name=Niszczenie
keybind.shoot.name=Strzelanie
keybind.zoom_hold.name=Inicjator przybliżania
keybind.zoom.name=Przybliżanie
keybind.menu.name=menu
keybind.pause.name=pauza
keybind.dash.name=przyśpieszenie
keybind.rotate_alt.name=Obracanie (1)
keybind.rotate.name=Obracanie (2)
mode.waves.name=Fale
mode.sandbox.name=sandbox
mode.freebuild.name=budowanie
item.stone.name=kamień
item.coal.name=węgiel
item.titanium.name=tytan
item.thorium.name=uran
item.sand.name=piasek
liquid.water.name=woda
liquid.lava.name=lawa
liquid.oil.name=olej
block.door.name=drzwi
block.door-large.name=duże drzwi
block.conduit.name=Rura
block.pulseconduit.name=Rura impulsowa
block.liquidrouter.name=Rozdzielacz płynów
block.conveyor.name=Przenośnik
block.router.name=Rozdzielacz
block.junction.name=węzeł
block.liquidjunction.name=Węzeł dla płynów
block.sorter.name=Sortownik
block.smelter.name=huta
text.credits=Credits
text.link.discord.description=the official Mindustry discord chatroom
text.link.github.description=Game source code
text.link.dev-builds.description=Unstable development builds
text.link.trello.description=Official trello board for planned features
text.link.itch.io.description=itch.io page with PC downloads and web version
text.link.google-play.description=Google Play store listing
text.link.wiki.description=official Mindustry wiki
text.linkfail=Failed to open link!\nThe URL has been copied to your cliboard.
text.editor.web=The web version does not support the editor!\nDownload the game to use it.
text.web.unsupported=The web version does not support this feature! Download the game to use it.
text.multiplayer.web=This version of the game does not support multiplayer!\nTo play multiplayer from your browser, use the "multiplayer web version" link at the itch.io page.
text.host.web=The web version does not support hosting games! Download the game to use this feature.
text.map.delete=Are you sure you want to delete the map "[orange]{0}[]"?
text.construction.title=Block Construction Guide
text.construction=You've just selected [accent]block construction mode[].\n\nTo begin placing, simply tap a valid location near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Shift the selection[] by holding and dragging any block in the selection.\n- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel construction or selection[] by pressing the X at the bottom left.
text.deconstruction.title=Block Deconstruction Guide
text.deconstruction=You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left.
text.showagain=Don't show again next session
text.unlocks=Unlocks
text.addplayers=Add/Remove Players
text.newgame=New Game
text.maps=Maps
text.maps.none=[LIGHT_GRAY]No maps found!
text.unlocked=New Block Unlocked!
text.unlocked.plural=New Blocks Unlocked!
text.server.kicked.fastShoot=You are shooting too quickly.
text.server.kicked.banned=You are banned on this server.
text.server.kicked.recentKick=You have been kicked recently.\nWait before connecting again.
text.server.kicked.nameInUse=There is someone with that name\nalready on this server.
text.server.kicked.nameEmpty=Your name must contain at least one character or number.
text.server.kicked.idInUse=You are already on this server! Connecting with two accounts is not permitted.
text.server.kicked.customClient=This server does not support custom builds. Download an official version.
text.host.info=The [accent]host[] button hosts a server on ports [scarlet]6567[] and [scarlet]6568.[]\nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings.
text.join.info=Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[LIGHT_GRAY]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
text.trace=Trace Player
text.trace.playername=Player name: [accent]{0}
text.trace.ip=IP: [accent]{0}
text.trace.id=Unique ID: [accent]{0}
text.trace.android=Android Client: [accent]{0}
text.trace.modclient=Custom Client: [accent]{0}
text.trace.totalblocksbroken=Total blocks broken: [accent]{0}
text.trace.structureblocksbroken=Structure blocks broken: [accent]{0}
text.trace.lastblockbroken=Last block broken: [accent]{0}
text.trace.totalblocksplaced=Total blocks placed: [accent]{0}
text.trace.lastblockplaced=Last block placed: [accent]{0}
text.invalidid=Invalid client ID! Submit a bug report.
text.server.bans=Bans
text.server.bans.none=No banned players found!
text.server.admins=Admins
text.server.admins.none=No admins found!
text.server.outdated=[crimson]Outdated Server![]
text.server.outdated.client=[crimson]Outdated Client![]
text.server.version=[lightgray]Version: {0}
text.server.custombuild=[yellow]Custom Build
text.confirmban=Are you sure you want to ban this player?
text.confirmunban=Are you sure you want to unban this player?
text.confirmadmin=Are you sure you want to make this player an admin?
text.confirmunadmin=Are you sure you want to remove admin status from this player?
text.disconnect.data=Failed to load world data!
text.save.difficulty=Difficulty: {0}
text.copylink=Copy Link
text.changelog.title=Changelog
text.changelog.loading=Getting changelog...
text.changelog.error.android=[orange]Note that the changelog sometimes does not work on Android 4.4 and below!\nThis is due to an internal Android bug.
text.changelog.error.ios=[orange]The changelog is currently not supported in iOS.
text.changelog.error=[scarlet]Error getting changelog!\nCheck your internet connection.
text.changelog.current=[yellow][[Current version]
text.changelog.latest=[orange][[Latest version]
text.saving=[accent]Saving...
text.unknown=Unknown
text.custom=Custom
text.builtin=Built-In
text.map.delete.confirm=Are you sure you want to delete this map? This action cannot be undone!
text.map.random=[accent]Random Map
text.map.nospawn=This map does not have any cores for the player to spawn in! Add a [ROYAL]blue[] core to this map in the editor.
text.editor.slope=\\
text.editor.openin=Open In Editor
text.editor.oregen=Ore Generation
text.editor.oregen.info=Ore Generation:
text.editor.mapinfo=Map Info
text.editor.author=Author:
text.editor.description=Description:
text.editor.name=Name:
text.editor.teams=Teams
text.editor.elevation=Elevation
text.editor.saved=Saved!
text.editor.save.noname=Your map does not have a name! Set one in the 'map info' menu.
text.editor.save.overwrite=Your map overwrites a built-in map! Pick a different name in the 'map info' menu.
text.editor.import.exists=[scarlet]Unable to import:[] a built-in map named '{0}' already exists!
text.editor.import=Import...
text.editor.importmap=Import Map
text.editor.importmap.description=Import an already existing map
text.editor.importfile=Import File
text.editor.importfile.description=Import an external map file
text.editor.importimage=Import Terrain Image
text.editor.importimage.description=Import an external map image file
text.editor.export=Export...
text.editor.exportfile=Export File
text.editor.exportfile.description=Export a map file
text.editor.exportimage=Export Terrain Image
text.editor.exportimage.description=Export a map image file
text.editor.overwrite.confirm=[scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
text.fps=FPS: {0}
text.tps=TPS: {0}
text.ping=Ping: {0}ms
text.settings.rebind=Rebind
text.yes=Yes
text.no=No
text.blocks.targetsair=Targets Air
text.blocks.itemspeed=Units Moved
text.blocks.shootrange=Range
text.blocks.poweruse=Power Use
text.blocks.inputitemcapacity=Input Item Capacity
text.blocks.outputitemcapacity=Input Item Capacity
text.blocks.maxpowergeneration=Max Power Generation
text.blocks.powertransferspeed=Power Transfer
text.blocks.craftspeed=Production Speed
text.blocks.inputliquidaux=Aux Liquid
text.blocks.inputitems=Input Items
text.blocks.outputitem=Output Item
text.blocks.drilltier=Drillables
text.blocks.drillspeed=Base Drill Speed
text.blocks.liquidoutput=Liquid Output
text.blocks.liquiduse=Liquid Use
text.blocks.coolant=Coolant
text.blocks.coolantuse=Coolant Use
text.blocks.inputliquidfuel=Fuel Liquid
text.blocks.liquidfueluse=Liquid Fuel Use
text.blocks.reload=Reload
text.blocks.inputfuel=Fuel
text.blocks.fuelburntime=Fuel Burn Time
text.unit.blocks=blocks
text.unit.powersecond=power units/second
text.unit.liquidsecond=liquid units/second
text.unit.itemssecond=items/second
text.unit.pixelssecond=pixels/second
text.unit.liquidunits=liquid units
text.unit.powerunits=power units
text.unit.degrees=degrees
text.unit.seconds=seconds
text.unit.none=
text.unit.items=items
text.category.general=General
text.category.power=Power
text.category.liquids=Liquids
text.category.items=Items
text.category.crafting=Crafting
text.category.shooting=Shooting
setting.fullscreen.name=Fullscreen
setting.multithread.name=Multithreading
setting.minimap.name=Show Minimap
text.keybind.title=Rebind Keys
keybind.block_info.name=block_info
keybind.chat.name=chat
keybind.player_list.name=player_list
keybind.console.name=console
mode.text.help.title=Description of modes
mode.waves.description=the normal mode. limited resources and automatic incoming waves.
mode.sandbox.description=infinite resources and no timer for waves.
mode.freebuild.description=limited resources and no timer for waves.
content.item.name=Items
content.liquid.name=Liquids
content.unit-type.name=Units
content.recipe.name=Blocks
item.stone.description=A common raw material. Used for separating and refining into other materials, or melting into lava.
item.tungsten.name=Tungsten
item.tungsten.description=A common, but very useful structure material. Used in drills and heat-resistant blocks such as generators and smelteries.
item.lead.name=Lead
item.lead.description=A basic starter material. Used extensively in electronics and liquid transportation blocks.
item.coal.description=A common and readily available fuel.
item.carbide.name=Carbide
item.carbide.description=A tough alloy made with tungsten and carbon. Used in advanced transportation blocks and high-tier drills.
item.titanium.description=A rare super-light metal used extensively in liquid transportation, drills and aircraft.
item.thorium.description=A dense, radioactive metal used as structural support and nuclear fuel.
item.silicon.name=Silicon
item.silcion.description=An extremely useful semiconductor, with applications in solar panels and many complex electronics.
item.plastanium.name=Plastanium
item.plastanium.description=A light, ductile material used in advanced aircraft and fragmentation ammunition.
item.phase-matter.name=Phase Matter
item.surge-alloy.name=Surge Alloy
item.biomatter.name=Biomatter
item.biomatter.description=A clump of organic mush; used for conversion into oil or as a basic fuel.
item.sand.description=A common material that is used extensively in smelting, both in alloying and as a flux.
item.blast-compound.name=Blast Compound
item.blast-compound.description=A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised.
item.pyratite.name=Pyratite
item.pyratite.description=An extremely flammable substance used in incendiary weapons.
liquid.cryofluid.name=Cryofluid
text.item.explosiveness=[LIGHT_GRAY]Explosiveness: {0}
text.item.flammability=[LIGHT_GRAY]Flammability: {0}
text.item.radioactivity=[LIGHT_GRAY]Radioactivity: {0}
text.item.fluxiness=[LIGHT_GRAY]Flux Power: {0}
text.item.hardness=[LIGHT_GRAY]Hardness: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]Heat Capacity: {0}
text.liquid.viscosity=[LIGHT_GRAY]Viscosity: {0}
text.liquid.temperature=[LIGHT_GRAY]Temperature: {0}
block.tungsten-wall.name=Tungsten Wall
block.tungsten-wall-large.name=Large Tungsten Wall
block.carbide-wall.name=Carbide Wall
block.carbide-wall-large.name=Large Carbide Wall
block.thorium-wall.name=Thorium Wall
block.thorium-wall-large.name=Large Thorium Wall
block.duo.name=Duo
block.scorch.name=Scorch
block.hail.name=Hail
block.lancer.name=Lancer
block.titanium-conveyor.name=Titanium Conveyor
block.splitter.name=Splitter
block.splitter.description=Outputs items into two opposite directions immediately after they are recieved.
block.router.description=Splits items into all 4 directions. Can store items as a buffer.
block.distributor.name=Distributor
block.distributor.description=A splitter that can split items into 8 directions.
block.sorter.description=Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right.
block.overflow-gate.name=Overflow Gate
block.overflow-gate.description=A combination splitter and router that only outputs to the left and right if the front path is blocked.
block.bridgeconveyor.name=Bridge Conveyor
block.bridgeconveyor.description=A conveyor that can go over other blocks, for up to two total blocks.
block.arc-smelter.name=Arc Smelter
block.silicon-smelter.name=Silicon Smelter
block.phase-weaver.name=Phase Weaver
block.pulverizer.name=Pulverizer
block.cryofluidmixer.name=Cryofluid Mixer
block.melter.name=Melter
block.incinerator.name=Incinerator
block.biomattercompressor.name=Biomatter Compressor
block.separator.name=Separator
block.centrifuge.name=Centrifuge
block.power-node.name=Power Node
block.power-node-large.name=Large Power Node
block.battery.name=Battery
block.battery-large.name=Large Battery
block.combustion-generator.name=Combustion Generator
block.turbine-generator.name=Turbine Generator
block.tungsten-drill.name=Tungsten Drill
block.carbide-drill.name=Carbide Drill
block.laser-drill.name=Laser Drill
block.water-extractor.name=Water Extractor
block.cultivator.name=Cultivator
block.dart-ship-factory.name=Dart Ship Factory
block.delta-mech-factory.name=Delta Mech Factory
block.dronefactory.name=Drone Factory
block.repairpoint.name=Repair Point
block.resupplypoint.name=Resupply Point
block.liquidtank.name=Liquid Tank
block.bridgeconduit.name=Bridge Conduit
block.mechanical-pump.name=Mechanical Pump
block.itemsource.name=Item Source
block.itemvoid.name=Item Void
block.liquidsource.name=Liquid Source
block.powervoid.name=Power Void
block.powerinfinite.name=Power Infinite
block.unloader.name=Unloader
block.sortedunloader.name=Sorted Unloader
block.vault.name=Vault
block.wave.name=Wave
block.swarmer.name=Swarmer
block.salvo.name=Salvo
block.ripple.name=Ripple
block.phase-conveyor.name=Phase Conveyor
block.bridge-conveyor.name=Bridge Conveyor
block.plastanium-compressor.name=Plastanium Compressor
block.pyratite-mixer.name=Pyratite Mixer
block.blast-mixer.name=Blast Mixer
block.solidifer.name=Solidifer
block.solar-panel.name=Solar Panel
block.solar-panel-large.name=Large Solar Panel
block.oil-extractor.name=Oil Extractor
block.javelin-ship-factory.name=Javelin Ship factory
block.drone-factory.name=Drone Factory
block.fabricator-factory.name=Fabricator Factory
block.repair-point.name=Repair Point
block.resupply-point.name=Resupply Point
block.pulse-conduit.name=Pulse Conduit
block.phase-conduit.name=Phase Conduit
block.liquid-router.name=Liquid Router
block.liquid-tank.name=Liquid Tank
block.liquid-junction.name=Liquid Junction
block.bridge-conduit.name=Bridge Conduit
block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.

View File

@@ -3,9 +3,8 @@ text.discord=Junte-se ao Discord do Mindustry! (Lá nós falamos em inglês)
text.gameover=O núcleo foi destruído.
text.highscore=[YELLOW]Novo recorde!
text.lasted=Você durou até a horda
text.level.highscore= Melhor\npontuação: [accent] {0}
text.level.highscore=Melhor\npontuação: [accent] {0}
text.level.delete.title=Confirmar exclusão
text.level.delete=Você tem certeza que quer excluir\no mapa "[orange]{0}"?
text.level.select=Seleção de Fase
text.level.mode=Modo de Jogo:
text.savegame=Salvar Jogo
@@ -33,7 +32,6 @@ text.loading=[accent]Carregando...
text.wave=[orange]Horda {0}
text.wave.waiting=Horda em {0}
text.waiting=Aguardando...
text.countdown=Horda em {0}
text.enemies={0} Inimigos restantes
text.enemies.single={0} Inimigo restante
text.loadimage=Carregar\nImagem
@@ -48,21 +46,12 @@ text.editor.savemap=Salvar\n Mapa
text.editor.loadimage=Carregar\n Imagem
text.editor.saveimage=Salvar\nImagem
text.editor.unsaved=[scarlet]Você tem alterações não salvas![]\nTem certeza que quer sair?
text.editor.brushsize=Tamanho do pincel: {0}
text.editor.noplayerspawn=Este mapa não tem ponto de spawn para o jogador!
text.editor.manyplayerspawns=Mapas não podem ter mais de um\nponto de spawn para jogador!
text.editor.manyenemyspawns=Não pode haver mais de\n{0} pontos de spawn para inimigos!
text.editor.resizemap=Redimensionar Mapa
text.editor.resizebig=[scarlet]Aviso!\n[]Mapas maiores que 256 unidades podem ser 'lentos' e instáveis
text.editor.mapname=Nome do Mapa:
text.editor.overwrite=[accent]Aviso!\nIsso sobrescreve um mapa existente.
text.editor.failoverwrite=[crimson]Não é possível salvar sobre o mapa padrão!
text.editor.selectmap=Selecione uma mapa para carregar:
text.width=Largura:
text.height=Altura:
text.randomize=Aleatório
text.apply=Aplicar
text.update=Atualizar
text.menu=Menu
text.play=Jogar
text.load=Carregar
@@ -81,58 +70,27 @@ text.upgrades=Melhorias
text.purchased=[LIME]Comprado!
text.weapons=Arsenal
text.paused=Pausado
text.respawn=Reaparecendo em
text.error.title=[crimson]Um erro ocorreu
text.error.crashmessage=[SCARLET]Um erro inesperado aconteceu, que pode ter causado o jogo a fechar. []Por favor, informe as exatas circunstâncias em que o erro ocorreu ao desenvolvidor:\n[ORANGE]anukendev@gmail.com[]
text.error.crashtitle=Um erro ocorreu.
text.blocks.extrainfo=[accent]Informação extra:
text.blocks.blockinfo=Informação do Bloco
text.blocks.powercapacity=Capacidade de Energia
text.blocks.powershot=Energia/tiro
text.blocks.powersecond=Energia/segundo
text.blocks.powerdraindamage=Energia/dano
text.blocks.shieldradius=Raio do Escudo
text.blocks.itemspeedsecond=Itens/segundo
text.blocks.range=Alcance
text.blocks.size=Tamanho
text.blocks.powerliquid=Energia/Líquido
text.blocks.maxliquidsecond=Entrada Máx. Líquido/segundo
text.blocks.liquidcapacity=Capacidade de Líquido
text.blocks.liquidsecond=Líquido/segundo
text.blocks.damageshot=Dano/tiro
text.blocks.ammocapacity=Munição Máxima
text.blocks.ammo=Munição
text.blocks.ammoitem=Munição/item
text.blocks.maxitemssecond=Máximo de itens/segundo
text.blocks.powerrange=Alcance da Energia
text.blocks.lasertilerange=Alcance do Laser (em células)
text.blocks.capacity=Capacidade
text.blocks.itemcapacity=Capacidade de Itens
text.blocks.powergenerationsecond=Geração de Energia/segundo
text.blocks.generationsecondsitem=Tempo de geração/item
text.blocks.input=Entrada
text.blocks.inputliquid=Líquido de entrada
text.blocks.inputitem=Item de entrada
text.blocks.output=Saída
text.blocks.secondsitem=Segundos/item
text.blocks.maxpowertransfersecond=Transferência máxima de Energia/segundo
text.blocks.explosive=Altamente Explosivo!
text.blocks.repairssecond=Reparo/segundo
text.blocks.health=Saúde
text.blocks.inaccuracy=Imprecisão
text.blocks.shots=Tiros
text.blocks.shotssecond=Taxa de tiro
text.placemode=Modo construção
text.breakmode=Modo remoção
text.health=Saúde
setting.difficulty.easy=Fácil
setting.difficulty.normal=Normal
setting.difficulty.hard=Difícil
setting.difficulty.name=Dificuldade
setting.screenshake.name=Balanço da Tela
#Tremor da tela?
setting.smoothcam.name=Câmera suave
#Suavizar Câmera?
setting.indicators.name=Indicadores de Inimigos
setting.effects.name=Particulas
setting.sensitivity.name=Sensibilidade do Controle
@@ -140,7 +98,6 @@ setting.fps.name=Mostrar FPS
setting.vsync.name=VSync
setting.lasers.name=Mostrar lasers
setting.healthbars.name=Mostrar barra de saúde de entidades
setting.pixelate.name=Pixelar Tela
setting.musicvol.name=Volume da Música
setting.mutemusic.name=Desligar Musica
setting.sfxvol.name=Volume de Efeitos
@@ -158,54 +115,10 @@ map.grassland.name=grassland
map.tundra.name=tundra
map.spiral.name=spiral
map.tutorial.name=tutorial
tutorial.intro.text=[yellow]Bem-vindo ao tutorial.[] Para começar aperte 'próximo'.
tutorial.moveDesktop.text=Para mover, use as teclas [orange][[WASD][]. Segure [orange]shift[] para mover rápido. Segure [orange]CTRL[] enquanto usa a [orange]roda do mouse[] para aumentar ou diminuir o zoom.
tutorial.shootInternal.text=Use o mouse para mirar, segure [orange]botão esquerdo do mouse[] para atirar. Tente praticar no [yellow]alvo[].
tutorial.moveAndroid.text=Para arrastar a visão, passe um dedo pela tela. Pince com os dedos para aumentar ou diminuir o zoom.
tutorial.placeSelect.text=Tente selecionar uma [yellow]esteira[] do menu de blocos no canto inferior direito.
tutorial.placeConveyorDesktop.text=Use a [orange][[roda do mouse][] para girar a esteira até que aponte [orange]para frente[], então coloque-a no [yellow]local marcado[] usando o [orange][[botão esquerdo do mouse][].
tutorial.placeConveyorAndroid.text=Use o [orange][[botão de girar][] para girar a esteira para que aponte [orange]para frente[], arraste-a para a posição e então coloque-a na [yellow]posição marcada[] usando o [orange][[botão de confirmação][].
tutorial.placeConveyorAndroidInfo.text=Você também pode apertar no ícone com uma cruz no canto inferior esquerdo para alterar para o [orange][[modo de toque][], e colocar blocos apertando na tela. No modo de toque, blocos podem ser girados com a seta no canto inferior esquerdo. Aperte [yellow]próximo[] para tentar.
tutorial.placeDrill.text=Agora selecione e coloque uma [yellow]broca de pedra[] no local marcado.
tutorial.blockInfo.text=Se quiser saber mais sobre os blocos, você pode apertar o [orange]símbolo de interrogação[] no canto superior direito para ler mais.
tutorial.deselectDesktop.text=Você pode cancelar a seleção de um bloco usando o [orange][botão direito do mouse[].
tutorial.deselectAndroid.text=ocê pode cancelar a seleção de um bloco apertando o botão [orange]X[].
tutorial.drillPlaced.text=A broca produzirá [yellow]pedra[], direcionando o produzido para a esteira a qual moverá a pedra para o [yellow]núcleo[].
tutorial.drillInfo.text=Minérios diferentes precisam de diferentes brocas. Pedra precisam de brocas de pedra, Ferro de brocas de ferro, etc.
tutorial.drillPlaced2.text=Itens movidos para o núcleo são colocados em seu [yellow]inventário[], no canto superior esquerdo. Colocar blocos gasta os recursos do inventário.
tutorial.moreDrills.text=Você pode conectar várias brocas e esteiras, veja.
tutorial.deleteBlock.text=Você pode excluir blocos clickando com o [orange]botão direito do mouse[] no bloco que quiser destruir. Tente excluir esta esteira.
tutorial.deleteBlockAndroid.text=Você pode excluir blocos [orange]apertando na cruz[] no [orange]menu modo de quebra[] no canto inferior esquerdo e então apertando no bloco desejado. Tente excluir esta esteira.
tutorial.placeTurret.text=Agora, selecione e construa uma [yellow]torre[] no [yellow]local marcado[].
tutorial.placedTurretAmmo.text=Esta torre aceitará [yellow]munição[] da esteira. Você pode ver quanta munição elas tem passando o mouse sobre elas e verificando a [green]barra verde[].
tutorial.turretExplanation.text=As torres irão atirar no inimigo mais próximo que estiver ao alcance, contanto que tenham munição suficiente.
tutorial.waves.text=A cada [yellow]60[] segundos, uma horda de [coral]inimigos[] irá aparecer em locais específicos e tentará destruir o núcleo.
tutorial.coreDestruction.text=Seu objetivo é [yellow]defender o núcleo[]. Se o núcleo for destruído, vecê [coral]perde o jogo[].
tutorial.pausingDesktop.text=Se você precisar parar por alguns instantes, aperte o [orange]botão de pausa[] no canto superior esquerdo ou [orange]barra de espaço[] para pausar o jogo. Você pode colocar blocos enquanto o jogo esta pausado, porém não poderá se mover ou atirar.
tutorial.pausingAndroid.text=Se você precisar parar por alguns instantes, aperte o [orange]botão de pausa[] no canto superior esquerdo ou [orange]barra de espaço[] para pausar o jogo. Você pode colocar blocos enquanto o jogo esta pausado.
tutorial.purchaseWeapons.text=Você pode comprar novas [yellow]armas[] para seu mecha, basta abrir o menu de melhorias no canto inferior esquerdo.
tutorial.switchWeapons.text=Alterne entre suas armas clickando em seu ícone ou usando as teclas numéricas [orange][[1-9][].
tutorial.spawnWave.text=Uma horda esta vindo. Destrúa-os.
tutorial.pumpDesc.text=Em hordas mais avançadas, você talvez precise de [yellow]bombas[] para distribuir líquidos para geradores ou extratores.
tutorial.pumpPlace.text=Bombas trabalham de forma semelhante às brocas, porém elas produzem líquidos ao envés de minérios. Tente colocar uma bomba na [yellow]célula de petróleo designada[].
tutorial.conduitUse.text=Agora coloque um [orange]cano[] levando para longe da bomba.
tutorial.conduitUse2.text=E mais alguns...
tutorial.conduitUse3.text=E mais alguns...
tutorial.generator.text=Agora coloque um [orange]gerador a combustão[] no final do cano.
tutorial.generatorExplain.text=Este gerador irá produzir [yellow]energia[] do petróleo.
tutorial.lasers.text=Energia é distribuida usando [yellow]lasers[]. Gire e coloque um aqui.
tutorial.laserExplain.text=O gerador irá mover energia para o bloco do laser. Um feixe [yellow]opaco[] significa que a energia está sendo transmitida, e um feixe [yellow]transparente[] significa que não.
tutorial.laserMore.text=Você pode verificar quanta energia um bloco tem ao passar o mouse sobre eles e verificando a [yellow]barra amarela[] no topo.
tutorial.healingTurret.text=Este laser pode ser usado para energizar uma [lime]torre de reparo[]. Coloque uma aqui.
tutorial.healingTurretExplain.text=Enquanto tiver energia, esta torre irá [lime]reparar blocos próximos.[] Quando jogar, tenha certeza de construir uma dessas próximas do núcleo o mais rápido possível!
tutorial.smeltery.text=Muitos blocos precisam de [orange]aço[] para serem construídos, o que requer uma [orange]fundidora[] para ser feito. Coloque uma aqui.
tutorial.smelterySetup.text=Esta fundidora irá produzir [orange]aço[] quando receber carvão e ferro.
tutorial.end.text=E este é o fim do Tutorial! Boa Sorte!
keybind.move_x.name=move_x
keybind.move_y.name=move_y
keybind.select.name=selecionar
keybind.break.name=quebrar
keybind.shootInternal.name=atirar
keybind.zoom_hold.name=segurar_zoom
keybind.zoom.name=zoom
keybind.menu.name=menu
@@ -213,259 +126,370 @@ keybind.pause.name=pausar
keybind.dash.name=Correr
keybind.rotate_alt.name=girar_alt*
keybind.rotate.name=girar
keybind.weapon_1.name=Arma 1
keybind.weapon_2.name=Arma 2
keybind.weapon_3.name=Arma 3
keybind.weapon_4.name=Arma 4
keybind.weapon_5.name=Arma 5
keybind.weapon_6.name=Arma 6
mode.waves.name=hordas
mode.sandbox.name=sandbox
#CAIXINHA DE AREIA
mode.freebuild.name=construção \nlivre
weapon.blaster.name=Blaster
weapon.blaster.description=Atira um projétil lento e fraco.
weapon.triblaster.name=Blaster Triplo
weapon.triblaster.description=Atira 3 balas que se espalham.
weapon.multigun.name=Escopeta
weapon.multigun.description=Atira balas com baixa precisão e uma\n alta taxa de disparo.
weapon.flamer.name=Lança-Chamas
weapon.railgun.name=Rifle Sniper
weapon.flamer.description=É um lança-chamas. O que mais ele faria?
weapon.railgun.description=Atira um projétil de longo alcance.
weapon.mortar.name=Morteiro
weapon.mortar.description=Atira um projétil lento, porém devastador.
item.stone.name=Pedra
item.iron.name=Ferro
item.coal.name=Carvão
item.steel.name=Aço
item.titanium.name=Titânio
item.dirium.name=Dírio
item.thorium.name=Urânio
liquid.water.name=Água
liquid.plasma.name=Plasma
liquid.lava.name=Lava
liquid.oil.name=Petróleo
block.air.name=Ar
block.blockpart.name=blockpart
#que?
block.deepwater.name=Água Profunda
block.water.name=Água
block.lava.name=Lava
block.oil.name=Petróleo
block.stone.name=Pedra
block.blackstone.name=Pedra Escura
block.iron.name=Ferro
block.coal.name=Carvão
block.titanium.name=Titânio
block.thorium.name=Urânio
block.dirt.name=Terra
block.sand.name=Areia
block.ice.name=Gelo
block.snow.name=Neve
block.grass.name=Grama
block.sandblock.name=Bloco de Areia
block.snowblock.name=Bloco de Neve
block.stoneblock.name=Rocha
block.blackstoneblock.name=Rocha Escura
block.grassblock.name=Bloco de Grama
block.mossblock.name=Musgo
block.shrub.name=Arbusto
block.rock.name=Rocha
block.icerock.name=Rocha de Gelo
block.blackrock.name=Rocha Escura
block.dirtblock.name=Bloco de Terra
block.stonewall.name=Parede de Pedra
block.stonewall.fulldescription=Um bloco defensivo barato. Útil para proteger o núcleo e torres nas primeiras hordas.
block.ironwall.name=Parede de Ferro
block.ironwall.fulldescription=Um bloco defensivo básico. Fornece proteção contra inimigos.
block.steelwall.name=Parede de aço
block.steelwall.fulldescription=Um bloco defensivo padrão. Fornece proteção contra inimigos.
block.titaniumwall.name=Parede de Titânio
block.titaniumwall.fulldescription=Um bloco defensivo forte. Fornece proteção contra inimigos.
block.duriumwall.name=Parede de Dírio
block.duriumwall.fulldescription=Um bloco defensivo muito forte. Fornece proteção contra inimigos.
block.compositewall.name=Parede de Composto
block.compositewall.fulldescription= Um bloco defensivo extremamente forte. Fornece a melhor proteção contra inimigos.
block.steelwall-large.name=Parede Grande de Aço
block.steelwall-large.fulldescription=Um bloco defensivo padrão. Ocupa multiplas células.
block.titaniumwall-large.name=Parede Grande de Titânio
block.titaniumwall-large.fulldescription=Um bloco defensivo forte. Ocupa multiplas células.
block.duriumwall-large.name=Parede Grande de Dírio
block.duriumwall-large.fulldescription=Um bloco defensivo muito forte. Ocupa multiplas células.
block.titaniumshieldwall.name=Parede com Escudo
block.titaniumshieldwall.fulldescription=Um bloco defensivo forte, com um escudo de energia imbutido. Usa energia passivamente e para absorver projéteis inimigos. É recomendado usar distribuidores de energia para abastecer este bloco.
#A strong defensive block, with an extra built-in shield. Requires power. Uses energy to absorb enemy bullets. It is recommended to use power boosters to provide energy to this block.
block.repairturret.name=Torre de Reparo
block.repairturret.fulldescription=Lentamente repara blocos danificados dentro do seu alcance. Consome um pouco de energia.
#Repairs nearby damaged blocks in range at a slow rate. Uses small amounts of power.
block.repairturret.description=[powerinfo]Consome Energia.[white]\nRepara blocos próximos.
block.megarepairturret.name=Torre de Reparo II
block.megarepairturret.fulldescription=Repara blocos danificados dentro do seu alcance. Consome um pouco de energia.
block.megarepairturret.description=[powerinfo]Consome Energia.[white]\nRepara blocos próximos.
block.shieldgenerator.name=Gerador de Escudo
block.shieldgenerator.fulldescription= Um bloco defensivo avançado. Protege todos os blocos em um raio. Lentamente usa energia quando parado, mas rapidamente drena em contato com projéteis.
#An advanced defensive block. Shields all the blocks in a radius from attack. Uses power at a slow rate when idle, but drains energy quickly on bullet contact.
block.door.name=Porta
block.door.fulldescription=Um bloco que pode ser aberto e fechado ao tocar nele.
block.door.description=Abre e Fecha.\n[interact]Toque para alternar o estado.
block.door-large.name=Porta Grande
block.door-large.fulldescription=Um bloco que pode ser aberto e fechado ao tocar nele.
block.door-large.description=Abre e Fecha.\n[interact]Toque para alternar o estado.
block.conduit.name=Cano
block.conduit.fulldescription=Bloco de transporte de líquido básico. Funciona como uma esteira, mas com líquidos. Pode ser usado como uma ponte para inimigos e jogadores.
#Basic liquid transport block. Works like a conveyor, but with liquids. Best used with pumps or other conduits. Can be used as a bridge over liquids for enemies and players.
block.pulseconduit.name=Cano de impulso
block.pulseconduit.fulldescription=Bloco de transporte de líquido avançado. Transporta líquidos mais rapidamente e armazena mais que canos normais.
#Advanced liquid transport block. Transports liquids faster and stores more than standard conduits.
block.liquidrouter.name=Roteador de líquido
block.liquidrouter.fulldescription=Aceita líquido de uma direção e o redireciona para as outras 3 direções. Útil para dividir o líquido entre vários canos.
#Works similarly to a router. Accepts liquid input from one side and outputs it to the other sides. Useful for splitting liquid from a single conduit into multiple other conduits.
block.liquidrouter.description=Divide líquidos em 3 direções.
block.conveyor.name=Esteira
block.conveyor.fulldescription=Bloco de transporte básico. Movimenta itens para frente e automaticamente os deposita em torres ou blocos de fabricação. Pode ser girado. Pode ser usado como uma ponte para inimigos e jogadores.
#Basic item transport block. Moves items forward and automatically deposits them into turrets or crafters. Rotatable. Can be used as a bridge over liquids for enemies and players.
block.steelconveyor.name=Esteira de aço
block.steelconveyor.fulldescription=Bloco de transporte avançado. Movimenta itens mais rapidamente que esteiras normais.
#Advanced item transport block. Moves items faster than standard conveyors.
block.poweredconveyor.name=Esteira de Impulso
block.poweredconveyor.fulldescription=O Bloco supremo de transporte. Movimenta itens mais rapidamente que esteiras de aço.
#The ultimate item transport block. Moves items faster than carbide conveyors.
block.router.name=Roteador
block.router.fulldescription=Aceita itens de uma direção e os redireciona para as outras 3 direções. Pode guardar uma certa quantidade de itens. Útil para dividir materiais entre várias torres.
block.router.description=Divide materiais em 3 direções.
block.junction.name=Junção
block.junction.fulldescription=Funciona como uma ponte para 2 linhas de esteiras que se cruzam. Útil em situações onde duas esteiras carregam diferentes materiais para diferentes locais.
block.junction.description=Funciona como uma junção para as esteiras.
block.conveyortunnel.name=Túnel de esteira
block.conveyortunnel.fulldescription=Transporta itens por baixo de blocos. Para usar coloque um túnel apontado para o bloco que deseja passar por baixo, e outro apontado para o primeiro túnel.
block.conveyortunnel.description=Transporta intes por baixo de blocos.
block.liquidjunction.name=Junção de líquido
block.liquidjunction.fulldescription=Funciona como uma ponte para 2 canos que se cruzam. Útil em situações onde 2 canos diferentes carregam diferentes líquidos para diferentes locais.
block.liquiditemjunction.name=liquid-item junction
block.liquiditemjunction.fulldescription=Acts as a bridge for crossing conduits and conveyors.
block.liquiditemjunction.description=Serves as a junction for items and liquids.
block.powerbooster.name=Distribuidor de energia
block.powerbooster.fulldescription=Distribui energia para todos os blocos dentro de seu raio.
block.powerbooster.description=Distribui energia em um raio.
block.powerlaser.name=Laser
#Laser de energia?
block.powerlaser.fulldescription=Cria um laser que transmite energia para o bloco à sua frente. Melhor usado com geradores ou outros lasers. Não gera energia.
block.powerlaser.description=Transmite energia.
block.powerlaserrouter.name=laser duplo
block.powerlaserrouter.fulldescription=Divide a entrada de energia em 3 lasers. Útil em situações onde é necessário conectar muitos blocos a partir de um gerador.
block.powerlaserrouter.description=Divide a entrada de energia em 3 lasers.
block.powerlasercorner.name=laser triplo
#*Essa nomeação ficou escrota
block.powerlasercorner.fulldescription=Laser que distribui energia para duas direções ao mesmo tempo. Útil em situações onde é necessário conectar muitos blocos a partir de um gerador.
block.powerlasercorner.description=Divide a entrada de energia em 2 lasers.
block.teleporter.name=Teleportador
block.teleporter.fulldescription=Bloco avançado de transporte de itens. Teleportadores transferem itens para outros teleportadores da mesma cor. Não faz nada se não houverem outros da mesma cor. Se houverem múltiplos da mesma cor, um aleatório será selecionado. Toque nas flechas para mudar de cor.
block.teleporter.description=[interact]Tap block to config[]
block.sorter.name=Ordenador
block.sorter.fulldescription=Separa itens pelo tipo de material. O material a ser aceito é indicado pela cor do bloco. Todos os itens que correspondem ao material a ser separado são direcionados para frente, todo o resto é direcionado para os lados.
block.sorter.description=[interact]Aperte no bloco para configurar[]
block.core.name=núcleo
block.pump.name=bomba
block.pump.fulldescription=Bombeia líquidos de um bloco, geralmente água, lava ou petróleo. Os líquidos são bombeados para canos próximos.
block.pump.description=Bombeia líquidos para canos próximos.
block.fluxpump.name=Bomba de fluxo
block.fluxpump.fulldescription=Uma versão avançada da bomba comum. Guarda mais líquido e bombeia mais rápido.
block.fluxpump.description=Bombeia líquidos para canos próximos.
block.smelter.name=Fornalha
block.smelter.fulldescription=O bloco de produção essencial. Quando recebe 1 carvão e\n1 ferro produz 1 aço
block.smelter.description=Converte carvão + ferro em aço.
block.crucible.name=Usina de fundição
block.crucible.fulldescription=Um bloco de produção avançado. Quando recebe 1 titânio e 1 aço produz 1 dírio.
block.crucible.description=Converte aço + titânio em dírio.
block.coalpurifier.name=Extrator de carvão
block.coalpurifier.fulldescription=Um bloco extrator básico. Produz carvão quando fornecido com grandes quantidades de água e pedra.
block.coalpurifier.description=Converte pedra + água em carvão.
block.titaniumpurifier.name=Extrator de titânio
block.titaniumpurifier.fulldescription=Um bloco extrator padrão. Produz titânio quando fornecido com grandes quantidas de água e ferro.
block.titaniumpurifier.description=Converte água e ferro em titânio.
block.oilrefinery.name=Refinaria de Petróleo
block.oilrefinery.fulldescription=Refina grande quantidades de petróleo para produzir carvão. Útil para abastecer torres que utilizam carvão quando jazidas de carvão são escassas.
block.oilrefinery.description=Converte petróleo em carvão.
block.stoneformer.name=Formador de Pedra
block.stoneformer.fulldescription=Solidifica lava para formar pedra. Útil para produzir grandes quantidades de pedra para extratores de carvão.
block.stoneformer.description=Converte lava em pedra.
block.lavasmelter.name=Fornalha à Lava
block.lavasmelter.fulldescription=Usa lava para converter ferro em aço. Uma alternativa para a fundidora. Útil em situações onde não há carvão por perto.
block.lavasmelter.description=Converte ferro + lava em aço.
block.stonedrill.name=Broca de pedra
block.stonedrill.fulldescription=A broca essencial. Quando colocada em uma jazida de pedra gera pedra indefinidamente.
block.stonedrill.description=Gera 1 pedra a cada 4 segundos.
#Mines 1 stone every 4 seconds.
block.irondrill.name=Broca de Ferro
block.irondrill.fulldescription=Uma broca básica. Quando colocada sobre uma jazida de ferro, lentamente gera ferro.
#A basic drill. When placed on tungsten ore tiles, outputs tungsten at a slow pace indefinitely.
block.irondrill.description=Gera 1 ferro a cada 5 segundos.
block.coaldrill.name=Broca de Carvão
block.coaldrill.fulldescription=Uma broca básica. Quando colocada sobre uma jazida de carvão, lentamente gera carvão.
block.coaldrill.description=Gera 1 carvão a cada 5 segundos.
block.thoriumdrill.name=Broca de Urânio
block.thoriumdrill.fulldescription=Uma broca avançada. Quando colocada sobre uma jazida de urânio, lentamente gera urânio.
block.thoriumdrill.description=Gera 1 Urânio a cada 7 segundos.
block.titaniumdrill.name=Broca de Titânio
block.titaniumdrill.fulldescription=Uma broca avançada. Quando colocada sobre uma jazida de titânio, lentamente gera titânio.
block.titaniumdrill.description=Gera 1 Titânio a cada 5 segundos.
block.omnidrill.name=Omnibroca
block.omnidrill.fulldescription=A broca suprema. Rapidamente extrai qualquer minério em que é colocada.
#The ultimate drill. Will mine any ore it is placed on at a rapid pace.
block.omnidrill.description=Gera 1 de qualquer recurso a cada 3 segundos.
block.coalgenerator.name=Gerador à Carvão
#Crase ou não?
block.coalgenerator.fulldescription=O gerador essencial. Gera energia a partir de carvão. Distribui energia em forma de laser para os 4 lados.
block.coalgenerator.description=Gera energia a partir de carvão.
block.thermalgenerator.name=Gerador Térmico
block.thermalgenerator.fulldescription=Gera energia a partir de lava. Distribui energia em forma de laser para os 4 lados.
block.thermalgenerator.description=Gera energia a partir de lava.
block.combustiongenerator.name=Gerador à Combustão
block.combustiongenerator.fulldescription=Gera energia a partir de petróleo. Distribui energia em forma de laser para os 4 lados.
block.combustiongenerator.description=Gera energia a partir de petróleo.
block.rtgenerator.name=Gerador RTG
block.rtgenerator.fulldescription=Gera pouca quantidade de energia a partir do decaimento radioativo do urânio. Distribui energia em forma de laser para os 4 lados.
block.rtgenerator.description=Gera energia a partir de Urânio.
block.nuclearreactor.name=Reator Nuclear
block.nuclearreactor.fulldescription=Uma versão avançada do gerador RTG. Gera energia a partir de Urânio. Requer constante resfriamento à água. Altamente volátil; explodirá violentamente se não for suprido com quantiddades suficientes de água.
block.turret.name=Torre Comum
block.turret.fulldescription=Uma torre básica e barata. Usa pedra como munição. Tem alcance um pouco maior que a torre dupla.
block.turret.description=[turretinfo]Munição: pedra
block.doubleturret.name=Torre Dupla
block.doubleturret.fulldescription=Uma versão um pouco mais poderosa do que a torre comum. Usa pedra como munição. Causa um dano maior, porém tem menor alcance. Atira dois projéteis.
block.doubleturret.description=[turretinfo]Munição: pedra
block.machineturret.name=Torre Automática
block.machineturret.fulldescription=Uma torre padrão completa. Usa ferro como munição. Tem alta taxa de disparo e dano decente.
block.machineturret.description=[turretinfo]Munição: ferro
block.shotgunturret.name=Torre Splitter
#Splitter turret
block.shotgunturret.fulldescription=Uma torre padrão. Usa ferro como munição. Atira 7 balas em forma de cone. Pouco alcance, porém maior dano do que a Torre Dupla.
block.shotgunturret.description=[turretinfo]Munição: ferro
block.flameturret.name=Torre lança-\nchamas
block.flameturret.fulldescription=Torre avançada de baixo alcance. Usa carvão. Pouco alcance mas alto dano. Boa para trechos estreitos. Recomenda-se usá-la atŕas de paredes.
block.flameturret.description=[turretinfo]Munição: carvão
block.sniperturret.name=Torre Sniper
#Torre Railgun?
block.sniperturret.fulldescription=Torre avançada de longo alcance. Usa aço como munição. Dano altíssimo, porém baixa taxa de disparo. Cara para usar, porém pode ser colocada longe das linhas inimigas dado seu alcance.
block.sniperturret.description=[turretinfo]Munição: aço
block.mortarturret.name=Torre Flak
block.mortarturret.fulldescription=Torre avançada de dano em área. Usa carvão. Taxa de disparo e balas lentas, mas alto dano em alvo único ou distribuído.
block.mortarturret.description=[turretinfo]Munição: carvão
block.laserturret.name=Torre laser
block.laserturret.fulldescription=Torre de alvo único avançada. Usa energia. Boa torre de alcance médio e uso geral. Alvo único apenas. Nunca erra.
block.laserturret.description=[turretinfo]Usa Energia
block.waveturret.name=Torre Tesla
block.waveturret.fulldescription=Torre de múltiplos alvos avançada. Usa Energia. Alcance médio. Nunca erra. Dano médio-baixo, porém pode acertar vários inimigos simultaneamente com raios conectados.
block.waveturret.description=[turretinfo]Usa Energia
block.plasmaturret.name=Torre de Plasma
block.plasmaturret.fulldescription=Versão altamente avançada da Torre lança-chamas. Usa carvão. Dano altíssimo e alcance médio-baixo.
block.plasmaturret.description=[turretinfo]Munição: carvão
block.chainturret.name=Canhão automático
block.chainturret.fulldescription=A torre de tiro rápido mais avançada. Usa Urânio como munição. Atira grandes projéteis rapidamente. Alcance médio. Ocupa várias células. Extremamente resistente.
block.chainturret.description=[turretinfo]Munição: Urânio
block.titancannon.name=Canhão Titã
block.titancannon.fulldescription=A torre de longo alcance mais avançada. Usa Urânio como munição. Atira várias balas de dano em área à uma taxa de disparo média. Alto alcance. Ocupa várias células. Extremamente resistente.
block.titancannon.description=[turretinfo]Munição: Urânio
block.playerspawn.name=playerspawn
block.enemyspawn.name=enemyspawn
text.credits=Credits
text.link.discord.description=the official Mindustry discord chatroom
text.link.github.description=Game source code
text.link.dev-builds.description=Unstable development builds
text.link.trello.description=Official trello board for planned features
text.link.itch.io.description=itch.io page with PC downloads and web version
text.link.google-play.description=Google Play store listing
text.link.wiki.description=official Mindustry wiki
text.linkfail=Failed to open link!\nThe URL has been copied to your cliboard.
text.editor.web=The web version does not support the editor!\nDownload the game to use it.
text.web.unsupported=The web version does not support this feature! Download the game to use it.
text.multiplayer.web=This version of the game does not support multiplayer!\nTo play multiplayer from your browser, use the "multiplayer web version" link at the itch.io page.
text.host.web=The web version does not support hosting games! Download the game to use this feature.
text.map.delete=Are you sure you want to delete the map "[orange]{0}[]"?
text.construction.title=Block Construction Guide
text.construction=You've just selected [accent]block construction mode[].\n\nTo begin placing, simply tap a valid location near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Shift the selection[] by holding and dragging any block in the selection.\n- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel construction or selection[] by pressing the X at the bottom left.
text.deconstruction.title=Block Deconstruction Guide
text.deconstruction=You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left.
text.showagain=Don't show again next session
text.unlocks=Unlocks
text.joingame=Join Game
text.addplayers=Add/Remove Players
text.newgame=New Game
text.maps=Maps
text.maps.none=[LIGHT_GRAY]No maps found!
text.about.button=About
text.name=Name:
text.unlocked=New Block Unlocked!
text.unlocked.plural=New Blocks Unlocked!
text.players={0} players online
text.players.single={0} player online
text.server.mismatch=Packet error: possible client/server version mismatch.\nMake sure you and the host have the\nlatest version of Mindustry!
text.server.closing=[accent]Closing server...
text.server.kicked.kick=You have been kicked from the server!
text.server.kicked.fastShoot=You are shooting too quickly.
text.server.kicked.invalidPassword=Invalid password!
text.server.kicked.clientOutdated=Outdated client! Update your game!
text.server.kicked.serverOutdated=Outdated server! Ask the host to update!
text.server.kicked.banned=You are banned on this server.
text.server.kicked.recentKick=You have been kicked recently.\nWait before connecting again.
text.server.kicked.nameInUse=There is someone with that name\nalready on this server.
text.server.kicked.nameEmpty=Your name must contain at least one character or number.
text.server.kicked.idInUse=You are already on this server! Connecting with two accounts is not permitted.
text.server.kicked.customClient=This server does not support custom builds. Download an official version.
text.server.connected={0} has joined.
text.server.disconnected={0} has disconnected.
text.nohost=Can't host server on a custom map!
text.host.info=The [accent]host[] button hosts a server on ports [scarlet]6567[] and [scarlet]6568.[]\nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings.
text.join.info=Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[LIGHT_GRAY]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
text.hostserver=Host Server
text.host=Host
text.hosting=[accent]Opening server...
text.hosts.refresh=Refresh
text.hosts.discovering=Discovering LAN games
text.server.refreshing=Refreshing server
text.hosts.none=[lightgray]No LAN games found!
text.host.invalid=[scarlet]Can't connect to host.
text.server.friendlyfire=Friendly Fire
text.trace=Trace Player
text.trace.playername=Player name: [accent]{0}
text.trace.ip=IP: [accent]{0}
text.trace.id=Unique ID: [accent]{0}
text.trace.android=Android Client: [accent]{0}
text.trace.modclient=Custom Client: [accent]{0}
text.trace.totalblocksbroken=Total blocks broken: [accent]{0}
text.trace.structureblocksbroken=Structure blocks broken: [accent]{0}
text.trace.lastblockbroken=Last block broken: [accent]{0}
text.trace.totalblocksplaced=Total blocks placed: [accent]{0}
text.trace.lastblockplaced=Last block placed: [accent]{0}
text.invalidid=Invalid client ID! Submit a bug report.
text.server.bans=Bans
text.server.bans.none=No banned players found!
text.server.admins=Admins
text.server.admins.none=No admins found!
text.server.add=Add Server
text.server.delete=Are you sure you want to delete this server?
text.server.hostname=Host: {0}
text.server.edit=Edit Server
text.server.outdated=[crimson]Outdated Server![]
text.server.outdated.client=[crimson]Outdated Client![]
text.server.version=[lightgray]Version: {0}
text.server.custombuild=[yellow]Custom Build
text.confirmban=Are you sure you want to ban this player?
text.confirmunban=Are you sure you want to unban this player?
text.confirmadmin=Are you sure you want to make this player an admin?
text.confirmunadmin=Are you sure you want to remove admin status from this player?
text.joingame.title=Join Game
text.joingame.ip=IP:
text.disconnect=Disconnected.
text.disconnect.data=Failed to load world data!
text.connecting=[accent]Connecting...
text.connecting.data=[accent]Loading world data...
text.connectfail=[crimson]Failed to connect to server: [orange]{0}
text.server.port=Port:
text.server.addressinuse=Address already in use!
text.server.invalidport=Invalid port number!
text.server.error=[crimson]Error hosting server: [orange]{0}
text.save.new=New Save
text.save.none=No saves found!
text.save.delete.confirm=Are you sure you want to delete this save?
text.save.delete=Delete
text.save.export=Export Save
text.save.import.invalid=[orange]This save is invalid!
text.save.import.fail=[crimson]Failed to import save: [orange]{0}
text.save.export.fail=[crimson]Failed to export save: [orange]{0}
text.save.import=Import Save
text.save.newslot=Save name:
text.save.rename=Rename
text.save.rename.text=New name:
text.on=On
text.off=Off
text.save.autosave=Autosave: {0}
text.save.map=Map: {0}
text.save.difficulty=Difficulty: {0}
text.copylink=Copy Link
text.changelog.title=Changelog
text.changelog.loading=Getting changelog...
text.changelog.error.android=[orange]Note that the changelog sometimes does not work on Android 4.4 and below!\nThis is due to an internal Android bug.
text.changelog.error.ios=[orange]The changelog is currently not supported in iOS.
text.changelog.error=[scarlet]Error getting changelog!\nCheck your internet connection.
text.changelog.current=[yellow][[Current version]
text.changelog.latest=[orange][[Latest version]
text.saving=[accent]Saving...
text.unknown=Unknown
text.custom=Custom
text.builtin=Built-In
text.map.delete.confirm=Are you sure you want to delete this map? This action cannot be undone!
text.map.random=[accent]Random Map
text.map.nospawn=This map does not have any cores for the player to spawn in! Add a [ROYAL]blue[] core to this map in the editor.
text.editor.slope=\\
text.editor.openin=Open In Editor
text.editor.oregen=Ore Generation
text.editor.oregen.info=Ore Generation:
text.editor.mapinfo=Map Info
text.editor.author=Author:
text.editor.description=Description:
text.editor.name=Name:
text.editor.teams=Teams
text.editor.elevation=Elevation
text.editor.saved=Saved!
text.editor.save.noname=Your map does not have a name! Set one in the 'map info' menu.
text.editor.save.overwrite=Your map overwrites a built-in map! Pick a different name in the 'map info' menu.
text.editor.import.exists=[scarlet]Unable to import:[] a built-in map named '{0}' already exists!
text.editor.import=Import...
text.editor.importmap=Import Map
text.editor.importmap.description=Import an already existing map
text.editor.importfile=Import File
text.editor.importfile.description=Import an external map file
text.editor.importimage=Import Terrain Image
text.editor.importimage.description=Import an external map image file
text.editor.export=Export...
text.editor.exportfile=Export File
text.editor.exportfile.description=Export a map file
text.editor.exportimage=Export Terrain Image
text.editor.exportimage.description=Export a map image file
text.editor.overwrite.confirm=[scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
text.fps=FPS: {0}
text.tps=TPS: {0}
text.ping=Ping: {0}ms
text.language.restart=Please restart your game for the language settings to take effect.
text.settings.language=Language
text.settings.rebind=Rebind
text.yes=Yes
text.no=No
text.info.title=[accent]Info
text.blocks.targetsair=Targets Air
text.blocks.itemspeed=Units Moved
text.blocks.shootrange=Range
text.blocks.poweruse=Power Use
text.blocks.inputitemcapacity=Input Item Capacity
text.blocks.outputitemcapacity=Input Item Capacity
text.blocks.maxpowergeneration=Max Power Generation
text.blocks.powertransferspeed=Power Transfer
text.blocks.craftspeed=Production Speed
text.blocks.inputliquidaux=Aux Liquid
text.blocks.inputitems=Input Items
text.blocks.outputitem=Output Item
text.blocks.drilltier=Drillables
text.blocks.drillspeed=Base Drill Speed
text.blocks.liquidoutput=Liquid Output
text.blocks.liquiduse=Liquid Use
text.blocks.coolant=Coolant
text.blocks.coolantuse=Coolant Use
text.blocks.inputliquidfuel=Fuel Liquid
text.blocks.liquidfueluse=Liquid Fuel Use
text.blocks.reload=Reload
text.blocks.inputfuel=Fuel
text.blocks.fuelburntime=Fuel Burn Time
text.blocks.inputcapacity=Input capacity
text.blocks.outputcapacity=Output capacity
text.unit.blocks=blocks
text.unit.powersecond=power units/second
text.unit.liquidsecond=liquid units/second
text.unit.itemssecond=items/second
text.unit.pixelssecond=pixels/second
text.unit.liquidunits=liquid units
text.unit.powerunits=power units
text.unit.degrees=degrees
text.unit.seconds=seconds
text.unit.none=
text.unit.items=items
text.category.general=General
text.category.power=Power
text.category.liquids=Liquids
text.category.items=Items
text.category.crafting=Crafting
text.category.shooting=Shooting
setting.difficulty.insane=insane
setting.difficulty.purge=purge
setting.saveinterval.name=Autosave Interval
setting.seconds={0} Seconds
setting.fullscreen.name=Fullscreen
setting.multithread.name=Multithreading
setting.minimap.name=Show Minimap
text.keybind.title=Rebind Keys
keybind.shoot.name=shoot
keybind.block_info.name=block_info
keybind.chat.name=chat
keybind.player_list.name=player_list
keybind.console.name=console
mode.text.help.title=Description of modes
mode.waves.description=the normal mode. limited resources and automatic incoming waves.
mode.sandbox.description=infinite resources and no timer for waves.
mode.freebuild.description=limited resources and no timer for waves.
content.item.name=Items
content.liquid.name=Liquids
content.unit-type.name=Units
content.recipe.name=Blocks
item.stone.description=A common raw material. Used for separating and refining into other materials, or melting into lava.
item.tungsten.name=Tungsten
item.tungsten.description=A common, but very useful structure material. Used in drills and heat-resistant blocks such as generators and smelteries.
item.lead.name=Lead
item.lead.description=A basic starter material. Used extensively in electronics and liquid transportation blocks.
item.coal.description=A common and readily available fuel.
item.carbide.name=Carbide
item.carbide.description=A tough alloy made with tungsten and carbon. Used in advanced transportation blocks and high-tier drills.
item.titanium.description=A rare super-light metal used extensively in liquid transportation, drills and aircraft.
item.thorium.description=A dense, radioactive metal used as structural support and nuclear fuel.
item.silicon.name=Silicon
item.silcion.description=An extremely useful semiconductor, with applications in solar panels and many complex electronics.
item.plastanium.name=Plastanium
item.plastanium.description=A light, ductile material used in advanced aircraft and fragmentation ammunition.
item.phase-matter.name=Phase Matter
item.surge-alloy.name=Surge Alloy
item.biomatter.name=Biomatter
item.biomatter.description=A clump of organic mush; used for conversion into oil or as a basic fuel.
item.sand.name=Sand
item.sand.description=A common material that is used extensively in smelting, both in alloying and as a flux.
item.blast-compound.name=Blast Compound
item.blast-compound.description=A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised.
item.pyratite.name=Pyratite
item.pyratite.description=An extremely flammable substance used in incendiary weapons.
liquid.cryofluid.name=Cryofluid
text.item.explosiveness=[LIGHT_GRAY]Explosiveness: {0}
text.item.flammability=[LIGHT_GRAY]Flammability: {0}
text.item.radioactivity=[LIGHT_GRAY]Radioactivity: {0}
text.item.fluxiness=[LIGHT_GRAY]Flux Power: {0}
text.item.hardness=[LIGHT_GRAY]Hardness: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]Heat Capacity: {0}
text.liquid.viscosity=[LIGHT_GRAY]Viscosity: {0}
text.liquid.temperature=[LIGHT_GRAY]Temperature: {0}
block.tungsten-wall.name=Tungsten Wall
block.tungsten-wall-large.name=Large Tungsten Wall
block.carbide-wall.name=Carbide Wall
block.carbide-wall-large.name=Large Carbide Wall
block.thorium-wall.name=Thorium Wall
block.thorium-wall-large.name=Large Thorium Wall
block.duo.name=Duo
block.scorch.name=Scorch
block.hail.name=Hail
block.lancer.name=Lancer
block.titanium-conveyor.name=Titanium Conveyor
block.splitter.name=Splitter
block.splitter.description=Outputs items into two opposite directions immediately after they are recieved.
block.distributor.name=Distributor
block.distributor.description=A splitter that can split items into 8 directions.
block.overflow-gate.name=Overflow Gate
block.overflow-gate.description=A combination splitter and router that only outputs to the left and right if the front path is blocked.
block.bridgeconveyor.name=Bridge Conveyor
block.bridgeconveyor.description=A conveyor that can go over other blocks, for up to two total blocks.
block.arc-smelter.name=Arc Smelter
block.silicon-smelter.name=Silicon Smelter
block.phase-weaver.name=Phase Weaver
block.pulverizer.name=Pulverizer
block.cryofluidmixer.name=Cryofluid Mixer
block.melter.name=Melter
block.incinerator.name=Incinerator
block.biomattercompressor.name=Biomatter Compressor
block.separator.name=Separator
block.centrifuge.name=Centrifuge
block.power-node.name=Power Node
block.power-node-large.name=Large Power Node
block.battery.name=Battery
block.battery-large.name=Large Battery
block.combustion-generator.name=Combustion Generator
block.turbine-generator.name=Turbine Generator
block.tungsten-drill.name=Tungsten Drill
block.carbide-drill.name=Carbide Drill
block.laser-drill.name=Laser Drill
block.water-extractor.name=Water Extractor
block.cultivator.name=Cultivator
block.dart-ship-factory.name=Dart Ship Factory
block.delta-mech-factory.name=Delta Mech Factory
block.dronefactory.name=Drone Factory
block.repairpoint.name=Repair Point
block.resupplypoint.name=Resupply Point
block.liquidtank.name=Liquid Tank
block.bridgeconduit.name=Bridge Conduit
block.mechanical-pump.name=Mechanical Pump
block.itemsource.name=Item Source
block.itemvoid.name=Item Void
block.liquidsource.name=Liquid Source
block.powervoid.name=Power Void
block.powerinfinite.name=Power Infinite
block.unloader.name=Unloader
block.sortedunloader.name=Sorted Unloader
block.vault.name=Vault
block.wave.name=Wave
block.swarmer.name=Swarmer
block.salvo.name=Salvo
block.ripple.name=Ripple
block.phase-conveyor.name=Phase Conveyor
block.bridge-conveyor.name=Bridge Conveyor
block.plastanium-compressor.name=Plastanium Compressor
block.pyratite-mixer.name=Pyratite Mixer
block.blast-mixer.name=Blast Mixer
block.solidifer.name=Solidifer
block.solar-panel.name=Solar Panel
block.solar-panel-large.name=Large Solar Panel
block.oil-extractor.name=Oil Extractor
block.javelin-ship-factory.name=Javelin Ship factory
block.drone-factory.name=Drone Factory
block.fabricator-factory.name=Fabricator Factory
block.repair-point.name=Repair Point
block.resupply-point.name=Resupply Point
block.pulse-conduit.name=Pulse Conduit
block.phase-conduit.name=Phase Conduit
block.liquid-router.name=Liquid Router
block.liquid-tank.name=Liquid Tank
block.liquid-junction.name=Liquid Junction
block.bridge-conduit.name=Bridge Conduit
block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,500 +1,495 @@
text.about = Створено [ROYAL] Anuken. []\nСпочатку запис у [orange] GDL [] MM Jam.\nТворці:\n- SFX зроблено з [YELLOW] bfxr []\n- Музика зроблена [GREEN] RoccoW [] / Знайдено на [lime] FreeMusicArchive.org [] \nОсоблива подяка:\n- [coral] MitchellFJN []: екстенсивне тестування та відгуки\n- [sky] Luxray5474 []: робота з вікі, вклади коду\n- Всі бета-тестери на itch.io та Google Play\n
text.discord = Приєднуйтесь до нашого Discord!
text.changes = [SCARLET] Увага! \n[] Деякі важливі механіки гри були змінені.\n- [accent] Телепорти [] тепер використовують електроенергію. \n- [accent] Домінна піч [] та [accent] Тиглі [] тепер мають ліміт. \n- [accent] Тиглі [] зараз вимагають вугілля як паливо.
text.gameover = Ядро було зруйновано.
text.highscore = [YELLOW] Новий рекорд!
text.lasted = Ви тримались до хвилі
text.level.highscore = Рекорд: [accent] {0}
text.level.delete.title = Підтвердьте видалення
text.level.delete = Ви впевнені, що хочете видалити карту \"[orange] {0} \"?
text.level.select = Вибір рівня
text.level.mode = Ігровий режим
text.savegame = Зберегти гру
text.loadgame = Завантажити гру
text.joingame = Приєднатися\nдо гри
text.about=Створено [ROYAL] Anuken. []\nСпочатку запис у [orange] GDL [] MM Jam.\nТворці:\n- SFX зроблено з [YELLOW] bfxr []\n- Музика зроблена [GREEN] RoccoW [] / Знайдено на [lime] FreeMusicArchive.org [] \nОсоблива подяка:\n- [coral] MitchellFJN []: екстенсивне тестування та відгуки\n- [sky] Luxray5474 []: робота з вікі, вклади коду\n- Всі бета-тестери на itch.io та Google Play\n
text.discord=Приєднуйтесь до нашого Discord!
text.gameover=Ядро було зруйновано.
text.highscore=[YELLOW] Новий рекорд!
text.lasted=Ви тримались до хвилі
text.level.highscore=Рекорд: [accent] {0}
text.level.delete.title=Підтвердьте видалення
text.level.select=Вибір рівня
text.level.mode=Ігровий режим
text.savegame=Зберегти гру
text.loadgame=Завантажити гру
text.joingame=Приєднатися\nдо гри
text.newgame=Нова гра
text.quit = Вийти
text.about.button = Про
text.name = Назва:
text.public = Публічний
text.players = {0} гравців онлайн
text.server.player.host = {0} (host)
text.players.single = {0} гравців онлайн
text.server.mismatch = Пакетна помилка: невідповідність версії версії клієнта / сервера. Переконайтеся, що ви та хост мають останню версію Mindustry!
text.server.closing = [accent] Закриття сервера ...
text.server.kicked.kick = Ви були вигнані з сервера!
text.server.kicked.invalidPassword = Невірний пароль!
text.server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру!
text.server.kicked.serverOutdated = Застарілий сервер! Попросіть хост оновити!
text.server.connected = {0} приєднався.
text.server.disconnected = {0} від'єднано.
text.nohost = Неможливо розмістити сервер на власній карті!
text.hostserver = Хост-сервер
text.host = Хост
text.hosting = [accent] Відкриття сервера ...
text.hosts.refresh = Оновити
text.hosts.discovering = Знайомство з мережевими іграми
text.server.refreshing = Оновити сервери
text.hosts.none = [lightgray] Ніяких ігор у мережі не знайдено!
text.host.invalid = [scarlet] Неможливо підключитися до хосту.
text.server.friendlyfire = Дружній вогонь
text.server.add = Додати сервер
text.server.delete = Ви впевнені, що хочете видалити цей сервер?
text.server.hostname = Хост: {0}
text.server.edit = Редагувати сервер
text.joingame.byip = [] Приєднатися по IP ...[]
text.joingame.title = Приєднатися до гри
text.joingame.ip = IP
text.disconnect = Роз'єднано
text.connecting = [accent] Підключення ...
text.connecting.data = [accent] Завантаження світових даних ...
text.connectfail = [crimson] Не вдалося підключитися до сервера: [orange] {0}
text.server.port = Порт
text.server.addressinuse = Адреса вже використовується!
text.server.invalidport = Недійсний номер порту.
text.server.error = [crimson] Помилка хостингу сервера: [orange] {0}
text.tutorial.back = < Попер.
text.tutorial.next = Далі >
text.save.new = Нове збереження
text.save.overwrite = Ви впевнені, що хочете перезаписати цей слот для збереження?
text.overwrite = Перезаписати
text.save.none = Не знайдено жодних збережень!
text.saveload = [accent] Збереження ...
text.savefail = Не вдалося зберегти гру!
text.save.delete.confirm = Ви впевнені, що хочете видалити це збереження?
text.save.delete = Видалити
text.save.export = Експорт збереження
text.save.import.invalid = [orange] Це збереження недійсне!
text.save.import.fail = [crimson] Не вдалося імпортувати збереження: [orange] {0}
text.save.export.fail = [crimson] Не вдалося експортувати збереження: [orange] {0}
text.save.import = Імпортувати збереження
text.save.newslot = Назва збереження:
text.save.rename = Переіменувати
text.save.rename.text = Нова назва:
text.selectslot = Виберіть збереження.
text.slot = [accent] слот {0}
text.save.corrupted = [orange] Збережений файл пошкоджений або він невірний!
text.empty = <порожньо>
text.on = Увімкнути
text.off = Вимкнути
text.save.autosave = Автозбереження: {0}
text.save.map = Карта
text.save.wave = Хвиля {0}
text.save.difficulty = Складність
text.save.date = Останнє збережено: {0}
text.confirm = Підтвердити
text.delete = Видалити
text.ok = ОК
text.open = Відкрити
text.cancel = Скасувати
text.openlink = Відкрити посилання
text.back = Назад
text.quit.confirm = Ти впевнений що хочеш піти?
text.loading = [accent] Завантаження ...
text.wave = [orange] хвиля {0}
text.wave.waiting = Хвиля через {0}
text.waiting = Очікування…
text.enemies = {0} Вороги
text.enemies.single = Противник
text.loadimage = Завантажити зображення
text.saveimage = Зберегти зображення
text.oregen = Генерація руд
text.editor.badsize = [orange] Недійсні розміри зображення! [] Дійсні розміри карти: {0}
text.editor.errorimageload = Помилка завантаження файлу зображень: [orange] {0}
text.editor.errorimagesave = Помилка збереження файлу зображення: [orange] {0}
text.editor.generate = Генератор
text.editor.resize = Змінити розмір
text.editor.loadmap = // Завантажити карту
text.editor.savemap = Зберегти карту
text.editor.loadimage = Завантажити зображення
text.editor.saveimage = Зберегти зображення
text.editor.unsaved = [scarlet] У вас є незбережені зміни! [] Ви впевнені, що хочете вийти?
text.editor.brushsize = Розмір пензля: {0}
text.editor.noplayerspawn = Ця карта не має ігрового поля для гравця!
text.editor.manyplayerspawns = Карти не можуть мати більше одного ігрового поля для гравців!
text.editor.manyenemyspawns = Не може бути більше ніж {0} ворожих точок!
text.editor.resizemap = Змінити розмір карти
text.editor.resizebig = [scarlet] Попередження! [] Карти, розмір яких перевищує 256 одиниць, можуть виснути і можуть бути нестабільними.
text.editor.mapname = Назва карти:
text.editor.overwrite = [accent] Попередження! Це перезаписує існуючу карту.
text.editor.failoverwrite = [crimson] Неможливо перезаписати карту за замовчуванням!
text.editor.selectmap = Виберіть карту для завантаження:
text.width = Ширина
text.height = Висота
text.randomize = Рандомізувати
text.apply = Застосувати
text.update = Оновити
text.menu = Меню
text.play = Відтворити
text.load = Завантаження
text.save = Зберегти
text.language.restart = Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності.
text.settings.language = Мова
text.settings = Налаштування
text.tutorial = Навчальний\nпосібник
text.editor = Редактор
text.mapeditor = Редактор карт
text.donate = Підтримати проект
text.settings.reset = Скинути до стандартних
text.settings.controls = Елементи управління
text.settings.game = Гра
text.settings.sound = Звук
text.settings.graphics = Графіка
text.upgrades = Оновлення
text.purchased = [LIME] Створено!
text.weapons = Зброя
text.paused = Пауза
text.respawn = Відновлення за
text.info.title = [accent] інформація
text.error.title = [crimson] Виникла помилка
text.error.crashmessage = [SCARLET] Виникла несподівана помилка, що призвела до збою. [] Будь ласка, повідомте про конкретні обставини, розробнику: [ORANGE] anukendev@gmail.com []
text.error.crashtitle = Виникла помилка
text.mode.break = Режим зносу: {0}
text.mode.place = Режим будівництва: {0}
placemode.hold.name = Лінія
placemode.areadelete.name = Площа
placemode.touchdelete.name = Дотик
placemode.holddelete.name = Утримування.
placemode.none.name = (None)
placemode.touch.name = Дотик
placemode.cursor.name = курсор
text.blocks.extrainfo = [accent] додатковий інформаційний блок:
text.blocks.blockinfo = Блокування інформації
text.blocks.powercapacity = Потужність
text.blocks.powershot = Потужність / постріл
text.blocks.powersecond = Потужність / секунда
text.blocks.powerdraindamage = Потужність дренажу / пошкодження
text.blocks.shieldradius = Радіус щита
text.blocks.itemspeedsecond = Швидкість / секунда
text.blocks.range = Радіус
text.blocks.size = Розмір
text.blocks.powerliquid = Потужність / Рідина
text.blocks.maxliquidsecond = Макс. Рідина / секунда
text.blocks.liquidcapacity = Ємкість рідини
text.blocks.liquidsecond = Рідина / секунда
text.blocks.damageshot = Пошкодження / постріл
text.blocks.ammocapacity = Місткість боєприпасів
text.blocks.ammo = Набої
text.blocks.ammoitem = Боєприпаси / предмет
text.blocks.maxitemssecond = Макс. Елементи / секунду
text.blocks.powerrange = Радіус потужності
text.blocks.lasertilerange = Радіус лазерних плиток
text.blocks.capacity = Ємкість
text.blocks.itemcapacity = Ємкість предмету
text.blocks.maxpowergenerationsecond = Максимальна потужність / секунда
text.blocks.powergenerationsecond = Потужність / секунда
text.blocks.generationsecondsitem = Генерація за секунду / предмет
text.blocks.input = Ввід
text.blocks.inputliquid = Ввід речовини
text.blocks.inputitem = Вхідний матеріал
text.blocks.output = Вивід
text.blocks.secondsitem = Секунда / предмет
text.blocks.maxpowertransfersecond = Максимальна передача потужності / секунда
text.blocks.explosive = Вибухонебезпечний!
text.blocks.repairssecond = Ремонт / секунда
text.blocks.health = Здоров'я
text.blocks.inaccuracy = Неточність
text.blocks.shots = Постріли
text.blocks.shotssecond = Постріли / секунду
text.blocks.fuel = Паливо:
text.blocks.fuelduration = Тривалість палива
text.blocks.maxoutputsecond = Макс. Вихід / секунду
text.blocks.inputcapacity = Вхідна ємність
text.blocks.outputcapacity = Випускна ємність
text.blocks.poweritem = Потужність / виріб
text.placemode = Місцевий режим
text.breakmode = Перерваний режим
text.health = Здоров'я
setting.difficulty.easy = Легкий
setting.difficulty.normal = Нормальний
setting.difficulty.hard = Важкий
setting.difficulty.insane = Божевільний
setting.difficulty.purge = Очистити
setting.difficulty.name = Складність
setting.screenshake.name = Тряска екрана
setting.smoothcam.name = Гладка камера
setting.indicators.name = Індикатори ворога
setting.effects.name = Ефекти відображення
setting.sensitivity.name = Чутливість контролера
setting.saveinterval.name = Інтервал автозбереження
setting.seconds = {0} секунд
setting.fullscreen.name = Повноекранний
setting.multithread.name = Багатопотоковий [scarlet] (нестабільний!)
setting.fps.name = Показати FPS
setting.vsync.name = VSunc
setting.lasers.name = Показати енергетичні лазери
setting.healthbars.name = Показати здоров'я
setting.pixelate.name = Пікселяція екрану
setting.musicvol.name = Гучність музики
setting.mutemusic.name = Вимкнути музику
setting.sfxvol.name = Гучність ефектів
setting.mutesound.name = Вимкнути звук
map.maze.name = Лабіринт
map.fortress.name = Фортеця
map.sinkhole.name = Свердловина
map.caves.name = Печери
map.volcano.name = Вулкан
map.caldera.name = Кальдера
map.scorch.name = Мертва земля
map.desert.name = Пустеля
map.island.name = Острів
map.grassland.name = Пасовища
map.tundra.name = Тундра
map.spiral.name = Спіраль
map.tutorial.name = Навчання
tutorial.intro.text = [yellow] Ласкаво просимо до підручника. [] Для початку натисніть \"далі\".
tutorial.moveDesktop.text = Для переміщення використовуйте клавіші [orange] [[WASD] []. Утримуйте [orange] SHIFT[], для прискорення. Утримуйте [orange] CTRL [], використовуючи [orange] колесо прокручування [] для збільшення або зменшення.
tutorial.shoot.text = Використовуйте мишу, щоб націлитись, утримуйте [orange] ліву кнопку миші [], щоб стріляти. Попрактикуйтесь на [yellow] мішені [].
tutorial.moveAndroid.text = Щоб перетягнути панораму, перетягніть один палець по екрану. Використовуйте два пальця, щоб збільшити чи зменшити маштаб.
tutorial.placeSelect.text = Спробуйте вибрати [yellow] конвеєр [] у меню блоку внизу справа.
tutorial.placeConveyorDesktop.text = Використовуйте [orange] [[колесико миші] [], щоб повернути конвеєр [orange] вперед [], а потім помістіть його в [yellow] позначене місце [], використовуючи [orange] [[ліву кнопку миші] [].
tutorial.placeConveyorAndroid.text = Використовуйте [orange] [[кнопку оберту] [], щоб обернути конвеєр [оранжевий] вперед [], перетягуйте його одним пальцем, а потім помістіть його в [yellow] позначене місце [], використовуючи [orange] [[галочка][].
tutorial.placeConveyorAndroidInfo.text = Крім того, ви можете натиснути піктограму перехрестя внизу ліворуч, щоб переключитися на [orange] [[сенсорний режим]] [], і помістити блоки, натиснувши на екран. У сенсорному режимі блоки можна повертати зі стрілкою внизу ліворуч. Натисніть [yellow] наступний [], щоб спробувати.
tutorial.placeDrill.text = Тепер виберіть та розмістіть [yellow] кам'яне свердло [] у зазначеному місці.
tutorial.blockInfo.text = Якщо ви хочете дізнатись більше про блок, ви можете торкнутися [orange] знак питання [] у верхньому правому куті, щоб прочитати його опис.
tutorial.deselectDesktop.text = Ви можете вимкнути блок, використовуючи [orange] [[клацання правою кнопкою миші] [].
tutorial.deselectAndroid.text = Ви можете скасувати вибір блоку, натиснувши кнопку [orange] X [].
tutorial.drillPlaced.text = Дриль тепер видобуває [yellow] камінь, [] та виведе його на конвеєр, а потім переміщає його в [yellow] ядро [].
tutorial.drillInfo.text = Різні руди потребують різних дрилі. Камінь вимагає кам'яні свердла, залізо вимагає залізні свердла та ін
tutorial.drillPlaced2.text = Переміщення елементів у ядро ​​вказує їх у ваш [yellow] предметний інвентар [] у верхньому лівому куті. Розміщення блоків використовує предмети з вашого інвентарю.
tutorial.moreDrills.text = Ви можете пов'язати багато свердлів і конвеєрів разом в одну гілку конвеєра.
tutorial.deleteBlock.text = Ви можете видалити блоки, натиснувши правою клавішею [orange] правою кнопкою миші [] по блоці, який ви хочете видалити. Спробуйте видалити цей конвеєр.
tutorial.deleteBlockAndroid.text = Ви можете видалити блоки за допомогою [orange], перехрестя [] в меню [mode] зламу [orange] у нижньому лівому куті та натиснувши на блок. Спробуйте видалити цей конвеєр.
tutorial.placeTurret.text = Тепер виділіть та розмістіть [yellow] турель [] у [yellow] позначеному місці [].
tutorial.placedTurretAmmo.text = Ця турель тепер приймає [yellow] боєприпас [] з конвеєра. Ви можете побачити, скільки боєприпасів вона має, натискаючи на неї і перевіряючи [green] зелену полоску [].
tutorial.turretExplanation.text = Турелі будуть автоматично стріляти у найближчого ворога, якщо вони мають достатню кількість боєприпасів.
tutorial.waves.text = Кожні [yellow] 60 [] секунд, хвиля [coral] ворогів [] буде виникати в певних місцях і намагатися знищити ядро.
tutorial.coreDestruction.text = Ваша мета полягає в тому, щоб [yellow] захищати ядро []. Якщо ядро ​​знищено, ви [coral] програєте[].
tutorial.pausingDesktop.text = Якщо вам коли-небудь потрібно зробити перерву, натисніть кнопку [orange] паузи [] у верхньому лівому куті або на кнопку [orange] пропуск [], щоб призупинити гру. Ви можете вибрати і розмістити блоки під час призупинення, але не можете переміщатися чи стріляти.
tutorial.pausingAndroid.text = Якщо вам коли-небудь потрібно зробити перерву, натисніть кнопку [orange] пауза [] у верхньому лівому куті, щоб призупинити гру. Ти можеш ще знищувати та будувати блоки під час призупинення.
tutorial.purchaseWeapons.text = Ви можете придбати нову [yellow] зброю [] для вашого механізму, відкривши меню оновлення в лівому нижньому кутку.
tutorial.switchWeapons.text = Перемикати зброю будь-яким натисканням його піктограми внизу ліворуч або за допомогою цифр [orange] [[1-9] [].
tutorial.spawnWave.text = Ось хвиля зараз. Знищи їх
tutorial.pumpDesc.text = У пізніших хвилях, можливо, доведеться використовувати [yellow] насоси [] для розподілу рідин для генераторів або екстракторів.
tutorial.pumpPlace.text = Насоси працюють аналогічно свердлам, за винятком того, що вони виробляють рідини замість предметів. Спробуйте встановити насос на [yellow] призначене мастило [].
tutorial.conduitUse.text = Тепер покладіть [orange] трубопровід [], віддаляючись від насоса.
tutorial.conduitUse2.text = І ще кілька ...
tutorial.conduitUse3.text = І ще кілька ...
tutorial.generator.text = Тепер, помістіть блок [orange] ​​базовий генератор енергії [] в кінці каналу.
tutorial.generatorExplain.text = Цей генератор тепер створить [yellow] енергію [] від масла.
tutorial.lasers.text = Потужність розподіляється за допомогою [yellow] лазерів потужності []. Поверніть і помістіть його тут.
tutorial.laserExplain.text = Тепер генератор переведе енергію в лазерний блок. Промінь [yellow] непрозорий [] означає, що в даний час він передає потужність, а промінь [yellow] прозорий [] означає, що це не так.
tutorial.laserMore.text = Ви можете перевірити, скільки енергії в блоку, наведіть курсор миші на нього і перевірте [yellow] жовту стрічку [] у верхній частині екрана.
tutorial.healingTurret.text = Цей лазер може бути використаний для живлення турелі для ремонту [lime] []. Помістіть одну тут.
tutorial.healingTurretExplain.text = Поки вона має енергію, ця турель може [lime] відремонтувати блоки. [] Під час гри постарайтеся збудувати одну таку чим швидше!
tutorial.smeltery.text = Для багатьох блоків потрібна [orange] сталь [], для цього потрібна[orange] доминна піч [] . Місце тут.
tutorial.smelterySetup.text = Ця піч буде тепер виробляти [orange] сталь [] із вхідного заліза, використовуючи вугілля як паливо.
tutorial.tunnelExplain.text = Також зауважте, що елементи проходять через [yellow] тунельний блок [] і з'являються з іншого боку, проходячи через кам'яний блок. Майте на увазі, що тунелі можуть проходити лише до 2 блоків.
tutorial.end.text = Ви завершили підручник! Удачі!
text.keybind.title = Ключ перемотки
keybind.move_x.name = move_x
keybind.move_y.name = move_y
keybind.select.name = Вибрати
keybind.break.name = {0}break{/0}{1}; {/1}
keybind.shoot.name = Постріл
keybind.zoom_hold.name = zoom_hold
keybind.zoom.name = Збільшити
keybind.block_info.name = Інформація про блок
keybind.menu.name = Меню
keybind.pause.name = Пауза
keybind.dash.name = Тире
keybind.chat.name = Чат
keybind.player_list.name = Список гравців
keybind.console.name = // Консоль 1
keybind.rotate_alt.name = rotate_alt
keybind.rotate.name = Повернути
keybind.weapon_1.name = Зброя!
keybind.weapon_2.name = Зброя!
keybind.weapon_3.name = Зброя!
keybind.weapon_4.name = Зброя!
keybind.weapon_5.name = Зброя!
keybind.weapon_6.name = Зброя!
mode.waves.name = Хвилі
mode.sandbox.name = Пісочниця
mode.freebuild.name = Вільний режим
upgrade.standard.name = Стандартний
upgrade.standard.description = Стандартний механ.
upgrade.blaster.name = Бластер
upgrade.blaster.description = Стріляє повільно, слабкі кулі.
upgrade.triblaster.name = Трипластер
upgrade.triblaster.description = Вистрілює 3 кулі в розповсюдженні.
upgrade.clustergun.name = Касетна гармата
upgrade.clustergun.description = Вистрілює неточними вибуховими гранатами.
upgrade.beam.name = Пушечна гармата
upgrade.beam.description = Вистрілює далекобійним,пробірний лазерний промінь.
upgrade.vulcan.name = Вулкан
upgrade.vulcan.description = Вистрілює шквал швидких куль.
upgrade.shockgun.name = Шок-пушка
upgrade.shockgun.description = Стріляє руйнівним вибухом заряженої шрапнелі.
item.stone.name = Камінь
item.iron.name = Залізо
item.coal.name = Вугівалля
item.steel.name = Сталь
item.titanium.name = Титан
item.dirium.name = Дириум
item.thorium.name = Уран
item.sand.name = Пісок
liquid.water.name = Вода
liquid.plasma.name = Плазма
liquid.lava.name = Лава
liquid.oil.name = Нафта
block.weaponfactory.name = Фабрика зброї
block.weaponfactory.fulldescription = Використовується для створення зброї для гравця mech. Натисніть, щоб використати. Автоматично приймає ресурси з основного ядра.
block.air.name = Повітря
block.blockpart.name = Блокчастина
block.deepwater.name = Глибока вода
block.water.name = Вода
block.lava.name = Лава
block.oil.name = Нафта
block.stone.name = Камінь
block.blackstone.name = Чорний камінь
block.iron.name = Залізо
block.coal.name = Вугілля
block.titanium.name = Титан
block.thorium.name = Уран
block.dirt.name = Бруд
block.sand.name = Пісок
block.ice.name = Лід
block.snow.name = Сніг
block.grass.name = Трава
block.sandblock.name = Блок піску
block.snowblock.name = Блок снігу
block.stoneblock.name = Блок камню
block.blackstoneblock.name = Блок чорного камню
block.grassblock.name = Блок бруду
block.mossblock.name = Моссблок
block.shrub.name = Чагарник
block.rock.name = Камень
block.icerock.name = Ледяний камень
block.blackrock.name = Чорний камінь
block.dirtblock.name = Блок землі
block.stonewall.name = Кам'яна стіна
block.stonewall.fulldescription = Недорогий захисний блок. Корисно для захисту ядра та турелі в перші кілька хвиль.
block.ironwall.name = Залізна стіна
block.ironwall.fulldescription = Основний захисний блок. Забезпечує захист від ворогів.
block.steelwall.name = Сталева стіна
block.steelwall.fulldescription = Стандартний захисний блок. адекватний захист від ворогів.
block.titaniumwall.name = Титанова стіна
block.titaniumwall.fulldescription = Сильний захисний блок. Забезпечує захист від ворогів.
block.duriumwall.name = Діріумова стіна
block.duriumwall.fulldescription = Дуже сильний захисний блок. Забезпечує захист від ворогів.
block.compositewall.name = Композитна стіна
block.steelwall-large.name = Велика сталева стіна
block.steelwall-large.fulldescription = Стандартний захисний блок. Поєднує в собі кілька блоків.
block.titaniumwall-large.name = Велика титанова стіна
block.titaniumwall-large.fulldescription = Сильний захисний блок. Поєднує в собі кілька блоків.
block.duriumwall-large.name = Велика дирмітова стіна
block.duriumwall-large.fulldescription = Дуже сильний захисний блок.Поєднує в собі кілька блоків.
block.titaniumshieldwall.name = Стіна з щитом
block.titaniumshieldwall.fulldescription = Сильний захисний блок з додатковим вбудованим щитом. Потрібна енергія. Використовує енергію для поглинання ворожих куль. Рекомендується використовувати силові пристосування для забезпечення енергії цього блоку.
block.repairturret.name = Ремонтна турель
block.repairturret.fulldescription = Ремонтує недалекі пошкодженні блоки.Повільний темп. Використовує невелику кількість енергії.
block.megarepairturret.name = Ремонтна турель II
block.megarepairturret.fulldescription = Ремонтує недалекі пошкодженні блоки.Збільшений радіус та швидший темп ремонту . Використовує багато енергії.
block.shieldgenerator.name = Генератор щиту
block.shieldgenerator.fulldescription = Передовий захисний блок. Захищає всі блоки в радіусі від нападу. Не вкористовує енергію при бездіяльності, але швидко витрачає енергію на захист від куль.
block.door.name = Двері
block.door.fulldescription = Блок, який можна відкрити та закрити, торкнувшись його.
block.door-large.name = Великі двері
block.door-large.fulldescription = Блок, який можна відкрити та закрити, торкнувшись його.
block.conduit.name = Трубопровід
block.conduit.fulldescription = Основний транспортний блок. Працює як конвеєр, але з рідинами. Найкраще використовується з насосами або іншими трубопроводами. Може використовуватися як міст через рідини для ворогів та гравців.
block.pulseconduit.name = Імпульсний канал
block.pulseconduit.fulldescription = Покращенний блок перевезення рідин. Транспортує рідини швидше і зберігає більше стандартних каналів.
block.liquidrouter.name = маршрутизатор для рідини
block.liquidrouter.fulldescription = Працює аналогічно маршрутизатору. Приймає рідину ввід з одного боку і виводить його на інші сторони. Корисний для розщеплення рідини з одного каналу на кілька інших трубопроводів.
block.conveyor.name = Конвеєр
block.conveyor.fulldescription = Базовий транспортний блок. Переміщує предмети вперед і автоматично вкладає їх у турелі або ремісники. Поворотний Може використовуватися як міст через рідину для ворогів та гравців.
block.steelconveyor.name = Сталевий конвеєр
block.steelconveyor.fulldescription = Розширений блок транспортування предметів. Переміщення елементів швидше, ніж стандартні конвеєри.
block.poweredconveyor.name = Імпульсний конвеєр
block.poweredconveyor.fulldescription = Кінцевий транспортний блок. Переміщення елементів швидше, ніж сталеві конвеєри.
block.router.name = Маршрутизатор
block.router.fulldescription = Приймає елементи з одного напрямку і виводить їх на 3 інших напрямках. Можна також зберігати певну кількість предметів. Використовується для розщеплення матеріалів з одного свердла на декілька башточок.
block.junction.name = Міст
block.junction.fulldescription = Виступає як міст для двох перехресних конвеєрних стрічок. Корисне у ситуаціях з двома різними конвеєрами, що несуть різні матеріали в різних місцях.
block.conveyortunnel.name = Конвеєрний тунель
block.conveyortunnel.fulldescription = Транспортує предмети під блоками. Щоб використати, помістіть один тунель, що веде у блок, щоб бути підсвіченим, а один - з іншого боку. Переконайтеся, що обидва тунелі стикаються з протилежними напрямками, тобто до блоків, які вони вводять або виводять.
block.liquidjunction.name = Міст для рідини
block.liquidjunction.fulldescription = Діє як міст для двох перехресних трубопроводів. Корисно в ситуаціях з двома різними трубами, що несуть різні рідини в різних місцях.
block.liquiditemjunction.name = Перехрестя рідкого пункту
block.liquiditemjunction.fulldescription = Виступає як міст для перетину трубопроводів і конвеєрів.
block.powerbooster.name = Підсилювач потужності
block.powerbooster.fulldescription = Поширює енергію на всі блоки в межах його радіуса.
block.powerlaser.name = Енергетичний лазер
block.powerlaser.fulldescription = Створює лазер, який передає енергію блоку перед ним. Не створює жодної сили сама. Найкраще використовується з генераторами або іншими лазерами.
block.powerlaserrouter.name = Лазерний маршрутизатор
block.powerlaserrouter.fulldescription = Лазер, який розподіляє енергію у три напрямки одночасно. Корисно в ситуаціях, коли потрібно живити кілька блоків від одного генератора.
block.powerlasercorner.name = Лазерний кут
block.powerlasercorner.fulldescription = Лазер, який розподіляє енергію одночасно на два напрямки. Корисно в ситуаціях, коли потрібно живити кілька блоків від одного генератора, а маршрутизатор неточний.
block.teleporter.name = Телепорт
block.teleporter.fulldescription = Продвинутий блок транспортування предметів.Щоб телепортувати предмети з одного місця в інше потрібно збудувати 2 телепорти і назначити на них одинаковий колір. Використовує енергію. Натисніть, щоб змінити колір.
block.sorter.name = Сортувальник
block.sorter.fulldescription = Сортує предмети за типом матеріалу. Матеріал для прийняття позначається кольором у блоці. Всі елементи, що відповідають матеріалу сортування, виводяться вперед, а все інше виводить ліворуч і праворуч.
block.core.name = Ядро
block.pump.name = Насос
block.pump.fulldescription = Насоси рідини з вихідного блоку - зазвичай вода, лава чи олія. Виводить рідину в сусідні трубопроводи.
block.fluxpump.name = Флюсовий насос
block.fluxpump.fulldescription = Розширений варіант насоса. Зберігає більше рідини та перекачує швидше.
block.smelter.name = Плавильня
block.smelter.fulldescription = Основний ремісничий блок. Коли вводиться 1 залізо та 1 вугілля в якості палива, виводить одну сталь. Рекомендується вводити залізо та вугілля на різних поясах, щоб запобігти засміченню.
block.crucible.name = Тигель
block.crucible.fulldescription = Розширений блок обробки. При введенні 1 титану, 1 сталі та 1 вугілля в якості пального, виводить один дирний. Рекомендується вводити вугілля, сталь та титан на різних поясах, щоб запобігти засміченню.
block.coalpurifier.name = вугільний екстрактор
block.coalpurifier.fulldescription = Основний екстрактор. Виходить вугілля при постачанні великої кількості води та каменю.
block.titaniumpurifier.name = Титановий екстрактор
block.titaniumpurifier.fulldescription = Стандартний блок екстрактора. Виходить титан при постачанні великої кількості води та заліза.
block.oilrefinery.name = Нафтопереробний завод
block.oilrefinery.fulldescription = Очищує велику кількість нафти і перетворює на вугілля. Корисний для заправки вугільних башточок, коли вугільні родовища є дефіцитними.
block.stoneformer.name = Кам'янний екстрактор
block.stoneformer.fulldescription = Здавлюється рідка лава в камінь. Корисно для виготовлення великої кількості каменю для очищувачів вугілля.
block.lavasmelter.name = Лавовий завод
block.lavasmelter.fulldescription = Використовує лаву для перетворення залізо на сталь. Альтернатива плавильні. Корисно в ситуаціях, коли вугілля є дефіцитним.
block.stonedrill.name = Кам'янна свердловина
block.stonedrill.fulldescription = Основна свердловина.Розміщюється на кам'яній плитці виводить камінь повільними темпами.
block.irondrill.name = Залізна свердловина
block.irondrill.fulldescription = Базова свердловина.Розміщюється на родовищі залізної руди, випускає залізо в повільному темпі.
block.coaldrill.name = Вугільна свердловина
block.coaldrill.fulldescription = Базова свердловина.Розміщюється на родовищі вугільної руди ,видобуває вугілля повільними темпами.
block.thoriumdrill.name = Уранова свердловина
block.thoriumdrill.fulldescription = Продвинута свердловина. Розміщюється на родовищі уранової руди.Видобуток урану відбувається повільними темпами.
block.titaniumdrill.name = Титанова свердловина
block.titaniumdrill.fulldescription = Продвинута свердловина.Розміщюється на родовищі титанової руди, Видобуток титану відбувається повільним темпом.
block.omnidrill.name = Убер свердловина
block.omnidrill.fulldescription = Кінцева свердловина.Дуже швидко видобуває будь-який вид руди.
block.coalgenerator.name = Вугільний генератор
block.coalgenerator.fulldescription = Основний генератор. Генерує енергію з вугілля. Виводиться потужність лазерів на 4 сторони.
block.thermalgenerator.name = Теплогенератор
block.thermalgenerator.fulldescription = Генерує енергію від лави. Виводиться потужність лазерів на 4 сторони.
block.combustiongenerator.name = Генератор горіння
block.combustiongenerator.fulldescription = Генерує енергію з нафти. Виводиться потужність лазерів на 4 сторони.
block.rtgenerator.name = RTG генератор
block.rtgenerator.fulldescription = Генерує невелику кількість енергії з радіоактивного розпаду урану. Виводиться потужність лазерів на 4 сторони.
block.nuclearreactor.name = Ядерний реактор
block.nuclearreactor.fulldescription = Розширений варіант RTG Generator і кінцевий генератор електроенергії. Генерує енергію з урану. Потребує постійного водяного охолодження.Сильно вибухне якщо не буде постачання води у великії кількості
block.turret.name = Турель
block.turret.fulldescription = Базова, дешева турель. Використовує камінь для боєприпасів. Має трохи більше діапазону, ніж подвійна турель.
block.doubleturret.name = Подвійна турель
block.doubleturret.fulldescription = Дещо потужна версія турель. Використовує камінь для боєприпасів. Значно більший урон, але менший діапазон. Вистрілює дві кулі.
block.machineturret.name = Кулеметна турель
block.machineturret.fulldescription = Стандартна всеосяжна турель. Використовує залізо для боєприпасів. Має швидку швидкість пострілу і гідну шкоду.
block.shotgunturret.name = Розріджуюча турель
block.shotgunturret.fulldescription = Стандартна турель. Використовує залізо для боєприпасів. Вистрілює 7 куль навколо себе.Наносить значних ушкоджень,звісно якщо поцілить :)
block.flameturret.name = Вогнемет
block.flameturret.fulldescription = Продвинута турель ближнього діапазону. Використовує вугілля для боєприпасів. Має дуже низький радіус, але дуже високий збиток. Добре для близьких дистанцій. Рекомендується використовувати за стінами.
block.sniperturret.name = Лазерна турель.
block.sniperturret.fulldescription = Продвинута далекобійна турель. Використовує сталь для боєприпасів. Дуже високий збиток, але низький рівень урону. Дорогі для використання, але можуть бути розташовані далеко від ліній ворога через його радіус.
block.mortarturret.name = Флак турель
block.mortarturret.fulldescription = Продвинута,неточна турель. Використовує вугілля для боєприпасів. Стріляє кулями, що вибухають у шрапнеллв. Корисне для великих натовпів ворогів.
block.laserturret.name = Лазерна турель
block.laserturret.fulldescription = Продвинута однопушечна турель. Використовує енергію. Хороша на середніх дистанціях. Ніколи не пропускає.
block.waveturret.name = Тесла
block.waveturret.fulldescription = Передова багатоцільова турель. Використовує енергію. Середній радіус. Ніколи не пропускає. Активно знижує, але може вражати декількох ворогів одночасно з ланцюговим освітленням.
block.plasmaturret.name = Плазмова турель
block.plasmaturret.fulldescription = Дуже продвинута версія Вогнеметної турелі. Використовує вугілля як боєприпаси. Дуже високий урон, від близької до середньої дистанції.
block.chainturret.name = Уранова турель
block.chainturret.fulldescription = Остаточна швидкістна вежа. Використовує уран як боєприпаси. Вистрілює великі кулі при високій швидкості вогню. Середній радіус. Промінь кілька плиток. Надзвичайно жорсткий.
block.titancannon.name = Титанова гармата
block.titancannon.fulldescription = Найбільш далекобійна турель. Використовує уран як боєприпаси. Вистрілює великі снаряди. Далекобійний. Промінь кілька плиток. Надзвичайно жорсткий.
block.playerspawn.name = Спавн Гравця
block.enemyspawn.name = Спавн ворогів
text.quit=Вийти
text.about.button=Про
text.name=Назва:
text.players={0} гравців онлайн
text.players.single={0} гравців онлайн
text.server.mismatch=Пакетна помилка: невідповідність версії версії клієнта / сервера. Переконайтеся, що ви та хост мають останню версію Mindustry!
text.server.closing=[accent] Закриття сервера ...
text.server.kicked.kick=Ви були вигнані з сервера!
text.server.kicked.invalidPassword=Невірний пароль!
text.server.kicked.clientOutdated=Застарілий клієнт! Оновіть свою гру!
text.server.kicked.serverOutdated=Застарілий сервер! Попросіть хост оновити!
text.server.connected={0} приєднався.
text.server.disconnected={0} від'єднано.
text.nohost=Неможливо розмістити сервер на власній карті!
text.hostserver=Хост-сервер
text.host=Хост
text.hosting=[accent] Відкриття сервера ...
text.hosts.refresh=Оновити
text.hosts.discovering=Знайомство з мережевими іграми
text.server.refreshing=Оновити сервери
text.hosts.none=[lightgray] Ніяких ігор у мережі не знайдено!
text.host.invalid=[scarlet] Неможливо підключитися до хосту.
text.server.friendlyfire=Дружній вогонь
text.server.add=Додати сервер
text.server.delete=Ви впевнені, що хочете видалити цей сервер?
text.server.hostname=Хост: {0}
text.server.edit=Редагувати сервер
text.joingame.title=Приєднатися до гри
text.joingame.ip=IP
text.disconnect=Роз'єднано
text.connecting=[accent] Підключення ...
text.connecting.data=[accent] Завантаження світових даних ...
text.connectfail=[crimson] Не вдалося підключитися до сервера: [orange] {0}
text.server.port=Порт
text.server.addressinuse=Адреса вже використовується!
text.server.invalidport=Недійсний номер порту.
text.server.error=[crimson] Помилка хостингу сервера: [orange] {0}
text.save.new=Нове збереження
text.save.overwrite=Ви впевнені, що хочете перезаписати цей слот для збереження?
text.overwrite=Перезаписати
text.save.none=Не знайдено жодних збережень!
text.saveload=[accent] Збереження ...
text.savefail=Не вдалося зберегти гру!
text.save.delete.confirm=Ви впевнені, що хочете видалити це збереження?
text.save.delete=Видалити
text.save.export=Експорт збереження
text.save.import.invalid=[orange] Це збереження недійсне!
text.save.import.fail=[crimson] Не вдалося імпортувати збереження: [orange] {0}
text.save.export.fail=[crimson] Не вдалося експортувати збереження: [orange] {0}
text.save.import=Імпортувати збереження
text.save.newslot=Назва збереження:
text.save.rename=Переіменувати
text.save.rename.text=Нова назва:
text.selectslot=Виберіть збереження.
text.slot=[accent] слот {0}
text.save.corrupted=[orange] Збережений файл пошкоджений або він невірний!
text.empty=<порожньо>
text.on=Увімкнути
text.off=Вимкнути
text.save.autosave=Автозбереження: {0}
text.save.map=Карта
text.save.wave=Хвиля {0}
text.save.difficulty=Складність
text.save.date=Останнє збережено: {0}
text.confirm=Підтвердити
text.delete=Видалити
text.ok=ОК
text.open=Відкрити
text.cancel=Скасувати
text.openlink=Відкрити посилання
text.back=Назад
text.quit.confirm=Ти впевнений що хочеш піти?
text.loading=[accent] Завантаження ...
text.wave=[orange] хвиля {0}
text.wave.waiting=Хвиля через {0}
text.waiting=Очікування…
text.enemies={0} Вороги
text.enemies.single=Противник
text.loadimage=Завантажити зображення
text.saveimage=Зберегти зображення
text.editor.badsize=[orange] Недійсні розміри зображення! [] Дійсні розміри карти: {0}
text.editor.errorimageload=Помилка завантаження файлу зображень: [orange] {0}
text.editor.errorimagesave=Помилка збереження файлу зображення: [orange] {0}
text.editor.generate=Генератор
text.editor.resize=Змінити розмір
text.editor.loadmap=// Завантажити карту
text.editor.savemap=Зберегти карту
text.editor.loadimage=Завантажити зображення
text.editor.saveimage=Зберегти зображення
text.editor.unsaved=[scarlet] У вас є незбережені зміни! [] Ви впевнені, що хочете вийти?
text.editor.resizemap=Змінити розмір карти
text.editor.mapname=Назва карти:
text.editor.overwrite=[accent] Попередження! Це перезаписує існуючу карту.
text.editor.selectmap=Виберіть карту для завантаження:
text.width=Ширина
text.height=Висота
text.menu=Меню
text.play=Відтворити
text.load=Завантаження
text.save=Зберегти
text.language.restart=Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності.
text.settings.language=Мова
text.settings=Налаштування
text.tutorial=Навчальний\nпосібник
text.editor=Редактор
text.mapeditor=Редактор карт
text.donate=Підтримати проект
text.settings.reset=Скинути до стандартних
text.settings.controls=Елементи управління
text.settings.game=Гра
text.settings.sound=Звук
text.settings.graphics=Графіка
text.upgrades=Оновлення
text.purchased=[LIME] Створено!
text.weapons=Зброя
text.paused=Пауза
text.info.title=[accent] інформація
text.error.title=[crimson] Виникла помилка
text.error.crashtitle=Виникла помилка
text.blocks.blockinfo=Блокування інформації
text.blocks.powercapacity=Потужність
text.blocks.powershot=Потужність / постріл
text.blocks.size=Розмір
text.blocks.liquidcapacity=Ємкість рідини
text.blocks.maxitemssecond=Макс. Елементи / секунду
text.blocks.powerrange=Радіус потужності
text.blocks.itemcapacity=Ємкість предмету
text.blocks.inputliquid=Ввід речовини
text.blocks.inputitem=Вхідний матеріал
text.blocks.explosive=Вибухонебезпечний!
text.blocks.health=Здоров'я
text.blocks.inaccuracy=Неточність
text.blocks.shots=Постріли
text.blocks.inputcapacity=Вхідна ємність
text.blocks.outputcapacity=Випускна ємність
setting.difficulty.easy=Легкий
setting.difficulty.normal=Нормальний
setting.difficulty.hard=Важкий
setting.difficulty.insane=Божевільний
setting.difficulty.purge=Очистити
setting.difficulty.name=Складність
setting.screenshake.name=Тряска екрана
setting.indicators.name=Індикатори ворога
setting.effects.name=Ефекти відображення
setting.sensitivity.name=Чутливість контролера
setting.saveinterval.name=Інтервал автозбереження
setting.seconds={0} секунд
setting.fullscreen.name=Повноекранний
setting.multithread.name=Багатопотоковий [scarlet] (нестабільний!)
setting.fps.name=Показати FPS
setting.vsync.name=VSunc
setting.lasers.name=Показати енергетичні лазери
setting.healthbars.name=Показати здоров'я
setting.musicvol.name=Гучність музики
setting.mutemusic.name=Вимкнути музику
setting.sfxvol.name=Гучність ефектів
setting.mutesound.name=Вимкнути звук
map.maze.name=Лабіринт
map.fortress.name=Фортеця
map.sinkhole.name=Свердловина
map.caves.name=Печери
map.volcano.name=Вулкан
map.caldera.name=Кальдера
map.scorch.name=Мертва земля
map.desert.name=Пустеля
map.island.name=Острів
map.grassland.name=Пасовища
map.tundra.name=Тундра
map.spiral.name=Спіраль
map.tutorial.name=Навчання
text.keybind.title=Ключ перемотки
keybind.move_x.name=move_x
keybind.move_y.name=move_y
keybind.select.name=Вибрати
keybind.break.name={0}break{/0}{1}; {/1}
keybind.shoot.name=Постріл
keybind.zoom_hold.name=zoom_hold
keybind.zoom.name=Збільшити
keybind.block_info.name=Інформація про блок
keybind.menu.name=Меню
keybind.pause.name=Пауза
keybind.dash.name=Тире
keybind.chat.name=Чат
keybind.player_list.name=Список гравців
keybind.console.name=// Консоль 1
keybind.rotate_alt.name=rotate_alt
keybind.rotate.name=Повернути
mode.waves.name=Хвилі
mode.sandbox.name=Пісочниця
mode.freebuild.name=Вільний режим
item.stone.name=Камінь
item.coal.name=Вугівалля
item.titanium.name=Титан
item.thorium.name=Уран
item.sand.name=Пісок
liquid.water.name=Вода
liquid.lava.name=Лава
liquid.oil.name=Нафта
block.door.name=Двері
block.door-large.name=Великі двері
block.conduit.name=Трубопровід
block.pulseconduit.name=Імпульсний канал
block.liquidrouter.name=маршрутизатор для рідини
block.conveyor.name=Конвеєр
block.router.name=Маршрутизатор
block.junction.name=Міст
block.liquidjunction.name=Міст для рідини
block.sorter.name=Сортувальник
block.smelter.name=Плавильня
text.credits=Credits
text.link.discord.description=the official Mindustry discord chatroom
text.link.github.description=Game source code
text.link.dev-builds.description=Unstable development builds
text.link.trello.description=Official trello board for planned features
text.link.itch.io.description=itch.io page with PC downloads and web version
text.link.google-play.description=Google Play store listing
text.link.wiki.description=official Mindustry wiki
text.linkfail=Failed to open link!\nThe URL has been copied to your cliboard.
text.editor.web=The web version does not support the editor!\nDownload the game to use it.
text.web.unsupported=The web version does not support this feature! Download the game to use it.
text.multiplayer.web=This version of the game does not support multiplayer!\nTo play multiplayer from your browser, use the "multiplayer web version" link at the itch.io page.
text.host.web=The web version does not support hosting games! Download the game to use this feature.
text.map.delete=Are you sure you want to delete the map "[orange]{0}[]"?
text.construction.title=Block Construction Guide
text.construction=You've just selected [accent]block construction mode[].\n\nTo begin placing, simply tap a valid location near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Shift the selection[] by holding and dragging any block in the selection.\n- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel construction or selection[] by pressing the X at the bottom left.
text.deconstruction.title=Block Deconstruction Guide
text.deconstruction=You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left.
text.showagain=Don't show again next session
text.unlocks=Unlocks
text.addplayers=Add/Remove Players
text.maps=Maps
text.maps.none=[LIGHT_GRAY]No maps found!
text.unlocked=New Block Unlocked!
text.unlocked.plural=New Blocks Unlocked!
text.server.kicked.fastShoot=You are shooting too quickly.
text.server.kicked.banned=You are banned on this server.
text.server.kicked.recentKick=You have been kicked recently.\nWait before connecting again.
text.server.kicked.nameInUse=There is someone with that name\nalready on this server.
text.server.kicked.nameEmpty=Your name must contain at least one character or number.
text.server.kicked.idInUse=You are already on this server! Connecting with two accounts is not permitted.
text.server.kicked.customClient=This server does not support custom builds. Download an official version.
text.host.info=The [accent]host[] button hosts a server on ports [scarlet]6567[] and [scarlet]6568.[]\nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings.
text.join.info=Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[LIGHT_GRAY]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
text.trace=Trace Player
text.trace.playername=Player name: [accent]{0}
text.trace.ip=IP: [accent]{0}
text.trace.id=Unique ID: [accent]{0}
text.trace.android=Android Client: [accent]{0}
text.trace.modclient=Custom Client: [accent]{0}
text.trace.totalblocksbroken=Total blocks broken: [accent]{0}
text.trace.structureblocksbroken=Structure blocks broken: [accent]{0}
text.trace.lastblockbroken=Last block broken: [accent]{0}
text.trace.totalblocksplaced=Total blocks placed: [accent]{0}
text.trace.lastblockplaced=Last block placed: [accent]{0}
text.invalidid=Invalid client ID! Submit a bug report.
text.server.bans=Bans
text.server.bans.none=No banned players found!
text.server.admins=Admins
text.server.admins.none=No admins found!
text.server.outdated=[crimson]Outdated Server![]
text.server.outdated.client=[crimson]Outdated Client![]
text.server.version=[lightgray]Version: {0}
text.server.custombuild=[yellow]Custom Build
text.confirmban=Are you sure you want to ban this player?
text.confirmunban=Are you sure you want to unban this player?
text.confirmadmin=Are you sure you want to make this player an admin?
text.confirmunadmin=Are you sure you want to remove admin status from this player?
text.disconnect.data=Failed to load world data!
text.copylink=Copy Link
text.changelog.title=Changelog
text.changelog.loading=Getting changelog...
text.changelog.error.android=[orange]Note that the changelog sometimes does not work on Android 4.4 and below!\nThis is due to an internal Android bug.
text.changelog.error.ios=[orange]The changelog is currently not supported in iOS.
text.changelog.error=[scarlet]Error getting changelog!\nCheck your internet connection.
text.changelog.current=[yellow][[Current version]
text.changelog.latest=[orange][[Latest version]
text.saving=[accent]Saving...
text.unknown=Unknown
text.custom=Custom
text.builtin=Built-In
text.map.delete.confirm=Are you sure you want to delete this map? This action cannot be undone!
text.map.random=[accent]Random Map
text.map.nospawn=This map does not have any cores for the player to spawn in! Add a [ROYAL]blue[] core to this map in the editor.
text.editor.slope=\\
text.editor.openin=Open In Editor
text.editor.oregen=Ore Generation
text.editor.oregen.info=Ore Generation:
text.editor.mapinfo=Map Info
text.editor.author=Author:
text.editor.description=Description:
text.editor.name=Name:
text.editor.teams=Teams
text.editor.elevation=Elevation
text.editor.saved=Saved!
text.editor.save.noname=Your map does not have a name! Set one in the 'map info' menu.
text.editor.save.overwrite=Your map overwrites a built-in map! Pick a different name in the 'map info' menu.
text.editor.import.exists=[scarlet]Unable to import:[] a built-in map named '{0}' already exists!
text.editor.import=Import...
text.editor.importmap=Import Map
text.editor.importmap.description=Import an already existing map
text.editor.importfile=Import File
text.editor.importfile.description=Import an external map file
text.editor.importimage=Import Terrain Image
text.editor.importimage.description=Import an external map image file
text.editor.export=Export...
text.editor.exportfile=Export File
text.editor.exportfile.description=Export a map file
text.editor.exportimage=Export Terrain Image
text.editor.exportimage.description=Export a map image file
text.editor.overwrite.confirm=[scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
text.fps=FPS: {0}
text.tps=TPS: {0}
text.ping=Ping: {0}ms
text.settings.rebind=Rebind
text.yes=Yes
text.no=No
text.blocks.targetsair=Targets Air
text.blocks.itemspeed=Units Moved
text.blocks.shootrange=Range
text.blocks.poweruse=Power Use
text.blocks.inputitemcapacity=Input Item Capacity
text.blocks.outputitemcapacity=Input Item Capacity
text.blocks.maxpowergeneration=Max Power Generation
text.blocks.powertransferspeed=Power Transfer
text.blocks.craftspeed=Production Speed
text.blocks.inputliquidaux=Aux Liquid
text.blocks.inputitems=Input Items
text.blocks.outputitem=Output Item
text.blocks.drilltier=Drillables
text.blocks.drillspeed=Base Drill Speed
text.blocks.liquidoutput=Liquid Output
text.blocks.liquiduse=Liquid Use
text.blocks.coolant=Coolant
text.blocks.coolantuse=Coolant Use
text.blocks.inputliquidfuel=Fuel Liquid
text.blocks.liquidfueluse=Liquid Fuel Use
text.blocks.reload=Reload
text.blocks.inputfuel=Fuel
text.blocks.fuelburntime=Fuel Burn Time
text.unit.blocks=blocks
text.unit.powersecond=power units/second
text.unit.liquidsecond=liquid units/second
text.unit.itemssecond=items/second
text.unit.pixelssecond=pixels/second
text.unit.liquidunits=liquid units
text.unit.powerunits=power units
text.unit.degrees=degrees
text.unit.seconds=seconds
text.unit.none=
text.unit.items=items
text.category.general=General
text.category.power=Power
text.category.liquids=Liquids
text.category.items=Items
text.category.crafting=Crafting
text.category.shooting=Shooting
setting.minimap.name=Show Minimap
mode.text.help.title=Description of modes
mode.waves.description=the normal mode. limited resources and automatic incoming waves.
mode.sandbox.description=infinite resources and no timer for waves.
mode.freebuild.description=limited resources and no timer for waves.
content.item.name=Items
content.liquid.name=Liquids
content.unit-type.name=Units
content.recipe.name=Blocks
item.stone.description=A common raw material. Used for separating and refining into other materials, or melting into lava.
item.tungsten.name=Tungsten
item.tungsten.description=A common, but very useful structure material. Used in drills and heat-resistant blocks such as generators and smelteries.
item.lead.name=Lead
item.lead.description=A basic starter material. Used extensively in electronics and liquid transportation blocks.
item.coal.description=A common and readily available fuel.
item.carbide.name=Carbide
item.carbide.description=A tough alloy made with tungsten and carbon. Used in advanced transportation blocks and high-tier drills.
item.titanium.description=A rare super-light metal used extensively in liquid transportation, drills and aircraft.
item.thorium.description=A dense, radioactive metal used as structural support and nuclear fuel.
item.silicon.name=Silicon
item.silcion.description=An extremely useful semiconductor, with applications in solar panels and many complex electronics.
item.plastanium.name=Plastanium
item.plastanium.description=A light, ductile material used in advanced aircraft and fragmentation ammunition.
item.phase-matter.name=Phase Matter
item.surge-alloy.name=Surge Alloy
item.biomatter.name=Biomatter
item.biomatter.description=A clump of organic mush; used for conversion into oil or as a basic fuel.
item.sand.description=A common material that is used extensively in smelting, both in alloying and as a flux.
item.blast-compound.name=Blast Compound
item.blast-compound.description=A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised.
item.pyratite.name=Pyratite
item.pyratite.description=An extremely flammable substance used in incendiary weapons.
liquid.cryofluid.name=Cryofluid
text.item.explosiveness=[LIGHT_GRAY]Explosiveness: {0}
text.item.flammability=[LIGHT_GRAY]Flammability: {0}
text.item.radioactivity=[LIGHT_GRAY]Radioactivity: {0}
text.item.fluxiness=[LIGHT_GRAY]Flux Power: {0}
text.item.hardness=[LIGHT_GRAY]Hardness: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]Heat Capacity: {0}
text.liquid.viscosity=[LIGHT_GRAY]Viscosity: {0}
text.liquid.temperature=[LIGHT_GRAY]Temperature: {0}
block.tungsten-wall.name=Tungsten Wall
block.tungsten-wall-large.name=Large Tungsten Wall
block.carbide-wall.name=Carbide Wall
block.carbide-wall-large.name=Large Carbide Wall
block.thorium-wall.name=Thorium Wall
block.thorium-wall-large.name=Large Thorium Wall
block.duo.name=Duo
block.scorch.name=Scorch
block.hail.name=Hail
block.lancer.name=Lancer
block.titanium-conveyor.name=Titanium Conveyor
block.splitter.name=Splitter
block.splitter.description=Outputs items into two opposite directions immediately after they are recieved.
block.router.description=Splits items into all 4 directions. Can store items as a buffer.
block.distributor.name=Distributor
block.distributor.description=A splitter that can split items into 8 directions.
block.sorter.description=Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right.
block.overflow-gate.name=Overflow Gate
block.overflow-gate.description=A combination splitter and router that only outputs to the left and right if the front path is blocked.
block.bridgeconveyor.name=Bridge Conveyor
block.bridgeconveyor.description=A conveyor that can go over other blocks, for up to two total blocks.
block.arc-smelter.name=Arc Smelter
block.silicon-smelter.name=Silicon Smelter
block.phase-weaver.name=Phase Weaver
block.pulverizer.name=Pulverizer
block.cryofluidmixer.name=Cryofluid Mixer
block.melter.name=Melter
block.incinerator.name=Incinerator
block.biomattercompressor.name=Biomatter Compressor
block.separator.name=Separator
block.centrifuge.name=Centrifuge
block.power-node.name=Power Node
block.power-node-large.name=Large Power Node
block.battery.name=Battery
block.battery-large.name=Large Battery
block.combustion-generator.name=Combustion Generator
block.turbine-generator.name=Turbine Generator
block.tungsten-drill.name=Tungsten Drill
block.carbide-drill.name=Carbide Drill
block.laser-drill.name=Laser Drill
block.water-extractor.name=Water Extractor
block.cultivator.name=Cultivator
block.dart-ship-factory.name=Dart Ship Factory
block.delta-mech-factory.name=Delta Mech Factory
block.dronefactory.name=Drone Factory
block.repairpoint.name=Repair Point
block.resupplypoint.name=Resupply Point
block.liquidtank.name=Liquid Tank
block.bridgeconduit.name=Bridge Conduit
block.mechanical-pump.name=Mechanical Pump
block.itemsource.name=Item Source
block.itemvoid.name=Item Void
block.liquidsource.name=Liquid Source
block.powervoid.name=Power Void
block.powerinfinite.name=Power Infinite
block.unloader.name=Unloader
block.sortedunloader.name=Sorted Unloader
block.vault.name=Vault
block.wave.name=Wave
block.swarmer.name=Swarmer
block.salvo.name=Salvo
block.ripple.name=Ripple
block.phase-conveyor.name=Phase Conveyor
block.bridge-conveyor.name=Bridge Conveyor
block.plastanium-compressor.name=Plastanium Compressor
block.pyratite-mixer.name=Pyratite Mixer
block.blast-mixer.name=Blast Mixer
block.solidifer.name=Solidifer
block.solar-panel.name=Solar Panel
block.solar-panel-large.name=Large Solar Panel
block.oil-extractor.name=Oil Extractor
block.javelin-ship-factory.name=Javelin Ship factory
block.drone-factory.name=Drone Factory
block.fabricator-factory.name=Fabricator Factory
block.repair-point.name=Repair Point
block.resupply-point.name=Resupply Point
block.pulse-conduit.name=Pulse Conduit
block.phase-conduit.name=Phase Conduit
block.liquid-router.name=Liquid Router
block.liquid-tank.name=Liquid Tank
block.liquid-junction.name=Liquid Junction
block.bridge-conduit.name=Bridge Conduit
block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.

View File

@@ -3,6 +3,8 @@ precision mediump float;
precision mediump int;
#endif
#define SPACE 1.0
uniform sampler2D u_texture;
uniform vec4 u_color;
@@ -11,30 +13,15 @@ uniform vec2 u_texsize;
varying vec4 v_color;
varying vec2 v_texCoord;
bool id(vec4 v){
return v.a > 0.1;
}
void main() {
vec2 T = v_texCoord.xy;
vec2 v = vec2(1.0/u_texsize.x, 1.0/u_texsize.y);
bool any = false;
vec4 c = texture2D(u_texture, v_texCoord.xy);
float step = 1.0;
vec4 c = texture2D(u_texture, T);
if(texture2D(u_texture, T).a < 0.1 &&
(id(texture2D(u_texture, T + vec2(0, step) * v)) || id(texture2D(u_texture, T + vec2(0, -step) * v)) ||
id(texture2D(u_texture, T + vec2(step, 0) * v)) || id(texture2D(u_texture, T + vec2(-step, 0) * v))))
any = true;
if(any){
gl_FragColor = u_color;
}else{
gl_FragColor = c * v_color;
}
gl_FragColor = mix(c * v_color, u_color,
(1.0-step(0.1, texture2D(u_texture, v_texCoord.xy).a)) *
step(0.1, texture2D(u_texture, v_texCoord.xy + vec2(0, SPACE) * v).a +
texture2D(u_texture, v_texCoord.xy + vec2(0, -SPACE) * v).a +
texture2D(u_texture, v_texCoord.xy + vec2(SPACE, 0) * v).a +
texture2D(u_texture, v_texCoord.xy + vec2(-SPACE, 0) * v).a));
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 133 KiB

View File

@@ -1,24 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<module>
<source path="io/anuke/mindustry" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.world.Tile" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.game.Content" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.io.Maps" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.entities.Player" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.entities.units.BaseUnit" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.world.Map" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.game.SpawnGroup" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.core.GameState" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.game.EventType" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.io.SaveFileVersion" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.type.Recipe" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.ucore.entities.impl.EffectEntity" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.net.Packets" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.net.Packet" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.entities.effect" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.entities.bullet.Bullet" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.type.Recipe" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.net.Streamable" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.world.meta.BlockBar" />
<extend-configuration-property name="gdx.reflect.include" value="com.badlogic.gdx.utils.Predicate" />
<source path="io/anuke/mindustry"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.world.Tile"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.game.Content"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.io.Maps"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.world.Map"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.game.SpawnGroup"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.core.GameState"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.game.EventType"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.io.SaveFileVersion"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.ucore.entities.impl.EffectEntity"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.net.Packets"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.net.Packet"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.entities.effect"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.entities.bullet.Bullet"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.game.Team"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.net.Streamable"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.world.meta.BlockBar"/>
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.world.mapgen.WorldGenerator"/>
<extend-configuration-property name="gdx.reflect.include" value="com.badlogic.gdx.utils.Predicate"/>
</module>

View File

@@ -1,6 +1,5 @@
package io.anuke.mindustry;
import com.badlogic.gdx.utils.async.AsyncExecutor;
import io.anuke.mindustry.core.*;
import io.anuke.mindustry.io.BundleLoader;
import io.anuke.ucore.core.Timers;
@@ -9,36 +8,35 @@ import io.anuke.ucore.util.Log;
import static io.anuke.mindustry.Vars.*;
public class Mindustry extends ModuleCore {
private AsyncExecutor exec = new AsyncExecutor(1);
public class Mindustry extends ModuleCore{
@Override
public void init(){
Timers.mark();
@Override
public void init(){
Timers.mark();
Vars.init();
Vars.init();
debug = Platform.instance.isDebug();
debug = Platform.instance.isDebug();
Log.setUseColors(false);
BundleLoader.load();
ContentLoader.load();
Log.setUseColors(false);
BundleLoader.load();
ContentLoader.load();
module(logic = new Logic());
module(world = new World());
module(control = new Control());
module(renderer = new Renderer());
module(ui = new UI());
module(netServer = new NetServer());
module(netClient = new NetClient());
module(logic = new Logic());
module(world = new World());
module(control = new Control());
module(renderer = new Renderer());
module(ui = new UI());
module(netServer = new NetServer());
module(netClient = new NetClient());
Log.info("Time to load [total]: {0}", Timers.elapsed());
}
}
@Override
public void render(){
super.render();
threads.handleRender();
}
@Override
public void render(){
super.render();
threads.handleRender();
}
}

View File

@@ -19,8 +19,8 @@ import io.anuke.mindustry.io.Version;
import io.anuke.mindustry.net.Net;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.entities.EntityGroup;
import io.anuke.ucore.entities.trait.DrawTrait;
import io.anuke.ucore.entities.impl.EffectEntity;
import io.anuke.ucore.entities.trait.DrawTrait;
import io.anuke.ucore.scene.ui.layout.Unit;
import io.anuke.ucore.util.OS;
import io.anuke.ucore.util.Translator;
@@ -28,167 +28,150 @@ import io.anuke.ucore.util.Translator;
import java.util.Locale;
public class Vars{
public static boolean testMobile;
//shorthand for whether or not this is running on android or ios
public static boolean mobile;
public static boolean ios;
public static boolean android;
//shorthand for whether or not this is running on GWT
public static boolean gwt;
//respawn time in frames
public static final float respawnduration = 60*4;
//time between waves in frames (on normal mode)
public static final float wavespace = 60*60*2f;
//waves can last no longer than 3 minutes, otherwise the next one spawns
public static final float maxwavespace = 60*60*4f;
//set ridiculously high for now
public static final float coreBuildRange = 800999f;
//discord group URL
public static final String discordURL = "https://discord.gg/BKADYds";
public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases";
//directory for user-created map data
public static FileHandle customMapDirectory;
//save file directory
public static FileHandle saveDirectory;
public static String mapExtension = "mmap";
public static String saveExtension = "msav";
//scale of the font
public static float fontScale;
//camera zoom displayed on startup
public static int baseCameraScale;
//if true, player speed will be increased, massive amounts of resources will be given on start, and other debug options will be available
public static boolean debug = false;
public static boolean console = false;
//whether the player can clip through walls
public static boolean noclip = false;
//whether turrets have infinite ammo (only with debug)
public static boolean infiniteAmmo = true;
//whether to show paths of enemies
public static boolean showPaths = false;
//if false, player is always hidden
public static boolean showPlayer = true;
//whether to hide ui, only on debug
public static boolean showUI = true;
//whether to show block debug
public static boolean showBlockDebug = false;
public static boolean showFog = true;
//respawn time in frames
public static final float respawnduration = 60 * 4;
//time between waves in frames (on normal mode)
public static final float wavespace = 60 * 60 * 2f;
//waves can last no longer than 3 minutes, otherwise the next one spawns
public static final float maxwavespace = 60 * 60 * 4f;
//set ridiculously high for now
public static final float coreBuildRange = 800999f;
//discord group URL
public static final String discordURL = "https://discord.gg/BKADYds";
public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases";
public static final int maxTextLength = 150;
public static final int maxNameLength = 40;
public static final int maxCharNameLength = 20;
public static final int saveSlots = 64;
public static final float itemSize = 5f;
public static final int tilesize = 8;
public static final Locale[] locales = {new Locale("en"), new Locale("fr"), new Locale("ru"), new Locale("uk", "UA"), new Locale("pl"),
new Locale("de"), new Locale("pt", "BR"), new Locale("ko"), new Locale("in", "ID"), new Locale("ita"), new Locale("es")};
public static final Color[] playerColors = {
Color.valueOf("82759a"),
Color.valueOf("c0c1c5"),
Color.valueOf("fff0e7"),
Color.valueOf("7d2953"),
Color.valueOf("ff074e"),
Color.valueOf("ff072a"),
Color.valueOf("ff76a6"),
Color.valueOf("a95238"),
Color.valueOf("ffa108"),
Color.valueOf("feeb2c"),
Color.valueOf("ffcaa8"),
Color.valueOf("008551"),
Color.valueOf("00e339"),
Color.valueOf("423c7b"),
Color.valueOf("4b5ef1"),
Color.valueOf("2cabfe"),
};
//server port
public static final int port = 6567;
public static final int webPort = 6568;
public static boolean testMobile;
//shorthand for whether or not this is running on android or ios
public static boolean mobile;
public static boolean ios;
public static boolean android;
//shorthand for whether or not this is running on GWT
public static boolean gwt;
//directory for user-created map data
public static FileHandle customMapDirectory;
//save file directory
public static FileHandle saveDirectory;
public static String mapExtension = "mmap";
public static String saveExtension = "msav";
//scale of the font
public static float fontScale;
//camera zoom displayed on startup
public static int baseCameraScale;
//if true, player speed will be increased, massive amounts of resources will be given on start, and other debug options will be available
public static boolean debug = false;
public static boolean console = false;
//whether the player can clip through walls
public static boolean noclip = false;
//whether turrets have infinite ammo (only with debug)
public static boolean infiniteAmmo = true;
//whether to show paths of enemies
public static boolean showPaths = false;
//if false, player is always hidden
public static boolean showPlayer = true;
//whether to hide ui, only on debug
public static boolean showUI = true;
//whether to show block debug
public static boolean showBlockDebug = false;
public static boolean showFog = true;
public static boolean headless = false;
public static float controllerMin = 0.25f;
public static float baseControllerSpeed = 11f;
//only if smoothCamera
public static boolean snapCamera = true;
public static GameState state;
public static ThreadHandler threads;
public static boolean headless = false;
public static Control control;
public static Logic logic;
public static Renderer renderer;
public static UI ui;
public static World world;
public static NetServer netServer;
public static NetClient netClient;
public static float controllerMin = 0.25f;
public static Player[] players = {};
public static float baseControllerSpeed = 11f;
public static EntityGroup<Player> playerGroup;
public static EntityGroup<TileEntity> tileGroup;
public static EntityGroup<Bullet> bulletGroup;
public static EntityGroup<Shield> shieldGroup;
public static EntityGroup<EffectEntity> effectGroup;
public static EntityGroup<DrawTrait> groundEffectGroup;
public static EntityGroup<ItemDrop> itemGroup;
public static final int saveSlots = 64;
public static EntityGroup<Puddle> puddleGroup;
public static EntityGroup<Fire> fireGroup;
public static EntityGroup<BaseUnit>[] unitGroups;
public static final float itemSize = 5f;
public static final Translator[] tmptr = new Translator[]{new Translator(), new Translator(), new Translator(), new Translator()};
//only if smoothCamera
public static boolean snapCamera = true;
public static final int tilesize = 8;
public static void init(){
Version.init();
public static final Translator[] tmptr = new Translator[]{new Translator(), new Translator(), new Translator(), new Translator()};
playerGroup = Entities.addGroup(Player.class).enableMapping();
tileGroup = Entities.addGroup(TileEntity.class, false);
bulletGroup = Entities.addGroup(Bullet.class).enableMapping();
shieldGroup = Entities.addGroup(Shield.class, false);
effectGroup = Entities.addGroup(EffectEntity.class, false);
groundEffectGroup = Entities.addGroup(DrawTrait.class, false);
puddleGroup = Entities.addGroup(Puddle.class, false).enableMapping();
itemGroup = Entities.addGroup(ItemDrop.class).enableMapping();
fireGroup = Entities.addGroup(Fire.class, false).enableMapping();
unitGroups = new EntityGroup[Team.all.length];
public static final Locale[] locales = {new Locale("en"), new Locale("fr"), new Locale("ru"), new Locale("uk", "UA"), new Locale("pl"),
new Locale("de"), new Locale("pt", "BR"), new Locale("ko"), new Locale("in", "ID"), new Locale("ita"), new Locale("es")};
for(Team team : Team.all){
unitGroups[team.ordinal()] = Entities.addGroup(BaseUnit.class).enableMapping();
}
public static final Color[] playerColors = {
Color.valueOf("82759a"),
Color.valueOf("c0c1c5"),
Color.valueOf("fff0e7"),
Color.valueOf("7d2953"),
Color.valueOf("ff074e"),
Color.valueOf("ff072a"),
Color.valueOf("ff76a6"),
Color.valueOf("a95238"),
Color.valueOf("ffa108"),
Color.valueOf("feeb2c"),
Color.valueOf("ffcaa8"),
Color.valueOf("008551"),
Color.valueOf("00e339"),
Color.valueOf("423c7b"),
Color.valueOf("4b5ef1"),
Color.valueOf("2cabfe"),
};
for(EntityGroup<?> group : Entities.getAllGroups()){
group.setRemoveListener(entity -> {
if(entity instanceof SyncTrait && Net.client()){
netClient.addRemovedEntity((entity).getID());
}
});
}
//server port
public static final int port = 6567;
public static final int webPort = 6568;
threads = new ThreadHandler(Platform.instance.getThreadProvider());
public static GameState state;
public static ThreadHandler threads;
mobile = Gdx.app.getType() == ApplicationType.Android || Gdx.app.getType() == ApplicationType.iOS || testMobile;
ios = Gdx.app.getType() == ApplicationType.iOS;
android = Gdx.app.getType() == ApplicationType.Android;
gwt = Gdx.app.getType() == ApplicationType.WebGL;
public static Control control;
public static Logic logic;
public static Renderer renderer;
public static UI ui;
public static World world;
public static NetServer netServer;
public static NetClient netClient;
public static Player[] players = {};
if(!gwt){
customMapDirectory = OS.getAppDataDirectory("Mindustry").child("maps/");
saveDirectory = OS.getAppDataDirectory("Mindustry").child("saves/");
}
public static EntityGroup<Player> playerGroup;
public static EntityGroup<TileEntity> tileGroup;
public static EntityGroup<Bullet> bulletGroup;
public static EntityGroup<Shield> shieldGroup;
public static EntityGroup<EffectEntity> effectGroup;
public static EntityGroup<DrawTrait> groundEffectGroup;
public static EntityGroup<ItemDrop> itemGroup;
public static EntityGroup<Puddle> puddleGroup;
public static EntityGroup<Fire> fireGroup;
public static EntityGroup<BaseUnit>[] unitGroups;
public static void init(){
Version.init();
playerGroup = Entities.addGroup(Player.class).enableMapping();
tileGroup = Entities.addGroup(TileEntity.class, false);
bulletGroup = Entities.addGroup(Bullet.class).enableMapping();
shieldGroup = Entities.addGroup(Shield.class, false);
effectGroup = Entities.addGroup(EffectEntity.class, false);
groundEffectGroup = Entities.addGroup(DrawTrait.class, false);
puddleGroup = Entities.addGroup(Puddle.class, false).enableMapping();
itemGroup = Entities.addGroup(ItemDrop.class).enableMapping();
fireGroup = Entities.addGroup(Fire.class, false).enableMapping();
unitGroups = new EntityGroup[Team.all.length];
for(Team team : Team.all){
unitGroups[team.ordinal()] = Entities.addGroup(BaseUnit.class).enableMapping();
}
for(EntityGroup<?> group : Entities.getAllGroups()){
group.setRemoveListener(entity -> {
if(entity instanceof SyncTrait && Net.client()){
netClient.addRemovedEntity(((SyncTrait) entity).getID());
}
});
}
threads = new ThreadHandler(Platform.instance.getThreadProvider());
mobile = Gdx.app.getType() == ApplicationType.Android || Gdx.app.getType() == ApplicationType.iOS || testMobile;
ios = Gdx.app.getType() == ApplicationType.iOS;
android = Gdx.app.getType() == ApplicationType.Android;
gwt = Gdx.app.getType() == ApplicationType.WebGL;
if(!gwt) {
customMapDirectory = OS.getAppDataDirectory("Mindustry").child("maps/");
saveDirectory = OS.getAppDataDirectory("Mindustry").child("saves/");
}
fontScale = Math.max(Unit.dp.scl(1f)/2f, 0.5f);
baseCameraScale = Math.round(Unit.dp.scl(4));
}
fontScale = Math.max(Unit.dp.scl(1f) / 2f, 0.5f);
baseCameraScale = Math.round(Unit.dp.scl(4));
}
}

View File

@@ -26,32 +26,53 @@ import static io.anuke.mindustry.Vars.*;
//TODO consider using quadtrees for finding specific types of blocks within an area
//TODO maybe use Arrays instead of ObjectSets?
/**Class used for indexing special target blocks for AI.*/
public class BlockIndexer {
/**Size of one ore quadrant.*/
/**
* Class used for indexing special target blocks for AI.
*/
public class BlockIndexer{
/**
* Size of one ore quadrant.
*/
private final static int oreQuadrantSize = 20;
/**Size of one structure quadrant.*/
/**
* Size of one structure quadrant.
*/
private final static int structQuadrantSize = 12;
/**Set of all ores that are being scanned.*/
/**
* Set of all ores that are being scanned.
*/
private final ObjectSet<Item> scanOres = ObjectSet.with(Items.tungsten, Items.coal, Items.lead, Items.thorium, Items.titanium);
/**Stores all ore quadtrants on the map.*/
private ObjectMap<Item, ObjectSet<Tile>> ores;
private final ObjectSet<Item> itemSet = new ObjectSet<>();
/**Tags all quadrants.*/
/**
* Stores all ore quadtrants on the map.
*/
private ObjectMap<Item, ObjectSet<Tile>> ores;
/**
* Tags all quadrants.
*/
private Bits[] structQuadrants;
/**Maps teams to a map of flagged tiles by type.*/
/**
* Maps teams to a map of flagged tiles by type.
*/
private ObjectMap<BlockFlag, ObjectSet<Tile>> enemyMap = new ObjectMap<>();
/**Maps teams to a map of flagged tiles by type.*/
/**
* Maps teams to a map of flagged tiles by type.
*/
private ObjectMap<BlockFlag, ObjectSet<Tile>> allyMap = new ObjectMap<>();
/**Empty map for invalid teams.*/
/**
* Empty map for invalid teams.
*/
private ObjectMap<BlockFlag, ObjectSet<Tile>> emptyMap = new ObjectMap<>();
/**Maps tile positions to their last known tile index data.*/
/**
* Maps tile positions to their last known tile index data.
*/
private IntMap<TileIndex> typeMap = new IntMap<>();
/**Empty array used for returning.*/
/**
* Empty array used for returning.
*/
private ObjectSet<Tile> emptyArray = new ObjectSet<>();
public BlockIndexer(){
@@ -74,18 +95,18 @@ public class BlockIndexer {
//create bitset for each team type that contains each quadrant
structQuadrants = new Bits[Team.all.length];
for(int i = 0; i < Team.all.length; i ++){
structQuadrants[i] = new Bits(Mathf.ceil(world.width() / (float)structQuadrantSize) * Mathf.ceil(world.height() / (float)structQuadrantSize));
for(int i = 0; i < Team.all.length; i++){
structQuadrants[i] = new Bits(Mathf.ceil(world.width() / (float) structQuadrantSize) * Mathf.ceil(world.height() / (float) structQuadrantSize));
}
for(int x = 0; x < world.width(); x ++){
for (int y = 0; y < world.height(); y++) {
for(int x = 0; x < world.width(); x++){
for(int y = 0; y < world.height(); y++){
process(world.tile(x, y));
}
}
for (int x = 0; x < quadWidth(); x++) {
for (int y = 0; y < quadHeight(); y++) {
for(int x = 0; x < quadWidth(); x++){
for(int y = 0; y < quadHeight(); y++){
updateQuadrant(world.tile(x * structQuadrantSize, y * structQuadrantSize));
}
}
@@ -94,12 +115,16 @@ public class BlockIndexer {
});
}
/**Get all allied blocks with a flag.*/
/**
* Get all allied blocks with a flag.
*/
public ObjectSet<Tile> getAllied(Team team, BlockFlag type){
return (state.teams.get(team).ally ? allyMap : enemyMap).get(type, emptyArray);
}
/**Get all enemy blocks with a flag.*/
/**
* Get all enemy blocks with a flag.
*/
public ObjectSet<Tile> getEnemy(Team team, BlockFlag type){
return (!state.teams.get(team).ally ? allyMap : enemyMap).get(type, emptyArray);
}
@@ -108,13 +133,13 @@ public class BlockIndexer {
Entity closest = null;
float dst = 0;
for(int rx = Math.max((int)((x-range)/tilesize/structQuadrantSize), 0); rx <= (int)((x+range)/tilesize/structQuadrantSize) && rx < quadWidth(); rx ++){
for(int ry = Math.max((int)((y-range)/tilesize/structQuadrantSize), 0); ry <= (int)((y+range)/tilesize/structQuadrantSize) && ry < quadHeight(); ry ++){
for(int rx = Math.max((int) ((x - range) / tilesize / structQuadrantSize), 0); rx <= (int) ((x + range) / tilesize / structQuadrantSize) && rx < quadWidth(); rx++){
for(int ry = Math.max((int) ((y - range) / tilesize / structQuadrantSize), 0); ry <= (int) ((y + range) / tilesize / structQuadrantSize) && ry < quadHeight(); ry++){
if(!getQuad(team, rx, ry)) continue;
for(int tx = rx * structQuadrantSize; tx < (rx + 1) * structQuadrantSize && tx < world.width(); tx ++){
for(int ty = ry * structQuadrantSize; ty < (ry + 1) * structQuadrantSize && ty < world.height(); ty ++ ){
for(int tx = rx * structQuadrantSize; tx < (rx + 1) * structQuadrantSize && tx < world.width(); tx++){
for(int ty = ry * structQuadrantSize; ty < (ry + 1) * structQuadrantSize && ty < world.height(); ty++){
Tile other = world.tile(tx, ty);
if(other == null || other.entity == null || !pred.test(other)) continue;
@@ -134,22 +159,26 @@ public class BlockIndexer {
return (TileEntity) closest;
}
/**Returns a set of tiles that have ores of the specified type nearby.
/**
* Returns a set of tiles that have ores of the specified type nearby.
* While each tile in the set is not guaranteed to have an ore directly on it,
* each tile will at least have an ore within {@link #oreQuadrantSize} / 2 blocks of it.
* Only specific ore types are scanned. See {@link #scanOres}.*/
* Only specific ore types are scanned. See {@link #scanOres}.
*/
public ObjectSet<Tile> getOrePositions(Item item){
return ores.get(item, emptyArray);
}
/**Find the closest ore block relative to a position.*/
/**
* Find the closest ore block relative to a position.
*/
public Tile findClosestOre(float xp, float yp, Item item){
Tile tile = Geometry.findClosest(xp, yp, world.indexer().getOrePositions(item));
Tile tile = Geometry.findClosest(xp, yp, world.indexer().getOrePositions(item));
if(tile == null) return null;
for (int x = Math.max(0, tile.x - oreQuadrantSize/2); x < tile.x + oreQuadrantSize/2 && x < world.width(); x++) {
for (int y = Math.max(0, tile.y - oreQuadrantSize/2); y < tile.y + oreQuadrantSize/2 && y < world.height(); y++) {
for(int x = Math.max(0, tile.x - oreQuadrantSize / 2); x < tile.x + oreQuadrantSize / 2 && x < world.width(); x++){
for(int y = Math.max(0, tile.y - oreQuadrantSize / 2); y < tile.y + oreQuadrantSize / 2 && y < world.height(); y++){
Tile res = world.tile(x, y);
if(res.block() == Blocks.air && res.floor().drops != null && res.floor().drops.item == item){
return res;
@@ -186,12 +215,12 @@ public class BlockIndexer {
int quadrantY = tile.y / oreQuadrantSize;
itemSet.clear();
Tile rounded = world.tile(Mathf.clamp(quadrantX * oreQuadrantSize + oreQuadrantSize /2, 0, world.width() - 1),
Mathf.clamp(quadrantY * oreQuadrantSize + oreQuadrantSize /2, 0, world.height() - 1));
Tile rounded = world.tile(Mathf.clamp(quadrantX * oreQuadrantSize + oreQuadrantSize / 2, 0, world.width() - 1),
Mathf.clamp(quadrantY * oreQuadrantSize + oreQuadrantSize / 2, 0, world.height() - 1));
//find all items that this quadrant contains
for (int x = quadrantX * structQuadrantSize; x < world.width() && x < (quadrantX + 1) * structQuadrantSize; x++) {
for (int y = quadrantY * structQuadrantSize; y < world.height() && y < (quadrantY + 1) * structQuadrantSize; y++) {
for(int x = quadrantX * structQuadrantSize; x < world.width() && x < (quadrantX + 1) * structQuadrantSize; x++){
for(int y = quadrantY * structQuadrantSize; y < world.height() && y < (quadrantY + 1) * structQuadrantSize; y++){
Tile result = world.tile(x, y);
if(result.block().drops == null || !scanOres.contains(result.block().drops.item)) continue;
@@ -200,7 +229,7 @@ public class BlockIndexer {
}
//update quadrant at this position
for (Item item : scanOres){
for(Item item : scanOres){
ObjectSet<Tile> set = ores.get(item);
//update quadrant status depending on whether the item is in it
@@ -219,7 +248,7 @@ public class BlockIndexer {
int index = quadrantX + quadrantY * quadWidth();
//Log.info("Updating quadrant: {0} {1}", quadrantX, quadrantY);
for(TeamData data : state.teams.getTeams()) {
for(TeamData data : state.teams.getTeams()){
//fast-set this quadrant to 'occupied' if the tile just placed is already of this team
if(tile.getTeam() == data.team && tile.entity != null){
@@ -230,8 +259,8 @@ public class BlockIndexer {
structQuadrants[data.team.ordinal()].clear(index);
outer:
for (int x = quadrantX * structQuadrantSize; x < world.width() && x < (quadrantX + 1) * structQuadrantSize; x++) {
for (int y = quadrantY * structQuadrantSize; y < world.height() && y < (quadrantY + 1) * structQuadrantSize; y++) {
for(int x = quadrantX * structQuadrantSize; x < world.width() && x < (quadrantX + 1) * structQuadrantSize; x++){
for(int y = quadrantY * structQuadrantSize; y < world.height() && y < (quadrantY + 1) * structQuadrantSize; y++){
Tile result = world.tile(x, y);
//when a targetable block is found, mark this quadrant as occupied and stop searching
if(result.entity != null && result.getTeam() == data.team){
@@ -244,16 +273,16 @@ public class BlockIndexer {
}
private boolean getQuad(Team team, int quadrantX, int quadrantY){
int index = quadrantX + quadrantY * Mathf.ceil(world.width() / (float)structQuadrantSize);
int index = quadrantX + quadrantY * Mathf.ceil(world.width() / (float) structQuadrantSize);
return structQuadrants[team.ordinal()].get(index);
}
private int quadWidth(){
return Mathf.ceil(world.width() / (float)structQuadrantSize);
return Mathf.ceil(world.width() / (float) structQuadrantSize);
}
private int quadHeight(){
return Mathf.ceil(world.height() / (float)structQuadrantSize);
return Mathf.ceil(world.height() / (float) structQuadrantSize);
}
private ObjectMap<BlockFlag, ObjectSet<Tile>> getMap(Team team){
@@ -269,10 +298,10 @@ public class BlockIndexer {
ores.put(item, new ObjectSet<>());
}
for(int x = 0; x < world.width(); x ++){
for (int y = 0; y < world.height(); y++) {
int qx = (x/ oreQuadrantSize);
int qy = (y/ oreQuadrantSize);
for(int x = 0; x < world.width(); x++){
for(int y = 0; y < world.height(); y++){
int qx = (x / oreQuadrantSize);
int qy = (y / oreQuadrantSize);
Tile tile = world.tile(x, y);
@@ -280,8 +309,8 @@ public class BlockIndexer {
if(tile.floor().drops != null && scanOres.contains(tile.floor().drops.item) && tile.block() == Blocks.air){
ores.get(tile.floor().drops.item).add(world.tile(
//make sure to clamp quadrant middle position, since it might go off bounds
Mathf.clamp(qx * oreQuadrantSize + oreQuadrantSize /2, 0, world.width() - 1),
Mathf.clamp(qy * oreQuadrantSize + oreQuadrantSize /2, 0, world.height() - 1)));
Mathf.clamp(qx * oreQuadrantSize + oreQuadrantSize / 2, 0, world.width() - 1),
Mathf.clamp(qy * oreQuadrantSize + oreQuadrantSize / 2, 0, world.height() - 1)));
}
}
}
@@ -291,7 +320,7 @@ public class BlockIndexer {
public final EnumSet<BlockFlag> flags;
public final Team team;
public TileIndex(EnumSet<BlockFlag> flags, Team team) {
public TileIndex(EnumSet<BlockFlag> flags, Team team){
this.flags = flags;
this.team = team;
}

View File

@@ -20,7 +20,7 @@ import io.anuke.ucore.util.Log;
import static io.anuke.mindustry.Vars.state;
import static io.anuke.mindustry.Vars.world;
public class Pathfinder {
public class Pathfinder{
private long maxUpdate = TimeUtils.millisToNanos(4);
private PathData[] paths;
private IntArray blocked = new IntArray();
@@ -56,7 +56,7 @@ public class Pathfinder {
Tile target = null;
float tl = 0f;
for(GridPoint2 point : Geometry.d8) {
for(GridPoint2 point : Geometry.d8){
int dx = tile.x + point.x, dy = tile.y + point.y;
Tile other = world.tile(dx, dy);
@@ -89,16 +89,16 @@ public class Pathfinder {
}
private void update(Tile tile, Team team){
if(paths[team.ordinal()] != null) {
if(paths[team.ordinal()] != null){
PathData path = paths[team.ordinal()];
if(!passable(tile, team)){
path.weights[tile.x][tile.y] = Float.MAX_VALUE;
}
path.search ++;
path.search++;
if(path.lastSearchTime + 1000/60*3 > TimeUtils.millis()){
if(path.lastSearchTime + 1000 / 60 * 3 > TimeUtils.millis()){
path.frontier.clear();
}
@@ -115,17 +115,17 @@ public class Pathfinder {
private void createFor(Team team){
PathData path = new PathData();
path.search ++;
path.search++;
path.frontier.ensureCapacity((world.width() + world.height()) * 3);
paths[team.ordinal()] = path;
for (int x = 0; x < world.width(); x++) {
for (int y = 0; y < world.height(); y++) {
for(int x = 0; x < world.width(); x++){
for(int y = 0; y < world.height(); y++){
Tile tile = world.tile(x, y);
if (tile.block().flags != null && state.teams.areEnemies(tile.getTeam(), team)
&& tile.block().flags.contains(BlockFlag.target)) {
if(tile.block().flags != null && state.teams.areEnemies(tile.getTeam(), team)
&& tile.block().flags.contains(BlockFlag.target)){
path.frontier.addFirst(tile);
path.weights[x][y] = 0;
path.searches[x][y] = path.search;
@@ -143,20 +143,20 @@ public class Pathfinder {
long start = TimeUtils.nanoTime();
while (path.frontier.size > 0 && (nsToRun < 0 || TimeUtils.timeSinceNanos(start) <= nsToRun)) {
while(path.frontier.size > 0 && (nsToRun < 0 || TimeUtils.timeSinceNanos(start) <= nsToRun)){
Tile tile = path.frontier.removeLast();
float cost = path.weights[tile.x][tile.y];
if (cost < Float.MAX_VALUE) {
for (GridPoint2 point : Geometry.d4) {
if(cost < Float.MAX_VALUE){
for(GridPoint2 point : Geometry.d4){
int dx = tile.x + point.x, dy = tile.y + point.y;
Tile other = world.tile(dx, dy);
if (other != null && (path.weights[dx][dy] > cost + 1 || path.searches[dx][dy] < path.search)
if(other != null && (path.weights[dx][dy] > cost + 1 || path.searches[dx][dy] < path.search)
&& passable(other, team)){
path.frontier.addFirst(world.tile(dx, dy));
path.weights[dx][dy] = cost + other.cost/2f;
path.weights[dx][dy] = cost + other.cost / 2f;
path.searches[dx][dy] = path.search;
}
}

View File

@@ -18,7 +18,7 @@ import java.io.IOException;
import static io.anuke.mindustry.Vars.*;
public class WaveSpawner {
public class WaveSpawner{
private static final int quadsize = 4;
private Bits quadrants;
@@ -34,28 +34,28 @@ public class WaveSpawner {
public void write(DataOutput output) throws IOException{
output.writeShort(flySpawns.size);
for (FlyerSpawn spawn : flySpawns){
for(FlyerSpawn spawn : flySpawns){
output.writeFloat(spawn.angle);
}
output.writeShort(groundSpawns.size);
for (GroundSpawn spawn : groundSpawns){
output.writeShort((short)spawn.x);
output.writeShort((short)spawn.y);
for(GroundSpawn spawn : groundSpawns){
output.writeShort((short) spawn.x);
output.writeShort((short) spawn.y);
}
}
public void read(DataInput input) throws IOException{
short flya = input.readShort();
for (int i = 0; i < flya; i++) {
for(int i = 0; i < flya; i++){
FlyerSpawn spawn = new FlyerSpawn();
spawn.angle = input.readFloat();
flySpawns.add(spawn);
}
short grounda = input.readShort();
for (int i = 0; i < grounda; i++) {
for(int i = 0; i < grounda; i++){
GroundSpawn spawn = new GroundSpawn();
spawn.x = input.readShort();
spawn.y = input.readShort();
@@ -80,13 +80,13 @@ public class WaveSpawner {
int addGround = groundGroups - groundSpawns.size, addFly = flyGroups - flySpawns.size;
//add extra groups if the total exceeds it
for (int i = 0; i < addGround; i++) {
for(int i = 0; i < addGround; i++){
GroundSpawn spawn = new GroundSpawn();
findLocation(spawn);
groundSpawns.add(spawn);
}
for (int i = 0; i < addFly; i++) {
for(int i = 0; i < addFly; i++){
FlyerSpawn spawn = new FlyerSpawn();
findLocation(spawn);
flySpawns.add(spawn);
@@ -99,7 +99,7 @@ public class WaveSpawner {
int groups = group.getGroupsSpawned(state.wave);
int spawned = group.getUnitsSpawned(state.wave);
for (int i = 0; i < groups; i++) {
for(int i = 0; i < groups; i++){
Squad squad = new Squad();
float spawnX, spawnY;
float spread;
@@ -109,11 +109,11 @@ public class WaveSpawner {
//TODO verify flyer spawn
float margin = 40f; //how far away from the edge flying units spawn
spawnX = world.width() *tilesize/2f + Mathf.sqrwavex(spawn.angle) * (world.width()/2f*tilesize + margin);
spawnY = world.height() * tilesize/2f + Mathf.sqrwavey(spawn.angle) * (world.height()/2f*tilesize + margin);
spawnX = world.width() * tilesize / 2f + Mathf.sqrwavex(spawn.angle) * (world.width() / 2f * tilesize + margin);
spawnY = world.height() * tilesize / 2f + Mathf.sqrwavey(spawn.angle) * (world.height() / 2f * tilesize + margin);
spread = margin / 1.5f;
flyCount ++;
flyCount++;
}else{
GroundSpawn spawn = groundSpawns.get(groundCount);
checkQuadrant(spawn.x, spawn.y);
@@ -121,14 +121,14 @@ public class WaveSpawner {
findLocation(spawn);
}
spawnX = spawn.x * quadsize * tilesize + quadsize * tilesize/2f;
spawnY = spawn.y * quadsize * tilesize + quadsize * tilesize/2f;
spread = quadsize*tilesize/3f;
spawnX = spawn.x * quadsize * tilesize + quadsize * tilesize / 2f;
spawnY = spawn.y * quadsize * tilesize + quadsize * tilesize / 2f;
spread = quadsize * tilesize / 3f;
groundCount ++;
groundCount++;
}
for (int j = 0; j < spawned; j++) {
for(int j = 0; j < spawned; j++){
BaseUnit unit = group.createUnit(Team.red);
unit.setWave();
unit.setSquad(squad);
@@ -140,19 +140,19 @@ public class WaveSpawner {
}
public void checkAllQuadrants(){
for(int x = 0; x < quadWidth(); x ++){
for(int y = 0; y < quadHeight(); y ++){
for(int x = 0; x < quadWidth(); x++){
for(int y = 0; y < quadHeight(); y++){
checkQuadrant(x, y);
}
}
}
private void checkQuadrant(int quadx, int quady){
setQuad(quadx, quady, true);
outer:
for (int x = quadx * quadsize; x < world.width() && x < (quadx + 1)*quadsize; x++) {
for (int y = quady * quadsize; y < world.height() && y < (quady + 1)*quadsize; y++) {
for(int x = quadx * quadsize; x < world.width() && x < (quadx + 1) * quadsize; x++){
for(int y = quady * quadsize; y < world.height() && y < (quady + 1) * quadsize; y++){
Tile tile = world.tile(x, y);
if(tile == null || tile.solid() || world.pathfinder().getValueforTeam(Team.red, x, y) == Float.MAX_VALUE){
@@ -190,7 +190,7 @@ public class WaveSpawner {
spawn.x = -1;
spawn.y = -1;
int shellWidth = quadWidth()*2 + quadHeight() * 2 * 6;
int shellWidth = quadWidth() * 2 + quadHeight() * 2 * 6;
shellWidth = Math.min(quadWidth() * quadHeight() / 4, shellWidth);
Mathf.traverseSpiral(quadWidth(), quadHeight(), Mathf.random(shellWidth), (x, y) -> {
@@ -210,11 +210,11 @@ public class WaveSpawner {
}
private int quadWidth(){
return Mathf.ceil(world.width() / (float)quadsize);
return Mathf.ceil(world.width() / (float) quadsize);
}
private int quadHeight(){
return Mathf.ceil(world.height() / (float)quadsize);
return Mathf.ceil(world.height() / (float) quadsize);
}
private class FlyerSpawn{

View File

@@ -9,7 +9,7 @@ import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.type.AmmoType;
import io.anuke.mindustry.type.ContentList;
public class AmmoTypes implements ContentList {
public class AmmoTypes implements ContentList{
public static AmmoType bulletTungsten, bulletLead, bulletCarbide, bulletThorium, bulletSilicon, bulletPyratite,
shotgunTungsten, bombExplosive, bombIncendiary, bombOil, shellCarbide, flamerThermite, weaponMissile,
flakLead, flakExplosive, flakPlastic, flakSurge, missileExplosive, missileIncindiary, missileSurge,
@@ -17,41 +17,41 @@ public class AmmoTypes implements ContentList {
basicFlame, lancerLaser, lightning, spectreLaser, meltdownLaser, fuseShotgun, oil, water, lava, cryofluid;
@Override
public void load() {
public void load(){
//weapon specific
shotgunTungsten = new AmmoType(Items.tungsten, WeaponBullets.tungstenShotgun, 2) {{
shotgunTungsten = new AmmoType(Items.tungsten, WeaponBullets.tungstenShotgun, 2){{
shootEffect = ShootFx.shootBig;
smokeEffect = ShootFx.shootBigSmoke;
recoil = 1f;
}};
shellCarbide = new AmmoType(Items.carbide, WeaponBullets.shellCarbide, 2) {{
shellCarbide = new AmmoType(Items.carbide, WeaponBullets.shellCarbide, 2){{
shootEffect = ShootFx.shootBig;
smokeEffect = ShootFx.shootBigSmoke;
}};
bombExplosive = new AmmoType(Items.blastCompound, WeaponBullets.bombExplosive, 3) {{
bombExplosive = new AmmoType(Items.blastCompound, WeaponBullets.bombExplosive, 3){{
shootEffect = Fx.none;
smokeEffect = Fx.none;
}};
bombIncendiary = new AmmoType(Items.pyratite, WeaponBullets.bombIncendiary, 3) {{
bombIncendiary = new AmmoType(Items.pyratite, WeaponBullets.bombIncendiary, 3){{
shootEffect = Fx.none;
smokeEffect = Fx.none;
}};
bombOil = new AmmoType(Items.coal, WeaponBullets.bombOil, 3) {{
bombOil = new AmmoType(Items.coal, WeaponBullets.bombOil, 3){{
shootEffect = Fx.none;
smokeEffect = Fx.none;
}};
flamerThermite = new AmmoType(Items.pyratite, TurretBullets.basicFlame, 3) {{
flamerThermite = new AmmoType(Items.pyratite, TurretBullets.basicFlame, 3){{
shootEffect = ShootFx.shootSmallFlame;
}};
weaponMissile = new AmmoType(Items.carbide, MissileBullets.javelin, 2) {{
weaponMissile = new AmmoType(Items.carbide, MissileBullets.javelin, 2){{
shootEffect = BulletFx.hitBulletSmall;
smokeEffect = Fx.none;
reloadMultiplier = 1.2f;
@@ -59,37 +59,37 @@ public class AmmoTypes implements ContentList {
//bullets
bulletLead = new AmmoType(Items.lead, StandardBullets.lead, 5) {{
bulletLead = new AmmoType(Items.lead, StandardBullets.lead, 5){{
shootEffect = ShootFx.shootSmall;
smokeEffect = ShootFx.shootSmallSmoke;
reloadMultiplier = 1.6f;
inaccuracy = 5f;
}};
bulletTungsten = new AmmoType(Items.tungsten, StandardBullets.tungsten, 2) {{
bulletTungsten = new AmmoType(Items.tungsten, StandardBullets.tungsten, 2){{
shootEffect = ShootFx.shootSmall;
smokeEffect = ShootFx.shootSmallSmoke;
reloadMultiplier = 0.8f;
}};
bulletCarbide = new AmmoType(Items.carbide, StandardBullets.carbide, 2) {{
bulletCarbide = new AmmoType(Items.carbide, StandardBullets.carbide, 2){{
shootEffect = ShootFx.shootSmall;
smokeEffect = ShootFx.shootSmallSmoke;
reloadMultiplier = 0.6f;
}};
bulletThorium = new AmmoType(Items.thorium, StandardBullets.thorium, 2) {{
bulletThorium = new AmmoType(Items.thorium, StandardBullets.thorium, 2){{
shootEffect = ShootFx.shootBig;
smokeEffect = ShootFx.shootBigSmoke;
}};
bulletSilicon = new AmmoType(Items.silicon, StandardBullets.homing, 5) {{
bulletSilicon = new AmmoType(Items.silicon, StandardBullets.homing, 5){{
shootEffect = ShootFx.shootSmall;
smokeEffect = ShootFx.shootSmallSmoke;
reloadMultiplier = 1.4f;
}};
bulletPyratite = new AmmoType(Items.pyratite, StandardBullets.tracer, 3) {{
bulletPyratite = new AmmoType(Items.pyratite, StandardBullets.tracer, 3){{
shootEffect = ShootFx.shootSmall;
smokeEffect = ShootFx.shootSmallSmoke;
inaccuracy = 3f;
@@ -97,71 +97,71 @@ public class AmmoTypes implements ContentList {
//flak
flakLead = new AmmoType(Items.lead, FlakBullets.lead, 5) {{
flakLead = new AmmoType(Items.lead, FlakBullets.lead, 5){{
shootEffect = ShootFx.shootSmall;
smokeEffect = ShootFx.shootSmallSmoke;
}};
flakExplosive = new AmmoType(Items.blastCompound, FlakBullets.explosive, 5) {{
flakExplosive = new AmmoType(Items.blastCompound, FlakBullets.explosive, 5){{
shootEffect = ShootFx.shootSmall;
smokeEffect = ShootFx.shootSmallSmoke;
}};
flakPlastic = new AmmoType(Items.plastanium, FlakBullets.plastic, 5) {{
flakPlastic = new AmmoType(Items.plastanium, FlakBullets.plastic, 5){{
shootEffect = ShootFx.shootSmall;
smokeEffect = ShootFx.shootSmallSmoke;
}};
flakSurge = new AmmoType(Items.surgealloy, FlakBullets.surge, 5) {{
flakSurge = new AmmoType(Items.surgealloy, FlakBullets.surge, 5){{
shootEffect = ShootFx.shootSmall;
smokeEffect = ShootFx.shootSmallSmoke;
}};
//missiles
missileExplosive = new AmmoType(Items.blastCompound, MissileBullets.explosive, 1) {{
missileExplosive = new AmmoType(Items.blastCompound, MissileBullets.explosive, 1){{
shootEffect = ShootFx.shootBig2;
smokeEffect = ShootFx.shootBigSmoke2;
reloadMultiplier = 1.2f;
}};
missileIncindiary = new AmmoType(Items.pyratite, MissileBullets.incindiary, 1) {{
missileIncindiary = new AmmoType(Items.pyratite, MissileBullets.incindiary, 1){{
shootEffect = ShootFx.shootBig2;
smokeEffect = ShootFx.shootBigSmoke2;
reloadMultiplier = 1.0f;
}};
missileSurge = new AmmoType(Items.surgealloy, MissileBullets.surge, 1) {{
missileSurge = new AmmoType(Items.surgealloy, MissileBullets.surge, 1){{
shootEffect = ShootFx.shootBig2;
smokeEffect = ShootFx.shootBigSmoke2;
}};
//artillery
artilleryCarbide = new AmmoType(Items.carbide, ArtilleryBullets.carbide, 2) {{
artilleryCarbide = new AmmoType(Items.carbide, ArtilleryBullets.carbide, 2){{
shootEffect = ShootFx.shootBig2;
smokeEffect = ShootFx.shootBigSmoke2;
}};
artilleryPlastic = new AmmoType(Items.plastanium, ArtilleryBullets.plastic, 2) {{
artilleryPlastic = new AmmoType(Items.plastanium, ArtilleryBullets.plastic, 2){{
shootEffect = ShootFx.shootBig2;
smokeEffect = ShootFx.shootBigSmoke2;
reloadMultiplier = 1.4f;
}};
artilleryHoming = new AmmoType(Items.silicon, ArtilleryBullets.homing, 1) {{
artilleryHoming = new AmmoType(Items.silicon, ArtilleryBullets.homing, 1){{
shootEffect = ShootFx.shootBig2;
smokeEffect = ShootFx.shootBigSmoke2;
reloadMultiplier = 0.9f;
}};
artilleryIncindiary = new AmmoType(Items.pyratite, ArtilleryBullets.incindiary, 2) {{
artilleryIncindiary = new AmmoType(Items.pyratite, ArtilleryBullets.incindiary, 2){{
shootEffect = ShootFx.shootBig2;
smokeEffect = ShootFx.shootBigSmoke2;
reloadMultiplier = 1.2f;
}};
artilleryExplosive = new AmmoType(Items.blastCompound, ArtilleryBullets.explosive, 1) {{
artilleryExplosive = new AmmoType(Items.blastCompound, ArtilleryBullets.explosive, 1){{
shootEffect = ShootFx.shootBig2;
smokeEffect = ShootFx.shootBigSmoke2;
reloadMultiplier = 1.6f;
@@ -169,7 +169,7 @@ public class AmmoTypes implements ContentList {
//flame
basicFlame = new AmmoType(Liquids.oil, TurretBullets.basicFlame, 0.3f) {{
basicFlame = new AmmoType(Liquids.oil, TurretBullets.basicFlame, 0.3f){{
shootEffect = ShootFx.shootSmallFlame;
}};
@@ -198,7 +198,7 @@ public class AmmoTypes implements ContentList {
}
@Override
public Array<? extends Content> getAll() {
public Array<? extends Content> getAll(){
return AmmoType.all();
}
}

View File

@@ -12,41 +12,41 @@ public class Items implements ContentList{
biomatter, sand, blastCompound, pyratite;
@Override
public void load() {
public void load(){
stone = new Item("stone", Color.valueOf("777777")) {{
stone = new Item("stone", Color.valueOf("777777")){{
hardness = 3;
}};
tungsten = new Item("tungsten", Color.valueOf("a0b0c8")) {{
tungsten = new Item("tungsten", Color.valueOf("a0b0c8")){{
type = ItemType.material;
hardness = 1;
cost = 0.75f;
}};
lead = new Item("lead", Color.valueOf("8e85a2")) {{
lead = new Item("lead", Color.valueOf("8e85a2")){{
type = ItemType.material;
hardness = 1;
cost = 0.6f;
}};
coal = new Item("coal", Color.valueOf("272727")) {{
coal = new Item("coal", Color.valueOf("272727")){{
explosiveness = 0.2f;
flammability = 0.5f;
hardness = 2;
}};
carbide = new Item("carbide", Color.valueOf("e2e2e2")) {{
carbide = new Item("carbide", Color.valueOf("e2e2e2")){{
type = ItemType.material;
}};
titanium = new Item("titanium", Color.valueOf("8da1e3")) {{
titanium = new Item("titanium", Color.valueOf("8da1e3")){{
type = ItemType.material;
hardness = 3;
cost = 1.1f;
}};
thorium = new Item("thorium", Color.valueOf("f9a3c7")) {{
thorium = new Item("thorium", Color.valueOf("f9a3c7")){{
type = ItemType.material;
explosiveness = 0.1f;
hardness = 4;
@@ -54,49 +54,49 @@ public class Items implements ContentList{
cost = 1.2f;
}};
silicon = new Item("silicon", Color.valueOf("53565c")) {{
silicon = new Item("silicon", Color.valueOf("53565c")){{
type = ItemType.material;
cost = 0.9f;
}};
plastanium = new Item("plastanium", Color.valueOf("e9ead3")) {{
plastanium = new Item("plastanium", Color.valueOf("e9ead3")){{
type = ItemType.material;
flammability = 0.1f;
explosiveness = 0.1f;
cost = 1.5f;
}};
phasematter = new Item("phase-matter", Color.valueOf("f4ba6e")) {{
phasematter = new Item("phase-matter", Color.valueOf("f4ba6e")){{
type = ItemType.material;
cost = 1.5f;
}};
surgealloy = new Item("surge-alloy", Color.valueOf("b4d5c7")) {{
surgealloy = new Item("surge-alloy", Color.valueOf("b4d5c7")){{
type = ItemType.material;
}};
biomatter = new Item("biomatter", Color.valueOf("648b55")) {{
biomatter = new Item("biomatter", Color.valueOf("648b55")){{
flammability = 0.4f;
fluxiness = 0.2f;
}};
sand = new Item("sand", Color.valueOf("e3d39e")) {{
sand = new Item("sand", Color.valueOf("e3d39e")){{
fluxiness = 0.5f;
}};
blastCompound = new Item("blast-compound", Color.valueOf("ff795e")) {{
blastCompound = new Item("blast-compound", Color.valueOf("ff795e")){{
flammability = 0.2f;
explosiveness = 0.6f;
}};
pyratite = new Item("pyratite", Color.valueOf("ffaa5f")) {{
pyratite = new Item("pyratite", Color.valueOf("ffaa5f")){{
flammability = 0.7f;
explosiveness = 0.2f;
}};
}
@Override
public Array<? extends Content> getAll() {
public Array<? extends Content> getAll(){
return Item.all();
}
}

View File

@@ -6,20 +6,13 @@ import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.type.Liquid;
public class Liquids implements ContentList {
public static Liquid none, water, lava, oil, cryofluid;
public class Liquids implements ContentList{
public static Liquid water, lava, oil, cryofluid;
@Override
public void load() {
public void load(){
none = new Liquid("none", Color.CLEAR){
@Override
public boolean isHidden(){
return true;
}
};
water = new Liquid("water", Color.valueOf("486acd")) {
water = new Liquid("water", Color.valueOf("486acd")){
{
heatCapacity = 0.4f;
tier = 0;
@@ -27,7 +20,7 @@ public class Liquids implements ContentList {
}
};
lava = new Liquid("lava", Color.valueOf("e37341")) {
lava = new Liquid("lava", Color.valueOf("e37341")){
{
temperature = 0.8f;
viscosity = 0.8f;
@@ -36,7 +29,7 @@ public class Liquids implements ContentList {
}
};
oil = new Liquid("oil", Color.valueOf("313131")) {
oil = new Liquid("oil", Color.valueOf("313131")){
{
viscosity = 0.7f;
flammability = 0.6f;
@@ -46,10 +39,10 @@ public class Liquids implements ContentList {
}
};
cryofluid = new Liquid("cryofluid", Color.SKY) {
cryofluid = new Liquid("cryofluid", Color.SKY){
{
heatCapacity = 0.75f;
temperature = 0.4f;
heatCapacity = 0.9f;
temperature = 0.25f;
tier = 1;
effect = StatusEffects.freezing;
}
@@ -57,7 +50,7 @@ public class Liquids implements ContentList {
}
@Override
public Array<? extends Content> getAll() {
public Array<? extends Content> getAll(){
return Liquid.all();
}
}

View File

@@ -8,14 +8,16 @@ import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.type.Mech;
import io.anuke.mindustry.type.Upgrade;
public class Mechs implements ContentList {
public class Mechs implements ContentList{
public static Mech alpha, delta, tau, omega, dart, javelin, trident, halberd;
/**These are not new mechs, just re-assignments for convenience.*/
/**
* These are not new mechs, just re-assignments for convenience.
*/
public static Mech starterDesktop, starterMobile;
@Override
public void load() {
public void load(){
alpha = new Mech("alpha-mech", false){{
drillPower = 1;
@@ -48,7 +50,7 @@ public class Mechs implements ContentList {
}};
dart = new Mech("dart-ship", true){{
drillPower = -1;
drillPower = 1;
speed = 0.4f;
maxSpeed = 3f;
drag = 0.1f;
@@ -85,7 +87,7 @@ public class Mechs implements ContentList {
}
@Override
public Array<? extends Content> getAll() {
public Array<? extends Content> getAll(){
return Upgrade.all();
}
}

View File

@@ -12,19 +12,19 @@ import static io.anuke.mindustry.type.Category.*;
public class Recipes implements ContentList{
@Override
public void load (){
public void load(){
//WALLS
new Recipe(defense, DefenseBlocks.tungstenWall, new ItemStack(Items.tungsten, 12));
new Recipe(defense, DefenseBlocks.tungstenWallLarge, new ItemStack(Items.tungsten, 12*4));
new Recipe(defense, DefenseBlocks.tungstenWallLarge, new ItemStack(Items.tungsten, 12 * 4));
new Recipe(defense, DefenseBlocks.carbideWall, new ItemStack(Items.carbide, 12));
new Recipe(defense, DefenseBlocks.carbideWallLarge, new ItemStack(Items.carbide, 12*4));
new Recipe(defense, DefenseBlocks.carbideWallLarge, new ItemStack(Items.carbide, 12 * 4));
new Recipe(defense, DefenseBlocks.thoriumWall, new ItemStack(Items.thorium, 12));
new Recipe(defense, DefenseBlocks.thoriumWallLarge, new ItemStack(Items.thorium, 12*4));
new Recipe(defense, DefenseBlocks.thoriumWallLarge, new ItemStack(Items.thorium, 12 * 4));
new Recipe(defense, DefenseBlocks.door, new ItemStack(Items.carbide, 12), new ItemStack(Items.silicon, 8));
new Recipe(defense, DefenseBlocks.doorLarge, new ItemStack(Items.carbide, 12*4), new ItemStack(Items.silicon, 8*4));
new Recipe(defense, DefenseBlocks.doorLarge, new ItemStack(Items.carbide, 12 * 4), new ItemStack(Items.silicon, 8 * 4));
//TURRETS
new Recipe(weapon, TurretBlocks.duo, new ItemStack(Items.tungsten, 40));
@@ -44,11 +44,11 @@ public class Recipes implements ContentList{
//starter lead transporation
new Recipe(distribution, DistributionBlocks.junction, new ItemStack(Items.lead, 2));
new Recipe(distribution, DistributionBlocks.router, new ItemStack(Items.lead, 6));
new Recipe(distribution, DistributionBlocks.splitter, new ItemStack(Items.lead, 6));
//advanced carbide transporation
new Recipe(distribution, DistributionBlocks.splitter, new ItemStack(Items.carbide, 2), new ItemStack(Items.tungsten, 2));
new Recipe(distribution, DistributionBlocks.multiplexer, new ItemStack(Items.carbide, 8), new ItemStack(Items.tungsten, 8));
//new Recipe(distribution, DistributionBlocks.splitter, new ItemStack(Items.carbide, 2), new ItemStack(Items.tungsten, 2));
new Recipe(distribution, DistributionBlocks.distributor, new ItemStack(Items.carbide, 8), new ItemStack(Items.tungsten, 8));
new Recipe(distribution, DistributionBlocks.sorter, new ItemStack(Items.carbide, 4), new ItemStack(Items.tungsten, 4));
new Recipe(distribution, DistributionBlocks.overflowGate, new ItemStack(Items.carbide, 4), new ItemStack(Items.tungsten, 8));
new Recipe(distribution, DistributionBlocks.bridgeConveyor, new ItemStack(Items.carbide, 8), new ItemStack(Items.tungsten, 8));
@@ -171,7 +171,6 @@ public class Recipes implements ContentList{
new Recipe(production, ProductionBlocks.oilextractor, new ItemStack(Items.titanium, 40), new ItemStack(Items.surgealloy, 40));*/
//new Recipe(distribution, DistributionBlocks.massDriver, new ItemStack(Items.carbide, 1));
@@ -282,7 +281,7 @@ public class Recipes implements ContentList{
}
@Override
public Array<? extends Content> getAll() {
public Array<? extends Content> getAll(){
return Recipe.all();
}
}

View File

@@ -3,30 +3,30 @@ package io.anuke.mindustry.content;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.fx.EnvironmentFx;
import io.anuke.mindustry.entities.StatusController.StatusEntry;
import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.type.StatusEffect;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.type.StatusEffect;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Mathf;
public class StatusEffects implements ContentList {
public class StatusEffects implements ContentList{
public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded;
@Override
public void load() {
public void load(){
none = new StatusEffect(0);
burning = new StatusEffect(4 * 60f) {
burning = new StatusEffect(4 * 60f){
{
oppositeScale = 0.5f;
}
@Override
public StatusEntry getTransition(Unit unit, StatusEffect to, float time, float newTime, StatusEntry result) {
if (to == tarred) {
public StatusEntry getTransition(Unit unit, StatusEffect to, float time, float newTime, StatusEntry result){
if(to == tarred){
unit.damage(1f);
Effects.effect(EnvironmentFx.burning, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f));
return result.set(this, Math.min(time + newTime, baseDuration + tarred.baseDuration));
@@ -36,45 +36,45 @@ public class StatusEffects implements ContentList {
}
@Override
public void update(Unit unit, float time) {
public void update(Unit unit, float time){
unit.damagePeriodic(0.04f);
if (Mathf.chance(Timers.delta() * 0.2f)) {
if(Mathf.chance(Timers.delta() * 0.2f)){
Effects.effect(EnvironmentFx.burning, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f));
}
}
};
freezing = new StatusEffect(5 * 60f) {
freezing = new StatusEffect(5 * 60f){
{
oppositeScale = 0.4f;
speedMultiplier = 0.7f;
}
@Override
public void update(Unit unit, float time) {
public void update(Unit unit, float time){
if (Mathf.chance(Timers.delta() * 0.15f)) {
if(Mathf.chance(Timers.delta() * 0.15f)){
Effects.effect(EnvironmentFx.freezing, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f));
}
}
};
wet = new StatusEffect(3 * 60f) {
wet = new StatusEffect(3 * 60f){
{
oppositeScale = 0.5f;
speedMultiplier = 0.999f;
}
@Override
public void update(Unit unit, float time) {
if (Mathf.chance(Timers.delta() * 0.15f)) {
public void update(Unit unit, float time){
if(Mathf.chance(Timers.delta() * 0.15f)){
Effects.effect(EnvironmentFx.wet, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f));
}
}
};
melting = new StatusEffect(5 * 60f) {
melting = new StatusEffect(5 * 60f){
{
oppositeScale = 0.2f;
speedMultiplier = 0.8f;
@@ -82,8 +82,8 @@ public class StatusEffects implements ContentList {
}
@Override
public StatusEntry getTransition(Unit unit, StatusEffect to, float time, float newTime, StatusEntry result) {
if (to == tarred) {
public StatusEntry getTransition(Unit unit, StatusEffect to, float time, float newTime, StatusEntry result){
if(to == tarred){
return result.set(this, Math.min(time + newTime / 2f, baseDuration));
}
@@ -91,30 +91,30 @@ public class StatusEffects implements ContentList {
}
@Override
public void update(Unit unit, float time) {
public void update(Unit unit, float time){
unit.damagePeriodic(0.3f);
if (Mathf.chance(Timers.delta() * 0.2f)) {
if(Mathf.chance(Timers.delta() * 0.2f)){
Effects.effect(EnvironmentFx.melting, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f));
}
}
};
tarred = new StatusEffect(4 * 60f) {
tarred = new StatusEffect(4 * 60f){
{
speedMultiplier = 0.6f;
}
@Override
public void update(Unit unit, float time) {
if (Mathf.chance(Timers.delta() * 0.15f)) {
public void update(Unit unit, float time){
if(Mathf.chance(Timers.delta() * 0.15f)){
Effects.effect(EnvironmentFx.oily, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f));
}
}
@Override
public StatusEntry getTransition(Unit unit, StatusEffect to, float time, float newTime, StatusEntry result) {
if (to == melting || to == burning) {
public StatusEntry getTransition(Unit unit, StatusEffect to, float time, float newTime, StatusEntry result){
if(to == melting || to == burning){
return result.set(to, newTime + time);
}
@@ -122,7 +122,7 @@ public class StatusEffects implements ContentList {
}
};
overdrive = new StatusEffect(6f) {
overdrive = new StatusEffect(6f){
{
armorMultiplier = 0.95f;
speedMultiplier = 1.05f;
@@ -130,13 +130,13 @@ public class StatusEffects implements ContentList {
}
@Override
public void update(Unit unit, float time) {
public void update(Unit unit, float time){
//idle regen boosted
unit.health += 0.01f * Timers.delta();
}
};
shielded = new StatusEffect(6f) {
shielded = new StatusEffect(6f){
{
armorMultiplier = 3f;
}
@@ -149,7 +149,7 @@ public class StatusEffects implements ContentList {
}
@Override
public Array<? extends Content> getAll() {
public Array<? extends Content> getAll(){
return StatusEffect.all();
}
}

View File

@@ -6,11 +6,11 @@ import io.anuke.mindustry.entities.units.types.*;
import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.type.ContentList;
public class UnitTypes implements ContentList {
public class UnitTypes implements ContentList{
public static UnitType drone, scout, vtol, monsoon, titan, fabricator;
@Override
public void load() {
public void load(){
drone = new UnitType("drone", Drone.class, Drone::new){{
isFlying = true;
drag = 0.01f;
@@ -73,7 +73,7 @@ public class UnitTypes implements ContentList {
}
@Override
public Array<? extends Content> getAll() {
public Array<? extends Content> getAll(){
return UnitType.all();
}
}

View File

@@ -8,13 +8,13 @@ import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.type.Upgrade;
import io.anuke.mindustry.type.Weapon;
public class Weapons implements ContentList {
public class Weapons implements ContentList{
public static Weapon blaster, chainBlaster, shockgun, sapper, swarmer, bomber, flakgun, flamethrower, missiles;
@Override
public void load() {
public void load(){
blaster = new Weapon("blaster") {{
blaster = new Weapon("blaster"){{
length = 1.5f;
reload = 15f;
roundrobin = true;
@@ -22,7 +22,7 @@ public class Weapons implements ContentList {
setAmmo(AmmoTypes.bulletLead);
}};
missiles = new Weapon("missiles") {{
missiles = new Weapon("missiles"){{
length = 1.5f;
reload = 40f;
shots = 2;
@@ -33,7 +33,7 @@ public class Weapons implements ContentList {
setAmmo(AmmoTypes.weaponMissile);
}};
chainBlaster = new Weapon("chain-blaster") {{
chainBlaster = new Weapon("chain-blaster"){{
length = 1.5f;
reload = 30f;
roundrobin = true;
@@ -41,7 +41,7 @@ public class Weapons implements ContentList {
setAmmo(AmmoTypes.bulletLead, AmmoTypes.bulletCarbide, AmmoTypes.bulletTungsten, AmmoTypes.bulletSilicon, AmmoTypes.bulletThorium);
}};
shockgun = new Weapon("shockgun") {{
shockgun = new Weapon("shockgun"){{
length = 1f;
reload = 50f;
roundrobin = true;
@@ -53,7 +53,7 @@ public class Weapons implements ContentList {
setAmmo(AmmoTypes.shotgunTungsten);
}};
flakgun = new Weapon("flakgun") {{
flakgun = new Weapon("flakgun"){{
length = 1f;
reload = 70f;
roundrobin = true;
@@ -65,7 +65,7 @@ public class Weapons implements ContentList {
setAmmo(AmmoTypes.shellCarbide);
}};
flamethrower = new Weapon("flamethrower") {{
flamethrower = new Weapon("flamethrower"){{
length = 1f;
reload = 14f;
roundrobin = true;
@@ -74,7 +74,7 @@ public class Weapons implements ContentList {
setAmmo(AmmoTypes.flamerThermite);
}};
sapper = new Weapon("sapper") {{
sapper = new Weapon("sapper"){{
length = 1.5f;
reload = 12f;
roundrobin = true;
@@ -82,7 +82,7 @@ public class Weapons implements ContentList {
setAmmo(AmmoTypes.bulletCarbide);
}};
swarmer = new Weapon("swarmer") {{
swarmer = new Weapon("swarmer"){{
length = 1.5f;
reload = 10f;
roundrobin = true;
@@ -90,7 +90,7 @@ public class Weapons implements ContentList {
setAmmo(AmmoTypes.bulletPyratite);
}};
bomber = new Weapon("bomber") {{
bomber = new Weapon("bomber"){{
length = 0f;
width = 2f;
reload = 5f;
@@ -103,7 +103,7 @@ public class Weapons implements ContentList {
}
@Override
public Array<? extends Content> getAll() {
public Array<? extends Content> getAll(){
return Upgrade.all();
}
}

View File

@@ -5,10 +5,10 @@ import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.world.Block;
public abstract class BlockList implements ContentList {
public abstract class BlockList implements ContentList{
@Override
public Array<? extends Content> getAll() {
public Array<? extends Content> getAll(){
return Block.all();
}
}

View File

@@ -15,26 +15,31 @@ public class Blocks extends BlockList implements ContentList{
public static Block air, spawn, blockpart, space, metalfloor, deepwater, water, lava, oil, stone, blackstone, dirt, sand, ice, snow, grass, shrub, rock, icerock, blackrock;
@Override
public void load() {
air = new Floor("air") {
public void load(){
air = new Floor("air"){
{
blend = false;
}
//don't draw
public void draw(Tile tile) {}
public void load() {}
public void init() {}
public void draw(Tile tile){
}
public void load(){
}
public void init(){
}
};
blockpart = new BlockPart();
for(int i = 1; i <= 6; i ++){
for(int i = 1; i <= 6; i++){
new BuildBlock("build" + i);
}
space = new Floor("space") {{
space = new Floor("space"){{
placeableOn = false;
variants = 0;
cacheLayer = CacheLayer.space;
@@ -43,11 +48,11 @@ public class Blocks extends BlockList implements ContentList{
minimapColor = Color.valueOf("000001");
}};
metalfloor = new Floor("metalfloor") {{
metalfloor = new Floor("metalfloor"){{
variants = 6;
}};
deepwater = new Floor("deepwater") {{
deepwater = new Floor("deepwater"){{
liquidColor = Color.valueOf("546bb3");
speedMultiplier = 0.2f;
variants = 0;
@@ -60,7 +65,7 @@ public class Blocks extends BlockList implements ContentList{
minimapColor = Color.valueOf("465a96");
}};
water = new Floor("water") {{
water = new Floor("water"){{
liquidColor = Color.valueOf("546bb3");
speedMultiplier = 0.5f;
variants = 0;
@@ -72,7 +77,7 @@ public class Blocks extends BlockList implements ContentList{
minimapColor = Color.valueOf("506eb4");
}};
lava = new Floor("lava") {{
lava = new Floor("lava"){{
liquidColor = Color.valueOf("ed5334");
speedMultiplier = 0.2f;
damageTaken = 0.5f;
@@ -85,7 +90,7 @@ public class Blocks extends BlockList implements ContentList{
minimapColor = Color.valueOf("ed5334");
}};
oil = new Floor("oil") {{
oil = new Floor("oil"){{
liquidColor = Color.valueOf("292929");
status = StatusEffects.tarred;
statusIntensity = 1f;
@@ -97,7 +102,7 @@ public class Blocks extends BlockList implements ContentList{
minimapColor = Color.valueOf("292929");
}};
stone = new Floor("stone") {{
stone = new Floor("stone"){{
hasOres = true;
drops = new ItemStack(Items.stone, 1);
blends = block -> block != this && !(block instanceof Ore);
@@ -105,7 +110,7 @@ public class Blocks extends BlockList implements ContentList{
playerUnmineable = true;
}};
blackstone = new Floor("blackstone") {{
blackstone = new Floor("blackstone"){{
drops = new ItemStack(Items.stone, 1);
minimapColor = Color.valueOf("252525");
playerUnmineable = true;
@@ -115,14 +120,14 @@ public class Blocks extends BlockList implements ContentList{
minimapColor = Color.valueOf("6e501e");
}};
sand = new Floor("sand") {{
sand = new Floor("sand"){{
drops = new ItemStack(Items.sand, 1);
minimapColor = Color.valueOf("988a67");
hasOres = true;
playerUnmineable = true;
}};
ice = new Floor("ice") {{
ice = new Floor("ice"){{
dragMultiplier = 0.3f;
speedMultiplier = 0.4f;
minimapColor = Color.valueOf("c4e3e7");
@@ -143,19 +148,16 @@ public class Blocks extends BlockList implements ContentList{
shadow = "shrubshadow";
}};
rock = new Rock("rock") {{
rock = new Rock("rock"){{
variants = 2;
varyShadow = true;
}};
icerock = new Rock("icerock") {{
icerock = new Rock("icerock"){{
variants = 2;
varyShadow = true;
}};
blackrock = new Rock("blackrock") {{
blackrock = new Rock("blackrock"){{
variants = 1;
varyShadow = true;
}};
}
}

View File

@@ -10,55 +10,54 @@ import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.production.*;
public class CraftingBlocks extends BlockList implements ContentList {
public class CraftingBlocks extends BlockList implements ContentList{
public static Block smelter, arcsmelter, siliconsmelter, plastaniumCompressor, phaseWeaver, alloysmelter, alloyfuser,
pyratiteMixer, blastMixer,
cryofluidmixer, melter, separator, centrifuge, biomatterCompressor, pulverizer, oilRefinery, solidifier, incinerator;
cryofluidmixer, melter, separator, centrifuge, biomatterCompressor, pulverizer, solidifier, incinerator;
@Override
public void load() {
smelter = new Smelter("smelter") {{
public void load(){
smelter = new Smelter("smelter"){{
health = 70;
inputs = new ItemStack[]{new ItemStack(Items.tungsten, 3)};
fuel = Items.coal;
result = Items.carbide;
craftTime = 45f;
burnDuration = 35f;
useFlux = true;
consumes.items(new ItemStack[]{new ItemStack(Items.tungsten, 3)});
consumes.item(Items.coal);
}};
arcsmelter = new PowerSmelter("arc-smelter") {{
arcsmelter = new PowerSmelter("arc-smelter"){{
health = 90;
craftEffect = BlockFx.smeltsmoke;
inputs = new ItemStack[]{new ItemStack(Items.coal, 1), new ItemStack(Items.tungsten, 2)};
result = Items.carbide;
powerUse = 0.1f;
craftTime = 30f;
size = 2;
useFlux = true;
fluxNeeded = 2;
consumes.items(new ItemStack[]{new ItemStack(Items.coal, 1), new ItemStack(Items.tungsten, 2)});
consumes.power(0.1f);
}};
siliconsmelter = new PowerSmelter("silicon-smelter") {{
siliconsmelter = new PowerSmelter("silicon-smelter"){{
health = 90;
craftEffect = BlockFx.smeltsmoke;
inputs = new ItemStack[]{new ItemStack(Items.coal, 1), new ItemStack(Items.sand, 2)};
result = Items.silicon;
powerUse = 0.05f;
craftTime = 40f;
size = 2;
hasLiquids = false;
flameColor = Color.valueOf("ffef99");
consumes.items(new ItemStack[]{new ItemStack(Items.coal, 1), new ItemStack(Items.sand, 2)});
consumes.power(0.05f);
}};
plastaniumCompressor = new PlastaniumCompressor("plastanium-compressor") {{
inputLiquid = Liquids.oil;
inputItem = new ItemStack(Items.titanium, 2);
plastaniumCompressor = new PlastaniumCompressor("plastanium-compressor"){{
hasItems = true;
liquidUse = 0.3f;
liquidCapacity = 60f;
powerUse = 0.5f;
craftTime = 80f;
output = Items.plastanium;
itemCapacity = 30;
@@ -67,94 +66,103 @@ public class CraftingBlocks extends BlockList implements ContentList {
hasPower = hasLiquids = true;
craftEffect = BlockFx.formsmoke;
updateEffect = BlockFx.plasticburn;
consumes.liquid(Liquids.oil, 0.3f);
consumes.power(0.4f);
consumes.item(Items.titanium, 2);
}};
phaseWeaver = new PhaseWeaver("phase-weaver") {{
phaseWeaver = new PhaseWeaver("phase-weaver"){{
health = 90;
craftEffect = BlockFx.smeltsmoke;
inputs = new ItemStack[]{new ItemStack(Items.thorium, 4), new ItemStack(Items.sand, 10)};
result = Items.phasematter;
powerUse = 0.4f;
craftTime = 120f;
size = 2;
consumes.items(new ItemStack[]{new ItemStack(Items.thorium, 4), new ItemStack(Items.sand, 10)});
consumes.power(0.5f);
}};
alloysmelter = new PowerSmelter("alloy-smelter") {{
alloysmelter = new PowerSmelter("alloy-smelter"){{
health = 90;
craftEffect = BlockFx.smeltsmoke;
inputs = new ItemStack[]{new ItemStack(Items.titanium, 2), new ItemStack(Items.lead, 4), new ItemStack(Items.silicon, 3), new ItemStack(Items.plastanium, 2)};
result = Items.surgealloy;
powerUse = 0.3f;
craftTime = 50f;
size = 2;
useFlux = true;
fluxNeeded = 4;
consumes.power(0.3f);
consumes.items(new ItemStack[]{new ItemStack(Items.titanium, 2), new ItemStack(Items.lead, 4), new ItemStack(Items.silicon, 3), new ItemStack(Items.plastanium, 2)});
}};
alloyfuser = new PowerSmelter("alloy-fuser") {{
alloyfuser = new PowerSmelter("alloy-fuser"){{
health = 90;
craftEffect = BlockFx.smeltsmoke;
inputs = new ItemStack[]{new ItemStack(Items.titanium, 3), new ItemStack(Items.lead, 4), new ItemStack(Items.silicon, 3), new ItemStack(Items.plastanium, 2)};
result = Items.surgealloy;
powerUse = 0.4f;
craftTime = 30f;
size = 3;
useFlux = true;
fluxNeeded = 4;
consumes.items(new ItemStack[]{new ItemStack(Items.titanium, 3), new ItemStack(Items.lead, 4), new ItemStack(Items.silicon, 3), new ItemStack(Items.plastanium, 2)});
consumes.power(0.4f);
}};
cryofluidmixer = new LiquidMixer("cryofluidmixer") {{
cryofluidmixer = new LiquidMixer("cryofluidmixer"){{
health = 200;
inputLiquid = Liquids.water;
outputLiquid = Liquids.cryofluid;
inputItem = Items.titanium;
liquidPerItem = 50f;
itemCapacity = 50;
powerUse = 0.1f;
size = 2;
hasPower = true;
consumes.power(0.1f);
consumes.item(Items.titanium);
consumes.liquid(Liquids.water, 0.3f);
}};
blastMixer = new GenericCrafter("blast-mixer") {{
blastMixer = new GenericCrafter("blast-mixer"){{
itemCapacity = 20;
hasItems = true;
hasPower = true;
inputLiquid = Liquids.oil;
liquidUse = 0.05f;
inputItem = new ItemStack(Items.pyratite, 1);
hasLiquids = true;
output = Items.blastCompound;
powerUse = 0.04f;
size = 2;
consumes.liquid(Liquids.oil, 0.05f);
consumes.item(Items.pyratite, 1);
consumes.power(0.04f);
}};
pyratiteMixer = new PowerSmelter("pyratite-mixer") {{
pyratiteMixer = new PowerSmelter("pyratite-mixer"){{
flameColor = Color.CLEAR;
itemCapacity = 20;
hasItems = true;
hasPower = true;
inputs = new ItemStack[]{new ItemStack(Items.coal, 1), new ItemStack(Items.lead, 2), new ItemStack(Items.sand, 2)};
result = Items.pyratite;
powerUse = 0.02f;
size = 2;
consumes.power(0.02f);
consumes.items(new ItemStack[]{new ItemStack(Items.coal, 1), new ItemStack(Items.lead, 2), new ItemStack(Items.sand, 2)});
}};
melter = new PowerCrafter("melter") {{
melter = new PowerCrafter("melter"){{
health = 200;
outputLiquid = Liquids.lava;
outputLiquidAmount = 0.05f;
input = new ItemStack(Items.stone, 1);
outputLiquidAmount = 0.75f;
itemCapacity = 50;
craftTime = 10f;
powerUse = 0.1f;
hasLiquids = hasPower = true;
consumes.power(0.1f);
consumes.item(Items.stone, 2);
}};
separator = new Separator("separator") {{
liquid = Liquids.water;
item = Items.stone;
separator = new Separator("separator"){{
results = new Item[]{
null, null, null, null, null, null, null, null, null, null,
Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand,
@@ -164,15 +172,15 @@ public class CraftingBlocks extends BlockList implements ContentList {
Items.coal, Items.coal,
Items.titanium
};
liquidUse = 0.2f;
filterTime = 40f;
itemCapacity = 40;
health = 50;
consumes.item(Items.stone, 2);
consumes.liquid(Liquids.water, 0.3f);
}};
centrifuge = new Separator("centrifuge") {{
liquid = Liquids.water;
item = Items.stone;
centrifuge = new Separator("centrifuge"){{
results = new Item[]{
null, null, null, null, null, null, null, null, null, null, null, null, null,
Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand,
@@ -184,9 +192,7 @@ public class CraftingBlocks extends BlockList implements ContentList {
Items.thorium,
};
liquidUse = 0.3f;
hasPower = true;
powerUse = 0.2f;
filterTime = 15f;
itemCapacity = 60;
health = 50 * 4;
@@ -195,56 +201,52 @@ public class CraftingBlocks extends BlockList implements ContentList {
spinnerThickness = 1.5f;
spinnerSpeed = 3f;
size = 2;
consumes.item(Items.stone, 2);
consumes.power(0.2f);
consumes.liquid(Liquids.water, 0.5f);
}};
biomatterCompressor = new Compressor("biomattercompressor") {{
input = new ItemStack(Items.biomatter, 1);
biomatterCompressor = new Compressor("biomattercompressor"){{
liquidCapacity = 60f;
itemCapacity = 50;
powerUse = 0.06f;
craftTime = 25f;
outputLiquid = Liquids.oil;
outputLiquidAmount = 0.1f;
outputLiquidAmount = 0.14f;
size = 2;
health = 320;
hasLiquids = true;
consumes.item(Items.biomatter, 1);
consumes.power(0.06f);
}};
pulverizer = new Pulverizer("pulverizer") {{
inputItem = new ItemStack(Items.stone, 2);
pulverizer = new Pulverizer("pulverizer"){{
itemCapacity = 40;
powerUse = 0.2f;
output = Items.sand;
health = 80;
craftEffect = BlockFx.pulverize;
craftTime = 60f;
updateEffect = BlockFx.pulverizeSmall;
hasItems = hasPower = true;
consumes.item(Items.stone, 2);
consumes.power(0.2f);
}};
oilRefinery = new GenericCrafter("oilrefinery") {{
inputLiquid = Liquids.oil;
powerUse = 0.05f;
liquidUse = 0.1f;
liquidCapacity = 56f;
output = Items.coal;
health = 80;
craftEffect = BlockFx.purifyoil;
hasItems = hasLiquids = hasPower = true;
}};
solidifier = new GenericCrafter("solidifer") {{
inputLiquid = Liquids.lava;
liquidUse = 1f;
solidifier = new GenericCrafter("solidifer"){{
liquidCapacity = 21f;
craftTime = 14;
output = Items.stone;
itemCapacity = 20;
health = 80;
craftEffect = BlockFx.purifystone;
hasLiquids = hasItems = true;
consumes.liquid(Liquids.lava, 1f);
}};
incinerator = new Incinerator("incinerator") {{
incinerator = new Incinerator("incinerator"){{
health = 90;
}};
}

View File

@@ -28,45 +28,52 @@ import java.io.IOException;
public class DebugBlocks extends BlockList implements ContentList{
public static Block powerVoid, powerInfinite, itemSource, liquidSource, itemVoid;
@Remote(targets = Loc.both, called = Loc.both, in = In.blocks, forward = true)
public static void setLiquidSourceLiquid(Player player, Tile tile, Liquid liquid){
LiquidSourceEntity entity = tile.entity();
entity.source = liquid;
}
@Override
public void load() {
powerVoid = new PowerBlock("powervoid") {
public void load(){
powerVoid = new PowerBlock("powervoid"){
{
powerCapacity = Float.MAX_VALUE;
}
};
powerInfinite = new PowerNode("powerinfinite") {
powerInfinite = new PowerNode("powerinfinite"){
{
powerCapacity = 10000f;
powerSpeed = 100f;
}
@Override
public void update(Tile tile) {
public void update(Tile tile){
super.update(tile);
tile.entity.power.amount = powerCapacity;
}
};
itemSource = new Sorter("itemsource") {
itemSource = new Sorter("itemsource"){
{
hasItems = true;
}
@Override
public void update(Tile tile) {
public void update(Tile tile){
SorterEntity entity = tile.entity();
entity.items.items[entity.sortItem.id] = 1;
entity.items.set(entity.sortItem, 1);
tryDump(tile, entity.sortItem);
}
@Override
public boolean acceptItem(Item item, Tile tile, Tile source) {
public boolean acceptItem(Item item, Tile tile, Tile source){
return false;
}
};
liquidSource = new Block("liquidsource") {
liquidSource = new Block("liquidsource"){
{
update = true;
solid = true;
@@ -76,16 +83,15 @@ public class DebugBlocks extends BlockList implements ContentList{
}
@Override
public void update(Tile tile) {
public void update(Tile tile){
LiquidSourceEntity entity = tile.entity();
tile.entity.liquids.amount = liquidCapacity;
tile.entity.liquids.liquid = entity.source;
tryDumpLiquid(tile);
tile.entity.liquids.add(entity.source, liquidCapacity);
tryDumpLiquid(tile, entity.source);
}
@Override
public void draw(Tile tile) {
public void draw(Tile tile){
super.draw(tile);
LiquidSourceEntity entity = tile.entity();
@@ -96,7 +102,7 @@ public class DebugBlocks extends BlockList implements ContentList{
}
@Override
public void buildTable(Tile tile, Table table) {
public void buildTable(Tile tile, Table table){
LiquidSourceEntity entity = tile.entity();
Array<Liquid> items = Liquid.all();
@@ -104,8 +110,8 @@ public class DebugBlocks extends BlockList implements ContentList{
ButtonGroup<ImageButton> group = new ButtonGroup<>();
Table cont = new Table();
for (int i = 0; i < items.size; i++) {
if (i == 0) continue;
for(int i = 0; i < items.size; i++){
if(i == 0) continue;
final int f = i;
ImageButton button = cont.addImageButton("white", "toggle", 24, () -> {
CallBlocks.setLiquidSourceLiquid(null, tile, items.get(f));
@@ -113,7 +119,7 @@ public class DebugBlocks extends BlockList implements ContentList{
button.getStyle().imageUpColor = items.get(i).color;
button.setChecked(entity.source.id == f);
if (i % 4 == 3) {
if(i % 4 == 3){
cont.row();
}
}
@@ -122,43 +128,37 @@ public class DebugBlocks extends BlockList implements ContentList{
}
@Override
public TileEntity getEntity() {
public TileEntity getEntity(){
return new LiquidSourceEntity();
}
};
itemVoid = new Block("itemvoid") {
itemVoid = new Block("itemvoid"){
{
update = solid = true;
}
@Override
public void handleItem(Item item, Tile tile, Tile source) {
public void handleItem(Item item, Tile tile, Tile source){
}
@Override
public boolean acceptItem(Item item, Tile tile, Tile source) {
public boolean acceptItem(Item item, Tile tile, Tile source){
return true;
}
};
}
@Remote(targets = Loc.both, called = Loc.both, in = In.blocks, forward = true)
public static void setLiquidSourceLiquid(Player player, Tile tile, Liquid liquid){
LiquidSourceEntity entity = tile.entity();
entity.source = liquid;
}
class LiquidSourceEntity extends TileEntity {
class LiquidSourceEntity extends TileEntity{
public Liquid source = Liquids.water;
@Override
public void write(DataOutputStream stream) throws IOException {
public void write(DataOutputStream stream) throws IOException{
stream.writeByte(source.id);
}
@Override
public void read(DataInputStream stream) throws IOException {
public void read(DataInputStream stream) throws IOException{
source = Liquid.getByID(stream.readByte());
}
}

View File

@@ -8,65 +8,65 @@ import io.anuke.mindustry.world.blocks.defense.DeflectorWall;
import io.anuke.mindustry.world.blocks.defense.Door;
import io.anuke.mindustry.world.blocks.defense.PhaseWall;
public class DefenseBlocks extends BlockList implements ContentList {
public class DefenseBlocks extends BlockList implements ContentList{
public static Block tungstenWall, tungstenWallLarge, carbideWall, carbideWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge, deflectorwall, deflectorwalllarge,
phasewall, phasewalllarge;
phasewall, phasewalllarge;
@Override
public void load() {
public void load(){
int wallHealthMultiplier = 4;
tungstenWall = new Wall("tungsten-wall") {{
tungstenWall = new Wall("tungsten-wall"){{
health = 80 * wallHealthMultiplier;
}};
tungstenWallLarge = new Wall("tungsten-wall-large") {{
tungstenWallLarge = new Wall("tungsten-wall-large"){{
health = 80 * 4 * wallHealthMultiplier;
size = 2;
}};
carbideWall = new Wall("carbide-wall") {{
carbideWall = new Wall("carbide-wall"){{
health = 110 * wallHealthMultiplier;
}};
carbideWallLarge = new Wall("carbide-wall-large") {{
health = 110 * wallHealthMultiplier*4;
carbideWallLarge = new Wall("carbide-wall-large"){{
health = 110 * wallHealthMultiplier * 4;
size = 2;
}};
thoriumWall = new Wall("thorium-wall") {{
health = 110 * wallHealthMultiplier;
thoriumWall = new Wall("thorium-wall"){{
health = 200 * wallHealthMultiplier;
}};
thoriumWallLarge = new Wall("thorium-wall-large") {{
health = 110 * wallHealthMultiplier*4;
thoriumWallLarge = new Wall("thorium-wall-large"){{
health = 200 * wallHealthMultiplier * 4;
size = 2;
}};
deflectorwall = new DeflectorWall("deflector-wall") {{
deflectorwall = new DeflectorWall("deflector-wall"){{
health = 150 * wallHealthMultiplier;
}};
deflectorwalllarge = new DeflectorWall("deflector-wall-large") {{
deflectorwalllarge = new DeflectorWall("deflector-wall-large"){{
health = 150 * 4 * wallHealthMultiplier;
size = 2;
}};
phasewall = new PhaseWall("phase-wall") {{
phasewall = new PhaseWall("phase-wall"){{
health = 150 * wallHealthMultiplier;
}};
phasewalllarge = new PhaseWall("phase-wall-large") {{
phasewalllarge = new PhaseWall("phase-wall-large"){{
health = 150 * 4 * wallHealthMultiplier;
size = 2;
regenSpeed = 0.5f;
}};
door = new Door("door") {{
door = new Door("door"){{
health = 100 * wallHealthMultiplier;
}};
doorLarge = new Door("door-large") {{
doorLarge = new Door("door-large"){{
openfx = BlockFx.dooropenlarge;
closefx = BlockFx.doorcloselarge;
health = 100 * 4 * wallHealthMultiplier;

View File

@@ -5,53 +5,51 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.distribution.*;
public class DistributionBlocks extends BlockList implements ContentList{
public static Block conveyor, titaniumconveyor, router, multiplexer, junction,
bridgeConveyor, phaseConveyor, sorter, splitter, overflowGate, massDriver;
public static Block conveyor, titaniumconveyor, distributor, junction,
bridgeConveyor, phaseConveyor, sorter, splitter, overflowGate, massDriver;
@Override
public void load() {
@Override
public void load(){
conveyor = new Conveyor("conveyor") {{
health = 45;
speed = 0.03f;
}};
conveyor = new Conveyor("conveyor"){{
health = 45;
speed = 0.03f;
}};
titaniumconveyor = new Conveyor("titanium-conveyor") {{
health = 65;
speed = 0.07f;
}};
titaniumconveyor = new Conveyor("titanium-conveyor"){{
health = 65;
speed = 0.07f;
}};
router = new Router("router");
junction = new Junction("junction"){{
speed = 26;
capacity = 32;
}};
multiplexer = new Router("multiplexer") {{
size = 2;
itemCapacity = 80;
}};
bridgeConveyor = new BufferedItemBridge("bridge-conveyor"){{
range = 3;
}};
junction = new Junction("junction") {{
speed = 26;
capacity = 32;
}};
phaseConveyor = new ItemBridge("phase-conveyor"){{
range = 7;
hasPower = false;
consumes.power(0.05f);
}};
bridgeConveyor = new BufferedItemBridge("bridge-conveyor") {{
range = 3;
hasPower = false;
}};
sorter = new Sorter("sorter");
phaseConveyor = new ItemBridge("phase-conveyor") {{
range = 7;
}};
splitter = new Splitter("splitter");
sorter = new Sorter("sorter");
distributor = new Splitter("distributor"){{
size = 2;
}};
splitter = new Splitter("splitter");
overflowGate = new OverflowGate("overflow-gate");
overflowGate = new OverflowGate("overflow-gate");
massDriver = new MassDriver("mass-driver"){{
size = 3;
itemCapacity = 80;
range = 300f;
}};
}
massDriver = new MassDriver("mass-driver"){{
size = 3;
itemCapacity = 80;
range = 300f;
}};
}
}

View File

@@ -9,46 +9,47 @@ public class LiquidBlocks extends BlockList implements ContentList{
public static Block mechanicalPump, rotaryPump, thermalPump, conduit, pulseConduit, liquidRouter, liquidtank, liquidJunction, bridgeConduit, phaseConduit;
@Override
public void load() {
public void load(){
mechanicalPump = new Pump("mechanical-pump") {{
mechanicalPump = new Pump("mechanical-pump"){{
shadow = "shadow-round-1";
pumpAmount = 0.1f;
tier = 0;
}};
rotaryPump = new Pump("rotary-pump") {{
rotaryPump = new Pump("rotary-pump"){{
shadow = "shadow-rounded-2";
pumpAmount = 0.25f;
powerUse = 0.015f;
consumes.power(0.015f);
liquidCapacity = 30f;
hasPower = true;
size = 2;
tier = 1;
}};
thermalPump = new Pump("thermal-pump") {{
thermalPump = new Pump("thermal-pump"){{
pumpAmount = 0.3f;
powerUse = 0.02f;
consumes.power(0.05f);
liquidCapacity = 40f;
size = 2;
tier = 2;
}};
conduit = new Conduit("conduit") {{
conduit = new Conduit("conduit"){{
health = 45;
}};
pulseConduit = new Conduit("pulse-conduit") {{
pulseConduit = new Conduit("pulse-conduit"){{
liquidCapacity = 16f;
liquidFlowFactor = 4.9f;
health = 90;
}};
liquidRouter = new LiquidRouter("liquid-router") {{
liquidRouter = new LiquidRouter("liquid-router"){{
liquidCapacity = 40f;
}};
liquidtank = new LiquidRouter("liquid-tank") {{
liquidtank = new LiquidRouter("liquid-tank"){{
size = 3;
liquidCapacity = 1500f;
health = 500;
@@ -56,13 +57,15 @@ public class LiquidBlocks extends BlockList implements ContentList{
liquidJunction = new LiquidJunction("liquid-junction");
bridgeConduit = new LiquidExtendingBridge("bridge-conduit") {{
bridgeConduit = new LiquidExtendingBridge("bridge-conduit"){{
range = 3;
hasPower = false;
}};
phaseConduit = new LiquidBridge("phase-conduit") {{
phaseConduit = new LiquidBridge("phase-conduit"){{
range = 7;
hasPower = false;
consumes.power(0.05f);
}};
}
}

View File

@@ -7,11 +7,18 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.OreBlock;
public class OreBlocks extends BlockList {
public class OreBlocks extends BlockList{
private static final ObjectMap<Item, ObjectMap<Block, Block>> oreBlockMap = new ObjectMap<>();
public static Block get(Block floor, Item item){
if(!oreBlockMap.containsKey(item)) throw new IllegalArgumentException("Item '" + item + "' is not an ore!");
if(!oreBlockMap.get(item).containsKey(floor))
throw new IllegalArgumentException("Block '" + floor.name + "' does not support ores!");
return oreBlockMap.get(item).get(floor);
}
@Override
public void load() {
public void load(){
Item[] ores = {Items.tungsten, Items.lead, Items.coal, Items.titanium, Items.thorium};
for(Item item : ores){
@@ -25,10 +32,4 @@ public class OreBlocks extends BlockList {
}
}
}
public static Block get(Block floor, Item item){
if(!oreBlockMap.containsKey(item)) throw new IllegalArgumentException("Item '" + item + "' is not an ore!");
if(!oreBlockMap.get(item).containsKey(floor)) throw new IllegalArgumentException("Block '" + floor.name + "' does not support ores!");
return oreBlockMap.get(item).get(floor);
}
}

View File

@@ -1,24 +1,25 @@
package io.anuke.mindustry.content.blocks;
import io.anuke.mindustry.content.Liquids;
import io.anuke.mindustry.content.fx.BlockFx;
import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.distribution.WarpGate;
import io.anuke.mindustry.world.blocks.power.*;
public class PowerBlocks extends BlockList implements ContentList {
public class PowerBlocks extends BlockList implements ContentList{
public static Block combustionGenerator, thermalGenerator, turbineGenerator, rtgGenerator, solarPanel, largeSolarPanel,
nuclearReactor, fusionReactor, battery, batteryLarge, powerNode, powerNodeLarge, warpGate;
@Override
public void load() {
combustionGenerator = new BurnerGenerator("combustion-generator") {{
public void load(){
combustionGenerator = new BurnerGenerator("combustion-generator"){{
powerOutput = 0.09f;
powerCapacity = 40f;
itemDuration = 40f;
}};
thermalGenerator = new LiquidHeatGenerator("thermal-generator") {{
thermalGenerator = new LiquidHeatGenerator("thermal-generator"){{
maxLiquidGenerate = 0.5f;
powerPerLiquid = 0.08f;
powerCapacity = 40f;
@@ -27,55 +28,55 @@ public class PowerBlocks extends BlockList implements ContentList {
size = 2;
}};
turbineGenerator = new TurbineGenerator("turbine-generator") {{
turbineGenerator = new TurbineGenerator("turbine-generator"){{
powerOutput = 0.28f;
powerCapacity = 40f;
itemDuration = 30f;
powerPerLiquid = 0.7f;
auxLiquidUse = 0.05f;
consumes.liquid(Liquids.water, 0.05f);
size = 2;
}};
rtgGenerator = new DecayGenerator("rtg-generator") {{
rtgGenerator = new DecayGenerator("rtg-generator"){{
powerCapacity = 40f;
powerOutput = 0.02f;
itemDuration = 500f;
}};
solarPanel = new SolarGenerator("solar-panel") {{
solarPanel = new SolarGenerator("solar-panel"){{
generation = 0.0045f;
}};
largeSolarPanel = new SolarGenerator("solar-panel-large") {{
largeSolarPanel = new SolarGenerator("solar-panel-large"){{
size = 3;
generation = 0.055f;
}};
nuclearReactor = new NuclearReactor("nuclear-reactor") {{
nuclearReactor = new NuclearReactor("nuclear-reactor"){{
size = 3;
health = 700;
powerMultiplier = 0.8f;
}};
fusionReactor = new FusionReactor("fusion-reactor") {{
fusionReactor = new FusionReactor("fusion-reactor"){{
size = 4;
health = 600;
}};
battery = new PowerDistributor("battery") {{
battery = new PowerDistributor("battery"){{
powerCapacity = 320f;
}};
batteryLarge = new PowerDistributor("battery-large") {{
batteryLarge = new PowerDistributor("battery-large"){{
size = 3;
powerCapacity = 2000f;
}};
powerNode = new PowerNode("power-node") {{
powerNode = new PowerNode("power-node"){{
shadow = "shadow-round-1";
}};
powerNodeLarge = new PowerNode("power-node-large") {{
powerNodeLarge = new PowerNode("power-node-large"){{
size = 2;
powerSpeed = 1f;
maxNodes = 5;

View File

@@ -11,35 +11,35 @@ import io.anuke.mindustry.world.blocks.production.Drill;
import io.anuke.mindustry.world.blocks.production.Fracker;
import io.anuke.mindustry.world.blocks.production.SolidPump;
public class ProductionBlocks extends BlockList implements ContentList {
public class ProductionBlocks extends BlockList implements ContentList{
public static Block tungstenDrill, carbideDrill, laserdrill, blastdrill, plasmadrill, waterextractor, oilextractor, cultivator;
@Override
public void load() {
tungstenDrill = new Drill("tungsten-drill") {{
public void load(){
tungstenDrill = new Drill("tungsten-drill"){{
tier = 2;
drillTime = 340;
}};
carbideDrill = new Drill("carbide-drill") {{
carbideDrill = new Drill("carbide-drill"){{
tier = 3;
drillTime = 280;
}};
laserdrill = new Drill("laser-drill") {{
laserdrill = new Drill("laser-drill"){{
drillTime = 180;
size = 2;
powerUse = 0.2f;
hasPower = true;
tier = 4;
updateEffect = BlockFx.pulverizeMedium;
drillEffect = BlockFx.mineBig;
consumes.power(0.2f);
}};
blastdrill = new Drill("blast-drill") {{
blastdrill = new Drill("blast-drill"){{
drillTime = 120;
size = 3;
powerUse = 0.5f;
drawRim = true;
hasPower = true;
tier = 5;
@@ -48,13 +48,14 @@ public class ProductionBlocks extends BlockList implements ContentList {
drillEffect = BlockFx.mineHuge;
rotateSpeed = 6f;
warmupSpeed = 0.01f;
consumes.power(0.5f);
}};
plasmadrill = new Drill("plasma-drill") {{
plasmadrill = new Drill("plasma-drill"){{
heatColor = Color.valueOf("ff461b");
drillTime = 90;
size = 4;
powerUse = 0.7f;
hasLiquids = true;
hasPower = true;
tier = 5;
@@ -64,38 +65,43 @@ public class ProductionBlocks extends BlockList implements ContentList {
updateEffectChance = 0.04f;
drillEffect = BlockFx.mineHuge;
warmupSpeed = 0.005f;
consumes.power(0.7f);
}};
waterextractor = new SolidPump("water-extractor") {{
waterextractor = new SolidPump("water-extractor"){{
result = Liquids.water;
powerUse = 0.2f;
pumpAmount = 0.1f;
size = 2;
liquidCapacity = 30f;
rotateSpeed = 1.4f;
consumes.power(0.2f);
}};
oilextractor = new Fracker("oil-extractor") {{
oilextractor = new Fracker("oil-extractor"){{
result = Liquids.oil;
inputLiquid = Liquids.water;
updateEffect = BlockFx.pulverize;
liquidCapacity = 50f;
updateEffectChance = 0.05f;
inputLiquidUse = 0.3f;
powerUse = 0.6f;
pumpAmount = 0.06f;
pumpAmount = 0.08f;
size = 3;
liquidCapacity = 30f;
consumes.item(Items.sand);
consumes.power(0.5f);
consumes.liquid(Liquids.water, 0.3f);
}};
cultivator = new Cultivator("cultivator") {{
cultivator = new Cultivator("cultivator"){{
result = Items.biomatter;
inputLiquid = Liquids.water;
liquidUse = 0.2f;
drillTime = 260;
size = 2;
hasLiquids = true;
hasPower = true;
consumes.power(0.08f);
consumes.liquid(Liquids.water, 0.2f);
}};
}

View File

@@ -7,25 +7,26 @@ import io.anuke.mindustry.world.blocks.storage.SortedUnloader;
import io.anuke.mindustry.world.blocks.storage.Unloader;
import io.anuke.mindustry.world.blocks.storage.Vault;
public class StorageBlocks extends BlockList implements ContentList {
public class StorageBlocks extends BlockList implements ContentList{
public static Block core, vault, unloader, sortedunloader;
@Override
public void load() {
core = new CoreBlock("core") {{
public void load(){
core = new CoreBlock("core"){{
health = 800;
}};
vault = new Vault("vault") {{
vault = new Vault("vault"){{
size = 3;
health = 600;
itemCapacity = 2000;
}};
unloader = new Unloader("unloader") {{
unloader = new Unloader("unloader"){{
speed = 5;
}};
sortedunloader = new SortedUnloader("sortedunloader") {{
sortedunloader = new SortedUnloader("sortedunloader"){{
speed = 5;
}};
}

View File

@@ -12,22 +12,23 @@ import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
public class TurretBlocks extends BlockList implements ContentList {
public static Block duo, /*scatter,*/ scorch, hail, wave, lancer, arc, swarmer, salvo, fuse, ripple, cyclone, spectre, meltdown;
public class TurretBlocks extends BlockList implements ContentList{
public static Block duo, /*scatter,*/
scorch, hail, wave, lancer, arc, swarmer, salvo, fuse, ripple, cyclone, spectre, meltdown;
@Override
public void load() {
duo = new DoubleTurret("duo") {{
ammoTypes = new AmmoType[]{AmmoTypes.bulletTungsten, AmmoTypes.bulletLead, AmmoTypes.bulletCarbide, AmmoTypes.bulletPyratite, AmmoTypes.bulletSilicon};
reload = 25f;
restitution = 0.03f;
range = 90f;
shootCone = 15f;
ammoUseEffect = ShootFx.shellEjectSmall;
health = 80;
inaccuracy = 2f;
rotatespeed = 10f;
}};
@Override
public void load(){
duo = new DoubleTurret("duo"){{
ammoTypes = new AmmoType[]{AmmoTypes.bulletTungsten, AmmoTypes.bulletLead, AmmoTypes.bulletCarbide, AmmoTypes.bulletPyratite, AmmoTypes.bulletSilicon};
reload = 25f;
restitution = 0.03f;
range = 90f;
shootCone = 15f;
ammoUseEffect = ShootFx.shellEjectSmall;
health = 80;
inaccuracy = 2f;
rotatespeed = 10f;
}};
/*
scatter = new BurstTurret("scatter") {{
ammoTypes = new AmmoType[]{AmmoTypes.flakLead, AmmoTypes.flakExplosive, AmmoTypes.flakPlastic};
@@ -41,165 +42,165 @@ public class TurretBlocks extends BlockList implements ContentList {
ammoUseEffect = ShootFx.shellEjectSmall;
}};*/
hail = new ArtilleryTurret("hail") {{
ammoTypes = new AmmoType[]{AmmoTypes.artilleryCarbide, AmmoTypes.artilleryHoming, AmmoTypes.artilleryIncindiary};
reload = 100f;
recoil = 2f;
range = 200f;
inaccuracy = 5f;
health = 120;
}};
hail = new ArtilleryTurret("hail"){{
ammoTypes = new AmmoType[]{AmmoTypes.artilleryCarbide, AmmoTypes.artilleryHoming, AmmoTypes.artilleryIncindiary};
reload = 100f;
recoil = 2f;
range = 200f;
inaccuracy = 5f;
health = 120;
}};
scorch = new LiquidTurret("scorch") {{
scorch = new LiquidTurret("scorch"){{
ammoTypes = new AmmoType[]{AmmoTypes.basicFlame};
recoil = 0f;
reload = 4f;
shootCone = 50f;
ammoUseEffect = ShootFx.shellEjectSmall;
health = 160;
health = 160;
drawer = (tile, entity) -> Draw.rect(entity.target != null ? name + "-shoot" : name, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
}};
wave = new LiquidTurret("wave") {{
ammoTypes = new AmmoType[]{AmmoTypes.water, AmmoTypes.lava, AmmoTypes.cryofluid, AmmoTypes.oil};
size = 2;
recoil = 0f;
reload = 4f;
inaccuracy = 5f;
shootCone = 50f;
shootEffect = ShootFx.shootLiquid;
range = 70f;
health = 360;
wave = new LiquidTurret("wave"){{
ammoTypes = new AmmoType[]{AmmoTypes.water, AmmoTypes.lava, AmmoTypes.cryofluid, AmmoTypes.oil};
size = 2;
recoil = 0f;
reload = 4f;
inaccuracy = 5f;
shootCone = 50f;
shootEffect = ShootFx.shootLiquid;
range = 70f;
health = 360;
drawer = (tile, entity) -> {
Draw.rect(name, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
drawer = (tile, entity) -> {
Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
Draw.color(entity.liquids.liquid.color);
Draw.alpha(entity.liquids.amount / liquidCapacity);
Draw.rect(name + "-liquid", tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
Draw.color();
};
}};
Draw.color(entity.liquids.current().color);
Draw.alpha(entity.liquids.total() / liquidCapacity);
Draw.rect(name + "-liquid", tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
Draw.color();
};
}};
lancer = new LaserTurret("lancer") {{
range = 90f;
chargeTime = 60f;
chargeMaxDelay = 30f;
chargeEffects = 7;
shootType = AmmoTypes.lancerLaser;
recoil = 2f;
reload = 100f;
cooldown = 0.03f;
powerUsed = 20f;
powerCapacity = 60f;
shootShake = 2f;
shootEffect = ShootFx.lancerLaserShoot;
smokeEffect = ShootFx.lancerLaserShootSmoke;
chargeEffect = ShootFx.lancerLaserCharge;
chargeBeginEffect = ShootFx.lancerLaserChargeBegin;
heatColor = Color.RED;
size = 2;
health = 320;
}};
lancer = new LaserTurret("lancer"){{
range = 90f;
chargeTime = 60f;
chargeMaxDelay = 30f;
chargeEffects = 7;
shootType = AmmoTypes.lancerLaser;
recoil = 2f;
reload = 100f;
cooldown = 0.03f;
powerUsed = 20f;
powerCapacity = 60f;
shootShake = 2f;
shootEffect = ShootFx.lancerLaserShoot;
smokeEffect = ShootFx.lancerLaserShootSmoke;
chargeEffect = ShootFx.lancerLaserCharge;
chargeBeginEffect = ShootFx.lancerLaserChargeBegin;
heatColor = Color.RED;
size = 2;
health = 320;
}};
arc = new LaserTurret("arc") {{
shootType = AmmoTypes.lightning;
reload = 100f;
chargeTime = 70f;
shootShake = 1f;
chargeMaxDelay = 30f;
chargeEffects = 7;
shootEffect = ShootFx.lightningShoot;
chargeEffect = ShootFx.lightningCharge;
chargeBeginEffect = ShootFx.lancerLaserChargeBegin;
heatColor = Color.RED;
recoil = 3f;
size = 2;
}};
arc = new LaserTurret("arc"){{
shootType = AmmoTypes.lightning;
reload = 100f;
chargeTime = 70f;
shootShake = 1f;
chargeMaxDelay = 30f;
chargeEffects = 7;
shootEffect = ShootFx.lightningShoot;
chargeEffect = ShootFx.lightningCharge;
chargeBeginEffect = ShootFx.lancerLaserChargeBegin;
heatColor = Color.RED;
recoil = 3f;
size = 2;
}};
swarmer = new BurstTurret("swarmer") {{
ammoTypes = new AmmoType[]{AmmoTypes.missileExplosive, AmmoTypes.missileIncindiary/*, AmmoTypes.missileSurge*/};
reload = 60f;
shots = 4;
burstSpacing = 5;
inaccuracy = 10f;
range = 140f;
xRand = 6f;
size = 2;
health = 380;
}};
swarmer = new BurstTurret("swarmer"){{
ammoTypes = new AmmoType[]{AmmoTypes.missileExplosive, AmmoTypes.missileIncindiary/*, AmmoTypes.missileSurge*/};
reload = 60f;
shots = 4;
burstSpacing = 5;
inaccuracy = 10f;
range = 140f;
xRand = 6f;
size = 2;
health = 380;
}};
salvo = new BurstTurret("salvo") {{
size = 2;
range = 120f;
ammoTypes = new AmmoType[]{AmmoTypes.bulletTungsten, AmmoTypes.bulletCarbide, AmmoTypes.bulletPyratite, AmmoTypes.bulletThorium, AmmoTypes.bulletSilicon};
reload = 40f;
restitution = 0.03f;
ammoEjectBack = 3f;
cooldown = 0.03f;
recoil = 3f;
shootShake = 2f;
burstSpacing = 4;
shots = 3;
ammoUseEffect = ShootFx.shellEjectBig;
salvo = new BurstTurret("salvo"){{
size = 2;
range = 120f;
ammoTypes = new AmmoType[]{AmmoTypes.bulletTungsten, AmmoTypes.bulletCarbide, AmmoTypes.bulletPyratite, AmmoTypes.bulletThorium, AmmoTypes.bulletSilicon};
reload = 40f;
restitution = 0.03f;
ammoEjectBack = 3f;
cooldown = 0.03f;
recoil = 3f;
shootShake = 2f;
burstSpacing = 4;
shots = 3;
ammoUseEffect = ShootFx.shellEjectBig;
drawer = (tile, entity) -> {
Draw.rect(name, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
float offsetx = (int) (Mathf.abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 3f);
float offsety = -(int) (Mathf.abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 2f);
drawer = (tile, entity) -> {
Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
float offsetx = (int) (Mathf.abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 3f);
float offsety = -(int) (Mathf.abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 2f);
for (int i : Mathf.signs) {
float rot = entity.rotation + 90 * i;
Draw.rect(name + "-panel-" + Strings.dir(i),
tile.drawx() + tr2.x + Angles.trnsx(rot, offsetx, offsety),
tile.drawy() + tr2.y + Angles.trnsy(rot, -offsetx, offsety), entity.rotation - 90);
}
};
for(int i : Mathf.signs){
float rot = entity.rotation + 90 * i;
Draw.rect(name + "-panel-" + Strings.dir(i),
tile.drawx() + tr2.x + Angles.trnsx(rot, offsetx, offsety),
tile.drawy() + tr2.y + Angles.trnsy(rot, -offsetx, offsety), entity.rotation - 90);
}
};
health = 360;
}};
health = 360;
}};
ripple = new ArtilleryTurret("ripple") {{
ammoTypes = new AmmoType[]{AmmoTypes.artilleryCarbide, AmmoTypes.artilleryHoming, AmmoTypes.artilleryIncindiary, AmmoTypes.artilleryExplosive, AmmoTypes.artilleryPlastic};
size = 3;
shots = 4;
inaccuracy = 12f;
reload = 60f;
ammoEjectBack = 5f;
ripple = new ArtilleryTurret("ripple"){{
ammoTypes = new AmmoType[]{AmmoTypes.artilleryCarbide, AmmoTypes.artilleryHoming, AmmoTypes.artilleryIncindiary, AmmoTypes.artilleryExplosive, AmmoTypes.artilleryPlastic};
size = 3;
shots = 4;
inaccuracy = 12f;
reload = 60f;
ammoEjectBack = 5f;
ammoUseEffect = ShootFx.shellEjectBig;
cooldown = 0.03f;
velocityInaccuracy = 0.2f;
velocityInaccuracy = 0.2f;
restitution = 0.02f;
recoil = 6f;
shootShake = 2f;
range = 300f;
health = 550;
}};
health = 550;
}};
cyclone = new ItemTurret("cyclone") {{
ammoTypes = new AmmoType[]{AmmoTypes.flakLead, AmmoTypes.flakExplosive, AmmoTypes.flakPlastic, AmmoTypes.flakSurge};
size = 3;
}};
cyclone = new ItemTurret("cyclone"){{
ammoTypes = new AmmoType[]{AmmoTypes.flakLead, AmmoTypes.flakExplosive, AmmoTypes.flakPlastic, AmmoTypes.flakSurge};
size = 3;
}};
fuse = new ItemTurret("fuse") {{
//TODO make it use power
ammoTypes = new AmmoType[]{AmmoTypes.fuseShotgun};
size = 3;
}};
fuse = new ItemTurret("fuse"){{
//TODO make it use power
ammoTypes = new AmmoType[]{AmmoTypes.fuseShotgun};
size = 3;
}};
spectre = new ItemTurret("spectre") {{
ammoTypes = new AmmoType[]{AmmoTypes.bulletTungsten, AmmoTypes.bulletLead, AmmoTypes.bulletCarbide, AmmoTypes.bulletPyratite, AmmoTypes.bulletThorium, AmmoTypes.bulletSilicon};
reload = 25f;
restitution = 0.03f;
ammoUseEffect = ShootFx.shellEjectSmall;
size = 4;
}};
spectre = new ItemTurret("spectre"){{
ammoTypes = new AmmoType[]{AmmoTypes.bulletTungsten, AmmoTypes.bulletLead, AmmoTypes.bulletCarbide, AmmoTypes.bulletPyratite, AmmoTypes.bulletThorium, AmmoTypes.bulletSilicon};
reload = 25f;
restitution = 0.03f;
ammoUseEffect = ShootFx.shellEjectSmall;
size = 4;
}};
meltdown = new PowerTurret("meltdown") {{
shootType = AmmoTypes.meltdownLaser;
size = 4;
}};
}
meltdown = new PowerTurret("meltdown"){{
shootType = AmmoTypes.meltdownLaser;
size = 4;
}};
}
}

View File

@@ -7,54 +7,51 @@ import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.units.*;
public class UnitBlocks extends BlockList implements ContentList {
public class UnitBlocks extends BlockList implements ContentList{
public static Block resupplyPoint, repairPoint, droneFactory, fabricatorFactory, dropPoint, reconstructor, overdriveProjector, shieldProjector;
@Override
public void load() {
droneFactory = new UnitFactory("drone-factory") {{
public void load(){
droneFactory = new UnitFactory("drone-factory"){{
type = UnitTypes.drone;
produceTime = 800;
size = 2;
requirements = new ItemStack[]{
new ItemStack(Items.silicon, 30), new ItemStack(Items.lead, 30)
};
consumes.power(0.08f);
consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 30), new ItemStack(Items.lead, 30)});
}};
fabricatorFactory = new UnitFactory("fabricator-factory") {{
fabricatorFactory = new UnitFactory("fabricator-factory"){{
type = UnitTypes.fabricator;
produceTime = 1600;
size = 2;
powerUse = 0.2f;
requirements = new ItemStack[]{
new ItemStack(Items.silicon, 70), new ItemStack(Items.lead, 80), new ItemStack(Items.titanium, 80)
};
consumes.power(0.2f);
consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 70), new ItemStack(Items.lead, 80), new ItemStack(Items.titanium, 80)});
}};
resupplyPoint = new ResupplyPoint("resupply-point") {{
resupplyPoint = new ResupplyPoint("resupply-point"){{
shadow = "shadow-round-1";
itemCapacity = 30;
}};
dropPoint = new DropPoint("drop-point") {{
dropPoint = new DropPoint("drop-point"){{
shadow = "shadow-round-1";
itemCapacity = 40;
}};
repairPoint = new RepairPoint("repair-point") {{
repairPoint = new RepairPoint("repair-point"){{
shadow = "shadow-round-1";
repairSpeed = 0.1f;
}};
reconstructor = new Reconstructor("reconstructor") {{
reconstructor = new Reconstructor("reconstructor"){{
size = 2;
}};
overdriveProjector = new OverdriveProjector("overdrive-projector") {{
overdriveProjector = new OverdriveProjector("overdrive-projector"){{
size = 2;
}};
shieldProjector = new ShieldProjector("shieldprojector") {{
shieldProjector = new ShieldProjector("shieldprojector"){{
size = 2;
}};
}

View File

@@ -4,11 +4,11 @@ import io.anuke.mindustry.content.Mechs;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.units.MechFactory;
public class UpgradeBlocks extends BlockList {
public class UpgradeBlocks extends BlockList{
public static Block deltaFactory, tauFactory, omegaFactory, dartFactory, javelinFactory, tridentFactory, halberdFactory;
@Override
public void load() {
public void load(){
deltaFactory = new MechFactory("delta-mech-factory"){{
mech = Mechs.delta;
size = 2;

View File

@@ -11,9 +11,9 @@ public class ArtilleryBullets extends BulletList implements ContentList{
public static BulletType carbide, plastic, plasticFrag, homing, incindiary, explosive, surge;
@Override
public void load() {
public void load(){
carbide = new ArtilleryBulletType(3f, 0, "shell") {
carbide = new ArtilleryBulletType(3f, 0, "shell"){
{
hiteffect = BulletFx.flakExplosion;
knockback = 0.8f;
@@ -25,7 +25,7 @@ public class ArtilleryBullets extends BulletList implements ContentList{
}
};
plasticFrag = new BasicBulletType(2.5f, 6, "bullet") {
plasticFrag = new BasicBulletType(2.5f, 6, "bullet"){
{
bulletWidth = 10f;
bulletHeight = 12f;
@@ -36,7 +36,7 @@ public class ArtilleryBullets extends BulletList implements ContentList{
}
};
plastic = new ArtilleryBulletType(3.3f, 0, "shell") {
plastic = new ArtilleryBulletType(3.3f, 0, "shell"){
{
hiteffect = BulletFx.plasticExplosion;
knockback = 1f;
@@ -52,7 +52,7 @@ public class ArtilleryBullets extends BulletList implements ContentList{
}
};
homing = new ArtilleryBulletType(3f, 0, "shell") {
homing = new ArtilleryBulletType(3f, 0, "shell"){
{
hiteffect = BulletFx.flakExplosion;
knockback = 0.8f;
@@ -66,7 +66,7 @@ public class ArtilleryBullets extends BulletList implements ContentList{
}
};
incindiary = new ArtilleryBulletType(3f, 0, "shell") {
incindiary = new ArtilleryBulletType(3f, 0, "shell"){
{
hiteffect = BulletFx.blastExplosion;
knockback = 0.8f;
@@ -83,7 +83,7 @@ public class ArtilleryBullets extends BulletList implements ContentList{
}
};
explosive = new ArtilleryBulletType(2f, 0, "shell") {
explosive = new ArtilleryBulletType(2f, 0, "shell"){
{
hiteffect = BulletFx.blastExplosion;
knockback = 0.8f;
@@ -97,7 +97,7 @@ public class ArtilleryBullets extends BulletList implements ContentList{
}
};
surge = new ArtilleryBulletType(3f, 0, "shell") {
surge = new ArtilleryBulletType(3f, 0, "shell"){
{
//TODO
}

View File

@@ -5,10 +5,10 @@ import io.anuke.mindustry.entities.bullet.BulletType;
import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.type.ContentList;
public abstract class BulletList implements ContentList {
public abstract class BulletList implements ContentList{
@Override
public Array<? extends Content> getAll() {
public Array<? extends Content> getAll(){
return BulletType.all();
}
}

View File

@@ -4,34 +4,34 @@ import io.anuke.mindustry.entities.bullet.BasicBulletType;
import io.anuke.mindustry.entities.bullet.BulletType;
import io.anuke.mindustry.type.ContentList;
public class FlakBullets extends BulletList implements ContentList {
public class FlakBullets extends BulletList implements ContentList{
public static BulletType lead, plastic, explosive, surge;
@Override
public void load() {
public void load(){
lead = new BasicBulletType(3f, 5, "bullet") {
lead = new BasicBulletType(3f, 5, "bullet"){
{
bulletWidth = 7f;
bulletHeight = 9f;
}
};
plastic = new BasicBulletType(3f, 5, "bullet") {
plastic = new BasicBulletType(3f, 5, "bullet"){
{
bulletWidth = 7f;
bulletHeight = 9f;
}
};
explosive = new BasicBulletType(3f, 5, "bullet") {
explosive = new BasicBulletType(3f, 5, "bullet"){
{
bulletWidth = 7f;
bulletHeight = 9f;
}
};
surge = new BasicBulletType(3f, 5, "bullet") {
surge = new BasicBulletType(3f, 5, "bullet"){
{
bulletWidth = 7f;
bulletHeight = 9f;

View File

@@ -6,13 +6,13 @@ import io.anuke.mindustry.entities.bullet.MissileBulletType;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.type.ContentList;
public class MissileBullets extends BulletList implements ContentList {
public class MissileBullets extends BulletList implements ContentList{
public static BulletType explosive, incindiary, surge, javelin;
@Override
public void load() {
public void load(){
explosive = new MissileBulletType(1.8f, 10, "missile") {
explosive = new MissileBulletType(1.8f, 10, "missile"){
{
bulletWidth = 8f;
bulletHeight = 8f;
@@ -26,7 +26,7 @@ public class MissileBullets extends BulletList implements ContentList {
}
};
incindiary = new MissileBulletType(2f, 12, "missile") {
incindiary = new MissileBulletType(2f, 12, "missile"){
{
frontColor = Palette.lightishOrange;
backColor = Palette.lightOrange;
@@ -44,14 +44,14 @@ public class MissileBullets extends BulletList implements ContentList {
}
};
surge = new MissileBulletType(3f, 5, "bullet") {
surge = new MissileBulletType(3f, 5, "bullet"){
{
bulletWidth = 7f;
bulletHeight = 9f;
}
};
javelin = new MissileBulletType(2.5f, 10, "missile") {
javelin = new MissileBulletType(2.5f, 10, "missile"){
{
bulletWidth = 8f;
bulletHeight = 8f;

View File

@@ -5,27 +5,27 @@ import io.anuke.mindustry.entities.bullet.BulletType;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.type.ContentList;
public class StandardBullets extends BulletList implements ContentList {
public class StandardBullets extends BulletList implements ContentList{
public static BulletType tungsten, lead, carbide, thorium, homing, tracer;
@Override
public void load() {
public void load(){
tungsten = new BasicBulletType(3.2f, 10, "bullet") {
tungsten = new BasicBulletType(3.2f, 10, "bullet"){
{
bulletWidth = 9f;
bulletHeight = 11f;
}
};
lead = new BasicBulletType(2.5f, 5, "bullet") {
lead = new BasicBulletType(2.5f, 5, "bullet"){
{
bulletWidth = 7f;
bulletHeight = 9f;
}
};
carbide = new BasicBulletType(3.5f, 18, "bullet") {
carbide = new BasicBulletType(3.5f, 18, "bullet"){
{
bulletWidth = 9f;
bulletHeight = 12f;
@@ -33,7 +33,7 @@ public class StandardBullets extends BulletList implements ContentList {
}
};
thorium = new BasicBulletType(4f, 29, "bullet") {
thorium = new BasicBulletType(4f, 29, "bullet"){
{
bulletWidth = 10f;
bulletHeight = 13f;
@@ -41,7 +41,7 @@ public class StandardBullets extends BulletList implements ContentList {
}
};
homing = new BasicBulletType(3f, 9, "bullet") {
homing = new BasicBulletType(3f, 9, "bullet"){
{
bulletWidth = 7f;
bulletHeight = 9f;
@@ -49,7 +49,7 @@ public class StandardBullets extends BulletList implements ContentList {
}
};
tracer = new BasicBulletType(3.2f, 11, "bullet") {
tracer = new BasicBulletType(3.2f, 11, "bullet"){
{
bulletWidth = 10f;
bulletHeight = 12f;

View File

@@ -29,13 +29,13 @@ import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.world;
public class TurretBullets extends BulletList implements ContentList {
public class TurretBullets extends BulletList implements ContentList{
public static BulletType fireball, basicFlame, lancerLaser, fuseShot, waterShot, cryoShot, lavaShot, oilShot, lightning, driverBolt;
@Override
public void load() {
public void load(){
fireball = new BulletType(1f, 4) {
fireball = new BulletType(1f, 4){
{
pierce = true;
hitTiles = false;
@@ -45,12 +45,12 @@ public class TurretBullets extends BulletList implements ContentList {
}
@Override
public void init(Bullet b) {
public void init(Bullet b){
b.getVelocity().setLength(0.6f + Mathf.random(2f));
}
@Override
public void draw(Bullet b) {
public void draw(Bullet b){
//TODO add color to the bullet depending on the color of the flame it came from
Draw.color(Palette.lightFlame, Palette.darkFlame, Color.GRAY, b.fin());
Fill.circle(b.x, b.y, 3f * b.fout());
@@ -58,25 +58,25 @@ public class TurretBullets extends BulletList implements ContentList {
}
@Override
public void update(Bullet b) {
if (Mathf.chance(0.04 * Timers.delta())) {
public void update(Bullet b){
if(Mathf.chance(0.04 * Timers.delta())){
Tile tile = world.tileWorld(b.x, b.y);
if (tile != null) {
if(tile != null){
Fire.create(tile);
}
}
if (Mathf.chance(0.1 * Timers.delta())) {
if(Mathf.chance(0.1 * Timers.delta())){
Effects.effect(EnvironmentFx.fireballsmoke, b.x, b.y);
}
if (Mathf.chance(0.1 * Timers.delta())) {
if(Mathf.chance(0.1 * Timers.delta())){
Effects.effect(EnvironmentFx.ballfire, b.x, b.y);
}
}
};
basicFlame = new BulletType(2f, 5) {
basicFlame = new BulletType(2f, 5){
{
hitsize = 7f;
lifetime = 30f;
@@ -88,11 +88,11 @@ public class TurretBullets extends BulletList implements ContentList {
}
@Override
public void draw(Bullet b) {
public void draw(Bullet b){
}
};
lancerLaser = new BulletType(0.001f, 110) {
lancerLaser = new BulletType(0.001f, 110){
Color[] colors = {Palette.lancerLaser.cpy().mul(1f, 1f, 1f, 0.4f), Palette.lancerLaser, Color.WHITE};
float[] tscales = {1f, 0.7f, 0.5f, 0.2f};
float[] lenscales = {1f, 1.1f, 1.13f, 1.14f};
@@ -107,19 +107,19 @@ public class TurretBullets extends BulletList implements ContentList {
}
@Override
public void init(Bullet b) {
public void init(Bullet b){
Damage.collideLine(b, b.getTeam(), hiteffect, b.x, b.y, b.angle(), length);
}
@Override
public void draw(Bullet b) {
public void draw(Bullet b){
float f = Mathf.curve(b.fin(), 0f, 0.2f);
float baseLen = length * f;
Lines.lineAngle(b.x, b.y, b.angle(), baseLen);
for (int s = 0; s < 3; s++) {
for(int s = 0; s < 3; s++){
Draw.color(colors[s]);
for (int i = 0; i < tscales.length; i++) {
for(int i = 0; i < tscales.length; i++){
Lines.stroke(7f * b.fout() * (s == 0 ? 1.5f : s == 1 ? 1f : 0.3f) * tscales[i]);
Lines.lineAngle(b.x, b.y, b.angle(), baseLen * lenscales[i]);
}
@@ -128,24 +128,24 @@ public class TurretBullets extends BulletList implements ContentList {
}
};
fuseShot = new BulletType(0.01f, 100) {
fuseShot = new BulletType(0.01f, 100){
//TODO
};
waterShot = new LiquidBulletType(Liquids.water) {
waterShot = new LiquidBulletType(Liquids.water){
{
status = StatusEffects.wet;
statusIntensity = 0.5f;
knockback = 0.65f;
}
};
cryoShot = new LiquidBulletType(Liquids.cryofluid) {
cryoShot = new LiquidBulletType(Liquids.cryofluid){
{
status = StatusEffects.freezing;
statusIntensity = 0.5f;
}
};
lavaShot = new LiquidBulletType(Liquids.lava) {
lavaShot = new LiquidBulletType(Liquids.lava){
{
damage = 4;
speed = 1.9f;
@@ -154,7 +154,7 @@ public class TurretBullets extends BulletList implements ContentList {
statusIntensity = 0.5f;
}
};
oilShot = new LiquidBulletType(Liquids.oil) {
oilShot = new LiquidBulletType(Liquids.oil){
{
speed = 2f;
drag = 0.03f;
@@ -162,7 +162,7 @@ public class TurretBullets extends BulletList implements ContentList {
statusIntensity = 0.5f;
}
};
lightning = new BulletType(0.001f, 10) {
lightning = new BulletType(0.001f, 10){
{
lifetime = 1;
despawneffect = Fx.none;
@@ -170,16 +170,16 @@ public class TurretBullets extends BulletList implements ContentList {
}
@Override
public void draw(Bullet b) {
public void draw(Bullet b){
}
@Override
public void init(Bullet b) {
public void init(Bullet b){
Lightning.create(b.getTeam(), hiteffect, Palette.lancerLaser, damage, b.x, b.y, b.angle(), 30);
}
};
driverBolt = new BulletType(5f, 20) {
driverBolt = new BulletType(5f, 20){
{
collidesTiles = false;
lifetime = 200f;
@@ -189,7 +189,7 @@ public class TurretBullets extends BulletList implements ContentList {
}
@Override
public void draw(Bullet b) {
public void draw(Bullet b){
Draw.color(Color.LIGHT_GRAY);
Fill.square(b.x, b.y, 3f, b.angle());
@@ -199,7 +199,7 @@ public class TurretBullets extends BulletList implements ContentList {
}
@Override
public void update(Bullet b) {
public void update(Bullet b){
//data MUST be an instance of DriverBulletData
if(!(b.getData() instanceof DriverBulletData)){
hit(b);
@@ -208,7 +208,7 @@ public class TurretBullets extends BulletList implements ContentList {
float hitDst = 7f;
DriverBulletData data = (DriverBulletData)b.getData();
DriverBulletData data = (DriverBulletData) b.getData();
//if the target is dead, just keep flying until the bullet explodes
if(data.to.isDead()){
@@ -245,15 +245,15 @@ public class TurretBullets extends BulletList implements ContentList {
}
@Override
public void despawned(Bullet b) {
public void despawned(Bullet b){
super.despawned(b);
if(!(b.getData() instanceof DriverBulletData)) return;
DriverBulletData data = (DriverBulletData)b.getData();
DriverBulletData data = (DriverBulletData) b.getData();
data.to.isRecieving = false;
for(int i = 0; i < data.items.length; i ++){
for(int i = 0; i < data.items.length; i++){
int amountDropped = Mathf.random(0, data.items[i]);
if(amountDropped > 0){
float angle = b.angle() + Mathf.range(100f);
@@ -264,7 +264,7 @@ public class TurretBullets extends BulletList implements ContentList {
}
@Override
public void hit(Bullet b, float hitx, float hity) {
public void hit(Bullet b, float hitx, float hity){
super.hit(b, hitx, hity);
despawned(b);
}

View File

@@ -16,12 +16,12 @@ import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.world;
public class WeaponBullets extends BulletList {
public class WeaponBullets extends BulletList{
public static BulletType tungstenShotgun, bombExplosive, bombIncendiary, bombOil, shellCarbide;
@Override
public void load() {
tungstenShotgun = new BasicBulletType(5f, 8, "bullet") {
public void load(){
tungstenShotgun = new BasicBulletType(5f, 8, "bullet"){
{
bulletWidth = 8f;
bulletHeight = 9f;
@@ -49,10 +49,10 @@ public class WeaponBullets extends BulletList {
}
@Override
public void hit(Bullet b, float x, float y) {
public void hit(Bullet b, float x, float y){
super.hit(b, x, y);
for (int i = 0; i < 3; i++) {
for(int i = 0; i < 3; i++){
float cx = x + Mathf.range(10f);
float cy = y + Mathf.range(10f);
Tile tile = world.tileWorld(cx, cy);
@@ -73,17 +73,17 @@ public class WeaponBullets extends BulletList {
}
@Override
public void hit(Bullet b, float x, float y) {
public void hit(Bullet b, float x, float y){
super.hit(b, x, y);
for (int i = 0; i < 3; i++) {
for(int i = 0; i < 3; i++){
Tile tile = world.tileWorld(x + Mathf.range(8f), y + Mathf.range(8f));
Puddle.deposit(tile, Liquids.oil, 5f);
}
}
};
shellCarbide = new BasicBulletType(3.4f, 20, "bullet") {
shellCarbide = new BasicBulletType(3.4f, 20, "bullet"){
{
bulletWidth = 10f;
bulletHeight = 12f;

View File

@@ -19,7 +19,7 @@ public class BlockFx extends FxList implements ContentList{
public static Effect reactorsmoke, nuclearsmoke, nuclearcloud, redgeneratespark, generatespark, fuelburn, plasticburn, pulverize, pulverizeRed, pulverizeRedder, pulverizeSmall, pulverizeMedium, producesmoke, smeltsmoke, formsmoke, blastsmoke, lava, dooropen, doorclose, dooropenlarge, doorcloselarge, purify, purifyoil, purifystone, generate, mine, mineBig, mineHuge, smelt, teleportActivate, teleport, teleportOut, ripple, bubble;
@Override
public void load() {
public void load(){
reactorsmoke = new Effect(17, e -> {
Angles.randLenVectors(e.id, 4, e.fin() * 8f, (x, y) -> {

View File

@@ -10,12 +10,12 @@ import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf;
public class BulletFx extends FxList implements ContentList {
public class BulletFx extends FxList implements ContentList{
public static Effect hitBulletSmall, hitBulletBig, hitFlameSmall, hitLiquid, hitLancer, despawn, flakExplosion, blastExplosion, plasticExplosion,
artilleryTrail, incendTrail, missileTrail;
@Override
public void load() {
public void load(){
hitBulletSmall = new Effect(14, e -> {
Draw.color(Color.WHITE, Palette.lightOrange, e.fin());

View File

@@ -10,11 +10,11 @@ import io.anuke.ucore.graphics.Fill;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf;
public class EnvironmentFx extends FxList implements ContentList {
public class EnvironmentFx extends FxList implements ContentList{
public static Effect burning, fire, smoke, steam, fireballsmoke, ballfire, freezing, melting, wet, oily;
@Override
public void load() {
public void load(){
burning = new Effect(35f, e -> {
Draw.color(Palette.lightFlame, Palette.darkFlame, e.fin());

View File

@@ -10,11 +10,11 @@ import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf;
public class ExplosionFx extends FxList implements ContentList {
public class ExplosionFx extends FxList implements ContentList{
public static Effect shockwave, bigShockwave, nuclearShockwave, explosion, blockExplosion, blockExplosionSmoke;
@Override
public void load() {
public void load(){
shockwave = new Effect(10f, 80f, e -> {
Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.fin());

View File

@@ -11,59 +11,59 @@ import io.anuke.ucore.util.Angles;
import static io.anuke.mindustry.Vars.tilesize;
public class Fx extends FxList implements ContentList {
public static Effect none, placeBlock, breakBlock, smoke, spawn, tapBlock, select;
public class Fx extends FxList implements ContentList{
public static Effect none, placeBlock, breakBlock, smoke, spawn, tapBlock, select;
@Override
public void load() {
@Override
public void load(){
none = new Effect(0, 0f, e -> {
});
none = new Effect(0, 0f, e -> {
});
placeBlock = new Effect(16, e -> {
Draw.color(Palette.accent);
Lines.stroke(3f - e.fin() * 2f);
Lines.square(e.x, e.y, tilesize / 2f * e.rotation + e.fin() * 3f);
Draw.reset();
});
placeBlock = new Effect(16, e -> {
Draw.color(Palette.accent);
Lines.stroke(3f - e.fin() * 2f);
Lines.square(e.x, e.y, tilesize / 2f * e.rotation + e.fin() * 3f);
Draw.reset();
});
tapBlock = new Effect(12, e -> {
Draw.color(Palette.accent);
Lines.stroke(3f - e.fin() * 2f);
Lines.circle(e.x, e.y, 4f + (tilesize/1.5f * e.rotation) * e.fin());
Draw.reset();
});
tapBlock = new Effect(12, e -> {
Draw.color(Palette.accent);
Lines.stroke(3f - e.fin() * 2f);
Lines.circle(e.x, e.y, 4f + (tilesize / 1.5f * e.rotation) * e.fin());
Draw.reset();
});
breakBlock = new Effect(12, e -> {
Draw.color(Palette.remove);
Lines.stroke(3f - e.fin() * 2f);
Lines.square(e.x, e.y, tilesize / 2f * e.rotation + e.fin() * 3f);
breakBlock = new Effect(12, e -> {
Draw.color(Palette.remove);
Lines.stroke(3f - e.fin() * 2f);
Lines.square(e.x, e.y, tilesize / 2f * e.rotation + e.fin() * 3f);
Angles.randLenVectors(e.id, 3 + (int) (e.rotation * 3), e.rotation * 2f + (tilesize * e.rotation) * e.finpow(), (x, y) -> {
Fill.square(e.x + x, e.y + y, 1f + e.fout() * (3f + e.rotation));
});
Draw.reset();
});
Angles.randLenVectors(e.id, 3 + (int) (e.rotation * 3), e.rotation * 2f + (tilesize * e.rotation) * e.finpow(), (x, y) -> {
Fill.square(e.x + x, e.y + y, 1f + e.fout() * (3f + e.rotation));
});
Draw.reset();
});
select = new Effect(23, e -> {
Draw.color(Palette.accent);
Lines.stroke(e.fout() * 3f);
Lines.circle(e.x, e.y, 3f + e.fin() * 14f);
Draw.reset();
});
select = new Effect(23, e -> {
Draw.color(Palette.accent);
Lines.stroke(e.fout() * 3f);
Lines.circle(e.x, e.y, 3f + e.fin() * 14f);
Draw.reset();
});
smoke = new Effect(100, e -> {
Draw.color(Color.GRAY, Palette.darkishGray, e.fin());
float size = 7f - e.fin() * 7f;
Draw.rect("circle", e.x, e.y, size, size);
Draw.reset();
});
smoke = new Effect(100, e -> {
Draw.color(Color.GRAY, Palette.darkishGray, e.fin());
float size = 7f - e.fin() * 7f;
Draw.rect("circle", e.x, e.y, size, size);
Draw.reset();
});
spawn = new Effect(23, e -> {
Lines.stroke(2f * e.fout());
Draw.color(Palette.accent);
Lines.poly(e.x, e.y, 4, 3f + e.fin() * 8f);
Draw.reset();
});
}
spawn = new Effect(23, e -> {
Lines.stroke(2f * e.fout());
Draw.color(Palette.accent);
Lines.poly(e.x, e.y, 4, 3f + e.fin() * 8f);
Draw.reset();
});
}
}

View File

@@ -7,7 +7,7 @@ import io.anuke.mindustry.type.ContentList;
public abstract class FxList implements ContentList{
@Override
public Array<? extends Content> getAll() {
public Array<? extends Content> getAll(){
return Array.with();
}
}

View File

@@ -12,11 +12,11 @@ import io.anuke.ucore.graphics.Shapes;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf;
public class ShootFx extends FxList implements ContentList {
public class ShootFx extends FxList implements ContentList{
public static Effect shootSmall, shootSmallSmoke, shootBig, shootBig2, shootBigSmoke, shootBigSmoke2, shootSmallFlame, shootLiquid, shellEjectSmall, shellEjectMedium, shellEjectBig, lancerLaserShoot, lancerLaserShootSmoke, lancerLaserCharge, lancerLaserChargeBegin, lightningCharge, lightningShoot;
@Override
public void load() {
public void load(){
shootSmall = new Effect(8, e -> {
Draw.color(Palette.lighterOrange, Palette.lightOrange, e.fin());
@@ -111,7 +111,7 @@ public class ShootFx extends FxList implements ContentList {
shellEjectMedium = new GroundEffect(34f, 400f, e -> {
Draw.color(Palette.lightOrange, Color.LIGHT_GRAY, Palette.lightishGray, e.fin());
float rot = e.rotation + 90f;
for (int i : Mathf.signs) {
for(int i : Mathf.signs){
float len = (2f + e.finpow() * 10f) * i;
float lr = rot + e.fin() * 20f * i;
Draw.rect("casing",
@@ -122,7 +122,7 @@ public class ShootFx extends FxList implements ContentList {
Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin());
for (int i : Mathf.signs) {
for(int i : Mathf.signs){
Angles.randLenVectors(e.id, 4, 1f + e.finpow() * 11f, e.rotation + 90f * i, 20f, (x, y) -> {
Fill.circle(e.x + x, e.y + y, e.fout() * 1.5f);
});
@@ -134,7 +134,7 @@ public class ShootFx extends FxList implements ContentList {
shellEjectBig = new GroundEffect(22f, 400f, e -> {
Draw.color(Palette.lightOrange, Color.LIGHT_GRAY, Palette.lightishGray, e.fin());
float rot = e.rotation + 90f;
for (int i : Mathf.signs) {
for(int i : Mathf.signs){
float len = (4f + e.finpow() * 8f) * i;
float lr = rot + Mathf.randomSeedRange(e.id + i + 6, 20f * e.fin()) * i;
Draw.rect("casing",
@@ -146,7 +146,7 @@ public class ShootFx extends FxList implements ContentList {
Draw.color(Color.LIGHT_GRAY);
for (int i : Mathf.signs) {
for(int i : Mathf.signs){
Angles.randLenVectors(e.id, 4, -e.finpow() * 15f, e.rotation + 90f * i, 25f, (x, y) -> {
Fill.circle(e.x + x, e.y + y, e.fout() * 2f);
});
@@ -158,7 +158,7 @@ public class ShootFx extends FxList implements ContentList {
lancerLaserShoot = new Effect(21f, e -> {
Draw.color(Palette.lancerLaser);
for (int i : Mathf.signs) {
for(int i : Mathf.signs){
Shapes.tri(e.x, e.y, 4f * e.fout(), 29f, e.rotation + 90f * i);
}

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