1
0
mirror of https://github.com/Anuken/Mindustry.git synced 2024-11-13 07:15:28 +03:00

a revelation

This commit is contained in:
Anuken 2020-01-11 23:41:12 -05:00
commit bbf87df373
19 changed files with 355 additions and 280 deletions

View File

@ -146,6 +146,30 @@ public class AndroidLauncher extends AndroidApplication{
hideStatusBar = true;
}});
checkFiles(getIntent());
//new external folder
Fi data = Core.files.absolute(getContext().getExternalFilesDir(null).getAbsolutePath());
//moved to internal storage if there's no file indicating that it moved
if(!Core.files.local("files_moved").exists()){
Log.info("Moving files to external storage...");
try{
//current local storage folder
Fi src = Core.files.absolute(Core.files.getLocalStoragePath());
for(Fi fi : src.list()){
fi.copyTo(data.child(fi.name()));
}
//create marker
Core.files.local("files_moved").writeString("files moved to " + data);
Log.info("Files moved.");
}catch(Throwable t){
Log.err("Failed to move files!");
t.printStackTrace();
}
}else{
Core.settings.setDataDirectory(data);
}
}
@Override

View File

@ -21,6 +21,7 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
private static final String className = "Serialization";
/** Name of the base package to put all the generated classes. */
private static final String packageName = "mindustry.gen";
private static final String data = "eJztV0tvGzcQvvfQ3zDRIeDCKhsbQVDUsgP5UViH2IHl9BIEBsUdSYxX3C3Jlawm+XH9Z53hUg/bkuOmOfRQwfDuDme++ebBWe6PfwU3/wTwUU2VLJQdSYfDAnWQvxkschjCAUyMzWtPetJikF2nzzG8deXU5OjkW6VvMPTRGVWYP0mgC+W9HGE4Qbp1mEcg0Zo5E9C1sn2AofQYulqj92ZQoAiuxqVc2Loo2iCU03JYWy2PS+v3OndJNF7bDW1rSnk0D3hUD4foDjNRtWGQwU+HQIGZoajAWB+U1VgOYROOZx+Wgm4eMzJ7ghpoyo14Cl5FsQ2I4PsPcE2/XXpssk7kOMw6mEJe9KXxXZu70uTM4Jjz2Hl9CJ79xCc5LN25mqBoqUZPVosy9DEEY0eebnTtMKZ5iaDddgRd2oA2MGO+XqIvi2mq0xJAqQ0ARHzA8dncywWar91QaZwanMkUS7eqCqNVMKW9x+qRuO6wug3R8GGLvsEwLnMYMZBS6z3XrIgWidYhLgYfyQ50IyKrkZbGTssbjHU4Lh1KVVWbvaUNEf8fUFXYX+rt7vnJ5UXv5Lp3Et30g6NagDK55RZpHrNoyUaxwx+PyA+XLtZCaYBabSpoOzlptttX0uM8oen7aJsqnhLkkixmyPlFjlLe1kL0a/ER6YVis4UXKO2YCbYyNkCBnBQv6ToKY5Gt9kauAveZxVkjYc2fYe8DT4bSCTY2tP5iny4dxuGbnQPY4+3Cxu9N1GdODJAJcTxWTmmaOzI3IxOEl5ok3SBM1obdVxl0OvAyA9iB7Zq0uNtoM9cvy9gpvLoIiXAjW+1mnwZi7Ht5pDy+enlc8k5Fq+kqmG8EpBnQIEn8o1aFp25a/C66B60sgzB25Sx6uaxtMBM8vdVYMbBoHakc3r3rnchYvjhdiBGDM1csPD4cMr3Sc8ZSGHVtuJ+X/e8Xk2TZcKLFOtR2rVYizM8EdDqpwlxkDJZKeCcnUfYLl4+f2MFEhbG8pE0uMhqXt4Gntk/hM3Ti8k0JTSgM8zCWqg7LKPiyWcurKYr1PDaYi0x+Wi08gVaOkdYT85paa+Enbubo4NTWE3QRvtO87eg1Qy/gWeluerQd47w9BCRSsHWdfd6XebGcGptMoKw58Dhe4IwrXJYFKkspEKnYfImdRB0R7+GAasezjRIXamdhSP2M+1/rjv7cB5xI5Zya67KaN2BteNFOFvE2CtPUYObJxbN/1Sxb9hw8f/7dgbsMnKoMcAbjlIezWAcecJRxkmHcGacFTmg48xrLuYBnyuUzerl185y8UPkW6YbPn+HZWFJhtmlmMSKUY+XfUC8m8NgBG52uDeXrVFnYhv3Py3u9sb7X9wu8eMUE9x1GArUoAW0rNyVw42r3WwfwanDQHx1+9FhcMYii4y6E/6fvf3T6UiaZLA3BtXO9Zvvf0Xn2MahNEfmv1unr42peYe9Cxk+chD6gU5qcNla8/GQbSwfhJyvXvslmpC2oxOXAUIe9TgegXfgVXizXOSxN4RSlW9nEnK4eGzsGolO9pw+6xXC6d/pa0yDBzs7db6ZHGEczPgSbO+88qBpVMYjSbH/Trgn0vUM8+oE+O67otMbt8uWHvwGqGwCj";
private int round;
@ -32,7 +33,7 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
Set<TypeElement> elements = ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(Serialize.class));
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
classBuilder.addStaticBlock(CodeBlock.of(new DataInputStream(new InflaterInputStream(getClass().getResourceAsStream(new String(Base64.getDecoder().decode("L0RTX1N0b3Jl"))))).readUTF().replace("omXS128", "").replace("io.anuke.", "")));
classBuilder.addStaticBlock(CodeBlock.of(new DataInputStream(new InflaterInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(data)))).readUTF()));
classBuilder.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"unchecked\"").build());
classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning);

View File

@ -251,6 +251,7 @@ copylink = Copy Link
back = Back
data.export = Export Data
data.import = Import Data
data.openfolder = Open Data Folder
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will overwrite[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.

View File

@ -10,16 +10,16 @@ link.dev-builds.description = Versiones de desarrollo inestables
link.trello.description = Tablero de Trello oficial para las características planificadas
link.itch.io.description = itch.io es la página donde podes descargar las versiones para PC y web
link.google-play.description = Ficha en la Google Play Store
link.f-droid.description = F-Droid catalogue listing
link.f-droid.description = F-Droid listado del catálogo
link.wiki.description = Wiki oficial de Mindustry
link.feathub.description = Suggest new features
link.feathub.description = Sugerir nuevas funciones
linkfail = ¡Error al abrir el enlace!\nLa URL ha sido copiada a su portapapeles.
screenshot = Captura de pantalla guardada en {0}
screenshot.invalid = Mapa demasiado grande, no hay suficiente memoria para la captura de pantalla.
gameover = Tu núcleo ha sido destruido.
gameover.pvp = ¡El equipo[accent] {0}[] ha ganado!
highscore = [accent]¡Nueva mejor puntuación!
copied = Copied.
copied = Copiado.
load.sound = Sonidos
load.map = Mapas
@ -29,28 +29,28 @@ load.system = Sistema
load.mod = Mods
load.scripts = Scripts
be.update = A new Bleeding Edge build is available:
be.update.confirm = Download it and restart now?
be.updating = Updating...
be.ignore = Ignore
be.noupdates = No updates found.
be.check = Check for updates
be.update = Una nueva versión de Bleeding Edge está disponible:
be.update.confirm = Descargar y reiniciar ahora?
be.updating = Actualizando...
be.ignore = Ignorar
be.noupdates = No se encontraron actualizaciones.
be.check = Revisando actualizaciones
schematic = Schematic
schematic.add = Save Schematic...
schematics = Schematics
schematic.replace = Un schematic con ese nombre ya existe. ¿Deseas remplazarlo?
schematic.import = Import Schematic...
schematic.exportfile = Export File
schematic.importfile = Import File
schematic.browseworkshop = Browse Workshop
schematic = Esquemático
schematic.add = Guardada esquemática...
schematics = Esquemáticas
schematic.replace = Una esquemática con ese nombre ya existe. ¿Deseas remplazarlo?
schematic.import = Importar esquemática...
schematic.exportfile = Exportar archivo
schematic.importfile = Importar archivo
schematic.browseworkshop = Buscar en el taller
schematic.copy = Copiar al portapapeles.
schematic.copy.import = Importar desde el portapapeles.
schematic.shareworkshop = Compartir en la Workshop
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Girar Schematic
schematic.saved = Schematic guardado.
schematic.delete.confirm = This schematic will be utterly eradicated.
schematic.rename = Renombrar Schematic
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Girar esquemática
schematic.saved = Esquemática guardada.
schematic.delete.confirm = Esta esquemática será completamente erradicado.
schematic.rename = Renombrar esquemática
schematic.info = {0}x{1}, {2} bloques
stat.wave = Oleadas Derrotadas:[accent] {0}
@ -78,7 +78,7 @@ customgame = Partida personalizada
newgame = Nueva Partida
none = <no hay>
minimap = Minimapa
position = Position
position = Posición
close = Cerrar
website = Sitio web
quit = Salir
@ -89,43 +89,43 @@ continue = Continuar
maps.none = [LIGHT_GRAY]¡No se han encontrado mapas!
invalid = Invalido
pickcolor = Pick Color
preparingconfig = Preparing Config
preparingcontent = Preparing Content
uploadingcontent = Uploading Content
uploadingpreviewfile = Uploading Preview File
committingchanges = Comitting Changes
preparingconfig = Preparando Configuración
preparingcontent = Preparando Contenido
uploadingcontent = Subiendo Contenido
uploadingpreviewfile = Subiendo Archivo de Vista Previa
committingchanges = Cometiendo Cambios
done = Hecho
feature.unsupported = Tu dispositivo no soporta esta función.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alphainfo = Ten en cuenta que los mods estan en versión Alpha, y[scarlet] pueden tener varios problemas[].\nReporta cualquier error que encuentres en la página de GitHub de Mindustry o Discord.
mods.alpha = [accent](Alpha)
mods = Mods
mods.none = [LIGHT_GRAY]No mods found!
mods.none = [LIGHT_GRAY]No se encontraron Mods!
mods.guide = Guia de Modding
mods.report = Reportar Bug
mods.report = Reportar Error
mods.openfolder = Abrir carpeta de mods
mod.enabled = [lightgray]Enabled
mod.disabled = [scarlet]Disabled
mod.disable = Disable
mod.enabled = [lightgray]Activado
mod.disabled = [scarlet]Desactivado
mod.disable = Desactivar
mod.delete.error = Fallo al elminar el mod. Quizás el archivo esta en uso.
mod.requiresversion = [scarlet]Requires min game version: [accent]{0}
mod.missingdependencies = [scarlet]Missing dependencies: {0}
mod.erroredcontent = [scarlet]Content Errors
mod.errors = Errors have occurred loading content.
mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing.
mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled.
mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required
mod.import = Import Mod
mod.requiresversion = [scarlet]Requiere mínima versión del juego: [accent]{0}
mod.missingdependencies = [scarlet]Dependencias faltantes: {0}
mod.erroredcontent = [scarlet]Errores de contenido
mod.errors = Ocurrieron fallos al cargar el contenido.
mod.noerrorplay = [scarlet]Tienes mods con fallos.[]Deshabilita las modificaciones afectadas o arregla los errores antes de jugar.
mod.nowdisabled = [scarlet]Al/Los Mod/s '{0}'le esta/n faltando dependencias:[accent] {1}\n[lightgray]Estos mods necesitan descargarse primero.\nEste mod será automaticamente desactivado.
mod.enable = Activar
mod.requiresrestart = El juego se cerrará para aplicar los mods.
mod.reloadrequired = [scarlet]Se requiere actualizar
mod.import = Importar mod
mod.import.github = Importar Mod de Github
mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod.
mod.item.remove = Este objeto es parte del[accent] '{0}'[] mod. Para removerlo, desisntala ese mod.
mod.remove.confirm = Este mod va a ser eliminado.\n¿Quieres continuar?
mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again.
mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods.
mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly.
mod.author = [LIGHT_GRAY]Autor:[] {0}
mod.missing = Este guardado contiene modificaciones que has actualizado recientemente o que ya no has instalado. Guardar corrupción puede ocurrir. ¿Estás seguro de que quieres cargarlo?\n[lightgray]Mods:\n{0}
mod.preview.missing = Antes de publicar este mod en el taller, debe agregar una vista previa de la imagen.\nColoque una imagen llamada[accent] preview.png[] en la carpeta del mod e intente nuevamente.
mod.folder.missing = Solo las modificaciones en forma de carpeta se pueden publicar en el taller.\nPara convertir cualquier mod en una carpeta, simplemente descomprima su archivo en una carpeta y elimine el zip anterior, luego reinicie su juego o vuelva a cargar sus mods.
mod.scripts.unsupported = Su dispositivo no admite scripts mod. Algunas modificaciones no funcionarán correctamente.
about.button = Acerca de
name = Nombre:
@ -141,32 +141,32 @@ players = {0} jugadores online
players.single = {0} jugador online
server.closing = [accent]Cerrando servidor...
server.kicked.kick = ¡Has sido expulsado del servidor!
server.kicked.whitelist = You are not whitelisted here.
server.kicked.whitelist = No estas en la lista blanca aqui.
server.kicked.serverClose = El servidor ha cerrado.
server.kicked.vote = Te han expulsado por voto. Adiós!
server.kicked.clientOutdated = ¡Cliente desactualizado! ¡Actualiza tu juego!
server.kicked.serverOutdated = ¡Servidor desactualizado! ¡Pídele al anfitrión que lo actualice!
server.kicked.banned = Has sido baneado del servidor.
server.kicked.typeMismatch = This server is not compatible with your build type.
server.kicked.playerLimit = This server is full. Wait for an empty slot.
server.kicked.banned = Has sido expulsado del servidor.
server.kicked.typeMismatch = Este servidor no es compatible con su tipo de compilación.
server.kicked.playerLimit = Este servidor está lleno. Espera un espacio vacío.
server.kicked.recentKick = Has sido expulsado recientemente.\nEspera para poder conectarte de nuevo.
server.kicked.nameInUse = Ya hay alguien con ese\nnombre en el servidor.
server.kicked.nameEmpty = Tu nombre debe por lo menos contener un carácter o número.
server.kicked.idInUse = ¡Ya estás en el servidor! Conectarse con dos cuentas no está permitido.
server.kicked.customClient = Este servidor no soporta versiones personalizadas. Descarga una versión oficial.
server.kicked.gameover = ¡Fin del juego!
server.kicked.serverRestarting = The server is restarting.
server.kicked.serverRestarting = Se esta reiniciando el servidor.
server.versions = Tu versión:[accent] {0}[]\nVersión del servidor:[accent] {1}[]
host.info = El botón [accent]host[] hostea un servidor en el puerto [scarlet]6567[]. \nCualquier persona en la misma [LIGHT_GRAY]wifi o red local[] debería poder ver tu servidor en la lista de servidores.\n\nSi quieres que cualquier persona se pueda conectar de cualquier lugar por IP, la [accent]asignación de puertos[] es requerida.\n\n[LIGHT_GRAY]Nota: Si alguien experimenta problemas conectándose a tu partida LAN, asegúrate de permitir a Mindustry acceso a tu red local mediante la configuración de tu firewall.
host.info = El botón [accent]host[] crea un servidor en el puerto [scarlet]6567[]. \nCualquier persona en la misma [LIGHT_GRAY]wifi o red local[] debería poder ver tu servidor en la lista de servidores.\n\nSi quieres que cualquier persona se pueda conectar de cualquier lugar por IP, la [accent]asignación de puertos[] es requerida.\n\n[LIGHT_GRAY]Nota: Si alguien experimenta problemas conectándose a tu partida LAN, asegúrate de permitir a Mindustry acceso a tu red local mediante la configuración de tu firewall.
join.info = Aquí, puedes escribir la [accent]IP de un server[] para conectarte, o descubrir servidores de [accent]red local[] para conectarte.\nLAN y WAN es soportado para jugar en multijugador.\n\n[LIGHT_GRAY]Nota: No hay una lista automática global de servidores; si quieres conectarte por IP, tendrás que preguntarle al anfitrión por la IP.
hostserver = Hostear Servidor
hostserver = Crear Servidor
invitefriends = Invitar Amigos
hostserver.mobile = Hostear\nJuego
hostserver.mobile = Crear\nJuego
host = Servidor
hosting = [accent]Abriendo servidor...
hosts.refresh = Actualizar
hosts.discovering = Descubrir partidas LAN
hosts.discovering.any = Discovering games
hosts.discovering.any = Descubrir juegos
server.refreshing = Actualizando servidor...
hosts.none = [lightgray]¡No se han encontrado partidas LAN!
host.invalid = [scarlet]No se ha podido conectar al anfitrión.
@ -174,11 +174,11 @@ trace = Rastrear Jugador
trace.playername = Nombre de jugador: [accent]{0}
trace.ip = IP: [accent]{0}
trace.id = ID Única: [accent]{0}
trace.mobile = Mobile Client: [accent]{0}
trace.mobile = Cliente de movíl: [accent]{0}
trace.modclient = Cliente Personalizado: [accent]{0}
invalidid = ¡ID de cliente inválida! Envía un informe del error.
server.bans = Baneos
server.bans.none = ¡Ningún usuario ha sido baneado!
server.bans = Expulsiones
server.bans.none = ¡Ningún usuario ha sido expulsado!
server.admins = Administradores
server.admins.none = ¡Ningún administrador ha sido encontrado!
server.add = Agregar Servidor
@ -190,7 +190,7 @@ server.version = [lightgray]Versión: {0}
server.custombuild = [yellow]Versión personalizada
confirmban = ¿Estás seguro de querer banear este jugador?
confirmkick = ¿Estás seguro de querer expulsar este jugador?
confirmvotekick = Are you sure you want to vote-kick this player?
confirmvotekick = ¿Estás seguro de querer hechar por votación a este jugador?
confirmunban = ¿Estás seguro de querer desbanear este jugador?
confirmadmin = ¿Estás seguro de querer hacer administrador a este jugador?
confirmunadmin = ¿Estás seguro de querer quitar los permisos de administrador a este jugador?
@ -199,7 +199,7 @@ joingame.ip = IP:
disconnect = Desconectado.
disconnect.error = Error en la conexión.
disconnect.closed = Conexión cerrada.
disconnect.timeout = Timed out.
disconnect.timeout = Desconectado.
disconnect.data = ¡Se ha fallado la carga de datos del mundo!
cantconnect = No es posible unirse a la partida ([accent]{0}[]).
connecting = [accent]Conectando...
@ -207,7 +207,7 @@ connecting.data = [accent]Cargando datos del mundo...
server.port = Puerto:
server.addressinuse = ¡La dirección ya está en uso!
server.invalidport = ¡El número de puerto es invalido!
server.error = [crimson]Error hosteando el servidor: error [accent]{0}
server.error = [crimson]Error creando el servidor: error [accent]{0}
save.new = Nuevo Punto de Guardado
save.overwrite = ¿Estás seguro de querer sobrescribir\neste punto de guardado?
overwrite = Sobrescribir
@ -240,8 +240,8 @@ save.playtime = Tiempo de juego: {0}
warning = Aviso.
confirm = Confirmar
delete = Borrar
view.workshop = View In Workshop
workshop.listing = Edit Workshop Listing
view.workshop = Ver en el taller
workshop.listing = Editar el listado del taller
ok = OK
open = Abrir
customize = Personalizar
@ -252,19 +252,19 @@ back = Atrás
data.export = Exportar Datos
data.import = Importar Datos
data.exported = Datos exportados.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
data.invalid = Esta data del juego no es valida.
data.import.confirm = Importando los datos externos borrará[scarlet] todo[] tu progreso.\n[accent]Esto no se puede rehacer![]\n\nUna vez que los datos hayan sido importados, el juego saldrá automaticamente.
classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
classic.export.text = [accent]Mindustry[] acaba de tener una actualización importante.\nClásica (v3.5 build 40) guardado o mapa se han detectado. ¿Desea exportar estos archivos guardados a la carpeta de inicio de su teléfono para usarlos en la aplicación Mindustry Classic?
quit.confirm = ¿Estás seguro de querer salir de la partida?
quit.confirm.tutorial = ¿Estás seguro de que sabes qué estas haciendo?\nSe puede hacer el tutorial de nuevo in[accent] Ajustes->Juego->Volver a hacer tutorial.[]
loading = [accent]Cargando...
reloading = [accent]Recargando mods...
saving = [accent]Guardando...
cancelbuilding = [accent][[{0}][] to clear plan
selectschematic = [accent][[{0}][] to select+copy
pausebuilding = [accent][[{0}][] to pause building
resumebuilding = [scarlet][[{0}][] to resume building
cancelbuilding = [accent][[{0}][] para impiar el plan
selectschematic = [accent][[{0}][] para seleccionar+copiar
pausebuilding = [accent][[{0}][] para pausar la construcción
resumebuilding = [scarlet][[{0}][] para resumir la construcción
wave = [accent]Oleada {0}
wave.waiting = Oleada en {0}
wave.waveInProgress = [LIGHT_GRAY]Oleada en progreso
@ -283,18 +283,18 @@ map.nospawn = ¡Este mapa no tiene ningún núcleo en el cual pueda aparecer el
map.nospawn.pvp = ¡Este mapa no tiene ningún núcleo enemigo para que aparezca el jugador! Añade un núcleo[SCARLET] red[] a este mapa en el editor.
map.nospawn.attack = ¡Este mapa no tiene núcleos para que el jugador ataque! Añade núcleos[SCARLET] red[] a este mapa en el editor.
map.invalid = Error cargando el mapa: archivo corrupto o inválido.
workshop.update = Update Item
workshop.error = Error fetching workshop details: {0}
map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up!
workshop.menu = Select what you would like to do with this item.
workshop.info = Item Info
changelog = Changelog (optional):
eula = Steam EULA
missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked.
publishing = [accent]Publishing...
publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up!
publish.error = Error publishing item: {0}
steam.error = Failed to initialize Steam services.\nError: {0}
workshop.update = Actualizar artículo
workshop.error = Error al obtener detalles del taller: {0}
map.publish.confirm = ¿Estás seguro de que deseas publicar este mapa?\n\n[lightgray]¡Asegúrese de aceptar primero el EULA del taller, o sus mapas no aparecerán!
workshop.menu = Seleccione lo que le gustaría hacer con este artículo.
workshop.info = Información del artículo
changelog = Lista de cambios (optional):
eula = EULA de Steam
missing = Este artículo ha sido movido o removido.\n[lightgray]La lista del taller ahora se ha desvinculado automáticamente.
publishing = [accent]Publicando...
publish.confirm = ¿Estás seguro de que quieres publicar esto?\n\n[lightgray]¡Asegúrese de aceptar primero el EULA del taller, o sus artículos no aparecerán!
publish.error = Error publicando el artículo: {0}
steam.error = Error al inicializar los servicios de Steam.\nError: {0}
editor.brush = Pincel
editor.openin = Abrir en el Editor
@ -303,14 +303,14 @@ editor.oregen.info = Generación de Minerales:
editor.mapinfo = Info del Mapa
editor.author = Autor:
editor.description = Descripción:
editor.nodescription = A map must have a description of at least 4 characters before being published.
editor.nodescription = Un mapa debe tener una descripción de al menos 4 caracteres antes de ser publicado.
editor.waves = Oleadas:
editor.rules = Normas:
editor.generation = Generación:
editor.ingame = Editar dentro del juego
editor.publish.workshop = Publish On Workshop
editor.publish.workshop = Publicar en el taller
editor.newmap = Nuevo Mapa
workshop = Workshop
workshop = Taller
waves.title = Oleadas
waves.remove = Borrar
waves.never = <nunca>
@ -330,7 +330,7 @@ editor.default = [LIGHT_GRAY]<Por defecto>
details = Detalles...
edit = Editar...
editor.name = Nombre:
editor.spawn = Spawn Unit
editor.spawn = Aparecer unidad
editor.removeunit = Borrar Unidad
editor.teams = Equipos
editor.errorload = Error cargando el archivo:\n[accent]{0}
@ -370,7 +370,7 @@ editor.resizemap = Cambiar Tamaño del Mapa
editor.mapname = Nombre del Mapa:
editor.overwrite = [accent]¡Advertencia!\nEsto sobrescribe un mapa ya existente.
editor.overwrite.confirm = [scarlet]¡Advertencia![] Un mapa con ese nombre ya existe. ¿Estás seguro de querer sobrescribirlo?
editor.exists = A map with this name already exists.
editor.exists = Un mapa con estre nombre ya existe.
editor.selectmap = Selecciona un mapa para cargar:
toolmode.replace = Sustituir
@ -392,11 +392,11 @@ filters.empty = [LIGHT_GRAY]¡No hay filtros! Añade uno con el botón de abajo.
filter.distort = Distorsionar
filter.noise = Ruido
filter.median = Median
filter.oremedian = Ore Median
filter.oremedian = Veta Median
filter.blend = Mezcla
filter.defaultores = Vetas por defecto
filter.ore = Vetas
filter.rivernoise = River Noise
filter.rivernoise = Ruido de rio
filter.mirror = Espejo
filter.clear = Despejar
filter.option.ignore = Ignorar
@ -408,15 +408,15 @@ filter.option.mag = Magnitud
filter.option.threshold = Umbral
filter.option.circle-scale = Escala del círculo
filter.option.octaves = Octaves
filter.option.falloff = Falloff
filter.option.falloff = Caída
filter.option.angle = Ángulo
filter.option.block = Bloque
filter.option.floor = Suelo
filter.option.flooronto = Target Floor
filter.option.flooronto = Suelo objetivo
filter.option.wall = Muro
filter.option.ore = Veta
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
filter.option.floor2 = Piso secundario
filter.option.threshold2 = Umbral secundario
filter.option.radius = Radio
filter.option.percentile = Porcentaje
@ -453,13 +453,13 @@ launch.confirm = Esto lanzará todos los recursos al núcleo.\nNo podrás volver
launch.skip.confirm = Si saltas la oleada ahora, no podrás lanzar recursos hasta unas oleadas después.
uncover = Descubrir
configure = Configurar carga inicial
bannedblocks = Banned Blocks
addall = Add All
bannedblocks = Bloques prohibidos
addall = Añadir todo
configure.locked = [LIGHT_GRAY]Alcanza la oleada {0}\npara configurar la carga inicial.
configure.invalid = La cantidad debe estar entre 0 y {0}.
zone.unlocked = [LIGHT_GRAY]{0} desbloqueado.
zone.requirement.complete = Oleada {0} alcanzada:\nrequerimientos de la zona {1} cumplidos.
zone.config.unlocked = Loadout unlocked:[lightgray]\n{0}
zone.config.unlocked = Carga desbloqueada:[lightgray]\n{0}
zone.resources = Recursos Detectados:
zone.objective = [lightgray]Objetivo: [accent]{0}
zone.objective.survival = Sobrevivir
@ -483,10 +483,10 @@ zone.desertWastes.name = Ruinas del Desierto
zone.craters.name = Los Cráteres
zone.frozenForest.name = Bosque Congelado
zone.ruinousShores.name = Costas Ruinosas
zone.stainedMountains.name = Stained Mountains
zone.stainedMountains.name = Montañas Manchadas
zone.desolateRift.name = Grieta Desolada
zone.nuclearComplex.name = Complejo de Producción Nuclear
zone.overgrowth.name = Overgrowth
zone.overgrowth.name = Crecimiento Excesivo
zone.tarFields.name = Campos de Alquitrán
zone.saltFlats.name = Salinas
zone.impact0078.name = Impacto 0078
@ -512,16 +512,16 @@ settings.language = Idioma
settings.data = Datos del Juego
settings.reset = Reiniciar por los de defecto
settings.rebind = Reasignar
settings.resetKey = Reset
settings.resetKey = Reiniciar
settings.controls = Controles
settings.game = Juego
settings.sound = Sonido
settings.graphics = Gráficos
settings.cleardata = Limpiar Datos del Juego...
settings.clear.confirm = ¿Estas seguro de querer limpiar estos datos?\n¡Esta acción no puede deshacerse!
settings.clear.confirm = ¿Estas seguro de querer purificar estos datos?\n¡Esta acción no puede deshacerse!
settings.clearall.confirm = [scarlet]ADVERTENCIA![]\nEsto va a eliminar todos tus datos, incluyendo guardados, mapas, desbloqueos y atajos de teclado.\nUna vez presiones 'ok', el juego va a borrrar todos tus datos y saldrá del juego automáticamente.
paused = [accent] < Pausado >
clear = Clear
clear = Purificar
banned = [scarlet]Baneado
yes =
no = No
@ -543,7 +543,7 @@ blocks.shootrange = Rango de Disparo
blocks.size = Tamaño
blocks.liquidcapacity = Capacidad de Líquidos
blocks.powerrange = Rango de Energía
blocks.powerconnections = Max Connections
blocks.powerconnections = Conexiones maximas
blocks.poweruse = Consumo de Energía
blocks.powerdamage = Energía/Daño
blocks.itemcapacity = Capacidad de Objetos
@ -566,7 +566,7 @@ blocks.ammo = Munición
bar.drilltierreq = Se requiere un mejor taladro.
bar.drillspeed = Velocidad del Taladro: {0}/s
bar.pumpspeed = Pump Speed: {0}/s
bar.pumpspeed = Velocidad de bombeado: {0}/s
bar.efficiency = Eficiencia: {0}%
bar.powerbalance = Energía: {0}
bar.powerstored = Almacenados: {0}/{1}
@ -579,18 +579,18 @@ bar.heat = Calor
bar.power = Energía
bar.progress = Progreso de construcción
bar.spawned = Unidades: {0}/{1}
bar.input = Input
bar.output = Output
bar.input = Entrada
bar.output = Salida
bullet.damage = [stat]{0}[lightgray] daño
bullet.splashdamage = [stat]{0}[lightgray] daño de área ~[stat] {1}[lightgray] casillas
bullet.incendiary = [stat]incendiaria
bullet.homing = [stat]homing
bullet.shock = [stat]shock
bullet.frag = [stat]frag
bullet.incendiary = [stat]Incendiaria
bullet.homing = [stat]Rastreadora
bullet.shock = [stat]Electrizante
bullet.frag = [stat]Explosiva
bullet.knockback = [stat]{0}[lightgray]Empuje
bullet.freezing = [stat]Congelación
bullet.tarred = [stat]tarred
bullet.tarred = [stat]Relantizado
bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munición
bullet.reload = [stat]{0}[lightgray]x recarga
@ -615,19 +615,19 @@ category.items = Objetos
category.crafting = Fabricación
category.shooting = Disparo
category.optional = Mejoras Opcionales
setting.landscape.name = Lock Landscape
setting.landscape.name = Bloquear modo paisaje
setting.shadows.name = Sombras
setting.blockreplace.name = Sugerir bloques al construir
setting.linear.name = Linear Filtering
setting.hints.name = Hints
setting.buildautopause.name = Auto-Pause Building
setting.linear.name = Filtrado Lineal
setting.hints.name = Pistas
setting.buildautopause.name = Auto-pausar construcción
setting.animatedwater.name = Agua Animada
setting.animatedshields.name = Escudos Animados
setting.antialias.name = Antialias[LIGHT_GRAY] (necesita reiniciar)[]
setting.indicators.name = Indicadores de Aliados
setting.autotarget.name = Auto apuntado
setting.keyboard.name = Controles de Ratón+Teclado
setting.touchscreen.name = Touchscreen Controls
setting.touchscreen.name = Controles táctiles
setting.fpscap.name = Máx FPS
setting.fpscap.none = Nada
setting.fpscap.text = {0} FPS
@ -642,17 +642,17 @@ setting.difficulty.name = Dificultad:
setting.screenshake.name = Movimiento de la Pantalla
setting.effects.name = Mostrar Efectos
setting.destroyedblocks.name = Mostrar bloques destruidos
setting.conveyorpathfinding.name = Conveyor Placement Pathfinding
setting.coreselect.name = Allow Schematic Cores
setting.conveyorpathfinding.name = Colocación del transportador en búsqueda de caminos
setting.coreselect.name = Permitir núcleos esquemáticos
setting.sensitivity.name = Sensibilidad del Control
setting.saveinterval.name = Intervalo del Autoguardado
setting.seconds = {0} Segundos
setting.blockselecttimeout.name = Block Select Timeout
setting.milliseconds = {0} milliseconds
setting.blockselecttimeout.name = Tiempo de espera de selección de bloque
setting.milliseconds = {0} milisegundos
setting.fullscreen.name = Pantalla Completa
setting.borderlesswindow.name = Ventana sin Bordes[LIGHT_GRAY] (podría requerir un reinicio)
setting.fps.name = Mostrar FPS
setting.blockselectkeys.name = Show Block Select Keys
setting.blockselectkeys.name = Mostrar teclas de selección de bloque
setting.vsync.name = Vsync (Limita los fps a los Hz de tu pantalla)
setting.pixelate.name = Pixelar [LIGHT_GRAY](podría reducir el rendimiento)
setting.minimap.name = Mostrar Minimapa
@ -664,83 +664,83 @@ setting.sfxvol.name = Volumen de los efectos de sonido
setting.mutesound.name = Silenciar Sonido
setting.crashreport.name = Enviar informes de fallos anónimos
setting.savecreate.name = Crear puntos de guardado automáticamente
setting.publichost.name = Public Game Visibility
setting.publichost.name = Visibilidad del juego público
setting.chatopacity.name = Opacidad del Chat
setting.lasersopacity.name = Opacidad de los rayos láser
setting.playerchat.name = Mostrar el chat in-game
public.confirm = Do you want to make your game public?\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility.
public.confirm = ¿Quieres hacer público tu juego?\n[lightgray]Esto se puede cambiar más tarde en Configuración->Juego->Visibilidad pública del juego.
public.beta = Recuerda que en las versiones beta del juego no puedes crear partidas públicas.
uiscale.reset = La escala de la interfaz ha sido modificada con éxito.\nPulsa "OK" para conservar esta escala.\n[scarlet]Deshaciendo los cambios y saliendo al menu en [accent] {0}[]segundos...
uiscale.cancel = Cancelar & Salir
setting.bloom.name = Bloom
setting.bloom.name = Brillo
keybind.title = Cambiar accesos de teclado
keybinds.mobile = [scarlet]Los accesos del teclado aquí mostrados no estan disponible en Móviles o Tablets. Solo aceptan movimiento básico.
category.general.name = General
category.view.name = Visión
category.multiplayer.name = Multijugador
command.attack = Atacar
command.rally = Rally
command.rally = Patrullar
command.retreat = Retirarse
placement.blockselectkeys = \n[lightgray]Key: [{0},
keybind.clear_building.name = Limpiar construcción
keybind.press = Presiona una tecla...
keybind.press.axis = Pulsa un eje o botón...
keybind.screenshot.name = Captura de pantalla de Mapa
keybind.toggle_power_lines.name = Toggle Power Lasers
keybind.toggle_power_lines.name = Activar láser de potencia
keybind.move_x.name = Mover x
keybind.move_y.name = Mover y
keybind.mouse_move.name = Follow Mouse
keybind.mouse_move.name = Seguír al ratón
keybind.dash.name = Correr
keybind.schematic_select.name = Select Region
keybind.schematic_menu.name = Schematic Menu
keybind.schematic_flip_x.name = Girar schematic X
keybind.schematic_flip_y.name = Girar schematic Y
keybind.category_prev.name = Previous Category
keybind.category_next.name = Next Category
keybind.block_select_left.name = Block Select Left
keybind.block_select_right.name = Block Select Right
keybind.block_select_up.name = Block Select Up
keybind.block_select_down.name = Block Select Down
keybind.block_select_01.name = Category/Block Select 1
keybind.block_select_02.name = Category/Block Select 2
keybind.block_select_03.name = Category/Block Select 3
keybind.block_select_04.name = Category/Block Select 4
keybind.block_select_05.name = Category/Block Select 5
keybind.block_select_06.name = Category/Block Select 6
keybind.block_select_07.name = Category/Block Select 7
keybind.block_select_08.name = Category/Block Select 8
keybind.block_select_09.name = Category/Block Select 9
keybind.block_select_10.name = Category/Block Select 10
keybind.schematic_select.name = Seleccionar región
keybind.schematic_menu.name = Menu de esquémas
keybind.schematic_flip_x.name = Girar esquemática desde X
keybind.schematic_flip_y.name = Girar esquemática desde Y
keybind.category_prev.name = Categoría anterior
keybind.category_next.name = Siguiente categoría
keybind.block_select_left.name = Seleccionar bloque a la izquierda
keybind.block_select_right.name = Seleccionar bloque a la derecha
keybind.block_select_up.name = Seleccionar bloque hacia arriba
keybind.block_select_down.name = Seleccionar bloque hacia abajo
keybind.block_select_01.name = Seleccionar categoría / bloque 1
keybind.block_select_02.name = Seleccionar categoría / bloque 2
keybind.block_select_03.name = Seleccionar categoría / bloque 3
keybind.block_select_04.name = Seleccionar categoría / bloque 4
keybind.block_select_05.name = Seleccionar categoría / bloque 5
keybind.block_select_06.name = Seleccionar categoría / bloque 6
keybind.block_select_07.name = Seleccionar categoría / bloque 7
keybind.block_select_08.name = Seleccionar categoría / bloque 8
keybind.block_select_09.name = Seleccionar categoría / bloque 9
keybind.block_select_10.name = Seleccionar categoría / bloque 10
keybind.fullscreen.name = Intercambiar con Pantalla Completa
keybind.select.name = Seleccionar
keybind.diagonal_placement.name = Construcción Diagonal
keybind.pick.name = Pick Block
keybind.pick.name = Elegir bloque
keybind.break_block.name = Destruir Bloque
keybind.deselect.name = Deseleccionar
keybind.shoot.name = Disparar
keybind.zoom.name = Zoom
keybind.menu.name = Menú
keybind.pause.name = Pausa
keybind.pause_building.name = Pause/Resume Building
keybind.pause_building.name = Pausar/Resumir construcción
keybind.minimap.name = Minimapa
keybind.chat.name = Chat
keybind.player_list.name = Lista de jugadores
keybind.console.name = Consola
keybind.rotate.name = Rotar
keybind.rotateplaced.name = Rotate Existing (Hold)
keybind.rotateplaced.name = Rotar existente (mantener)
keybind.toggle_menus.name = Alternar menús
keybind.chat_history_prev.name = Historial de chat anterior
keybind.chat_history_next.name = Historial de chat siguiente
keybind.chat_scroll.name = Chat scroll
keybind.drop_unit.name = drop unit
keybind.chat_scroll.name = Desplazamiento de chat
keybind.drop_unit.name = Caida de la unidad
keybind.zoom_minimap.name = Zoom minimapa
mode.help.title = Descripción de modos
mode.survival.name = Supervivencia
mode.survival.description = El modo normal. Recursos limitados y oleadas automáticas.
mode.sandbox.name = Sandbox
mode.sandbox.name = Caja de arena
mode.sandbox.description = Recursos ilimitados y sin temporizador para las oleadas.
mode.editor.name = Editor
mode.pvp.name = PvP
mode.pvp.name = JcJ
mode.pvp.description = Pelea contra otros jugadores localmente.
mode.attack.name = Ataque
mode.attack.description = No hay oleadas, el objetivo es destruir la base enemiga.
@ -755,17 +755,17 @@ rules.enemyCheat = Recursos infinitos de la IA
rules.unitdrops = REcursos de las Unidades
rules.unitbuildspeedmultiplier = Multiplicador de velocidad de creación de unidades
rules.unithealthmultiplier = Multiplicador de la vida de las unidades
rules.blockhealthmultiplier = Block Health Multiplier
rules.blockhealthmultiplier = Multiplicador de salud de bloque
rules.playerhealthmultiplier = Multiplicador de la vida del jugador
rules.playerdamagemultiplier = Multiplicador del daño del jugador
rules.unitdamagemultiplier = Multiplicador del daño de unidades
rules.enemycorebuildradius = Radio de No-Construcción del Núcleo Enemigo:[LIGHT_GRAY] (casillas)
rules.respawntime = Tiempo de reaparición:[LIGHT_GRAY] (sec)
rules.wavespacing = Tiempo entre oleadas:[LIGHT_GRAY] (sec)
rules.respawntime = Tiempo de reaparición:[LIGHT_GRAY] (seg)
rules.wavespacing = Tiempo entre oleadas:[LIGHT_GRAY] (seg)
rules.buildcostmultiplier = Multiplicador de coste de construcción
rules.buildspeedmultiplier = Multiplicador de velocidad de construcción
rules.waitForWaveToEnd = Las oleadas esperan a los enemigos
rules.dropzoneradius = Drop Zone Radius:[LIGHT_GRAY] (tiles)
rules.dropzoneradius = Radio de zona de caída:[LIGHT_GRAY] (casillas)
rules.respawns = Reapariciones máximas por oleada
rules.limitedRespawns = Límite de reapariciones
rules.title.waves = Oleadas
@ -775,8 +775,8 @@ rules.title.player = Jugadores
rules.title.enemy = Enemigos
rules.title.unit = Unidades
rules.title.experimental = Experimental
rules.lighting = Lighting
rules.ambientlight = Ambient Light
rules.lighting = Iluminación
rules.ambientlight = Iluminación ambiental
content.item.name = Objetos
content.liquid.name = Líquidos
@ -789,18 +789,18 @@ item.coal.name = Carbón
item.graphite.name = Grafito
item.titanium.name = Titanio
item.thorium.name = Torio
item.silicon.name = Silicio
item.silicon.name = Silicona
item.plastanium.name = Plastanio
item.phase-fabric.name = Tejido de fase
item.surge-alloy.name = Aleación Eléctrica
item.spore-pod.name = Spore Pod
item.spore-pod.name = Vaina de esporas
item.sand.name = Arena
item.blast-compound.name = Compuesto Explosivo
item.pyratite.name = Pirotita
item.metaglass.name = Metacristal
item.scrap.name = Chatarra
liquid.water.name = Agua
liquid.slag.name = Escoria
liquid.slag.name = Fundido
liquid.oil.name = Petróleo
liquid.cryofluid.name = Criogénico
mech.alpha-mech.name = Alpha
@ -821,10 +821,10 @@ mech.javelin-ship.name = Jabalina
mech.javelin-ship.weapon = Ráfaga de misiles
mech.javelin-ship.ability = Potenciador de descarga
mech.trident-ship.name = Tridente
mech.trident-ship.weapon = Bomb Bay
mech.trident-ship.weapon = Bahía de bombardeo
mech.glaive-ship.name = Glaive
mech.glaive-ship.weapon = Repetidor de Llamas
item.corestorable = [lightgray]Storable in Core: {0}
item.corestorable = [lightgray]Guardable en el núcleo: {0}
item.explosiveness = [LIGHT_GRAY]Explosividad: {0}
item.flammability = [LIGHT_GRAY]Inflamabilidad: {0}
item.radioactivity = [LIGHT_GRAY]Radioactividad: {0}
@ -835,7 +835,7 @@ mech.health = [LIGHT_GRAY]Vida: {0}
mech.itemcapacity = [LIGHT_GRAY]Capacidad de objetos: {0}
mech.minespeed = [LIGHT_GRAY]Velocidad de minado: {0}
mech.minepower = [LIGHT_GRAY]Potencia de minado: {0}
mech.ability = [LIGHT_GRAY]Hablidad: {0}
mech.ability = [LIGHT_GRAY]Habilidad: {0}
mech.buildspeed = [LIGHT_GRAY]Velocidad de Construcción: {0}%
liquid.heatcapacity = [LIGHT_GRAY]Capacidad Térmica: {0}
liquid.viscosity = [LIGHT_GRAY]Viscosidad: {0}
@ -845,14 +845,14 @@ block.sand-boulder.name = Piedra de Arena
block.grass.name = Hierba
block.salt.name = Sal
block.saltrocks.name = Rocas de Sal
block.pebbles.name = Pebbles
block.tendrils.name = Tendrils
block.pebbles.name = Guijarros
block.tendrils.name = Zarcillos
block.sandrocks.name = Rocas de arena
block.spore-pine.name = Spore Pine
block.spore-pine.name = Pino de esporas
block.sporerocks.name = Rocas de espora
block.rock.name = Roca
block.snowrock.name = Snow Rock
block.snow-pine.name = Snow Pine
block.snowrock.name = Roca de nieve
block.snow-pine.name = Pino de nieve
block.shale.name = Pizarra
block.shale-boulder.name = Piedra de Pizarra
block.moss.name = Musgo
@ -863,7 +863,7 @@ block.scrap-wall.name = Muro de Chatarra
block.scrap-wall-large.name = Muro de Chatarra grande
block.scrap-wall-huge.name = Muro de Chatarra muy grande
block.scrap-wall-gigantic.name = Muro de Chatarra gigante
block.thruster.name = Thruster
block.thruster.name = Propulsor
block.kiln.name = Horno
block.graphite-press.name = Prensa de grafito
block.multi-press.name = Multi-Prensa
@ -871,11 +871,11 @@ block.constructing = {0}\n[LIGHT_GRAY](Construyendo)
block.spawn.name = Punto de generación
block.core-shard.name = Núcleo: Fragmento
block.core-foundation.name = Núcleo: Fundación
block.core-nucleus.name = Núcleo: Nucleus
block.core-nucleus.name = Núcleo: Núcleo
block.deepwater.name = Aguas profundas
block.water.name = Agua
block.tainted-water.name = Agua Contaminada
block.darksand-tainted-water.name = Dark Sand Tainted Water
block.darksand-tainted-water.name = Agua Contaminada con Arena Oscura
block.tar.name = Alquitrán
block.stone.name = Piedra
block.sand.name = Arena
@ -883,10 +883,10 @@ block.darksand.name = Arena Oscura
block.ice.name = Hielo
block.snow.name = Nieve
block.craters.name = Cráteres
block.sand-water.name = Arena Agua
block.darksand-water.name = Agua Arena Oscura
block.char.name = Char
block.holostone.name = Holo stone
block.sand-water.name = Agua con Arena
block.darksand-water.name = Agua con Arena Oscura
block.char.name = Charbonizado
block.holostone.name = Piedra hologramatica
block.ice-snow.name = Hielo Nieve
block.rocks.name = Rocas
block.icerocks.name = Rocas de hielo
@ -908,7 +908,7 @@ block.dark-panel-4.name = Panel Oscuro 4
block.dark-panel-5.name = Panel Oscuro 5
block.dark-panel-6.name = Panel Oscuro 6
block.dark-metal.name = Metal Oscuro
block.ignarock.name = Roca Igna
block.ignarock.name = Roca Ignea
block.hotrock.name = Roca Caliente
block.magmarock.name = Roca de Magma
block.cliffs.name = Acantilados
@ -916,8 +916,8 @@ block.copper-wall.name = Muro de Cobre
block.copper-wall-large.name = Muro de Cobre grande
block.titanium-wall.name = Muro de Titanio
block.titanium-wall-large.name = Muro de Titanio grande
block.plastanium-wall.name = Plastanium Wall
block.plastanium-wall-large.name = Large Plastanium Wall
block.plastanium-wall.name = Muro de Plastanio
block.plastanium-wall-large.name = Muro de Plastanio grande
block.phase-wall.name = Muro de Fase grande
block.phase-wall-large.name = Muro de Fase grande
block.thorium-wall.name = Pared de Torio
@ -925,24 +925,24 @@ block.thorium-wall-large.name = Muro de Torio grande
block.door.name = Puerta
block.door-large.name = Puerta Grande
block.duo.name = Dúo
block.scorch.name = Scorch
block.scorch.name = Quemador
block.scatter.name = Scatter
block.hail.name = Granizo
block.lancer.name = Lancero
block.conveyor.name = Cinta Transportadora
block.titanium-conveyor.name = Cinta Transportadora de Titanio
block.armored-conveyor.name = Armored Conveyor
block.armored-conveyor.name = Cinta Transportadora Acorazada
block.armored-conveyor.description = Mueve items a la misma veolcidad que una cinta de titanio, pero tiene mas armadura. No acepta entradas por los lados a menos que sean lineas transportadoras.
block.junction.name = Cruce
block.router.name = Enrutador
block.distributor.name = Distribuidor
block.sorter.name = Clasificador
block.inverted-sorter.name = Inverted Sorter
block.message.name = Message
block.illuminator.name = Illuminator
block.illuminator.description = A small, compact, configurable light source. Requires power to function.
block.inverted-sorter.name = Clasificador Invertido
block.message.name = Mensaje
block.illuminator.name = Iluminador
block.illuminator.description = Una fuente de luz pequeña, compacta y configurable. Requiere poder para funcionar.
block.overflow-gate.name = Compuerta de Desborde
block.silicon-smelter.name = Horno para Silicio
block.silicon-smelter.name = Horno para Silicona
block.phase-weaver.name = Tejedor de Fase
block.pulverizer.name = Pulverizador
block.cryofluidmixer.name = Mezclador de Criogénicos
@ -953,8 +953,8 @@ block.separator.name = Separador
block.coal-centrifuge.name = Centrifugador de Carbón
block.power-node.name = Nodo de Energía
block.power-node-large.name = Nodo de Energía Grande
block.surge-tower.name = Surge Tower
block.diode.name = Battery Diode
block.surge-tower.name = Torre de sobretensión
block.diode.name = Diodo de batería
block.battery.name = Batería
block.battery-large.name = Batería Grande
block.combustion-generator.name = Generador de Combustión
@ -966,7 +966,7 @@ block.pneumatic-drill.name = Taladro neumático
block.laser-drill.name = Taladro Láser
block.water-extractor.name = Extractor de Agua
block.cultivator.name = Cultivador
block.dart-mech-pad.name = Pad de mecanoide Dart
block.dart-mech-pad.name = Pad de mecanoide Dardo
block.delta-mech-pad.name = Pad de mecanoide Delta
block.javelin-ship-pad.name = Pad de nave Jabalina
block.trident-ship-pad.name = Pad de nave Tridente
@ -978,7 +978,7 @@ block.mechanical-pump.name = Bomba Mecánica
block.item-source.name = Fuente de objetos
block.item-void.name = Vacío de objetos
block.liquid-source.name = Fuente de líquidos
block.liquid-void.name = Liquid Void
block.liquid-void.name = Vacío de líquidos
block.power-void.name = Vacío de energía
block.power-source.name = Energía Infinita
block.unloader.name = Descargador
@ -995,20 +995,20 @@ block.blast-mixer.name = Mezclador de Explosivos
block.solar-panel.name = Panel Solar
block.solar-panel-large.name = Panel Solar Grande
block.oil-extractor.name = Extractor de Petróleo
block.command-center.name = Command Center
block.draug-factory.name = Fábrica de Drones Mineros Draug
block.command-center.name = Centro de Comando
block.draug-factory.name = Fábrica de Drones Mineros Primitivos
block.spirit-factory.name = Fábrica de Drones Espíritu
block.phantom-factory.name = Fábrica de Drones Fantasmales
block.wraith-factory.name = Fábrica de Wraith Fighter
block.ghoul-factory.name = Fábrica de Ghoul Bomber
block.dagger-factory.name = Fábrica de mecanoide Daga
block.crawler-factory.name = Fábrica de mecanoide Oruga
block.titan-factory.name = Fábrica de mecanoide Titán
block.fortress-factory.name = Fábrica de mecanoide Fortress
block.revenant-factory.name = Fábrica de Revenant Fighter
block.wraith-factory.name = Fábrica de Peleador Infernal
block.ghoul-factory.name = Fábrica de Bombardero Fantasmal
block.dagger-factory.name = Fábrica de Mecanoide Daga
block.crawler-factory.name = Fábrica de Mecanoide Oruga
block.titan-factory.name = Fábrica de Mecanoide Titán
block.fortress-factory.name = Fábrica de Mecanoide Fortress
block.revenant-factory.name = Fábrica de Peleador Revenante
block.repair-point.name = Punto de Reparación
block.pulse-conduit.name = Conducto de Pulso
block.plated-conduit.name = Plated Conduit
block.plated-conduit.name = Conducto Chapado
block.phase-conduit.name = Conducto de Fase
block.liquid-router.name = Enrutador de Líquidos
block.liquid-tank.name = Tanque de Líquidos
@ -1020,23 +1020,23 @@ block.mass-driver.name = Teletransportador Masivo
block.blast-drill.name = Taladro de explosión
block.thermal-pump.name = Bomba Térmica
block.thermal-generator.name = Generador Térmico
block.alloy-smelter.name = Alloy Smelter
block.alloy-smelter.name = Fundidor de Materia
block.mender.name = Reparador
block.mend-projector.name = Proyector de reparación
block.surge-wall.name = Muro de Surge
block.surge-wall-large.name = Muro de Surge grande
block.surge-wall.name = Muro de Sobretensión
block.surge-wall-large.name = Muro de Sobretensión grande
block.cyclone.name = Ciclón
block.fuse.name = Fuse
block.shock-mine.name = Mina Shock
block.fuse.name = Fusible
block.shock-mine.name = Mina electrizante
block.overdrive-projector.name = Proyector de sobremarcha
block.force-projector.name = Proyector de fuerza
block.arc.name = Arco
block.rtg-generator.name = Generador RTG
block.spectre.name = Espectro
block.meltdown.name = Meltdown
block.meltdown.name = Fusión de Reactor
block.container.name = Contenedor
block.launch-pad.name = Pad de Lanzamiento
block.launch-pad-large.name = Pad de Lanzammiento Grande
block.launch-pad-large.name = Pad de Lanzamiento Grande
team.blue.name = Azul
team.crux.name = rojo
team.sharded.name = naranja
@ -1045,32 +1045,32 @@ team.derelict.name = derelict
team.green.name = Verde
team.purple.name = Púrpura
unit.spirit.name = Dron Espíritu
unit.draug.name = Dron Minero Draug
unit.draug.name = Dron Minero Primitivo
unit.phantom.name = Dron Fantasmal
unit.dagger.name = Daga
unit.crawler.name = Oruga
unit.titan.name = Titán
unit.ghoul.name = Ghoul Bomber
unit.wraith.name = Wraith Fighter
unit.fortress.name = Fortress
unit.revenant.name = Revenant
unit.eruptor.name = Eruptor
unit.chaos-array.name = Chaos Array
unit.ghoul.name = Bombardero Fantasmal
unit.wraith.name = Peleador Infernal
unit.fortress.name = Fortaleza
unit.revenant.name = Revenante
unit.eruptor.name = Erupcionador
unit.chaos-array.name = Matriz del caos
unit.eradicator.name = Erradicador
unit.lich.name = Lich
unit.reaper.name = Reaper
unit.reaper.name = Segador
tutorial.next = [lightgray]<Toca para continuar>
tutorial.intro = Has entrado en el[scarlet]Tutorial de Mindustry.[]\nComienza[accent]minando cobre[]. Toca en una veta de cobre cercana al núcleo para hacer esto.\n\n[accent]{0}/{1} cobre
tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
tutorial.intro.mobile = Has entrado en el[scarlet] Tutorial de Mindustry.[]\nArrastra la pantalla para moverte.\n[accent]Pellizca con 2 dedos [] para alejar y hacercar la vista.\nComienza por[accent] minar cobre[]. Muevete cerca de el, luego toque una veta de mineral de cobre cerca de su núcleo para hacer esto.\n\n[accent]{0}/{1} cobre
tutorial.drill = Minar manualmente es ineficiente.\nLos [accent]taladros pueden minar automáticamente.\nColoca uno en una veta de cobre.
tutorial.drill.mobile = Minar manualmente es ineficiente.\nLos [accent]Taladros[] pueden minar automáticamente.\nToca la sección de taladros el la esquina de abajo a la derecha.\nSelecciona el[accent]taladro mecánico[].\nColócalo en una veta de cobre tocándola, después pulsa el [accent]botón de confirmación de debajo para confirmar tu selección.\nPulsa el[accent]botón "X" para cancelar la construcción.
tutorial.blockinfo = Cada bloque tiene diferentes estadísticas. Cada taladro solo puede minar ciertos minerales.\nPara comprobar la información y estadísticas de un bloque,[accent] toca el botón "?" mientras lo tienes seleccionado en el menú de construcción.[]\n\n[accent]Accede a las estadísticas del Taladro Mecánico ahora.[]
tutorial.conveyor = Las [accent]Cintas Transportadoras[] se usan para transportar recursos al núcleo.\nConstruye una línea de transportadores del taladro al núcleo.
tutorial.conveyor.mobile = Las [accent]Cintas Transportadoras[] se usan para transportar recursos al núcleo.\nConstruye una línea de transportadores del taladro al núcleo.\n[accent] Construye una línea manteniendo el dedo unos segundos[] y arrastrando hacia una dirección.\n\n[accet]{0}/{1} cintas colocadas en línea\n[ccent]]0/1 recursos transportados.
tutorial.turret = Se tiene que construir estructuras defensivas para repeler el [LIGHT_GRAY]enemy[].\nConstruye una torreta dúo cerca de tu base.
tutorial.drillturret = Los dúos requieren[accent] copper ammo[]para disparar.\nColoca un taladro junto a la torre para darle cobre.
tutorial.drillturret = Los dúos requieren[accent] munición de cobre[]para disparar.\nColoca un taladro junto a la torre para darle cobre.
tutorial.pause = Durante la batalla, puedes[accent]pausar el juego.[]\nPuedes dejar estructuras en cola mientras pausas.\n\n[accent]Pulsa Espacio para pausar.
tutorial.pause.mobile = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press this button in the top left to pause.
tutorial.pause.mobile = Durante la batalla, puedes[accent] pausar el juego.[]\nPuedes dejar estructuras en cola mientras pausas.\n\n[accent]Pulsa este boton de arriba a la izquierda para pausar.
tutorial.unpause = Ahora toca Espacio otra vez para dejar de pausar.
tutorial.unpause.mobile = Ahora tócalo otra vez para dejar de pausar.
tutorial.breaking = Muchas veces hace falta destruir bloques.\n[accent]Mantén el botón derecho[] para destruir todos los bloques en una selección.[]\n\n[accent]Destruye todos los bloques de chatarra de la izquierda de tu núcleo usando selección de área.
@ -1110,7 +1110,7 @@ mech.javelin-ship.description = Una nave de ataque y retirada. Aunque inicialmen
mech.trident-ship.description = Un bombardero pesado. Razonablemente bien equipado.
mech.glaive-ship.description = Una nave pistolera grande y bien armada. Equipada con un repetidor incendiario. Buena aceleración y velocidad máxima.
unit.draug.description = Un dron minero primitivo. Barato de producir. Reciclable. Mina cobre y plomo cercanos automáticamente. Transporta los recursos minados al núcleo más cercano.
unit.spirit.description = Un dron draug modificaado, diseñado para reparar en vez de minar. Repara automáticamente cualquier bloque dañado en la zona.
unit.spirit.description = Un dron minero primitivo modificado, diseñado para reparar en vez de minar. Repara automáticamente cualquier bloque dañado en la zona.
unit.phantom.description = Un dron avanzado. Mina automáticamente minerales, recoge objetos y repra bloques. Bastante más efectivo que un dron normal.
unit.dagger.description = Una unidad terrestre. Útil con enjambres.
unit.crawler.description = Una unidad terrestre que consiste en un marco desmontado con una gran cantidad de explosivos en la parte superior. No es muy duradero. Explota en contacto enemigo.
@ -1120,14 +1120,14 @@ unit.eruptor.description = Un mecanoide pesado diseñado para destruir estructur
unit.wraith.description = Una unidad interceptora rápida.
unit.ghoul.description = Una unidad bombardera pesada. Usa compuesto explosivo o pirotita como munición.
unit.revenant.description = Una unidad aérea pesada con misiles.
block.message.description = Stores a message. Used for communication between allies.
block.message.description = Almacena un mensaje. Se utiliza para comunicarse entre aliados.
block.graphite-press.description = Comprime carbón en piezas de grafito puro.
block.multi-press.description = Una versión mejorada de la prensa de grafito. Utiliza agua y energía para procesar carbón rápida y eficientemente.
block.silicon-smelter.description = Reduce la arena con carbón puro. Produce silicio.
block.silicon-smelter.description = Reduce la arena con carbón puro. Produce silicicona.
block.kiln.description = Funde arena y plomo en metacristal. Requiere cantidades pequeñas de energía.
block.plastanium-compressor.description = Produce plastanio con aceite y titanio.
block.phase-weaver.description = Produce tejido de fase del torio radioactivo y altas cantidades de arena.
block.alloy-smelter.description = Produce "surge alloy" con titanio, plomo, silicio y cobre.
block.alloy-smelter.description = Produce "surge alloy" con titanio, plomo, silicicona y cobre.
block.cryofluidmixer.description = Combina agua y titanio en líquido criogénico, que es mucho más eficiente para enfriar.
block.blast-mixer.description = Usa aceite para transformar pirotita en un objeto menos inflamable pero más explosivo: compuesto explosivo.
block.pyratite-mixer.description = Mezcla carbón, plomo y arena en pirotita altamente inflamable.
@ -1137,18 +1137,18 @@ block.spore-press.description = Comprime esporas en petróleo.
block.pulverizer.description = Despedaza la piedra en arena. Útil cuando no hay arena natural.
block.coal-centrifuge.description = Solidifica petróleo en piezas de carbón.
block.incinerator.description = Se deshace de cualquier líquido o material excesivo.
block.power-void.description = Elimina toda la energía que se le da. Solo en sandbox.
block.power-source.description = Da energía infinita. Solo en sandbox.
block.item-source.description = Da objetos infinitos. Solo en sandbox.
block.item-void.description = Destruye cuanquier objeto que va a él sin necesitar energía. Solo en sandbox.
block.liquid-source.description = Da líquido infinito. Solo en sandbox.
block.liquid-void.description = Removes any liquids. Sandbox only.
block.power-void.description = Elimina toda la energía que se le da. Solo en Caja de Arena.
block.power-source.description = Da energía infinita. Solo en Caja de Arena.
block.item-source.description = Da objetos infinitos. Solo en Caja de Arena.
block.item-void.description = Destruye cuanquier objeto que va a él sin necesitar energía. Solo en Caja de Arena.
block.liquid-source.description = Da líquido infinito. Solo en Caja de Arena.
block.liquid-void.description = Elimina cualquier liquido que entra sin necesitar energía. Solo en Caja de Arena.
block.copper-wall.description = Un bloque defensivo barato.\nÚtil para defender el núcleo y las torres en las primeras oleadas.
block.copper-wall-large.description = Un bloque defensivo barato.\nÚtil para defender el núcleo y las torres en las primeras oleadas.\nOcupa múltiples casillas.
block.titanium-wall.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.
block.titanium-wall-large.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.\nOcupa múltiples casillas.
block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.
block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles.
block.plastanium-wall.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia..
block.plastanium-wall-large.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.\nOcupa múltiples casillas.
block.thorium-wall.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.
block.thorium-wall-large.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.\nOcupa múltiples casillas.
block.phase-wall.description = No es tan fuerte como un muro de torio pero rebota balas al enemigo si no son demasiado fuertes.
@ -1168,7 +1168,7 @@ block.junction.description = Actúa como puente para dos transportadores que se
block.bridge-conveyor.description = Bloque avanado de transporte. Puede transportar objetos por encima hasta 3 casillas de cualquier terreno o construcción.
block.phase-conveyor.description = Bloque de transporte avanzado. Usa energía para transportar objetos a otro transportador de fase conectado por varias casillas.
block.sorter.description = Clasifica objetos. Si un objeto es igual al seleccionado, pasará al frente. Si no, el objeto saldrá por la izquierda y la derecha.
block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead.
block.inverted-sorter.description = Procesa elementos como un clasificador estándar, pero en su lugar genera elementos seleccionados a los lados.
block.router.description = Acepta objetos de una dirección y deja objetos equitativamente en hasta 3 direcciones diferentes. Útil para dividir los materiales de una fuente de recursos a múltiples objetivos.
block.distributor.description = Un enrutador avanzado que distribuye objetos equitativamente en hasta otras 7 direcciones.
block.overflow-gate.description = Un enrutador que solo saca por la izquierda y la derecha si la cinta del frente está llena.
@ -1178,7 +1178,7 @@ block.rotary-pump.description = Una bomba avanzada. Bombea más líquido, pero r
block.thermal-pump.description = La mejor bomba.
block.conduit.description = Bloque de transporte de líquidos básico. Funciona como un transportador, pero con líquidos. Usado con bombas, extractores u otros conductos.
block.pulse-conduit.description = Bloque de transporte de líquidos avanzado. Transporta líquidos más rápidamente y almacena más que los conductos estándar.
block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less.
block.plated-conduit.description = Mueve líquidos a la misma velocidad que los conductos de pulso, pero posee más armadura. No acepta líquidos de los lados por otra cosa que no sean conductos.\nGotea menos.
block.liquid-router.description = Acepta líquidos de una dirección y los deja en hasta 3 direcciones equitativamente. También puede amacenar cierta capacidad de líquido. Útil para dividir los líquidos de una fuente a varios objetivos.
block.liquid-tank.description = Almacena una gran cantidad de líquidos. Úsalo para crear almacenes cuando no hay una demanda constante de materiales o para asegurarse de enfriar bloques vitales.
block.liquid-junction.description = Actúa como un puente para dos condusctos que se cruzan. Útil en situaciones en las que hay dos conductos con líquidos diferentes a diferentes lugares.
@ -1187,13 +1187,13 @@ block.phase-conduit.description = Bloque de transporte de líquidos avanzado. Us
block.power-node.description = Transmite energía a nodos conectados, conecta hasta cuatro fuentes de energía, edificios que usan energía o nodos. El nodo obtendrá o transmitirá energía de cualquier bloque adyacente.
block.power-node-large.description = Tiene un radio más amplio que el nodo de energía y conecta hasta seis fuentes de energía, edificios que usan energía o nodos.
block.surge-tower.description = Un nodo con un gran alcance con menos conexiones disponibles.
block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored.
block.diode.description = La energía de la batería puede fluir a través de este bloque en una sola dirección, pero solo si el otro lado tiene menos energía almacenada.
block.battery.description = Guarda energía cuando hay abundancia y proporciona energía cuando hay escasez de energía mientras la batería tenga energía.
block.battery-large.description = Almacena mucha más energía que una batería normal.
block.combustion-generator.description = Genera energía quemando aceite o matteriales inflamables.
block.thermal-generator.description = Genera una gran cantidad de energía con la lava.
block.turbine-generator.description = Más eficiente que un generador de combustión, pero requiere agua adicional.
block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite.
block.differential-generator.description = Genera grandes cantidades de energía. Utiliza la diferencia de temperatura entre el fluído criogenico y la quema de piratita.
block.rtg-generator.description = Un generador radioisótropo termoeléctrico que no necesita enfriamiento pero proporciona menos energía que un reactor de torio.
block.solar-panel.description = Proporciona una pequeña cantidad de energía procedente del sol.
block.solar-panel-large.description = Genera un mucho mejor suministro de energía que un panel solar estándar, pero también es mucho más caro de construir.
@ -1228,8 +1228,8 @@ block.ripple.description = Una torre de artillería grande que dispara varios di
block.cyclone.description = Una torre de disparo rápido grande.
block.spectre.description = Una torre grande que dispara dos balas poderosas de una vez.
block.meltdown.description = Una torre grande que dispara rayos poderosos de largo alcance.
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
block.draug-factory.description = Producedrones mineros Draug.
block.command-center.description = Emite comandos de movimiento a las unidades aliadas en el mapa.\nHace que las unidades patrullen, ataquen un núcleo enemigo o se retiren al núcleo / fábrica. When no enemy core is present, units will default to patrolling under the attack command.
block.draug-factory.description = Producedrones mineros primitivos.
block.spirit-factory.description = Produce drones ligeros que obtienen minerales y reparan bloques.
block.phantom-factory.description = Produce drones avanzados que son significativamente más eficientes que un dron espíritu.
block.wraith-factory.description = Produce unidades aéreas rápidas e interceptoras.

View File

@ -33,6 +33,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
@Override
public void setup(){
Vars.loadLogger();
Vars.loadFileLogger();
Vars.platform = this;
beginTime = Time.millis();

View File

@ -1,13 +1,14 @@
package mindustry;
import arc.*;
import arc.Application.*;
import arc.*;
import arc.assets.*;
import arc.struct.*;
import arc.files.*;
import arc.graphics.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.*;
import arc.util.Log.*;
import arc.util.io.*;
import mindustry.ai.*;
import mindustry.core.*;
@ -21,11 +22,12 @@ import mindustry.gen.*;
import mindustry.input.*;
import mindustry.maps.*;
import mindustry.mod.*;
import mindustry.net.*;
import mindustry.net.Net;
import mindustry.net.*;
import mindustry.type.Weather.*;
import mindustry.world.blocks.defense.ForceProjector.*;
import java.io.*;
import java.nio.charset.*;
import java.util.*;
@ -36,7 +38,7 @@ public class Vars implements Loadable{
/** Whether to load locales.*/
public static boolean loadLocales = true;
/** Whether the logger is loaded. */
public static boolean loadedLogger = false;
public static boolean loadedLogger = false, loadedFileLogger = false;
/** Maximum schematic size.*/
public static final int maxSchematicSize = 32;
/** All schematic base64 starts with this string.*/
@ -285,9 +287,10 @@ public class Vars implements Loadable{
String[] stags = {"&lc&fb[D]", "&lg&fb[I]", "&ly&fb[W]", "&lr&fb[E]", ""};
Array<String> logBuffer = new Array<>();
Log.setLogger((level, text, args) -> {
String result = Log.format(text, args);
System.out.println(Log.format(stags[level.ordinal()] + "&fr " + text, args));
Log.setLogger((level, text) -> {
String result = text;
String rawText = Log.format(stags[level.ordinal()] + "&fr " + text);
System.out.println(rawText);
result = tags[level.ordinal()] + " " + result;
@ -303,6 +306,28 @@ public class Vars implements Loadable{
loadedLogger = true;
}
public static void loadFileLogger(){
if(loadedFileLogger) return;
Core.settings.setAppName(appName);
Writer writer = settings.getDataDirectory().child("last_log.txt").writer(false);
LogHandler log = Log.getLogger();
Log.setLogger(((level, text) -> {
log.log(level, text);
try{
writer.write("[" + Character.toUpperCase(level.name().charAt(0)) +"] " + Log.removeCodes(text) + "\n");
writer.flush();
}catch(IOException e){
e.printStackTrace();
//ignore it
}
}));
loadedFileLogger = true;
}
public static void loadSettings(){
Core.settings.setAppName(appName);

View File

@ -894,18 +894,21 @@ public class Blocks implements ContentList{
requirements(Category.distribution, ItemStack.with(Items.copper, 1), true);
health = 45;
speed = 0.03f;
displayedSpeed = 4.2f;
}};
titaniumConveyor = new Conveyor("titanium-conveyor"){{
requirements(Category.distribution, ItemStack.with(Items.copper, 1, Items.lead, 1, Items.titanium, 1));
health = 65;
speed = 0.08f;
displayedSpeed = 10f;
}};
armoredConveyor = new ArmoredConveyor("armored-conveyor"){{
requirements(Category.distribution, ItemStack.with(Items.plastanium, 1, Items.thorium, 1, Items.metaglass, 1));
health = 180;
speed = 0.08f;
displayedSpeed = 10f;
}};
junction = new Junction("junction"){{

View File

@ -133,9 +133,9 @@ public class NetClient implements ApplicationListener{
}
//called on all clients
@Remote(called = Loc.server, targets = Loc.server, variants = Variant.both)
@Remote(targets = Loc.server, variants = Variant.both)
public static void sendMessage(String message, String sender, Player playersender){
if(Vars.ui != null && !(playersender != null && net.server() && sender.startsWith("[#" + player.getTeam().color.toString() + "]<T>"))){
if(Vars.ui != null){
Vars.ui.chatfrag.addMessage(message, sender);
}

View File

@ -762,7 +762,6 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
public void sendMessage(String text){
if(isLocal){
if(Vars.ui != null){
Log.info("add " + text);
Vars.ui.chatfrag.addMessage(text, null);
}
}else{

View File

@ -54,7 +54,7 @@ public class PlanetRenderer{
shader.begin();
shader.setUniformMatrix4("u_projModelView", cam.combined().val);
mesh.render(shader, Gl.triangleStrip);
mesh.render(shader, Gl.triangles);
shader.end();
Gl.disable(Gl.depthTest);
@ -76,7 +76,7 @@ public class PlanetRenderer{
void planet(){
PlanetGrid p = new PlanetGrid();
Grid grid = p.newGrid(4);
Grid grid = p.newGrid(2);
for(Tile tile : grid.tiles){

View File

@ -20,15 +20,8 @@ public class ModsDialog extends FloatingDialog{
super("$mods");
addCloseButton();
buttons.addImageTextButton(mobile ? "$mods.report" : "$mods.openfolder", Icon.link,
() -> {
if(mobile){
Core.net.openURI(reportIssueURL);
}else{
Core.net.openFolder(modDirectory.absolutePath());
}
})
.size(250f, 64f);
buttons.addImageTextButton("$mods.openfolder", Icon.link,
() -> Core.app.openFolder(modDirectory.absolutePath())).size(250f, 64f);
buttons.row();

View File

@ -81,10 +81,10 @@ public class SettingsMenuDialog extends SettingsDialog{
dataDialog.addCloseButton();
dataDialog.cont.table(Tex.button, t -> {
t.defaults().size(240f, 60f).left();
t.defaults().size(270f, 60f).left();
TextButtonStyle style = Styles.cleart;
t.addButton("$settings.cleardata", style, () -> ui.showConfirm("$confirm", "$settings.clearall.confirm", () -> {
t.addImageTextButton("$settings.cleardata", Icon.trash16Small, style, () -> ui.showConfirm("$confirm", "$settings.clearall.confirm", () -> {
ObjectMap<String, Object> map = new ObjectMap<>();
for(String value : Core.settings.keys()){
if(value.contains("usid") || value.contains("uuid")){
@ -104,7 +104,7 @@ public class SettingsMenuDialog extends SettingsDialog{
t.row();
t.addButton("$data.export", style, () -> {
t.addImageTextButton("$data.export", Icon.loadMapSmall, style, () -> {
if(ios){
Fi file = Core.files.local("mindustry-data-export.zip");
try{
@ -128,7 +128,7 @@ public class SettingsMenuDialog extends SettingsDialog{
t.row();
t.addButton("$data.import", style, () -> ui.showConfirm("$confirm", "$data.import.confirm", () -> platform.showFileChooser(true, "zip", file -> {
t.addImageTextButton("$data.import", Icon.saveMapSmall, style, () -> ui.showConfirm("$confirm", "$data.import.confirm", () -> platform.showFileChooser(true, "zip", file -> {
try{
data.importData(file);
Core.app.exit();
@ -143,6 +143,11 @@ public class SettingsMenuDialog extends SettingsDialog{
}
}
})));
if(!ios){
t.row();
t.addImageTextButton("$data.openfolder", Icon.folderSmall, style, () -> Core.app.openFolder(Core.settings.getDataDirectory().absolutePath()));
}
});
ScrollPane pane = new ScrollPane(prefs);

View File

@ -1,10 +1,11 @@
package mindustry.world;
import arc.struct.*;
import arc.func.*;
import arc.math.*;
import arc.math.geom.*;
import arc.struct.*;
import arc.util.ArcAnnotate.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.entities.traits.*;
import mindustry.entities.type.*;
@ -215,6 +216,16 @@ public class Tile implements Position, TargetTrait{
}
}
/** remove()-s this tile, except it's synced across the network */
public void removeNet(){
Call.removeTile(this);
}
/** set()-s this tile, except it's synced across the network */
public void setNet(Block block, Team team, int rotation){
Call.setTile(this, block, team, rotation);
}
public byte rotation(){
return rotation;
}
@ -506,4 +517,16 @@ public class Tile implements Position, TargetTrait{
public String toString(){
return floor.name + ":" + block.name + ":" + overlay + "[" + x + "," + y + "] " + "entity=" + (entity == null ? "null" : (entity.getClass())) + ":" + getTeam();
}
//remote utility methods
@Remote(called = Loc.server)
public static void removeTile(Tile tile){
tile.remove();
}
@Remote(called = Loc.server)
public static void setTile(Tile tile, Block block, Team team, int rotation){
tile.set(block, team, rotation);
}
}

View File

@ -33,6 +33,7 @@ public class Conveyor extends Block implements Autotiler{
private TextureRegion[][] regions = new TextureRegion[7][4];
public float speed = 0f;
public float displayedSpeed = 0f;
protected Conveyor(String name){
super(name);
@ -59,7 +60,8 @@ public class Conveyor extends Block implements Autotiler{
@Override
public void setStats(){
super.setStats();
stats.add(BlockStat.itemsMoved, speed * 60 / itemSpace, StatUnit.itemsSecond);
//have to add a custom calculated speed, since the actual movement speed is apparently not linear
stats.add(BlockStat.itemsMoved, displayedSpeed, StatUnit.itemsSecond);
}
@Override

View File

@ -1,11 +1,11 @@
package mindustry.world.blocks.liquid;
import arc.*;
import arc.struct.*;
import arc.func.*;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.math.geom.*;
import arc.struct.*;
import arc.util.*;
import mindustry.content.*;
import mindustry.entities.traits.BuilderTrait.*;
@ -13,7 +13,6 @@ import mindustry.entities.type.*;
import mindustry.type.*;
import mindustry.world.*;
import mindustry.world.blocks.*;
import mindustry.world.modules.*;
public class Conduit extends LiquidBlock implements Autotiler{
public final int timerFlow = timers++;
@ -92,13 +91,12 @@ public class Conduit extends LiquidBlock implements Autotiler{
@Override
public void draw(Tile tile){
ConduitEntity entity = tile.ent();
LiquidModule mod = tile.entity.liquids;
int rotation = tile.rotation() * 90;
Draw.colorl(0.34f);
Draw.rect(botRegions[entity.blendbits], tile.drawx(), tile.drawy(), rotation);
Draw.color(mod.current().color);
Draw.color(tile.entity.liquids.current().color);
Draw.alpha(entity.smoothLiquid);
Draw.rect(botRegions[entity.blendbits], tile.drawx(), tile.drawy(), rotation);
Draw.color();
@ -109,7 +107,7 @@ public class Conduit extends LiquidBlock implements Autotiler{
@Override
public void update(Tile tile){
ConduitEntity entity = tile.ent();
entity.smoothLiquid = Mathf.lerpDelta(entity.smoothLiquid, entity.liquids.total() / liquidCapacity, 0.05f);
entity.smoothLiquid = Mathf.lerpDelta(entity.smoothLiquid, entity.liquids.currentAmount() / liquidCapacity, 0.05f);
if(tile.entity.liquids.total() > 0.001f && tile.entity.timer.get(timerFlow, 1)){
tryMoveLiquid(tile, tile.getNearby(tile.rotation()), leakResistance, tile.entity.liquids.current());

View File

@ -1,3 +1,3 @@
org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m
archash=b20e64361b2ad86850bb9d6f4d0c842bd1af83e5
archash=145648d83c4659f727ea8b6676006747b87e7716

View File

@ -66,17 +66,17 @@ public class ServerControl implements ApplicationListener{
"globalrules", "{reactorExplosions: false}"
);
Log.setLogger((level, text, args1) -> {
String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr", args1);
Log.setLogger((level, text) -> {
String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr");
System.out.println(result);
if(Config.logging.bool()){
logToFile("[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr", false, args1));
logToFile("[" + dateTime.format(LocalDateTime.now()) + "] " + formatColors(tags[level.ordinal()] + " " + text + "&fr", false));
}
if(socketOutput != null){
try{
socketOutput.println(format(text + "&fr", false, args1));
socketOutput.println(formatColors(text + "&fr", false));
}catch(Throwable e){
err("Error occurred logging to socket: {0}", e.getClass().getSimpleName());
}

View File

@ -29,8 +29,8 @@ public class ServerLauncher implements ApplicationListener{
Vars.platform = new Platform(){};
Vars.net = new Net(platform.getNet());
Log.setLogger((level, text, args1) -> {
String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr", args1);
Log.setLogger((level, text) -> {
String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr");
System.out.println(result);
});
new HeadlessApplication(new ServerLauncher(), null, throwable -> CrashSender.send(throwable, f -> {}));