Merge branch 'master' of https://github.com/Anuken/Mindustry into 7.0-features

This commit is contained in:
Anuken
2021-09-13 20:52:41 -04:00
82 changed files with 1517 additions and 1114 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -363,6 +363,7 @@ publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure
publish.error = Error publishing item: {0} publish.error = Error publishing item: {0}
steam.error = Failed to initialize Steam services.\nError: {0} steam.error = Failed to initialize Steam services.\nError: {0}
editor.cliffs = Walls To Cliffs
editor.brush = Brush editor.brush = Brush
editor.openin = Open In Editor editor.openin = Open In Editor
editor.oregen = Ore Generation editor.oregen = Ore Generation
@@ -400,6 +401,8 @@ waves.sort.reverse = Reverse Sort
waves.sort.begin = Begin waves.sort.begin = Begin
waves.sort.health = Health waves.sort.health = Health
waves.sort.type = Type waves.sort.type = Type
waves.units.hide = Hide All
waves.units.show = Show All
#these are intentionally in lower case #these are intentionally in lower case
wavemode.counts = counts wavemode.counts = counts
@@ -628,6 +631,8 @@ sector.biomassFacility.name = Biomass Synthesis Facility
sector.windsweptIslands.name = Windswept Islands sector.windsweptIslands.name = Windswept Islands
sector.extractionOutpost.name = Extraction Outpost sector.extractionOutpost.name = Extraction Outpost
sector.planetaryTerminal.name = Planetary Launch Terminal sector.planetaryTerminal.name = Planetary Launch Terminal
sector.coastline.name = Coastline
sector.navalFortress.name = Naval Fortress
sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on.
sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders.
@@ -1395,6 +1400,7 @@ hint.generator = \uf879 [accent]Combustion Generators[] burn coal and transmit p
hint.guardian = [accent]Guardian[] units are armored. Weak ammo such as [accent]Copper[] and [accent]Lead[] is [scarlet]not effective[].\n\nUse higher tier turrets or \uf835 [accent]Graphite[] \uf861Duo/\uf859Salvo ammunition to take Guardians down. hint.guardian = [accent]Guardian[] units are armored. Weak ammo such as [accent]Copper[] and [accent]Lead[] is [scarlet]not effective[].\n\nUse higher tier turrets or \uf835 [accent]Graphite[] \uf861Duo/\uf859Salvo ammunition to take Guardians down.
hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a  [accent]Foundation[] core over the  [accent]Shard[] core. Make sure it is free from nearby obstructions. hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a  [accent]Foundation[] core over the  [accent]Shard[] core. Make sure it is free from nearby obstructions.
hint.presetLaunch = Gray [accent]landing zone sectors[], such as [accent]Frozen Forest[], can be launched to from anywhere. They do not require capture of nearby territory.\n\n[accent]Numbered sectors[], such as this one, are [accent]optional[]. hint.presetLaunch = Gray [accent]landing zone sectors[], such as [accent]Frozen Forest[], can be launched to from anywhere. They do not require capture of nearby territory.\n\n[accent]Numbered sectors[], such as this one, are [accent]optional[].
hint.presetDifficulty = This sector has a [scarlet]high enemy threat level[].\nLaunching to such sectors is [accent]not recommended[] without proper technology and preparation.
hint.coreIncinerate = After the core is filled to capacity with an item, any extra items of that type it receives will be [accent]incinerated[]. hint.coreIncinerate = After the core is filled to capacity with an item, any extra items of that type it receives will be [accent]incinerated[].
hint.coopCampaign = When playing the [accent]co-op campaign[], items that are produced in the current map will also be sent [accent]to your local sectors[].\n\nAny new research done by the host also carries over. hint.coopCampaign = When playing the [accent]co-op campaign[], items that are produced in the current map will also be sent [accent]to your local sectors[].\n\nAny new research done by the host also carries over.

View File

@@ -2,7 +2,7 @@ credits.text = Creado por [royal]Anuken[] - [sky]anukendev@gmail.com[]
credits = Créditos credits = Créditos
contributors = Traductores y Contribuidores contributors = Traductores y Contribuidores
discord = ¡Únete al Discord de Mindustry! discord = ¡Únete al Discord de Mindustry!
link.discord.description = El servidor official de Discord de Mindustry link.discord.description = El servidor oficial de Discord de Mindustry
link.reddit.description = El subreddit de Mindustry link.reddit.description = El subreddit de Mindustry
link.github.description = Código fuente del juego link.github.description = Código fuente del juego
link.changelog.description = Lista de actualizaciones link.changelog.description = Lista de actualizaciones
@@ -49,24 +49,24 @@ mods.github.open = Repositorio
mods.browser.sortdate = Más recientes mods.browser.sortdate = Más recientes
mods.browser.sortstars = Mejor valorados mods.browser.sortstars = Mejor valorados
schematic = Plantilla schematic = Esquema
schematic.add = Guardar plantilla... schematic.add = Guardar Esquema...
schematics = Plantillas schematics = Esquemas
schematic.replace = Ya existe una plantilla con ese nombre. ¿Deseas remplazarla? schematic.replace = Ya existe un esquema con ese nombre. ¿Deseas remplazarlo?
schematic.exists = Ya existe una plantilla con ese nombre. schematic.exists = Ya existe un esquema con ese nombre.
schematic.import = Importar plantilla... schematic.import = Importar Esquema...
schematic.exportfile = Exportar archivo schematic.exportfile = Exportar Archivo
schematic.importfile = Importar archivo schematic.importfile = Importar Archivo
schematic.browseworkshop = Buscar en Steam Workshop schematic.browseworkshop = Buscar en Steam Workshop
schematic.copy = Copiar al portapapeles. schematic.copy = Copiar al portapapeles.
schematic.copy.import = Importar desde el portapapeles. schematic.copy.import = Importar desde el portapapeles.
schematic.shareworkshop = Compartir en Steam Workshop schematic.shareworkshop = Compartir en Steam Workshop
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Girar plantilla schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Girar esquema
schematic.saved = Plantilla guardada. schematic.saved = Esquema guardado.
schematic.delete.confirm = Se borrará ésta plantilla. schematic.delete.confirm = Se borrará éste esquema.
schematic.rename = Renombrar plantilla schematic.rename = Renombrar Esquema
schematic.info = {0}x{1}, {2} bloques schematic.info = {0}x{1}, {2} bloques
schematic.disabled = [scarlet]Plantillas desactivadas.[]\nNo puedes usar plantillas en este [accent]mapa[] o [accent]servidor. schematic.disabled = [scarlet]Esquemas desactivados.[]\nNo puedes usar esquemas en este [accent]mapa[] o [accent]servidor.
schematic.tags = Etiquetas: schematic.tags = Etiquetas:
schematic.edittags = Editar Etiquetas schematic.edittags = Editar Etiquetas
schematic.addtag = Añadir Etiqueta schematic.addtag = Añadir Etiqueta
@@ -78,6 +78,7 @@ schematic.tagexists = Esa etiqueta ya existe.
stats = Estadísticas stats = Estadísticas
stat.wave = Oleadas Derrotadas:[accent] {0} stat.wave = Oleadas Derrotadas:[accent] {0}
stat.unitsCreated = Unidades Creadas:[accent] {0}
stat.enemiesDestroyed = Enemigos Destruidos:[accent] {0} stat.enemiesDestroyed = Enemigos Destruidos:[accent] {0}
stat.built = Estructuras Construidas:[accent] {0} stat.built = Estructuras Construidas:[accent] {0}
stat.destroyed = Estructuras Destruidas:[accent] {0} stat.destroyed = Estructuras Destruidas:[accent] {0}
@@ -93,7 +94,8 @@ level.select = Selección de Nivel
level.mode = Modo de juego: level.mode = Modo de juego:
coreattack = < ¡El núcleo está bajo ataque! > coreattack = < ¡El núcleo está bajo ataque! >
nearpoint = [[ [scarlet]ABANDONA EL PUNTO DE ATERRIZAJE INMEDIATAMENTE[] ]\nRiesgo de aniquilación inminente nearpoint = [[ [scarlet]ABANDONA EL PUNTO DE ATERRIZAJE INMEDIATAMENTE[] ]\nRiesgo de aniquilación inminente
database = Base de datos database = Base de Datos del Núcleo
database.button = Base de Datos
savegame = Guardar Partida savegame = Guardar Partida
loadgame = Cargar Partida loadgame = Cargar Partida
joingame = Unirse a Partida joingame = Unirse a Partida
@@ -168,8 +170,9 @@ launchcore = Lanzar núcleo
filename = Nombre del archivo: filename = Nombre del archivo:
unlocked = ¡Nuevo contenido en la Base de Datos! unlocked = ¡Nuevo contenido en la Base de Datos!
available = ¡Nueva investigación disponible! available = ¡Nueva investigación disponible!
unlock.incampaign = < Desbloquealo en campaña para más detalles >
completed = [accent]Completado completed = [accent]Completado
techtree = Tecnologías techtree = Árbol de Tecnologías
research.legacy = Se han encontrado datos guardados de investigaciones tecnológicas realizadas en la versión [accent]5.0[].\n¿Quieres [accent]cargar estos datos[], o [accent]descartarlos[] para reiniciar los descubrimientos tecnológicos del nuevo modo Campaña? (Recomendado) research.legacy = Se han encontrado datos guardados de investigaciones tecnológicas realizadas en la versión [accent]5.0[].\n¿Quieres [accent]cargar estos datos[], o [accent]descartarlos[] para reiniciar los descubrimientos tecnológicos del nuevo modo Campaña? (Recomendado)
research.load = Cargar research.load = Cargar
research.discard = Descartar research.discard = Descartar
@@ -214,6 +217,7 @@ hosts.none = [lightgray]No se han encontrado partidas en LAN
host.invalid = [scarlet]No se pudo conectar con el anfitrión host.invalid = [scarlet]No se pudo conectar con el anfitrión
servers.local = Servidores Locales servers.local = Servidores Locales
servers.local.steam = Partidas Públicas y Lervidores Locales
servers.remote = Servidores Remotos servers.remote = Servidores Remotos
servers.global = Servidores de la Comunidad servers.global = Servidores de la Comunidad
@@ -316,7 +320,7 @@ data.import.confirm = Importando los datos externos borrará[scarlet] todo[] tu
quit.confirm = ¿Quieres salir de la partida? quit.confirm = ¿Quieres salir de la partida?
quit.confirm.tutorial = ¿Estás seguro de que sabes qué estas haciendo?\nSe puede hacer el tutorial de nuevo en[accent] Ajustes->Juego->Volver a hacer tutorial.[] quit.confirm.tutorial = ¿Estás seguro de que sabes qué estas haciendo?\nSe puede hacer el tutorial de nuevo en[accent] Ajustes->Juego->Volver a hacer tutorial.[]
loading = [accent]Cargando... loading = [accent]Cargando...
reloading = [accent]Recargando mods... downloading = [accent]Descargando...
saving = [accent]Guardando... saving = [accent]Guardando...
respawn = [accent][[{0}][] para reaparecer en el núcleo respawn = [accent][[{0}][] para reaparecer en el núcleo
cancelbuilding = [accent][[{0}][] para limpiar el plan cancelbuilding = [accent][[{0}][] para limpiar el plan
@@ -360,6 +364,7 @@ publish.confirm = ¿Estás seguro de que quieres publicar esto?\n\n[lightgray]¡
publish.error = Error publicando el artículo: {0} publish.error = Error publicando el artículo: {0}
steam.error = Error al inicializar los servicios de Steam.\nError: {0} steam.error = Error al inicializar los servicios de Steam.\nError: {0}
editor.cliffs = Paredes a Colinas
editor.brush = Pincel editor.brush = Pincel
editor.openin = Abrir en el Editor editor.openin = Abrir en el Editor
editor.oregen = Generación de Minerales editor.oregen = Generación de Minerales
@@ -383,6 +388,7 @@ waves.waves = oleada(s)
waves.perspawn = por lugar de aparición waves.perspawn = por lugar de aparición
waves.shields = escudo/oleadas waves.shields = escudo/oleadas
waves.to = hasta waves.to = hasta
waves.max = Oleadas máximas
waves.guardian = Guardián waves.guardian = Guardián
waves.preview = Vista previa waves.preview = Vista previa
waves.edit = Editar... waves.edit = Editar...
@@ -391,6 +397,13 @@ waves.load = Cargar del Portapapeles
waves.invalid = Oleadas inválidaas en el portapapeles. waves.invalid = Oleadas inválidaas en el portapapeles.
waves.copied = Oleadas copiadas. waves.copied = Oleadas copiadas.
waves.none = No hay enemigos definidos.\nNótese que las listas de oleadas vacías se sustituirán por la lista por defecto. waves.none = No hay enemigos definidos.\nNótese que las listas de oleadas vacías se sustituirán por la lista por defecto.
waves.sort = Ordenar por
waves.sort.reverse = Al revés
waves.sort.begin = Inicio
waves.sort.health = Vida
waves.sort.type = Tipo
waves.units.hide = Ocultar Todo
waves.units.show = Mostrar Todo
#Estos están en minúscula intencionadamente. #Estos están en minúscula intencionadamente.
wavemode.counts = limitadas wavemode.counts = limitadas
@@ -537,6 +550,7 @@ configure = Configurar carga inicial
loadout = Carga Inicial loadout = Carga Inicial
resources = Recursos resources = Recursos
bannedblocks = Bloques prohibidos bannedblocks = Bloques prohibidos
bannedunits = Unidades prohibidas
addall = Añadir todo addall = Añadir todo
launch.from = Lanzando desde: [accent]{0} launch.from = Lanzando desde: [accent]{0}
launch.destination = Destino: {0} launch.destination = Destino: {0}
@@ -561,6 +575,8 @@ weather.sandstorm.name = Tormenta de arena
weather.sporestorm.name = Tormenta de esporas weather.sporestorm.name = Tormenta de esporas
weather.fog.name = Niebla weather.fog.name = Niebla
sectorlist = Sectores
sectorlist.attacked = {0} Bajo ataque
sectors.unexplored = [lightgray]No explorado sectors.unexplored = [lightgray]No explorado
sectors.resources = Recursos: sectors.resources = Recursos:
sectors.production = Producción: sectors.production = Producción:
@@ -585,7 +601,7 @@ sector.missingresources = [scarlet]Recursos Insuficientes
sector.attacked = Sector [accent]{0}[white] bajo ataque[]! sector.attacked = Sector [accent]{0}[white] bajo ataque[]!
sector.lost = ¡Sector [accent]{0}[white] perdido[]! sector.lost = ¡Sector [accent]{0}[white] perdido[]!
#nota: el espacio en blanco en la línea siguiente es intencionado #nota: el espacio en blanco en la línea siguiente es intencionado
sector.captured = ¡Sector [accent]{0}[white] capturado[]! sector.captured = ¡Sector [accent]{0}[white] capturado!
sector.changeicon = Cambiar Icono sector.changeicon = Cambiar Icono
threat.low = Baja threat.low = Baja
@@ -615,6 +631,8 @@ sector.biomassFacility.name = Centro de Sintetización de Biomasa
sector.windsweptIslands.name = Islas Windswept sector.windsweptIslands.name = Islas Windswept
sector.extractionOutpost.name = Puesto de avanzada de Extracción sector.extractionOutpost.name = Puesto de avanzada de Extracción
sector.planetaryTerminal.name = Terminal de Lanzamiento Interplanetario sector.planetaryTerminal.name = Terminal de Lanzamiento Interplanetario
sector.coastline.name = Línea Costera
sector.navalFortress.name = Fortaleza Naval
sector.groundZero.description = La ubicación adecuada para empezar una vez más. Amenaza enemiga baja. Pocos recursos.\nReúna la mayor cantidad de plomo y cobre posible y sigue adelante. sector.groundZero.description = La ubicación adecuada para empezar una vez más. Amenaza enemiga baja. Pocos recursos.\nReúna la mayor cantidad de plomo y cobre posible y sigue adelante.
sector.frozenForest.description = Incluso aquí, más cerca de las montañas, las esporas se han extendido. Las gélidas temperaturas no las contendrán para siempre.\n\nAprende a usar la energía. Construye generadores de combustión. Aprende a usar reparadores. sector.frozenForest.description = Incluso aquí, más cerca de las montañas, las esporas se han extendido. Las gélidas temperaturas no las contendrán para siempre.\n\nAprende a usar la energía. Construye generadores de combustión. Aprende a usar reparadores.
@@ -642,10 +660,12 @@ status.sapped.name = Debilitado
status.electrified.name = Electrificado status.electrified.name = Electrificado
status.spore-slowed.name = Ralentizado status.spore-slowed.name = Ralentizado
status.tarred.name = Alquitranado status.tarred.name = Alquitranado
status.overdrive.name = Sobremarcha
status.overclock.name = Sobrecargado status.overclock.name = Sobrecargado
status.shocked.name = Aturdido status.shocked.name = Aturdido
status.blasted.name = Explotado status.blasted.name = Explotado
status.unmoving.name = Inmóvil status.unmoving.name = Inmóvil
status.boss.name = Guardián
settings.language = Idioma settings.language = Idioma
settings.data = Datos del Juego settings.data = Datos del Juego
@@ -770,6 +790,7 @@ bar.corereq = Necesitas un núcleo base
bar.drillspeed = Velocidad del Taladro: {0}/s bar.drillspeed = Velocidad del Taladro: {0}/s
bar.pumpspeed = Velocidad de bombeado: {0}/s bar.pumpspeed = Velocidad de bombeado: {0}/s
bar.efficiency = Eficiencia: {0}% bar.efficiency = Eficiencia: {0}%
bar.boost = Aceleración: +{0}%
bar.powerbalance = Energía: {0} bar.powerbalance = Energía: {0}
bar.powerstored = Almacenados: {0}/{1} bar.powerstored = Almacenados: {0}/{1}
bar.poweramount = Energía: {0} bar.poweramount = Energía: {0}
@@ -832,6 +853,7 @@ category.items = Objetos
category.crafting = Fabricación category.crafting = Fabricación
category.function = Función category.function = Función
category.optional = Mejoras Opcionales category.optional = Mejoras Opcionales
setting.skipcoreanimation.name = Saltar animación de Lanzamiento/Aterrizaje del Núcleo
setting.landscape.name = Bloquear modo horizontal setting.landscape.name = Bloquear modo horizontal
setting.shadows.name = Sombras setting.shadows.name = Sombras
setting.blockreplace.name = Sugerir bloques al construir setting.blockreplace.name = Sugerir bloques al construir
@@ -872,7 +894,9 @@ setting.saveinterval.name = Intervalo del Autoguardado
setting.seconds = {0} segundos setting.seconds = {0} segundos
setting.milliseconds = {0} milisegundos setting.milliseconds = {0} milisegundos
setting.fullscreen.name = Pantalla Completa setting.fullscreen.name = Pantalla Completa
setting.borderlesswindow.name = Ventana sin Bordes[lightgray] (podría requerir un reinicio) setting.borderlesswindow.name = Ventana sin Bordes[lightgray]
setting.borderlesswindow.name.windows = Pantalla Completa sin Bordes
setting.borderlesswindow.description = Un reinicio podría ser requerido para aplicar cambios.
setting.fps.name = Mostrar FPS y Ping setting.fps.name = Mostrar FPS y Ping
setting.smoothcamera.name = Movimiento de cámara suave setting.smoothcamera.name = Movimiento de cámara suave
setting.vsync.name = VSync (Limita los fps a los Hz de tu pantalla) setting.vsync.name = VSync (Limita los fps a los Hz de tu pantalla)
@@ -995,6 +1019,8 @@ rules.wavetimer = Temporizador de Oleadas
rules.waves = Oleadas rules.waves = Oleadas
rules.attack = Asalto rules.attack = Asalto
rules.buildai = Contrucción de IA rules.buildai = Contrucción de IA
rules.aitier = Nivel de IA
rules.cleanupdeadteams = Limpiar las construcciones de enemigos derrotados (PvP)
rules.corecapture = Capturar Núcleo al Destruirlo rules.corecapture = Capturar Núcleo al Destruirlo
rules.polygoncoreprotection = Protección de Núcleo Poligonal rules.polygoncoreprotection = Protección de Núcleo Poligonal
rules.enemyCheat = La IA (Equipo Rojo) tiene recursos infinitos rules.enemyCheat = La IA (Equipo Rojo) tiene recursos infinitos
@@ -1013,12 +1039,15 @@ rules.deconstructrefundmultiplier = Multiplicador de devolución de desconstrucc
rules.waitForWaveToEnd = Las oleadas esperan a los enemigos rules.waitForWaveToEnd = Las oleadas esperan a los enemigos
rules.dropzoneradius = Radio de zona de caída:[lightgray] (casillas) rules.dropzoneradius = Radio de zona de caída:[lightgray] (casillas)
rules.unitammo = Las unidades necesitan munición rules.unitammo = Las unidades necesitan munición
rules.enemyteam = Equipo Enemigo
rules.playerteam = Equipo del jugador
rules.title.waves = Oleadas rules.title.waves = Oleadas
rules.title.resourcesbuilding = Recursos y Construcción rules.title.resourcesbuilding = Recursos y Construcción
rules.title.enemy = Enemigos rules.title.enemy = Enemigos
rules.title.unit = Unidades rules.title.unit = Unidades
rules.title.experimental = Experimental rules.title.experimental = Experimental
rules.title.environment = Entorno rules.title.environment = Entorno
rules.title.teams = Equipos
rules.lighting = Iluminación rules.lighting = Iluminación
rules.enemyLights = Luces enemigas rules.enemyLights = Luces enemigas
rules.fire = Fuego rules.fire = Fuego
@@ -1097,7 +1126,6 @@ unit.reign.name = Reign
unit.vela.name = Vela unit.vela.name = Vela
unit.corvus.name = Corvus unit.corvus.name = Corvus
block.resupply-point.name = Punto de reabastecimiento
block.parallax.name = Parallax block.parallax.name = Parallax
block.cliff.name = Pared block.cliff.name = Pared
block.sand-boulder.name = Roca de arena block.sand-boulder.name = Roca de arena
@@ -1137,6 +1165,7 @@ block.core-nucleus.name = Núcleo: Nucleus
block.deep-water.name = Aguas profundas block.deep-water.name = Aguas profundas
block.shallow-water.name = Agua block.shallow-water.name = Agua
block.tainted-water.name = Agua contaminada block.tainted-water.name = Agua contaminada
block.deep-tainted-water.name = Agua profunda contaminada
block.darksand-tainted-water.name = Agua contaminada con arena oscura block.darksand-tainted-water.name = Agua contaminada con arena oscura
block.tar.name = Alquitrán block.tar.name = Alquitrán
block.stone.name = Piedra block.stone.name = Piedra
@@ -1400,7 +1429,6 @@ liquid.slag.description = Diferentes tipos de metales fundidos mezclados. Puede
liquid.oil.description = Se utiliza en producción de materiales avanzados, y en munición incendiaria. liquid.oil.description = Se utiliza en producción de materiales avanzados, y en munición incendiaria.
liquid.cryofluid.description = Usado como refrigerante para reactores, torretas, y fábricas. liquid.cryofluid.description = Usado como refrigerante para reactores, torretas, y fábricas.
block.resupply-point.description = Reabastece unidades cercanas con munición de cobre. No es compatible con unidades que requieren energía.
block.armored-conveyor.description = Mueve objetos. No acepta objetos si entran por los lados. block.armored-conveyor.description = Mueve objetos. No acepta objetos si entran por los lados.
block.illuminator.description = Emite luz. block.illuminator.description = Emite luz.
block.message.description = Almacena un mensaje. Puedes usarlo para comunicarte con aliados o dejar recordatorios. block.message.description = Almacena un mensaje. Puedes usarlo para comunicarte con aliados o dejar recordatorios.
@@ -1420,12 +1448,14 @@ block.spore-press.description = Comprime esporas en petróleo.
block.pulverizer.description = Despedaza la chatarra en arena. Útil cuando no hay arena natural. block.pulverizer.description = Despedaza la chatarra en arena. Útil cuando no hay arena natural.
block.coal-centrifuge.description = Solidifica petróleo en piezas de carbón. block.coal-centrifuge.description = Solidifica petróleo en piezas de carbón.
block.incinerator.description = Se deshace de cualquier líquido o material producido en exceso. block.incinerator.description = Se deshace de cualquier líquido o material producido en exceso.
block.power-void.description = Elimina toda la energía que se le da. Solo en disponible en el modo Libre. block.power-void.description = Elimina toda la energía que se le da. Solo disponible en el modo Libre.
block.power-source.description = Da energía infinita. Solo disponible en el modo Libre. block.power-source.description = Da energía infinita. Solo disponible en el modo Libre.
block.item-source.description = Hace aparecer minerales de forma infinita. Solo disponible en el modo Libre. block.item-source.description = Genera objetos de forma infinita. Solo disponible en el modo Libre.
block.item-void.description = Destruye cuanquier objeto que entra en él. Solo disponible en el modo Libre. block.item-void.description = Destruye los objetos que entran en él. Solo disponible en el modo Libre.
block.liquid-source.description = Da líquido infinito. Solo disponible en el modo Libre. block.liquid-source.description = Genera líquido infinito. Solo disponible en el modo Libre.
block.liquid-void.description = Elimina cualquier liquido que entra en él. Solo disponible en el modo Libre. block.liquid-void.description = Elimina los liquidos que entran en él. Solo disponible en el modo Libre.
block.payload-source.description = Genera salidas de cargas infinitas. Solo disponible en el modo Libre.
block.payload-void.description = Destruye cualquier carga. Solo disponible en el modo Libre.
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.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.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.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.
@@ -1578,6 +1608,11 @@ unit.omura.description = Dispara rayos contínuos perforantes. Construye unidade
unit.alpha.description = Defiende el núcleo Shard de los enemigos. Construye estructuras. unit.alpha.description = Defiende el núcleo Shard de los enemigos. Construye estructuras.
unit.beta.description = Defiende el núcleo Foundation de los enemigos. Construye estructuras. unit.beta.description = Defiende el núcleo Foundation de los enemigos. Construye estructuras.
unit.gamma.description = Defiende el núcleo Nucleus de los enemigos. Construye estructuras. unit.gamma.description = Defiende el núcleo Nucleus de los enemigos. Construye estructuras.
unit.retusa.description = Coloca minas de proximidad. Repara unidades aliadas.
unit.oxynoe.description = Dispara llamaradas de fuego que reparan estructuras aliadas y daña unidades enemigas cercanas. Destruye proyectiles enemigos cercanos con una torreta de defensa precisa.
unit.cyerce.description = Dispara misiles rastreadores en grupos. Repara unidades aliadas.
unit.aegires.description = Impacta a todas las unidades y estructuras enemigas que entran en su campo de energía y repara a las aliadas.
unit.navanax.description = Dispara proyectiles EMP explosivos que infligen un daño significativo a las redes eléctricas enemigas y reparan las estructuras aliadas. Derrite a los enemigos cercanos con 4 torretas láser autónomas.
lst.read = Lee un número desde una unidad de memoria conectada. lst.read = Lee un número desde una unidad de memoria conectada.
lst.write = Escribe un número en una unidad de memoria conectada. lst.write = Escribe un número en una unidad de memoria conectada.

View File

@@ -93,6 +93,7 @@ level.mode = Mode de jeu :
coreattack = [scarlet]< Le Noyau est attaqué ! > coreattack = [scarlet]< Le Noyau est attaqué ! >
nearpoint = [[ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nannihilation imminente nearpoint = [[ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nannihilation imminente
database = Base de données database = Base de données
database.button = Base de données
savegame = Sauvegarder la partie savegame = Sauvegarder la partie
loadgame = Charger une partie loadgame = Charger une partie
joingame = Rejoindre une partie joingame = Rejoindre une partie
@@ -168,6 +169,7 @@ launchcore = Lancer le Noyau
filename = Nom du fichier : filename = Nom du fichier :
unlocked = Nouveau contenu débloqué ! unlocked = Nouveau contenu débloqué !
available = Nouvelle recherche disponible ! available = Nouvelle recherche disponible !
unlock.incampaign = < Débloquer dans la campagne pour plus de détails >
completed = [accent]Complété completed = [accent]Complété
techtree = Arbre technologique techtree = Arbre technologique
research.legacy = Des données de recherche de la [accent]5.0[] ont été trouvées.\nVoulez-vous [accent]charger ces données[] ou [accent]les ignorer[] et recommencer la recherche dans la nouvelle campagne ? (recommandé) research.legacy = Des données de recherche de la [accent]5.0[] ont été trouvées.\nVoulez-vous [accent]charger ces données[] ou [accent]les ignorer[] et recommencer la recherche dans la nouvelle campagne ? (recommandé)
@@ -393,6 +395,13 @@ waves.load = Coller depuis le presse-papiers
waves.invalid = Vagues invalides dans le presse-papiers. waves.invalid = Vagues invalides dans le presse-papiers.
waves.copied = Vagues copiées waves.copied = Vagues copiées
waves.none = Aucun ennemi défini.\nNotez que les vagues vides seront automatiquement remplacées par une vague générée par défaut. waves.none = Aucun ennemi défini.\nNotez que les vagues vides seront automatiquement remplacées par une vague générée par défaut.
waves.sort = Trier Par
waves.sort.reverse = Tri inversé
waves.sort.begin = Commence par
waves.sort.health = Santé
waves.sort.type = Type
waves.units.hide = Tout masquer
waves.units.show = Tout afficher
#these are intentionally in lower case #these are intentionally in lower case
wavemode.counts = compte wavemode.counts = compte
@@ -618,6 +627,8 @@ sector.biomassFacility.name = Biomass Synthesis Facility
sector.windsweptIslands.name = Windswept Islands sector.windsweptIslands.name = Windswept Islands
sector.extractionOutpost.name = Extraction Outpost sector.extractionOutpost.name = Extraction Outpost
sector.planetaryTerminal.name = Planetary Launch Terminal sector.planetaryTerminal.name = Planetary Launch Terminal
sector.coastline.name = Coastline
sector.navalFortress.name = Naval Fortress
sector.groundZero.description = Un endroit optimal pour commencer. Avec une menace ennemie faible et le peu de ressources disponibles, rassemblez autant de cuivre et de plomb que possible pour continuer votre exploration. sector.groundZero.description = Un endroit optimal pour commencer. Avec une menace ennemie faible et le peu de ressources disponibles, rassemblez autant de cuivre et de plomb que possible pour continuer votre exploration.
sector.frozenForest.description = Même ici, près des montagnes, les spores se sont propagées. Les températures glaciales ne pourront pas les contenir indéfiniment.\n\nCommencez votre production d'énergie en construisant des générateurs à combustion et apprenez à utiliser les bâtiments de soin. sector.frozenForest.description = Même ici, près des montagnes, les spores se sont propagées. Les températures glaciales ne pourront pas les contenir indéfiniment.\n\nCommencez votre production d'énergie en construisant des générateurs à combustion et apprenez à utiliser les bâtiments de soin.
@@ -646,6 +657,7 @@ status.sapped.name = Sapé
status.electrified.name = Electrifié status.electrified.name = Electrifié
status.spore-slowed.name = Spore ralentie status.spore-slowed.name = Spore ralentie
status.tarred.name = Goudronné status.tarred.name = Goudronné
status.overdrive.name = Surmultiplié
status.overclock.name = Surcadençage status.overclock.name = Surcadençage
status.shocked.name = Étourdie status.shocked.name = Étourdie
status.blasted.name = Foudroyé status.blasted.name = Foudroyé
@@ -1151,9 +1163,10 @@ block.spawn.name = Point d'Apparition Ennemi
block.core-shard.name = Noyau: Fragment block.core-shard.name = Noyau: Fragment
block.core-foundation.name = Noyau: Fondation block.core-foundation.name = Noyau: Fondation
block.core-nucleus.name = Noyau: Épicentre block.core-nucleus.name = Noyau: Épicentre
block.deep-water.name = Eau profonde block.deep-water.name = Eau Profonde
block.shallow-water.name = Eau block.shallow-water.name = Eau
block.tainted-water.name = Eau Contaminée block.tainted-water.name = Eau Contaminée
block.deep-tainted-water.name = Eau Profonde Contaminée
block.darksand-tainted-water.name = Eau Contaminée avec fond de Sable sombre block.darksand-tainted-water.name = Eau Contaminée avec fond de Sable sombre
block.tar.name = Goudron block.tar.name = Goudron
block.stone.name = Roche block.stone.name = Roche
@@ -1387,6 +1400,7 @@ hint.generator = \uf879 Les [accent]Générateurs à combustion[] brûlent du Ch
hint.guardian = Les [accent]Gardiens[] sont protégés par un bouclier. Les munitions faibles telles que le [accent]Cuivre[] et le [accent]Plomb[] ne seront [scarlet]pas efficaces[].\n\nUtilisez des tourelles de plus haut niveau, ou de meilleures munitions comme le \uf835 [accent]Graphite[] avec un \uf861Duo/\uf859Salve pour pouvoir tuer le gardien. hint.guardian = Les [accent]Gardiens[] sont protégés par un bouclier. Les munitions faibles telles que le [accent]Cuivre[] et le [accent]Plomb[] ne seront [scarlet]pas efficaces[].\n\nUtilisez des tourelles de plus haut niveau, ou de meilleures munitions comme le \uf835 [accent]Graphite[] avec un \uf861Duo/\uf859Salve pour pouvoir tuer le gardien.
hint.coreUpgrade = Les Noyaux peuvent être améliorés [accent]en plaçant un Noyau de plus haut niveau sur eux[].\n\nPlacez un  Noyau [accent]Fondation[] sur le  Noyau [accent]Fragment[]. Soyez sûrs que rien n'obstrue la construction. hint.coreUpgrade = Les Noyaux peuvent être améliorés [accent]en plaçant un Noyau de plus haut niveau sur eux[].\n\nPlacez un  Noyau [accent]Fondation[] sur le  Noyau [accent]Fragment[]. Soyez sûrs que rien n'obstrue la construction.
hint.presetLaunch = Les [accent]secteurs[] gris, tels que [accent]Frozen Forest[], peuvent être lançés de n'importe où. Ils ne requièrent pas la capture d'un secteur adjacent.\n\n[accent]Il y a beaucoup de secteurs[] comme celui-ci, qui sont [accent]optionels[]. hint.presetLaunch = Les [accent]secteurs[] gris, tels que [accent]Frozen Forest[], peuvent être lançés de n'importe où. Ils ne requièrent pas la capture d'un secteur adjacent.\n\n[accent]Il y a beaucoup de secteurs[] comme celui-ci, qui sont [accent]optionels[].
hint.presetDifficulty = Ce secteur a un niveau de menace ennemi [scarlet]élevé[].\nIl n'est [accent]pas recommandé[] de se lancer dans de tels secteurs sans la technologie et la préparation appropriées.
hint.coreIncinerate = Lorsqu'un Noyau est rempli d'une ressource en particulier, le surplus qui rentrera dans celui-ci sera [accent]incinéré[]. hint.coreIncinerate = Lorsqu'un Noyau est rempli d'une ressource en particulier, le surplus qui rentrera dans celui-ci sera [accent]incinéré[].
hint.coopCampaign = Quand vous jouez en [accent]campagne multijoueur[], les ressources produites dans le secteur dans lequel vous jouez sera aussi envoyé [accent]dans vos secteurs[].\n\nLes recherches faites par l'hôte sont aussi partagées. hint.coopCampaign = Quand vous jouez en [accent]campagne multijoueur[], les ressources produites dans le secteur dans lequel vous jouez sera aussi envoyé [accent]dans vos secteurs[].\n\nLes recherches faites par l'hôte sont aussi partagées.

View File

@@ -85,7 +85,7 @@ stat.destroyed = 破壊した建造物数:[accent] {0}
stat.deconstructed = 解体した建造物数:[accent] {0} stat.deconstructed = 解体した建造物数:[accent] {0}
stat.playtime = プレイ時間:[accent] {0} stat.playtime = プレイ時間:[accent] {0}
globalitems = [accent]グローバルアイテム globalitems = [accent]トータルアイテム
map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか? map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか?
level.highscore = ハイスコア: [accent]{0} level.highscore = ハイスコア: [accent]{0}
level.select = レベル選択 level.select = レベル選択
@@ -93,6 +93,7 @@ level.mode = ゲームモード:
coreattack = < コアが攻撃を受けています! > coreattack = < コアが攻撃を受けています! >
nearpoint = [[ [scarlet]直ちに出現ポイントより離脱せよ[] ]\n殲滅されます nearpoint = [[ [scarlet]直ちに出現ポイントより離脱せよ[] ]\n殲滅されます
database = コアデータベース database = コアデータベース
database.button = データベース
savegame = 保存 savegame = 保存
loadgame = 読み込む loadgame = 読み込む
joingame = マルチプレイ joingame = マルチプレイ
@@ -121,12 +122,12 @@ committingchanges = 変更を適応中
done = 完了 done = 完了
feature.unsupported = あなたのデバイスはこの機能をサポートしていません。 feature.unsupported = あなたのデバイスはこの機能をサポートしていません。
mods.initfailed = [red]⚠[] 以前のMindustryの初期化に失敗しました。おそらくModの誤作動が原因です。\n\nクラッシュループを防ぐために、[red]全てのModが無効になっています。[]\n\nこの機能を無効にするのは、[accent]設定->ゲーム->起動時にクラッシュした場合にModを無効にする[]をオフにします。 mods.initfailed = [red]⚠[] 以前のMindustryの初期化に失敗しました。\nおそらくModの誤作動が原因です。\n\nクラッシュループを防ぐために、[red]全てのModが無効になっています。[]\n\nこの機能を無効にするのは、[accent]設定->ゲーム->起動時にクラッシュした場合にModを無効にする[]をオフにします。
mods = Mods mods = Mods
mods.none = [lightgray]Modが見つかりませんでした! mods.none = [lightgray]Modが見つかりませんでした!
mods.guide = Mod作成ガイド mods.guide = Mod作成ガイド
mods.report = バグを報告する mods.report = バグを報告する
mods.openfolder = Modフォルダを開く mods.openfolder = Modフォルダを開く
mods.viewcontent = コンテンツを見る mods.viewcontent = コンテンツを見る
mods.reload = 再読み込み mods.reload = 再読み込み
mods.reloadexit = Modを読み込む為にゲームを再起動します。 mods.reloadexit = Modを読み込む為にゲームを再起動します。
@@ -168,6 +169,7 @@ launchcore = コアを打ち上げる
filename = ファイル名: filename = ファイル名:
unlocked = 新しい要素をアンロック! unlocked = 新しい要素をアンロック!
available = 新しい研究が利用可能です! available = 新しい研究が利用可能です!
unlock.incampaign = < 詳細はキャンペーンでアンロックしてください >
completed = [accent]完了 completed = [accent]完了
techtree = テックツリー techtree = テックツリー
research.legacy = [accent]5.0[] の研究データが見つかりました。\n[accent]このデータを読み込みますか?[] それとも、[accent]破棄して新しいキャンペーンで研究をやり直しますか?[](推奨) research.legacy = [accent]5.0[] の研究データが見つかりました。\n[accent]このデータを読み込みますか?[] それとも、[accent]破棄して新しいキャンペーンで研究をやり直しますか?[](推奨)
@@ -361,6 +363,7 @@ publish.confirm = 公開してもよろしいですか?\n\n[lightgray]最初
publish.error = 公開中のエラー: {0} publish.error = 公開中のエラー: {0}
steam.error = Steam サービスの初期化に失敗しました。\nエラー: {0} steam.error = Steam サービスの初期化に失敗しました。\nエラー: {0}
editor.cliffs = 壁を崖にする
editor.brush = ブラシ editor.brush = ブラシ
editor.openin = エディターで開く editor.openin = エディターで開く
editor.oregen = 鉱石の生成 editor.oregen = 鉱石の生成
@@ -393,6 +396,13 @@ waves.load = クリップボードから読み込む
waves.invalid = クリップボードのウェーブは無効なウェーブです。 waves.invalid = クリップボードのウェーブは無効なウェーブです。
waves.copied = ウェーブをコピーしました。 waves.copied = ウェーブをコピーしました。
waves.none = 敵が定義されていません。\n空のウェーブレイアウトはデフォルトのレイアウトに自動的に置き換えられます。 waves.none = 敵が定義されていません。\n空のウェーブレイアウトはデフォルトのレイアウトに自動的に置き換えられます。
waves.sort = 昇順
waves.sort.reverse = 降順
waves.sort.begin = 開始
waves.sort.health = 体力
waves.sort.type = タイプ
waves.units.hide = すべて非表示
aves.units.show = すべて表示
#these are intentionally in lower case #these are intentionally in lower case
wavemode.counts = wavemode.counts =
@@ -447,19 +457,19 @@ editor.exists = すでに同じ名前のマップが存在します。
editor.selectmap = 読み込むマップを選択: editor.selectmap = 読み込むマップを選択:
toolmode.replace = 置換 toolmode.replace = 置換
toolmode.replace.description = 固体ブロックのみに描きます toolmode.replace.description = 同系統のブロックのみを置換する
toolmode.replaceall = 全て置換 toolmode.replaceall = 全て置換
toolmode.replaceall.description = このマップにあるすべてのブロックを置き換えます toolmode.replaceall.description = マップ内の同ブロックをすべて置換する
toolmode.orthogonal = toolmode.orthogonal = 水平垂
toolmode.orthogonal.description = 直角の線を描きます。 toolmode.orthogonal.description = 水平もしくは垂直に線を描きます。
toolmode.square = 四角形 toolmode.square = 四角形
toolmode.square.description = 四角形のブラシです。 toolmode.square.description = 四角形のブラシです。
toolmode.eraseores = 鉱石消しゴム toolmode.eraseores = 鉱石消しゴム
toolmode.eraseores.description = 鉱石のみを消します。 toolmode.eraseores.description = 鉱石のみを消します。(敵の出現場所含む)
toolmode.fillteams = チームで埋める toolmode.fillteams = チームを変更
toolmode.fillteams.description = ブロックの代わりにチームで埋めます。 toolmode.fillteams.description = ブロックの所属チームを上書きします。
toolmode.drawteams = チームを描く toolmode.drawteams = チームを変更
toolmode.drawteams.description = ブロックの代わりにチームを描きます。 toolmode.drawteams.description = ブロックの所属チームを上書きします。
filters.empty = [lightgray]フィルターが設定されていません! 下のボタンからフィルターを追加してください。 filters.empty = [lightgray]フィルターが設定されていません! 下のボタンからフィルターを追加してください。
@@ -475,7 +485,7 @@ filter.defaultores = デフォルトの鉱石
filter.ore = 鉱石 filter.ore = 鉱石
filter.rivernoise = 川の生成 filter.rivernoise = 川の生成
filter.mirror = 反転 filter.mirror = 反転
filter.clear = クリア filter.clear = クリア
filter.option.ignore = 無視 filter.option.ignore = 無視
filter.scatter = 分散 filter.scatter = 分散
filter.terrain = 地形 filter.terrain = 地形
@@ -582,7 +592,7 @@ sectors.nonelaunch = [lightgray]無し (sun)
sectors.rename = セクター名を変更 sectors.rename = セクター名を変更
sectors.enemybase = [scarlet]敵基地 sectors.enemybase = [scarlet]敵基地
sectors.vulnerable = [scarlet]脆弱 sectors.vulnerable = [scarlet]脆弱
sectors.underattack = [scarlet]攻撃を受けます! [accent]{0}% 破損 sectors.underattack = [scarlet]攻撃を受けています! [accent]{0}% 破損
sectors.survives = [accent]{0} ウェーブ生存 sectors.survives = [accent]{0} ウェーブ生存
sectors.go = Go sectors.go = Go
sector.curcapture = 制圧したセクター sector.curcapture = 制圧したセクター
@@ -621,6 +631,8 @@ sector.biomassFacility.name = バイオマス · シンテシス · ファシリ
sector.windsweptIslands.name = ウインドスイープト · アイランズ sector.windsweptIslands.name = ウインドスイープト · アイランズ
sector.extractionOutpost.name = エクストラクション · アウトポスト sector.extractionOutpost.name = エクストラクション · アウトポスト
sector.planetaryTerminal.name = プラネタリー · ローンチ · ターミナル sector.planetaryTerminal.name = プラネタリー · ローンチ · ターミナル
sector.coastline.name = 海岸線
sector.navalFortress.name = 海軍要塞
sector.groundZero.description = 奪回を始めるには最適な場所です。敵脅威は低いですが、資源が乏しいです。\nできるだけ多くの銅と鉛を集めます。\n始めましょう。 sector.groundZero.description = 奪回を始めるには最適な場所です。敵脅威は低いですが、資源が乏しいです。\nできるだけ多くの銅と鉛を集めます。\n始めましょう。
sector.frozenForest.description = ここでさえ、山に近づくほど胞子が広がっています。\n極寒の気温もそれらを永遠に封じ込めることはできませんでした。\n\n電気に挑みましょう。\n火力発電機を建設し、修復機の使い方を学びましょう。 sector.frozenForest.description = ここでさえ、山に近づくほど胞子が広がっています。\n極寒の気温もそれらを永遠に封じ込めることはできませんでした。\n\n電気に挑みましょう。\n火力発電機を建設し、修復機の使い方を学びましょう。
@@ -648,6 +660,7 @@ status.sapped.name = 吸収
status.electrified.name = 帯電 status.electrified.name = 帯電
status.spore-slowed.name = 鈍化胞子 status.spore-slowed.name = 鈍化胞子
status.tarred.name = 石油塗れ status.tarred.name = 石油塗れ
status.overdrive.name = オーバードライブ
status.overclock.name = オーバークロック status.overclock.name = オーバークロック
status.shocked.name = 電撃 status.shocked.name = 電撃
status.blasted.name = 爆破 status.blasted.name = 爆破
@@ -904,7 +917,7 @@ setting.savecreate.name = 自動保存
setting.publichost.name = 誰でもゲームに参加できるようにする setting.publichost.name = 誰でもゲームに参加できるようにする
setting.playerlimit.name = プレイヤー数制限 setting.playerlimit.name = プレイヤー数制限
setting.chatopacity.name = チャットの透明度 setting.chatopacity.name = チャットの透明度
setting.lasersopacity.name = レーザーの透明度 setting.lasersopacity.name = 電線の透明度
setting.bridgeopacity.name = ブリッジの透明度 setting.bridgeopacity.name = ブリッジの透明度
setting.playerchat.name = ゲーム内にチャットを表示 setting.playerchat.name = ゲーム内にチャットを表示
setting.showweather.name = 天気のグラフィックを表示 setting.showweather.name = 天気のグラフィックを表示
@@ -990,14 +1003,14 @@ keybind.drop_unit.name = ドロップユニット
keybind.zoom_minimap.name = ミニマップのズーム keybind.zoom_minimap.name = ミニマップのズーム
mode.help.title = モード説明 mode.help.title = モード説明
mode.survival.name = サバイバル mode.survival.name = サバイバル
mode.survival.description = 通常のモードです。 資源も限られる中、自動的にウェーブが進行していきます。\n[gray]プレイするには、マップに敵出現する必要があります。 mode.survival.description = 通常のモードです。資源も限られる中、自動的にウェーブが進行していきます。\n[gray]マップに敵出現設定が必要です。
mode.sandbox.name = サンドボックス mode.sandbox.name = サンドボックス
mode.sandbox.description = 無限の資源があり、ウェーブを自由に進行できます。 mode.sandbox.description = 無限の資源があり、ウェーブを自由に進行できます。
mode.editor.name = エディター mode.editor.name = エディター
mode.pvp.name = PvP mode.pvp.name = PvP
mode.pvp.description = エリア内で他のプレイヤーと戦います。\n[gray]プレイするには、マップに少なくとも二つの異なる色のコアが必要です。 mode.pvp.description = エリア内で他のプレイヤーと戦います。\n[gray]マップに少なくとも異なる2色のコアが必要です。
mode.attack.name = アタック mode.attack.name = アタック
mode.attack.description = ウェーブがなく、敵の基地を破壊することを目指します。\n[gray]プレイするには、マップに赤色のコアが必要です。 mode.attack.description = ウェーブがなく、敵の基地を破壊することを目指します。\n[gray]マップに赤色のコアが必要です。
mode.custom = カスタムルール mode.custom = カスタムルール
rules.infiniteresources = 資源の無限化 rules.infiniteresources = 資源の無限化
@@ -1019,7 +1032,7 @@ rules.unitbuildspeedmultiplier = ユニットの製造速度倍率
rules.unithealthmultiplier = ユニットの体力倍率 rules.unithealthmultiplier = ユニットの体力倍率
rules.unitdamagemultiplier = ユニットのダメージ倍率 rules.unitdamagemultiplier = ユニットのダメージ倍率
rules.unitcapvariable = コア数によってユニット上限を変動 rules.unitcapvariable = コア数によってユニット上限を変動
rules.unitcap = ベースのユニット上限数 rules.unitcap = 基礎ユニット上限数
rules.enemycorebuildradius = 敵コア周辺の建設禁止区域の半径:[lightgray] (タイル) rules.enemycorebuildradius = 敵コア周辺の建設禁止区域の半径:[lightgray] (タイル)
rules.wavespacing = ウェーブ間の待機時間:[lightgray] (秒) rules.wavespacing = ウェーブ間の待機時間:[lightgray] (秒)
rules.buildcostmultiplier = 建設コストの倍率 rules.buildcostmultiplier = 建設コストの倍率
@@ -1153,7 +1166,8 @@ block.core-foundation.name = コア: ファンデーション
block.core-nucleus.name = コア: ニュークリアス block.core-nucleus.name = コア: ニュークリアス
block.deep-water.name = 深層水 block.deep-water.name = 深層水
block.shallow-water.name = block.shallow-water.name =
block.tainted-water.name = れた block.tainted-water.name = 汚水
block.deep-tainted-water.name = 深層汚水
block.darksand-tainted-water.name = 黒い砂で汚れた水 block.darksand-tainted-water.name = 黒い砂で汚れた水
block.tar.name = タール block.tar.name = タール
block.stone.name = block.stone.name =
@@ -1388,6 +1402,7 @@ hint.generator = \uf879 [accent]火力発電機[]石炭を燃やし、隣接す
hint.guardian = [accent]ガーディアン[]ユニットは装甲を搭載しています。[accent]銅[]や[accent]鉛[]などの弱い弾薬は[scarlet]効果がありません[]。\n\n強力なターレット、または\uf861デュオ/\uf859サルボーの弾薬に\uf835 [accent]黒鉛[]を使用してガーディアンを撃破してください。 hint.guardian = [accent]ガーディアン[]ユニットは装甲を搭載しています。[accent]銅[]や[accent]鉛[]などの弱い弾薬は[scarlet]効果がありません[]。\n\n強力なターレット、または\uf861デュオ/\uf859サルボーの弾薬に\uf835 [accent]黒鉛[]を使用してガーディアンを撃破してください。
hint.coreUpgrade = コアは [accent]上位のコアを配置することでアップグレードできます[]。\n\n  [accent]シャード[]コアの上に、  [accent]ファンデーション[]コアを置きます。近くに障害物がないことを確認してください。 hint.coreUpgrade = コアは [accent]上位のコアを配置することでアップグレードできます[]。\n\n  [accent]シャード[]コアの上に、  [accent]ファンデーション[]コアを置きます。近くに障害物がないことを確認してください。
hint.presetLaunch = [accent]フローズン · フォレスト[]などの灰色の[accent]着陸ゾーンセクター[]には、どこからでも発射できるため近くの領土を確保する必要はありません。\n\nしかし、このような[accent]数字のセクター[]では[accent]この限りではありません[]。 hint.presetLaunch = [accent]フローズン · フォレスト[]などの灰色の[accent]着陸ゾーンセクター[]には、どこからでも発射できるため近くの領土を確保する必要はありません。\n\nしかし、このような[accent]数字のセクター[]では[accent]この限りではありません[]。
hint.presetDifficulty = このセクターは[scarlet]敵の脅威レベルが高いです[]。\nこのようなセクターへの出撃は、適切な技術と準備なしには[accent]お勧めできません[]。
hint.coreIncinerate = コアのアイテム収納数の上限に達したアイテムは搬入されず[accent]破棄[]されます。 hint.coreIncinerate = コアのアイテム収納数の上限に達したアイテムは搬入されず[accent]破棄[]されます。
hint.coopCampaign = [accent]co-op キャンペーン[]をプレイすると、現在のマップで生産されたアイテムは[accent]あなたのセクター[]に移送されます。\n\nホストが行った新しい研究も引き継がれます。 hint.coopCampaign = [accent]co-op キャンペーン[]をプレイすると、現在のマップで生産されたアイテムは[accent]あなたのセクター[]に移送されます。\n\nホストが行った新しい研究も引き継がれます。

View File

@@ -93,6 +93,7 @@ level.mode = 게임 모드:
coreattack = < 코어가 공격을 받고 있습니다! > coreattack = < 코어가 공격을 받고 있습니다! >
nearpoint = [[ [scarlet]즉시 적 소환구역에서 떠나십시오[] ]\n단계가 시작하는 순간 인근 건물들과 유닛들이 파괴됩니다! nearpoint = [[ [scarlet]즉시 적 소환구역에서 떠나십시오[] ]\n단계가 시작하는 순간 인근 건물들과 유닛들이 파괴됩니다!
database = 코어 데이터베이스 database = 코어 데이터베이스
database.button = 데이터베이스
savegame = 게임 저장 savegame = 게임 저장
loadgame = 게임 불러오기 loadgame = 게임 불러오기
joingame = 게임 참여 joingame = 게임 참여
@@ -168,6 +169,7 @@ launchcore = 코어 출격
filename = 파일 이름: filename = 파일 이름:
unlocked = 새로운 콘텐츠가 해금되었습니다! unlocked = 새로운 콘텐츠가 해금되었습니다!
available = 새로운 콘텐츠 해금이 가능합니다! available = 새로운 콘텐츠 해금이 가능합니다!
unlock.incampaign = < 해금 후 상세정보 열람이 가능합니다 >
completed = [accent]완료됨 completed = [accent]완료됨
techtree = 연구 기록 techtree = 연구 기록
research.legacy = [accent]5.0[] 연구 데이터를 찾았습니다.\n[accent]이 데이터를 불러오시겠습니까?[], 아니면 이 데이터를 무시하고 캠페인을 새로 시작하시겠습니까? [accent]무시한 데이터는 삭제됩니다.[] (권장됨) research.legacy = [accent]5.0[] 연구 데이터를 찾았습니다.\n[accent]이 데이터를 불러오시겠습니까?[], 아니면 이 데이터를 무시하고 캠페인을 새로 시작하시겠습니까? [accent]무시한 데이터는 삭제됩니다.[] (권장됨)
@@ -361,6 +363,7 @@ publish.confirm = 이것을 게시하시겠습니까?[lightgray]창작마당 EUL
publish.error = 아이템 게시 오류: {0} publish.error = 아이템 게시 오류: {0}
steam.error = 스팀 서비스를 초기화하지 못했습니다.\n오류: {0} steam.error = 스팀 서비스를 초기화하지 못했습니다.\n오류: {0}
editor.cliffs = 언덕 전환
editor.brush = 브러쉬 editor.brush = 브러쉬
editor.openin = 편집기 열기 editor.openin = 편집기 열기
editor.oregen = 광물 무작위 생성 editor.oregen = 광물 무작위 생성
@@ -381,10 +384,10 @@ waves.title = 단계
waves.remove = 삭제 waves.remove = 삭제
waves.every = waves.every =
waves.waves = 단계마다 waves.waves = 단계마다
waves.perspawn = 마리씩 생성됨 waves.perspawn = 마리씩
waves.shields = 방어막 hp/단계 waves.shields = 방어막만큼 소환
waves.to = 부터 waves.to = 부터
waves.max = 최대 유닛 수 waves.max = 마리 까지
waves.guardian = 수호자 waves.guardian = 수호자
waves.preview = 미리보기 waves.preview = 미리보기
waves.edit = 편집 waves.edit = 편집
@@ -393,6 +396,13 @@ waves.load = 클립보드에서 불러오기
waves.invalid = 클립보드에 잘못된 단계 데이터가 있습니다. waves.invalid = 클립보드에 잘못된 단계 데이터가 있습니다.
waves.copied = 단계 복사됨. waves.copied = 단계 복사됨.
waves.none = 적 단계가 설정되지 않았습니다.\n비어있을 시 자동으로 기본 적 단계 데이터로 설정됩니다. waves.none = 적 단계가 설정되지 않았습니다.\n비어있을 시 자동으로 기본 적 단계 데이터로 설정됩니다.
waves.sort = 보기 정렬
waves.sort.reverse = 정렬 뒤집기
waves.sort.begin = 시작 단계순
waves.sort.health = 체력순
waves.sort.type = 유닛순
waves.units.hide = 모두 숨기기
waves.units.show = 모두 보이기
#these are intentionally in lower case #these are intentionally in lower case
wavemode.counts = 마리 wavemode.counts = 마리
@@ -409,7 +419,7 @@ editor.teams = 팀
editor.errorload = 파일을 불러오지 못했습니다. editor.errorload = 파일을 불러오지 못했습니다.
editor.errorsave = 파일을 저장하지 못했습니다. editor.errorsave = 파일을 저장하지 못했습니다.
editor.errorimage = 이것은 맵이 아니라 사진입니다. editor.errorimage = 이것은 맵이 아니라 사진입니다.
editor.errorlegacy = 이 맵은 너무 오래되어 더 이상 지원지 않는 구형 맵 형식을 사용합니다. editor.errorlegacy = 이 맵은 너무 오래되어 더 이상 지원지 않는 구형 맵 형식을 사용합니다.
editor.errornot = 맵 파일이 아닙니다. editor.errornot = 맵 파일이 아닙니다.
editor.errorheader = 이 맵 파일은 유효하지 않거나 손상되었습니다. editor.errorheader = 이 맵 파일은 유효하지 않거나 손상되었습니다.
editor.errorname = 맵에 이름이 지정되어 있지 않습니다. 저장 파일을 불러오려고 시도하는 건가요? editor.errorname = 맵에 이름이 지정되어 있지 않습니다. 저장 파일을 불러오려고 시도하는 건가요?
@@ -447,7 +457,7 @@ editor.exists = 이 이름의 맵이 이미 존재합니다.
editor.selectmap = 불러올 맵을 선택하세요: editor.selectmap = 불러올 맵을 선택하세요:
toolmode.replace = 재배치 toolmode.replace = 재배치
toolmode.replace.description = 단단한 블록에만 그립니다. toolmode.replace.description = 지형 블록에만 그립니다.
toolmode.replaceall = 모두 재배치 toolmode.replaceall = 모두 재배치
toolmode.replaceall.description = 맵에 있는 모든 블록을 재배치합니다. toolmode.replaceall.description = 맵에 있는 모든 블록을 재배치합니다.
toolmode.orthogonal = 직각 toolmode.orthogonal = 직각
@@ -648,6 +658,7 @@ status.sapped.name = 피로
status.electrified.name = 과전류 status.electrified.name = 과전류
status.spore-slowed.name = 포자감속 status.spore-slowed.name = 포자감속
status.tarred.name = 침유됨 status.tarred.name = 침유됨
status.overdrive.name = 과부하
status.overclock.name = 가속화 status.overclock.name = 가속화
status.shocked.name = 감전 status.shocked.name = 감전
status.blasted.name = 파손 status.blasted.name = 파손
@@ -1150,6 +1161,7 @@ block.core-nucleus.name = 코어: 핵심
block.deep-water.name = 깊은 물 block.deep-water.name = 깊은 물
block.shallow-water.name = block.shallow-water.name =
block.tainted-water.name = 오염된 물 block.tainted-water.name = 오염된 물
block.deep-tainted-water.name = 오염된 깊은 물
block.darksand-tainted-water.name = 오염된 젖은 검은 모래 block.darksand-tainted-water.name = 오염된 젖은 검은 모래
block.tar.name = 타르 block.tar.name = 타르
block.stone.name = 바위 block.stone.name = 바위
@@ -1316,7 +1328,7 @@ block.payload-router.name = 화물 분배기
block.duct.name = 도관 block.duct.name = 도관
block.duct-router.name = 도관 분배기 block.duct-router.name = 도관 분배기
block.duct-bridge.name = 도관 다리 block.duct-bridge.name = 도관 다리
block.payload-propulsion-tower.name = 화물 추진탑 block.payload-propulsion-tower.name = 화물 드라이버
block.payload-void.name = 화물 소멸기 block.payload-void.name = 화물 소멸기
block.payload-source.name = 화물 공급기 block.payload-source.name = 화물 공급기
block.disassembler.name = 광재 분해기 block.disassembler.name = 광재 분해기
@@ -1383,8 +1395,9 @@ hint.generator = \uf879 [accent]화력 발전기[]는 석탄을 태워서 주변
hint.guardian = [accent]수호자[] 유닛들은 방어력을 가집니다. [accent]구리[]와 [accent]납[] 같은 약한 탄약으로는 [scarlet]아무런 효과도 없습니다[].\n\n그런 수호자를 없애려면 높은 단계의 포탑 또는 \uf835 [accent]흑연[]을 탄약으로 넣은 \uf861듀오/\uf859살보를 사용하십시오. hint.guardian = [accent]수호자[] 유닛들은 방어력을 가집니다. [accent]구리[]와 [accent]납[] 같은 약한 탄약으로는 [scarlet]아무런 효과도 없습니다[].\n\n그런 수호자를 없애려면 높은 단계의 포탑 또는 \uf835 [accent]흑연[]을 탄약으로 넣은 \uf861듀오/\uf859살보를 사용하십시오.
hint.coreUpgrade = 코어는 [accent]상위 코어를 위에 설치함[]으로써 업그레이드할 수 있습니다.\n\n [accent]기반[] 코어를 [accent]조각[] 코어 위에 설치하십시오. 주변에 장애물이 없는지도 확인하십시오. hint.coreUpgrade = 코어는 [accent]상위 코어를 위에 설치함[]으로써 업그레이드할 수 있습니다.\n\n [accent]기반[] 코어를 [accent]조각[] 코어 위에 설치하십시오. 주변에 장애물이 없는지도 확인하십시오.
hint.presetLaunch = [accent]얼어붙은 숲[]과 같은 회색[accent]캠페인 지역[]은 어디에서나 출격해서 올 수 있습니다. 주변 지역을 점령하지 않아도 됩니다.\n\n이와 같은 [accent]네임드 지역[]들은 [accent]선택적[]입니다. hint.presetLaunch = [accent]얼어붙은 숲[]과 같은 회색[accent]캠페인 지역[]은 어디에서나 출격해서 올 수 있습니다. 주변 지역을 점령하지 않아도 됩니다.\n\n이와 같은 [accent]네임드 지역[]들은 [accent]선택적[]입니다.
hint.presetDifficulty = 이 지역은 [scarlet]고위험 레벨[] 지역입니다.\n적절한 기술과 준비 없이 이런 지역들로 출격하는건 [accent]비추천[]합니다.
hint.coreIncinerate = 코어가 자원으로 가득 찬 후에 받는 모든 자원들은 [accent]소각[]될 것입니다. hint.coreIncinerate = 코어가 자원으로 가득 찬 후에 받는 모든 자원들은 [accent]소각[]될 것입니다.
hint.coopCampaign = [accent]협동 캠페인[]을 할 때, 현재 맵에서 생산된 자원들은 [accent]캠페인 지역[]으로도 보내집니다.\n\n호스트가 새로 해금한 모든 들도 가져갑니다. hint.coopCampaign = [accent]협동 캠페인[]을 할 때, 현재 맵에서 생산된 자원들은 [accent]캠페인 지역[]으로도 보내집니다.\n\n호스트가 새로 해금한 모든 자원들도 가져갑니다.
item.copper.description = 가장 기본적인 건설 재료. 모든 유형의 블록에서 광범위하게 사용됩니다. item.copper.description = 가장 기본적인 건설 재료. 모든 유형의 블록에서 광범위하게 사용됩니다.
item.copper.details = 평범한 구리. 세르플로에 비정상적으로 많이 분포합니다. 별다른 보강재 없이는 구조적 문제 때문에 내구성이 비교적 약합니다. item.copper.details = 평범한 구리. 세르플로에 비정상적으로 많이 분포합니다. 별다른 보강재 없이는 구조적 문제 때문에 내구성이 비교적 약합니다.
@@ -1560,7 +1573,7 @@ block.logic-display.description = 프로세서를 이용해 그래픽을 출력
block.large-logic-display.description = 프로세서를 이용해 그래픽을 출력할 수 있습니다. block.large-logic-display.description = 프로세서를 이용해 그래픽을 출력할 수 있습니다.
block.interplanetary-accelerator.description = 거대한 전자기 레일건 타워. 코어를 행성 간 이동을 위한 탈출 속도까지 가속합니다. block.interplanetary-accelerator.description = 거대한 전자기 레일건 타워. 코어를 행성 간 이동을 위한 탈출 속도까지 가속합니다.
block.repair-turret.description = 가장 가까운 유닛을 지속적으로 수리합니다. 냉각수를 넣을 수 있습니다. block.repair-turret.description = 가장 가까운 유닛을 지속적으로 수리합니다. 냉각수를 넣을 수 있습니다.
block.payload-propulsion-tower.description = 장거리 화물 운반 구조물. 화물을 연결된 다른 화물 추진탑으로 발사합니다. block.payload-propulsion-tower.description = 장거리 화물 운반 구조물. 화물을 연결된 다른 화물 드라이버로 발사합니다.
unit.dagger.description = 주변 모든 적에게 일반적인 탄환을 발사합니다. unit.dagger.description = 주변 모든 적에게 일반적인 탄환을 발사합니다.
unit.mace.description = 주변 모든 적에게 화염 줄기를 발사합니다. unit.mace.description = 주변 모든 적에게 화염 줄기를 발사합니다.
@@ -1956,10 +1969,10 @@ unit.minke.details =
unit.bryde.details = unit.bryde.details =
unit.sei.details = [lightgray][비공식][]세이 sei! unit.sei.details = [lightgray][비공식][]세이 sei!
unit.omura.details = [lightgray][비공식][]오무라이스? unit.omura.details = [lightgray][비공식][]오무라이스?
unit.retusa.details = [lightgray][비공식][]바다를 지뢰로 뒤덮보죠. unit.retusa.details = [lightgray][비공식][]바다를 지뢰로 뒤덮보죠.
unit.oxynoe.details = unit.oxynoe.details =
unit.cyerce.details = [lightgray][비공식][]폭죽놀이다! unit.cyerce.details = [lightgray][비공식][]폭죽놀이다!
unit.aegires.details = [lightgray][비공식][]플레이어가 할 수 있는건 운전과 공사뿐... unit.aegires.details = [lightgray][비공식][]공격 컨트롤을 할 수 없습니다.
unit.navanax.details = [lightgray][비공식][]플레이어에게 잠깐의 섬광뽕을 입힙니다. unit.navanax.details = [lightgray][비공식][]플레이어에게 잠깐의 섬광뽕을 입힙니다.
unit.alpha.details = unit.alpha.details =
unit.beta.details = unit.beta.details =

View File

@@ -169,6 +169,7 @@ launchcore = Lansează Nucleu
filename = Nume Fișier: filename = Nume Fișier:
unlocked = Nou conținut deblocat! unlocked = Nou conținut deblocat!
available = Poți cerceta noi tehnologii! available = Poți cerceta noi tehnologii!
unlock.incampaign = < Deblochează în campanie pt detalii >
completed = [accent]Finalizat completed = [accent]Finalizat
techtree = Cercetează techtree = Cercetează
research.legacy = Au fost găsite date de cercetare din versiunea [accent]5.0[].\n Dorești să [accent]păstrezi aceste date[], sau [accent]să renunți la ele[] și să reîncepi cercetarea în noua campanie (recomandat)? research.legacy = Au fost găsite date de cercetare din versiunea [accent]5.0[].\n Dorești să [accent]păstrezi aceste date[], sau [accent]să renunți la ele[] și să reîncepi cercetarea în noua campanie (recomandat)?
@@ -362,6 +363,7 @@ publish.confirm = Sigur vrei să publici asta?\n\n[lightgray]Asigură-te că ai
publish.error = Eroare la publicarea itemului: {0} publish.error = Eroare la publicarea itemului: {0}
steam.error = Inițializarea serviciilor Steam a eșuat.\nEroare: {0} steam.error = Inițializarea serviciilor Steam a eșuat.\nEroare: {0}
editor.cliffs = Pereți >> Dealuri
editor.brush = Pensulă editor.brush = Pensulă
editor.openin = Deschide în Editor editor.openin = Deschide în Editor
editor.oregen = Generarea Minereurilor editor.oregen = Generarea Minereurilor
@@ -394,6 +396,13 @@ waves.load = Încarcă din Clipboard
waves.invalid = Valuri invalide în clipboard. waves.invalid = Valuri invalide în clipboard.
waves.copied = Valuri copiate. waves.copied = Valuri copiate.
waves.none = Niciun inamic definit.\nDe reținut că o listă de valuri goală va fi înlocuită automat cu lista de valuri prestabilită. waves.none = Niciun inamic definit.\nDe reținut că o listă de valuri goală va fi înlocuită automat cu lista de valuri prestabilită.
waves.sort = Sortează După
waves.sort.reverse = Inversează Sortarea
waves.sort.begin = Început
waves.sort.health = Viață
waves.sort.type = Tip
waves.units.hide = Ascunde
waves.units.show = Vezi Tot
#intenționat cu literă mică #intenționat cu literă mică
wavemode.counts = numere wavemode.counts = numere
@@ -622,6 +631,8 @@ sector.biomassFacility.name = Facilitatea de Sinteză a Biomasei
sector.windsweptIslands.name = Insulele Măturate de Vânt sector.windsweptIslands.name = Insulele Măturate de Vânt
sector.extractionOutpost.name = Avanpostul de Extracție sector.extractionOutpost.name = Avanpostul de Extracție
sector.planetaryTerminal.name = Terminalul de Lansare Planetară sector.planetaryTerminal.name = Terminalul de Lansare Planetară
sector.coastline.name = Zona de Coastă
sector.navalFortress.name = Fortăreața Navală
sector.groundZero.description = Locația optimă pt a începe încă odată. Risc de inamici scăzut. Puține resurse.\nAdună cât de mult plumb și cupru se poate.\nMergi mai departe. sector.groundZero.description = Locația optimă pt a începe încă odată. Risc de inamici scăzut. Puține resurse.\nAdună cât de mult plumb și cupru se poate.\nMergi mai departe.
sector.frozenForest.description = Chiar și aici, aproape de munți, sporii s-au împrăștiat. Temperaturile reci nu-i pot reține la infinit.\n\nÎncepe călătoria către electricitate. Construiește generatoare de combustie. Învață să folosești reparatoare. sector.frozenForest.description = Chiar și aici, aproape de munți, sporii s-au împrăștiat. Temperaturile reci nu-i pot reține la infinit.\n\nÎncepe călătoria către electricitate. Construiește generatoare de combustie. Învață să folosești reparatoare.
@@ -649,7 +660,8 @@ status.sapped.name = Slăbește
status.electrified.name = Electrificat status.electrified.name = Electrificat
status.spore-slowed.name = Încetinit de Spori status.spore-slowed.name = Încetinit de Spori
status.tarred.name = Păcurit status.tarred.name = Păcurit
status.overclock.name = Suprasolicitat status.overdrive.name = Suprasolicitat
status.overclock.name = Overclock
status.shocked.name = Electrocutat status.shocked.name = Electrocutat
status.blasted.name = Explozie status.blasted.name = Explozie
status.unmoving.name = Nemișcat status.unmoving.name = Nemișcat
@@ -766,9 +778,9 @@ stat.healing = Reparare
ability.forcefield = Câmp de Forță ability.forcefield = Câmp de Forță
ability.repairfield = Câmp de Reparare ability.repairfield = Câmp de Reparare
ability.statusfield = {0} Câmp Suprasolicitare Unități ability.statusfield = {0} Câmp de Stare
ability.unitspawn = Fabrică de {0} ability.unitspawn = Fabrică de {0}
ability.shieldregenfield = Scut Regenerabil ability.shieldregenfield = Câmp Regenerare Scut
ability.movelightning = Mișcare Fulger ability.movelightning = Mișcare Fulger
ability.energyfield = Câmp de Energie: [accent]{0}[] forță pe ~ [accent]{1}[] blocuri / [accent]{2}[] ținte ability.energyfield = Câmp de Energie: [accent]{0}[] forță pe ~ [accent]{1}[] blocuri / [accent]{2}[] ținte
@@ -873,7 +885,7 @@ setting.difficulty.name = Dificultate:
setting.screenshake.name = Agitare Ecran setting.screenshake.name = Agitare Ecran
setting.effects.name = Vezi Efectele setting.effects.name = Vezi Efectele
setting.destroyedblocks.name = Vezi Blocurile Distruse setting.destroyedblocks.name = Vezi Blocurile Distruse
setting.blockstatus.name = Vezi Statusul Blocului setting.blockstatus.name = Vezi Starea Blocului
setting.conveyorpathfinding.name = Găsirea Drumului la Plasarea Benzii setting.conveyorpathfinding.name = Găsirea Drumului la Plasarea Benzii
setting.sensitivity.name = Sensibilitatea Controlului setting.sensitivity.name = Sensibilitatea Controlului
setting.saveinterval.name = Interval de Salvare setting.saveinterval.name = Interval de Salvare
@@ -928,8 +940,8 @@ keybind.clear_building.name = Șterge Clădirea
keybind.press = Apasă o tastă... keybind.press = Apasă o tastă...
keybind.press.axis = Apasă o axă sau o tastă... keybind.press.axis = Apasă o axă sau o tastă...
keybind.screenshot.name = Captură Hartă keybind.screenshot.name = Captură Hartă
keybind.toggle_power_lines.name = Oprește/Pornește Statusul Electricelor keybind.toggle_power_lines.name = Oprește/Pornește Starea Electricelor
keybind.toggle_block_status.name = Oprește/Pornește Statusul Blocurilor keybind.toggle_block_status.name = Oprește/Pornește Starea Blocurilor
keybind.move_x.name = Mergi pe X keybind.move_x.name = Mergi pe X
keybind.move_y.name = Mergi pe Y keybind.move_y.name = Mergi pe Y
keybind.mouse_move.name = Urmărește Mouseul keybind.mouse_move.name = Urmărește Mouseul
@@ -1048,7 +1060,7 @@ content.item.name = Materiale
content.liquid.name = Lichide content.liquid.name = Lichide
content.unit.name = Unități content.unit.name = Unități
content.block.name = Blocuri content.block.name = Blocuri
content.status.name = Efecte de Status content.status.name = Efecte de Stare
content.sector.name = Sectoare content.sector.name = Sectoare
item.copper.name = Cupru item.copper.name = Cupru
@@ -1151,6 +1163,7 @@ block.core-nucleus.name = Nucleu: Core
block.deep-water.name = Apă Adâncă block.deep-water.name = Apă Adâncă
block.shallow-water.name = Apă block.shallow-water.name = Apă
block.tainted-water.name = Apă Tulbure block.tainted-water.name = Apă Tulbure
block.deep-tainted-water.name = Apă Adâncă și Tulbure
block.darksand-tainted-water.name = Apă Tulbure cu Nisip Negru block.darksand-tainted-water.name = Apă Tulbure cu Nisip Negru
block.tar.name = Păcură block.tar.name = Păcură
block.stone.name = Piatră block.stone.name = Piatră
@@ -1384,6 +1397,7 @@ hint.generator = \uf879 [accent]Generatoarele pe Combustie[] ard cărbunele și
hint.guardian = Unitățile [accent]Gardian[] au armuri puternice. Munițiile slabe precum [accent]Cuprul[] și [accent]Plumbul[] [scarlet]nu sunt eficiente[].\n\nFolosește arme mai bune sau muniție de \uf835 [accent]Grafit[] pt \uf861Duo/\uf859Salvo pt a nimici Gardianul. hint.guardian = Unitățile [accent]Gardian[] au armuri puternice. Munițiile slabe precum [accent]Cuprul[] și [accent]Plumbul[] [scarlet]nu sunt eficiente[].\n\nFolosește arme mai bune sau muniție de \uf835 [accent]Grafit[] pt \uf861Duo/\uf859Salvo pt a nimici Gardianul.
hint.coreUpgrade = Un nucleu poate pot fi îmbunătățit [accent]plasând o alt nucleu mai bun peste el[].\n\nPlasează un nucleu  [accent]Foundation[] peste nucleul  [accent]Shard[]. Nucleul nu poate fi plasat decât pe alte nuclee. Asigură-te că nu sunt alte benzi sau obstacole care să împiedice plasarea. hint.coreUpgrade = Un nucleu poate pot fi îmbunătățit [accent]plasând o alt nucleu mai bun peste el[].\n\nPlasează un nucleu  [accent]Foundation[] peste nucleul  [accent]Shard[]. Nucleul nu poate fi plasat decât pe alte nuclee. Asigură-te că nu sunt alte benzi sau obstacole care să împiedice plasarea.
hint.presetLaunch = Poți lansa de oriunde în sectoarele gri, precum [accent]Pădurea Glacială[]. Ele sunt [accent]zone[] speciale [accent]de aterizare[]. Nu ai nevoie să capturezi sectoarele învecinate pt a lansa.\n\n[accent]Sectoarele numerotate[], ca acesta, sunt [accent]opționale[]. hint.presetLaunch = Poți lansa de oriunde în sectoarele gri, precum [accent]Pădurea Glacială[]. Ele sunt [accent]zone[] speciale [accent]de aterizare[]. Nu ai nevoie să capturezi sectoarele învecinate pt a lansa.\n\n[accent]Sectoarele numerotate[], ca acesta, sunt [accent]opționale[].
hint.presetDifficulty = Acest sector are un [scarlet]nivel ridicat de amenințare inamică[].\n[accent]Nu e recomandat[] să lansezi în asemenea sectoare fără pregătiri sau tehnologie adecvată.
hint.coreIncinerate = După ce nucleul se umple până la refuz cu un tip de material, toate materialele în plus de acel tip care încearcă să între în nucleu sunt [accent]incinerate[]. hint.coreIncinerate = După ce nucleul se umple până la refuz cu un tip de material, toate materialele în plus de acel tip care încearcă să între în nucleu sunt [accent]incinerate[].
hint.coopCampaign = Când joci [accent]campania cooperând cu alți jucători[], materialele produse în sectorul curent vor fi transferate și către [accent]sectoarele tale locale[].\n\nDe asemenea, vei debloca tot ceea ce cercetează gazda. hint.coopCampaign = Când joci [accent]campania cooperând cu alți jucători[], materialele produse în sectorul curent vor fi transferate și către [accent]sectoarele tale locale[].\n\nDe asemenea, vei debloca tot ceea ce cercetează gazda.
@@ -1551,7 +1565,7 @@ block.additive-reconstructor.description = Îmbunătățește unitățile primit
block.multiplicative-reconstructor.description = Îmbunătățește unitățile primite, transformându-le în unități de nivel trei. block.multiplicative-reconstructor.description = Îmbunătățește unitățile primite, transformându-le în unități de nivel trei.
block.exponential-reconstructor.description = Îmbunătățește unitățile primite, transformându-le în unități de nivel patru. block.exponential-reconstructor.description = Îmbunătățește unitățile primite, transformându-le în unități de nivel patru.
block.tetrative-reconstructor.description = Îmbunătățește unitățile primite, transformându-le în unități de ltimă generație: nivelul cinci. block.tetrative-reconstructor.description = Îmbunătățește unitățile primite, transformându-le în unități de ltimă generație: nivelul cinci.
block.switch.description = Un întrerupător. Poate fi pornit sau oprit. Statusul său poate fi citit și controlat de procesoarele logice. block.switch.description = Un întrerupător. Poate fi pornit sau oprit. Starea sa poate fi citită și controlată de procesoarele logice.
block.micro-processor.description = Rulează într-o buclă continuă o secvență de instrucțiuni logice. Poate fi folosit pt a controla unități și diverse clădiri. block.micro-processor.description = Rulează într-o buclă continuă o secvență de instrucțiuni logice. Poate fi folosit pt a controla unități și diverse clădiri.
block.logic-processor.description = Rulează într-o buclă continuă o secvență de instrucțiuni logice. Poate fi folosit pt a controla unități și diverse clădiri. Mai rapid decât microprocesorul. block.logic-processor.description = Rulează într-o buclă continuă o secvență de instrucțiuni logice. Poate fi folosit pt a controla unități și diverse clădiri. Mai rapid decât microprocesorul.
block.hyper-processor.description = Rulează într-o buclă continuă o secvență de instrucțiuni logice. Poate fi folosit pt a controla unități și diverse clădiri. Mai rapid decât procesorul logic. block.hyper-processor.description = Rulează într-o buclă continuă o secvență de instrucțiuni logice. Poate fi folosit pt a controla unități și diverse clădiri. Mai rapid decât procesorul logic.

View File

@@ -616,6 +616,8 @@ sector.biomassFacility.name = Центр исследования биомасс
sector.windsweptIslands.name = Штормовой архипелаг sector.windsweptIslands.name = Штормовой архипелаг
sector.extractionOutpost.name = Добывающая база sector.extractionOutpost.name = Добывающая база
sector.planetaryTerminal.name = Планетарный пусковой терминал sector.planetaryTerminal.name = Планетарный пусковой терминал
sector.coastline.name = Береговая линия
sector.navalFortress.name = Прибрежная крепость
sector.groundZero.description = Оптимальная локация для повторных игр. Низкая вражеская угроза. Немного ресурсов.\nСоберите как можно больше свинца и меди.\nДвигайтесь дальше. sector.groundZero.description = Оптимальная локация для повторных игр. Низкая вражеская угроза. Немного ресурсов.\nСоберите как можно больше свинца и меди.\nДвигайтесь дальше.
sector.frozenForest.description = Даже здесь, ближе к горам, споры распространились. Холодные температуры не могут сдерживать их вечно.\n\nНачните вкладываться в энергию. Постройте генераторы внутреннего сгорания. Научитесь пользоваться регенератором. sector.frozenForest.description = Даже здесь, ближе к горам, споры распространились. Холодные температуры не могут сдерживать их вечно.\n\nНачните вкладываться в энергию. Постройте генераторы внутреннего сгорания. Научитесь пользоваться регенератором.
@@ -794,7 +796,7 @@ bullet.damage = [stat]{0}[lightgray] урона
bullet.splashdamage = [stat]{0}[lightgray] урона в радиусе ~[stat] {1}[lightgray] блоков bullet.splashdamage = [stat]{0}[lightgray] урона в радиусе ~[stat] {1}[lightgray] блоков
bullet.incendiary = [stat]зажигательный bullet.incendiary = [stat]зажигательный
bullet.homing = [stat]самонаводящийся bullet.homing = [stat]самонаводящийся
bullet.frag = [stat]осколочный bullet.frags = [stat]{0}[lightgray]x осколочный(ых) снаряд(ов):
bullet.lightning = [stat]{0}[lightgray]x молнии ~ [stat]{1}[lightgray] урона bullet.lightning = [stat]{0}[lightgray]x молнии ~ [stat]{1}[lightgray] урона
bullet.buildingdamage = [stat]{0}%[lightgray] урона по постройкам bullet.buildingdamage = [stat]{0}%[lightgray] урона по постройкам
bullet.knockback = [stat]{0}[lightgray] отбрасывания bullet.knockback = [stat]{0}[lightgray] отбрасывания
@@ -1544,6 +1546,8 @@ block.memory-bank.description = Хранит информацию для лог
block.logic-display.description = Отображает произвольную графику из логического процессора. block.logic-display.description = Отображает произвольную графику из логического процессора.
block.large-logic-display.description = Отображает произвольную графику из логического процессора. block.large-logic-display.description = Отображает произвольную графику из логического процессора.
block.interplanetary-accelerator.description = Массивная электромагнитная башня-рельсотрон. Ускоряет ядро, позволяя преодолеть гравитацию для межпланетного развёртывания. block.interplanetary-accelerator.description = Массивная электромагнитная башня-рельсотрон. Ускоряет ядро, позволяя преодолеть гравитацию для межпланетного развёртывания.
block.repair-turret.description = Непрерывно ремонтирует ближайшую поврежденную еденицу в своем радиусе. Опционально использует охлаждающую жидкость.
block.payload-propulsion-tower.description = Конструкция для транспортировки больших грузов на большое растояние. Стреляет грузом в другие грузовые катапульты.
unit.dagger.description = Стреляет стандартными пулями по всем врагам поблизости. unit.dagger.description = Стреляет стандартными пулями по всем врагам поблизости.
unit.mace.description = Стреляет потоками огня по всем врагам поблизости. unit.mace.description = Стреляет потоками огня по всем врагам поблизости.

View File

@@ -169,6 +169,7 @@ launchcore = ส่งแกนกลาง
filename = ชื่อไฟล์: filename = ชื่อไฟล์:
unlocked = เนื้อหาใหม่ปลดล็อก! unlocked = เนื้อหาใหม่ปลดล็อก!
available = มีการวิจัยใหม่พร้อมปลดล็อก! available = มีการวิจัยใหม่พร้อมปลดล็อก!
unlock.incampaign = < ปลดล็อกในแคมเปญเพื่อดูรายละเอียด >
completed = [accent]วิจัยแล้ว completed = [accent]วิจัยแล้ว
techtree = ต้นไม้แห่งเทคโนโลยี techtree = ต้นไม้แห่งเทคโนโลยี
research.legacy = พบข้อมูลการวิจัยของเวอร์ชั่น [accent]5.0[]\nคุณต้องการ[accent]โหลดข้อมูล[]หรือ[accent]ทิ้งข้อมูลไป[]และเริ่มต้นวิจัยในแคมเปญใหม่ (แนะนำ) research.legacy = พบข้อมูลการวิจัยของเวอร์ชั่น [accent]5.0[]\nคุณต้องการ[accent]โหลดข้อมูล[]หรือ[accent]ทิ้งข้อมูลไป[]และเริ่มต้นวิจัยในแคมเปญใหม่ (แนะนำ)
@@ -248,7 +249,7 @@ confirmban = คุณแน่ใจหรือว่าจะแบนผู
confirmkick = คุณแน่ใจหรือว่าจะเตะผู้เล่นนี้ออก? confirmkick = คุณแน่ใจหรือว่าจะเตะผู้เล่นนี้ออก?
confirmvotekick = คุณแน่ใจหรือว่าจะโหวตเตะผู้เล่นนี้ออก? confirmvotekick = คุณแน่ใจหรือว่าจะโหวตเตะผู้เล่นนี้ออก?
confirmunban = คุณแน่ใจหรือว่าจะเลิกแบนผู้เล่นนี้? confirmunban = คุณแน่ใจหรือว่าจะเลิกแบนผู้เล่นนี้?
confirmadmin = คุณแน่ใจหรือว่าจะเปลี่ยนผู้เล่นคนนี้เป็นแอดมิน? confirmadmin = คุณแน่ใจหรือว่าจะแต่งตั้งผู้เล่นคนนี้เป็นแอดมิน?
confirmunadmin = คุณแน่ใจหรือว่าจะลบสถานะการเป็นแอดมินของผู้เล่นนี้? confirmunadmin = คุณแน่ใจหรือว่าจะลบสถานะการเป็นแอดมินของผู้เล่นนี้?
joingame.title = เข้าร่วมเกม joingame.title = เข้าร่วมเกม
joingame.ip = ที่อยู่: joingame.ip = ที่อยู่:
@@ -362,6 +363,7 @@ publish.confirm = คุณแน่ใจหรือว่าจะเผย
publish.error = เกิดข้อผิดพลาดการเผยแพร่ไอเท็มดังต่อไปนี้: {0} publish.error = เกิดข้อผิดพลาดการเผยแพร่ไอเท็มดังต่อไปนี้: {0}
steam.error = ไม่สามารถเริ่ม Steam service ได้\nError: {0} steam.error = ไม่สามารถเริ่ม Steam service ได้\nError: {0}
editor.cliffs = เปลี่ยนกำแพงเป็นหน้าผา
editor.brush = แปรง editor.brush = แปรง
editor.openin = เปิดในตัวแก้ไข editor.openin = เปิดในตัวแก้ไข
editor.oregen = การเกิดของแร่ editor.oregen = การเกิดของแร่
@@ -394,6 +396,13 @@ waves.load = โหลดจากคลิปบอร์ด
waves.invalid = แบบคลื่นในคลิปบอร์ดไม่ถูกต้อง waves.invalid = แบบคลื่นในคลิปบอร์ดไม่ถูกต้อง
waves.copied = คัดลอกแบบคลื่นแล้ว waves.copied = คัดลอกแบบคลื่นแล้ว
waves.none = ไม่ได้กำหนดศัตรู\nแบบคลื่นเปล่าจะถูกแทนที่โดยแบบคลื่นค่าเริ่มต้นของเกม waves.none = ไม่ได้กำหนดศัตรู\nแบบคลื่นเปล่าจะถูกแทนที่โดยแบบคลื่นค่าเริ่มต้นของเกม
waves.sort = จัดเรียงตาม
waves.sort.reverse = เรียงย้อนกลับ
waves.sort.begin = เริ่มต้น
waves.sort.health = พลังชีวิต
waves.sort.type = ชนิด
waves.units.hide = ซ่อนทั้งหมด
waves.units.show = แสดงทั้งหมด
#these are intentionally in lower case #these are intentionally in lower case
wavemode.counts = จำนวน wavemode.counts = จำนวน
@@ -439,7 +448,7 @@ editor.exportimage = ส่งออกไฟล์รูปพื้นที
editor.exportimage.description = ส่งออกไฟล์รูปแมพ editor.exportimage.description = ส่งออกไฟล์รูปแมพ
editor.loadimage = นำเข้าแบบพื้นที่ editor.loadimage = นำเข้าแบบพื้นที่
editor.saveimage = ส่งออกแบบพื้นที่ editor.saveimage = ส่งออกแบบพื้นที่
editor.unsaved = [scarlet]คุณมีการเปลี่ยนแปลงที่ยังไม่ได้เซฟ![]\nคุณแน่ใจหรือว่าจะออก? editor.unsaved = คุณแน่ใจหรือว่าจะออก?\n[scarlet]การเปลี่ยนแปลงที่ยังไม่ได้เซฟจะถูกทิ้ง
editor.resizemap = เปลี่ยนขนาดของแมพ editor.resizemap = เปลี่ยนขนาดของแมพ
editor.mapname = ชื่อแมพ: editor.mapname = ชื่อแมพ:
editor.overwrite = [accent]ตำเตือน!\nแมพนี้จะเขียนทับกับแมพที่มีอยู่แล้ว editor.overwrite = [accent]ตำเตือน!\nแมพนี้จะเขียนทับกับแมพที่มีอยู่แล้ว
@@ -615,29 +624,31 @@ sector.stainedMountains.name = ภูเขาหลากสี
sector.desolateRift.name = เดโซเลต ริฟต์ sector.desolateRift.name = เดโซเลต ริฟต์
sector.nuclearComplex.name = ฐานผลิตนิวเคลียร์ sector.nuclearComplex.name = ฐานผลิตนิวเคลียร์
sector.overgrowth.name = โอเวอร์โกรว์ด sector.overgrowth.name = โอเวอร์โกรว์ด
sector.tarFields.name = ทาร์ ฟิลด์ sector.tarFields.name = ผืนแผ่นแห่งน้ำมัน
sector.saltFlats.name = ที่ราบเกลือ sector.saltFlats.name = ที่ราบเกลือ
sector.fungalPass.name = ทางผ่านฟังกัล sector.fungalPass.name = ทางผ่านฟังกัล
sector.biomassFacility.name = แหล่งสังเคราะห์ชีวมวล sector.biomassFacility.name = แหล่งสังเคราะห์ชีวมวล
sector.windsweptIslands.name = หมู่เกาะวินด์สเวปท์ sector.windsweptIslands.name = หมู่เกาะวินด์สเวปท์
sector.extractionOutpost.name = ด่านส่งทรัพยากร sector.extractionOutpost.name = ด่านส่งทรัพยากร
sector.planetaryTerminal.name = ท่าปล่อยจรวดอวกาศยาน sector.planetaryTerminal.name = ท่าปล่อยจรวดอวกาศยาน
sector.coastline.name = แนวชายฝั่ง
sector.navalFortress.name = ปราการแห่งวารี
sector.groundZero.description = ที่ที่ดีที่สุดในการเริ่มต้นอีกครั้ง ศัตรูน้อย ทรัพยากรน้อย\nเก็บ[accent]ตะกั่ว[]และ[accent]ทองแดง[]ให้ได้มากที่สุด\nแล้วลุยต่อ sector.groundZero.description = ที่ที่ดีที่สุดในการเริ่มต้นอีกครั้ง ศัตรูน้อย ทรัพยากรน้อย\nเก็บ[accent]ตะกั่ว[]และ[accent]ทองแดง[]ให้ได้มากที่สุด\nแล้วลุยต่อ
sector.frozenForest.description = แม้แต่ที่นี่ ที่ที่อยู่ใกล้ภูเขา [accent]สปอร์[]ก็ยังแพร่มาถึงที่นี่\nอากาศอันเย็นเยือกไม่สามารถหยุดยั้งพวกมันได้ตลอดไป\n\nเริ่มต้นการใช้ไฟฟ้า สร้างเครื่องกำเนิดไฟฟ้าเผาไหม้\nเรียนรู้ที่จะใช้เครื่องซ่อมแซม sector.frozenForest.description = แม้แต่ที่นี่ ที่ที่อยู่ใกล้ภูเขา [accent]สปอร์[]ก็ยังแพร่มาถึงที่นี่\nอากาศอันแสนเย็นเยือกไม่สามารถหยุดยั้งพวกมันได้ตลอดไป\n\nเริ่มต้นการใช้ไฟฟ้า สร้างเครื่องกำเนิดไฟฟ้าเผาไหม้\nเรียนรู้ที่จะใช้เครื่องซ่อมแซม
sector.saltFlats.description = ณ ขอบของทะเลทราย เป็นที่ตั้งของที่ราบเกลือ สามารถพบทรัพยากรบางอย่างได้ที่นี่\n\nศัตรูได้ตั้งฐานเก็บทรัพยากรไว้ที่นี่ ทำลายแกนกลางของพวกมัน อย่าให้มีอะไรเหลือ sector.saltFlats.description = ณ ขอบของทะเลทราย เป็นที่ตั้งของที่ราบเกลือ สามารถพบทรัพยากรบางอย่างได้ที่นี่\n\nศัตรูได้ตั้งฐานเก็บทรัพยากรไว้ที่นี่ ทำลายแกนกลางของพวกมัน อย่าให้มีอะไรเหลือ
sector.craters.description = น้ำขังอยู่ในหลุมอุกกาบาศแห่งนี้ อนุสรณ์สถานของสงครามเก่าแก่\nยึดพื้นที่นี่มา เก็บทราย เผา[accent]กระจกเมต้า[]\nปั๊มน้ำเพื่อมาหล่อเย็นป้อมปืนและเครื่องขุดเจาะ sector.craters.description = มีน้ำขังอยู่ในหลุมอุกกาบาศแห่งนี้ เป็นอนุสรณ์สถานของสงครามเก่าแก่\nยึดพื้นที่นี่มา เก็บทราย เผา[accent]กระจกเมต้า[]\nปั๊มน้ำเพื่อมาหล่อเย็นป้อมปืนและเครื่องขุดเจาะ
sector.ruinousShores.description = ถัดมาจากทะเลทราย เป็นที่ตั้งของชายฝั่ง ที่ครั้งก่อน เคยเป็นที่ตั้งของฐานป้องกันชายฝั่ง\nซึ่งทุกทำลายไปซะส่วนใหญ่แล้ว มีเหลือแค่ระบบการป้องกันพื้นฐาน\nทุกอย่างที่เหลือถูกทำลายเหลือเพียงแค่เศษเหล็ก\n\nทำการขยายการสำรวจต่อไป ค้นพบกับเทคโนโลยีอีกครั้ง sector.ruinousShores.description = ถัดมาจากทะเลทราย เป็นที่ตั้งของชายฝั่ง ที่ครั้งก่อน เคยเป็นที่ตั้งของฐานป้องกันชายฝั่ง\nซึ่งทุกทำลายไปซะส่วนใหญ่แล้ว มีเหลือแค่ระบบการป้องกันพื้นฐาน\nทุกอย่างที่เหลือถูกทำลายเหลือเพียงแค่เศษเหล็ก\n\nทำการขยายการสำรวจต่อไป ค้นพบกับเทคโนโลยีอีกครั้ง
sector.stainedMountains.description = เข้าลึกไปในพื้นที่ จะพบกับภูเขา ซึ่งยังไม่ถูกสปอร์แตะต้อง\nขุด[accent]ไทเทเนี่ยม[]ที่อุดมสมบูรณ์ในพื้นที่นี้ เรียนรู้ที่จะใช้มัน\n\nมีศัตรูปรากฏตัวมากขึ้นในบริเวณนี้ อย่าปล่อยให้พวกมันส่งยูนิตที่แข็งแกร่งที่สุดออกมา sector.stainedMountains.description = เข้าลึกไปในพื้นที่ จะพบกับภูเขา ซึ่งยังไม่ถูกสปอร์แตะต้อง\nขุด[accent]ไทเทเนี่ยม[]ที่อุดมสมบูรณ์ในพื้นที่นี้ เรียนรู้ที่จะใช้มัน\n\nมีศัตรูปรากฏตัวมากขึ้นในบริเวณนี้ อย่าปล่อยให้พวกมันส่งยูนิตที่แข็งแกร่งที่สุดออกมา
sector.overgrowth.description = พื้นที่นี้ถูกปกคลุมไปด้วยพืช เข้าใกล้กับแหล่งกำเนิดของสปอร์\nศัตรูได้ตั้งฐานเฝ้าระวังไว้ที่นี่ สร้างยูนิตเมส ทำลายฐานทิ้งซะ\nวิจัย[accent]เครื่องพัฒนารุ่นยกกำลัง[]เพื่อผลิตยูนิตขนาดที่ใหญ่ขึ้น sector.overgrowth.description = พื้นที่นี้ถูกปกคลุมไปด้วยพืช เข้าใกล้กับแหล่งกำเนิดของสปอร์\nศัตรูได้ตั้งฐานเฝ้าระวังไว้ที่นี่ สร้างยูนิตเมส ทำลายฐานทิ้งซะ\nวิจัย[accent]เครื่องพัฒนารุ่นยกกำลัง[]เพื่อผลิตยูนิตขนาดที่ใหญ่ขึ้น
sector.tarFields.description = ขอบของพื้นที่ผลิตน้ำมัน อยู่ระหว่างภูเขาและทะเลทราย หนึ่งในพื้นที่ที่มีแหล่งน้ำมันดินที่ใช้งานได้\nแม้ว่าจะถูกทิ้งร้าง พื้นที่นี้ยังคงมีฐานทัพของศัตรูอยู่ใกล้ๆ อย่าประมาทกับพวกมัน\n\n[lightgray]วิจัยเทคโนโลยีการแปรรูปน้ำมันหากเป็นไปได้ sector.tarFields.description = แนวชานขอบของแหล่งผลิตน้ำมัน อยู่ระหว่างภูเขาและทะเลทราย เป็นหนึ่งในพื้นที่ที่มีแหล่งน้ำมันดินที่ใช้งานได้\nแม้ว่าจะถูกทิ้งร้าง พื้นที่นี้ยังคงมีฐานทัพของศัตรูอยู่ใกล้ๆ อย่าประมาทกับพวกมัน\n\n[lightgray]วิจัยเทคโนโลยีการแปรรูปน้ำมันหากเป็นไปได้
sector.desolateRift.description = เป็นพื้นที่ที่อันตรายมาก ทรัพยากรมากมาย แต่พื้นที่คับแคบ\nความเสี่ยงการโดนทำลายล้างสูง ออกไปจากที่นี่ให้เร็วที่สุด\nอย่าถูกหลอกโดยระยะเวลาระหว่างการโจมตีของศัตรูที่เว้นไว้นานกว่าปกติ sector.desolateRift.description = เป็นพื้นที่ที่อันตรายมาก ทรัพยากรมากมาย แต่พื้นที่คับแคบ\nความเสี่ยงการโดนทำลายล้างสูง ออกไปจากที่นี่ให้เร็วที่สุด\nอย่าถูกหลอกโดยระยะเวลาระหว่างการโจมตีของศัตรูที่เว้นไว้นานกว่าปกติ
sector.nuclearComplex.description = สถานที่ผลิตและแปรรูปทอเรี่ยมเก่า ถูกทำลายไม่เหลือสิ้น\nวิจัยทอเรี่ยมและวิธีการใช้มัน\n\nศัตรูในบริเวณนี้มีจำนวนมาก คอยตรวจตราหาผู้บุกรุกอยู่ตลอดเวลา sector.nuclearComplex.description = สถานที่ผลิตและแปรรูปทอเรี่ยมเก่า ถูกทำลายไม่เหลือสิ้น\nวิจัยทอเรี่ยมและวิธีการใช้มัน\n\nศัตรูในบริเวณนี้มีจำนวนมาก คอยตรวจตราหาผู้บุกรุกอยู่ตลอดเวลา
sector.fungalPass.description = ทางผ่านระหว่างพื้นที่สูงและต่ำของภูเขา พื้นที่นี้เต็มไปด้วยสปอร์ ฐานลาดตระเวนขนาดเล็กของศัตรูตั้งอยู่ที่นี่\nทำลายมันซะ\nผลิตยูนิตแด็กเกอร์และครอว์เลอร์ ทำลายแกนกลางทั้งสองไม่ให้เหลือซาก sector.fungalPass.description = ทางผ่านระหว่างพื้นที่สูงและต่ำของภูเขา พื้นที่นี้เต็มไปด้วยสปอร์ ฐานลาดตระเวนขนาดเล็กของศัตรูตั้งอยู่ที่นี่\nทำลายมันซะ\nผลิตยูนิตแด็กเกอร์และครอว์เลอร์ ทำลายแกนกลางทั้งสองไม่ให้เหลือซาก
sector.biomassFacility.description = แหล่งต้นกำเนิดของสปอร์ ที่นี่คือฐานวิจัยและผลิตสปอร์เริ่มแรก\nวิจัยเทคโนโลยีที่อยู่ภายในนั้น เพาะชำ[accent]สปอร์[]เพื่อเป็นเชื้อเพลิงและใช้ในการผลิตพลาสติก\n\n[gray]เมื่อสถานที่นี้ถูกทิ้งร้าง สปอร์ก็ถูกปล่อยออกมา ไม่มีสิ่งใดในระบบนิเวศท้องถิ่นที่สามารถแข่งขันกับสิ่งมีชีวิตที่\nแพร่กระจายเช่นนี้ได้ sector.biomassFacility.description = แหล่งต้นกำเนิดของสปอร์ ที่นี่คือฐานวิจัยและผลิตสปอร์เริ่มแรก\nวิจัยเทคโนโลยีที่อยู่ภายในนั้น เพาะชำ[accent]สปอร์[]เพื่อเป็นเชื้อเพลิงและใช้ในการผลิตพลาสติก\n\n[gray]เมื่อสถานที่นี้ถูกทิ้งร้าง สปอร์ก็ถูกปล่อยออกมา ไม่มีสิ่งใดในระบบนิเวศท้องถิ่นที่สามารถแข่งขันกับสิ่งมีชีวิตที่\nแพร่กระจายเช่นนี้ได้
sector.windsweptIslands.description = เลยแนวชายฝั่งไปเป็นหมู่เกาะที่ตั้งอยู่ห่างไกล เคยมีบันทึกว่าที่นี่มีโรงงานผลิต[accent]พลาสตาเนี่ยม[]อยู่\n\nทำลายเรือศัตรู สร้างฐานทัพบนเกาะ วิจัยโรงงานพวกนี้ sector.windsweptIslands.description = เลยแนวชายฝั่งไปจะพบกับหมู่เกาะที่ตั้งอยู่ห่างไกลแห่งนี้ เคยมีบันทึกว่าที่นี่มีโรงงานผลิต[accent]พลาสตาเนี่ยม[]อยู่\n\nทำลายเรือศัตรู สร้างฐานทัพบนเกาะ วิจัยโรงงานพวกนี้
sector.extractionOutpost.description = ด่านที่อยู่ห่างไกล สร้างโดยศัตรูเพื่อใช้ในการส่งทรัพยากรไปยังฐานทัพอื่น\n\nเทคโนโลยีการส่งไอเท็มข้ามเซ็กเตอร์เป็นสิ่งจำเป็นสำหรับการพิชิตถัดๆ ไป ทำลายด่าน วิจัยฐานส่งของ sector.extractionOutpost.description = ด่านที่อยู่ห่างไกล สร้างโดยศัตรูเพื่อใช้ในการส่งทรัพยากรไปยังฐานทัพอื่น\n\nเทคโนโลยีการส่งไอเท็มข้ามเซ็กเตอร์เป็นสิ่งจำเป็นสำหรับการพิชิตถัดๆ ไป ทำลายด่าน วิจัยฐานส่งของ
sector.impact0078.description = นีคือเศษซากของเรือขนส่งระหว่างดวงดาวที่เคยเข้ามายังระบบนี้\nเศษเหล็กและหิมะปกคลุมทั่วทั้งพื้นที่\n\nกอบกู้ซากยานให้ได้มากที่สุด วิจัยเทคโนโลยีทั้งหมดที่ยังเหลือรอด\n\n\n[gray]อย่าประมาทกับฐานทัพศัตรูที่อยู่ใกล้ๆ โดยอันขาด\nศัตรูจะส่งกองกำลังมาโจมตีเรื่อยๆ จนกว่าคุณจะพ่ายแพ้ sector.impact0078.description = ณ ที่แห่งนีคือเศษซากของเรือขนส่งระหว่างดวงดาวที่เคยเข้ามายังระบบนี้\nเศษเหล็กและหิมะปกคลุมทั่วทั้งพื้นที่\n\nกอบกู้ซากยานให้ได้มากที่สุด วิจัยเทคโนโลยีทั้งหมดที่ยังเหลือรอด\n\n\n[gray]อย่าประมาทกับฐานทัพศัตรูที่อยู่ใกล้ๆ โดยอันขาด\nศัตรูจะส่งกองกำลังมาโจมตีเรื่อยๆ จนกว่าคุณจะพ่ายแพ้
sector.planetaryTerminal.description = เป้าหมายสุดท้าย\n\nฐานทัพติดชายหาดนี้มีสิ่งประดิษฐ์ที่สามารถส่งแกนกลางไปยังดาวที่อยู่ใกล้ๆ ได้ ฐานทัพมีการป้องกันที่แน่นหนามาก\n\nผลิตยูนิตเรือ กวาดล้างศัตรูให้เร็วที่สุด วิจัยสิ่งประดิษฐ์นั่น sector.planetaryTerminal.description = เป้าหมายสุดท้าย\n\nฐานทัพติดชายหาดนี้มีสิ่งประดิษฐ์ที่สามารถส่งแกนกลางไปยังดาวที่อยู่ใกล้ๆ ได้ ฐานทัพมีการป้องกันที่แน่นหนามาก\n\nผลิตยูนิตเรือ กวาดล้างศัตรูให้เร็วที่สุด วิจัยสิ่งประดิษฐ์นั่น
status.burning.name = เผาไหม้ status.burning.name = เผาไหม้
@@ -649,6 +660,7 @@ status.sapped.name = อ่อนกำลัง
status.electrified.name = ช็อตไฟฟ้า status.electrified.name = ช็อตไฟฟ้า
status.spore-slowed.name = สปอร์สโลว์ status.spore-slowed.name = สปอร์สโลว์
status.tarred.name = เปื้อนน้ำมัน status.tarred.name = เปื้อนน้ำมัน
status.overdrive.name = โอเวอร์ไดรฟ์
status.overclock.name = โอเวอร์คล็อก status.overclock.name = โอเวอร์คล็อก
status.shocked.name = ช็อก status.shocked.name = ช็อก
status.blasted.name = ระเบิด status.blasted.name = ระเบิด
@@ -665,7 +677,7 @@ settings.game = เกม
settings.sound = เสียง settings.sound = เสียง
settings.graphics = กราฟิก settings.graphics = กราฟิก
settings.cleardata = เคลียร์ข้อมูลเกม... settings.cleardata = เคลียร์ข้อมูลเกม...
settings.clear.confirm = คุณแน่ใจหรือว่าจะเคลียร์ข้อมูลเกม?\nสิ่งที่ทำไปแล้วจะไม่สามารถย้อนกลับได้! settings.clear.confirm = คุณแน่ใจหรือว่าจะเคลียร์ข้อมูลนี้?\nสิ่งที่ทำไปแล้วจะไม่สามารถย้อนกลับได้นะ!
settings.clearall.confirm = [scarlet]คำเตือน![]\nการกระทำนี้จะลบข้อมูลทั้งหมด นั้นรวมไปถึงเซฟ แมพ การวิจัยแล้วและก็ปุ่มควบคุม\nเมื่อคุณกด 'โอเค' เกมจะลบข้อมูลทุกอย่างและออกโดยอัตโนมัติ settings.clearall.confirm = [scarlet]คำเตือน![]\nการกระทำนี้จะลบข้อมูลทั้งหมด นั้นรวมไปถึงเซฟ แมพ การวิจัยแล้วและก็ปุ่มควบคุม\nเมื่อคุณกด 'โอเค' เกมจะลบข้อมูลทุกอย่างและออกโดยอัตโนมัติ
settings.clearsaves.confirm = คุณแน่ใจหรือว่าคุณต้องการเคลียร์เซฟทั้งหมด? settings.clearsaves.confirm = คุณแน่ใจหรือว่าคุณต้องการเคลียร์เซฟทั้งหมด?
settings.clearsaves = เคลียร์เซฟ settings.clearsaves = เคลียร์เซฟ
@@ -683,7 +695,7 @@ info.title = ข้อมูล
error.title = [crimson]มีบางอย่างผิดพลาดเกิดขึ้น error.title = [crimson]มีบางอย่างผิดพลาดเกิดขึ้น
error.crashtitle = มีบางอย่างผิดพลาดเกิดขึ้น error.crashtitle = มีบางอย่างผิดพลาดเกิดขึ้น
unit.nobuild = [scarlet]ยูนิตนี้ไม่สามารถสร้างได้ unit.nobuild = [scarlet]ยูนิตนี้ไม่สามารถสร้างได้
lastaccessed = [lightgray]:คนที่แตะเป็นคนสุดท้าย {0} lastaccessed = [lightgray]คนสุดท้ายที่แตะ: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <โหลดแมพเพื่อแสดง> stat.showinmap = <โหลดแมพเพื่อแสดง>
@@ -1151,6 +1163,7 @@ block.core-nucleus.name = แกนกลาง: นิวเคลียส
block.deep-water.name = น้ำลึก block.deep-water.name = น้ำลึก
block.shallow-water.name = น้ำตื้น block.shallow-water.name = น้ำตื้น
block.tainted-water.name = น้ำเสีย block.tainted-water.name = น้ำเสีย
block.deep-tainted-water.name = น้ำเสียลึก
block.darksand-tainted-water.name = น้ำเสียบนทรายดำ block.darksand-tainted-water.name = น้ำเสียบนทรายดำ
block.tar.name = น้ำมันดิน block.tar.name = น้ำมันดิน
block.stone.name = หิน block.stone.name = หิน
@@ -1384,6 +1397,7 @@ hint.generator = \uf879 [accent]เครื่องกำเนิดไฟฟ
hint.guardian = หน่วย[accent]ผู้พิทักษ์[]มีเกราะป้องกันหนาแน่น กระสุนเปราะบางอย่าง[accent]ทองแดง[]และ[accent]ตะกั่ว[][scarlet]ไม่มีประสิทธิภาพ[]\n\nควรใช้ป้อมปืนที่ดีกว่านี้หรือใช้ \uf835 [accent]กราไฟท์[]ใส่ใน \uf861 ดูโอ/ \uf859 ซัลโวเป็นกระสุนเพื่อทำลายผู้พิทักษ์ hint.guardian = หน่วย[accent]ผู้พิทักษ์[]มีเกราะป้องกันหนาแน่น กระสุนเปราะบางอย่าง[accent]ทองแดง[]และ[accent]ตะกั่ว[][scarlet]ไม่มีประสิทธิภาพ[]\n\nควรใช้ป้อมปืนที่ดีกว่านี้หรือใช้ \uf835 [accent]กราไฟท์[]ใส่ใน \uf861 ดูโอ/ \uf859 ซัลโวเป็นกระสุนเพื่อทำลายผู้พิทักษ์
hint.coreUpgrade = สามารถอัปเกรดแกนกลางได้โดย[accent]วางแกนกลางที่ใหญ่กว่าทับมัน[]\n\nวาง  [accent]แกนกลาง: ฟาวน์เดชั่น[]ทับ  [accent]แกนกลาง: ชาร์ด[] ต้องแน่ใจว่ารอบข้างมีที่ว่างก่อนจะวาง hint.coreUpgrade = สามารถอัปเกรดแกนกลางได้โดย[accent]วางแกนกลางที่ใหญ่กว่าทับมัน[]\n\nวาง  [accent]แกนกลาง: ฟาวน์เดชั่น[]ทับ  [accent]แกนกลาง: ชาร์ด[] ต้องแน่ใจว่ารอบข้างมีที่ว่างก่อนจะวาง
hint.presetLaunch = [accent]เซ็กเตอร์ลงจอด[]สีเทา อย่างเช่น[accent]ป่าหนาวเหน็บ[] สามารถลงจอดจากที่ไหนที่ได้ในแผนที่ พวกนั้นไม่จำเป็นต้องยืดครองเซ็กเตอร์รอบข้างเพื่อส่งแกนกลางไป\n\n[accent]เซ็กเตอร์ที่มีเลข[] อย่างเช่นอันนี้[accent]ไม่จำเป็น[]ต้องยืดครอง hint.presetLaunch = [accent]เซ็กเตอร์ลงจอด[]สีเทา อย่างเช่น[accent]ป่าหนาวเหน็บ[] สามารถลงจอดจากที่ไหนที่ได้ในแผนที่ พวกนั้นไม่จำเป็นต้องยืดครองเซ็กเตอร์รอบข้างเพื่อส่งแกนกลางไป\n\n[accent]เซ็กเตอร์ที่มีเลข[] อย่างเช่นอันนี้[accent]ไม่จำเป็น[]ต้องยืดครอง
hint.presetDifficulty = เซ็กเตอร์นี้มี[scarlet]ระดับภัยคุกคามศัตรูสูง[]\n[accent]ไม่แนะนำ[]ให้ลงจอดไปยังเซ็กเซอร์พวกนั้นหากไม่มีการเตรียมพร้อมและเทคโนโลยี
hint.coreIncinerate = เมื่อแกนกลางมีจำนวนไอเท็มชนิดหนึ่งที่เต็ม ไอเท็มชนิดนั้นที่เข้ามาเพิ่มจะ[accent]ถูกเผา[] hint.coreIncinerate = เมื่อแกนกลางมีจำนวนไอเท็มชนิดหนึ่งที่เต็ม ไอเท็มชนิดนั้นที่เข้ามาเพิ่มจะ[accent]ถูกเผา[]
hint.coopCampaign = ตอนที่เล่น[accent]แคมเปญร่วมกัน[]กับเพื่อน ไอเท็มที่ผลิตในแมพนี้จะถูกส่ง[accent]ไปยังเซ็กเตอร์ของคุณด้วย[]\n\nการวิจัยใหม่ที่โฮสต์ได้วิจัยก็เก็บเป็นของคุณด้วย hint.coopCampaign = ตอนที่เล่น[accent]แคมเปญร่วมกัน[]กับเพื่อน ไอเท็มที่ผลิตในแมพนี้จะถูกส่ง[accent]ไปยังเซ็กเตอร์ของคุณด้วย[]\n\nการวิจัยใหม่ที่โฮสต์ได้วิจัยก็เก็บเป็นของคุณด้วย
@@ -1761,12 +1775,12 @@ lenum.target = ยิงไปที่ตำแหน่งเป้าหม
lenum.targetp = ยิงเป้าหมายโดยมีการคำนวณความเร็ว lenum.targetp = ยิงเป้าหมายโดยมีการคำนวณความเร็ว
lenum.itemdrop = ปล่อยไอเท็ม lenum.itemdrop = ปล่อยไอเท็ม
lenum.itemtake = หยิบไอเท็มจากสิ่งก่อสร้าง lenum.itemtake = หยิบไอเท็มจากสิ่งก่อสร้าง
lenum.paydrop = ปล่อยของที่บรรทุกอยู่ lenum.paydrop = ปล่อยสิ่งที่บรรทุกอยู่
lenum.paytake = หยิบของบรรทุกที่จุดที่อยู่ lenum.paytake = หยิบสิ่งบรรทุกจุดที่อยู่
lenum.flag = ปักธงยูนิตเป็นหมายเลข lenum.flag = ปักธงยูนิตเป็นหมายเลข
lenum.mine = ขุดที่ตำแหน่งเป้าหมาย lenum.mine = ขุดที่ตำแหน่งเป้าหมาย
lenum.build = สร้างสิ่งก่อสร้าง lenum.build = สร้างสิ่งก่อสร้าง
lenum.getblock = ดึงข้อมูลสิ่งก่อสร้างและประเภทสิ่งก่อสร้างที่ตำแหน่งเป้าหมาย\nหน่วยต้องอยู่ในช่วงของตำแหน่ง\nของแข็งที่ไม่ใช่สิ่งก่อสร้างจะส่งกลับเป็น [accent]@solid[] lenum.getblock = ดึงข้อมูลสิ่งก่อสร้างและประเภทสิ่งก่อสร้างที่ตำแหน่งเป้าหมาย\nหน่วยต้องอยู่ในช่วงของตำแหน่ง\nของแข็งที่ไม่ใช่สิ่งก่อสร้างจะส่งกลับเป็น [accent]@solid[]
lenum.within = ตรวจสอบว่ายูนิตอยู่ในระยะหรือไม่ lenum.within = ตรวจสอบว่ายูนิตอยู่ในระยะหรือไม่
lenum.boost = เริ่ม/หยุดการบูสต์ lenum.boost = เริ่ม/หยุดการบูสต์
#extra line: 18 => extra descriptions: 4+2 => extra details: (7+4)+1 #extra line: 16 => extra descriptions: 4 => extra details: (7+4)+1

View File

@@ -393,6 +393,13 @@ waves.load = Panodan yükle
waves.invalid = Panoda geçersiz dalga sayısı var. waves.invalid = Panoda geçersiz dalga sayısı var.
waves.copied = Dalgalar kopyalandı. waves.copied = Dalgalar kopyalandı.
waves.none = Düşman bulunamadı.\nBoş dalga düzenlerin otomatik olarak varsayılan düzenle değiştirileceğini unutmayın waves.none = Düşman bulunamadı.\nBoş dalga düzenlerin otomatik olarak varsayılan düzenle değiştirileceğini unutmayın
waves.sort = Sıralama Ölçeği:
waves.sort.reverse = Ters Sırala
waves.sort.begin = Başla
waves.sort.health = Can
waves.sort.type = Tür
waves.units.hide = Hepsini Gizle
waves.units.show = Hepsini Göster
#bunlar özellikle küçük başlıyor. #bunlar özellikle küçük başlıyor.
wavemode.counts = miktarlar wavemode.counts = miktarlar
@@ -621,6 +628,8 @@ sector.biomassFacility.name = Sentetik BioMadde Santrali
sector.windsweptIslands.name = Rüzgarlı Adalar sector.windsweptIslands.name = Rüzgarlı Adalar
sector.extractionOutpost.name = Kazı Üssü sector.extractionOutpost.name = Kazı Üssü
sector.planetaryTerminal.name = Gezegenler Arası Terminal sector.planetaryTerminal.name = Gezegenler Arası Terminal
sector.coastline.name = Kıyı Şeridi
sector.navalFortress.name = Deniz Kalesi
sector.groundZero.description = Yeniden başlamak için ideal bölge. Düşük düşman tehlikesi ve az miktarda kaynak mevcut. Mümkün olduğunca çok bakır ve kurşun topla.\nİlerle. sector.groundZero.description = Yeniden başlamak için ideal bölge. Düşük düşman tehlikesi ve az miktarda kaynak mevcut. Mümkün olduğunca çok bakır ve kurşun topla.\nİlerle.
sector.frozenForest.description = Burada, dağlara yakın bölgelerde bile sporlar etrafa yayıldı. Dondurucu soğuk onları sonsuza dek durduramaz.\n\nEnerji kullanmaya başla. Termik jeneratörler inşa et. Tamircileri kullanmayı öğren. sector.frozenForest.description = Burada, dağlara yakın bölgelerde bile sporlar etrafa yayıldı. Dondurucu soğuk onları sonsuza dek durduramaz.\n\nEnerji kullanmaya başla. Termik jeneratörler inşa et. Tamircileri kullanmayı öğren.
@@ -1382,6 +1391,7 @@ hint.generator = \uf879 [accent]Termik Jeneratör[] kömür yakarak enerji üret
hint.guardian = [accent]Gardiyan[] birimleri güçlü bir zırha sahiptir. [accent]bakır[] ve [accent]kurşun[] gibi mermilere karşı [scarlet]Dayanıklıdır[].\n\nGardiyanları öldürmek için [accent]salvo[] gibi daha güçlü taretleri ve \uf835 [accent]grafit[] gibi daha çok hasar veren mermileri kullanın. hint.guardian = [accent]Gardiyan[] birimleri güçlü bir zırha sahiptir. [accent]bakır[] ve [accent]kurşun[] gibi mermilere karşı [scarlet]Dayanıklıdır[].\n\nGardiyanları öldürmek için [accent]salvo[] gibi daha güçlü taretleri ve \uf835 [accent]grafit[] gibi daha çok hasar veren mermileri kullanın.
hint.coreUpgrade = Merkezinizi, [accent]merkezinizin üstüne daha gelişmiş bir merkez[] koyarak geliştirebilirsiniz. \n\n[accent]Parçacık[] olarak adlandırılan fakirhanenizin üstüne [accent]Temel[] olarak adlandırılan merkezinizi koyun. Merkezinizin etrafında hiçbir yapı olmamalıdır. hint.coreUpgrade = Merkezinizi, [accent]merkezinizin üstüne daha gelişmiş bir merkez[] koyarak geliştirebilirsiniz. \n\n[accent]Parçacık[] olarak adlandırılan fakirhanenizin üstüne [accent]Temel[] olarak adlandırılan merkezinizi koyun. Merkezinizin etrafında hiçbir yapı olmamalıdır.
hint.presetLaunch = [accent]Donmuş Ormanlar[] gibi [accent]ana sektörlere iniş[] herhangi bir yerden yapılabilir. Yakındaki bir sektörden fırlatma gerektirmez.\n\nBunun gibi [accent]sayı ile isimlendirilmiş[] sektörleri ele geçirmek [accent]isteğe bağlıdır.[]. hint.presetLaunch = [accent]Donmuş Ormanlar[] gibi [accent]ana sektörlere iniş[] herhangi bir yerden yapılabilir. Yakındaki bir sektörden fırlatma gerektirmez.\n\nBunun gibi [accent]sayı ile isimlendirilmiş[] sektörleri ele geçirmek [accent]isteğe bağlıdır.[].
hint.presetDifficulty = Bu sektör, [scarlet]yüksek tehlike[] barındırıyor.\nBöyle bir sektöre hazırlıksız fırlatış yapmak [accent]tavsiye edilmez[].
hint.coreIncinerate = Bir çekirdek ağzına kadar dolduktan sonra, ekstra itemler [accent]eritilir[]. hint.coreIncinerate = Bir çekirdek ağzına kadar dolduktan sonra, ekstra itemler [accent]eritilir[].
hint.coopCampaign = Arkadaşlarınla Multiplayer Campaign oynarken, her yaptığınız Araştırma ve item aktarımı, senin oyun içi Campaign ine de aktarılır. hint.coopCampaign = Arkadaşlarınla Multiplayer Campaign oynarken, her yaptığınız Araştırma ve item aktarımı, senin oyun içi Campaign ine de aktarılır.
#Yukarıdaki bağzı cümleler Anti Dragon tarafından çevirildi. #Yukarıdaki bağzı cümleler Anti Dragon tarafından çevirildi.

File diff suppressed because it is too large Load Diff

View File

@@ -78,13 +78,12 @@ schematic.tagexists = 該標籤已存在。
stats = 統計 stats = 統計
stat.wave = 打敗的波次:[accent]{0} stat.wave = 打敗的波次:[accent]{0}
stat.enemiesDestroyed = 摧毀的敵人[accent]{0} stat.unitsCreated = 建造單位數[accent] {0}
stat.enemiesDestroyed = 摧毀敵人數:[accent]{0}
stat.built = 建設的建築:[accent]{0} stat.built = 建設的建築:[accent]{0}
stat.destroyed = 摧毀的建築:[accent]{0} stat.destroyed = 摧毀的建築:[accent]{0}
stat.deconstructed = 拆除的建築:[accent]{0} stat.deconstructed = 拆除的建築:[accent]{0}
stat.delivered = 發射的核心資源:
stat.playtime = 遊玩時間:[accent] {0} stat.playtime = 遊玩時間:[accent] {0}
stat.rank = 最終排名:[accent]{0}
globalitems = [accent]全域物品 globalitems = [accent]全域物品
map.delete = 確認要刪除「[accent]{0}[]」地圖嗎? map.delete = 確認要刪除「[accent]{0}[]」地圖嗎?
@@ -93,7 +92,8 @@ level.select = 選擇關卡
level.mode = 遊戲模式: level.mode = 遊戲模式:
coreattack = 〈核心正在受到攻擊!〉 coreattack = 〈核心正在受到攻擊!〉
nearpoint = 【[scarlet]立即離開空降區[]】\n湮滅即將來臨 nearpoint = 【[scarlet]立即離開空降區[]】\n湮滅即將來臨
database = 核心數據 database = 核心資料
database.button = 資料庫
savegame = 儲存遊戲 savegame = 儲存遊戲
loadgame = 載入遊戲 loadgame = 載入遊戲
joingame = 多人連線 joingame = 多人連線
@@ -169,6 +169,7 @@ launchcore = 發射核心
filename = 檔案名稱︰ filename = 檔案名稱︰
unlocked = 已解鎖新內容! unlocked = 已解鎖新內容!
available = 可研究新科技! available = 可研究新科技!
unlock.incampaign = <在戰役中解鎖>
completed = [accent]完成 completed = [accent]完成
techtree = 科技樹 techtree = 科技樹
research.legacy = [accent]5.0[] 偵測到舊有科技資料。\n請問要[accent]載入[]資料,還是[accent]放棄[]並重置新戰役的科技樹(建議) research.legacy = [accent]5.0[] 偵測到舊有科技資料。\n請問要[accent]載入[]資料,還是[accent]放棄[]並重置新戰役的科技樹(建議)
@@ -345,9 +346,9 @@ custom = 自訂
builtin = 内建 builtin = 内建
map.delete.confirm = 確認要刪除地圖嗎?此動作無法復原! map.delete.confirm = 確認要刪除地圖嗎?此動作無法復原!
map.random = [accent]隨機地圖 map.random = [accent]隨機地圖
map.nospawn = 這個地圖沒有核心!請在編輯器中添加一個[accent]橘色[]的核心。 map.nospawn = 這個地圖沒有核心!請在編輯器中添加一個[#{0}]{1}[]的核心。
map.nospawn.pvp = 這個地圖沒有敵對核心讓玩家重生!請在編輯器中添加一個[scarlet]不是橘色[]的核心。 map.nospawn.pvp = 這個地圖沒有敵對核心讓玩家重生!請在編輯器中添加一個[scarlet]不是橘色[]的核心。
map.nospawn.attack = 這個地圖沒有敵人核心可以攻擊!請在編輯器中添加一個[scarlet]紅色[]的核心。 map.nospawn.attack = 這個地圖沒有敵人核心可以攻擊!請在編輯器中添加一個[#{0}]{1}[]的核心。
map.invalid = 地圖載入錯誤:地圖可能已經損毀。 map.invalid = 地圖載入錯誤:地圖可能已經損毀。
workshop.update = 更新項目 workshop.update = 更新項目
workshop.error = 擷取工作坊詳細資訊時出錯:{0} workshop.error = 擷取工作坊詳細資訊時出錯:{0}
@@ -385,7 +386,8 @@ waves.waves = 波次
waves.perspawn = 每次生成 waves.perspawn = 每次生成
waves.shields = 護盾/波次 waves.shields = 護盾/波次
waves.to = waves.to =
waves.guardian = 頭目 waves.max = 最大單位數
waves.guardian = 守衛者
waves.preview = 預覽 waves.preview = 預覽
waves.edit = 編輯…… waves.edit = 編輯……
waves.copy = 複製到剪貼簿 waves.copy = 複製到剪貼簿
@@ -393,6 +395,11 @@ waves.load = 從剪貼簿載入
waves.invalid = 剪貼簿中的波次無效。 waves.invalid = 剪貼簿中的波次無效。
waves.copied = 波次已複製。 waves.copied = 波次已複製。
waves.none = 無自訂敵人。\n請注意若沒有波次佈局將自動替換為預設佈局。 waves.none = 無自訂敵人。\n請注意若沒有波次佈局將自動替換為預設佈局。
waves.sort = 分類排序:
waves.sort.reverse = 反向排序
waves.sort.begin = 開始
waves.sort.health = 血量
waves.sort.type = 兵種
#校正用空行 #校正用空行
wavemode.counts = 數量 wavemode.counts = 數量
@@ -564,6 +571,8 @@ weather.sandstorm.name = 沙塵暴
weather.sporestorm.name = 孢子風暴 weather.sporestorm.name = 孢子風暴
weather.fog.name = weather.fog.name =
sectorlist = 地區
sectorlist.attacked = {0} 遭受攻擊
sectors.unexplored = [lightgray]未探索 sectors.unexplored = [lightgray]未探索
sectors.resources = 資源: sectors.resources = 資源:
sectors.production = 生產: sectors.production = 生產:
@@ -646,10 +655,12 @@ status.sapped.name = 被吸血
status.electrified.name = 觸電 status.electrified.name = 觸電
status.spore-slowed.name = 孢子緩速 status.spore-slowed.name = 孢子緩速
status.tarred.name = 焦油 status.tarred.name = 焦油
status.overdrive.name = 超載
status.overclock.name = 快轉 status.overclock.name = 快轉
status.shocked.name = 電擊 status.shocked.name = 電擊
status.blasted.name = 爆炸 status.blasted.name = 爆炸
status.unmoving.name = 立定 status.unmoving.name = 立定
status.boss.name = 守衛者
settings.language = 語言 settings.language = 語言
settings.data = 遊戲資料 settings.data = 遊戲資料
@@ -1001,6 +1012,7 @@ rules.wavetimer = 波次時間
rules.waves = 波次 rules.waves = 波次
rules.attack = 攻擊模式 rules.attack = 攻擊模式
rules.buildai = 電腦自動建築 rules.buildai = 電腦自動建築
rules.aitier = AI 等級
rules.cleanupdeadteams = 移除戰敗玩家的建築(對戰) rules.cleanupdeadteams = 移除戰敗玩家的建築(對戰)
rules.corecapture = 佔領摧毀的核心 rules.corecapture = 佔領摧毀的核心
rules.polygoncoreprotection = 核心禁築區呈多邊形 rules.polygoncoreprotection = 核心禁築區呈多邊形
@@ -1020,12 +1032,15 @@ rules.deconstructrefundmultiplier = 拆除資源返還比例
rules.waitForWaveToEnd = 等待所有敵人毀滅才開始下一波次 rules.waitForWaveToEnd = 等待所有敵人毀滅才開始下一波次
rules.dropzoneradius = 空降區半徑:[lightgray](格) rules.dropzoneradius = 空降區半徑:[lightgray](格)
rules.unitammo = 單位需要彈藥 rules.unitammo = 單位需要彈藥
rules.enemyteam = 敵方隊伍
rules.playerteam = 玩家隊伍
rules.title.waves = 波次 rules.title.waves = 波次
rules.title.resourcesbuilding = 資源與建築 rules.title.resourcesbuilding = 資源與建築
rules.title.enemy = 敵人 rules.title.enemy = 敵人
rules.title.unit = 單位 rules.title.unit = 單位
rules.title.experimental = 實驗中 rules.title.experimental = 實驗中
rules.title.environment = 環境 rules.title.environment = 環境
rules.title.teams = 分隊
rules.lighting = 光照 rules.lighting = 光照
rules.enemyLights = 敵方發光 rules.enemyLights = 敵方發光
rules.fire = rules.fire =
@@ -1432,6 +1447,8 @@ block.item-source.description = 無限輸出物品。僅限沙盒。
block.item-void.description = 不使用能量銷毀任何進入它的物品。僅限沙盒。 block.item-void.description = 不使用能量銷毀任何進入它的物品。僅限沙盒。
block.liquid-source.description = 無限輸出液體。僅限沙盒。 block.liquid-source.description = 無限輸出液體。僅限沙盒。
block.liquid-void.description = 銷毀所有輸入的液體。僅限沙盒。 block.liquid-void.description = 銷毀所有輸入的液體。僅限沙盒。
block.payload-source.description = 無限輸出原料。僅限沙盒。
block.payload-void.description = 銷毀所有進入的原料。僅限沙盒。
block.copper-wall.description = 一種便宜的防禦方塊。\n用於前幾波防衛核心和砲塔。 block.copper-wall.description = 一種便宜的防禦方塊。\n用於前幾波防衛核心和砲塔。
block.copper-wall-large.description = 一種便宜的防禦方塊。\n用於前幾波防禦核心和砲塔\n佔據多個方塊。 block.copper-wall-large.description = 一種便宜的防禦方塊。\n用於前幾波防禦核心和砲塔\n佔據多個方塊。
block.titanium-wall.description = 一個中等強度的防禦方塊。\n提供對敵人的適度保護。 block.titanium-wall.description = 一個中等強度的防禦方塊。\n提供對敵人的適度保護。

View File

@@ -1,6 +1,6 @@
63743=spawn|block-spawn-ui 63743=spawn|block-spawn-ui
63742=deepwater|block-deepwater-ui 63742=deepwater|block-deepwater-ui
63741=water|block-water-ui 63741=shallow-water|block-shallow-water-ui
63740=tainted-water|block-tainted-water-ui 63740=tainted-water|block-tainted-water-ui
63739=darksand-tainted-water|block-darksand-tainted-water-ui 63739=darksand-tainted-water|block-darksand-tainted-water-ui
63738=sand-water|block-sand-water-ui 63738=sand-water|block-sand-water-ui
@@ -357,7 +357,6 @@
63357=crux|team-crux 63357=crux|team-crux
63358=derelict|team-derelict 63358=derelict|team-derelict
63350=deep-water|block-deep-water-ui 63350=deep-water|block-deep-water-ui
63349=shallow-water|block-shallow-water-ui
63348=molten-slag|block-molten-slag-ui 63348=molten-slag|block-molten-slag-ui
63347=crater-stone|block-crater-stone-ui 63347=crater-stone|block-crater-stone-ui
63346=deep-tainted-water|block-deep-tainted-water-ui 63346=deep-tainted-water|block-deep-tainted-water-ui

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -56,6 +56,9 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
Log.info("[GL] Using @ context.", gl30 != null ? "OpenGL 3" : "OpenGL 2"); Log.info("[GL] Using @ context.", gl30 != null ? "OpenGL 3" : "OpenGL 2");
if(maxTextureSize < 4096) Log.warn("[GL] Your maximum texture size is below the recommended minimum of 4096. This will cause severe performance issues."); if(maxTextureSize < 4096) Log.warn("[GL] Your maximum texture size is below the recommended minimum of 4096. This will cause severe performance issues.");
Log.info("[JAVA] Version: @", OS.javaVersion); Log.info("[JAVA] Version: @", OS.javaVersion);
long ram = Runtime.getRuntime().maxMemory();
boolean gb = ram >= 1024 * 1024 * 1024;
Log.info("[RAM] Available: @ @", Strings.fixed(gb ? ram / 1024f / 1024 / 1024f : ram / 1024f / 1024f, 1), gb ? "GB" : "MB");
Time.setDeltaProvider(() -> { Time.setDeltaProvider(() -> {
float result = Core.graphics.getDeltaTime() * 60f; float result = Core.graphics.getDeltaTime() * 60f;

View File

@@ -12,6 +12,7 @@ import mindustry.game.*;
import mindustry.game.Schematic.*; import mindustry.game.Schematic.*;
import mindustry.game.Teams.*; import mindustry.game.Teams.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.maps.generators.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.defense.*; import mindustry.world.blocks.defense.*;
@@ -25,7 +26,6 @@ import static mindustry.Vars.*;
public class BaseAI{ public class BaseAI{
private static final Vec2 axis = new Vec2(), rotator = new Vec2(); private static final Vec2 axis = new Vec2(), rotator = new Vec2();
private static final float correctPercent = 0.5f;
private static final int attempts = 4; private static final int attempts = 4;
private static final float emptyChance = 0.01f; private static final float emptyChance = 0.01f;
private static final int timerStep = 0, timerSpawn = 1, timerRefreshPath = 2; private static final int timerStep = 0, timerSpawn = 1, timerRefreshPath = 2;
@@ -46,6 +46,7 @@ public class BaseAI{
boolean calculating, startedCalculating; boolean calculating, startedCalculating;
int calcCount = 0; int calcCount = 0;
int totalCalcs = 0; int totalCalcs = 0;
Block wallType;
public BaseAI(TeamData data){ public BaseAI(TeamData data){
this.data = data; this.data = data;
@@ -53,6 +54,10 @@ public class BaseAI{
public void update(){ public void update(){
if(wallType == null){
wallType = BaseGenerator.getDifficultyWall(1, data.team.rules().aiTier / 0.8f);
}
if(data.team.rules().aiCoreSpawn && timer.get(timerSpawn, 60 * 2.5f) && data.hasCore()){ if(data.team.rules().aiCoreSpawn && timer.get(timerSpawn, 60 * 2.5f) && data.hasCore()){
CoreBlock block = (CoreBlock)data.core().block; CoreBlock block = (CoreBlock)data.core().block;
int coreUnits = Groups.unit.count(u -> u.team == data.team && u.type == block.unitType); int coreUnits = Groups.unit.count(u -> u.team == data.team && u.type == block.unitType);
@@ -271,7 +276,7 @@ public class BaseAI{
} }
private void tryWalls(){ private void tryWalls(){
Block wall = Blocks.copperWall; Block wall = wallType;
Building spawnt = state.rules.defaultTeam.core() != null ? state.rules.defaultTeam.core() : data.team.core(); Building spawnt = state.rules.defaultTeam.core() != null ? state.rules.defaultTeam.core() : data.team.core();
Tile spawn = spawnt == null ? null : spawnt.tile; Tile spawn = spawnt == null ? null : spawnt.tile;

View File

@@ -50,10 +50,12 @@ public class BlockIndexer{
clearFlags(); clearFlags();
Events.on(TilePreChangeEvent.class, event -> { Events.on(TilePreChangeEvent.class, event -> {
if(state.isEditor()) return;
removeIndex(event.tile); removeIndex(event.tile);
}); });
Events.on(TileChangeEvent.class, event -> { Events.on(TileChangeEvent.class, event -> {
if(state.isEditor()) return;
addIndex(event.tile); addIndex(event.tile);
}); });
@@ -109,7 +111,7 @@ public class BlockIndexer{
} }
} }
//update the unit cap when building is remove //update the unit cap when building is removed
data.unitCap -= tile.block().unitCapModifier; data.unitCap -= tile.block().unitCapModifier;
//unregister building from building quadtree //unregister building from building quadtree

View File

@@ -139,7 +139,7 @@ public class Pathfinder implements Runnable{
/** Starts or restarts the pathfinding thread. */ /** Starts or restarts the pathfinding thread. */
private void start(){ private void start(){
stop(); stop();
thread = Threads.daemon(this); thread = Threads.daemon("Pathfinder", this);
} }
/** Stops the pathfinding thread. */ /** Stops the pathfinding thread. */

View File

@@ -56,7 +56,7 @@ public class WaveSpawner{
public void spawnEnemies(){ public void spawnEnemies(){
spawning = true; spawning = true;
eachGroundSpawn((spawnX, spawnY, doShockwave) -> { eachGroundSpawn(-1, (spawnX, spawnY, doShockwave) -> {
if(doShockwave){ if(doShockwave){
doShockwave(spawnX, spawnY); doShockwave(spawnX, spawnY);
} }
@@ -70,7 +70,7 @@ public class WaveSpawner{
if(group.type.flying){ if(group.type.flying){
float spread = margin / 1.5f; float spread = margin / 1.5f;
eachFlyerSpawn((spawnX, spawnY) -> { eachFlyerSpawn(group.spawn, (spawnX, spawnY) -> {
for(int i = 0; i < spawned; i++){ for(int i = 0; i < spawned; i++){
Unit unit = group.createUnit(state.rules.waveTeam, state.wave - 1); Unit unit = group.createUnit(state.rules.waveTeam, state.wave - 1);
unit.set(spawnX + Mathf.range(spread), spawnY + Mathf.range(spread)); unit.set(spawnX + Mathf.range(spread), spawnY + Mathf.range(spread));
@@ -80,7 +80,7 @@ public class WaveSpawner{
}else{ }else{
float spread = tilesize * 2; float spread = tilesize * 2;
eachGroundSpawn((spawnX, spawnY, doShockwave) -> { eachGroundSpawn(group.spawn, (spawnX, spawnY, doShockwave) -> {
for(int i = 0; i < spawned; i++){ for(int i = 0; i < spawned; i++){
Tmp.v1.rnd(spread); Tmp.v1.rnd(spread);
@@ -102,12 +102,14 @@ public class WaveSpawner{
} }
public void eachGroundSpawn(Intc2 cons){ public void eachGroundSpawn(Intc2 cons){
eachGroundSpawn((x, y, shock) -> cons.get(World.toTile(x), World.toTile(y))); eachGroundSpawn(-1, (x, y, shock) -> cons.get(World.toTile(x), World.toTile(y)));
} }
private void eachGroundSpawn(SpawnConsumer cons){ private void eachGroundSpawn(int filterPos, SpawnConsumer cons){
if(state.hasSpawns()){ if(state.hasSpawns()){
for(Tile spawn : spawns){ for(Tile spawn : spawns){
if(filterPos != -1 && filterPos != spawn.pos()) continue;
cons.accept(spawn.worldx(), spawn.worldy(), true); cons.accept(spawn.worldx(), spawn.worldy(), true);
} }
} }
@@ -115,6 +117,8 @@ public class WaveSpawner{
if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam) && !state.teams.playerCores().isEmpty()){ if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam) && !state.teams.playerCores().isEmpty()){
Building firstCore = state.teams.playerCores().first(); Building firstCore = state.teams.playerCores().first();
for(Building core : state.rules.waveTeam.cores()){ for(Building core : state.rules.waveTeam.cores()){
if(filterPos != -1 && filterPos != core.pos()) continue;
Tmp.v1.set(firstCore).sub(core).limit(coreMargin + core.block.size * tilesize /2f * Mathf.sqrt2); Tmp.v1.set(firstCore).sub(core).limit(coreMargin + core.block.size * tilesize /2f * Mathf.sqrt2);
boolean valid = false; boolean valid = false;
@@ -147,8 +151,10 @@ public class WaveSpawner{
} }
} }
private void eachFlyerSpawn(Floatc2 cons){ private void eachFlyerSpawn(int filterPos, Floatc2 cons){
for(Tile tile : spawns){ for(Tile tile : spawns){
if(filterPos != -1 && filterPos != tile.pos()) continue;
float angle = Angles.angle(world.width() / 2f, world.height() / 2f, tile.x, tile.y); float angle = Angles.angle(world.width() / 2f, world.height() / 2f, tile.x, tile.y);
float trns = Math.max(world.width(), world.height()) * Mathf.sqrt2 * tilesize; float trns = Math.max(world.width(), world.height()) * Mathf.sqrt2 * tilesize;
float spawnX = Mathf.clamp(world.width() * tilesize / 2f + Angles.trnsx(angle, trns), -margin, world.width() * tilesize + margin); float spawnX = Mathf.clamp(world.width() * tilesize / 2f + Angles.trnsx(angle, trns), -margin, world.width() * tilesize + margin);
@@ -158,6 +164,8 @@ public class WaveSpawner{
if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam)){ if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam)){
for(Building core : state.rules.waveTeam.data().cores){ for(Building core : state.rules.waveTeam.data().cores){
if(filterPos != -1 && filterPos != core.pos()) continue;
cons.get(core.x, core.y); cons.get(core.x, core.y);
} }
} }
@@ -171,7 +179,7 @@ public class WaveSpawner{
public int countFlyerSpawns(){ public int countFlyerSpawns(){
tmpCount = 0; tmpCount = 0;
eachFlyerSpawn((x, y) -> tmpCount ++); eachFlyerSpawn(-1, (x, y) -> tmpCount ++);
return tmpCount; return tmpCount;
} }

View File

@@ -179,7 +179,7 @@ public class SoundControl{
float avol = Core.settings.getInt("ambientvol", 100) / 100f; float avol = Core.settings.getInt("ambientvol", 100) / 100f;
sounds.each((sound, data) -> { sounds.each((sound, data) -> {
data.curVolume = Mathf.lerpDelta(data.curVolume, data.volume * avol, 0.2f); data.curVolume = Mathf.lerpDelta(data.curVolume, data.volume * avol, 0.11f);
boolean play = data.curVolume > 0.01f; boolean play = data.curVolume > 0.01f;
float pan = Mathf.zero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total); float pan = Mathf.zero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total);

View File

@@ -1199,6 +1199,7 @@ public class Blocks implements ContentList{
distributor = new Router("distributor"){{ distributor = new Router("distributor"){{
requirements(Category.distribution, with(Items.lead, 4, Items.copper, 4)); requirements(Category.distribution, with(Items.lead, 4, Items.copper, 4));
buildCostMultiplier = 3f;
size = 2; size = 2;
}}; }};

View File

@@ -32,7 +32,9 @@ public class Fx{
//lifetime is how many frames it takes to fade out the trail //lifetime is how many frames it takes to fade out the trail
e.lifetime = trail.length * 1.4f; e.lifetime = trail.length * 1.4f;
trail.shorten(); if(!state.isPaused()){
trail.shorten();
}
trail.drawCap(e.color, e.rotation); trail.drawCap(e.color, e.rotation);
trail.draw(e.color, e.rotation); trail.draw(e.color, e.rotation);
}), }),

View File

@@ -10,7 +10,8 @@ public class SectorPresets implements ContentList{
groundZero, groundZero,
craters, biomassFacility, frozenForest, ruinousShores, windsweptIslands, stainedMountains, tarFields, craters, biomassFacility, frozenForest, ruinousShores, windsweptIslands, stainedMountains, tarFields,
fungalPass, extractionOutpost, saltFlats, overgrowth, fungalPass, extractionOutpost, saltFlats, overgrowth,
impact0078, desolateRift, nuclearComplex, planetaryTerminal; impact0078, desolateRift, nuclearComplex, planetaryTerminal,
coastline, navalFortress;
@Override @Override
public void load(){ public void load(){
@@ -64,6 +65,15 @@ public class SectorPresets implements ContentList{
useAI = false; useAI = false;
}}; }};
coastline = new SectorPreset("coastline", serpulo, 108){{
captureWave = 30;
difficulty = 5;
}};
navalFortress = new SectorPreset("navalFortress", serpulo, 216){{
difficulty = 9;
}};
fungalPass = new SectorPreset("fungalPass", serpulo, 21){{ fungalPass = new SectorPreset("fungalPass", serpulo, 21){{
difficulty = 4; difficulty = 4;
useAI = false; useAI = false;

View File

@@ -421,11 +421,11 @@ public class TechTree implements ContentList{
}); });
}); });
node(retusa, () -> { node(retusa, Seq.with(new SectorComplete(windsweptIslands)), () -> {
node(oxynoe, () -> { node(oxynoe, Seq.with(new SectorComplete(coastline)), () -> {
node(cyerce, () -> { node(cyerce, () -> {
node(aegires, () -> { node(aegires, () -> {
node(navanax, () -> { node(navanax, Seq.with(new SectorComplete(navalFortress)), () -> {
}); });
}); });
@@ -531,7 +531,22 @@ public class TechTree implements ContentList{
new Research(airFactory), new Research(airFactory),
new Research(door) new Research(door)
), () -> { ), () -> {
node(coastline, Seq.with(
new SectorComplete(windsweptIslands),
new Research(navalFactory),
new Research(payloadConveyor)
), () -> {
node(navalFortress, Seq.with(
new SectorComplete(coastline),
new SectorComplete(extractionOutpost),
new Research(oxynoe),
new Research(minke),
new Research(cyclone),
new Research(ripple)
), () -> {
});
});
}); });
}); });
}); });

View File

@@ -8,8 +8,9 @@ import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.game.EventType.*;
import mindustry.entities.bullet.*; import mindustry.entities.bullet.*;
import mindustry.game.EventType.*;
import mindustry.io.*;
import mindustry.mod.Mods.*; import mindustry.mod.Mods.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
@@ -206,10 +207,16 @@ public class ContentLoader{
} }
public <T extends MappableContent> T getByName(ContentType type, String name){ public <T extends MappableContent> T getByName(ContentType type, String name){
if(contentNameMap[type.ordinal()] == null){ var map = contentNameMap[type.ordinal()];
return null;
if(map == null) return null;
//load fallbacks
if(type == ContentType.block){
name = SaveVersion.modContentNameMap.get(name, name);
} }
return (T)contentNameMap[type.ordinal()].get(name);
return (T)map.get(name);
} }
public <T extends Content> T getByID(ContentType type, int id){ public <T extends Content> T getByID(ContentType type, int id){

View File

@@ -218,6 +218,8 @@ public class NetClient implements ApplicationListener{
throw new ValidateException(player, "Player has sent a message above the text limit."); throw new ValidateException(player, "Player has sent a message above the text limit.");
} }
message = message.replace("\n", "");
Events.fire(new PlayerChatEvent(player, message)); Events.fire(new PlayerChatEvent(player, message));
//log commands before they are handled //log commands before they are handled

View File

@@ -397,7 +397,9 @@ public class NetServer implements ApplicationListener{
} }
if(found != null){ if(found != null){
if(found.admin){ if(found == player){
player.sendMessage("[scarlet]You can't vote to kick yourself.");
}else if(found.admin){
player.sendMessage("[scarlet]Did you really expect to be able to kick an admin?"); player.sendMessage("[scarlet]Did you really expect to be able to kick an admin?");
}else if(found.isLocal()){ }else if(found.isLocal()){
player.sendMessage("[scarlet]Local players cannot be kicked."); player.sendMessage("[scarlet]Local players cannot be kicked.");

View File

@@ -114,7 +114,7 @@ public class Renderer implements ApplicationListener{
public void update(){ public void update(){
Color.white.set(1f, 1f, 1f, 1f); Color.white.set(1f, 1f, 1f, 1f);
float dest = Mathf.round(targetscale, 0.5f); float dest = Mathf.clamp(Mathf.round(targetscale, 0.5f), minScale(), maxScale());
camerascale = Mathf.lerpDelta(camerascale, dest, 0.1f); camerascale = Mathf.lerpDelta(camerascale, dest, 0.1f);
if(Mathf.equal(camerascale, dest, 0.001f)) camerascale = dest; if(Mathf.equal(camerascale, dest, 0.001f)) camerascale = dest;
laserOpacity = settings.getInt("lasersopacity") / 100f; laserOpacity = settings.getInt("lasersopacity") / 100f;
@@ -504,6 +504,8 @@ public class Renderer implements ApplicationListener{
public void showLaunch(CoreBlock coreType){ public void showLaunch(CoreBlock coreType){
Vars.ui.hudfrag.showLaunch(); Vars.ui.hudfrag.showLaunch();
Vars.control.input.frag.config.hideConfig();
Vars.control.input.frag.inv.hide();
launchCoreType = coreType; launchCoreType = coreType;
launching = true; launching = true;
landCore = player.team().core(); landCore = player.team().core();

View File

@@ -18,7 +18,7 @@ import mindustry.world.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class MapEditor{ public class MapEditor{
public static final int[] brushSizes = {1, 2, 3, 4, 5, 9, 15, 20}; public static final float[] brushSizes = {1, 1.5f, 2, 3, 4, 5, 9, 15, 20};
public StringMap tags = new StringMap(); public StringMap tags = new StringMap();
public MapRenderer renderer = new MapRenderer(); public MapRenderer renderer = new MapRenderer();
@@ -28,7 +28,7 @@ public class MapEditor{
private DrawOperation currentOp; private DrawOperation currentOp;
private boolean loading; private boolean loading;
public int brushSize = 1; public float brushSize = 1;
public int rotation; public int rotation;
public Block drawBlock = Blocks.stone; public Block drawBlock = Blocks.stone;
public Team drawTeam = Team.sharded; public Team drawTeam = Team.sharded;
@@ -227,8 +227,9 @@ public class MapEditor{
} }
public void drawCircle(int x, int y, Cons<Tile> drawer){ public void drawCircle(int x, int y, Cons<Tile> drawer){
for(int rx = -brushSize; rx <= brushSize; rx++){ int clamped = (int)brushSize;
for(int ry = -brushSize; ry <= brushSize; ry++){ for(int rx = -clamped; rx <= clamped; rx++){
for(int ry = -clamped; ry <= clamped; ry++){
if(Mathf.within(rx, ry, brushSize - 0.5f + 0.0001f)){ if(Mathf.within(rx, ry, brushSize - 0.5f + 0.0001f)){
int wx = x + rx, wy = y + ry; int wx = x + rx, wy = y + ry;
@@ -243,8 +244,9 @@ public class MapEditor{
} }
public void drawSquare(int x, int y, Cons<Tile> drawer){ public void drawSquare(int x, int y, Cons<Tile> drawer){
for(int rx = -brushSize; rx <= brushSize; rx++){ int clamped = (int)brushSize;
for(int ry = -brushSize; ry <= brushSize; ry++){ for(int rx = -clamped; rx <= clamped; rx++){
for(int ry = -clamped; ry <= clamped; ry++){
int wx = x + rx, wy = y + ry; int wx = x + rx, wy = y + ry;
if(wx < 0 || wy < 0 || wx >= width() || wy >= height()){ if(wx < 0 || wy < 0 || wx >= width() || wy >= height()){

View File

@@ -576,13 +576,11 @@ public class MapEditorDialog extends Dialog implements Disposable{
}).growX().top(); }).growX().top();
} }
if(experimental){ mid.row();
mid.row();
mid.table(t -> { mid.table(t -> {
t.button("Cliffs", Icon.terrain, Styles.cleart, editor::addCliffs).growX().margin(9f); t.button("@editor.cliffs", Icon.terrain, Styles.cleart, editor::addCliffs).growX().margin(9f);
}).growX().top(); }).growX().top();
}
}).margin(0).left().growY(); }).margin(0).left().growY();

View File

@@ -10,6 +10,7 @@ import mindustry.content.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.environment.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -132,6 +133,11 @@ public class MapRenderer implements Disposable{
wall.editorVariantRegions()[Mathf.randomSeed(idxWall, 0, wall.editorVariantRegions().length - 1)] : wall.editorVariantRegions()[Mathf.randomSeed(idxWall, 0, wall.editorVariantRegions().length - 1)] :
wall.editorIcon(); wall.editorIcon();
if(wall == Blocks.cliff){
mesh.setColor(Tmp.c1.set(floor.mapColor).mul(1.6f));
region = ((Cliff)Blocks.cliff).editorCliffs[tile.data & 0xff];
}
offsetX = tilesize / 2f - region.width / 2f * Draw.scl; offsetX = tilesize / 2f - region.width / 2f * Draw.scl;
offsetY = tilesize / 2f - region.height / 2f * Draw.scl; offsetY = tilesize / 2f - region.height / 2f * Draw.scl;
}else if(wall == Blocks.air && !tile.overlay().isAir()){ }else if(wall == Blocks.air && !tile.overlay().isAir()){

View File

@@ -38,7 +38,8 @@ public class MapView extends Element implements GestureListener{
for(int i = 0; i < MapEditor.brushSizes.length; i++){ for(int i = 0; i < MapEditor.brushSizes.length; i++){
float size = MapEditor.brushSizes[i]; float size = MapEditor.brushSizes[i];
brushPolygons[i] = Geometry.pixelCircle(size, (index, x, y) -> Mathf.dst(x, y, index, index) <= index - 0.5f); float mod = size % 1f;
brushPolygons[i] = Geometry.pixelCircle(size, (index, x, y) -> Mathf.dst(x, y, index - mod, index - mod) <= size - 0.5f);
} }
Core.input.getInputProcessors().insert(0, new GestureDetector(20, 0.5f, 2, 0.15f, this)); Core.input.getInputProcessors().insert(0, new GestureDetector(20, 0.5f, 2, 0.15f, this));

View File

@@ -38,8 +38,14 @@ public class WaveGraph extends Table{
lay.setText(font, "1"); lay.setText(font, "1");
int maxY = switch(mode){
case counts -> nextStep(max);
case health -> nextStep((int)maxHealth);
case totals -> nextStep(maxTotal);
};
float fh = lay.height; float fh = lay.height;
float offsetX = Scl.scl(30f), offsetY = Scl.scl(22f) + fh + Scl.scl(5f); float offsetX = Scl.scl(lay.width * (maxY + "").length() * 2), offsetY = Scl.scl(22f) + fh + Scl.scl(5f);
float graphX = x + offsetX, graphY = y + offsetY, graphW = width - offsetX, graphH = height - offsetY; float graphX = x + offsetX, graphY = y + offsetY, graphW = width - offsetX, graphH = height - offsetY;
float spacing = graphW / (values.length - 1); float spacing = graphW / (values.length - 1);
@@ -53,7 +59,7 @@ public class WaveGraph extends Table{
for(int i = 0; i < values.length; i++){ for(int i = 0; i < values.length; i++){
int val = values[i][type.id]; int val = values[i][type.id];
float cx = graphX + i*spacing, cy = graphY + val * graphH / max; float cx = graphX + i * spacing, cy = graphY + val * graphH / maxY;
Lines.linePoint(cx, cy); Lines.linePoint(cx, cy);
} }
@@ -69,7 +75,7 @@ public class WaveGraph extends Table{
sum += values[i][type.id]; sum += values[i][type.id];
} }
float cx = graphX + i*spacing, cy = graphY + sum * graphH / maxTotal; float cx = graphX + i * spacing, cy = graphY + sum * graphH / maxY;
Lines.linePoint(cx, cy); Lines.linePoint(cx, cy);
} }
@@ -84,7 +90,7 @@ public class WaveGraph extends Table{
sum += (type.health) * values[i][type.id]; sum += (type.health) * values[i][type.id];
} }
float cx = graphX + i*spacing, cy = graphY + sum * graphH / maxHealth; float cx = graphX + i * spacing, cy = graphY + sum * graphH / maxY;
Lines.linePoint(cx, cy); Lines.linePoint(cx, cy);
} }
@@ -92,19 +98,23 @@ public class WaveGraph extends Table{
} }
//how many numbers can fit here //how many numbers can fit here
float totalMarks = (graphH - getMarginBottom() *2f) / (lay.height * 2); float totalMarks = Mathf.clamp(maxY, 1, 10);
int markSpace = Math.max(1, Mathf.ceil(max / totalMarks)); int markSpace = Math.max(1, Mathf.ceil(maxY / totalMarks));
Draw.color(Color.lightGray); Draw.color(Color.lightGray);
for(int i = 0; i < max; i += markSpace){ Draw.alpha(0.1f);
float cy = graphY + i * graphH / max, cx = graphX;
//Lines.line(cx, cy, cx + len, cy); for(int i = 0; i < maxY; i += markSpace){
float cy = graphY + i * graphH / maxY, cx = graphX;
Lines.line(cx, cy, cx + graphW, cy);
lay.setText(font, "" + i); lay.setText(font, "" + i);
font.draw("" + i, cx, cy + lay.height/2f, Align.right); font.draw("" + i, cx, cy + lay.height / 2f, Align.right);
} }
Draw.alpha(1f);
float len = Scl.scl(4f); float len = Scl.scl(4f);
font.setColor(Color.lightGray); font.setColor(Color.lightGray);
@@ -113,7 +123,7 @@ public class WaveGraph extends Table{
float cy = y + fh, cx = graphX + graphW / (values.length - 1) * i; float cy = y + fh, cx = graphX + graphW / (values.length - 1) * i;
Lines.line(cx, cy, cx, cy + len); Lines.line(cx, cy, cx, cy + len);
if(i == values.length/2){ if(i == values.length / 2){
font.draw("" + (i + from + 1), cx, cy - Scl.scl(2f), Align.center); font.draw("" + (i + from + 1), cx, cy - Scl.scl(2f), Align.center);
} }
} }
@@ -164,13 +174,24 @@ public class WaveGraph extends Table{
sum += spawned; sum += spawned;
} }
maxTotal = Math.max(maxTotal, sum); maxTotal = Math.max(maxTotal, sum);
maxHealth = Math.max(maxHealth,healthsum); maxHealth = Math.max(maxHealth, healthsum);
} }
ObjectSet<UnitType> usedCopy = new ObjectSet<>(used); ObjectSet<UnitType> usedCopy = new ObjectSet<>(used);
colors.clear(); colors.clear();
colors.left(); colors.left();
colors.button("@waves.units.hide", Styles.cleart, () -> {
if(hidden.size == usedCopy.size){
hidden.clear();
}else{
hidden.addAll(usedCopy);
}
used.clear();
used.addAll(usedCopy);
for(UnitType o : hidden) used.remove(o);
}).update(b -> b.setText(hidden.size == usedCopy.size ? "@waves.units.show" : "@waves.units.hide")).height(32f).width(130f);
colors.pane(t -> { colors.pane(t -> {
t.left(); t.left();
for(UnitType type : used){ for(UnitType type : used){
@@ -200,6 +221,23 @@ public class WaveGraph extends Table{
return Tmp.c1.fromHsv(type.id / (float)Vars.content.units().size * 360f, 0.7f, 1f); return Tmp.c1.fromHsv(type.id / (float)Vars.content.units().size * 360f, 0.7f, 1f);
} }
int nextStep(float value){
int order = 1;
while(order < value){
if(order * 2 > value){
return order * 2;
}
if(order * 5 > value){
return order * 5;
}
if(order * 10 > value){
return order * 10;
}
order *= 10;
}
return order;
}
enum Mode{ enum Mode{
counts, totals, health; counts, totals, health;

View File

@@ -1,9 +1,9 @@
package mindustry.editor; package mindustry.editor;
import arc.*; import arc.*;
import arc.func.*;
import arc.graphics.*; import arc.graphics.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*;
import arc.scene.event.*; import arc.scene.event.*;
import arc.scene.style.*; import arc.scene.style.*;
import arc.scene.ui.*; import arc.scene.ui.*;
@@ -20,6 +20,8 @@ import mindustry.type.*;
import mindustry.ui.*; import mindustry.ui.*;
import mindustry.ui.dialogs.*; import mindustry.ui.dialogs.*;
import java.util.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
import static mindustry.game.SpawnGroup.*; import static mindustry.game.SpawnGroup.*;
@@ -68,41 +70,46 @@ public class WaveInfoDialog extends BaseDialog{
addCloseButton(); addCloseButton();
buttons.button("@waves.edit", () -> { buttons.button("@waves.edit", Icon.pencil, () -> {
BaseDialog dialog = new BaseDialog("@waves.edit"); BaseDialog dialog = new BaseDialog("@waves.edit");
dialog.addCloseButton(); dialog.addCloseButton();
dialog.setFillParent(false); dialog.setFillParent(false);
dialog.cont.defaults().size(210f, 64f); dialog.cont.table(Tex.button, t -> {
dialog.cont.button("@waves.copy", () -> { var style = Styles.cleart;
ui.showInfoFade("@waves.copied"); t.defaults().size(210f, 58f);
Core.app.setClipboardText(maps.writeWaves(groups));
dialog.hide(); t.button("@waves.copy", Icon.copy, style, () -> {
}).disabled(b -> groups == null); ui.showInfoFade("@waves.copied");
dialog.cont.row(); Core.app.setClipboardText(maps.writeWaves(groups));
dialog.cont.button("@waves.load", () -> { dialog.hide();
try{ }).disabled(b -> groups == null).marginLeft(12f).row();
groups = maps.readWaves(Core.app.getClipboardText());
t.button("@waves.load", Icon.download, style, () -> {
try{
groups = maps.readWaves(Core.app.getClipboardText());
buildGroups();
}catch(Exception e){
e.printStackTrace();
ui.showErrorMessage("@waves.invalid");
}
dialog.hide();
}).marginLeft(12f).disabled(b -> Core.app.getClipboardText() == null || Core.app.getClipboardText().isEmpty()).row();
t.button("@settings.reset", Icon.upload, style, () -> ui.showConfirm("@confirm", "@settings.clear.confirm", () -> {
groups = JsonIO.copy(waves.get());
buildGroups(); buildGroups();
}catch(Exception e){ dialog.hide();
e.printStackTrace(); })).marginLeft(12f).row();
ui.showErrorMessage("@waves.invalid");
} t.button("@clear", Icon.cancel, style, () -> ui.showConfirm("@confirm", "@settings.clear.confirm", () -> {
dialog.hide(); groups.clear();
}).disabled(b -> Core.app.getClipboardText() == null || Core.app.getClipboardText().isEmpty()); buildGroups();
dialog.cont.row(); dialog.hide();
dialog.cont.button("@settings.reset", () -> ui.showConfirm("@confirm", "@settings.clear.confirm", () -> { })).marginLeft(12f);
groups = JsonIO.copy(waves.get()); });
buildGroups();
dialog.hide();
}));
dialog.cont.row();
dialog.cont.button("@clear", () -> ui.showConfirm("@confirm", "@settings.clear.confirm", () -> {
groups.clear();
buildGroups();
dialog.hide();
}));
dialog.show(); dialog.show();
}).size(270f, 64f); }).size(250f, 64f);
buttons.defaults().width(60f); buttons.defaults().width(60f);
@@ -205,6 +212,13 @@ public class WaveInfoDialog extends BaseDialog{
b.label(() -> (group.begin + 1) + "").color(Color.lightGray).minWidth(45f).labelAlign(Align.left).left(); b.label(() -> (group.begin + 1) + "").color(Color.lightGray).minWidth(45f).labelAlign(Align.left).left();
b.button(Icon.copySmall, Styles.emptyi, () -> {
SpawnGroup newGroup = group.copy();
expandedGroup = newGroup;
groups.add(newGroup);
buildGroups();
}).pad(-6).size(46f);
b.button(group.effect != null && group.effect != StatusEffects.none ? b.button(group.effect != null && group.effect != StatusEffects.none ?
new TextureRegionDrawable(group.effect.uiIcon) : new TextureRegionDrawable(group.effect.uiIcon) :
Icon.logicSmall, Icon.logicSmall,
@@ -215,7 +229,7 @@ public class WaveInfoDialog extends BaseDialog{
groups.remove(group); groups.remove(group);
table.getCell(t).pad(0f); table.getCell(t).pad(0f);
t.remove(); t.remove();
updateWaves(); buildGroups();
}).pad(-6).size(46f).padRight(-12f); }).pad(-6).size(46f).padRight(-12f);
}, () -> { }, () -> {
expandedGroup = expandedGroup == group ? null : group; expandedGroup = expandedGroup == group ? null : group;
@@ -303,7 +317,30 @@ public class WaveInfoDialog extends BaseDialog{
t.check("@waves.guardian", b -> { t.check("@waves.guardian", b -> {
group.effect = (b ? StatusEffects.boss : null); group.effect = (b ? StatusEffects.boss : null);
buildGroups(); buildGroups();
}).padTop(4).update(b -> b.setChecked(group.effect == StatusEffects.boss)).padBottom(8f); }).padTop(4).update(b -> b.setChecked(group.effect == StatusEffects.boss)).padBottom(8f).row();
//spawn positions are clunky and thus experimental for now
if(experimental){
t.table(a -> {
a.add("spawn at ");
a.field(group.spawn == -1 ? "" : Point2.x(group.spawn) + "", TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePositiveInt(text)){
group.spawn = Point2.pack(Strings.parseInt(text), Point2.y(group.spawn));
Log.info(group.spawn);
}
}).width(70f);
a.add(",");
a.field(group.spawn == -1 ? "" : Point2.y(group.spawn) + "", TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePositiveInt(text)){
group.spawn = Point2.pack(Point2.x(group.spawn), Strings.parseInt(text));
Log.info(group.spawn);
}
}).width(70f);
}).padBottom(8f).padTop(-8f).row();
}
} }
}).width(340f).pad(8); }).width(340f).pad(8);
@@ -374,15 +411,15 @@ public class WaveInfoDialog extends BaseDialog{
} }
enum Sort{ enum Sort{
begin(g -> g.begin), begin(Structs.comps(Structs.comparingFloat(g -> g.begin), Structs.comparingFloat(g -> g.type.id))),
health(g -> g.type.health), health(Structs.comps(Structs.comparingFloat(g -> g.type.health), Structs.comparingFloat(g -> g.begin))),
type(g -> g.type.id); type(Structs.comps(Structs.comparingFloat(g -> g.type.id), Structs.comparingFloat(g -> g.begin)));
static final Sort[] all = values(); static final Sort[] all = values();
final Floatf<SpawnGroup> sort; final Comparator<SpawnGroup> sort;
Sort(Floatf<SpawnGroup> sort){ Sort(Comparator<SpawnGroup> sort){
this.sort = sort; this.sort = sort;
} }
} }

View File

@@ -26,7 +26,7 @@ public class EnergyFieldAbility extends Ability{
public Sound shootSound = Sounds.spark; public Sound shootSound = Sounds.spark;
public float statusDuration = 60f * 6f; public float statusDuration = 60f * 6f;
public float x, y; public float x, y;
public boolean hitBuildings = true; public boolean targetGround = true, targetAir = true, hitBuildings = true, hitUnits = true;
public int maxTargets = 25; public int maxTargets = 25;
public float healPercent = 2.5f; public float healPercent = 2.5f;
@@ -99,13 +99,15 @@ public class EnergyFieldAbility extends Ability{
all.clear(); all.clear();
Units.nearby(null, rx, ry, range, other -> { if(hitUnits){
if(other != unit){ Units.nearby(null, rx, ry, range, other -> {
all.add(other); if(other != unit && (other.isFlying() ? targetAir : targetGround)){
} all.add(other);
}); }
});
}
if(hitBuildings){ if(hitBuildings && targetGround){
Units.nearbyBuildings(rx, ry, range, b -> { Units.nearbyBuildings(rx, ry, range, b -> {
if(b.team != Team.derelict || state.rules.coreCapture){ if(b.team != Team.derelict || state.rules.coreCapture){
all.add(b); all.add(b);

View File

@@ -346,13 +346,7 @@ public class BulletType extends Content implements Cloneable{
} }
public void update(Bullet b){ public void update(Bullet b){
if(!headless && trailLength > 0){ updateTrail(b);
if(b.trail == null){
b.trail = new Trail(trailLength);
}
b.trail.length = trailLength;
b.trail.update(b.x, b.y, trailInterp.apply(b.fin()));
}
if(homingPower > 0.0001f && b.time >= homingDelay){ if(homingPower > 0.0001f && b.time >= homingDelay){
Teamc target; Teamc target;
@@ -387,6 +381,16 @@ public class BulletType extends Content implements Cloneable{
} }
} }
public void updateTrail(Bullet b){
if(!headless && trailLength > 0){
if(b.trail == null){
b.trail = new Trail(trailLength);
}
b.trail.length = trailLength;
b.trail.update(b.x, b.y, trailInterp.apply(b.fin()));
}
}
@Override @Override
public void init(){ public void init(){
if(pierceCap >= 1){ if(pierceCap >= 1){

View File

@@ -94,6 +94,10 @@ abstract class BuilderComp implements Posc, Statusc, Teamc, Rotc{
if(!within(tile, finalPlaceDst)) return; if(!within(tile, finalPlaceDst)) return;
if(!headless){
Vars.control.sound.loop(Sounds.build, tile, 0.51f);
}
if(!(tile.build instanceof ConstructBuild cb)){ if(!(tile.build instanceof ConstructBuild cb)){
if(!current.initialized && !current.breaking && Build.validPlace(current.block, team, current.x, current.y, current.rotation)){ if(!current.initialized && !current.breaking && Build.validPlace(current.block, team, current.x, current.y, current.rotation)){
boolean hasAll = infinite || current.isRotation(team) || !Structs.contains(current.block.requirements, i -> core != null && !core.items.has(i.item, Math.min(Mathf.round(i.amount * state.rules.buildCostMultiplier), 1))); boolean hasAll = infinite || current.isRotation(team) || !Structs.contains(current.block.requirements, i -> core != null && !core.items.has(i.item, Math.min(Mathf.round(i.amount * state.rules.buildCostMultiplier), 1)));

View File

@@ -1509,6 +1509,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
} }
} }
if(cons != null){
cons.update();
}
if(enabled || !block.noUpdateDisabled){ if(enabled || !block.noUpdateDisabled){
updateTile(); updateTile();
} }
@@ -1521,10 +1525,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
liquids.update(updateFlow); liquids.update(updateFlow);
} }
if(cons != null){
cons.update();
}
if(power != null){ if(power != null){
power.graph.update(); power.graph.update();
} }

View File

@@ -11,7 +11,6 @@ import arc.util.*;
import mindustry.ai.*; import mindustry.ai.*;
import mindustry.ai.types.*; import mindustry.ai.types.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.core.*; import mindustry.core.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.entities.*; import mindustry.entities.*;
@@ -486,12 +485,13 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
if(!spawnedByCore){ if(!spawnedByCore){
Damage.dynamicExplosion(x, y, flammability, explosiveness, power, bounds() / 2f, state.rules.damageExplosions, item().flammability > 1, team, type.deathExplosionEffect); Damage.dynamicExplosion(x, y, flammability, explosiveness, power, bounds() / 2f, state.rules.damageExplosions, item().flammability > 1, team, type.deathExplosionEffect);
}else{
type.deathExplosionEffect.at(x, y, bounds() / 2f / 8f);
} }
float shake = hitSize / 3f; float shake = hitSize / 3f;
Effect.scorch(x, y, (int)(hitSize / 5)); Effect.scorch(x, y, (int)(hitSize / 5));
Fx.explosion.at(this);
Effect.shake(shake, shake, this); Effect.shake(shake, shake, this);
type.deathSound.at(this); type.deathSound.at(this);
@@ -503,7 +503,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
//if this unit crash landed (was flying), damage stuff in a radius //if this unit crash landed (was flying), damage stuff in a radius
if(type.flying && !spawnedByCore){ if(type.flying && !spawnedByCore){
Damage.damage(team,x, y, Mathf.pow(hitSize, 0.94f) * 1.25f, Mathf.pow(hitSize, 0.75f) * type.crashDamageMultiplier * 5f, true, false, true); Damage.damage(team, x, y, Mathf.pow(hitSize, 0.94f) * 1.25f, Mathf.pow(hitSize, 0.75f) * type.crashDamageMultiplier * 5f, true, false, true);
} }
if(!headless){ if(!headless){

View File

@@ -18,6 +18,7 @@ public class MultiEffect extends Effect{
@Override @Override
public void init(){ public void init(){
for(Effect f : effects){ for(Effect f : effects){
f.init();
clip = Math.max(clip, f.clip); clip = Math.max(clip, f.clip);
lifetime = Math.max(lifetime, f.lifetime); lifetime = Math.max(lifetime, f.lifetime);
} }

View File

@@ -20,6 +20,8 @@ public class ParticleEffect extends Effect{
public float cone = 180f, length = 20f, baseLength = 0f; public float cone = 180f, length = 20f, baseLength = 0f;
/** Particle size/length/radius interpolation. */ /** Particle size/length/radius interpolation. */
public Interp interp = Interp.linear; public Interp interp = Interp.linear;
/** Particle size interpolation. Null to use interp. */
public @Nullable Interp sizeInterp = null;
public float offsetX, offsetY; public float offsetX, offsetY;
public float lightScl = 2f, lightOpacity = 0.6f; public float lightScl = 2f, lightOpacity = 0.6f;
public @Nullable Color lightColor; public @Nullable Color lightColor;
@@ -44,6 +46,7 @@ public class ParticleEffect extends Effect{
@Override @Override
public void init(){ public void init(){
clip = Math.max(clip, length + Math.max(sizeFrom, sizeTo)); clip = Math.max(clip, length + Math.max(sizeFrom, sizeTo));
if(sizeInterp == null) sizeInterp = interp;
} }
@Override @Override
@@ -52,15 +55,15 @@ public class ParticleEffect extends Effect{
float rawfin = e.fin(); float rawfin = e.fin();
float fin = e.fin(interp); float fin = e.fin(interp);
float rad = interp.apply(sizeFrom, sizeTo, rawfin) * 2; float rad = sizeInterp.apply(sizeFrom, sizeTo, rawfin) * 2;
float ox = e.x + Angles.trnsx(e.rotation, offsetX, offsetY), oy = e.y + Angles.trnsy(e.rotation, offsetX, offsetY); float ox = e.x + Angles.trnsx(e.rotation, offsetX, offsetY), oy = e.y + Angles.trnsy(e.rotation, offsetX, offsetY);
Draw.color(colorFrom, colorTo, fin); Draw.color(colorFrom, colorTo, fin);
Color lightColor = this.lightColor == null ? Draw.getColor() : this.lightColor; Color lightColor = this.lightColor == null ? Draw.getColor() : this.lightColor;
if(line){ if(line){
Lines.stroke(interp.apply(strokeFrom, strokeTo, rawfin)); Lines.stroke(sizeInterp.apply(strokeFrom, strokeTo, rawfin));
float len = interp.apply(lenFrom, lenTo, rawfin); float len = sizeInterp.apply(lenFrom, lenTo, rawfin);
rand.setSeed(e.id); rand.setSeed(e.id);
for(int i = 0; i < particles; i++){ for(int i = 0; i < particles; i++){

View File

@@ -291,16 +291,22 @@ public class Schematics implements Loadable{
/** Checks a schematic for deployment validity and adds it to the cache. */ /** Checks a schematic for deployment validity and adds it to the cache. */
private void checkLoadout(Schematic s, boolean validate){ private void checkLoadout(Schematic s, boolean validate){
Stile core = s.tiles.find(t -> t.block instanceof CoreBlock); Stile core = s.tiles.find(t -> t.block instanceof CoreBlock);
if(core == null) return;
int cores = s.tiles.count(t -> t.block instanceof CoreBlock); int cores = s.tiles.count(t -> t.block instanceof CoreBlock);
int maxSize = getMaxLaunchSize(core.block);
//make sure a core exists, and that the schematic is small enough. //make sure a core exists, and that the schematic is small enough.
if(core == null || (validate && (s.width > core.block.size + maxLoadoutSchematicPad *2 || s.height > core.block.size + maxLoadoutSchematicPad *2 if((validate && (s.width > maxSize || s.height > maxSize
|| s.tiles.contains(t -> t.block.buildVisibility == BuildVisibility.sandboxOnly || !t.block.unlocked()) || cores > 1))) return; || s.tiles.contains(t -> t.block.buildVisibility == BuildVisibility.sandboxOnly || !t.block.unlocked()) || cores > 1))) return;
//place in the cache //place in the cache
loadouts.get((CoreBlock)core.block, Seq::new).add(s); loadouts.get((CoreBlock)core.block, Seq::new).add(s);
} }
public int getMaxLaunchSize(Block block){
return block.size + maxLoadoutSchematicPad*2;
}
/** Adds a schematic to the list, also copying it into the files.*/ /** Adds a schematic to the list, also copying it into the files.*/
public void add(Schematic schematic){ public void add(Schematic schematic){
all.add(schematic); all.add(schematic);

View File

@@ -19,7 +19,7 @@ import static mindustry.Vars.*;
* weapon equipped, ammo used, and status effects. * weapon equipped, ammo used, and status effects.
* Each spawn group can have multiple sub-groups spawned in different areas of the map. * Each spawn group can have multiple sub-groups spawned in different areas of the map.
*/ */
public class SpawnGroup implements JsonSerializable{ public class SpawnGroup implements JsonSerializable, Cloneable{
public static final int never = Integer.MAX_VALUE; public static final int never = Integer.MAX_VALUE;
/** The unit type spawned */ /** The unit type spawned */
@@ -36,10 +36,12 @@ public class SpawnGroup implements JsonSerializable{
public float unitScaling = never; public float unitScaling = never;
/** Shield points that this unit has. */ /** Shield points that this unit has. */
public float shields = 0f; public float shields = 0f;
/** How much shields get increased per wave. */ /** How much shields get increased by per wave. */
public float shieldScaling = 0f; public float shieldScaling = 0f;
/** Amount of enemies spawned initially, with no scaling */ /** Amount of enemies spawned initially, with no scaling */
public int unitAmount = 1; public int unitAmount = 1;
/** If not -1, the unit will only spawn in spawnpoints with these packed coordinates. */
public int spawn = -1;
/** Seq of payloads that this unit will spawn with. */ /** Seq of payloads that this unit will spawn with. */
public @Nullable Seq<UnitType> payloads; public @Nullable Seq<UnitType> payloads;
/** Status effect applied to the spawned unit. Null to disable. */ /** Status effect applied to the spawned unit. Null to disable. */
@@ -55,6 +57,10 @@ public class SpawnGroup implements JsonSerializable{
//serialization use only //serialization use only
} }
public boolean canSpawn(int position){
return spawn == -1 || spawn == position;
}
/** @return amount of units spawned on a specific wave. */ /** @return amount of units spawned on a specific wave. */
public int getSpawned(int wave){ public int getSpawned(int wave){
if(spacing == 0) spacing = 1; if(spacing == 0) spacing = 1;
@@ -111,6 +117,7 @@ public class SpawnGroup implements JsonSerializable{
if(shieldScaling != 0) json.writeValue("shieldScaling", shieldScaling); if(shieldScaling != 0) json.writeValue("shieldScaling", shieldScaling);
if(unitAmount != 1) json.writeValue("amount", unitAmount); if(unitAmount != 1) json.writeValue("amount", unitAmount);
if(effect != null) json.writeValue("effect", effect.name); if(effect != null) json.writeValue("effect", effect.name);
if(spawn != -1) json.writeValue("spawn", spawn);
if(payloads != null && payloads.size > 0){ if(payloads != null && payloads.size > 0){
json.writeValue("payloads", payloads.map(u -> u.name).toArray(String.class)); json.writeValue("payloads", payloads.map(u -> u.name).toArray(String.class));
} }
@@ -130,6 +137,7 @@ public class SpawnGroup implements JsonSerializable{
shields = data.getFloat("shields", 0); shields = data.getFloat("shields", 0);
shieldScaling = data.getFloat("shieldScaling", 0); shieldScaling = data.getFloat("shieldScaling", 0);
unitAmount = data.getInt("amount", 1); unitAmount = data.getInt("amount", 1);
spawn = data.getInt("spawn", -1);
if(data.has("payloads")){ if(data.has("payloads")){
payloads = Seq.with(json.readValue(String[].class, data.get("payloads"))).map(s -> content.getByName(ContentType.unit, s)); payloads = Seq.with(json.readValue(String[].class, data.get("payloads"))).map(s -> content.getByName(ContentType.unit, s));
} }
@@ -157,6 +165,14 @@ public class SpawnGroup implements JsonSerializable{
'}'; '}';
} }
public SpawnGroup copy(){
try{
return (SpawnGroup)clone();
}catch(CloneNotSupportedException how){
throw new RuntimeException("If you see this, what did you even do?", how);
}
}
@Override @Override
public boolean equals(Object o){ public boolean equals(Object o){
if(this == o) return true; if(this == o) return true;

View File

@@ -350,8 +350,8 @@ public class Waves{
step += (int)(rand.random(15, 30) * Mathf.lerp(1f, 0.5f, difficulty)); step += (int)(rand.random(15, 30) * Mathf.lerp(1f, 0.5f, difficulty));
} }
int bossWave = (int)(rand.random(50, 70) * Mathf.lerp(1f, 0.7f, difficulty)); int bossWave = (int)(rand.random(50, 70) * Mathf.lerp(1f, 0.5f, difficulty));
int bossSpacing = (int)(rand.random(25, 40) * Mathf.lerp(1f, 0.6f, difficulty)); int bossSpacing = (int)(rand.random(25, 40) * Mathf.lerp(1f, 0.5f, difficulty));
int bossTier = difficulty < 0.6 ? 3 : 4; int bossTier = difficulty < 0.6 ? 3 : 4;

View File

@@ -150,7 +150,7 @@ public class BlockRenderer{
public void checkChanges(){ public void checkChanges(){
darkEvents.each(pos -> { darkEvents.each(pos -> {
var tile = world.tile(pos); var tile = world.tile(pos);
if(tile != null){ if(tile != null && tile.block().fillsTile){
tile.data = world.getWallDarkness(tile); tile.data = world.getWallDarkness(tile);
} }
}); });

View File

@@ -967,7 +967,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
//consume tap event if necessary //consume tap event if necessary
if(build.interactable(player.team()) && build.block.consumesTap){ if(build.interactable(player.team()) && build.block.consumesTap){
consumed = true; consumed = true;
}else if(build.interactable(player.team()) && build.block.synthetic() && !consumed){ }else if(build.interactable(player.team()) && build.block.synthetic() && (!consumed || build.block.allowConfigInventory)){
if(build.block.hasItems && build.items.total() > 0){ if(build.block.hasItems && build.items.total() > 0){
frag.inv.showFor(build); frag.inv.showFor(build);
consumed = true; consumed = true;

View File

@@ -60,6 +60,13 @@ public abstract class SaveFileReader{
"block-forge", "constructor" "block-forge", "constructor"
); );
public static final ObjectMap<String, String> modContentNameMap = ObjectMap.of(
"craters", "crater-stone",
"deepwater", "deep-water",
"water", "shallow-water",
"slag", "molten-slag"
);
protected final ReusableByteOutStream byteOutput = new ReusableByteOutStream(); protected final ReusableByteOutStream byteOutput = new ReusableByteOutStream();
protected final DataOutputStream dataBytes = new DataOutputStream(byteOutput); protected final DataOutputStream dataBytes = new DataOutputStream(byteOutput);
protected final ReusableByteOutStream byteOutputSmall = new ReusableByteOutStream(); protected final ReusableByteOutStream byteOutputSmall = new ReusableByteOutStream();

View File

@@ -272,16 +272,22 @@ public class SectorDamage{
float e = build.efficiency(); float e = build.efficiency();
if(e > 0.08f){ if(e > 0.08f){
if(build.team == state.rules.defaultTeam && build instanceof Ranged ranged && sparse.contains(t -> t.within(build, ranged.range() + 4*tilesize))){ if(build.team == state.rules.defaultTeam && build instanceof Ranged ranged && sparse.contains(t -> t.within(build, ranged.range() + 4*tilesize))){
//TODO make sure power turret network supports the turrets?
if(build.block instanceof Turret t && build instanceof TurretBuild b && b.hasAmmo()){ if(build.block instanceof Turret t && build instanceof TurretBuild b && b.hasAmmo()){
sumDps += t.shots / t.reloadTime * 60f * b.peekAmmo().estimateDPS() * e; sumDps += t.shots / t.reloadTime * 60f * b.peekAmmo().estimateDPS() * e * build.timeScale;
} }
if(build.block instanceof MendProjector m){ if(build.block instanceof MendProjector m){
sumRps += m.healPercent / m.reload * avgHealth * 60f / 100f * e; sumRps += m.healPercent / m.reload * avgHealth * 60f / 100f * e * build.timeScale;
}
//point defense turrets act as flat health right now
if(build.block instanceof PointDefenseTurret && build.consValid()){
sumHealth += 150f * build.timeScale;
} }
if(build.block instanceof ForceProjector f){ if(build.block instanceof ForceProjector f){
sumHealth += f.shieldHealth * e; sumHealth += f.shieldHealth * e * build.timeScale;
sumRps += e; sumRps += e;
} }
} }
@@ -315,14 +321,20 @@ public class SectorDamage{
var reg = new LinearRegression(); var reg = new LinearRegression();
SpawnGroup bossGroup = null; SpawnGroup bossGroup = null;
Seq<Vec2> waveDps = new Seq<>(), waveHealth = new Seq<>(); Seq<Vec2> waveDps = new Seq<>(), waveHealth = new Seq<>();
int groundSpawns = Math.max(spawner.countFlyerSpawns(), 1), airSpawns = Math.max(spawner.countGroundSpawns(), 1);
for(int wave = state.wave; wave < state.wave + 10; wave ++){ for(int wave = state.wave; wave < state.wave + 10; wave ++){
float sumWaveDps = 0f, sumWaveHealth = 0f; float sumWaveDps = 0f, sumWaveHealth = 0f;
for(SpawnGroup group : state.rules.spawns){ for(SpawnGroup group : state.rules.spawns){
//calculate the amount of spawn points used
//if there's a spawn position override, there is only one potential place they spawn
//assume that all overridden positions are valid, should always be true in properly designed campaign maps
int spawnCount = group.spawn != -1 ? 1 : group.type.flying ? airSpawns : groundSpawns;
float healthMult = 1f + Mathf.clamp(group.type.armor / 20f); float healthMult = 1f + Mathf.clamp(group.type.armor / 20f);
StatusEffect effect = (group.effect == null ? StatusEffects.none : group.effect); StatusEffect effect = (group.effect == null ? StatusEffects.none : group.effect);
int spawned = group.getSpawned(wave); int spawned = group.getSpawned(wave) * spawnCount;
//save the boss group //save the boss group
if(group.effect == StatusEffects.boss){ if(group.effect == StatusEffects.boss){
bossGroup = group; bossGroup = group;

View File

@@ -8,7 +8,7 @@ import static mindustry.maps.filters.FilterOption.*;
public class BlendFilter extends GenerateFilter{ public class BlendFilter extends GenerateFilter{
float radius = 2f; float radius = 2f;
Block block = Blocks.stone, floor = Blocks.ice, ignore = Blocks.air; Block block = Blocks.sand, floor = Blocks.sandWater, ignore = Blocks.air;
@Override @Override
public FilterOption[] options(){ public FilterOption[] options(){
@@ -16,7 +16,7 @@ public class BlendFilter extends GenerateFilter{
new SliderOption("radius", () -> radius, f -> radius = f, 1f, 10f), new SliderOption("radius", () -> radius, f -> radius = f, 1f, 10f),
new BlockOption("block", () -> block, b -> block = b, anyOptional), new BlockOption("block", () -> block, b -> block = b, anyOptional),
new BlockOption("floor", () -> floor, b -> floor = b, anyOptional), new BlockOption("floor", () -> floor, b -> floor = b, anyOptional),
new BlockOption("ignore", () -> ignore, b -> ignore = b, floorsOptional) new BlockOption("ignore", () -> ignore, b -> ignore = b, anyOptional)
}; };
} }

View File

@@ -27,7 +27,7 @@ public class DistortFilter extends GenerateFilter{
@Override @Override
public void apply(GenerateInput in){ public void apply(GenerateInput in){
Tile tile = in.tile(in.x + noise(in, scl, mag) - mag / 2f, in.y + noise(in, scl, mag) - mag / 2f); Tile tile = in.tile(in.x + noise(in, scl, mag) - mag / 2f, in.y + noise(1, in, scl, mag) - mag / 2f);
in.floor = tile.floor(); in.floor = tile.floor();
if(!tile.block().synthetic() && !in.block.synthetic()) in.block = tile.block(); if(!tile.block().synthetic() && !in.block.synthetic()) in.block = tile.block();

View File

@@ -99,6 +99,10 @@ public abstract class GenerateFilter{
//utility generation functions //utility generation functions
protected float noise(int seedOffset, GenerateInput in, float scl, float mag){
return Simplex.noise2d(seedOffset + seed, 1f, 0f, 1f / scl, in.x, in.y) * mag;
}
protected float noise(GenerateInput in, float scl, float mag){ protected float noise(GenerateInput in, float scl, float mag){
return Simplex.noise2d(seed, 1f, 0f, 1f / scl, in.x, in.y) * mag; return Simplex.noise2d(seed, 1f, 0f, 1f / scl, in.x, in.y) * mag;
} }

View File

@@ -8,7 +8,7 @@ import static mindustry.maps.filters.FilterOption.*;
public class RiverNoiseFilter extends GenerateFilter{ public class RiverNoiseFilter extends GenerateFilter{
float scl = 40, threshold = 0f, threshold2 = 0.1f, octaves = 1, falloff = 0.5f; float scl = 40, threshold = 0f, threshold2 = 0.1f, octaves = 1, falloff = 0.5f;
Block floor = Blocks.water, floor2 = Blocks.deepwater, block = Blocks.sandWall; Block floor = Blocks.water, floor2 = Blocks.deepwater, block = Blocks.sandWall, target = Blocks.air;
@Override @Override
public FilterOption[] options(){ public FilterOption[] options(){
@@ -18,6 +18,7 @@ public class RiverNoiseFilter extends GenerateFilter{
new SliderOption("threshold2", () -> threshold2, f -> threshold2 = f, -1f, 1f), new SliderOption("threshold2", () -> threshold2, f -> threshold2 = f, -1f, 1f),
new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f), new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f),
new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f), new SliderOption("falloff", () -> falloff, f -> falloff = f, 0f, 1f),
new BlockOption("target", () -> target, b -> target = b, anyOptional),
new BlockOption("block", () -> block, b -> block = b, wallsOnly), new BlockOption("block", () -> block, b -> block = b, wallsOnly),
new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly), new BlockOption("floor", () -> floor, b -> floor = b, floorsOnly),
new BlockOption("floor2", () -> floor2, b -> floor2 = b, floorsOnly) new BlockOption("floor2", () -> floor2, b -> floor2 = b, floorsOnly)
@@ -26,14 +27,14 @@ public class RiverNoiseFilter extends GenerateFilter{
@Override @Override
public char icon(){ public char icon(){
return Iconc.blockWater; return Iconc.blockShallowWater;
} }
@Override @Override
public void apply(GenerateInput in){ public void apply(GenerateInput in){
float noise = rnoise(in.x, in.y, (int)octaves, scl, falloff, 1f); float noise = rnoise(in.x, in.y, (int)octaves, scl, falloff, 1f);
if(noise >= threshold){ if(noise >= threshold && (target == Blocks.air || in.floor == target || in.block == target)){
in.floor = floor; in.floor = floor;
if(in.block.solid){ if(in.block.solid){

View File

@@ -30,6 +30,12 @@ public class BaseGenerator{
private Tiles tiles; private Tiles tiles;
private Seq<Tile> cores; private Seq<Tile> cores;
public static Block getDifficultyWall(int size, float difficulty){
Seq<Block> wallsSmall = content.blocks().select(b -> b instanceof Wall && b.size == size && !b.insulated && b.buildVisibility == BuildVisibility.shown && !(b instanceof Door));
wallsSmall.sort(b -> b.buildCost);
return wallsSmall.getFrac(difficulty * 0.91f);
}
public void generate(Tiles tiles, Seq<Tile> cores, Tile spawn, Team team, Sector sector, float difficulty){ public void generate(Tiles tiles, Seq<Tile> cores, Tile spawn, Team team, Sector sector, float difficulty){
this.tiles = tiles; this.tiles = tiles;
this.cores = cores; this.cores = cores;
@@ -39,22 +45,15 @@ public class BaseGenerator{
Mathf.rand.setSeed(sector.id); Mathf.rand.setSeed(sector.id);
Seq<Block> wallsSmall = content.blocks().select(b -> b instanceof Wall && b.size == 1 && !b.insulated && b.buildVisibility == BuildVisibility.shown && !(b instanceof Door)); float bracketRange = 0.17f;
Seq<Block> wallsLarge = content.blocks().select(b -> b instanceof Wall && b.size == 2 && !b.insulated && b.buildVisibility == BuildVisibility.shown && !(b instanceof Door)); float baseChance = Mathf.lerp(0.7f, 2.1f, difficulty);
//sort by cost for correct fraction
wallsSmall.sort(b -> b.buildCost);
wallsLarge.sort(b -> b.buildCost);
float bracketRange = 0.2f;
float baseChance = Mathf.lerp(0.7f, 1.9f, difficulty);
int wallAngle = 70; //180 for full coverage int wallAngle = 70; //180 for full coverage
double resourceChance = 0.5 * baseChance; double resourceChance = 0.5 * baseChance;
double nonResourceChance = 0.0005 * baseChance; double nonResourceChance = 0.0005 * baseChance;
BasePart coreschem = bases.cores.getFrac(difficulty); BasePart coreschem = bases.cores.getFrac(difficulty);
int passes = difficulty < 0.4 ? 1 : difficulty < 0.8 ? 2 : 3; int passes = difficulty < 0.4 ? 1 : difficulty < 0.8 ? 2 : 3;
Block wall = wallsSmall.getFrac(difficulty * 0.91f), wallLarge = wallsLarge.getFrac(difficulty * 0.91f); Block wall = getDifficultyWall(1, difficulty), wallLarge = getDifficultyWall(2, difficulty);
for(Tile tile : cores){ for(Tile tile : cores){
tile.clearOverlay(); tile.clearOverlay();

View File

@@ -517,7 +517,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
float waveTimeDec = 0.4f; float waveTimeDec = 0.4f;
state.rules.waveSpacing = Mathf.lerp(60 * 65 * 2, 60f * 60f * 1f, Math.max(difficulty - waveTimeDec, 0f) / 0.8f); state.rules.waveSpacing = Mathf.lerp(60 * 65 * 2, 60f * 60f * 1f, Math.max(difficulty - waveTimeDec, 0f));
state.rules.waves = sector.info.waves = true; state.rules.waves = sector.info.waves = true;
state.rules.enemyCoreBuildRadius = 600f; state.rules.enemyCoreBuildRadius = 600f;

View File

@@ -80,6 +80,8 @@ public class ContentParser{
if(data.isString()){ if(data.isString()){
StatusEffect result = locate(ContentType.status, data.asString()); StatusEffect result = locate(ContentType.status, data.asString());
if(result != null) return result; if(result != null) return result;
result = (StatusEffect)fieldOpt(StatusEffects.class, data);
if(result != null) return result;
throw new IllegalArgumentException("Unknown status effect: '" + data.asString() + "'"); throw new IllegalArgumentException("Unknown status effect: '" + data.asString() + "'");
} }
StatusEffect effect = new StatusEffect(currentMod.name + "-" + data.getString("name")); StatusEffect effect = new StatusEffect(currentMod.name + "-" + data.getString("name"));

View File

@@ -177,7 +177,7 @@ public class Mods implements Loadable{
} }
private void packSprites(Seq<Fi> sprites, LoadedMod mod, boolean prefix, Seq<AsyncResult<Runnable>> tasks){ private void packSprites(Seq<Fi> sprites, LoadedMod mod, boolean prefix, Seq<AsyncResult<Runnable>> tasks){
boolean linear = Core.settings.getBool("linear"); boolean linear = Core.settings.getBool("linear", true);
for(Fi file : sprites){ for(Fi file : sprites){
//read and bleed pixmaps in parallel //read and bleed pixmaps in parallel
@@ -186,7 +186,7 @@ public class Mods implements Loadable{
Pixmap pix = new Pixmap(file.readBytes()); Pixmap pix = new Pixmap(file.readBytes());
//only bleeds when linear filtering is on at startup //only bleeds when linear filtering is on at startup
if(linear){ if(linear){
Pixmaps.bleed(pix); Pixmaps.bleed(pix, 2);
} }
//this returns a *runnable* which actually packs the resulting pixmap; this has to be done synchronously outside the method //this returns a *runnable* which actually packs the resulting pixmap; this has to be done synchronously outside the method
return () -> { return () -> {
@@ -269,7 +269,7 @@ public class Mods implements Loadable{
} }
}; };
TextureFilter filter = Core.settings.getBool("linear") ? TextureFilter.linear : TextureFilter.nearest; TextureFilter filter = Core.settings.getBool("linear", true) ? TextureFilter.linear : TextureFilter.nearest;
Time.mark(); Time.mark();
//generate new icons //generate new icons

View File

@@ -334,6 +334,9 @@ public class UnitType extends UnlockableContent{
canDrown = false; canDrown = false;
omniMovement = false; omniMovement = false;
immunities.add(StatusEffects.wet); immunities.add(StatusEffects.wet);
if(visualElevation < 0f){
visualElevation = 0.11f;
}
} }
if(flying){ if(flying){
@@ -473,7 +476,7 @@ public class UnitType extends UnlockableContent{
if(!packer.has(name + "-outline")){ if(!packer.has(name + "-outline")){
PixmapRegion base = Core.atlas.getPixmap(region); PixmapRegion base = Core.atlas.getPixmap(region);
var result = Pixmaps.outline(base, outlineColor, outlineRadius); var result = Pixmaps.outline(base, outlineColor, outlineRadius);
if(Core.settings.getBool("linear")){ if(Core.settings.getBool("linear", true)){
Pixmaps.bleed(result); Pixmaps.bleed(result);
} }
packer.add(PageType.main, name + "-outline", result); packer.add(PageType.main, name + "-outline", result);
@@ -709,7 +712,7 @@ public class UnitType extends UnlockableContent{
Draw.color(0, 0, 0, 0.4f * alpha); Draw.color(0, 0, 0, 0.4f * alpha);
float rad = 1.6f; float rad = 1.6f;
float size = Math.max(region.width, region.height) * Draw.scl; float size = Math.max(region.width, region.height) * Draw.scl;
Draw.rect(softShadowRegion, unit, size * rad * Draw.xscl, size * rad * Draw.yscl); Draw.rect(softShadowRegion, unit, size * rad * Draw.xscl, size * rad * Draw.yscl, unit.rotation - 90);
Draw.color(); Draw.color();
} }

View File

@@ -36,7 +36,7 @@ public class DatabaseDialog extends BaseDialog{
cont.table(s -> { cont.table(s -> {
s.image(Icon.zoom).padRight(8); s.image(Icon.zoom).padRight(8);
search = s.field(null, text -> rebuild()).growX().get(); search = s.field(null, text -> rebuild()).growX().get();
search.setMessageText(Core.bundle.get("players.search")); search.setMessageText("@players.search");
}).fillX().padBottom(4).row(); }).fillX().padBottom(4).row();
cont.pane(all); cont.pane(all);

View File

@@ -763,7 +763,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
c.defaults().padBottom(5); c.defaults().padBottom(5);
if(sector.preset != null && sector.preset.description != null){ if(sector.preset != null && sector.preset.description != null){
c.add(sector.preset.displayDescription()).left().row(); c.add(sector.preset.displayDescription()).width(420f).wrap().left().row();
} }
c.add(Core.bundle.get("sectors.time") + " [accent]" + sector.save.getPlayTime()).left().row(); c.add(Core.bundle.get("sectors.time") + " [accent]" + sector.save.getPlayTime()).left().row();

View File

@@ -230,8 +230,12 @@ public class SettingsMenuDialog extends Dialog{
platform.shareFile(logs); platform.shareFile(logs);
}else{ }else{
platform.showFileChooser(false, "txt", file -> { platform.showFileChooser(false, "txt", file -> {
file.writeString(getLogs()); try{
app.post(() -> ui.showInfo("@crash.exported")); file.writeBytes(getLogs().getBytes(Strings.utf8));
app.post(() -> ui.showInfo("@crash.exported"));
}catch(Throwable e){
ui.showException(e);
}
}); });
} }
} }

View File

@@ -181,6 +181,11 @@ public class HintsFragment extends Fragment{
&& SectorPresets.frozenForest.unlocked() && SectorPresets.frozenForest.unlocked()
&& SectorPresets.frozenForest.sector.save == null, && SectorPresets.frozenForest.sector.save == null,
() -> state.isCampaign() && state.getSector().preset == SectorPresets.frozenForest), () -> state.isCampaign() && state.getSector().preset == SectorPresets.frozenForest),
presetDifficulty(() -> state.isCampaign()
&& state.getSector().preset == null
&& state.getSector().threat >= 0.5f
&& !SectorPresets.tarFields.sector.isCaptured(), //appear only when the player hasn't progressed much in the game yet
() -> state.isCampaign() && state.getSector().preset != null),
coreIncinerate(() -> state.isCampaign() && state.rules.defaultTeam.core() != null && state.rules.defaultTeam.core().items.get(Items.copper) >= state.rules.defaultTeam.core().storageCapacity - 10, () -> false), coreIncinerate(() -> state.isCampaign() && state.rules.defaultTeam.core() != null && state.rules.defaultTeam.core().items.get(Items.copper) >= state.rules.defaultTeam.core().storageCapacity - 10, () -> false),
coopCampaign(() -> net.client() && state.isCampaign() && SectorPresets.groundZero.sector.hasBase(), () -> false), coopCampaign(() -> net.client() && state.isCampaign() && SectorPresets.groundZero.sector.hasBase(), () -> false),
; ;

View File

@@ -162,6 +162,8 @@ public class Block extends UnlockableContent{
public int unitCapModifier = 0; public int unitCapModifier = 0;
/** Whether the block can be tapped and selected to configure. */ /** Whether the block can be tapped and selected to configure. */
public boolean configurable; public boolean configurable;
/** If true, the building inventory can be shown with the config. */
public boolean allowConfigInventory = true;
/** If true, this block can be configured by logic. */ /** If true, this block can be configured by logic. */
public boolean logicConfigurable = false; public boolean logicConfigurable = false;
/** Whether this block consumes touchDown events when tapped. */ /** Whether this block consumes touchDown events when tapped. */
@@ -848,7 +850,8 @@ public class Block extends UnlockableContent{
} }
if(!outputsPower && consumes.hasPower() && consumes.getPower().buffered){ if(!outputsPower && consumes.hasPower() && consumes.getPower().buffered){
throw new IllegalArgumentException("Consumer using buffered power: " + name); Log.warn("Consumer using buffered power: @. Disabling buffered power.", name);
consumes.getPower().buffered = false;
} }
if(buildVisibility == BuildVisibility.sandboxOnly){ if(buildVisibility == BuildVisibility.sandboxOnly){
@@ -912,12 +915,17 @@ public class Block extends UnlockableContent{
for(int x = 0; x < base.width; x++){ for(int x = 0; x < base.width; x++){
for(int y = 0; y < base.height; y++){ for(int y = 0; y < base.height; y++){
int color = base.get(x, y); int color = base.get(x, y);
int index = color == 0xffffffff ? 0 : color == 0xdcc6c6ff ? 1 : color == 0x9d7f7fff ? 2 : -1; int index = switch(color){
case 0xffffffff -> 0;
case 0xdcc6c6ff, 0xdbc5c5ff -> 1;
case 0x9d7f7fff, 0x9e8080ff -> 2;
default -> -1;
};
out.setRaw(x, y, index == -1 ? base.get(x, y) : team.palettei[index]); out.setRaw(x, y, index == -1 ? base.get(x, y) : team.palettei[index]);
} }
} }
if(Core.settings.getBool("linear")){ if(Core.settings.getBool("linear", true)){
Pixmaps.bleed(out); Pixmaps.bleed(out);
} }
@@ -938,7 +946,7 @@ public class Block extends UnlockableContent{
if(outlineIcon){ if(outlineIcon){
PixmapRegion region = Core.atlas.getPixmap(gen[outlinedIcon >= 0 ? outlinedIcon : gen.length -1]); PixmapRegion region = Core.atlas.getPixmap(gen[outlinedIcon >= 0 ? outlinedIcon : gen.length -1]);
Pixmap out = last = Pixmaps.outline(region, outlineColor, outlineRadius); Pixmap out = last = Pixmaps.outline(region, outlineColor, outlineRadius);
if(Core.settings.getBool("linear")){ if(Core.settings.getBool("linear", true)){
Pixmaps.bleed(out); Pixmaps.bleed(out);
} }
packer.add(PageType.main, name, out); packer.add(PageType.main, name, out);

View File

@@ -470,15 +470,15 @@ public class Tile implements Position, QuadTreeObject, Displayable{
getHitbox(rect); getHitbox(rect);
} }
public Tile nearby(Point2 relative){ public @Nullable Tile nearby(Point2 relative){
return world.tile(x + relative.x, y + relative.y); return world.tile(x + relative.x, y + relative.y);
} }
public Tile nearby(int dx, int dy){ public @Nullable Tile nearby(int dx, int dy){
return world.tile(x + dx, y + dy); return world.tile(x + dx, y + dy);
} }
public Tile nearby(int rotation){ public @Nullable Tile nearby(int rotation){
if(rotation == 0) return world.tile(x + 1, y); if(rotation == 0) return world.tile(x + 1, y);
if(rotation == 1) return world.tile(x, y + 1); if(rotation == 1) return world.tile(x, y + 1);
if(rotation == 2) return world.tile(x - 1, y); if(rotation == 2) return world.tile(x - 1, y);
@@ -486,7 +486,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{
return null; return null;
} }
public Building nearbyBuild(int rotation){ public @Nullable Building nearbyBuild(int rotation){
if(rotation == 0) return world.build(x + 1, y); if(rotation == 0) return world.build(x + 1, y);
if(rotation == 1) return world.build(x, y + 1); if(rotation == 1) return world.build(x, y + 1);
if(rotation == 2) return world.build(x - 1, y); if(rotation == 2) return world.build(x - 1, y);

View File

@@ -75,7 +75,9 @@ public class Wall extends Block{
Draw.blend(); Draw.blend();
Draw.reset(); Draw.reset();
hit = Mathf.clamp(hit - Time.delta / 10f); if(!state.isPaused()){
hit = Mathf.clamp(hit - Time.delta / 10f);
}
} }
} }
@@ -96,7 +98,7 @@ public class Wall extends Block{
//deflect bullets if necessary //deflect bullets if necessary
if(chanceDeflect > 0f){ if(chanceDeflect > 0f){
//slow bullets are not deflected //slow bullets are not deflected
if(bullet.vel().len() <= 0.1f || !bullet.type.reflectable) return true; if(bullet.vel.len() <= 0.1f || !bullet.type.reflectable) return true;
//bullet reflection chance depends on bullet damage //bullet reflection chance depends on bullet damage
if(!Mathf.chance(chanceDeflect / bullet.damage())) return true; if(!Mathf.chance(chanceDeflect / bullet.damage())) return true;
@@ -115,9 +117,9 @@ public class Wall extends Block{
bullet.vel.y *= -1; bullet.vel.y *= -1;
} }
bullet.owner(this); bullet.owner = this;
bullet.team(team); bullet.team = team;
bullet.time(bullet.time() + 1f); bullet.time += 1f;
//disable bullet collision by returning false //disable bullet collision by returning false
return false; return false;

View File

@@ -273,6 +273,7 @@ public class Turret extends ReloadTurret{
} }
if(hasAmmo()){ if(hasAmmo()){
if(Float.isNaN(reload)) rotation = 0;
if(timer(timerTarget, targetInterval)){ if(timer(timerTarget, targetInterval)){
findTarget(); findTarget();
@@ -289,9 +290,7 @@ public class Turret extends ReloadTurret{
}else{ //default AI behavior }else{ //default AI behavior
targetPosition(target); targetPosition(target);
if(Float.isNaN(rotation)){ if(Float.isNaN(rotation)) rotation = 0;
rotation = 0;
}
} }
float targetRot = angleTo(targetPos); float targetRot = angleTo(targetPos);

View File

@@ -211,7 +211,7 @@ public class DuctBridge extends Block{
public DuctBridgeBuild findLink(){ public DuctBridgeBuild findLink(){
for(int i = 1; i <= range; i++){ for(int i = 1; i <= range; i++){
Tile other = tile.nearby(Geometry.d4x(rotation) * i, Geometry.d4y(rotation) * i); Tile other = tile.nearby(Geometry.d4x(rotation) * i, Geometry.d4y(rotation) * i);
if(other.build instanceof DuctBridgeBuild build && build.team == team){ if(other != null && other.build instanceof DuctBridgeBuild build && build.team == team){
return build; return build;
} }
} }

View File

@@ -51,6 +51,8 @@ public class ItemBridge extends Block{
group = BlockGroup.transportation; group = BlockGroup.transportation;
noUpdateDisabled = true; noUpdateDisabled = true;
copyConfig = false; copyConfig = false;
//disabled as to not be annoying
allowConfigInventory = false;
//point2 config is relative //point2 config is relative
config(Point2.class, (ItemBridgeBuild tile, Point2 i) -> tile.link = Point2.pack(i.x + tile.tileX(), i.y + tile.tileY())); config(Point2.class, (ItemBridgeBuild tile, Point2 i) -> tile.link = Point2.pack(i.x + tile.tileX(), i.y + tile.tileY()));

View File

@@ -9,6 +9,7 @@ import mindustry.world.*;
public class Cliff extends Block{ public class Cliff extends Block{
public float size = 11f; public float size = 11f;
public @Load(value = "cliffmask#", length = 256) TextureRegion[] cliffs; public @Load(value = "cliffmask#", length = 256) TextureRegion[] cliffs;
public @Load(value = "editor-cliffmask#", length = 256) TextureRegion[] editorCliffs;
public Cliff(String name){ public Cliff(String name){
super(name); super(name);

View File

@@ -40,10 +40,10 @@ public class BurnerGenerator extends ItemLiquidGenerator{
Draw.rect(turbineRegions[1], x, y, -totalTime * turbineSpeed); Draw.rect(turbineRegions[1], x, y, -totalTime * turbineSpeed);
Draw.rect(capRegion, x, y); Draw.rect(capRegion, x, y);
}
if(hasLiquids){ if(hasLiquids && liquidRegion.found()){
Drawf.liquid(liquidRegion, x, y, liquids.total() / liquidCapacity, liquids.current().color); Drawf.liquid(liquidRegion, x, y, liquids.total() / liquidCapacity, liquids.current().color);
}
} }
} }
} }

View File

@@ -13,10 +13,11 @@ public class PowerGraph{
private static final Seq<Building> outArray2 = new Seq<>(); private static final Seq<Building> outArray2 = new Seq<>();
private static final IntSet closedSet = new IntSet(); private static final IntSet closedSet = new IntSet();
private final Seq<Building> producers = new Seq<>(false); //do not modify any of these unless you know what you're doing!
private final Seq<Building> consumers = new Seq<>(false); public final Seq<Building> producers = new Seq<>(false);
private final Seq<Building> batteries = new Seq<>(false); public final Seq<Building> consumers = new Seq<>(false);
private final Seq<Building> all = new Seq<>(false); public final Seq<Building> batteries = new Seq<>(false);
public final Seq<Building> all = new Seq<>(false);
private final WindowedMean powerBalance = new WindowedMean(60); private final WindowedMean powerBalance = new WindowedMean(60);
private float lastPowerProduced, lastPowerNeeded, lastPowerStored; private float lastPowerProduced, lastPowerNeeded, lastPowerStored;

View File

@@ -8,11 +8,11 @@ import mindustry.world.meta.*;
/** Consumer class for blocks which consume power while being connected to a power graph. */ /** Consumer class for blocks which consume power while being connected to a power graph. */
public class ConsumePower extends Consume{ public class ConsumePower extends Consume{
/** The maximum amount of power which can be processed per tick. This might influence efficiency or load a buffer. */ /** The maximum amount of power which can be processed per tick. This might influence efficiency or load a buffer. */
public final float usage; public float usage;
/** The maximum power capacity in power units. */ /** The maximum power capacity in power units. */
public final float capacity; public float capacity;
/** True if the module can store power. */ /** True if the module can store power. */
public final boolean buffered; public boolean buffered;
public ConsumePower(float usage, float capacity, boolean buffered){ public ConsumePower(float usage, float capacity, boolean buffered){
this.usage = usage; this.usage = usage;

View File

@@ -39,12 +39,14 @@ public class DrawSmelter extends DrawBlock{
Draw.z(Layer.block + 0.01f); Draw.z(Layer.block + 0.01f);
Draw.alpha(build.warmup);
Draw.rect(top, build.x, build.y);
Draw.alpha(((1f - g) + Mathf.absin(Time.time, 8f, g) + Mathf.random(r) - r) * build.warmup); Draw.alpha(((1f - g) + Mathf.absin(Time.time, 8f, g) + Mathf.random(r) - r) * build.warmup);
Draw.tint(flameColor); Draw.tint(flameColor);
Fill.circle(build.x, build.y, flameRadius + Mathf.absin(Time.time, flameRadiusScl, flameRadiusMag) + cr); Fill.circle(build.x, build.y, flameRadius + Mathf.absin(Time.time, flameRadiusScl, flameRadiusMag) + cr);
Draw.color(1f, 1f, 1f, build.warmup); Draw.color(1f, 1f, 1f, build.warmup);
Draw.rect(top, build.x, build.y);
Fill.circle(build.x, build.y, flameRadiusIn + Mathf.absin(Time.time, flameRadiusScl, flameRadiusInMag) + cr); Fill.circle(build.x, build.y, flameRadiusIn + Mathf.absin(Time.time, flameRadiusScl, flameRadiusInMag) + cr);
Draw.color(); Draw.color();

View File

@@ -12,7 +12,7 @@
<h2>Campanie</h2> <h2>Campanie</h2>
- Capturează planeta Serpulo avansând prin peste 250 de sectoare genereate procedural și 16 harți create manual - Capturează planeta Serpulo avansând prin peste 250 de sectoare generate procedural și 16 hărți create manual
- Capturează teritoriul și construiește fabrici pt producția de resurse în timp ce joci în alte sectoare - Capturează teritoriul și construiește fabrici pt producția de resurse în timp ce joci în alte sectoare
- Apără-ți sectoarele de invaziile inamice periodice - Apără-ți sectoarele de invaziile inamice periodice
- Coordonează distribuția de resurse între sectoare folosind platforme de lansare - Coordonează distribuția de resurse între sectoare folosind platforme de lansare

View File

@@ -11,4 +11,4 @@ android.useAndroidX=true
#used for slow jitpack builds; TODO see if this actually works #used for slow jitpack builds; TODO see if this actually works
http.socketTimeout=80000 http.socketTimeout=80000
http.connectionTimeout=80000 http.connectionTimeout=80000
archash=98c420de77661889ab0330a956d50721f27f33d9 archash=72627de9b81e7143af4ebe1d1f9d54099ade8fd3

View File

@@ -57,7 +57,7 @@
}, },
{ {
"name": "Omega", "name": "Omega",
"address": ["yeeth.mindustry.me:2004"] "address": ["yeeth.mindustry.me:2004","185.86.230.61:25570"]
}, },
{ {
"name": "md.obvilionnetwork.ru", "name": "md.obvilionnetwork.ru",
@@ -104,11 +104,15 @@
"address": ["usfr2.forcehost.net:25578"] "address": ["usfr2.forcehost.net:25578"]
}, },
{ {
"name": "Español", "name": "Español",
"address": ["168.119.36.188:41445"] "address": ["168.119.36.188:41445"]
}, },
{ {
"name": "CreateDustry", "name": "CreateDustry",
"address": ["144.76.120.74:18645"] "address": ["144.76.120.74:18645"]
},
{
"name": "HexedPvP",
"address": ["001.finland.eu.hosts.dynamichost.xyz:23664"]
} }
] ]

View File

@@ -20,7 +20,7 @@
"address": ["34.134.111.15", "fifr4.quackhost.uk:21013", "34.134.111.15:4000", "34.134.111.15:7000"] "address": ["34.134.111.15", "fifr4.quackhost.uk:21013", "34.134.111.15:4000", "34.134.111.15:7000"]
}, },
{ {
"name": "[cyan]DarkDustry", "name": "DarkDustry",
"address": ["darkdustry.ml", "darkdustry.ml:3000", "darkdustry.ml:7000", "darkdustry.ml:8000"] "address": ["darkdustry.ml", "darkdustry.ml:3000", "darkdustry.ml:7000", "darkdustry.ml:8000"]
}, },
{ {
@@ -37,7 +37,7 @@
}, },
{ {
"name": "io", "name": "io",
"address": ["mindustry.io.community", "mindustry.io.community:1000", "mindustry.io.community:2000", "mindustry.io.community:3000", "mindustry.io.community:4000", "mindustry.io.community:5000"] "address": ["mindustry.io.community", "mindustry.io.community:1000", "mindustry.io.community:2000", "mindustry.io.community:3000", "mindustry.io.community:4000", "labs.io.community"]
}, },
{ {
"name": "Korea", "name": "Korea",

View File

@@ -158,7 +158,9 @@ public class Generators{
} }
}); });
Fi.get("../blocks/environment/cliffmask" + (val & 0xff) + ".png").writePng(result); Fi fi = Fi.get("../blocks/environment/cliffmask" + (val & 0xff) + ".png");
fi.writePng(result);
fi.copyTo(Fi.get("../editor").child("editor-" + fi.name()));
}); });
} }