diff --git a/core/assets-raw/sprites/blocks/power/rtg-generator.png b/core/assets-raw/sprites/blocks/power/rtg-generator.png index 6c95894959..1dd27d69c9 100644 Binary files a/core/assets-raw/sprites/blocks/power/rtg-generator.png and b/core/assets-raw/sprites/blocks/power/rtg-generator.png differ diff --git a/core/assets-raw/sprites/blocks/units/tetrative-reconstructor.png b/core/assets-raw/sprites/blocks/units/tetrative-reconstructor.png index ed8121b6b9..67f7ed806b 100644 Binary files a/core/assets-raw/sprites/blocks/units/tetrative-reconstructor.png and b/core/assets-raw/sprites/blocks/units/tetrative-reconstructor.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 7f8bae9f14..c5e6d94143 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -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} steam.error = Failed to initialize Steam services.\nError: {0} +editor.cliffs = Walls To Cliffs editor.brush = Brush editor.openin = Open In Editor editor.oregen = Ore Generation @@ -400,6 +401,8 @@ waves.sort.reverse = Reverse Sort waves.sort.begin = Begin waves.sort.health = Health waves.sort.type = Type +waves.units.hide = Hide All +waves.units.show = Show All #these are intentionally in lower case wavemode.counts = counts @@ -628,6 +631,8 @@ sector.biomassFacility.name = Biomass Synthesis Facility sector.windsweptIslands.name = Windswept Islands sector.extractionOutpost.name = Extraction Outpost 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.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.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.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.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. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 54bc3a9fb1..83aa4aafc2 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -2,7 +2,7 @@ credits.text = Creado por [royal]Anuken[] - [sky]anukendev@gmail.com[] credits = Créditos contributors = Traductores y Contribuidores 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.github.description = Código fuente del juego link.changelog.description = Lista de actualizaciones @@ -49,24 +49,24 @@ mods.github.open = Repositorio mods.browser.sortdate = Más recientes mods.browser.sortstars = Mejor valorados -schematic = Plantilla -schematic.add = Guardar plantilla... -schematics = Plantillas -schematic.replace = Ya existe una plantilla con ese nombre. ¿Deseas remplazarla? -schematic.exists = Ya existe una plantilla con ese nombre. -schematic.import = Importar plantilla... -schematic.exportfile = Exportar archivo -schematic.importfile = Importar archivo +schematic = Esquema +schematic.add = Guardar Esquema... +schematics = Esquemas +schematic.replace = Ya existe un esquema con ese nombre. ¿Deseas remplazarlo? +schematic.exists = Ya existe un esquema con ese nombre. +schematic.import = Importar Esquema... +schematic.exportfile = Exportar Archivo +schematic.importfile = Importar Archivo schematic.browseworkshop = Buscar en Steam Workshop schematic.copy = Copiar al portapapeles. schematic.copy.import = Importar desde el portapapeles. schematic.shareworkshop = Compartir en Steam Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Girar plantilla -schematic.saved = Plantilla guardada. -schematic.delete.confirm = Se borrará ésta plantilla. -schematic.rename = Renombrar plantilla +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Girar esquema +schematic.saved = Esquema guardado. +schematic.delete.confirm = Se borrará éste esquema. +schematic.rename = Renombrar Esquema 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.edittags = Editar Etiquetas schematic.addtag = Añadir Etiqueta @@ -78,6 +78,7 @@ schematic.tagexists = Esa etiqueta ya existe. stats = Estadísticas stat.wave = Oleadas Derrotadas:[accent] {0} +stat.unitsCreated = Unidades Creadas:[accent] {0} stat.enemiesDestroyed = Enemigos Destruidos:[accent] {0} stat.built = Estructuras Construidas:[accent] {0} stat.destroyed = Estructuras Destruidas:[accent] {0} @@ -93,7 +94,8 @@ level.select = Selección de Nivel level.mode = Modo de juego: coreattack = < ¡El núcleo está bajo ataque! > 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 loadgame = Cargar Partida joingame = Unirse a Partida @@ -168,8 +170,9 @@ launchcore = Lanzar núcleo filename = Nombre del archivo: unlocked = ¡Nuevo contenido en la Base de Datos! available = ¡Nueva investigación disponible! +unlock.incampaign = < Desbloquealo en campaña para más detalles > 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.load = Cargar 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 servers.local = Servidores Locales +servers.local.steam = Partidas Públicas y Lervidores Locales servers.remote = Servidores Remotos 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.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... -reloading = [accent]Recargando mods... +downloading = [accent]Descargando... saving = [accent]Guardando... respawn = [accent][[{0}][] para reaparecer en el núcleo 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} steam.error = Error al inicializar los servicios de Steam.\nError: {0} +editor.cliffs = Paredes a Colinas editor.brush = Pincel editor.openin = Abrir en el Editor editor.oregen = Generación de Minerales @@ -383,6 +388,7 @@ waves.waves = oleada(s) waves.perspawn = por lugar de aparición waves.shields = escudo/oleadas waves.to = hasta +waves.max = Oleadas máximas waves.guardian = Guardián waves.preview = Vista previa waves.edit = Editar... @@ -391,6 +397,13 @@ waves.load = Cargar del Portapapeles waves.invalid = Oleadas inválidaas en el portapapeles. 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.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. wavemode.counts = limitadas @@ -537,6 +550,7 @@ configure = Configurar carga inicial loadout = Carga Inicial resources = Recursos bannedblocks = Bloques prohibidos +bannedunits = Unidades prohibidas addall = Añadir todo launch.from = Lanzando desde: [accent]{0} launch.destination = Destino: {0} @@ -561,6 +575,8 @@ weather.sandstorm.name = Tormenta de arena weather.sporestorm.name = Tormenta de esporas weather.fog.name = Niebla +sectorlist = Sectores +sectorlist.attacked = {0} Bajo ataque sectors.unexplored = [lightgray]No explorado sectors.resources = Recursos: sectors.production = Producción: @@ -585,7 +601,7 @@ sector.missingresources = [scarlet]Recursos Insuficientes sector.attacked = Sector [accent]{0}[white] bajo ataque[]! sector.lost = ¡Sector [accent]{0}[white] perdido[]! #nota: el espacio en blanco en la línea siguiente es intencionado -sector.captured = ¡Sector [accent]{0}[white] capturado[]! +sector.captured = ¡Sector [accent]{0}[white] capturado! sector.changeicon = Cambiar Icono threat.low = Baja @@ -615,6 +631,8 @@ sector.biomassFacility.name = Centro de Sintetización de Biomasa sector.windsweptIslands.name = Islas Windswept sector.extractionOutpost.name = Puesto de avanzada de Extracción 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.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.spore-slowed.name = Ralentizado status.tarred.name = Alquitranado +status.overdrive.name = Sobremarcha status.overclock.name = Sobrecargado status.shocked.name = Aturdido status.blasted.name = Explotado status.unmoving.name = Inmóvil +status.boss.name = Guardián settings.language = Idioma settings.data = Datos del Juego @@ -770,6 +790,7 @@ bar.corereq = Necesitas un núcleo base bar.drillspeed = Velocidad del Taladro: {0}/s bar.pumpspeed = Velocidad de bombeado: {0}/s bar.efficiency = Eficiencia: {0}% +bar.boost = Aceleración: +{0}% bar.powerbalance = Energía: {0} bar.powerstored = Almacenados: {0}/{1} bar.poweramount = Energía: {0} @@ -832,6 +853,7 @@ category.items = Objetos category.crafting = Fabricación category.function = Función category.optional = Mejoras Opcionales +setting.skipcoreanimation.name = Saltar animación de Lanzamiento/Aterrizaje del Núcleo setting.landscape.name = Bloquear modo horizontal setting.shadows.name = Sombras setting.blockreplace.name = Sugerir bloques al construir @@ -872,7 +894,9 @@ setting.saveinterval.name = Intervalo del Autoguardado setting.seconds = {0} segundos setting.milliseconds = {0} milisegundos 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.smoothcamera.name = Movimiento de cámara suave 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.attack = Asalto 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.polygoncoreprotection = Protección de Núcleo Poligonal 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.dropzoneradius = Radio de zona de caída:[lightgray] (casillas) rules.unitammo = Las unidades necesitan munición +rules.enemyteam = Equipo Enemigo +rules.playerteam = Equipo del jugador rules.title.waves = Oleadas rules.title.resourcesbuilding = Recursos y Construcción rules.title.enemy = Enemigos rules.title.unit = Unidades rules.title.experimental = Experimental rules.title.environment = Entorno +rules.title.teams = Equipos rules.lighting = Iluminación rules.enemyLights = Luces enemigas rules.fire = Fuego @@ -1097,7 +1126,6 @@ unit.reign.name = Reign unit.vela.name = Vela unit.corvus.name = Corvus -block.resupply-point.name = Punto de reabastecimiento block.parallax.name = Parallax block.cliff.name = Pared 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.shallow-water.name = Agua 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.tar.name = Alquitrán 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.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.illuminator.description = Emite luz. 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.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.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.item-source.description = Hace aparecer minerales 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.liquid-source.description = Da 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.item-source.description = Genera objetos de forma infinita. 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 = Genera líquido infinito. 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-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. @@ -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.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.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.write = Escribe un número en una unidad de memoria conectada. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index 415beafdb2..8e6dca790b 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -93,6 +93,7 @@ level.mode = Mode de jeu : coreattack = [scarlet]< Le Noyau est attaqué ! > nearpoint = [[ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nannihilation imminente database = Base de données +database.button = Base de données savegame = Sauvegarder la partie loadgame = Charger une partie joingame = Rejoindre une partie @@ -168,6 +169,7 @@ launchcore = Lancer le Noyau filename = Nom du fichier : unlocked = Nouveau contenu débloqué ! available = Nouvelle recherche disponible ! +unlock.incampaign = < Débloquer dans la campagne pour plus de détails > completed = [accent]Complété 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é) @@ -393,6 +395,13 @@ waves.load = Coller depuis le presse-papiers waves.invalid = Vagues invalides dans le presse-papiers. 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.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 wavemode.counts = compte @@ -618,6 +627,8 @@ sector.biomassFacility.name = Biomass Synthesis Facility sector.windsweptIslands.name = Windswept Islands sector.extractionOutpost.name = Extraction Outpost 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.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.spore-slowed.name = Spore ralentie status.tarred.name = Goudronné +status.overdrive.name = Surmultiplié status.overclock.name = Surcadençage status.shocked.name = Étourdie status.blasted.name = Foudroyé @@ -1151,9 +1163,10 @@ block.spawn.name = Point d'Apparition Ennemi block.core-shard.name = Noyau: Fragment block.core-foundation.name = Noyau: Fondation block.core-nucleus.name = Noyau: Épicentre -block.deep-water.name = Eau profonde +block.deep-water.name = Eau Profonde block.shallow-water.name = Eau 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.tar.name = Goudron 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.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.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.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. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 6f4b586f0e..3698123f3c 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -85,7 +85,7 @@ stat.destroyed = 破壊した建造物数:[accent] {0} stat.deconstructed = 解体した建造物数:[accent] {0} stat.playtime = プレイ時間:[accent] {0} -globalitems = [accent]グローバルアイテム +globalitems = [accent]トータルアイテム map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか? level.highscore = ハイスコア: [accent]{0} level.select = レベル選択 @@ -93,6 +93,7 @@ level.mode = ゲームモード: coreattack = < コアが攻撃を受けています! > nearpoint = [[ [scarlet]直ちに出現ポイントより離脱せよ[] ]\n殲滅されます database = コアデータベース +database.button = データベース savegame = 保存 loadgame = 読み込む joingame = マルチプレイ @@ -121,12 +122,12 @@ committingchanges = 変更を適応中 done = 完了 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.none = [lightgray]Modが見つかりませんでした! mods.guide = Mod作成ガイド mods.report = バグを報告する -mods.openfolder = Modのフォルダを開く +mods.openfolder = Modフォルダを開く mods.viewcontent = コンテンツを見る mods.reload = 再読み込み mods.reloadexit = Modを読み込む為にゲームを再起動します。 @@ -168,6 +169,7 @@ launchcore = コアを打ち上げる filename = ファイル名: unlocked = 新しい要素をアンロック! available = 新しい研究が利用可能です! +unlock.incampaign = < 詳細はキャンペーンでアンロックしてください > completed = [accent]完了 techtree = テックツリー research.legacy = [accent]5.0[] の研究データが見つかりました。\n[accent]このデータを読み込みますか?[] それとも、[accent]破棄して新しいキャンペーンで研究をやり直しますか?[](推奨) @@ -361,6 +363,7 @@ publish.confirm = 公開してもよろしいですか?\n\n[lightgray]最初 publish.error = 公開中のエラー: {0} steam.error = Steam サービスの初期化に失敗しました。\nエラー: {0} +editor.cliffs = 壁を崖にする editor.brush = ブラシ editor.openin = エディターで開く editor.oregen = 鉱石の生成 @@ -393,6 +396,13 @@ waves.load = クリップボードから読み込む waves.invalid = クリップボードのウェーブは無効なウェーブです。 waves.copied = ウェーブをコピーしました。 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 wavemode.counts = 数 @@ -447,19 +457,19 @@ editor.exists = すでに同じ名前のマップが存在します。 editor.selectmap = 読み込むマップを選択: toolmode.replace = 置換 -toolmode.replace.description = 固体ブロックのみに描きます。 +toolmode.replace.description = 同系統のブロックのみを置換する。 toolmode.replaceall = 全て置換 -toolmode.replaceall.description = このマップにあるすべてのブロックを置き換えます。 -toolmode.orthogonal = 直角 -toolmode.orthogonal.description = 直角の線を描きます。 +toolmode.replaceall.description = マップ内の同ブロックをすべて置換する。 +toolmode.orthogonal = 水平垂直 +toolmode.orthogonal.description = 水平もしくは垂直に線を描きます。 toolmode.square = 四角形 toolmode.square.description = 四角形のブラシです。 toolmode.eraseores = 鉱石消しゴム -toolmode.eraseores.description = 鉱石のみを消します。 -toolmode.fillteams = チームで埋める -toolmode.fillteams.description = ブロックの代わりにチームで埋めます。 -toolmode.drawteams = チームを描く -toolmode.drawteams.description = ブロックの代わりにチームを描きます。 +toolmode.eraseores.description = 鉱石のみを消します。(敵の出現場所含む) +toolmode.fillteams = チームを変更 +toolmode.fillteams.description = ブロックの所属チームを上書きします。 +toolmode.drawteams = チームを変更 +toolmode.drawteams.description = ブロックの所属チームを上書きします。 filters.empty = [lightgray]フィルターが設定されていません! 下のボタンからフィルターを追加してください。 @@ -475,7 +485,7 @@ filter.defaultores = デフォルトの鉱石 filter.ore = 鉱石 filter.rivernoise = 川の生成 filter.mirror = 反転 -filter.clear = クリアー +filter.clear = クリア filter.option.ignore = 無視 filter.scatter = 分散 filter.terrain = 地形 @@ -582,7 +592,7 @@ sectors.nonelaunch = [lightgray]無し (sun) sectors.rename = セクター名を変更 sectors.enemybase = [scarlet]敵基地 sectors.vulnerable = [scarlet]脆弱 -sectors.underattack = [scarlet]攻撃を受けます! [accent]{0}% 破損 +sectors.underattack = [scarlet]攻撃を受けています! [accent]{0}% 破損 sectors.survives = [accent]{0} ウェーブ生存 sectors.go = Go sector.curcapture = 制圧したセクター @@ -621,6 +631,8 @@ sector.biomassFacility.name = バイオマス · シンテシス · ファシリ sector.windsweptIslands.name = ウインドスイープト · アイランズ sector.extractionOutpost.name = エクストラクション · アウトポスト sector.planetaryTerminal.name = プラネタリー · ローンチ · ターミナル +sector.coastline.name = 海岸線 +sector.navalFortress.name = 海軍要塞 sector.groundZero.description = 奪回を始めるには最適な場所です。敵脅威は低いですが、資源が乏しいです。\nできるだけ多くの銅と鉛を集めます。\n始めましょう。 sector.frozenForest.description = ここでさえ、山に近づくほど胞子が広がっています。\n極寒の気温もそれらを永遠に封じ込めることはできませんでした。\n\n電気に挑みましょう。\n火力発電機を建設し、修復機の使い方を学びましょう。 @@ -648,6 +660,7 @@ status.sapped.name = 吸収 status.electrified.name = 帯電 status.spore-slowed.name = 鈍化胞子 status.tarred.name = 石油塗れ +status.overdrive.name = オーバードライブ status.overclock.name = オーバークロック status.shocked.name = 電撃 status.blasted.name = 爆破 @@ -904,7 +917,7 @@ setting.savecreate.name = 自動保存 setting.publichost.name = 誰でもゲームに参加できるようにする setting.playerlimit.name = プレイヤー数制限 setting.chatopacity.name = チャットの透明度 -setting.lasersopacity.name = レーザーの透明度 +setting.lasersopacity.name = 電線の透明度 setting.bridgeopacity.name = ブリッジの透明度 setting.playerchat.name = ゲーム内にチャットを表示 setting.showweather.name = 天気のグラフィックを表示 @@ -990,14 +1003,14 @@ keybind.drop_unit.name = ドロップユニット keybind.zoom_minimap.name = ミニマップのズーム mode.help.title = モード説明 mode.survival.name = サバイバル -mode.survival.description = 通常のモードです。 資源も限られる中、自動的にウェーブが進行していきます。\n[gray]プレイするには、マップに敵が出現する必要があります。 +mode.survival.description = 通常のモードです。資源も限られる中、自動的にウェーブが進行していきます。\n[gray]マップに敵の出現設定が必要です。 mode.sandbox.name = サンドボックス mode.sandbox.description = 無限の資源があり、ウェーブを自由に進行できます。 mode.editor.name = エディター mode.pvp.name = PvP -mode.pvp.description = エリア内で他のプレイヤーと戦います。\n[gray]プレイするには、マップに少なくとも二つの異なる色のコアが必要です。 +mode.pvp.description = エリア内で他のプレイヤーと戦います。\n[gray]マップに少なくとも異なる2色のコアが必要です。 mode.attack.name = アタック -mode.attack.description = ウェーブがなく、敵の基地を破壊することを目指します。\n[gray]プレイするには、マップに赤色のコアが必要です。 +mode.attack.description = ウェーブがなく、敵の基地を破壊することを目指します。\n[gray]マップに赤色のコアが必要です。 mode.custom = カスタムルール rules.infiniteresources = 資源の無限化 @@ -1019,7 +1032,7 @@ rules.unitbuildspeedmultiplier = ユニットの製造速度倍率 rules.unithealthmultiplier = ユニットの体力倍率 rules.unitdamagemultiplier = ユニットのダメージ倍率 rules.unitcapvariable = コア数によってユニット上限を変動 -rules.unitcap = ベースのユニット上限数 +rules.unitcap = 基礎ユニット上限数 rules.enemycorebuildradius = 敵コア周辺の建設禁止区域の半径:[lightgray] (タイル) rules.wavespacing = ウェーブ間の待機時間:[lightgray] (秒) rules.buildcostmultiplier = 建設コストの倍率 @@ -1153,7 +1166,8 @@ block.core-foundation.name = コア: ファンデーション block.core-nucleus.name = コア: ニュークリアス block.deep-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.tar.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.coreUpgrade = コアは [accent]上位のコアを配置することでアップグレードできます[]。\n\n  [accent]シャード[]コアの上に、  [accent]ファンデーション[]コアを置きます。近くに障害物がないことを確認してください。 hint.presetLaunch = [accent]フローズン · フォレスト[]などの灰色の[accent]着陸ゾーンセクター[]には、どこからでも発射できるため近くの領土を確保する必要はありません。\n\nしかし、このような[accent]数字のセクター[]では[accent]この限りではありません[]。 +hint.presetDifficulty = このセクターは[scarlet]敵の脅威レベルが高いです[]。\nこのようなセクターへの出撃は、適切な技術と準備なしには[accent]お勧めできません[]。 hint.coreIncinerate = コアのアイテム収納数の上限に達したアイテムは搬入されず[accent]破棄[]されます。 hint.coopCampaign = [accent]co-op キャンペーン[]をプレイすると、現在のマップで生産されたアイテムは[accent]あなたのセクター[]に移送されます。\n\nホストが行った新しい研究も引き継がれます。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index b764582e5a..fab2e11f35 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -93,6 +93,7 @@ level.mode = 게임 모드: coreattack = < 코어가 공격을 받고 있습니다! > nearpoint = [[ [scarlet]즉시 적 소환구역에서 떠나십시오[] ]\n단계가 시작하는 순간 인근 건물들과 유닛들이 파괴됩니다! database = 코어 데이터베이스 +database.button = 데이터베이스 savegame = 게임 저장 loadgame = 게임 불러오기 joingame = 게임 참여 @@ -168,6 +169,7 @@ launchcore = 코어 출격 filename = 파일 이름: unlocked = 새로운 콘텐츠가 해금되었습니다! available = 새로운 콘텐츠 해금이 가능합니다! +unlock.incampaign = < 해금 후 상세정보 열람이 가능합니다 > completed = [accent]완료됨 techtree = 연구 기록 research.legacy = [accent]5.0[] 연구 데이터를 찾았습니다.\n[accent]이 데이터를 불러오시겠습니까?[], 아니면 이 데이터를 무시하고 캠페인을 새로 시작하시겠습니까? [accent]무시한 데이터는 삭제됩니다.[] (권장됨) @@ -361,6 +363,7 @@ publish.confirm = 이것을 게시하시겠습니까?[lightgray]창작마당 EUL publish.error = 아이템 게시 오류: {0} steam.error = 스팀 서비스를 초기화하지 못했습니다.\n오류: {0} +editor.cliffs = 언덕 전환 editor.brush = 브러쉬 editor.openin = 편집기 열기 editor.oregen = 광물 무작위 생성 @@ -381,10 +384,10 @@ waves.title = 단계 waves.remove = 삭제 waves.every = 매 waves.waves = 단계마다 -waves.perspawn = 마리씩 생성됨 -waves.shields = 방어막 hp/단계 +waves.perspawn = 마리씩 +waves.shields = 방어막만큼 소환 waves.to = 부터 -waves.max = 최대 유닛 수 +waves.max = 마리 까지 waves.guardian = 수호자 waves.preview = 미리보기 waves.edit = 편집 @@ -393,6 +396,13 @@ waves.load = 클립보드에서 불러오기 waves.invalid = 클립보드에 잘못된 단계 데이터가 있습니다. waves.copied = 단계 복사됨. 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 wavemode.counts = 마리 @@ -409,7 +419,7 @@ editor.teams = 팀 editor.errorload = 파일을 불러오지 못했습니다. editor.errorsave = 파일을 저장하지 못했습니다. editor.errorimage = 이것은 맵이 아니라 사진입니다. -editor.errorlegacy = 이 맵은 너무 오래되어 더 이상 지원되지 않는 구형 맵 형식을 사용합니다. +editor.errorlegacy = 이 맵은 너무 오래되어 더 이상 지원하지 않는 구형 맵 형식을 사용합니다. editor.errornot = 맵 파일이 아닙니다. editor.errorheader = 이 맵 파일은 유효하지 않거나 손상되었습니다. editor.errorname = 맵에 이름이 지정되어 있지 않습니다. 저장 파일을 불러오려고 시도하는 건가요? @@ -447,7 +457,7 @@ editor.exists = 이 이름의 맵이 이미 존재합니다. editor.selectmap = 불러올 맵을 선택하세요: toolmode.replace = 재배치 -toolmode.replace.description = 단단한 블록에만 그립니다. +toolmode.replace.description = 지형 블록에만 그립니다. toolmode.replaceall = 모두 재배치 toolmode.replaceall.description = 맵에 있는 모든 블록을 재배치합니다. toolmode.orthogonal = 직각 @@ -648,6 +658,7 @@ status.sapped.name = 피로 status.electrified.name = 과전류 status.spore-slowed.name = 포자감속 status.tarred.name = 침유됨 +status.overdrive.name = 과부하 status.overclock.name = 가속화 status.shocked.name = 감전 status.blasted.name = 파손 @@ -1150,6 +1161,7 @@ block.core-nucleus.name = 코어: 핵심 block.deep-water.name = 깊은 물 block.shallow-water.name = 물 block.tainted-water.name = 오염된 물 +block.deep-tainted-water.name = 오염된 깊은 물 block.darksand-tainted-water.name = 오염된 젖은 검은 모래 block.tar.name = 타르 block.stone.name = 바위 @@ -1316,7 +1328,7 @@ block.payload-router.name = 화물 분배기 block.duct.name = 도관 block.duct-router.name = 도관 분배기 block.duct-bridge.name = 도관 다리 -block.payload-propulsion-tower.name = 화물 추진탑 +block.payload-propulsion-tower.name = 화물 드라이버 block.payload-void.name = 화물 소멸기 block.payload-source.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.coreUpgrade = 코어는 [accent]상위 코어를 위에 설치함[]으로써 업그레이드할 수 있습니다.\n\n [accent]기반[] 코어를 [accent]조각[] 코어 위에 설치하십시오. 주변에 장애물이 없는지도 확인하십시오. hint.presetLaunch = [accent]얼어붙은 숲[]과 같은 회색[accent]캠페인 지역[]은 어디에서나 출격해서 올 수 있습니다. 주변 지역을 점령하지 않아도 됩니다.\n\n이와 같은 [accent]네임드 지역[]들은 [accent]선택적[]입니다. +hint.presetDifficulty = 이 지역은 [scarlet]고위험 레벨[] 지역입니다.\n적절한 기술과 준비 없이 이런 지역들로 출격하는건 [accent]비추천[]합니다. hint.coreIncinerate = 코어가 자원으로 가득 찬 후에 받는 모든 자원들은 [accent]소각[]될 것입니다. -hint.coopCampaign = [accent]협동 캠페인[]을 할 때, 현재 맵에서 생산된 자원들은 [accent]캠페인 지역[]으로도 보내집니다.\n\n호스트가 새로 해금한 모든 것들도 가져갑니다. +hint.coopCampaign = [accent]협동 캠페인[]을 할 때, 현재 맵에서 생산된 자원들은 [accent]캠페인 지역[]으로도 보내집니다.\n\n호스트가 새로 해금한 모든 자원들도 가져갑니다. item.copper.description = 가장 기본적인 건설 재료. 모든 유형의 블록에서 광범위하게 사용됩니다. item.copper.details = 평범한 구리. 세르플로에 비정상적으로 많이 분포합니다. 별다른 보강재 없이는 구조적 문제 때문에 내구성이 비교적 약합니다. @@ -1560,7 +1573,7 @@ block.logic-display.description = 프로세서를 이용해 그래픽을 출력 block.large-logic-display.description = 프로세서를 이용해 그래픽을 출력할 수 있습니다. block.interplanetary-accelerator.description = 거대한 전자기 레일건 타워. 코어를 행성 간 이동을 위한 탈출 속도까지 가속합니다. block.repair-turret.description = 가장 가까운 유닛을 지속적으로 수리합니다. 냉각수를 넣을 수 있습니다. -block.payload-propulsion-tower.description = 장거리 화물 운반 구조물. 화물을 연결된 다른 화물 추진탑으로 발사합니다. +block.payload-propulsion-tower.description = 장거리 화물 운반 구조물. 화물을 연결된 다른 화물 드라이버로 발사합니다. unit.dagger.description = 주변 모든 적에게 일반적인 탄환을 발사합니다. unit.mace.description = 주변 모든 적에게 화염 줄기를 발사합니다. @@ -1956,10 +1969,10 @@ unit.minke.details = unit.bryde.details = unit.sei.details = [lightgray][비공식][]세이 sei! unit.omura.details = [lightgray][비공식][]오무라이스? -unit.retusa.details = [lightgray][비공식][]바다를 지뢰로 뒤덮어보죠. +unit.retusa.details = [lightgray][비공식][]바다를 지뢰로 뒤덮여보죠. unit.oxynoe.details = unit.cyerce.details = [lightgray][비공식][]폭죽놀이다! -unit.aegires.details = [lightgray][비공식][]플레이어가 할 수 있는건 운전과 공사뿐... +unit.aegires.details = [lightgray][비공식][]공격 컨트롤을 할 수 없습니다. unit.navanax.details = [lightgray][비공식][]플레이어에게 잠깐의 섬광뽕을 입힙니다. unit.alpha.details = unit.beta.details = diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 88f9784dc1..7d5fdf84cb 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -169,6 +169,7 @@ launchcore = Lansează Nucleu filename = Nume Fișier: unlocked = Nou conținut deblocat! available = Poți cerceta noi tehnologii! +unlock.incampaign = < Deblochează în campanie pt detalii > completed = [accent]Finalizat 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)? @@ -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} steam.error = Inițializarea serviciilor Steam a eșuat.\nEroare: {0} +editor.cliffs = Pereți >> Dealuri editor.brush = Pensulă editor.openin = Deschide în Editor editor.oregen = Generarea Minereurilor @@ -394,6 +396,13 @@ waves.load = Încarcă din Clipboard waves.invalid = Valuri invalide în clipboard. 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.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ă 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.extractionOutpost.name = Avanpostul de Extracție 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.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.spore-slowed.name = Încetinit de Spori status.tarred.name = Păcurit -status.overclock.name = Suprasolicitat +status.overdrive.name = Suprasolicitat +status.overclock.name = Overclock status.shocked.name = Electrocutat status.blasted.name = Explozie status.unmoving.name = Nemișcat @@ -766,9 +778,9 @@ stat.healing = Reparare ability.forcefield = Câmp de Forță 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.shieldregenfield = Scut Regenerabil +ability.shieldregenfield = Câmp Regenerare Scut ability.movelightning = Mișcare Fulger 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.effects.name = Vezi Efectele 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.sensitivity.name = Sensibilitatea Controlului setting.saveinterval.name = Interval de Salvare @@ -928,8 +940,8 @@ keybind.clear_building.name = Șterge Clădirea keybind.press = Apasă o tastă... keybind.press.axis = Apasă o axă sau o tastă... keybind.screenshot.name = Captură Hartă -keybind.toggle_power_lines.name = Oprește/Pornește Statusul Electricelor -keybind.toggle_block_status.name = Oprește/Pornește Statusul Blocurilor +keybind.toggle_power_lines.name = Oprește/Pornește Starea Electricelor +keybind.toggle_block_status.name = Oprește/Pornește Starea Blocurilor keybind.move_x.name = Mergi pe X keybind.move_y.name = Mergi pe Y keybind.mouse_move.name = Urmărește Mouseul @@ -1048,7 +1060,7 @@ content.item.name = Materiale content.liquid.name = Lichide content.unit.name = Unități content.block.name = Blocuri -content.status.name = Efecte de Status +content.status.name = Efecte de Stare content.sector.name = Sectoare item.copper.name = Cupru @@ -1151,6 +1163,7 @@ block.core-nucleus.name = Nucleu: Core block.deep-water.name = Apă Adâncă block.shallow-water.name = Apă 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.tar.name = Păcură 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.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.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.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.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.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.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. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index b846e94512..b76c002d8c 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -616,6 +616,8 @@ sector.biomassFacility.name = Центр исследования биомасс sector.windsweptIslands.name = Штормовой архипелаг sector.extractionOutpost.name = Добывающая база sector.planetaryTerminal.name = Планетарный пусковой терминал +sector.coastline.name = Береговая линия +sector.navalFortress.name = Прибрежная крепость sector.groundZero.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.incendiary = [stat]зажигательный bullet.homing = [stat]самонаводящийся -bullet.frag = [stat]осколочный +bullet.frags = [stat]{0}[lightgray]x осколочный(ых) снаряд(ов): bullet.lightning = [stat]{0}[lightgray]x молнии ~ [stat]{1}[lightgray] урона bullet.buildingdamage = [stat]{0}%[lightgray] урона по постройкам bullet.knockback = [stat]{0}[lightgray] отбрасывания @@ -1544,6 +1546,8 @@ block.memory-bank.description = Хранит информацию для лог block.logic-display.description = Отображает произвольную графику из логического процессора. block.large-logic-display.description = Отображает произвольную графику из логического процессора. block.interplanetary-accelerator.description = Массивная электромагнитная башня-рельсотрон. Ускоряет ядро, позволяя преодолеть гравитацию для межпланетного развёртывания. +block.repair-turret.description = Непрерывно ремонтирует ближайшую поврежденную еденицу в своем радиусе. Опционально использует охлаждающую жидкость. +block.payload-propulsion-tower.description = Конструкция для транспортировки больших грузов на большое растояние. Стреляет грузом в другие грузовые катапульты. unit.dagger.description = Стреляет стандартными пулями по всем врагам поблизости. unit.mace.description = Стреляет потоками огня по всем врагам поблизости. diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 7b0728708b..5357ba6107 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -169,6 +169,7 @@ launchcore = ส่งแกนกลาง filename = ชื่อไฟล์: unlocked = เนื้อหาใหม่ปลดล็อก! available = มีการวิจัยใหม่พร้อมปลดล็อก! +unlock.incampaign = < ปลดล็อกในแคมเปญเพื่อดูรายละเอียด > completed = [accent]วิจัยแล้ว techtree = ต้นไม้แห่งเทคโนโลยี research.legacy = พบข้อมูลการวิจัยของเวอร์ชั่น [accent]5.0[]\nคุณต้องการ[accent]โหลดข้อมูล[]หรือ[accent]ทิ้งข้อมูลไป[]และเริ่มต้นวิจัยในแคมเปญใหม่ (แนะนำ) @@ -248,7 +249,7 @@ confirmban = คุณแน่ใจหรือว่าจะแบนผู confirmkick = คุณแน่ใจหรือว่าจะเตะผู้เล่นนี้ออก? confirmvotekick = คุณแน่ใจหรือว่าจะโหวตเตะผู้เล่นนี้ออก? confirmunban = คุณแน่ใจหรือว่าจะเลิกแบนผู้เล่นนี้? -confirmadmin = คุณแน่ใจหรือว่าจะเปลี่ยนผู้เล่นคนนี้เป็นแอดมิน? +confirmadmin = คุณแน่ใจหรือว่าจะแต่งตั้งผู้เล่นคนนี้เป็นแอดมิน? confirmunadmin = คุณแน่ใจหรือว่าจะลบสถานะการเป็นแอดมินของผู้เล่นนี้? joingame.title = เข้าร่วมเกม joingame.ip = ที่อยู่: @@ -362,6 +363,7 @@ publish.confirm = คุณแน่ใจหรือว่าจะเผย publish.error = เกิดข้อผิดพลาดการเผยแพร่ไอเท็มดังต่อไปนี้: {0} steam.error = ไม่สามารถเริ่ม Steam service ได้\nError: {0} +editor.cliffs = เปลี่ยนกำแพงเป็นหน้าผา editor.brush = แปรง editor.openin = เปิดในตัวแก้ไข editor.oregen = การเกิดของแร่ @@ -394,6 +396,13 @@ waves.load = โหลดจากคลิปบอร์ด waves.invalid = แบบคลื่นในคลิปบอร์ดไม่ถูกต้อง waves.copied = คัดลอกแบบคลื่นแล้ว 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 wavemode.counts = จำนวน @@ -439,7 +448,7 @@ editor.exportimage = ส่งออกไฟล์รูปพื้นที editor.exportimage.description = ส่งออกไฟล์รูปแมพ editor.loadimage = นำเข้าแบบพื้นที่ editor.saveimage = ส่งออกแบบพื้นที่ -editor.unsaved = [scarlet]คุณมีการเปลี่ยนแปลงที่ยังไม่ได้เซฟ![]\nคุณแน่ใจหรือว่าจะออก? +editor.unsaved = คุณแน่ใจหรือว่าจะออก?\n[scarlet]การเปลี่ยนแปลงที่ยังไม่ได้เซฟจะถูกทิ้ง editor.resizemap = เปลี่ยนขนาดของแมพ editor.mapname = ชื่อแมพ: editor.overwrite = [accent]ตำเตือน!\nแมพนี้จะเขียนทับกับแมพที่มีอยู่แล้ว @@ -615,29 +624,31 @@ sector.stainedMountains.name = ภูเขาหลากสี sector.desolateRift.name = เดโซเลต ริฟต์ sector.nuclearComplex.name = ฐานผลิตนิวเคลียร์ sector.overgrowth.name = โอเวอร์โกรว์ด -sector.tarFields.name = ทาร์ ฟิลด์ +sector.tarFields.name = ผืนแผ่นแห่งน้ำมัน sector.saltFlats.name = ที่ราบเกลือ sector.fungalPass.name = ทางผ่านฟังกัล sector.biomassFacility.name = แหล่งสังเคราะห์ชีวมวล sector.windsweptIslands.name = หมู่เกาะวินด์สเวปท์ sector.extractionOutpost.name = ด่านส่งทรัพยากร sector.planetaryTerminal.name = ท่าปล่อยจรวดอวกาศยาน +sector.coastline.name = แนวชายฝั่ง +sector.navalFortress.name = ปราการแห่งวารี 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.craters.description = น้ำขังอยู่ในหลุมอุกกาบาศแห่งนี้ อนุสรณ์สถานของสงครามเก่าแก่\nยึดพื้นที่นี่มา เก็บทราย เผา[accent]กระจกเมต้า[]\nปั๊มน้ำเพื่อมาหล่อเย็นป้อมปืนและเครื่องขุดเจาะ +sector.craters.description = มีน้ำขังอยู่ในหลุมอุกกาบาศแห่งนี้ เป็นอนุสรณ์สถานของสงครามเก่าแก่\nยึดพื้นที่นี่มา เก็บทราย เผา[accent]กระจกเมต้า[]\nปั๊มน้ำเพื่อมาหล่อเย็นป้อมปืนและเครื่องขุดเจาะ sector.ruinousShores.description = ถัดมาจากทะเลทราย เป็นที่ตั้งของชายฝั่ง ที่ครั้งก่อน เคยเป็นที่ตั้งของฐานป้องกันชายฝั่ง\nซึ่งทุกทำลายไปซะส่วนใหญ่แล้ว มีเหลือแค่ระบบการป้องกันพื้นฐาน\nทุกอย่างที่เหลือถูกทำลายเหลือเพียงแค่เศษเหล็ก\n\nทำการขยายการสำรวจต่อไป ค้นพบกับเทคโนโลยีอีกครั้ง sector.stainedMountains.description = เข้าลึกไปในพื้นที่ จะพบกับภูเขา ซึ่งยังไม่ถูกสปอร์แตะต้อง\nขุด[accent]ไทเทเนี่ยม[]ที่อุดมสมบูรณ์ในพื้นที่นี้ เรียนรู้ที่จะใช้มัน\n\nมีศัตรูปรากฏตัวมากขึ้นในบริเวณนี้ อย่าปล่อยให้พวกมันส่งยูนิตที่แข็งแกร่งที่สุดออกมา 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.nuclearComplex.description = สถานที่ผลิตและแปรรูปทอเรี่ยมเก่า ถูกทำลายไม่เหลือสิ้น\nวิจัยทอเรี่ยมและวิธีการใช้มัน\n\nศัตรูในบริเวณนี้มีจำนวนมาก คอยตรวจตราหาผู้บุกรุกอยู่ตลอดเวลา sector.fungalPass.description = ทางผ่านระหว่างพื้นที่สูงและต่ำของภูเขา พื้นที่นี้เต็มไปด้วยสปอร์ ฐานลาดตระเวนขนาดเล็กของศัตรูตั้งอยู่ที่นี่\nทำลายมันซะ\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.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ผลิตยูนิตเรือ กวาดล้างศัตรูให้เร็วที่สุด วิจัยสิ่งประดิษฐ์นั่น status.burning.name = เผาไหม้ @@ -649,6 +660,7 @@ status.sapped.name = อ่อนกำลัง status.electrified.name = ช็อตไฟฟ้า status.spore-slowed.name = สปอร์สโลว์ status.tarred.name = เปื้อนน้ำมัน +status.overdrive.name = โอเวอร์ไดรฟ์ status.overclock.name = โอเวอร์คล็อก status.shocked.name = ช็อก status.blasted.name = ระเบิด @@ -665,7 +677,7 @@ settings.game = เกม settings.sound = เสียง settings.graphics = กราฟิก settings.cleardata = เคลียร์ข้อมูลเกม... -settings.clear.confirm = คุณแน่ใจหรือว่าจะเคลียร์ข้อมูลเกม?\nสิ่งที่ทำไปแล้วจะไม่สามารถย้อนกลับได้! +settings.clear.confirm = คุณแน่ใจหรือว่าจะเคลียร์ข้อมูลนี้?\nสิ่งที่ทำไปแล้วจะไม่สามารถย้อนกลับได้นะ! settings.clearall.confirm = [scarlet]คำเตือน![]\nการกระทำนี้จะลบข้อมูลทั้งหมด นั้นรวมไปถึงเซฟ แมพ การวิจัยแล้วและก็ปุ่มควบคุม\nเมื่อคุณกด 'โอเค' เกมจะลบข้อมูลทุกอย่างและออกโดยอัตโนมัติ settings.clearsaves.confirm = คุณแน่ใจหรือว่าคุณต้องการเคลียร์เซฟทั้งหมด? settings.clearsaves = เคลียร์เซฟ @@ -683,7 +695,7 @@ info.title = ข้อมูล error.title = [crimson]มีบางอย่างผิดพลาดเกิดขึ้น error.crashtitle = มีบางอย่างผิดพลาดเกิดขึ้น unit.nobuild = [scarlet]ยูนิตนี้ไม่สามารถสร้างได้ -lastaccessed = [lightgray]:คนที่แตะเป็นคนสุดท้าย {0} +lastaccessed = [lightgray]คนสุดท้ายที่แตะ: {0} block.unknown = [lightgray]??? stat.showinmap = <โหลดแมพเพื่อแสดง> @@ -1151,6 +1163,7 @@ block.core-nucleus.name = แกนกลาง: นิวเคลียส block.deep-water.name = น้ำลึก block.shallow-water.name = น้ำตื้น block.tainted-water.name = น้ำเสีย +block.deep-tainted-water.name = น้ำเสียลึก block.darksand-tainted-water.name = น้ำเสียบนทรายดำ block.tar.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.coreUpgrade = สามารถอัปเกรดแกนกลางได้โดย[accent]วางแกนกลางที่ใหญ่กว่าทับมัน[]\n\nวาง  [accent]แกนกลาง: ฟาวน์เดชั่น[]ทับ  [accent]แกนกลาง: ชาร์ด[] ต้องแน่ใจว่ารอบข้างมีที่ว่างก่อนจะวาง hint.presetLaunch = [accent]เซ็กเตอร์ลงจอด[]สีเทา อย่างเช่น[accent]ป่าหนาวเหน็บ[] สามารถลงจอดจากที่ไหนที่ได้ในแผนที่ พวกนั้นไม่จำเป็นต้องยืดครองเซ็กเตอร์รอบข้างเพื่อส่งแกนกลางไป\n\n[accent]เซ็กเตอร์ที่มีเลข[] อย่างเช่นอันนี้[accent]ไม่จำเป็น[]ต้องยืดครอง +hint.presetDifficulty = เซ็กเตอร์นี้มี[scarlet]ระดับภัยคุกคามศัตรูสูง[]\n[accent]ไม่แนะนำ[]ให้ลงจอดไปยังเซ็กเซอร์พวกนั้นหากไม่มีการเตรียมพร้อมและเทคโนโลยี hint.coreIncinerate = เมื่อแกนกลางมีจำนวนไอเท็มชนิดหนึ่งที่เต็ม ไอเท็มชนิดนั้นที่เข้ามาเพิ่มจะ[accent]ถูกเผา[] hint.coopCampaign = ตอนที่เล่น[accent]แคมเปญร่วมกัน[]กับเพื่อน ไอเท็มที่ผลิตในแมพนี้จะถูกส่ง[accent]ไปยังเซ็กเตอร์ของคุณด้วย[]\n\nการวิจัยใหม่ที่โฮสต์ได้วิจัยก็เก็บเป็นของคุณด้วย @@ -1761,12 +1775,12 @@ lenum.target = ยิงไปที่ตำแหน่งเป้าหม lenum.targetp = ยิงเป้าหมายโดยมีการคำนวณความเร็ว lenum.itemdrop = ปล่อยไอเท็ม lenum.itemtake = หยิบไอเท็มจากสิ่งก่อสร้าง -lenum.paydrop = ปล่อยของที่บรรทุกอยู่ -lenum.paytake = หยิบของบรรทุกที่จุดที่อยู่ +lenum.paydrop = ปล่อยสิ่งที่บรรทุกอยู่ +lenum.paytake = หยิบสิ่งบรรทุก ณ จุดที่อยู่ lenum.flag = ปักธงยูนิตเป็นหมายเลข lenum.mine = ขุดที่ตำแหน่งเป้าหมาย lenum.build = สร้างสิ่งก่อสร้าง lenum.getblock = ดึงข้อมูลสิ่งก่อสร้างและประเภทสิ่งก่อสร้างที่ตำแหน่งเป้าหมาย\nหน่วยต้องอยู่ในช่วงของตำแหน่ง\nของแข็งที่ไม่ใช่สิ่งก่อสร้างจะส่งกลับเป็น [accent]@solid[] lenum.within = ตรวจสอบว่ายูนิตอยู่ในระยะหรือไม่ 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 diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 66d8d849af..9db8f6eb97 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -393,6 +393,13 @@ waves.load = Panodan yükle waves.invalid = Panoda geçersiz dalga sayısı var. 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.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. wavemode.counts = miktarlar @@ -621,6 +628,8 @@ sector.biomassFacility.name = Sentetik BioMadde Santrali sector.windsweptIslands.name = Rüzgarlı Adalar sector.extractionOutpost.name = Kazı Üssü 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.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.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.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.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. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 0cb51b1d3d..48ef307c69 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -3,28 +3,28 @@ credits = 致谢 contributors = 翻译者和贡献者 discord = 加入 Mindustry 的 Discord! link.discord.description = Mindustry 官方的 Discord 聊天室 -link.reddit.description = Mindustry 的 reddit 板块 +link.reddit.description = Mindustry 的 Reddit 板块 link.github.description = 游戏源代码 link.changelog.description = 更新日志 link.dev-builds.description = 不稳定的开发版本 -link.trello.description = 官方列于 Trello 的功能计划表 +link.trello.description = 官方列于 Trello 的特性计划表 link.itch.io.description = itch.io 上的 PC 版下载 link.google-play.description = Google Play 页面 link.f-droid.description = F-Droid 页面 link.wiki.description = Mindustry 官方 Wiki link.suggestions.description = 提出新特性的建议 link.bug.description = 发现了 Bug ?在这里报告 -linkfail = 打开链接失败!\n网址已复制到您的剪贴板。 +linkfail = 打开链接失败!\n网址已复制到您的剪贴板。 screenshot = 屏幕截图已保存到 {0} -screenshot.invalid = 地图太大,可能没有足够的内存用于截图。 +screenshot.invalid = 地图太大,可能没有足够的内存用于截图。 gameover = 游戏结束 gameover.disconnect = 断开连接 gameover.pvp = [accent] {0}[]队获胜! -gameover.waiting = [accent]正在更换下一张地图... +gameover.waiting = [accent]正在更换下一张地图… highscore = [accent]新纪录! copied = 已复制 -indev.notready = 这部分玩法还未开发完成。 -indev.campaign = [accent]恭喜!您已经到达战役模式的结尾![]\n\n这是目前内容的全部。 未来的更新中将添加行星际旅行。 +indev.notready = 这部分玩法还未开发完成。 +indev.campaign = [accent]恭喜!您已经完成了战役模式![]\n\n这是目前全部的游戏内容。 未来的更新中将添加行星际旅行。 load.sound = 音乐加载中 load.map = 地图加载中 @@ -34,74 +34,74 @@ load.system = 系统加载中 load.mod = 模组加载中 load.scripts = 脚本加载中 -be.update = 发现游戏最新版本: -be.update.confirm = 现在下载并重启游戏? -be.updating = 更新... +be.update = 发现游戏最新BE版本: +be.update.confirm = 现在下载并重启游戏? +be.updating = 更新中… be.ignore = 忽略 -be.noupdates = 未发现更新。 +be.noupdates = 未发现更新。 be.check = 检测更新 mods.browser = 模组浏览器 mods.browser.selected = 已选模组 mods.browser.add = 安装 -mods.browser.reinstall = 重装 +mods.browser.reinstall = 重新安装 mods.github.open = 查看 mods.browser.sortdate = 按时间排序 -mods.browser.sortstars = 按星标排序 +mods.browser.sortstars = 按星数排序 schematic = 蓝图 schematic.add = 保存蓝图… schematics = 蓝图 -schematic.replace = 此名称的蓝图已存在,是否覆盖? -schematic.exists = 此名称的蓝图已存在。 +schematic.replace = 存在同名蓝图,是否覆盖? +schematic.exists = 存在同名蓝图。 schematic.import = 导入蓝图… schematic.exportfile = 导出文件 -schematic.importfile = 导入蓝图 +schematic.importfile = 从文件导入 schematic.browseworkshop = 浏览创意工坊 -schematic.copy = 复制蓝图到剪贴板 -schematic.copy.import = 从剪贴板导入蓝图 -schematic.shareworkshop = 在创意工坊上分享蓝图 +schematic.copy = 复制到剪贴板 +schematic.copy.import = 从剪贴板导入 +schematic.shareworkshop = 在创意工坊上分享 schematic.flip = [accent][[{0}][]/[accent][[{1}][]:翻转蓝图 -schematic.saved = 蓝图已保存。 -schematic.delete.confirm = 确认删除蓝图? +schematic.saved = 蓝图已保存。 +schematic.delete.confirm = 确定删除蓝图? schematic.rename = 重命名蓝图 -schematic.info = {0}x{1},{2} 个方块 -schematic.disabled = [scarlet]蓝图已禁用![]\n您不能在此[accent]地图[]或[accent]服务器[]上使用蓝图. -schematic.tags = 标签: +schematic.info = {0}x{1},{2} 个建筑 +schematic.disabled = [scarlet]蓝图已禁用![]\n您不能在此[accent]地图[]或[accent]服务器[]上使用蓝图。 +schematic.tags = 标签: schematic.edittags = 编辑标签 -schematic.addtag = 增加新标签 +schematic.addtag = 添加新标签 schematic.texttag = 文字标签 schematic.icontag = 图标标签 schematic.renametag = 重命名标签 schematic.tagdelconfirm = 确定要完全删除这个标签吗? -schematic.tagexists = 这个标签已经存在了。 +schematic.tagexists = 此标签已经存在。 stats = 统计资料 stat.wave = 防守波数:[accent]{0} +stat.unitsCreated = 生产单位:[accent]{0} stat.enemiesDestroyed = 消灭敌人:[accent]{0} stat.built = 建造建筑:[accent]{0} stat.destroyed = 摧毁建筑:[accent]{0} stat.deconstructed = 拆除建筑:[accent]{0} -stat.delivered = 装运资源: stat.playtime = 游玩时间:[accent] {0} -stat.rank = 最终评级:[accent]{0} globalitems = [accent]全局物品 -map.delete = 确定要删除“[accent]{0}[]”地图吗? +map.delete = 确定要删除地图“[accent]{0}[]”吗? level.highscore = 最高分:[accent]{0} level.select = 选择关卡 level.mode = 游戏模式: -coreattack = < 核心正在受到攻击!> +coreattack = < 核心正在受到攻击! > nearpoint = [[ [scarlet]立即离开敌人出生点[] ]\n摧毁在即 database = 核心数据库 +database.button = 数据库 savegame = 保存游戏 loadgame = 载入游戏 joingame = 加入游戏 customgame = 自定义游戏 newgame = 新游戏 none = <无> -none.found = [lightgray]<未找到> -none.inmap = [lightgray]<无法在地图中找到> +none.found = [lightgray]<未发现> +none.inmap = [lightgray]<此地图中未发现> minimap = 小地图 position = 位置 close = 关闭 @@ -119,212 +119,214 @@ preparingcontent = 正在准备内容 uploadingcontent = 正在上传内容 uploadingpreviewfile = 正在上传预览文件 committingchanges = 正在提交更改 -done = 已完成 -feature.unsupported = 您的设备不支持此功能。 +done = 完成 +feature.unsupported = 您的设备不支持此特性。 -mods.initfailed = [red]⚠[] 前一次的mindustry启动失败,这可能是由存在异常的模组导致的。\n\n为了防止循环崩溃,[red]所有模组都被禁用了。[]\n\n如果想关闭这个功能,可以在[accent]设置->游戏->游戏启动崩溃时不禁用模组[]里关闭. +mods.initfailed = [red]⚠[]Mindustry的上一次启动失败了,可能是异常的模组导致的。 \n\n为了防止连续崩溃,[red]所有模组都被禁用了。 []\n\n这个功能可以在[accent]设置->游戏->游戏启动崩溃后禁用模组[]里关闭。 mods = 模组 mods.none = [lightgray]没有找到模组! mods.guide = 模组制作教程 mods.report = 报告 Bug mods.openfolder = 打开模组文件夹 mods.viewcontent = 查看内容 -mods.reload = 重载 -mods.reloadexit = 游戏将退出以重载模组。 -mod.installed = [[已装载] -mod.display = [gray]模组:[orange] {0} +mods.reload = 重新加载 +mods.reloadexit = 游戏将退出以重新加载模组。 +mod.installed = [[已安装] +mod.display = [gray]模组:[orange]{0} mod.enabled = [lightgray]已启用 mod.disabled = [scarlet]已禁用 mod.multiplayer.compatible = [gray]多人游戏兼容性 mod.disable = 禁用 mod.content = 内容: -mod.delete.error = 无法删除模组。文件可能正在使用中。 +mod.delete.error = 无法删除模组。 文件可能正被占用。 mod.requiresversion = [scarlet]所需的最低游戏版本:[accent]{0} -mod.outdated = [scarlet]该模组可能不能在6.0上正确地运行(缺失 minGameVersion: 105) +mod.outdated = [scarlet]该模组可能无法在6.0版本上正确地运行(缺失 minGameVersion: 105) mod.missingdependencies = [scarlet]缺少前置模组:{0} mod.erroredcontent = [scarlet]内容错误 -mod.errors = 读取内容时发生错误. -mod.noerrorplay = [scarlet]您的模组发生了错误.[] 禁用相关模组或修复错误后才能进入游戏. -mod.nowdisabled = [scarlet]“{0}”模组缺少依赖条件:[accent] {1}\n[lightgray]需要先下载上述模组。\n此模组现在将自动禁用。 +mod.errors = 读取内容时发生错误。 +mod.noerrorplay = [scarlet]您的模组发生了错误。 []禁用相关模组或修复错误后才能进入游戏。 +mod.nowdisabled = [scarlet]“{0}”模组缺少依赖的其他模组:[accent]{1}\n[lightgray]需要先下载上述模组。 \n此模组现在将自动禁用。 mod.enable = 启用 -mod.requiresrestart = 需要重启使模组生效。 +mod.requiresrestart = 游戏将退出以应用模组修改。 mod.reloadrequired = [scarlet]需要重启 mod.import = 导入模组 mod.import.file = 导入文件 mod.import.github = 从 GitHub 导入模组 -mod.jarwarn = [scarlet]JAR模组注定存在危险性。[]\n请确保此模组来源安全可靠! -mod.item.remove = 这个物品是[accent] '{0}'[]模组的一部分. 删除物品需要先卸载此模组. -mod.remove.confirm = 此模组将被删除。 -mod.author = [lightgray]作者:[] {0} -mod.missing = 此存档包含您最近已更新或者现在未安装的模组。存档可能会损坏。确定要加载它吗?\n[lightgray]模组:\n{0} -mod.preview.missing = 在创意工坊中发布此模组前,您必须添加一则预览图像。\n请将名为[accent] preview.png[] 的图像放入模组文件夹,然后重试。 -mod.folder.missing = 只有文件夹形式的模组能在创意工坊上发布。\n若要将任何模组转换为文件夹,只需将其文件解压缩到文件夹中并删除旧压缩包,然后重新启动游戏或重新加载模组。 -mod.scripts.disable = 您的设备不支持含有脚本的模组。必须禁用相关模组以进入游戏。 +mod.jarwarn = [scarlet]JAR模组存在天然的危险性。 []\n请确保此模组来源安全可靠! +mod.item.remove = 这个物品是[accent]'{0}'[]模组的一部分。 卸载该模组即可删除此物品。 +mod.remove.confirm = 此模组将被删除。 +mod.author = [lightgray]作者:[]{0} +mod.missing = 此存档包含您最近更新或者尚未安装的模组,加载可能会导致存档损坏。 确定要加载吗?\n[lightgray]模组:\n{0} +mod.preview.missing = 在创意工坊中发布此模组前,您必须添加一张预览图片。 \n请将名为[accent]preview.png[]的图片放入模组文件夹,然后重试。 +mod.folder.missing = 只有文件夹形式的模组能在创意工坊上发布。 \n要将模组转换为文件夹,只需将其文件解压缩到文件夹中并删除压缩包,然后重新启动游戏或重新加载模组。 +mod.scripts.disable = 您的设备不支持含有脚本的模组,必须禁用相关模组才能进入游戏。 about.button = 关于 name = 名字: -noname = 先取一个[accent]玩家名[]。 +noname = 先取一个[accent]玩家名称[]。 planetmap = 行星地图 launchcore = 发射核心 filename = 文件名: unlocked = 解锁了新内容! available = 可研究新科技! +unlock.incampaign = < 在战役中解锁以显示详情 > completed = [accent]己研究 techtree = 科技树 -research.legacy = 发现了 [accent]5.0[] 的研究数据。\n您想要[accent]加载数据[],还是[accent]丢弃数据[]并在新战役中重新研究(建议)? +research.legacy = 发现了[accent]5.0[]版本的研究数据。 \n您想要[accent]加载这些数据[],还是(推荐)[accent]丢弃它们[]并在新战役中重新研究? research.load = 加载 research.discard = 丢弃 research.list = [lightgray]研究: research = 研究 -researched = [lightgray]{0}己研究。 -research.progress = {0}% 完成度 -players = {0} 位玩家在线 -players.single = {0} 位玩家在线 +researched = [lightgray]{0}己研究。 +research.progress = {0}%完成度 +players = {0}名玩家在线 +players.single = {0}名玩家在线 players.search = 搜索 -players.notfound = [gray]没有找到玩家。 -server.closing = [accent]服务器关闭… -server.kicked.kick = 您被踢出了服务器。 -server.kicked.whitelist = 您不在服务器白名单中。 -server.kicked.serverClose = 服务器已关闭。 -server.kicked.vote = 您被投票踢出了服务器。 -server.kicked.clientOutdated = 客户端过旧,请更新您的游戏。 -server.kicked.serverOutdated = 服务器过旧,请联系服务器管理员升级服务器。 -server.kicked.banned = 您在这个服务器上被封禁了。 -server.kicked.typeMismatch = 此服务器与您的不稳定测试版不兼容。 -server.kicked.playerLimit = 服务器已满,请等待一个空位。 -server.kicked.recentKick = 您刚刚被踢出服务器。\n请稍后重新连接! -server.kicked.nameInUse = 您的名字与服务器中的一个人重复了。 -server.kicked.nameEmpty = 无效的名字! -server.kicked.idInUse = 您已经连接了这个服务器!不允许在一台设备上用两个客户端连接。 -server.kicked.customClient = 这个服务器不支持自定义客户端。请下载官方版本。 +players.notfound = [gray]没有找到玩家。 +server.closing = [accent]关闭服务器… +server.kicked.kick = 您被踢出了服务器。 +server.kicked.whitelist = 您不在服务器的白名单中。 +server.kicked.serverClose = 服务器已关闭。 +server.kicked.vote = 您被投票踢出了服务器。 +server.kicked.clientOutdated = 客户端版本过低,请更新您的游戏。 +server.kicked.serverOutdated = 服务器版本过低,请联系服务器管理员升级服务器。 +server.kicked.banned = 您在这个服务器上被封禁了。 +server.kicked.typeMismatch = 此服务器与您的不稳定测试版不兼容。 +server.kicked.playerLimit = 服务器已满,请等待一个空位。 +server.kicked.recentKick = 您最近被踢出过服务器。 \n请稍后重新连接! +server.kicked.nameInUse = 服务器中有人与您重名了。 +server.kicked.nameEmpty = 玩家名称无效。 +server.kicked.idInUse = 您已经连接了这个服务器!不允许重复连接。 +server.kicked.customClient = 这个服务器不支持自行编译的客户端。 请下载官方版本。 server.kicked.gameover = 游戏结束! -server.kicked.serverRestarting = 服务器正在重启. -server.versions = 客户端版本:[accent] {0}[]\n服务器版本:[accent] {1}[] -host.info = [accent]创建局域网游戏[]按钮会在[scarlet] 6567 []端口运行一个服务器。[]\n任何在同一个[lightgray] Wi-Fi 或本地网络[]下的人应该都可以在服务器列表中看到你的服务器。\n\n如果你想让别人在任何地方都能通过 IP 地址连接,你需要设定[accent]端口转发[]。\n\n[lightgray]注意:如果某人无法连接到你的局域网游戏,请确保你在防火墙设置里允许了 Mindustry 访问本地网络。 -join.info = 您可以输入[accent]服务器的 IP 地址[]来连接,或寻找[accent]本地网络[]中的服务器来连接。\n支持局域网或广域网的多人游戏。\n\n[lightgray]注意:没有全球服务器列表;如果你想通过 IP 地址连接某个服务器,你需要向服主询问 IP 地址。 -hostserver = 创建服务器 -invitefriends = 邀请朋友 -hostserver.mobile = 创建\n服务器 +server.kicked.serverRestarting = 服务器正在重启。 +server.versions = 客户端版本:[accent]{0}[]\n服务器版本:[accent]{1}[] +host.info = [accent]创建[]按钮会在[scarlet]6567 []端口启动一个服务器。 []\n同一个[lightgray]Wi-Fi或局域网[]下的玩家,在服务器列表中都应该能看到您的服务器。 \n\n如果您想让别人从任何地方通过IP地址连接,需要设定[accent]端口转发[]。 \n\n[lightgray]注意:如果某人无法连接到您的局域网游戏,请确保在防火墙里设置了允许Mindustry访问本地网络。 注意公有网络有时可能不允许服务器发现。 +join.info = 您可以输入[accent]服务器的IP地址[],也可以寻找[accent]局域网[]或[accent]全局[]中的服务器来连接。 \n支持局域网或广域网的多人游戏。 \n\n[lightgray]如果您想通过IP地址连接某个服务器,需要向服务器建立者询问他的IP地址。 可以在服务器所在的设备上百度“IP地址”来获取。 +hostserver = 创建多人游戏 +invitefriends = 邀请好友 +hostserver.mobile = 创建多人游戏 host = 创建 -hosting = [accent]正在开启服务器… +hosting = [accent]正在启动服务器… hosts.refresh = 刷新 hosts.discovering = 正在搜索局域网服务器 hosts.discovering.any = 正在搜索服务器 server.refreshing = 正在刷新服务器 -hosts.none = [lightgray]未发现局域网游戏! -host.invalid = [scarlet]无法连接服务器。 +hosts.none = [lightgray]未发现局域网服务器! +host.invalid = [scarlet]无法连接服务器。 servers.local = 本地服务器 +servers.local.steam = 公开游戏与本地服务器 servers.remote = 远程服务器 -servers.global = 全球服务器 +servers.global = 社区服务器 -servers.disclaimer=社区服务器[accent]不是[]由开发者拥有或管理。\n\n服务器中可能有其他玩家制作的不适当的内容。 +servers.disclaimer = 社区服务器[accent]并非[]由开发者拥有或管理。 \n\n其中可能有其他玩家制作的,不适合所有年龄段的内容。 servers.showhidden = 显示隐藏的服务器 server.shown = 显示 server.hidden = 隐藏 trace = 跟踪玩家 trace.playername = 玩家名称:[accent]{0} -trace.ip = IP 地址:[accent]{0} -trace.id = 唯一的 ID:[accent]{0} +trace.ip = IP地址:[accent]{0} +trace.id = 玩家 ID:[accent]{0} trace.mobile = 移动客户端:[accent]{0} trace.modclient = 自定义客户端:[accent]{0} trace.times.joined = 进入服务器次数: [accent]{0} trace.times.kicked = 踢出服务器次数: [accent]{0} -invalidid = 无效的客户端 ID!提交一个错误报告。 +invalidid = 无效的客户端ID!提交一个错误报告。 server.bans = 黑名单 server.bans.none = 没有被封禁的玩家! server.admins = 管理员 -server.admins.none = 该服务器没有管理员! +server.admins.none = 没有管理员! server.add = 添加服务器 server.delete = 您确定要删除这个服务器吗? server.edit = 编辑服务器 -server.outdated = [crimson]服务器过旧![] -server.outdated.client = [crimson]客户端过旧![] -server.version = [lightgray]版本:{0} {1} -server.custombuild = [accent]自定义 -confirmban = 确认封禁这名玩家? -confirmkick = 确定踢出这名玩家? -confirmvotekick = 确定投票踢出这名玩家? -confirmunban = 确定取消封禁这名玩家? -confirmadmin = 确定给予这名玩家管理员权限? -confirmunadmin = 确定取消这名玩家的管理员权限? +server.outdated = [scarlet]服务器版本过低![] +server.outdated.client = [scarlet]客户端版本过低![] +server.version = [gray]版本:{0} {1} +server.custombuild = [accent]自行编译 +confirmban = 确定封禁玩家“{0}[white]”? +confirmkick = 确定踢出玩家“{0}[white]”? +confirmvotekick = 确定投票踢出玩家“{0}[white]”? +confirmunban = 确定解封这名玩家? +confirmadmin = 确定给予玩家“{0}[white]”管理员权限? +confirmunadmin = 确定收回玩家“{0}[white]”的管理员权限? joingame.title = 加入游戏 joingame.ip = 地址: -disconnect = 已断开 -disconnect.error = 连接错误。 -disconnect.closed = 连接关闭。 -disconnect.timeout = 连接超时。 -disconnect.data = 读取服务器数据失败! -cantconnect = 无法加入([accent]{0}[])。 +disconnect = 已断开连接 +disconnect.error = 连接错误。 +disconnect.closed = 连接关闭。 +disconnect.timeout = 连接超时。 +disconnect.data = 地图加载失败! +cantconnect = 无法加入游戏([accent]{0}[])。 connecting = [accent]连接中… reconnecting = [accent]重新连接中… -connecting.data = [accent]加载中… +connecting.data = [accent]地图加载中… server.port = 端口: -server.addressinuse = 地址已在使用! +server.addressinuse = 地址已被占用! server.invalidport = 无效的端口! -server.error = [crimson]创建服务器错误:[accent]{0} +server.error = [scarlet]创建服务器错误。 save.new = 新存档 -save.overwrite = 您确定要覆盖这个存档吗? +save.overwrite = 确定要覆盖这个存档吗? overwrite = 覆盖 save.none = 没有找到存档! savefail = 保存失败! -save.delete.confirm = 您确定要删除这个存档吗? +save.delete.confirm = 确定要删除这个存档吗? save.delete = 删除 save.export = 导出存档 -save.import.invalid = [accent]此存档无效! -save.import.fail = [crimson]导入存档失败:[accent]{0} -save.export.fail = [crimson]导出存档失败:[accent]{0} +save.import.invalid = [accent]存档无效! +save.import.fail = [scarlet]导入存档失败:[accent]{0} +save.export.fail = [scarlet]导出存档失败:[accent]{0} save.import = 导入存档 -save.newslot = 保存的名称: +save.newslot = 存档名称: save.rename = 重命名 save.rename.text = 新名称: -selectslot = 选择一个存档。 -slot = [accent]存档位 {0} +selectslot = 选择一个存档。 +slot = [accent]存档位{0} editmessage = 编辑消息 -save.corrupted = [accent]存档损坏或无效!\n如果您刚刚升级了游戏,那么这可能是因为存档格式改变了,而[scarlet]不是[] bug 。 +save.corrupted = 存档损坏或无效! empty = < 空 > on = 开 off = 关 save.autosave = 自动保存:{0} save.map = 地图:{0} save.wave = 波次:{0} -save.mode = 模式:{0} +save.mode = 游戏模式:{0} save.date = 最后保存:{0} save.playtime = 游戏时间:{0} warning = 警告! -confirm = 确认 +confirm = 确定 delete = 删除 view.workshop = 浏览创意工坊 workshop.listing = 编辑创意工坊目录 ok = 确定 open = 打开 -customize = 自定义 +customize = 自定义规则 cancel = 取消 openlink = 打开链接 copylink = 复制链接 back = 返回 max = 最大值 crash.export = 导出崩溃日志 -crash.none = 找不到崩溃日志。 -crash.exported = 崩溃日志已导出。 +crash.none = 未找到崩溃日志。 +crash.exported = 崩溃日志已导出。 data.export = 导出数据 data.import = 导入数据 data.openfolder = 打开数据文件夹 -data.exported = 数据已导出。 -data.invalid = 非有效游戏数据。 -data.import.confirm = 导入外部游戏数据将覆盖本地[scarlet]全部[]的游戏数据。\n[accent]此操作无法撤销![]\n\n数据导入后将自动退出游戏。 +data.exported = 数据已导出。 +data.invalid = 游戏数据无效。 +data.import.confirm = 导入外部游戏数据将覆盖本地[scarlet]全部[]的游戏数据。 \n[accent]此操作无法撤销![]\n\n数据导入后将自动退出游戏。 quit.confirm = 确定退出? loading = [accent]加载中… -reloading = [accent]重载模组中… +downloading = [accent]下载中… saving = [accent]保存中… -respawn = [accent][[{0}][]来重生 -cancelbuilding = [accent][[{0}][]来清除规划 -selectschematic = [accent][[{0}][]来选择复制 -pausebuilding = [accent][[{0}][]来暂停建造 -resumebuilding = [scarlet][[{0}][]来恢复建造 -enablebuilding = [scarlet][[{0}][]来启用建造 -showui = UI已隐藏\n按[accent][[{0}][]显示UI +respawn = 按[accent][[{0}][]键重生 +cancelbuilding = 按[accent][[{0}][]键清除规划 +selectschematic = 按住[accent][[{0}][]键选择复制 +pausebuilding = 按[accent][[{0}][]键暂停建造 +resumebuilding = 按[scarlet][[{0}][]键恢复建造 +enablebuilding = 按[scarlet][[{0}][]键启用建造 +showui = UI已隐藏\n按[accent][[{0}][]键显示UI wave = [accent]第{0}波 wave.cap = [accent]波次 {0}/{1} wave.waiting = [lightgray]下一波倒计时:{0}秒 @@ -335,67 +337,76 @@ wave.enemies = [lightgray]剩余 {0} 个敌人 wave.enemycores = [accent]{0}[lightgray] 敌人核心 wave.enemycore = [accent]{0}[lightgray] 敌人核心 wave.enemy = [lightgray]剩余 {0} 个敌人 -wave.guardianwarn = Boss 将在[accent]{0}[]波后到来。 -wave.guardianwarn.one = Boss 将在[accent]{0}[]波后到来。 +wave.guardianwarn = Boss 将在[accent]{0}[]波后到来。 +wave.guardianwarn.one = Boss 将在[accent]{0}[]波后到来。 loadimage = 加载图片 saveimage = 保存图片 unknown = 未知 custom = 自定义 -builtin = 内置的 -map.delete.confirm = 您确定想要删除这张地图吗?这个操作无法撤销! +builtin = 内置 +map.delete.confirm = 您确定要删除这张地图吗?这个操作无法撤销! map.random = [accent]随机地图 -map.nospawn = 这个地图没有核心!请在编辑器中添加一个[royal]己方[]的核心。 -map.nospawn.pvp = 这个地图没有敌人的核心!请在编辑器中添加一个[royal]敌人[]的核心。 -map.nospawn.attack = 这个地图没有敌人的核心!请在编辑中向地图添加一个[scarlet]敌人[]的核心。 -map.invalid = 地图载入错误:地图文件可能已经损坏。 +map.nospawn = 这个地图缺少己方核心!请在地图编辑器中添加一个[#{0}]{1}[]队的核心。 +map.nospawn.pvp = 这个地图缺少对方核心!请在地图编辑器中添加一个[scarlet]除黄队以外[]的核心。 +map.nospawn.attack = 这个地图缺少敌方核心!请在地图编辑器中添加一个[#{0}]{1}[]队的核心。 +map.invalid = 地图载入错误:地图文件可能已经损坏。 workshop.update = 更新地图 workshop.error = 获取创意工坊详细信息时出错:{0} -map.publish.confirm = 确定上传此地图?\n\n[lightgray]确定您同意 Steam 创意工坊的最终用户许可协议,否则您的地图将不会被展示! -workshop.menu = 选择此项目的目的。 +map.publish.confirm = 确定上传此地图?\n\n[lightgray]确定您同意Steam创意工坊的最终用户许可协议,否则您的地图将无法展示! +workshop.menu = 选择要对此项目进行的操作。 workshop.info = 项目信息 changelog = 更新日志(可选): -eula = Steam 最终用户许可协议 -missing = 此项目已被删除或转移。\n[lightgray]链接已在创意工坊中被删除。 -publishing = [accent]正在发布... -publish.confirm = 确定发布?\n\n[lightgray]请确认您已经同意创意工坊的最终用户许可协议,否则您的项目不会展示! -publish.error = 发布项目出错:{0} -steam.error = 初始化 Steam 服务失败。\n错误:{0} +eula = Steam最终用户许可协议 +missing = 此项目已被删除或转移。 \n[lightgray]链接已在创意工坊中被删除。 +publishing = [accent]正在发布… +publish.confirm = 确定发布?\n\n[lightgray]请确认您同意创意工坊的最终用户许可协议,否则您的项目无法展示! +publish.error = 发布项目时出错:{0} +steam.error = 初始化Steam服务失败。 \n错误:{0} -editor.brush = 笔刷 -editor.openin = 在编辑器中打开 -editor.oregen = 矿物的生成 -editor.oregen.info = 矿物的生成: +editor.cliffs = 所有墙壁\n替换为悬崖 +editor.brush = 笔触大小 +editor.openin = 用地图编辑器打开 +editor.oregen = 矿脉的生成 +editor.oregen.info = 矿脉的生成: editor.mapinfo = 地图信息 editor.author = 作者: editor.description = 描述: -editor.nodescription = 地图发布前,描述不得少于4个字符。 -editor.waves = 波数: +editor.nodescription = 地图需要至少4个字符的描述才能发布。 +editor.waves = 波次: editor.rules = 规则: -editor.generation = 筛选器: +editor.generation = 地形生成器: editor.ingame = 游戏内编辑 editor.publish.workshop = 上传到创意工坊 editor.newmap = 新地图 editor.center = 居中 workshop = 创意工坊 -waves.title = 波数 +waves.title = 波次 waves.remove = 移除 waves.every = 每 waves.waves = 波 -waves.perspawn = 每次生成 +waves.perspawn = 每波 waves.shields = 护盾/波 waves.to = 至 +waves.max = 最大单位数 waves.guardian = Boss waves.preview = 预览 waves.edit = 编辑… waves.copy = 复制到剪贴板 waves.load = 从剪贴板读取 -waves.invalid = 剪贴板中的波次信息无效。 -waves.copied = 波次信息已复制。 -waves.none = 没有定义敌人。\n请注意,这将自动替换为默认的敌人列表。 +waves.invalid = 剪贴板中的波次信息无效。 +waves.copied = 波次信息已复制。 +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.totals = 总和 +wavemode.totals = 总数 wavemode.health = 生命值 editor.default = [lightgray]<默认> @@ -405,100 +416,100 @@ editor.name = 名称: editor.spawn = 生成单位 editor.removeunit = 移除单位 editor.teams = 队伍 -editor.errorload = 读取文件出错:\n[accent]{0} -editor.errorsave = 保存文件出错:\n[accent]{0} -editor.errorimage = 这是一幅图片,不是地图。请不要更改文件的扩展名来导入。\n\n如果您想导入地图,请在编辑器中使用“导入地图”按钮。 -editor.errorlegacy = 此地图太旧了,旧的地图格式已不再支持。 -editor.errornot = 这不是地图文件。 -editor.errorheader = 此地图文件无效或已损坏。 -editor.errorname = 地图没有定义名称。是否要加载一个存档文件? +editor.errorload = 读取文件出错。 +editor.errorsave = 保存文件出错。 +editor.errorimage = 这是一幅图片,而不是地图。 +editor.errorlegacy = 此地图太旧了,旧的地图格式已不再支持。 +editor.errornot = 这不是地图文件。 +editor.errorheader = 此地图文件无效或已损坏。 +editor.errorname = 地图没有定义名称。 加载的可能是存档文件? editor.update = 更新 -editor.randomize = 随机化 +editor.randomize = 重新生成 editor.apply = 应用 -editor.generate = 生成 -editor.resize = 调整大小 +editor.generate = 自动生成 +editor.resize = 改变尺寸 editor.loadmap = 载入地图 editor.savemap = 保存地图 editor.saved = 已保存! -editor.save.noname = 您的地图没有名字!在“地图信息”菜单里设置一个。 -editor.save.overwrite = 您的地图覆盖了一个内置的地图!在“地图信息”菜单里重新设置一个不同的名称。 +editor.save.noname = 您还没有指定地图的名称!在“地图信息”菜单里设置一个名称。 +editor.save.overwrite = 您正试图覆盖一张内置地图!在“地图信息”菜单里重新设置一个其他的名称。 editor.import.exists = [scarlet]无法导入:[]存在名为“{0}”的内置地图! editor.import = 导入… -editor.importmap = 导入地图 -editor.importmap.description = 导入一个已经存在的地图 +editor.importmap = 加载地图 +editor.importmap.description = 加载一张已经存在的地图 editor.importfile = 导入文件 -editor.importfile.description = 导入一个外置的地图文件 -editor.importimage = 导入地形图像 -editor.importimage.description = 导入一个外置的地图图像文件 +editor.importfile.description = 从游戏外导入一个地图文件 +editor.importimage = 导入图片 +editor.importimage.description = 从游戏外导入一个地图图片文件 editor.export = 导出… editor.exportfile = 导出文件 editor.exportfile.description = 导出一个地图文件 -editor.exportimage = 导出一个地形文件 -editor.exportimage.description = 导出一个地图图像文件 +editor.exportimage = 导出地形图片 +editor.exportimage.description = 将地形导出为一个图片文件 editor.loadimage = 导入地形 editor.saveimage = 导出地形 -editor.unsaved = [scarlet]更改未保存![]\n确定退出? -editor.resizemap = 调整地图大小 +editor.unsaved = 确定退出?\n[scarlet]未保存的更改将会丢失! +editor.resizemap = 改变地图尺寸 editor.mapname = 地图名称: -editor.overwrite = [accent]警告!\n这将会覆盖一个已经存在的地图。 -editor.overwrite.confirm = [scarlet]警告![]存在同名地图。你确定你想要覆盖? -editor.exists = 已经存在同名地图。 -editor.selectmap = 选择一个地图加载: +editor.overwrite = [accent]警告!\n这将会覆盖一个已经存在的地图。 +editor.overwrite.confirm = [scarlet]警告![]存在同名地图。 要覆盖吗?\n"[accent]{0}[]" +editor.exists = 存在同名地图。 +editor.selectmap = 加载一张地图: -toolmode.replace = 替换 -toolmode.replace.description = 仅在实心块上绘制。 +toolmode.replace = 墙壁替换 +toolmode.replace.description = 仅在墙壁上绘制墙壁。 toolmode.replaceall = 全部替换 -toolmode.replaceall.description = 替换地图中的所有方块。 -toolmode.orthogonal = 正交线 -toolmode.orthogonal.description = 只绘制正交线。 +toolmode.replaceall.description = 替换地图中所有同类地形。 +toolmode.orthogonal = 水平/垂直线 +toolmode.orthogonal.description = 只绘制水平/垂直线。 toolmode.square = 方形 -toolmode.square.description = 方形刷子 -toolmode.eraseores = 清除矿物 -toolmode.eraseores.description = 只清除矿物。 +toolmode.square.description = 将笔触改为正方形。 +toolmode.eraseores = 擦除矿脉 +toolmode.eraseores.description = 仅擦除矿脉,不影响其他物体。 toolmode.fillteams = 填充队伍 -toolmode.fillteams.description = 填充队伍而不是方块。 +toolmode.fillteams.description = 不再填充方块,而是填充队伍颜色。 toolmode.drawteams = 绘制队伍 -toolmode.drawteams.description = 绘制队伍而不是方块。 +toolmode.drawteams.description = 不再绘制方块,而是绘制队伍颜色。 -filters.empty = [lightgray]没有过滤条件!用下方的按钮添加。 +filters.empty = [lightgray]未创建生成器!用下方的按钮来创建。 -filter.distort = 扭曲程度 -filter.noise = 波动程度 +filter.distort = 扭曲 +filter.noise = 地表随机化 filter.enemyspawn = 敌人生成点选择 -filter.spawnpath = 敌人生成途径 +filter.spawnpath = 敌人生成路径 filter.corespawn = 核心降落点选择 -filter.median = 平均数 -filter.oremedian = 矿物平均数 -filter.blend = 混合程度 -filter.defaultores = 默认矿物 -filter.ore = 矿物 -filter.rivernoise = 河流波动程度 +filter.median = 地形圆润化 +filter.oremedian = 矿脉圆润化 +filter.blend = 镶边 +filter.defaultores = 默认的矿脉生成规则 +filter.ore = 矿脉生成 +filter.rivernoise = 河流随机化 filter.mirror = 镜像 -filter.clear = 清理 +filter.clear = 替换 filter.option.ignore = 忽略 -filter.scatter = 分散程度 -filter.terrain = 地形 +filter.scatter = 散布 +filter.terrain = 地图边界 -filter.option.scale = 规模大小 -filter.option.chance = 几率大小 -filter.option.mag = 巨大程度 -filter.option.threshold = 最大阈值 -filter.option.circle-scale = 圆规模 -filter.option.octaves = 递增 -filter.option.falloff = 递减 -filter.option.angle = 角度大小 -filter.option.rotate = 旋转 +filter.option.scale = 缩放 +filter.option.chance = 散布数量 +filter.option.mag = 渗透 +filter.option.threshold = 比例 +filter.option.circle-scale = 半径 +filter.option.octaves = 蔓延 +filter.option.falloff = 分散 +filter.option.angle = 角度 +filter.option.rotate = 中心对称 filter.option.amount = 数量 -filter.option.block = 方块 -filter.option.floor = 地面 -filter.option.flooronto = 地面目标 -filter.option.target = 目标 -filter.option.replacement = 替换 +filter.option.block = 地表方块 +filter.option.floor = 地表 +filter.option.flooronto = 替换目标 +filter.option.target = 替换目标 +filter.option.replacement = 替换为 filter.option.wall = 墙 -filter.option.ore = 矿物 -filter.option.floor2 = 二重地面 -filter.option.threshold2 = 二重阈值 -filter.option.radius = 半径大小 +filter.option.ore = 矿脉 +filter.option.floor2 = 内层地形 +filter.option.threshold2 = 内层比例 +filter.option.radius = 半径 filter.option.percentile = 百分比 width = 宽度: @@ -506,55 +517,56 @@ height = 高度: menu = 菜单 play = 开始游戏 campaign = 战役模式 -load = 载入游戏 +load = 读取 save = 保存 -fps = FPS:{0} +fps = 帧数:{0} ping = 延迟:{0}毫秒 tps = TPS: {0} -memory = 内存: {0}mb -memory2 = 内存:\n {0}mb +\n {1}mb -language.restart = 为了使语言设置生效请重启游戏。 +memory = 内存:{0}MB +memory2 = 内存:\n {0}MB +\n {1}MB +language.restart = 重启游戏后语言设置才能生效。 settings = 设置 tutorial = 教程 tutorial.retake = 重玩教程 -editor = 编辑器 +editor = 地图编辑器 mapeditor = 地图编辑器 abandon = 放弃 -abandon.text = 这个区域及其资源会被敌人重置。 -locked = 已锁定 -complete = [lightgray]完成: -requirement.wave = {1}中的第{0}波次 -requirement.core = 在{0}中摧毁敌方核心 -requirement.research = 研究 {0} -requirement.produce = 生产 {0} -requirement.capture = 占领 {0} +abandon.text = 这个区块及其资源会落入敌人之手。 +locked = 锁定 +complete = [lightgray]解锁条件: +requirement.wave = 在{1}坚持到第{0}波 +requirement.core = 摧毁{0}的敌方核心 +requirement.research = 研究{0} +requirement.produce = 生产{0} +requirement.capture = 占领{0} launch.text = 发射 -research.multiplayer = 仅有服主可研究物品。 -map.multiplayer = 仅有服主可查看区域。 -uncover = 解锁 -configure = 设定装运的数量 +research.multiplayer = 只有服务器创建者能研究科技。 +map.multiplayer = 只有服务器创建者能查看区块。 +uncover = 已解锁 +configure = 设定装运的物资 loadout = 装运 resources = 资源 bannedblocks = 禁用建筑 -addall = 添加所有 -launch.from = 发射地: [accent]{0} -launch.destination = 目的地: {0} -configure.invalid = 数量必须是0到{0}之间的数字。 +bannedunits = 禁用单位 +addall = 全部装运 +launch.from = 发射自:[accent]{0} +launch.destination = 目的地:{0} +configure.invalid = 数量必须在0到{0}之间。 add = 添加… -guardian = 守卫者 +guardian = Boss -connectfail = [crimson]服务器连接失败:[accent]{0} -error.unreachable = 无法访问服务器。\n确定输对地址了吗? -error.invalidaddress = 地址无效。 +connectfail = [scarlet]服务器连接失败:\n\n[accent]{0} +error.unreachable = 无法访问服务器。 \n请检查输入的地址。 +error.invalidaddress = 地址无效。 error.timedout = 连接超时!\n请确认服务器设置了端口转发且地址无误! -error.mismatch = 数据包错误。\n可能是客户端/服务器的版本不匹配。\n请确保客户端和服务器都是最新的版本! -error.alreadyconnected = 已连接。 +error.mismatch = 数据包错误。 \n可能是客户端/服务器的版本不匹配。 \n请确保客户端和服务器都是最新的版本! +error.alreadyconnected = 已经建立连接。 error.mapnotfound = 找不到地图文件! -error.io = 网络 I/O 错误。 -error.any = 未知网络错误。 -error.bloom = 未能初始化特效。\n您的设备可能不支持。 +error.io = 网络I/O错误。 +error.any = 未知网络错误。 +error.bloom = 未能初始化特效。 \n您的设备可能不支持。 weather.rain.name = 降雨 weather.snow.name = 降雪 @@ -562,31 +574,33 @@ weather.sandstorm.name = 沙尘暴 weather.sporestorm.name = 孢子风暴 weather.fog.name = 雾 +sectorlist = 区块列表 +sectorlist.attacked = {0}遭到攻击 sectors.unexplored = [lightgray]未探索 -sectors.resources = 资源: -sectors.production = 产出: -sectors.export = 输出: -sectors.import = 输入: -sectors.time = 时间: -sectors.threat = 威胁: -sectors.wave = 进攻波: -sectors.stored = 贮存: +sectors.resources = 资源: +sectors.production = 产出: +sectors.export = 输出: +sectors.import = 输入: +sectors.time = 时间: +sectors.threat = 威胁: +sectors.wave = 波次: +sectors.stored = 贮存: sectors.resume = 继续 sectors.launch = 发射 sectors.select = 选择 -sectors.nonelaunch = [lightgray]无 (太阳) +sectors.nonelaunch = [lightgray]无(太阳) sectors.rename = 重命名区块 -sectors.enemybase = [scarlet]敌人基地 +sectors.enemybase = [scarlet]敌方基地 sectors.vulnerable = [scarlet]易受攻击 -sectors.underattack = [scarlet]遭到攻击![accent]{0}% 损毁度 -sectors.survives = [accent]存活{0}波 +sectors.underattack = [scarlet]遭到攻击![accent]{0}%损毁度 +sectors.survives = [accent]已坚持{0}波 sectors.go = 进入 sector.curcapture = 区块已占领 sector.curlost = 区块已丢失 -sector.missingresources = [scarlet]核心资源不足 +sector.missingresources = [scarlet]建造核心所需资源不足 sector.attacked = 区块[accent]{0}[white]受到攻击! sector.lost = 区块[accent]{0}[white]已丢失! -#note: the missing space in the line below is intentional +#note: the missing space in the line below is intentional(中文无关) sector.captured = 区块[accent]{0}[white]已占领! sector.changeicon = 更改图标 @@ -617,122 +631,126 @@ sector.biomassFacility.name = 生物质合成区 sector.windsweptIslands.name = 风吹群岛 sector.extractionOutpost.name = 萃取前哨 sector.planetaryTerminal.name = 行星发射终端 +sector.coastline.name = 边际海湾 +sector.navalFortress.name = 海军要塞 -sector.groundZero.description = 踏上旅程的最佳位置。这儿的敌人威胁很小,但资源也少。\n收集尽可能多的铅和铜。\n出发吧! -sector.frozenForest.description = 即使是靠近山脉的这里,孢子也已经扩散。他们不能长期停留在寒冷的温度中。\n\n开始运用电力。建造火力发电机并学会使用修理者。 -sector.saltFlats.description = 在沙漠的郊区有盐滩。在这个地方几乎找不到资源。\n\n敌人在这里建立了一个资源存储区。摧毁他们的核心。不要留下任何东西。 -sector.craters.description = 水在这个火山口积聚,这是旧战争的遗迹。夺下该区域。收集沙子来冶炼玻璃。用水泵抽水来加速炮塔和钻头。 -sector.ruinousShores.description = 穿过荒地,就是海岸线。这个地方曾经建造了一个海岸防御线。但现在所剩无几,只有最基本的防御结构仍然毫发无损,其他一切都被摧毁了。\n继续向外扩展。继续研究科技。 -sector.stainedMountains.description = 在更远的内陆地区是山脉,但这里没有被孢子污染。\n这一地区分布着丰富的钛,学习如何使用它。\n\n这里的敌人势力更大,不要给他们时间派出最强的部队。 -sector.overgrowth.description = 这个地区靠近孢子的来源,因此生长过度。\n敌人在这里建立了一个前哨站。建造尖刀单位来摧毁它并找回丢失的东西。 -sector.tarFields.description = 产油区边缘,位于山脉和沙漠之间。它少数几个有石油储量的地区之一。\n尽管被废弃,这附近仍有一些危险的敌方单位。不要低估他们。\n\n[lightgray]如果可能,研究石油加工技术。 -sector.desolateRift.description = 非常危险的区域。这儿的资源丰富但空间很小。敌人十分危险。尽快离开,不要被敌人的攻击间隔太长所愚弄。 -sector.nuclearComplex.description = 以前生产和加工钍的设施已变成废墟。\n[lightgray]研究钍及其多种用途。\n\n敌人在这里大量存在,不断消灭入侵者。 -sector.fungalPass.description = 介于高山和低矮孢子丛生的土地之间的过渡地带。这里有一个小型的敌方侦察基地。\n侦察它。\n使用尖刀和爬行者单位来摧毁两个核心。 -sector.biomassFacility.description = 孢子的发源地。这里有最初研究和生产孢子的设施。\n研究这里的科技,培养孢子来制造燃料和混合物。\n\n[lightgray]设施损毁后,孢子散播了出去,原生生态系统无法抵挡这种外来物种。 -sector.windsweptIslands.description = 海岸线之外坐落着这一串群岛。据记载这里曾有生产[accent]塑钢[]的建筑。\n\n抵御敌人的海军,在岛上建立基地,研究这些工厂。 -sector.extractionOutpost.description = 一座遥远的前哨,敌人为了向其他区域发射资源而建立。\n\n跨区域运输技术是征服这个星球不可或缺的技术。摧毁敌人基地,研究发射台。 -sector.impact0078.description = 这里有最初进入这个星系的星际运输船的遗迹。\n\n回收可以利用的资源,研究科技。 -sector.planetaryTerminal.description = 最终目标。\n\n这座滨海基地有一个可以将核心发射到其他行星的建筑,防卫森严。\n\n制造海军单位,尽快消灭敌人,研究发射建筑。 +sector.groundZero.description = 踏上旅程的最佳位置。 这里的敌人威胁很小,但资源也少。 \n\n尽你所能收集铅和铜,出发吧! +sector.frozenForest.description = 一个靠近山脉的地方。 哪怕是在这里,也有了孢子扩散的痕迹。 \n不过它们无法在低温下长期存活。 \n\n开始运用电力,建造火力发电机并学会使用修理器。 +sector.saltFlats.description = 盐碱荒滩,位于沙漠的边缘地带,几乎没有什么资源。 \n敌人在这里建立了一个资源存储区。 \n\n摧毁他们的核心,片甲不留。 +sector.craters.description = 这片陨石地带有积水,它也是旧时战争的遗迹。 \n\n夺下该区块,收集沙子来冶炼玻璃。 \n用水泵抽水来加速炮塔和钻头。 +sector.ruinousShores.description = 穿过荒地就是海滩。 \n这里曾经有一条海岸防线,但现在已所剩无几。 \n一些基础的防御建筑还完好无损,除此之外都变成了废墟。 \n\n继续向外扩张并研究科技。 +sector.stainedMountains.description = 深入内陆地区便是山脉,这里目前还未被孢子污染。 \n敌人势力更加强大,别给他们的精锐部队留下喘息之机。\n\n这一地区分布着丰富的钛,试着开采并利用它。 +sector.overgrowth.description = 这里的孢子靠近它最初的发源地,因此得以疯狂生长。 \n\n敌人在此处建立了一个前哨站,建造尖刀单位来摧毁它。 +sector.tarFields.description = 产油区边缘,位于山脉和沙漠之间。 它是为数不多蕴藏了石油的地区之一。 \n尽管这里一片废墟,附近仍有一些危险的敌方单位。 不要低估他们。 \n\n[lightgray]尽你所能研究石油加工技术。 +sector.desolateRift.description = 非常危险的区块,资源丰富但空间狭窄,敌人也十分危险。 \n\n尽快离开,不要因敌人的进攻间隔太长而掉以轻心。 +sector.nuclearComplex.description = 曾用来生产加工钍的设施,如今已变成了废墟。 \n这里有大量的敌人,不断搜寻着入侵者。\n\n[lightgray]研究钍以及它的各种用途。 +sector.fungalPass.description = 一边是高山,另一边是孢子丛生的平原。 \n这里有一个敌方的小型侦察基地,摧毁它。 \n\n使用尖刀和爬行者单位,摧毁两个核心。 +sector.biomassFacility.description = 孢子的发源地,有研究和生产孢子的原始设施。 \n[lightgray]设施损毁后,孢子散播了出去,原生生态系统完全无法抵挡这种外来物种。 \n\n研究这里的科技,培养孢子来制造燃料和聚合物。 +sector.windsweptIslands.description = 海岸线之外坐落着这一串群岛。 据记载这里曾有生产[accent]塑钢[]的建筑。\n\n抵御敌人的海军,在岛上建立基地,研究生产建筑。 +sector.extractionOutpost.description = 一座遥远的前哨,敌人建造它来向其他区块发射资源。 \n跨区块运输是征服这个星球不可或缺的一项技术。 \n\n摧毁敌人基地,研究发射台。 +sector.impact0078.description = 最初进入这个星系的星际运输船,残骸留在了这里。 \n\n尽量回收可以利用的资源,研究科技。 +sector.planetaryTerminal.description = 最终目标。 \n这座滨海基地有一个可以将核心发射到其他行星的建筑,防卫森严。 \n\n制造海军单位,尽快消灭敌人,研究发射建筑。 status.burning.name = 燃烧 -status.freezing.name = 冰冻 +status.freezing.name = 冻结 status.wet.name = 潮湿 status.muddy.name = 泥泞 status.melting.name = 熔化 -status.sapped.name = 削弱 -status.electrified.name = 麻痹 +status.sapped.name = 弱化 +status.electrified.name = 电磁紊乱 status.spore-slowed.name = 孢子减速 status.tarred.name = 油浸 +status.overdrive.name = 过载 status.overclock.name = 超频 status.shocked.name = 电击 status.blasted.name = 爆炸 status.unmoving.name = 静止 +status.boss.name = Boss settings.language = 语言 settings.data = 游戏数据 -settings.reset = 恢复默认设置 +settings.reset = 全部恢复默认 settings.rebind = 重新绑定 -settings.resetKey = 重置按键 +settings.resetKey = 恢复默认 settings.controls = 控制 settings.game = 游戏 settings.sound = 声音 -settings.graphics = 图像 +settings.graphics = 图形 settings.cleardata = 清除游戏数据… -settings.clear.confirm = 您确定要清除此数据?\n此操作无法撤销! -settings.clearall.confirm = [scarlet]警告![]\n这将清除所有数据,包括存档、地图、解锁和按键绑定。\n按「是」后,游戏将删除所有数据并自动退出。 -settings.clearsaves.confirm = 您确定要清除存档? +settings.clear.confirm = 确定清除此数据?\n此操作无法撤销! +settings.clearall.confirm = [scarlet]警告![]\n这将清除所有数据,包括存档、 地图、 解锁进度和按键绑定。 \n按“确定”后,游戏将删除所有数据并自动退出。 +settings.clearsaves.confirm = 确定清除所有存档? settings.clearsaves = 清除存档 settings.clearresearch = 清除研究进度 -settings.clearresearch.confirm = 您确定要清除战役研究进度? +settings.clearresearch.confirm = 确定清除战役研究进度? settings.clearcampaignsaves = 清除战役进度 -settings.clearcampaignsaves.confirm = 您确定要清除战役进度? +settings.clearcampaignsaves.confirm = 确定清除战役进度? paused = [accent]< 暂停 > clear = 清除 -banned = [scarlet]已禁止 +banned = [scarlet]禁用 unsupported.environment = [scarlet]不支持的环境 yes = 是 no = 否 -info.title = [accent]详情 -error.title = [crimson]发生了一个错误 +info.title = 详情 +error.title = [scarlet]发生了一个错误 error.crashtitle = 发生了一个错误 -unit.nobuild = [scarlet]单位未能建造 -lastaccessed = [lightgray]上次操作: {0} -block.unknown = [lightgray]??? +unit.nobuild = [scarlet]不能建造单位 +lastaccessed = [lightgray]上次操作:{0} +block.unknown = [lightgray]?? -stat.showinmap = <加载地图以展示> +stat.showinmap = <进入地图后显示> stat.description = 介绍 stat.input = 输入 stat.output = 输出 -stat.booster = 增强物品/液体 -stat.tiles = 所需地型 -stat.affinities = 相关 -stat.opposites = 对立 -stat.powercapacity = 能量容量 -stat.powershot = 能量/发射 +stat.booster = 强化所需 +stat.tiles = 所需地形 +stat.affinities = 影响因素 +stat.opposites = 互斥 +stat.powercapacity = 电力容量 +stat.powershot = 电力/发 stat.damage = 伤害 stat.targetsair = 攻击空中单位 stat.targetsground = 攻击地面单位 stat.itemsmoved = 移动速度 -stat.launchtime = 发射间隔时间 +stat.launchtime = 发射间隔 stat.shootrange = 范围 stat.size = 尺寸 stat.displaysize = 显示尺寸 stat.liquidcapacity = 液体容量 -stat.powerrange = 能量范围 +stat.powerrange = 连接范围 stat.linkrange = 连接范围 -stat.instructions = 指令数量 -stat.powerconnections = 最多连接 -stat.poweruse = 使用能量 -stat.powerdamage = 功率/损伤 +stat.instructions = 指令运行速度 +stat.powerconnections = 最大连接数 +stat.poweruse = 消耗电力 +stat.powerdamage = 电力/伤害 stat.itemcapacity = 物品容量 stat.memorycapacity = 内存容量 -stat.basepowergeneration = 基础能源输出 +stat.basepowergeneration = 基础电力输出 stat.productiontime = 生产时间 stat.repairtime = 建筑完全修复时间 -stat.repairspeed = 修复速度 +stat.repairspeed = 修理速度 stat.weapons = 武器 stat.bullet = 子弹 stat.speedincrease = 提速 stat.range = 范围 stat.drilltier = 可钻探矿物 stat.drillspeed = 基础钻探速度 -stat.boosteffect = 增强效果 +stat.boosteffect = 强化效果 stat.maxunits = 最大单位数量 stat.health = 生命值 stat.armor = 护甲 stat.buildtime = 建造时间 -stat.maxconsecutive = 最大连续 +stat.maxconsecutive = 连续放置限制 stat.buildcost = 建造花费 -stat.inaccuracy = 误差 +stat.inaccuracy = 射击误差 stat.shots = 发射数 -stat.reload = 每秒发射数 +stat.reload = 开火速率 stat.ammo = 弹药 -stat.shieldhealth = 盾容 +stat.shieldhealth = 护盾容量 stat.cooldowntime = 冷却时间 stat.explosiveness = 爆炸性 -stat.basedeflectchance = 基础反射几率 -stat.lightningchance = 激发闪电几率 +stat.basedeflectchance = 基础反射概率 +stat.lightningchance = 激发闪电概率 stat.lightningdamage = 激发闪电伤害 stat.flammability = 燃烧性 stat.radioactivity = 放射性 @@ -740,44 +758,44 @@ stat.charge = 放电性 stat.heatcapacity = 热容量 stat.viscosity = 粘度 stat.temperature = 温度 -stat.speed = 速度 +stat.speed = 移动速度 stat.buildspeed = 建造速度 stat.minespeed = 采矿速度 -stat.minetier = 采矿等级 -stat.payloadcapacity = 载货容量 +stat.minetier = 可采集矿物 +stat.payloadcapacity = 载荷容量 stat.commandlimit = 指挥上限 -stat.abilities = 能力 -stat.canboost = 是否能助推 -stat.flying = 是否能飞行 -stat.ammouse = 弹药消耗 +stat.abilities = 技能 +stat.canboost = 可助推 +stat.flying = 空中单位 +stat.ammouse = 弹药 stat.damagemultiplier = 伤害倍率 -stat.healthmultiplier = 生命倍率 -stat.speedmultiplier = 移速倍率 -stat.reloadmultiplier = 射速倍率 +stat.healthmultiplier = 生命值倍率 +stat.speedmultiplier = 移动速度倍率 +stat.reloadmultiplier = 开火速率倍率 stat.buildspeedmultiplier = 建造速度倍率 -stat.reactive = 反应性 +stat.reactive = 反应 stat.healing = 治疗 ability.forcefield = 力墙场 ability.repairfield = 修复场 -ability.statusfield = 状态场 -ability.unitspawn = {0} 单位工厂 +ability.statusfield = {0}状态场 +ability.unitspawn = {0}单位工厂 ability.shieldregenfield = 护盾再生场 ability.movelightning = 闪电助推器 -ability.energyfield = 能量场: [accent]{0}[] 伤害 ~ [accent]{1}[] 格 / [accent]{2}[] 目标数 +ability.energyfield = 能量场:[accent]{0}[]伤害~[accent]{1}[]格/[accent]{2}[]目标 bar.drilltierreq = 需要更高级的钻头 -bar.noresources = 缺失资源 -bar.corereq = 缺失核心基座 +bar.noresources = 资源不足 +bar.corereq = 需要核心基座 bar.drillspeed = 挖掘速度:{0}/秒 -bar.pumpspeed = 泵压速度:{0}/秒 +bar.pumpspeed = 泵送速度:{0}/秒 bar.efficiency = 效率:{0}% bar.boost = 超速:+{0}% -bar.powerbalance = 能量:{0}/秒 -bar.powerstored = 储能:{0}/{1} -bar.poweramount = 能量:{0} -bar.poweroutput = 能量输出:{0} -bar.powerlines = 链接:{0}/{1} +bar.powerbalance = 电力:{0}/秒 +bar.powerstored = 电力储存:{0}/{1} +bar.poweramount = 电力:{0} +bar.poweroutput = 电力输出:{0} +bar.powerlines = 连接数:{0}/{1} bar.items = 物品:{0} bar.capacity = 容量:{0} bar.unitcap = {0} {1}/{2} @@ -787,76 +805,76 @@ bar.power = 电力 bar.progress = 制造进度 bar.input = 输入 bar.output = 输出 -bar.strength = [stat]{0}[lightgray]x 效率 +bar.strength = [stat]{0}[lightgray]x效率 units.processorcontrol = [lightgray]由处理器控制 -bullet.damage = [stat]{0}[lightgray] 伤害 -bullet.splashdamage = [stat]{0}[lightgray] 范围伤害 ~[stat] {1}[lightgray] 格 -bullet.incendiary = [stat] 燃烧 -bullet.homing = [stat] 追踪 -bullet.frag = [stat] 分裂 -bullet.lightning = [stat]{0}[lightgray]x 电弧 ~ [stat]{1}[lightgray] 伤害 -bullet.buildingdamage = [stat]{0}%[lightgray] 对建筑伤害 -bullet.knockback = [stat]{0}[lightgray] 击退 -bullet.pierce = [stat]{0}[lightgray]x 穿透 -bullet.infinitepierce = [stat] 贯穿 -bullet.healpercent = [stat]{0}[lightgray]% 修复 -bullet.multiplier = [stat]{0}[lightgray]x 装弹数量 -bullet.reload = [stat]{0}[lightgray]x 装弹速度 +bullet.damage = [stat]{0}[lightgray]伤害 +bullet.splashdamage = [stat]{0}[lightgray]范围伤害~[stat] {1}[lightgray]格 +bullet.incendiary = [stat]燃烧 +bullet.homing = [stat]追踪 +bullet.frags = [stat]{0}[lightgray]x分裂子弹: +bullet.lightning = [stat]{0}[lightgray]x闪电~[stat]{1}[lightgray]伤害 +bullet.buildingdamage = [stat]{0}%[lightgray]对建筑伤害 +bullet.knockback = [stat]{0}[lightgray]击退 +bullet.pierce = [stat]{0}[lightgray]x穿透 +bullet.infinitepierce = [stat]无限穿透 +bullet.healpercent = [stat]{0}[lightgray]%修复 +bullet.multiplier = [stat]{0}[lightgray]x装填倍数 +bullet.reload = [stat]{0}[lightgray]x开火速率 -unit.blocks = 方块 -unit.blockssquared = 方块² -unit.powersecond = 能量/秒 +unit.blocks = 格 +unit.blockssquared = 格² +unit.powersecond = 电力/秒 unit.tilessecond = 格/秒 unit.liquidsecond = 液体/秒 unit.itemssecond = 物品/秒 unit.liquidunits = 液体 -unit.powerunits = 能量 +unit.powerunits = 电力 unit.degrees = 度 unit.seconds = 秒 unit.minutes = 分 unit.persecond = /秒 unit.perminute = /分 -unit.timesspeed = 倍 速度 +unit.timesspeed = x速度 unit.percent = % -unit.shieldhealth = 盾容 +unit.shieldhealth = 护盾容量 unit.items = 物品 unit.thousands = K unit.millions = M unit.billions = B unit.pershot = /发 -category.purpose = 介绍 -category.general = 普通 -category.power = 能量 +category.purpose = 用途 +category.general = 基础 +category.power = 电力 category.liquids = 液体 category.items = 物品 -category.crafting = 制造 +category.crafting = 输入/输出 category.function = 功能 -category.optional = 可选的增强 +category.optional = 强化(可选) +setting.skipcoreanimation.name = 跳过核心发射与着陆动画 setting.landscape.name = 锁定横屏 setting.shadows.name = 影子 setting.blockreplace.name = 自动推荐合适的建筑 setting.linear.name = 抗锯齿 setting.hints.name = 提示 -setting.logichints.name = 逻辑代码提示 -setting.flow.name = 显示资源传送速度[scarlet] -setting.backgroundpause.name = 在背景中暂停 +setting.logichints.name = 逻辑指令提示 +setting.backgroundpause.name = 游戏在后台时自动暂停 setting.buildautopause.name = 自动暂停建造 -setting.doubletapmine.name = 双击以采矿 -setting.modcrashdisable.name = 游戏启动崩溃时不禁用模组 +setting.doubletapmine.name = 双击采矿 +setting.modcrashdisable.name = 游戏启动崩溃后禁用模组 setting.animatedwater.name = 动态液体 setting.animatedshields.name = 动态力场 setting.playerindicators.name = 玩家指示器 -setting.indicators.name = 敌军指示器 -setting.autotarget.name = 自动射击 +setting.indicators.name = 敌人指示器 +setting.autotarget.name = 自动瞄准 setting.keyboard.name = 鼠标+键盘操控 setting.touchscreen.name = 触屏操控 -setting.fpscap.name = 最大FPS +setting.fpscap.name = 最大帧数 setting.fpscap.none = 无 setting.fpscap.text = {0} FPS setting.uiscale.name = UI缩放比例 -setting.uiscale.description = 需要重新启动以应用更改。 +setting.uiscale.description = 需要重新启动 setting.swapdiagonal.name = 总是斜线建造 setting.difficulty.training = 训练 setting.difficulty.easy = 简单 @@ -865,21 +883,22 @@ setting.difficulty.hard = 困难 setting.difficulty.insane = 疯狂 setting.difficulty.name = 难度: setting.screenshake.name = 屏幕抖动 -setting.effects.name = 显示效果 -setting.destroyedblocks.name = 显示摧毁的建筑 -setting.blockstatus.name = 显示方块状态 +setting.effects.name = 显示特效 +setting.destroyedblocks.name = 显示已摧毁的建筑 +setting.blockstatus.name = 显示建筑状态 setting.conveyorpathfinding.name = 传送带自动寻路 setting.sensitivity.name = 控制器灵敏度 setting.saveinterval.name = 自动保存间隔 -setting.seconds = {0} 秒 -setting.milliseconds = {0} 毫秒 +setting.seconds = {0}秒 +setting.milliseconds = {0}毫秒 setting.fullscreen.name = 全屏 -setting.borderlesswindow.name = 无边界窗口 -setting.borderlesswindow.description = 可能需要重新启动以应用更改。 -setting.fps.name = 显示 FPS 和网络延迟 -setting.smoothcamera.name = 镜头平滑 +setting.borderlesswindow.name = 无边框窗口 +setting.borderlesswindow.name.windows = 无边框全屏 +setting.borderlesswindow.description = 可能需要重启 +setting.fps.name = 显示帧数和网络延迟 +setting.smoothcamera.name = 平滑镜头 setting.vsync.name = 垂直同步 -setting.pixelate.name = 像素画面 [lightgray] +setting.pixelate.name = 像素画面 setting.minimap.name = 显示小地图 setting.coreitems.name = 显示核心物资 setting.position.name = 显示玩家坐标 @@ -892,24 +911,24 @@ setting.mutesound.name = 禁用音效 setting.crashreport.name = 发送匿名的崩溃报告 setting.savecreate.name = 自动创建存档 setting.publichost.name = 游戏公开可见 -setting.playerlimit.name = 玩家限制 +setting.playerlimit.name = 玩家数量限制 setting.chatopacity.name = 聊天界面不透明度 -setting.lasersopacity.name = 能量激光不透明度 +setting.lasersopacity.name = 电力连接线不透明度 setting.bridgeopacity.name = 桥梁不透明度 setting.playerchat.name = 显示玩家聊天气泡 setting.showweather.name = 显示天气效果 -public.confirm = 确定使您的游戏公开可见?\n[accent]其他人将可以加入到您的游戏。\n[lightgray]您之后可以在 设置->游戏->游戏公开可见 更改。 -public.confirm.really = 如果您想与朋友游玩,可以使用[green]邀请朋友[]而不是[scarlet]公开游戏[]!\n您确定要使游戏[scarlet]公开可见[]吗? -public.beta = 请注意,测试版的游戏不能公开可见。 -uiscale.reset = UI 缩放比例已更改。\n按下“确定”来执行缩放比例的更改。\n[accent]{0}[]秒后[scarlet]将自动退出并还原设置。 +public.confirm = 确定使您的游戏公开可见?\n[accent]其他人将可以加入到您的游戏。 \n[lightgray]此后可以在 设置->游戏->游戏公开可见 里面更改。 +public.confirm.really = 如果您想与好友一起游戏,可以使用[green]邀请好友[]而不是[scarlet]公开游戏[]!\n您确定要使游戏[scarlet]公开可见[]吗? +public.beta = 请注意,测试版的游戏不能公开可见。 +uiscale.reset = UI缩放比例已更改。 \n点击“确定”来接受缩放比例的更改。 \n[accent]{0}[]秒后[scarlet]将自动退出并还原设置。 uiscale.cancel = 取消并退出 setting.bloom.name = 特效 keybind.title = 重新绑定按键 -keybinds.mobile = [scarlet]这里的大多数按键绑定在移动设备上都不能用。仅支持基本的移动。 +keybinds.mobile = [scarlet]除了基本的移动以外,大多数按键绑定在移动设备上无效。 category.general.name = 常规 category.view.name = 视图 -category.multiplayer.name = 多人 -category.blocks.name = 选择方块 +category.multiplayer.name = 多人游戏 +category.blocks.name = 建筑选择 command.attack = 攻击 command.rally = 集合 command.retreat = 撤退 @@ -917,18 +936,18 @@ command.idle = 闲置 placement.blockselectkeys = \n[lightgray]按键:[{0}, keybind.respawn.name = 重生 keybind.control.name = 控制单位 -keybind.clear_building.name = 清除建筑 +keybind.clear_building.name = 清除规划 keybind.press = 请按一个键… keybind.press.axis = 请按一个轴或键… -keybind.screenshot.name = 地图截图 -keybind.toggle_power_lines.name = 显示/隐藏能量标识线 -keybind.toggle_block_status.name = 显示/隐藏方块状态 +keybind.screenshot.name = 全地图截图 +keybind.toggle_power_lines.name = 显示/隐藏电力连接线 +keybind.toggle_block_status.name = 显示/隐藏建筑状态 keybind.move_x.name = 水平移动 keybind.move_y.name = 竖直移动 -keybind.mouse_move.name = 跟随鼠标 -keybind.pan.name = 平移视图 -keybind.boost.name = 推进 -keybind.schematic_select.name = 选择区域 +keybind.mouse_move.name = 单位跟随鼠标 +keybind.pan.name = 鼠标控制镜头 +keybind.boost.name = 启动助推 +keybind.schematic_select.name = 框选建筑 keybind.schematic_menu.name = 蓝图目录 keybind.schematic_flip_x.name = 水平翻转 keybind.schematic_flip_y.name = 竖直翻转 @@ -952,93 +971,97 @@ keybind.fullscreen.name = 切换全屏 keybind.select.name = 选择/射击 keybind.diagonal_placement.name = 斜线建造 keybind.pick.name = 选择建筑 -keybind.break_block.name = 破坏建筑 +keybind.break_block.name = 拆除建筑 keybind.deselect.name = 取消选择 -keybind.pickupCargo.name = 拾取货物 -keybind.dropCargo.name = 释放货物 -keybind.command.name = 指挥 +keybind.pickupCargo.name = 拾取载荷 +keybind.dropCargo.name = 释放载荷 +keybind.command.name = 指挥附近的单位 keybind.shoot.name = 射击 keybind.zoom.name = 缩放 keybind.menu.name = 菜单 keybind.pause.name = 暂停 keybind.pause_building.name = 暂停/继续建造 -keybind.minimap.name = 小地图 -keybind.planet_map.name = 行星地图 -keybind.research.name = 研究 -keybind.block_info.name = 方块信息 +keybind.minimap.name = 打开小地图 +keybind.planet_map.name = 打开行星地图 +keybind.research.name = 打开科技树 +keybind.block_info.name = 显示建筑信息 keybind.chat.name = 聊天 keybind.player_list.name = 玩家列表 keybind.console.name = 控制台 keybind.rotate.name = 旋转 -keybind.rotateplaced.name = 旋转全部(长按) -keybind.toggle_menus.name = 显隐选项 +keybind.rotateplaced.name = 旋转已放置的建筑(长按) +keybind.toggle_menus.name = 显示/隐藏UI keybind.chat_history_prev.name = 聊天记录向前 keybind.chat_history_next.name = 聊天记录向后 keybind.chat_scroll.name = 聊天记录滚动 keybind.chat_mode.name = 切换聊天模式 -keybind.drop_unit.name = 松开单位 +keybind.drop_unit.name = 释放单位 keybind.zoom_minimap.name = 小地图缩放 -mode.help.title = 模式说明 +mode.help.title = 游戏模式说明 mode.survival.name = 生存 -mode.survival.description = 正常的游戏模式,有限的资源,自动的波次。\n[gray]需要击退周期性出现的敌人。 +mode.survival.description = 通常的游戏模式,资源有限,自动生成敌人波次。 \n[gray]需要地图中有敌方出生点。 mode.sandbox.name = 沙盒 -mode.sandbox.description = 无限的资源,不会自动生成敌人。 -mode.editor.name = 编辑器 +mode.sandbox.description = 无限资源,不会自动生成敌人波次。 +mode.editor.name = 地图编辑器 mode.pvp.name = PvP -mode.pvp.description = 与本地玩家对战。\n[gray]需要地图中有不同队伍(颜色)的核心。 -mode.attack.name = 攻击 -mode.attack.description = 没有波次,但需要摧毁敌人的基地。\n[gray]需要地图中有红色的核心。 +mode.pvp.description = 与其他玩家对战。 \n[gray]需要地图中有至少2种不同颜色的核心。 +mode.attack.name = 进攻 +mode.attack.description = 摧毁敌人的基地。 \n[gray]需要地图中有红色的核心。 mode.custom = 自定义模式 rules.infiniteresources = 无限资源 -rules.reactorexplosions = 反应堆爆炸 -rules.coreincinerates = 核心自动焚烧溢出物资 +rules.reactorexplosions = 反应堆爆炸有破坏性 +rules.coreincinerates = 核心自动销毁多余的物品 rules.schematic = 允许使用蓝图 rules.wavetimer = 波次计时器 rules.waves = 波次 -rules.attack = 攻击模式 -rules.buildai = AI建造 -rules.cleanupdeadteams = 清理被打败的队伍的建筑(PvP模式) -rules.corecapture = 摧毁核心时占领该核心 -rules.polygoncoreprotection = 多边形核心保护区域 +rules.attack = 进攻模式 +rules.buildai = 敌方 AI 会建造建筑 +rules.aitier = AI 难度 +rules.cleanupdeadteams = 清除已战败队伍的建筑(PvP模式) +rules.corecapture = 摧毁核心时将其俘获 +rules.polygoncoreprotection = 根据核心位置平分可建造区域 rules.enemyCheat = 敌人(红队)无限资源 -rules.blockhealthmultiplier = 建筑生命倍数 -rules.blockdamagemultiplier = 建筑伤害倍数 -rules.unitbuildspeedmultiplier = 单位生产速度倍数 -rules.unithealthmultiplier = 单位生命倍数 -rules.unitdamagemultiplier = 单位伤害倍数 -rules.unitcapvariable = 每个核心提供的单位上限 +rules.blockhealthmultiplier = 建筑生命值倍率 +rules.blockdamagemultiplier = 建筑伤害倍率 +rules.unitbuildspeedmultiplier = 单位生产速度倍率 +rules.unithealthmultiplier = 单位生命值倍率 +rules.unitdamagemultiplier = 单位伤害倍率 +rules.unitcapvariable = 核心可增加单位上限 rules.unitcap = 基础单位上限 -rules.enemycorebuildradius = 敌方核心禁造区半径:[lightgray](格) -rules.wavespacing = 波次间隔时间:[lightgray](秒) -rules.buildcostmultiplier = 建材倍率 -rules.buildspeedmultiplier = 建造速率 -rules.deconstructrefundmultiplier = 拆除返还倍数 +rules.enemycorebuildradius = 敌方核心不可建造区域半径:[lightgray](格) +rules.wavespacing = 波次间隔:[lightgray](秒) +rules.buildcostmultiplier = 建造花费倍率 +rules.buildspeedmultiplier = 建造速度倍率 +rules.deconstructrefundmultiplier = 拆除返还倍率 rules.waitForWaveToEnd = 等待敌人时间 rules.dropzoneradius = 敌人出生点禁区大小:[lightgray](格) -rules.unitammo = 单位消耗子弹 +rules.unitammo = 单位有弹药限制 +rules.enemyteam = 敌方队伍 +rules.playerteam = 玩家队伍 rules.title.waves = 波次 rules.title.resourcesbuilding = 资源和建造 -rules.title.enemy = 敌人 +rules.title.enemy = AI 对手 rules.title.unit = 单位 rules.title.experimental = 实验性 -rules.title.environment = 环境性 -rules.lighting = 光照 -rules.enemyLights = 敌方光照 -rules.fire = 火焰 +rules.title.environment = 环境 +rules.title.teams = 队伍 +rules.lighting = 迷雾 +rules.enemyLights = 敌方单位发光 +rules.fire = 允许火焰产生并蔓延 rules.explosions = 建筑/单位爆炸伤害 -rules.ambientlight = 环境光 -rules.weather = 气候 -rules.weather.frequency = 频率: -rules.weather.always = 持续 -rules.weather.duration = 时长: +rules.ambientlight = 迷雾颜色 +rules.weather = 天气 +rules.weather.frequency = 周期: +rules.weather.always = 永久 +rules.weather.duration = 时长: content.item.name = 物品 content.liquid.name = 液体 content.unit.name = 单位 content.block.name = 建筑 content.status.name = 状态效果 -content.sector.name = 区域 +content.sector.name = 战役区块 item.copper.name = 铜 item.lead.name = 铅 @@ -1048,17 +1071,17 @@ item.titanium.name = 钛 item.thorium.name = 钍 item.silicon.name = 硅 item.plastanium.name = 塑钢 -item.phase-fabric.name = 相织物 +item.phase-fabric.name = 相位织物 item.surge-alloy.name = 巨浪合金 item.spore-pod.name = 孢子荚 item.sand.name = 沙 -item.blast-compound.name = 爆炸混合物 -item.pyratite.name = 火石 +item.blast-compound.name = 炸药 +item.pyratite.name = 硫化物 item.metaglass.name = 钢化玻璃 item.scrap.name = 废料 liquid.water.name = 水 -liquid.slag.name = 矿渣 +liquid.slag.name = 矿渣液 liquid.oil.name = 石油 liquid.cryofluid.name = 冷冻液 @@ -1091,7 +1114,7 @@ unit.omura.name = 海神 unit.retusa.name = 潜螺 unit.oxynoe.name = 电鳗 unit.cyerce.name = 江豚 -unit.aegires.name = 神盾 +unit.aegires.name = 玄武 unit.navanax.name = 龙王 unit.alpha.name = 阿尔法 unit.beta.name = 贝塔 @@ -1101,13 +1124,12 @@ unit.reign.name = 王座 unit.vela.name = 灾星 unit.corvus.name = 死星 -block.resupply-point.name = 补给点 block.parallax.name = 差扰光束 block.cliff.name = 悬崖 block.sand-boulder.name = 砂岩 block.basalt-boulder.name = 玄武岩巨石 block.grass.name = 草地 -block.molten-slag.name = 矿渣 +block.molten-slag.name = 矿渣液 block.space.name = 太空 block.salt.name = 盐碱地 block.salt-wall.name = 盐墙 @@ -1133,7 +1155,7 @@ block.thruster.name = 推进器残骸 block.kiln.name = 窑炉 block.graphite-press.name = 石墨压缩机 block.multi-press.name = 多重压缩机 -block.constructing = {0}\n[lightgray](建造中) +block.constructing = {0}[lightgray](建造中) block.spawn.name = 敌人出生点 block.core-shard.name = 初代核心 block.core-foundation.name = 次代核心 @@ -1141,7 +1163,8 @@ block.core-nucleus.name = 终代核心 block.deep-water.name = 深水 block.shallow-water.name = 水 block.tainted-water.name = 污水 -block.darksand-tainted-water.name = 黑沙 污水 +block.deep-tainted-water.name = 深污水 +block.darksand-tainted-water.name = 黑沙污水 block.tar.name = 石油 block.stone.name = 石头 block.sand.name = 沙子 @@ -1149,8 +1172,8 @@ block.darksand.name = 黑沙 block.ice.name = 冰 block.snow.name = 雪 block.crater-stone.name = 陨石坑 -block.sand-water.name = 沙 水 -block.darksand-water.name = 黑沙 水 +block.sand-water.name = 浅滩 +block.darksand-water.name = 黑沙浅滩 block.char.name = 焦土 block.dacite.name = 安山岩 block.rhyolite.name = 流纹岩 @@ -1190,8 +1213,8 @@ block.titanium-wall.name = 钛墙 block.titanium-wall-large.name = 大型钛墙 block.plastanium-wall.name = 塑钢墙 block.plastanium-wall-large.name = 大型塑钢墙 -block.phase-wall.name = 相织物墙 -block.phase-wall-large.name = 大型相织物墙 +block.phase-wall.name = 相位墙 +block.phase-wall-large.name = 大型相位墙 block.thorium-wall.name = 钍墙 block.thorium-wall-large.name = 大型钍墙 block.door.name = 门 @@ -1205,7 +1228,7 @@ block.conveyor.name = 传送带 block.titanium-conveyor.name = 钛传送带 block.plastanium-conveyor.name = 塑钢传送带 block.armored-conveyor.name = 装甲传送带 -block.junction.name = 连接器 +block.junction.name = 交叉器 block.router.name = 路由器 block.distributor.name = 分配器 block.sorter.name = 分类器 @@ -1215,7 +1238,7 @@ block.illuminator.name = 照明器 block.overflow-gate.name = 溢流门 block.underflow-gate.name = 反向溢流门 block.silicon-smelter.name = 硅冶炼厂 -block.phase-weaver.name = 相织物编织器 +block.phase-weaver.name = 相位编织器 block.pulverizer.name = 粉碎机 block.cryofluid-mixer.name = 冷冻液混合器 block.melter.name = 熔炉 @@ -1223,9 +1246,9 @@ block.incinerator.name = 焚化炉 block.spore-press.name = 孢子压缩机 block.separator.name = 分离机 block.coal-centrifuge.name = 煤炭离心机 -block.power-node.name = 能量节点 -block.power-node-large.name = 大型能量节点 -block.surge-tower.name = 波动能量塔 +block.power-node.name = 电力节点 +block.power-node-large.name = 大型电力节点 +block.surge-tower.name = 合金电力塔 block.diode.name = 二极管 block.battery.name = 电池 block.battery-large.name = 大型电池 @@ -1244,8 +1267,8 @@ block.item-source.name = 物品源 block.item-void.name = 物品黑洞 block.liquid-source.name = 液体源 block.liquid-void.name = 液体黑洞 -block.power-void.name = 能源黑洞 -block.power-source.name = 无限能源 +block.power-void.name = 电力黑洞 +block.power-source.name = 电力源 block.unloader.name = 装卸器 block.vault.name = 仓库 block.wave.name = 波浪 @@ -1253,33 +1276,34 @@ block.tsunami.name = 海啸 block.swarmer.name = 蜂群 block.salvo.name = 齐射炮 block.ripple.name = 浪涌 -block.phase-conveyor.name = 相织物传送带桥 +block.phase-conveyor.name = 相位传送带桥 block.bridge-conveyor.name = 传送带桥 block.plastanium-compressor.name = 塑钢压缩机 -block.pyratite-mixer.name = 火石混合器 -block.blast-mixer.name = 爆炸物混合器 +block.pyratite-mixer.name = 硫化物混合器 +block.blast-mixer.name = 炸药混合器 block.solar-panel.name = 太阳能板 block.solar-panel-large.name = 大型太阳能板 block.oil-extractor.name = 石油钻井 block.repair-point.name = 维修点 +block.repair-turret.name = 维修塔 block.pulse-conduit.name = 脉冲导管 block.plated-conduit.name = 电镀导管 -block.phase-conduit.name = 相织物导管桥 +block.phase-conduit.name = 相位导管桥 block.liquid-router.name = 液体路由器 block.liquid-tank.name = 储液罐 block.liquid-junction.name = 液体交叉器 block.bridge-conduit.name = 导管桥 -block.rotary-pump.name = 回旋泵 +block.rotary-pump.name = 回转泵 block.thorium-reactor.name = 钍反应堆 block.mass-driver.name = 质量驱动器 block.blast-drill.name = 爆破钻头 block.thermal-pump.name = 热能泵 block.thermal-generator.name = 热能发电机 block.alloy-smelter.name = 合金冶炼厂 -block.mender.name = 修复器 +block.mender.name = 修理器 block.mend-projector.name = 修理投影器 -block.surge-wall.name = 波动墙 -block.surge-wall-large.name = 大型波动墙 +block.surge-wall.name = 合金墙 +block.surge-wall-large.name = 大型合金墙 block.cyclone.name = 气旋 block.fuse.name = 雷光 block.shock-mine.name = 脉冲地雷 @@ -1292,7 +1316,6 @@ block.meltdown.name = 熔毁 block.foreshadow.name = 厄兆 block.container.name = 容器 block.launch-pad.name = 发射台 -block.launch-pad-large.name = 大型发射台 block.segment.name = 裂解光束 block.command-center.name = 指挥中心 block.ground-factory.name = 陆军工厂 @@ -1307,15 +1330,15 @@ block.payload-router.name = 载荷路由器 block.duct.name = 物品导管 block.duct-router.name = 物品导管路由器 block.duct-bridge.name = 物品导管桥 -block.payload-propulsion-tower.name = 载荷驱动台 +block.payload-propulsion-tower.name = 载荷驱动器 block.payload-void.name = 载荷黑洞 -block.payload-source.name =载荷源 +block.payload-source.name = 载荷源 block.disassembler.name = 解离机 block.silicon-crucible.name = 热能坩埚 block.overdrive-dome.name = 超速穹顶投射器 block.interplanetary-accelerator.name = 行星际加速器 -#experimental, may be removed -block.block-forge.name = 方块熔炉 +#experimental, may be removed (仅供测试,行将移除) +block.block-forge.name = 方块建造厂 block.block-loader.name = 方块装载机 block.block-unloader.name = 方块卸载机 @@ -1336,313 +1359,317 @@ team.green.name = 绿 team.purple.name = 紫 hint.skip = 跳过 -hint.desktopMove = 使用[accent][[WASD][]来移动。 -hint.zoom = 滚动[accent]鼠标滚轮[]放大或缩小。 -hint.mine = 移动到\uf8c4 铜矿附近并[accent]点按[]进行手动开采。 -hint.desktopShoot = [accent][[鼠标左键][]射击。 -hint.depositItems = 要转移物品,请将其从飞船上拖到核心。 -hint.respawn = 要于核心中重生,请按[accent][[V][]。 -hint.respawn.mobile = 您已切换控制单元/建筑。如果要重生为飞船,请[accent]点击左上方的图标(您的单元/结构图标)。[] -hint.desktopPause = 按[accent][[Space][]暂停和取消暂停游戏。 -hint.placeDrill = 选择右下角菜单中的\ue85e [accent]钻头[]分类,然后选择一个\uf870 [accent]钻头[]然后单击铜矿将其放置。 -hint.placeDrill.mobile = 选择右下角菜单中的\ue85e [accent]钻头[]分类,然后选择一个\uf870 [accent]钻头[],然后点击铜矿将其放置。\n\n点击右下角\ue800 [accent]复选标记[]以确认。 -hint.placeConveyor = 传送带将物品从钻头移到其他方块中。从\ue814 [accent]布局[]分类选择\uf896 [accent]传送带[]。\n\n单击并拖动以放置多个传送带。\n[accent]滚动[]以旋转。 -hint.placeConveyor.mobile = 传送带将物品从钻头移到其他块中。从\ue814 [accent]布局[]分类选择\uf896 [accent]传送带[]。\n\n长按一秒钟,然后拖动以放置多个传送带。 -hint.placeTurret = 放置\uf861 [accent]炮塔[]以抵御敌人,保卫你的核心。\n\n炮塔需要弹药-\uf838 铜。\n使用传送带和钻头为它们供弹。 -hint.breaking = [accent]右击[]并拖动以拆除方块。 -hint.breaking.mobile = 点击在右下角的\ue817 [accent]锤子[]点击以拆除方块。\n\n按住手指一秒钟,然后拖动并选择。 -hint.blockInfo = 在 [accent]建造菜单[]中选择一个建筑,然后点击右边的 [accent][[?][]按钮以查看这个方块的信息。 -hint.research = 点击\ue875 [accent]科技树[]按钮研究新技术。 -hint.research.mobile = 点击在\ue88c [accent]菜单[]中的\ue875 [accent]科技树[]按钮以研究新技术。 -hint.unitControl = 按住[accent][[L-ctrl][]并[accent]点击[]友军单位或炮塔来进行控制。 -hint.unitControl.mobile = [accent][双击][]友军单位或炮塔来进行控制。 -hint.launch = 一旦收集到足够的资源,您就可以通过从右下角的\ue827 [accent]地图[]选择附近的区域[accent]发射[]核心。 -hint.launch.mobile = 一旦收集到足够的资源,您就可以通过在\ue88c [accent]菜单[]的\ue827 [accent]地图[]选择附近的区域[accent]发射[]核心。 -hint.schematicSelect = 按住[accent][[F][]并拖动以选择要复制和粘贴的块。\n\n[accent][鼠标中键][]复制单个块类型。 -hint.conveyorPathfind = 按住[accent][[L-Ctrl][]拖动传送带并使其自动寻路。 -hint.conveyorPathfind.mobile = 启用\ue844 [accent]传送带自动寻路[]并拖动,传送带会自动生成路径。 -hint.boost = 按住[accent][[L-Shift][]用当前单位飞越障碍物。\n\n但只有少数地面单位有助推器。 -hint.command = 按住[accent][[G][]指挥附近的单位编队。 -hint.command.mobile = [accent][[双击][]您的部队指挥附近的部队编队。 -hint.payloadPickup = 按[accent][[[]捡起方块或单位。 -hint.payloadPickup.mobile = [accent]长按一个方块或一个单位来捡起来。 -hint.payloadDrop = 按[accent]][]放下捡起的方块或单位。 -hint.payloadDrop.mobile = [accent]点住[]一个空的位置将捡起的方块或单位丢到那里。 -hint.waveFire = [accent]波浪[]炮塔加水弹药会自动扑灭附近的火。 -hint.generator = \uf879 [accent]燃烧发电机[]燃烧煤炭并将电力传输到相邻方块。\n\n用\uf87f [accent]能量节点[]可以扩展电力传输范围。 -hint.guardian = [accent]Boss[]单位装甲厚重。[accent]铜[]和[accent]铅[]这类较弱的子弹对其[scarlet]作用不佳[]。\n\n使用高级别炮塔或使用\uf835 [accent]石墨[]作为\uf861 双管炮及\uf859 齐射炮的弹药来消灭Boss。 -hint.coreUpgrade = 核心可以通过[accent]在上面覆盖高等级核心[]进行升级。\n\n在[accent]初代核心[]上放置一个[accent]次代核心[]。确保周围没有障碍物。 -hint.presetLaunch = 灰色的[accent]降落地区[],如[accent]冰冻森林[],可以从任何区域发射,不需要占领附近的区块。\n\n[accent]数字编号的区域[],如这个,是[accent]可选的[]。 -hint.coreIncinerate = 核心存满一种物品后,再进入的同种物品会被[accent]摧毁[]。 -hint.coopCampaign = 游玩[accent]合作战役[]时,当前地图生产的资源也会被送入[accent]您本地的区域[]。\n\n新科技也会同步解锁。 +hint.desktopMove = 使用[accent][[WASD][]键来移动。 +hint.zoom = 滚动[accent]鼠标滚轮[]放大或缩小。 +hint.mine = 接近\uf8c4铜矿并[accent]点击[]它们,来进行手动开采。 +hint.desktopShoot = [accent][[鼠标左键][]射击。 +hint.depositItems = 要转移物品,请将其从飞船上拖动到核心中。 +hint.respawn = 要以初始飞船的形式重生,请按[accent][[V][]键。 +hint.respawn.mobile = 您正在控制某个单位或建筑。 要以初始飞船的形式重生,请[accent]点击左上方的图标(您的单位/建筑图标)。 [] +hint.desktopPause = 按[accent][[空格][]键暂停或恢复游戏。 +hint.placeDrill = 选择右下角菜单中的\ue85e[accent]钻头[]分类,然后选择一个\uf870[accent]钻头[]并单击铜矿将其放置。 +hint.placeDrill.mobile = 选择右下角菜单中的\ue85e[accent]钻头[]分类,然后选择一个\uf870[accent]钻头[],再点击铜矿将其放置。 \n\n点击右下角的\ue800[accent]勾[]以确认。 +hint.placeConveyor = 传送带将物品从钻头运送到其他建筑中。 从\ue814[accent]运输[]分类选择\uf896[accent]传送带[]。 \n\n单击并拖动以连续放置传送带。 \n[accent]滚动鼠标滚轮[]以旋转方向。 +hint.placeConveyor.mobile = 传送带将物品从钻头运送到其他建筑中。 从\ue814[accent]运输[]分类选择\uf896[accent]传送带[]。 \n\n长按一秒,然后拖动以连续放置传送带。 +hint.placeTurret = 放置\uf861[accent]炮塔[]以抵御敌人,保卫你的核心。 \n\n炮塔需要弹药-\uf838铜。 \n使用传送带和钻头为它们供弹。 +hint.breaking = [accent]鼠标右键[]拖动以拆除建筑。 +hint.breaking.mobile = 激活右下角的\ue817[accent]锤子[]并点击建筑来拆除它们。 \n\n长按一秒后拖动,可拆除范围内多个建筑。 +hint.blockInfo = 要查看建筑信息,可以先在[accent]建造菜单[]中选择建筑,然后点击右侧的[accent][[?][]按钮。 +hint.derelict = [accent]废墟[]建筑是已废弃基地的残骸。 \n\n可以[accent]拆除[]这些建筑来获取资源。 +hint.research = 点击\ue875[accent]科技树[]按钮研究新科技。 +hint.research.mobile = 点击\ue88c[accent]菜单[]中的\ue875[accent]科技树[]按钮以研究新科技。 +hint.unitControl = 按住[accent][[L-ctrl][]并[accent]点击[]友军单位或炮塔来进行控制。 +hint.unitControl.mobile = [accent][双击][]友军单位或炮塔来进行控制。 +hint.launch = 一旦收集了足够的资源,您就可以通过右下角的\ue827[accent]地图[]选择附近的区块来[accent]发射[]核心。 +hint.launch.mobile = 一旦收集到足够的资源,您就可以通过\ue88c[accent]菜单[]中的\ue827[accent]地图[]选择附近的区块来[accent]发射[]核心。 +hint.schematicSelect = 按住[accent][[F][]键用鼠标框选,即可选择建筑来复制粘贴。 \n\n[accent][鼠标中键][]复制单个建筑。 +hint.conveyorPathfind = 按住[accent][[L-Ctrl][]键并拖动传送带,使其自动寻路。 +hint.conveyorPathfind.mobile = 启用\ue844[accent]传送带自动寻路[]后,拖动传送带可使其自动寻路。 +hint.boost = 按住[accent][[L-Shift][]控制当前单位助推,可飞越障碍物。 \n\n只有一部分地面单位有助推功能。 +hint.command = 按[accent][[G][]键指挥附近的[accent]同类单位[]以形成编队。 \n\n您需要先控制一个地面单位,才能指挥其他的地面单位。 +hint.command.mobile = [accent][[双击][]您的单位指挥附近的单位以形成编队。 +hint.payloadPickup = 按[accent][[[]键来将小型建筑或单位拾起作为载荷。 +hint.payloadPickup.mobile = [accent]长按[]一个小型建筑或单位来拾起作为载荷。 +hint.payloadDrop = 按[accent]][]键放下载荷。 +hint.payloadDrop.mobile = [accent]长按[]一个空的位置将载荷放在那里。 +hint.waveFire = [accent]波浪[]炮塔以水作弹药时,会自动扑灭附近的火焰。 +hint.generator = \uf879[accent]火力发电机[]燃煤发电,并将电力输送至相邻建筑。 \n\n用\uf87f[accent]电力节点[]可以扩展电力输送范围。 +hint.guardian = [accent]Boss[]单位装甲厚重。 [accent]铜[]和[accent]铅[]这类较弱的子弹对其[scarlet]作用不佳[]。 \n\n使用高级别炮塔或使用\uf835[accent]石墨[]作为\uf861双管炮及\uf859齐射炮的弹药来消灭Boss。 +hint.coreUpgrade = 核心可以通过[accent]在上面覆盖更高等级的核心[]进行升级。 \n\n在[accent]初代核心[]上放置一个[accent]次代核心[]。 确保周围没有障碍物。 +hint.presetLaunch = 灰色的[accent]着陆区块[],如[accent]冰冻森林[],从其他任何地方发射都可以到达,不需要先占领邻近的区块。 \n\n[accent]数字编号的区块[],比如这个,可以[accent]选择性[]占领。 +hint.presetDifficulty = 这个区块受敌人[scarlet]威胁程度很高[]。 \n解锁适当的科技,并做好充分准备,否则[accent]不建议[]向这里发射。 +hint.coreIncinerate = 核心内一种物品达到容量上限后,同种物品再进入时会被[accent]销毁[]。 +hint.coopCampaign = 游玩他人主持的[accent]合作战役[]时,生产的资源也会被送入[accent]您自己的区块[]。 \n\n新科技也会同步解锁。 -item.copper.description = 用于所有类型的建筑和弹药。 -item.copper.details = 铜。在塞普罗上的异常丰富的金属。不经加固,结构会较脆弱。 -item.lead.description = 用于液体输送和电气结构。 -item.lead.details = 致密且呈惰性。广泛用于电池中。\n注意:可能对生物生命体有毒。虽说这里已经没有多少生物了。 -item.metaglass.description = 用于液体传输/储存结构。 -item.graphite.description = 用于电子元件和炮塔弹药。 -item.sand.description = 用于生产其他精炼材料。 -item.coal.description = 用于燃料和精炼材料生产。 -item.coal.details = 似乎是植物的化石,在孢子荚出现前很久就形成了。 -item.titanium.description = 用于液体运输结构、钻头和飞行器。 -item.thorium.description = 用于耐用结构和核燃料。 -item.scrap.description = 用于熔炉和粉碎机来精炼成其他材料。 -item.scrap.details = 旧结构和单位的残余物。 -item.silicon.description = 用于太阳能板,复杂的电气元件和追踪性弹药。 -item.plastanium.description = 用于先进单位、绝缘和分裂性弹药。 -item.phase-fabric.description = 用于高级电子设备和自修复结构。 -item.surge-alloy.description = 用于先进武器和反应防御结构。 -item.spore-pod.description = 用于转化成石油、爆炸物和燃料。 -item.spore-pod.details = 孢子。可能是人工合成的生命形式。释放对其他生物有毒的气体。极具侵略性。在某些条件下高度易燃。 -item.blast-compound.description = 用于炸弹和爆炸性弹药。 -item.pyratite.description = 用于燃烧武器和燃烧燃料发电机。 +item.copper.description = 用于建造大多数建筑,或作为弹药使用。 +item.copper.details = 铜,塞普罗星上异常丰富的金属。 不经处理的话,结构很脆弱。 +item.lead.description = 用于建造液体输送和电力相关的建筑。 +item.lead.details = 致密,惰性,广泛用于电池中。 \n注意:可能对生命体有毒,虽说这里已经没有多少生物了。 +item.metaglass.description = 用于建造输送或储存液体的建筑。 +item.graphite.description = 用于制造电子元件,或作为炮塔弹药。 +item.sand.description = 用于生产其他精炼材料。 +item.coal.description = 用作燃料,或用于精炼材料生产。 +item.coal.details = 似乎是植物的化石,在孢子出现很久前就形成了。 +item.titanium.description = 用于液体输送建筑、 钻头和工厂。 +item.thorium.description = 用于耐用建筑以及作为核燃料。 +item.scrap.description = 用于熔炉和粉碎机来精炼成其他材料。 +item.scrap.details = 废旧建筑和单位的残骸。 +item.silicon.description = 用于太阳能板、 复杂的电气元件或作为追踪性弹药。 +item.plastanium.description = 用于高级单位、 绝缘材料,或作为分裂性弹药。 +item.phase-fabric.description = 用于高级电子设备和自修复建筑。 +item.surge-alloy.description = 用于先进武器和反应防御建筑。 +item.spore-pod.description = 用于转化成石油、 炸药或作为燃料。 +item.spore-pod.details = 孢子。 可能是人工合成的生命形式,释放对其他生物有毒的气体,极具侵略性。 在某些条件下高度易燃。 +item.blast-compound.description = 用作炸弹或爆炸性弹药。 +item.pyratite.description = 用于火焰发射类武器和使用燃料的发电设备。 -liquid.water.description = 用于冷却机器和废物处理。 -liquid.slag.description = 在分离器中提炼成金属成分,或作为武器弹药喷向敌人。 -liquid.oil.description = 用于先进材料生产和燃烧弹药。 -liquid.cryofluid.description = 用作反应堆、炮塔和工厂的冷却剂。 +liquid.water.description = 用于冷却机器和废物处理。 +liquid.slag.description = 在分离器中提炼成金属成分,或作为武器弹药喷向敌人。 +liquid.oil.description = 用于先进材料生产和喷射类武器。 +liquid.cryofluid.description = 用作反应堆、 炮塔和工厂的冷却剂。 -block.resupply-point.description = 为附近的部队提供铜弹药。与需要电池供电的设备不兼容。 -block.armored-conveyor.description = 将物品向前输送。不接受两侧的非传送带输入。 -block.illuminator.description = 释放光源。 -block.message.description = 保存一条文字信息。用于队友之间进行交流。 -block.graphite-press.description = 将煤炭压缩为石墨。 -block.multi-press.description = 将煤炭压缩为石墨。需要水进行冷却。 -block.silicon-smelter.description = 将沙和煤炭精炼为硅。 -block.kiln.description = 将沙和铅熔炼为钢化玻璃。 -block.plastanium-compressor.description = 用石油和钛生产塑钢。 -block.phase-weaver.description = 用钍和沙合成相织物。 -block.alloy-smelter.description = 将钛、铅、硅和铜熔合成巨浪合金。 -block.cryofluid-mixer.description = 将水和细钛粉混合制成冷冻液。 -block.blast-mixer.description = 把火石和孢子荚混合为爆炸混合物。 -block.pyratite-mixer.description = 把煤、铅和沙子混合为火石。 -block.melter.description = 将废料熔化成矿渣。 -block.separator.description = 将矿渣分离成矿物成分。 -block.spore-press.description = 将孢子荚压缩成石油。 -block.pulverizer.description = 将废料粉碎成细沙。 -block.coal-centrifuge.description = 把石油变成煤。 -block.incinerator.description = 熔融并蒸发它接收到的任何物品或液体。 -block.power-void.description = 消耗输入的所有能量。仅限沙盒。 -block.power-source.description = 无限输出能量。仅限沙盒。 -block.item-source.description = 无限输出物品。仅限沙盒。 -block.item-void.description = 销毁输入的所有物品。仅限沙盒。 -block.liquid-source.description = 无限输出液体。仅限沙盒。 -block.liquid-void.description = 移除输入的所有液体。仅限沙盒。 -block.copper-wall.description = 保护己方结构,挡下敌方炮弹。 -block.copper-wall-large.description = 保护己方结构,挡下敌方炮弹。 -block.titanium-wall.description = 保护己方结构,挡下敌方炮弹。 -block.titanium-wall-large.description = 保护己方结构,挡下敌方炮弹。 -block.plastanium-wall.description = 保护己方结构,挡下敌方炮弹。吸收激光和电弧。阻止电力节点自动连接。 -block.plastanium-wall-large.description = 保护己方结构,挡下敌方炮弹。吸收激光和电弧。阻止电力节点自动连接。 -block.thorium-wall.description = 保护己方结构,挡下敌方炮弹。 -block.thorium-wall-large.description = 保护己方结构,挡下敌方炮弹。 -block.phase-wall.description = 保护己方结构,挡下敌方炮弹。在受攻击时反射大多数子弹。 -block.phase-wall-large.description = 保护己方结构,挡下敌方炮弹。在受攻击时反射大多数子弹。 -block.surge-wall.description = 保护己方结构,挡下敌方炮弹。受攻击时有几率释放电弧。 -block.surge-wall-large.description = 保护己方结构,挡下敌方炮弹。受攻击时有几率释放电弧。 -block.door.description = 可以开关的墙。 -block.door-large.description = 可以开关的墙。 -block.mender.description = 定期修复附近的区块。\n可使用硅来提高范围和效率。 -block.mend-projector.description = 修复其附近的区块。\n可使用相织物来提高范围和效率。 -block.overdrive-projector.description = 提高附近建筑物的速度。\n可使用相织物来提高范围和效率。 -block.force-projector.description = 在自身周围创建一个六角形力场,使里面的建筑物和单位免受伤害。\n持续承受高伤害会导致过热,可以使用冷却液降温。相织物可用于增加护盾大小和盾容。 -block.shock-mine.description = 对踩到它的敌人释放电弧进行攻击。 -block.conveyor.description = 将物品向前输送。 -block.titanium-conveyor.description = 将物品向前输送。快于初级传送带。 -block.plastanium-conveyor.description = 打包物品进行运输。\n在后方输入物品,在前方三个方向输出物品。需要多个装载和卸载点才能达到最大运载量。 -block.junction.description = 两条交叉传送带的桥梁。 -block.bridge-conveyor.description = 跨越任意地形或建筑物运输物品。 -block.phase-conveyor.description = 跨越任意地形或建筑物即时运输物品。比传送带桥范围更大,但需要电力。 -block.sorter.description = 如果物品与所选种类相同,则允许其通过。否则,物品将从左边和右边输出。 -block.inverted-sorter.description = 像分类器一样处理物品,但却是向两侧输出选定的物品。 -block.router.description = 将物品平均分配到其他3个方向。 -block.router.details = 这是个好东西,也可以带来麻烦。不建议在工厂旁边使用,因为它们会被产出堵塞。 -block.distributor.description = 将物品平均分配到其他7个方向。 -block.overflow-gate.description = 当前方被阻塞时才会向左和右输出,用于处理多余的物品。 -block.underflow-gate.description = 与溢流门相反。 当左右均堵塞时才向前方运输。 -block.mass-driver.description = 长距离物品传输建筑,收集若干物品后将其射到远处的另一个质量驱动器。 -block.mechanical-pump.description = 泵送液体,不需要能量。 -block.rotary-pump.description = 泵送液体,需要能量。 -block.thermal-pump.description = 泵送液体。 -block.conduit.description = 向前传输液体。用于从泵或其他导管中提取液体。 -block.pulse-conduit.description = 向前传输液体。比普通导管更快地输送液体且能储存更多液体。 -block.plated-conduit.description = 向前传输液体。不接受侧边输入。不会发生泄露。 -block.liquid-router.description = 接受一个方向的液体并将它们平均输出到其他3个方向。同时可以储存一定量的液体。 -block.liquid-tank.description = 储存大量液体。像液体路由器向各个方向输出液体。 -block.liquid-junction.description = 两条交叉道管的桥梁。 -block.bridge-conduit.description = 跨越任意地形或建筑物运输液体。 -block.phase-conduit.description = 跨越任意地形或建筑物运输液体。比导管桥范围更大,但需要电力。 -block.power-node.description = 向连接的节点传输电力。该节点将从任何相邻的块接收电力或向其供电。 -block.power-node-large.description = 具有更大范围的高级电源节点。 -block.surge-tower.description = 可用连接较少的远程电源节点。 -block.diode.description = 仅当一侧存储的电量较少时向另一侧传输电池电量。 -block.battery.description = 储存电网多余电力,并在电网供电不足时放电。 -block.battery-large.description = 储存电网多余电力,并在电网供电不足时放电。比普通电池容量更高。 -block.combustion-generator.description = 燃烧煤等可燃材料发电。 -block.thermal-generator.description = 放置在炽热的地形上能够发电。 -block.steam-generator.description = 通过燃烧易燃材料并将水转化为蒸汽来发电。 -block.differential-generator.description = 利用低温流体与燃烧的火石之间的温差产生大量能量。 -block.rtg-generator.description = 利用放射物的衰变产生的热量以缓慢的速度产生能量。 -block.solar-panel.description = 提供少量太阳能。 -block.solar-panel-large.description = 提供少量太阳能。比标准太阳能电池板更高效。 -block.thorium-reactor.description = 从放射性的钍中产生大量的能量。需要持续冷却。如果冷却液供应不足,会剧烈爆炸。 -block.impact-reactor.description = 以最高效率产生大量的电力。但需要大量的能量输入来启动。 -block.mechanical-drill.description = 放置在矿物上时,以缓慢的速度无限输出物品。只能开采基本资源。 -block.pneumatic-drill.description = 一种改进的钻头,能开采钛。采矿速度比机械钻头快。 -block.laser-drill.description = 通过激光技术更快地开采,但需要能量。这种钻头可以开采放射性的钍。 -block.blast-drill.description = 终极钻头,需要大量能量。 -block.water-extractor.description = 从地下提取水。用于当附近没有地表水时。 -block.cultivator.description = 将微小浓度的大气中的孢子培养成孢子荚。 -block.cultivator.details = 恢复的技术。用于尽可能高效地生产大量的生物质。很可能是现在覆盖了塞普罗的最初的孢子培养器。 -block.oil-extractor.description = 使用大量能量、沙子和水钻取石油。 -block.core-shard.description = 基地的核心。一旦被摧毁,此区块就会丢失。 -block.core-shard.details = 初代核心。坚固且可自我复制。不具备星际旅行的能力。 -block.core-foundation.description = 基地的核心。装甲优良。比初代核心容量更大。 -block.core-foundation.details = 次代核心。 -block.core-nucleus.description = 基地的核心。装甲极佳。容量极大。 -block.core-nucleus.details = 三代也是终代核心。 -block.vault.description = 存储每种类型的大量物品。可使用卸载器卸载物品。 -block.container.description = 存储每种类型的少量物品。可使用卸载器卸载物品。 -block.unloader.description = 从周围方块卸载指定物品。 -block.launch-pad.description = 将货物发射至指定区块。 -block.duo.description = 交替向敌人发射子弹。 -block.scatter.description = 向敌机发射铅、废料或钢化玻璃高射炮弹。 -block.scorch.description = 焚烧任何靠近它的地面敌人。近距离高效。 -block.hail.description = 向远距离地面敌人发射小型炮弹。 -block.wave.description = 向敌人射出液体流。使用水作弹药时能够自动灭火。 -block.lancer.description = 充能并向地面单位发射强力的的波束。 -block.arc.description = 向地面单位发射电弧。 -block.swarmer.description = 向敌人发射追踪导弹。 -block.salvo.description = 向敌人快速射击子弹。 -block.fuse.description = 向附近的敌人发射三次近距离穿透性爆炸子弹。 -block.ripple.description = 向远距离地面敌人发射密集的炮弹。 -block.cyclone.description = 向附近的敌人发射密集的高射炮弹。 -block.spectre.description = 向空中和地面目标发射大型穿甲子弹。 -block.meltdown.description = 向附近的敌人发射持续的激光束。需要供冷。 -block.foreshadow.description = 向远距离单目标射击。 -block.repair-point.description = 持续修复其附近受损最严重的单位。 -block.segment.description = 摧毁袭来的除激光以外的子弹或导弹。 -block.parallax.description = 通过牵引光束牵引空中目标,并在这个过程中对其造成伤害。 -block.tsunami.description = 向敌人射出强力的液体流。使用水作弹药时能够自动灭火。 -block.silicon-crucible.description = 从沙子和煤中提炼硅,用火石作为附加热源。在炙热地型上更高效。 -block.disassembler.description = 以低效率将矿渣分离成微量的外来矿物成分。能产生钍。 -block.overdrive-dome.description = 提高附近建筑物的速度。需要相织物和硅来工作。 -block.payload-conveyor.description = 移动大型载荷,例如从工厂生产的单位。 -block.payload-router.description = 将输入的载荷向3个方向输出。 -block.command-center.description = 使用多个不同的命令控制单位。 -block.ground-factory.description = 产生陆军单位。输出的单位可以直接使用,也可以移入重构厂进行升级。 -block.air-factory.description = 产生空军单位。输出的单位可以直接使用,也可以移入重构厂进行升级。 -block.naval-factory.description = 产生海军单位。输出的单位可以直接使用,也可以移入重构厂进行升级。 -block.additive-reconstructor.description = 将输入的单位升级到第二级。 -block.multiplicative-reconstructor.description = 将输入的单位升级到第三级。 -block.exponential-reconstructor.description = 将输入的单位升级到第四级。 -block.tetrative-reconstructor.description = 将输入的单位升级到第五级,也是最终极。 -block.switch.description = 可切换开关。状态可以用逻辑处理器读取和控制。 -block.micro-processor.description = 在循环中运行一系列逻辑指令。可用于控制单元和建筑物。 -block.logic-processor.description = 在循环中运行一系列逻辑指令。可用于控制单元和建筑物。比微型处理器快。 -block.hyper-processor.description = 在循环中运行一系列逻辑指令。可用于控制单元和建筑物。可用于控制单元和建筑物。比逻辑处理器快。 -block.memory-cell.description = 存储处理器的信息。 -block.memory-bank.description = 存储处理器的信息。内存量更大。 -block.logic-display.description = 显示处理器中的任意图形。 -block.large-logic-display.description = 显示处理器中的任意图形。 -block.interplanetary-accelerator.description = 一个巨大的电磁轨道加速器。加速核心至逃逸速度以进行星际部署。 -block.repair-turret.description = 持续修复其范围内最近的受损单位。可使用液体冷却以提高修复效率。 -block.payload-propulsion-tower.description = 长距离载荷运输建筑。向与其相链接的其它载荷驱动台发射载荷。 +block.derelict = [lightgray]废墟 +block.armored-conveyor.description = 向前方输送物品,不接受侧面的输入,除非来自其他传送带。 +block.illuminator.description = 释放光线。 +block.message.description = 保存文字信息,用于队友间进行交流。 +block.graphite-press.description = 将煤炭压缩为石墨。 +block.multi-press.description = 将煤炭压缩为石墨,需要水进行冷却。 +block.silicon-smelter.description = 将沙和煤炭精炼为硅。 +block.kiln.description = 将沙和铅熔炼为钢化玻璃。 +block.plastanium-compressor.description = 用石油和钛生产塑钢。 +block.phase-weaver.description = 用钍和沙合成相位织物。 +block.alloy-smelter.description = 将钛、 铅、 硅和铜熔合成巨浪合金。 +block.cryofluid-mixer.description = 将水和细钛粉混合制成冷冻液。 +block.blast-mixer.description = 利用硫化物和孢子荚生产炸药。 +block.pyratite-mixer.description = 把煤炭、 铅和沙子混合成硫化物。 +block.melter.description = 将废料熔化成矿渣液。 +block.separator.description = 将矿渣液分离成矿物成分。 +block.spore-press.description = 将孢子荚压缩成石油。 +block.pulverizer.description = 将废料粉碎成细沙。 +block.coal-centrifuge.description = 把石油变成煤炭。 +block.incinerator.description = 熔融并蒸发它接收到的任何物品或液体。 +block.power-void.description = 消耗输入的所有电力,仅限沙盒。 +block.power-source.description = 无限输出电力,仅限沙盒。 +block.item-source.description = 无限输出物品,仅限沙盒。 +block.item-void.description = 销毁输入的所有物品,仅限沙盒。 +block.liquid-source.description = 无限输出液体,仅限沙盒。 +block.liquid-void.description = 蒸发输入的所有液体,仅限沙盒。 +block.payload-source.description = 无限输出载荷,仅限沙盒。 +block.payload-void.description = 销毁输入的所有载荷,仅限沙盒。 +block.copper-wall.description = 保护己方建筑,挡下敌方炮弹。 +block.copper-wall-large.description = 保护己方建筑,挡下敌方炮弹。 +block.titanium-wall.description = 保护己方建筑,挡下敌方炮弹。 +block.titanium-wall-large.description = 保护己方建筑,挡下敌方炮弹。 +block.plastanium-wall.description = 保护己方建筑,挡下敌方炮弹。 能吸收激光和电弧,但也会阻止电力节点自动连接。 +block.plastanium-wall-large.description = 保护己方建筑,挡下敌方炮弹。 能吸收激光和电弧,但也会阻止电力节点自动连接。 +block.thorium-wall.description = 保护己方建筑,挡下敌方炮弹。 +block.thorium-wall-large.description = 保护己方建筑,挡下敌方炮弹。 +block.phase-wall.description = 保护己方建筑,挡下敌方炮弹。 受大多数子弹攻击时有概率将其反弹。 +block.phase-wall-large.description = 保护己方建筑,挡下敌方炮弹。 受大多数子弹攻击时有概率将其反弹。 +block.surge-wall.description = 保护己方建筑,挡下敌方炮弹。 受攻击时间断释放电弧。 +block.surge-wall-large.description = 保护己方建筑,挡下敌方炮弹。 受攻击时间断释放电弧。 +block.door.description = 可以开关的墙。 +block.door-large.description = 可以开关的墙。 +block.mender.description = 定期修复附近的建筑。 \n可使用硅来提高范围和效率。 +block.mend-projector.description = 定期修复附近的建筑。 \n可使用相位织物来提高范围和效率。 +block.overdrive-projector.description = 提升附近建筑的工作效率。 \n可使用相位织物来提高范围和效率。 +block.force-projector.description = 在自身周围创建一个六边形力场,使里面的建筑和单位免受伤害。 \n承受过多伤害会导致过热,可以使用冷却液降温。 相位织物可用于增加护盾尺寸。 +block.shock-mine.description = 对踩到它的敌人释放电弧进行攻击。 +block.conveyor.description = 将物品向前方输送。 +block.titanium-conveyor.description = 将物品向前方输送,比初级传送带更快。 +block.plastanium-conveyor.description = 打包物品进行运输。 \n从后方输入物品,向前方三个方向输出物品。 需要多个装载和卸载点才能达到最大吞吐量。 +block.junction.description = 两条交叉传送带的桥梁。 +block.bridge-conveyor.description = 跨越任意地形或建筑运输物品。 +block.phase-conveyor.description = 跨越任意地形或建筑即时运输物品。 比传送带桥范围更大,但需要电力。 +block.sorter.description = 如果物品与所选种类相同,则允许其通过。 否则,物品将向两侧输出。 +block.inverted-sorter.description = 像分类器一样处理物品,不过是向两侧输出所选的物品。 +block.router.description = 将物品平均分配到其他3个方向。 +block.router.details = 这是个好东西,但也会带来麻烦。 不建议在工厂旁边使用,因为它们会被产出堵塞。 +block.distributor.description = 将物品平均分配到其他7个方向。 +block.overflow-gate.description = 当前方被阻塞时才会向两侧输出,用于处理多余的物品。 +block.underflow-gate.description = 与溢流门相反,当两侧均堵塞时才向前方运输。 +block.mass-driver.description = 远距离物品传输建筑,收集若干物品后将其发射到远处的另一个质量驱动器。 +block.mechanical-pump.description = 泵送液体,不需要电力。 +block.rotary-pump.description = 泵送液体,需要电力。 +block.thermal-pump.description = 泵送液体,需要大量电力。 +block.conduit.description = 向前方传输液体。 与泵或者其他导管联合使用。 +block.pulse-conduit.description = 向前方传输液体。 比普通导管传输液体更快,且能储存更多液体。 +block.plated-conduit.description = 向前方传输液体,不接受侧面输入。 不会发生泄露。 +block.liquid-router.description = 接受一个方向的液体输入,并平均输出到其他3个方向。 可以储存一定量的液体。 +block.liquid-tank.description = 储存大量液体,并像液体路由器一样朝各个方向输出液体。 +block.liquid-junction.description = 两条交叉导管的桥梁。 +block.bridge-conduit.description = 跨越任意地形或建筑物传输液体。 +block.phase-conduit.description = 跨越任意地形或建筑物传输液体。 比导管桥范围更大,但需要电力。 +block.power-node.description = 向连接的其他节点传输电力,也能从相邻的建筑接收电力或向其供电。 +block.power-node-large.description = 具有更大范围的高级电力节点。 +block.surge-tower.description = 用于远距离连接的电力节点,但连接数较少。 +block.diode.description = 单向传输电力,仅当此方向上电力储备较少时起作用。 +block.battery.description = 储存电网多余电力,并在电网供电不足时放电。 +block.battery-large.description = 储存电网多余电力,并在电网供电不足时放电。 比普通电池容量更高。 +block.combustion-generator.description = 燃烧煤炭之类的可燃材料发电。 +block.thermal-generator.description = 放置在炽热的地形上能够发电。 +block.steam-generator.description = 通过燃烧易燃材料并将水转化为蒸汽来发电。 +block.differential-generator.description = 利用低温流体与燃烧的硫化物之间的温差产生大量电力。 +block.rtg-generator.description = 利用放射物衰变产生的热量缓慢地产生电力。 +block.solar-panel.description = 利用太阳能产生少量电力。 +block.solar-panel-large.description = 利用太阳能产生少量电力,比标准太阳能电池板更高效。 +block.thorium-reactor.description = 从放射性的钍中产生大量的电力,需要持续冷却。 如果冷却液供应不足,会剧烈爆炸。 +block.impact-reactor.description = 达到最高效率时能产生巨量电力,但也需要大量的电力输入来启动。 +block.mechanical-drill.description = 放置在矿物上时,以缓慢的速度无限输出物品。 只能开采基本资源。 +block.pneumatic-drill.description = 一种改进的钻头,能开采钛。 采矿速度比机械钻头快。 +block.laser-drill.description = 通过激光技术更快地开采,但需要电力。 这种钻头可以开采放射性的钍。 +block.blast-drill.description = 终极钻头,需要大量电力。 +block.water-extractor.description = 从地下提取水,适用于附近没有地表水的情况。 +block.cultivator.description = 将大气中低浓度的孢子培养成孢子荚。 +block.cultivator.details = 一种失传已久的技术,用于尽可能高效地生产大量生物质。 现在覆盖了塞普罗的孢子,最初的培养设备可能就是它。 +block.oil-extractor.description = 使用沙子、 水和大量电力来钻取石油。 +block.core-shard.description = 基地的核心。 一旦被摧毁,此区块就会丢失。 +block.core-shard.details = 初代核心,坚固且能够自我维持。 不具备星际旅行的能力。 +block.core-foundation.description = 基地的核心。 装甲优良。 比初代核心容量更大。 +block.core-foundation.details = 次代核心。 +block.core-nucleus.description = 基地的核心。 装甲极佳,容量极大。 +block.core-nucleus.details = 三代也是终代核心。 +block.vault.description = 大量存储各种类型的物品。 可使用装卸器卸载物品。 +block.container.description = 少量存储各种类型的物品。 可使用装卸器卸载物品。 +block.unloader.description = 从周围的建筑卸载指定物品。 +block.launch-pad.description = 将货物发射至指定区块。 +block.duo.description = 交替向敌人发射子弹。 +block.scatter.description = 向敌方战机发射铅、 废料或钢化玻璃高射炮弹。 +block.scorch.description = 焚烧任何靠近它的地面敌人。 近距离内十分有效。 +block.hail.description = 向远距离地面敌人发射小型炮弹。 +block.wave.description = 向敌人喷射液体流。 使用水作弹药时能够自动灭火。 +block.lancer.description = 充能并向地面单位发射强力能量束。 +block.arc.description = 向地面单位发射电弧。 +block.swarmer.description = 向敌人发射追踪导弹。 +block.salvo.description = 快速地向敌人齐射子弹。 +block.fuse.description = 向附近的敌人发射三发近距离穿透性爆炸子弹。 +block.ripple.description = 向远距离地面敌人发射密集的炮弹。 +block.cyclone.description = 向附近的敌人发射密集的爆炸子弹。 +block.spectre.description = 向空中和地面目标发射大型穿甲子弹。 +block.meltdown.description = 充能并向附近的敌人发射持续的激光束。 需要冷却液才能工作。 +block.foreshadow.description = 向远距离单个目标射击。 优先攻击生命值上限较高的单位。 +block.repair-point.description = 持续修复范围内受损的单位。 +block.segment.description = 摧毁来袭的子弹或导弹,对激光无效。 +block.parallax.description = 通过牵引光束拉扯空中目标,并对其造成伤害。 +block.tsunami.description = 向敌人喷射强力的液体流。 使用水作弹药时能够自动灭火。 +block.silicon-crucible.description = 从沙子和煤中提炼硅,用硫化物作为附加热源。 在炙热地形上更高效。 +block.disassembler.description = 以低效率将矿渣液分离成微量的外来矿物成分。 能产生钍。 +block.overdrive-dome.description = 提高附近建筑物的工作效率。 需要相位织物和硅来工作。 +block.payload-conveyor.description = 运送大型载荷,例如从工厂生产的单位。 +block.payload-router.description = 将输入的载荷向3个方向轮流输出。 +block.command-center.description = 通过若干命令来控制所有单位的行为。 +block.ground-factory.description = 生产陆军单位。 产出的单位可以直接投入战场,也可以送入重构工厂进行升级。 +block.air-factory.description = 生产空军单位。 产出的单位可以直接投入战场,也可以送入重构工厂进行升级。 +block.naval-factory.description = 生产海军单位。 产出的单位可以直接投入战场,也可以送入重构工厂进行升级。 +block.additive-reconstructor.description = 将输入的单位升级到第二级。 +block.multiplicative-reconstructor.description = 将输入的单位升级到第三级。 +block.exponential-reconstructor.description = 将输入的单位升级到第四级。 +block.tetrative-reconstructor.description = 将输入的单位升级到第五级,即最终极。 +block.switch.description = 可切换的开关。 开关状态可以用逻辑处理器读取和控制。 +block.micro-processor.description = 循环运行一系列逻辑指令,可用于控制单位和建筑物。 +block.logic-processor.description = 循环运行一系列逻辑指令,可用于控制单位和建筑物。 比微型处理器更快。 +block.hyper-processor.description = 循环运行一系列逻辑指令,可用于控制单位和建筑物。 比逻辑处理器更快。 +block.memory-cell.description = 存储处理器的信息。 +block.memory-bank.description = 存储处理器的信息。 容量更大。 +block.logic-display.description = 显示处理器中绘制的各种图形。 +block.large-logic-display.description = 显示处理器中绘制的各种图形。 +block.interplanetary-accelerator.description = 一个巨大的电磁轨道加速器。 将核心加速至逃逸速度以进行星际部署。 +block.repair-turret.description = 持续修复范围内受损的单位。 可以用冷却液强化。 +block.payload-propulsion-tower.description = 远距离的载荷运送建筑。 向相连的其他载荷驱动器发射载荷。 -unit.dagger.description = 向附近所有敌人发射标准子弹。 -unit.mace.description = 向附近所有敌人喷射火焰。 -unit.fortress.description = 向附近所有地面敌人发射远程火炮。 -unit.scepter.description = 向附近所有敌人发射一串电荷弹。 -unit.reign.description = 向附近所有敌人发射巨型穿甲弹。 -unit.nova.description = 发射激光弹攻击敌人并修复友方建筑。能够飞行。 -unit.pulsar.description = 发射数条电弧攻击敌人并修复友方建筑。能够飞行。 -unit.quasar.description = 发射穿透性激光束攻击敌人并修复友方建筑。能够飞行。拥有护盾。 -unit.vela.description = 发射巨型持续激光束攻击敌人,点燃敌人并修复友方建筑。能够飞行。 -unit.corvus.description = 发射巨型爆破激光束攻击敌人并修复友方建筑。可以跨越大多数地形。 -unit.crawler.description = 冲向敌人并自毁,造成大爆炸。 -unit.atrax.description = 向地面敌人发射削弱性矿渣球。可以跨越大多数地形。 -unit.spiroct.description = 向敌人发射激光束,并在此过程中自我修复。可以跨越大多数地形。 -unit.arkyid.description = 向敌人发射大型激光束,并在此过程中自我修复。可以跨越大多数地形。 -unit.toxopid.description = 向敌人发射大型电能集束炮弹和穿透性激光。可以跨越大多数地形。 -unit.flare.description = 向附近所有地面敌人发射标准子弹。 -unit.horizon.description = 向地面敌人投下炸弹簇。 -unit.zenith.description = 向附近所有敌人发射导弹群。 -unit.antumbra.description = 向附近所有敌人发射弹幕。 -unit.eclipse.description = 向附近所有敌人发射两道穿透性激光和一连串子弹。 -unit.mono.description = 自动开采铜和铅,并将其放入核心中。 -unit.poly.description = 自动重建被摧毁的建筑并协助其他单位建造。 -unit.mega.description = 自动修复受损结构。能够携带方块和小型地面部队。 -unit.quad.description = 向地面敌人投掷大型炸弹,修复友方建筑并攻击敌人。能够携带中型地面部队。 -unit.oct.description = 用它的再生护盾保护附近的友方单位。能够携带大多数地面部队。 -unit.risso.description = 向附近所有敌人发射一连串的导弹和子弹。 -unit.minke.description = 向附近所有敌人发射炮弹和标准子弹。 -unit.bryde.description = 向附近所有敌人发射远程炮弹和导弹。 -unit.sei.description = 向附近所有敌人发射一连串的导弹和穿甲弹。 -unit.omura.description = 向附近所有敌人发射远程穿透轨道炮。构造星辉单位。 -unit.alpha.description = 保护初代核心。可建造建筑。 -unit.beta.description = 保护次代核心。可建造建筑。 -unit.gamma.description = 保护终代核心。可建造建筑。 -unit.retusa.description = 在附近放置水雷并修复友方建筑。 -unit.oxynoe.description = 向附近所有敌人喷射火焰并修复友方建筑。使用点防御摧毁附近的敌方射弹。 -unit.cyerce.description = 向附近所有敌人发射跟踪集束导弹并修复友方建筑。 -unit.aegires.description = 电击一切在它能量场范围内的敌方单位和建筑并修复所有友方单位和建筑。 -unit.navanax.description = 发射电磁脉冲爆弹,破坏敌方电网并修复友方建筑。使用四门自动激光炮塔融化附近所有敌人。 +unit.dagger.description = 向附近的敌人发射标准子弹。 +unit.mace.description = 向附近的敌人喷射火焰。 +unit.fortress.description = 向地面敌人发射远距离火炮。 +unit.scepter.description = 向敌人快速发射带电子弹。 +unit.reign.description = 向敌人快速发射大型穿透子弹。 +unit.nova.description = 发射激光弹来攻击敌人并修复友方建筑。 能够助推。 +unit.pulsar.description = 发射电弧来攻击敌人并修复友方建筑。 能够助推。 +unit.quasar.description = 发射穿透性激光束来攻击敌人并修复友方建筑。 能够助推。 拥有护盾。 +unit.vela.description = 发射巨大的持续激光束攻击敌人并引起燃烧,修复友方建筑。 能够助推。 +unit.corvus.description = 发射巨大的爆发激光束,摧毁敌人并修复友方建筑。 可以跨越大多数地形。 +unit.crawler.description = 冲向敌人并自毁,造成大范围爆炸。 +unit.atrax.description = 向地面目标发射削弱性的球状矿渣液。 可以跨越大多数地形。 +unit.spiroct.description = 向敌人发射较弱的激光束,并在此过程中自我修复。 可以跨越大多数地形。 +unit.arkyid.description = 向敌人发射大型激光束,并在此过程中自我修复。 可以跨越大多数地形。 +unit.toxopid.description = 向敌人发射大型带电集束炮弹和穿透激光。 可以跨越大多数地形。 +unit.flare.description = 向附近的地面敌人发射标准子弹。 +unit.horizon.description = 向正下方的地面敌人投掷炸弹。 +unit.zenith.description = 向附近的敌人发射多枚导弹。 +unit.antumbra.description = 向附近的敌人发射密集的子弹。 +unit.eclipse.description = 向附近的敌人发射穿透性激光和爆炸性炮弹。 +unit.mono.description = 自动开采铜和铅,并将其放入核心中。 +unit.poly.description = 自动重建已摧毁的建筑,并在其他单位进行建造时提供协助。 +unit.mega.description = 自动修复受损建筑。 能够携带建筑和小型地面单位。 +unit.quad.description = 向地面目标投掷大型炸弹,修复友方建筑并摧毁敌人。 \n能够携带中型地面单位。 +unit.oct.description = 用它的再生护盾保护附近的友方单位。 能够携带大多数地面单位。 +unit.risso.description = 向附近的敌人发射一连串的导弹和子弹。 +unit.minke.description = 向附近的敌人发射炮弹和标准子弹。 +unit.bryde.description = 向敌人远距离发射炮弹和导弹。 +unit.sei.description = 向敌人发射一连串的导弹和穿甲弹。 +unit.omura.description = 向敌人发射远程穿透轨道炮。 可自动生产星辉单位。 +unit.alpha.description = 保护初代核心,可建造建筑。 +unit.beta.description = 保护次代核心,可建造建筑。 +unit.gamma.description = 保护终代核心,可建造建筑。 +unit.retusa.description = 放置水雷,并修复友方单位。 +unit.oxynoe.description = 向附近的敌人发射火焰束,并修复友方建筑。 具备一台单点防御炮塔,能够防御来袭的子弹。 +unit.cyerce.description = 向敌人发射追踪集束导弹,并修复友方单位。 +unit.aegires.description = 产生能量场,使范围内的敌方建筑与单位受到电击,对友方则进行修复。 +unit.navanax.description = 发射大型电磁爆弹,对敌方电网造成显著破坏并修复友方建筑。 搭载4台自动激光炮台,能熔化靠近的敌人。 lst.read = 从连接的内存读取数字 -lst.write = 写入数字到连接的内存 -lst.print = 添加文字到打印缓存\n用了[accent]Print Flush[]才会显示 -lst.draw = 添加操作到绘图队列\n用了[accent]Draw Flush[]才会显示 -lst.drawflush = 刷新列队的[accent]Draw[]操作到显示屏 -lst.printflush = 刷新[accent]Print[]缓存的文字到消息板 -lst.getlink = 获取处理器连接\n索引从0开始 +lst.write = 向连接的内存写入数字 +lst.print = 添加文字到打印缓存\n使用[accent]Print Flush[]后才会真正显示 +lst.draw = 添加绘图操作到绘图缓存\n使用[accent]Draw Flush[]后才会真正显示 +lst.drawflush = 将绘图缓存中的[accent]Draw[]队列刷新到显示屏 +lst.printflush = 将打印缓存中的[accent]Print[]队列刷新到信息板 +lst.getlink = 获取与处理器连接的建筑\n建筑编号从0开始 lst.control = 控制建筑 -lst.radar = 定位建筑周边的单位\n有范围限制 -lst.sensor = 从建筑或单位取得数据 -lst.set = 设置变量 -lst.operation = 操作一两个变量 -lst.end = 跳至指令栈顶\n(第一条语句) -lst.wait = 等待指定的秒数。 -lst.lookup = 通过ID寻找特定的物品/液体/单位/块的类型。\n查找每个类型的总数量可以使用:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[] -lst.jump = 有条件地跳到另一语句 -lst.unitbind = 绑定下一个某型号单位\n并存到[accent]@unit[] -lst.unitcontrol = 控制绑定的单位 -lst.unitradar = 定位绑定的单位周围的单位 -lst.unitlocate = 定位指定类型的建筑或位置\n全图范围,需要绑定单位 +lst.radar = 让建筑搜寻感知范围内的单位 +lst.sensor = 从建筑或者单位中获取数据 +lst.set = 给变量赋值 +lst.operation = 使用1至2个参数执行运算/函数 +lst.end = 跳转至第一条指令 +lst.wait = 等待指定的秒数 +lst.lookup = 根据ID查阅一种物品/液体/单位/建筑\n各个分类中的项目总数是\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[] +lst.jump = 根据条件判断,决定是否跳转至另一条指令 +lst.unitbind = 绑定某个类型的下一个单位\n并保存至[accent]@unit[] +lst.unitcontrol = 控制已绑定的单位 +lst.unitradar = 让绑定的单位搜寻感知范围内的其他单位 +lst.unitlocate = 让绑定的单位搜寻整个地图中特定的建筑或位置 -logic.nounitbuild = [red]这儿不允许处理器控制单位去建设 +logic.nounitbuild = [red]此处不允许处理器操控单位去建设 -lenum.type = 建筑和单位的类型,不是字串\n比如路由器返回[accent]@router[] -lenum.shoot = 瞄准/射击某个位置 -lenum.shootp = 按提前量瞄准/射击目标 -lenum.configure = 建筑配置,比如分拣器分拣的物品 -lenum.enabled = 建筑的启用状态 +lenum.type = 建筑和单位的类型,返回一个“类型”而非字符串\n例如对路由器使用,会返回[accent]@router[] +lenum.shoot = 向某个位置瞄准/射击 +lenum.shootp = 根据提前量向某个单位或建筑瞄准/射击 +lenum.config = 建筑设置,例如分类器所设置的筛选物品种类 +lenum.enabled = 建筑是否已启用 laccess.color = 照明器发光的颜色 -laccess.controller = 单位控制者\n如果是处理器,返回处理器\n如果在编队中,返回领队\n其他的,返回单位自己 -laccess.dead = 单位或建筑是不是死了或无效了 -laccess.controlled = 若单位控制者是处理器,返回[accent]@ctrlProcessor[]\n若单位/建筑由玩家控制,返回[accent]@ctrlPlayer[]\n若单位在编队中,返回[accent]@ctrlFormation[]\n其他的,返回0 -laccess.commanded = [red]已弃用,将被移除![]\n应该使用[accent]controlled[] -laccess.progress = 动作进度, 范围0~1。\n返回方块生产、炮塔装填或建造的进度。 +laccess.controller = 单位的控制方\n如果单位由处理器控制,返回对应的处理器\n如果单位在编队中,返回编队的领队\n其他情况,返回单位自身 +laccess.dead = 单位或建筑是否已被摧毁或者已失效 +laccess.controlled = 若单位的控制方是处理器,返回[accent]@ctrlProcessor[]\n若单位/建筑由玩家控制,返回[accent]@ctrlPlayer[]\n若单位在编队中,返回[accent]@ctrlFormation[]\n其他情况,返回0 +laccess.commanded = [red]已废弃,将被移除![]\n已由[accent]controlled[]替代 +laccess.progress = 进度,0到1之间的数值。 \n返回工厂生产、 炮塔装填,或者建筑建造的进度 -graphicstype.clear = 用指定颜色填满显示屏 -graphicstype.color = 设置后续画图操作的颜色 -graphicstype.stroke = 设置线宽 -graphicstype.line = 画线段 -graphicstype.rect = 填充矩形 -graphicstype.linerect = 画矩形框 -graphicstype.poly = 填充正多边形 -graphicstype.linepoly = 画正多边形框 -graphicstype.triangle = 填充三角形 -graphicstype.image = 画出游戏内容的图像\n比如,[accent]@router[]和[accent]@dagger[] +graphicstype.clear = 用指定的颜色填充整个显示屏 +graphicstype.color = 设置后续画图操作所使用的颜色 +graphicstype.stroke = 设置线条宽度 +graphicstype.line = 绘制线段 +graphicstype.rect = 绘制实心矩形 +graphicstype.linerect = 绘制矩形轮廓 +graphicstype.poly = 绘制实心正多边形 +graphicstype.linepoly = 绘制正多边形轮廓 +graphicstype.triangle = 绘制实心三角形 +graphicstype.image = 画出某个游戏内容的图像\n例如[accent]@router[]或者[accent]@dagger[] -lenum.always = 总是跳转 -lenum.idiv = 整除 +lenum.always = 无条件跳转 +lenum.idiv = 整数除法,返回不带小数的商 lenum.div = 除法,除以0时返回[accent]null[] -lenum.mod = 取余数 -lenum.equal = 相等。有转换\nnull比较数字时算作0,非null对象算作1 -lenum.notequal = 不相等。有转换 -lenum.strictequal = 严格相等。不转换\n可用于检查[accent]null[] +lenum.mod = 求除法的余数 +lenum.equal = 相等。 转换参数类型后进行比较\n与数字进行比较时,null转换为0,非null对象转换为1 +lenum.notequal = 不相等。 转换参数类型后进行比较 +lenum.strictequal = 严格相等。 不转换参数类型\n可用于准确检查[accent]null[]对象 lenum.shl = 左移位 lenum.shr = 右移位 lenum.or = 按位或 @@ -1651,92 +1678,92 @@ lenum.and = 按位与 lenum.not = 按位非 lenum.xor = 按位异或 -lenum.min = 取小的那个数 -lenum.max = 取大的那个数 -lenum.angle = 方位角° -lenum.len = 原点到该点距离 +lenum.min = 取较小值 +lenum.max = 取较大值 +lenum.angle = 返回向量的辐角(角度制) +lenum.len = 返回向量的长度 -lenum.sin = 正弦°(对边:斜边) -lenum.cos = 余弦°(邻边:斜边) -lenum.tan = 正切°(对边:邻边) +lenum.sin = 正弦(角度制) +lenum.cos = 余弦(角度制) +lenum.tan = 正切(角度制) -lenum.asin = 反正弦 -lenum.acos = 反余弦 -lenum.atan = 反正切 +lenum.asin = 反正弦(角度制) +lenum.acos = 反余弦(角度制) +lenum.atan = 反正切(角度制) -#not a typo, look up 'range notation' -lenum.rand = [0, 值) 范围内随机数 -lenum.log = 自然对数(ln) -lenum.log10 = 10底对数 +#not a typo, look up 'range notation'(括号不配非笔误,实乃区间表示法) +lenum.rand = 取 [0, 参数) 范围内的一个随机数 +lenum.log = 自然对数(ln) +lenum.log10 = 以10为底的对数 lenum.noise = 二维单形噪声 lenum.abs = 绝对值 -lenum.sqrt = 二次方根 +lenum.sqrt = 开平方 lenum.any = 任意单位 lenum.ally = 友方单位 lenum.attacker = 有武器的单位 lenum.enemy = 敌方单位 lenum.boss = Boss单位 -lenum.flying = 飞行单位 +lenum.flying = 空中单位 lenum.ground = 地面单位 lenum.player = 玩家控制的单位 -lenum.ore = 矿床 +lenum.ore = 矿脉 lenum.damaged = 受损的友方建筑 -lenum.spawn = 敌人出生点\n可能是核心或地点 -lenum.building = 分组内的建筑 +lenum.spawn = 敌人出生点\n可以是核心或者某个坐标 +lenum.building = 某个分类下的建筑 lenum.core = 核心 -lenum.storage = 容器/仓库 +lenum.storage = 仓储建筑(容器/仓库) lenum.generator = 发电建筑 -lenum.factory = 工厂 +lenum.factory = 生产物品的工厂 lenum.repair = 维修点 lenum.rally = 指挥中心 lenum.battery = 电池 -lenum.resupply = 补给点\n仅当启用[accent]“单位弹药”[]时有用 +lenum.resupply = 补给点\n仅当启用了[accent]“单位有弹药限制”[]时生效 lenum.reactor = 钍反应堆/冲击反应堆 lenum.turret = 炮塔 -sensor.in = 要传感的建筑或单位 +sensor.in = 所获取数据的建筑或单位 -radar.from = 要实施探测的建筑\n探测距离受限于建筑范围 -radar.target = 筛选要探测的单位 -radar.and = 更多筛子 -radar.order = 排序:1(true)从小到大 0(false)反序 -radar.sort = 排序的量度 -radar.output = 输出单位的变量 +radar.from = 以哪个建筑为中心展开搜寻\n搜寻距离受限于该建筑的感知范围 +radar.target = 筛选搜寻的单位类型 +radar.and = 额外的筛选条件 +radar.order = 排序方式:1/true 从小到大,0/false 反之 +radar.sort = 排序标准 +radar.output = 找到的单位存入此变量 -unitradar.target = 筛选要探测的单位 -unitradar.and = 更多筛子 -unitradar.order = 排序:1(true)从小到大 0(false)反序 -unitradar.sort = 排序的量度 -unitradar.output = 输出单位的变量 +unitradar.target = 筛选搜寻的单位类型 +unitradar.and = 额外的筛选条件 +unitradar.order = 排序方式:1/true 从小到大,0/false 反之 +unitradar.sort = 排序标准 +unitradar.output = 找到的单位存入此变量 control.of = 要控制的建筑 control.unit = 要瞄准的单位或建筑 control.shoot = 是否射击 -unitlocate.enemy = 定位敌方还是我方建筑 -unitlocate.found = 有没有找到 -unitlocate.building = 找到的建筑的输出变量 -unitlocate.outx = 输出X坐标 -unitlocate.outy = 输出Y坐标 -unitlocate.group = 要找的建筑组 +unitlocate.enemy = 是否搜寻敌方建筑(0或false则搜寻友方建筑) +unitlocate.found = 若找到,在此变量中存入true;未找到则存入false +unitlocate.building = 找到的建筑存入此变量 +unitlocate.outx = 存入找到的X轴坐标 +unitlocate.outy = 存入找到的Y轴坐标 +unitlocate.group = 所搜寻的建筑分类 -lenum.idle = 不移动,但进行采矿/修建\n默认状态 -lenum.stop = 停止移动/采矿/修建 +lenum.idle = 原地不动,但继续进行手上的采矿/建造动作\n单位的默认状态 +lenum.stop = 停止移动/采矿/建造动作 lenum.move = 移动到某个位置 -lenum.approach = 接近到某个圆形区域 -lenum.pathfind = 找路去敌人出生点 -lenum.target = 瞄准/射击某个位置 -lenum.targetp = 按提前量瞄准/射击目标 -lenum.itemdrop = 放物品到建筑 -lenum.itemtake = 从建筑拿物品 -lenum.paydrop = 放下当前载荷 -lenum.paytake = 从地上拿起载荷 -lenum.flag = 数字值的单位旗标 -lenum.mine = 采矿 -lenum.build = 修建结构 -lenum.getblock = 获取某坐标的建筑和类型\n坐标需在单位范围内\n或单位在建筑范围内\n地形物类型是[accent]@solid[]或[accent]@air[] -lenum.within = 检查单位在不在半径内 +lenum.approach = 靠近某个位置至一定的距离内 +lenum.pathfind = 寻路移动至敌人出生点 +lenum.target = 向某个位置瞄准/射击 +lenum.targetp = 根据提前量向某个目标瞄准/射击 +lenum.itemdrop = 将携带的物品放入一座建筑 +lenum.itemtake = 从建筑中取出某种物品 +lenum.paydrop = 卸下当前载荷 +lenum.paytake = 从当前位置拾取载荷 +lenum.flag = 给单位赋予数字形式的标记 +lenum.mine = 从某个位置采集矿物 +lenum.build = 建造建筑 +lenum.getblock = 获取某个坐标处的建筑及其类型\n坐标需要在单位的感知范围内\n无建筑的地面返回[accent]@air[],墙壁返回[accent]@solid[] +lenum.within = 检查单位是否接近了某个位置 lenum.boost = 开始/停止助推 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 161565aea2..9380c166cd 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -78,13 +78,12 @@ schematic.tagexists = 該標籤已存在。 stats = 統計 stat.wave = 打敗的波次:[accent]{0} -stat.enemiesDestroyed = 摧毀的敵人:[accent]{0} +stat.unitsCreated = 建造單位數:[accent] {0} +stat.enemiesDestroyed = 摧毀敵人數:[accent]{0} stat.built = 建設的建築:[accent]{0} stat.destroyed = 摧毀的建築:[accent]{0} stat.deconstructed = 拆除的建築:[accent]{0} -stat.delivered = 發射的核心資源: stat.playtime = 遊玩時間:[accent] {0} -stat.rank = 最終排名:[accent]{0} globalitems = [accent]全域物品 map.delete = 確認要刪除「[accent]{0}[]」地圖嗎? @@ -93,7 +92,8 @@ level.select = 選擇關卡 level.mode = 遊戲模式: coreattack = 〈核心正在受到攻擊!〉 nearpoint = 【[scarlet]立即離開空降區[]】\n湮滅即將來臨 -database = 核心數據庫 +database = 核心資料庫 +database.button = 資料庫 savegame = 儲存遊戲 loadgame = 載入遊戲 joingame = 多人連線 @@ -169,6 +169,7 @@ launchcore = 發射核心 filename = 檔案名稱︰ unlocked = 已解鎖新內容! available = 可研究新科技! +unlock.incampaign = <在戰役中解鎖> completed = [accent]完成 techtree = 科技樹 research.legacy = [accent]5.0[] 偵測到舊有科技資料。\n請問要[accent]載入[]資料,還是[accent]放棄[]並重置新戰役的科技樹(建議)? @@ -345,9 +346,9 @@ custom = 自訂 builtin = 内建 map.delete.confirm = 確認要刪除地圖嗎?此動作無法復原! map.random = [accent]隨機地圖 -map.nospawn = 這個地圖沒有核心!請在編輯器中添加一個[accent]橘色[]的核心。 +map.nospawn = 這個地圖沒有核心!請在編輯器中添加一個[#{0}]{1}[]的核心。 map.nospawn.pvp = 這個地圖沒有敵對核心讓玩家重生!請在編輯器中添加一個[scarlet]不是橘色[]的核心。 -map.nospawn.attack = 這個地圖沒有敵人核心可以攻擊!請在編輯器中添加一個[scarlet]紅色[]的核心。 +map.nospawn.attack = 這個地圖沒有敵人核心可以攻擊!請在編輯器中添加一個[#{0}]{1}[]的核心。 map.invalid = 地圖載入錯誤:地圖可能已經損毀。 workshop.update = 更新項目 workshop.error = 擷取工作坊詳細資訊時出錯:{0} @@ -385,7 +386,8 @@ waves.waves = 波次 waves.perspawn = 每次生成 waves.shields = 護盾/波次 waves.to = 至 -waves.guardian = 頭目 +waves.max = 最大單位數 +waves.guardian = 守衛者 waves.preview = 預覽 waves.edit = 編輯…… waves.copy = 複製到剪貼簿 @@ -393,6 +395,11 @@ waves.load = 從剪貼簿載入 waves.invalid = 剪貼簿中的波次無效。 waves.copied = 波次已複製。 waves.none = 無自訂敵人。\n請注意,若沒有波次佈局將自動替換為預設佈局。 +waves.sort = 分類排序: +waves.sort.reverse = 反向排序 +waves.sort.begin = 開始 +waves.sort.health = 血量 +waves.sort.type = 兵種 #校正用空行 wavemode.counts = 數量 @@ -564,6 +571,8 @@ weather.sandstorm.name = 沙塵暴 weather.sporestorm.name = 孢子風暴 weather.fog.name = 霧 +sectorlist = 地區 +sectorlist.attacked = {0} 遭受攻擊 sectors.unexplored = [lightgray]未探索 sectors.resources = 資源: sectors.production = 生產: @@ -646,10 +655,12 @@ status.sapped.name = 被吸血 status.electrified.name = 觸電 status.spore-slowed.name = 孢子緩速 status.tarred.name = 焦油 +status.overdrive.name = 超載 status.overclock.name = 快轉 status.shocked.name = 電擊 status.blasted.name = 爆炸 status.unmoving.name = 立定 +status.boss.name = 守衛者 settings.language = 語言 settings.data = 遊戲資料 @@ -1001,6 +1012,7 @@ rules.wavetimer = 波次時間 rules.waves = 波次 rules.attack = 攻擊模式 rules.buildai = 電腦自動建築 +rules.aitier = AI 等級 rules.cleanupdeadteams = 移除戰敗玩家的建築(對戰) rules.corecapture = 佔領摧毀的核心 rules.polygoncoreprotection = 核心禁築區呈多邊形 @@ -1020,12 +1032,15 @@ rules.deconstructrefundmultiplier = 拆除資源返還比例 rules.waitForWaveToEnd = 等待所有敵人毀滅才開始下一波次 rules.dropzoneradius = 空降區半徑:[lightgray](格) rules.unitammo = 單位需要彈藥 +rules.enemyteam = 敵方隊伍 +rules.playerteam = 玩家隊伍 rules.title.waves = 波次 rules.title.resourcesbuilding = 資源與建築 rules.title.enemy = 敵人 rules.title.unit = 單位 rules.title.experimental = 實驗中 rules.title.environment = 環境 +rules.title.teams = 分隊 rules.lighting = 光照 rules.enemyLights = 敵方發光 rules.fire = 火 @@ -1432,6 +1447,8 @@ block.item-source.description = 無限輸出物品。僅限沙盒。 block.item-void.description = 不使用能量銷毀任何進入它的物品。僅限沙盒。 block.liquid-source.description = 無限輸出液體。僅限沙盒。 block.liquid-void.description = 銷毀所有輸入的液體。僅限沙盒。 +block.payload-source.description = 無限輸出原料。僅限沙盒。 +block.payload-void.description = 銷毀所有進入的原料。僅限沙盒。 block.copper-wall.description = 一種便宜的防禦方塊。\n用於前幾波防衛核心和砲塔。 block.copper-wall-large.description = 一種便宜的防禦方塊。\n用於前幾波防禦核心和砲塔\n佔據多個方塊。 block.titanium-wall.description = 一個中等強度的防禦方塊。\n提供對敵人的適度保護。 diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 2b29514b5b..a7cba12f74 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -1,6 +1,6 @@ 63743=spawn|block-spawn-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 63739=darksand-tainted-water|block-darksand-tainted-water-ui 63738=sand-water|block-sand-water-ui @@ -357,7 +357,6 @@ 63357=crux|team-crux 63358=derelict|team-derelict 63350=deep-water|block-deep-water-ui -63349=shallow-water|block-shallow-water-ui 63348=molten-slag|block-molten-slag-ui 63347=crater-stone|block-crater-stone-ui 63346=deep-tainted-water|block-deep-tainted-water-ui diff --git a/core/assets/maps/coastline.msav b/core/assets/maps/coastline.msav new file mode 100644 index 0000000000..91e8c1db83 Binary files /dev/null and b/core/assets/maps/coastline.msav differ diff --git a/core/assets/maps/navalFortress.msav b/core/assets/maps/navalFortress.msav new file mode 100644 index 0000000000..6d41f2887b Binary files /dev/null and b/core/assets/maps/navalFortress.msav differ diff --git a/core/assets/maps/planetaryTerminal.msav b/core/assets/maps/planetaryTerminal.msav index 7c45ebfca2..87e25cf290 100644 Binary files a/core/assets/maps/planetaryTerminal.msav and b/core/assets/maps/planetaryTerminal.msav differ diff --git a/core/assets/maps/stainedMountains.msav b/core/assets/maps/stainedMountains.msav index 6e00f916b1..e8511641f0 100644 Binary files a/core/assets/maps/stainedMountains.msav and b/core/assets/maps/stainedMountains.msav differ diff --git a/core/assets/sounds/build.ogg b/core/assets/sounds/build.ogg index 8235d41eb9..e39daef50b 100644 Binary files a/core/assets/sounds/build.ogg and b/core/assets/sounds/build.ogg differ diff --git a/core/src/mindustry/ClientLauncher.java b/core/src/mindustry/ClientLauncher.java index a7d1791e20..4a3fce014a 100644 --- a/core/src/mindustry/ClientLauncher.java +++ b/core/src/mindustry/ClientLauncher.java @@ -56,6 +56,9 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform 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."); 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(() -> { float result = Core.graphics.getDeltaTime() * 60f; diff --git a/core/src/mindustry/ai/BaseAI.java b/core/src/mindustry/ai/BaseAI.java index e7f4eb5270..7643d0e804 100644 --- a/core/src/mindustry/ai/BaseAI.java +++ b/core/src/mindustry/ai/BaseAI.java @@ -12,6 +12,7 @@ import mindustry.game.*; import mindustry.game.Schematic.*; import mindustry.game.Teams.*; import mindustry.gen.*; +import mindustry.maps.generators.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.defense.*; @@ -25,7 +26,6 @@ import static mindustry.Vars.*; public class BaseAI{ 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 float emptyChance = 0.01f; private static final int timerStep = 0, timerSpawn = 1, timerRefreshPath = 2; @@ -46,6 +46,7 @@ public class BaseAI{ boolean calculating, startedCalculating; int calcCount = 0; int totalCalcs = 0; + Block wallType; public BaseAI(TeamData data){ this.data = data; @@ -53,6 +54,10 @@ public class BaseAI{ 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()){ CoreBlock block = (CoreBlock)data.core().block; int coreUnits = Groups.unit.count(u -> u.team == data.team && u.type == block.unitType); @@ -271,7 +276,7 @@ public class BaseAI{ } private void tryWalls(){ - Block wall = Blocks.copperWall; + Block wall = wallType; Building spawnt = state.rules.defaultTeam.core() != null ? state.rules.defaultTeam.core() : data.team.core(); Tile spawn = spawnt == null ? null : spawnt.tile; diff --git a/core/src/mindustry/ai/BlockIndexer.java b/core/src/mindustry/ai/BlockIndexer.java index 519720e4ac..c3d6670ffb 100644 --- a/core/src/mindustry/ai/BlockIndexer.java +++ b/core/src/mindustry/ai/BlockIndexer.java @@ -50,10 +50,12 @@ public class BlockIndexer{ clearFlags(); Events.on(TilePreChangeEvent.class, event -> { + if(state.isEditor()) return; removeIndex(event.tile); }); Events.on(TileChangeEvent.class, event -> { + if(state.isEditor()) return; 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; //unregister building from building quadtree diff --git a/core/src/mindustry/ai/Pathfinder.java b/core/src/mindustry/ai/Pathfinder.java index 53870d6fc5..0d5041dd93 100644 --- a/core/src/mindustry/ai/Pathfinder.java +++ b/core/src/mindustry/ai/Pathfinder.java @@ -139,7 +139,7 @@ public class Pathfinder implements Runnable{ /** Starts or restarts the pathfinding thread. */ private void start(){ stop(); - thread = Threads.daemon(this); + thread = Threads.daemon("Pathfinder", this); } /** Stops the pathfinding thread. */ diff --git a/core/src/mindustry/ai/WaveSpawner.java b/core/src/mindustry/ai/WaveSpawner.java index c977d42a24..11e004f932 100644 --- a/core/src/mindustry/ai/WaveSpawner.java +++ b/core/src/mindustry/ai/WaveSpawner.java @@ -56,7 +56,7 @@ public class WaveSpawner{ public void spawnEnemies(){ spawning = true; - eachGroundSpawn((spawnX, spawnY, doShockwave) -> { + eachGroundSpawn(-1, (spawnX, spawnY, doShockwave) -> { if(doShockwave){ doShockwave(spawnX, spawnY); } @@ -70,7 +70,7 @@ public class WaveSpawner{ if(group.type.flying){ float spread = margin / 1.5f; - eachFlyerSpawn((spawnX, spawnY) -> { + eachFlyerSpawn(group.spawn, (spawnX, spawnY) -> { for(int i = 0; i < spawned; i++){ Unit unit = group.createUnit(state.rules.waveTeam, state.wave - 1); unit.set(spawnX + Mathf.range(spread), spawnY + Mathf.range(spread)); @@ -80,7 +80,7 @@ public class WaveSpawner{ }else{ float spread = tilesize * 2; - eachGroundSpawn((spawnX, spawnY, doShockwave) -> { + eachGroundSpawn(group.spawn, (spawnX, spawnY, doShockwave) -> { for(int i = 0; i < spawned; i++){ Tmp.v1.rnd(spread); @@ -102,12 +102,14 @@ public class WaveSpawner{ } 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()){ for(Tile spawn : spawns){ + if(filterPos != -1 && filterPos != spawn.pos()) continue; + 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()){ Building firstCore = state.teams.playerCores().first(); 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); 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){ + if(filterPos != -1 && filterPos != tile.pos()) continue; + 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 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)){ for(Building core : state.rules.waveTeam.data().cores){ + if(filterPos != -1 && filterPos != core.pos()) continue; + cons.get(core.x, core.y); } } @@ -171,7 +179,7 @@ public class WaveSpawner{ public int countFlyerSpawns(){ tmpCount = 0; - eachFlyerSpawn((x, y) -> tmpCount ++); + eachFlyerSpawn(-1, (x, y) -> tmpCount ++); return tmpCount; } diff --git a/core/src/mindustry/audio/SoundControl.java b/core/src/mindustry/audio/SoundControl.java index dde449ecae..d407198f94 100644 --- a/core/src/mindustry/audio/SoundControl.java +++ b/core/src/mindustry/audio/SoundControl.java @@ -179,7 +179,7 @@ public class SoundControl{ float avol = Core.settings.getInt("ambientvol", 100) / 100f; 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; float pan = Mathf.zero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total); diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 672d3098ef..07defd1d15 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1199,6 +1199,7 @@ public class Blocks implements ContentList{ distributor = new Router("distributor"){{ requirements(Category.distribution, with(Items.lead, 4, Items.copper, 4)); + buildCostMultiplier = 3f; size = 2; }}; diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index fb926bbc00..66686b3407 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -32,7 +32,9 @@ public class Fx{ //lifetime is how many frames it takes to fade out the trail e.lifetime = trail.length * 1.4f; - trail.shorten(); + if(!state.isPaused()){ + trail.shorten(); + } trail.drawCap(e.color, e.rotation); trail.draw(e.color, e.rotation); }), diff --git a/core/src/mindustry/content/SectorPresets.java b/core/src/mindustry/content/SectorPresets.java index e66908e247..a2655e2205 100644 --- a/core/src/mindustry/content/SectorPresets.java +++ b/core/src/mindustry/content/SectorPresets.java @@ -10,7 +10,8 @@ public class SectorPresets implements ContentList{ groundZero, craters, biomassFacility, frozenForest, ruinousShores, windsweptIslands, stainedMountains, tarFields, fungalPass, extractionOutpost, saltFlats, overgrowth, - impact0078, desolateRift, nuclearComplex, planetaryTerminal; + impact0078, desolateRift, nuclearComplex, planetaryTerminal, + coastline, navalFortress; @Override public void load(){ @@ -64,6 +65,15 @@ public class SectorPresets implements ContentList{ 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){{ difficulty = 4; useAI = false; diff --git a/core/src/mindustry/content/TechTree.java b/core/src/mindustry/content/TechTree.java index 199c81a5f8..cfd69fb61d 100644 --- a/core/src/mindustry/content/TechTree.java +++ b/core/src/mindustry/content/TechTree.java @@ -421,11 +421,11 @@ public class TechTree implements ContentList{ }); }); - node(retusa, () -> { - node(oxynoe, () -> { + node(retusa, Seq.with(new SectorComplete(windsweptIslands)), () -> { + node(oxynoe, Seq.with(new SectorComplete(coastline)), () -> { node(cyerce, () -> { 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(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) + ), () -> { + }); + }); }); }); }); diff --git a/core/src/mindustry/core/ContentLoader.java b/core/src/mindustry/core/ContentLoader.java index 88e7886438..715c22a89b 100644 --- a/core/src/mindustry/core/ContentLoader.java +++ b/core/src/mindustry/core/ContentLoader.java @@ -8,8 +8,9 @@ import arc.struct.*; import arc.util.*; import mindustry.content.*; import mindustry.ctype.*; -import mindustry.game.EventType.*; import mindustry.entities.bullet.*; +import mindustry.game.EventType.*; +import mindustry.io.*; import mindustry.mod.Mods.*; import mindustry.type.*; import mindustry.world.*; @@ -206,10 +207,16 @@ public class ContentLoader{ } public T getByName(ContentType type, String name){ - if(contentNameMap[type.ordinal()] == null){ - return null; + var map = contentNameMap[type.ordinal()]; + + 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 getByID(ContentType type, int id){ diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index 38e87b32ae..6a0d0929d9 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -218,6 +218,8 @@ public class NetClient implements ApplicationListener{ throw new ValidateException(player, "Player has sent a message above the text limit."); } + message = message.replace("\n", ""); + Events.fire(new PlayerChatEvent(player, message)); //log commands before they are handled diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index e4de6e0222..9c6ae4cd83 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -397,7 +397,9 @@ public class NetServer implements ApplicationListener{ } 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?"); }else if(found.isLocal()){ player.sendMessage("[scarlet]Local players cannot be kicked."); diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index c348bc2fda..d4368ddf15 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -114,7 +114,7 @@ public class Renderer implements ApplicationListener{ public void update(){ 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); if(Mathf.equal(camerascale, dest, 0.001f)) camerascale = dest; laserOpacity = settings.getInt("lasersopacity") / 100f; @@ -504,6 +504,8 @@ public class Renderer implements ApplicationListener{ public void showLaunch(CoreBlock coreType){ Vars.ui.hudfrag.showLaunch(); + Vars.control.input.frag.config.hideConfig(); + Vars.control.input.frag.inv.hide(); launchCoreType = coreType; launching = true; landCore = player.team().core(); diff --git a/core/src/mindustry/editor/MapEditor.java b/core/src/mindustry/editor/MapEditor.java index b603182e43..79609b22fb 100644 --- a/core/src/mindustry/editor/MapEditor.java +++ b/core/src/mindustry/editor/MapEditor.java @@ -18,7 +18,7 @@ import mindustry.world.*; import static mindustry.Vars.*; 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 MapRenderer renderer = new MapRenderer(); @@ -28,7 +28,7 @@ public class MapEditor{ private DrawOperation currentOp; private boolean loading; - public int brushSize = 1; + public float brushSize = 1; public int rotation; public Block drawBlock = Blocks.stone; public Team drawTeam = Team.sharded; @@ -227,8 +227,9 @@ public class MapEditor{ } public void drawCircle(int x, int y, Cons drawer){ - for(int rx = -brushSize; rx <= brushSize; rx++){ - for(int ry = -brushSize; ry <= brushSize; ry++){ + int clamped = (int)brushSize; + for(int rx = -clamped; rx <= clamped; rx++){ + for(int ry = -clamped; ry <= clamped; ry++){ if(Mathf.within(rx, ry, brushSize - 0.5f + 0.0001f)){ int wx = x + rx, wy = y + ry; @@ -243,8 +244,9 @@ public class MapEditor{ } public void drawSquare(int x, int y, Cons drawer){ - for(int rx = -brushSize; rx <= brushSize; rx++){ - for(int ry = -brushSize; ry <= brushSize; ry++){ + int clamped = (int)brushSize; + for(int rx = -clamped; rx <= clamped; rx++){ + for(int ry = -clamped; ry <= clamped; ry++){ int wx = x + rx, wy = y + ry; if(wx < 0 || wy < 0 || wx >= width() || wy >= height()){ diff --git a/core/src/mindustry/editor/MapEditorDialog.java b/core/src/mindustry/editor/MapEditorDialog.java index 213e4e4a83..4b0fc6b8fa 100644 --- a/core/src/mindustry/editor/MapEditorDialog.java +++ b/core/src/mindustry/editor/MapEditorDialog.java @@ -576,13 +576,11 @@ public class MapEditorDialog extends Dialog implements Disposable{ }).growX().top(); } - if(experimental){ - mid.row(); + mid.row(); - mid.table(t -> { - t.button("Cliffs", Icon.terrain, Styles.cleart, editor::addCliffs).growX().margin(9f); - }).growX().top(); - } + mid.table(t -> { + t.button("@editor.cliffs", Icon.terrain, Styles.cleart, editor::addCliffs).growX().margin(9f); + }).growX().top(); }).margin(0).left().growY(); diff --git a/core/src/mindustry/editor/MapRenderer.java b/core/src/mindustry/editor/MapRenderer.java index e5a0ce1c01..535ef0eed5 100644 --- a/core/src/mindustry/editor/MapRenderer.java +++ b/core/src/mindustry/editor/MapRenderer.java @@ -10,6 +10,7 @@ import mindustry.content.*; import mindustry.game.*; import mindustry.graphics.*; import mindustry.world.*; +import mindustry.world.blocks.environment.*; import static mindustry.Vars.*; @@ -132,6 +133,11 @@ public class MapRenderer implements Disposable{ wall.editorVariantRegions()[Mathf.randomSeed(idxWall, 0, wall.editorVariantRegions().length - 1)] : 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; offsetY = tilesize / 2f - region.height / 2f * Draw.scl; }else if(wall == Blocks.air && !tile.overlay().isAir()){ diff --git a/core/src/mindustry/editor/MapView.java b/core/src/mindustry/editor/MapView.java index 4b603ddb28..e1e0512c43 100644 --- a/core/src/mindustry/editor/MapView.java +++ b/core/src/mindustry/editor/MapView.java @@ -38,7 +38,8 @@ public class MapView extends Element implements GestureListener{ for(int i = 0; i < MapEditor.brushSizes.length; 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)); diff --git a/core/src/mindustry/editor/WaveGraph.java b/core/src/mindustry/editor/WaveGraph.java index 13c6021d93..af80ab18d6 100644 --- a/core/src/mindustry/editor/WaveGraph.java +++ b/core/src/mindustry/editor/WaveGraph.java @@ -38,8 +38,14 @@ public class WaveGraph extends Table{ 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 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 spacing = graphW / (values.length - 1); @@ -53,7 +59,7 @@ public class WaveGraph extends Table{ for(int i = 0; i < values.length; i++){ 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); } @@ -69,7 +75,7 @@ public class WaveGraph extends Table{ 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); } @@ -84,7 +90,7 @@ public class WaveGraph extends Table{ 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); } @@ -92,19 +98,23 @@ public class WaveGraph extends Table{ } //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); - for(int i = 0; i < max; i += markSpace){ - float cy = graphY + i * graphH / max, cx = graphX; - //Lines.line(cx, cy, cx + len, cy); + Draw.alpha(0.1f); + + 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); - 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); font.setColor(Color.lightGray); @@ -113,7 +123,7 @@ public class WaveGraph extends Table{ float cy = y + fh, cx = graphX + graphW / (values.length - 1) * i; 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); } } @@ -164,13 +174,24 @@ public class WaveGraph extends Table{ sum += spawned; } maxTotal = Math.max(maxTotal, sum); - maxHealth = Math.max(maxHealth,healthsum); + maxHealth = Math.max(maxHealth, healthsum); } ObjectSet usedCopy = new ObjectSet<>(used); colors.clear(); 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 -> { t.left(); 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); } + 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{ counts, totals, health; diff --git a/core/src/mindustry/editor/WaveInfoDialog.java b/core/src/mindustry/editor/WaveInfoDialog.java index 359c0b2499..10c4751bd7 100644 --- a/core/src/mindustry/editor/WaveInfoDialog.java +++ b/core/src/mindustry/editor/WaveInfoDialog.java @@ -1,9 +1,9 @@ package mindustry.editor; import arc.*; -import arc.func.*; import arc.graphics.*; import arc.math.*; +import arc.math.geom.*; import arc.scene.event.*; import arc.scene.style.*; import arc.scene.ui.*; @@ -20,6 +20,8 @@ import mindustry.type.*; import mindustry.ui.*; import mindustry.ui.dialogs.*; +import java.util.*; + import static mindustry.Vars.*; import static mindustry.game.SpawnGroup.*; @@ -68,41 +70,46 @@ public class WaveInfoDialog extends BaseDialog{ addCloseButton(); - buttons.button("@waves.edit", () -> { + buttons.button("@waves.edit", Icon.pencil, () -> { BaseDialog dialog = new BaseDialog("@waves.edit"); dialog.addCloseButton(); dialog.setFillParent(false); - dialog.cont.defaults().size(210f, 64f); - dialog.cont.button("@waves.copy", () -> { - ui.showInfoFade("@waves.copied"); - Core.app.setClipboardText(maps.writeWaves(groups)); - dialog.hide(); - }).disabled(b -> groups == null); - dialog.cont.row(); - dialog.cont.button("@waves.load", () -> { - try{ - groups = maps.readWaves(Core.app.getClipboardText()); + dialog.cont.table(Tex.button, t -> { + var style = Styles.cleart; + t.defaults().size(210f, 58f); + + t.button("@waves.copy", Icon.copy, style, () -> { + ui.showInfoFade("@waves.copied"); + Core.app.setClipboardText(maps.writeWaves(groups)); + dialog.hide(); + }).disabled(b -> groups == null).marginLeft(12f).row(); + + 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(); - }catch(Exception e){ - e.printStackTrace(); - ui.showErrorMessage("@waves.invalid"); - } - dialog.hide(); - }).disabled(b -> Core.app.getClipboardText() == null || Core.app.getClipboardText().isEmpty()); - dialog.cont.row(); - dialog.cont.button("@settings.reset", () -> ui.showConfirm("@confirm", "@settings.clear.confirm", () -> { - 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.hide(); + })).marginLeft(12f).row(); + + t.button("@clear", Icon.cancel, style, () -> ui.showConfirm("@confirm", "@settings.clear.confirm", () -> { + groups.clear(); + buildGroups(); + dialog.hide(); + })).marginLeft(12f); + }); + dialog.show(); - }).size(270f, 64f); + }).size(250f, 64f); 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.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 ? new TextureRegionDrawable(group.effect.uiIcon) : Icon.logicSmall, @@ -215,7 +229,7 @@ public class WaveInfoDialog extends BaseDialog{ groups.remove(group); table.getCell(t).pad(0f); t.remove(); - updateWaves(); + buildGroups(); }).pad(-6).size(46f).padRight(-12f); }, () -> { expandedGroup = expandedGroup == group ? null : group; @@ -303,7 +317,30 @@ public class WaveInfoDialog extends BaseDialog{ t.check("@waves.guardian", b -> { group.effect = (b ? StatusEffects.boss : null); 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); @@ -374,15 +411,15 @@ public class WaveInfoDialog extends BaseDialog{ } enum Sort{ - begin(g -> g.begin), - health(g -> g.type.health), - type(g -> g.type.id); + begin(Structs.comps(Structs.comparingFloat(g -> g.begin), Structs.comparingFloat(g -> g.type.id))), + health(Structs.comps(Structs.comparingFloat(g -> g.type.health), Structs.comparingFloat(g -> g.begin))), + type(Structs.comps(Structs.comparingFloat(g -> g.type.id), Structs.comparingFloat(g -> g.begin))); static final Sort[] all = values(); - final Floatf sort; + final Comparator sort; - Sort(Floatf sort){ + Sort(Comparator sort){ this.sort = sort; } } diff --git a/core/src/mindustry/entities/abilities/EnergyFieldAbility.java b/core/src/mindustry/entities/abilities/EnergyFieldAbility.java index 576354e7c9..1bd906dfcc 100644 --- a/core/src/mindustry/entities/abilities/EnergyFieldAbility.java +++ b/core/src/mindustry/entities/abilities/EnergyFieldAbility.java @@ -26,7 +26,7 @@ public class EnergyFieldAbility extends Ability{ public Sound shootSound = Sounds.spark; public float statusDuration = 60f * 6f; public float x, y; - public boolean hitBuildings = true; + public boolean targetGround = true, targetAir = true, hitBuildings = true, hitUnits = true; public int maxTargets = 25; public float healPercent = 2.5f; @@ -99,13 +99,15 @@ public class EnergyFieldAbility extends Ability{ all.clear(); - Units.nearby(null, rx, ry, range, other -> { - if(other != unit){ - all.add(other); - } - }); + if(hitUnits){ + Units.nearby(null, rx, ry, range, other -> { + if(other != unit && (other.isFlying() ? targetAir : targetGround)){ + all.add(other); + } + }); + } - if(hitBuildings){ + if(hitBuildings && targetGround){ Units.nearbyBuildings(rx, ry, range, b -> { if(b.team != Team.derelict || state.rules.coreCapture){ all.add(b); diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index 213c911a6b..5fc19e4f20 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -346,13 +346,7 @@ public class BulletType extends Content implements Cloneable{ } public void update(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())); - } + updateTrail(b); if(homingPower > 0.0001f && b.time >= homingDelay){ Teamc target; @@ -386,6 +380,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 public void init(){ diff --git a/core/src/mindustry/entities/comp/BuilderComp.java b/core/src/mindustry/entities/comp/BuilderComp.java index 81b59a632f..c151562835 100644 --- a/core/src/mindustry/entities/comp/BuilderComp.java +++ b/core/src/mindustry/entities/comp/BuilderComp.java @@ -94,6 +94,10 @@ abstract class BuilderComp implements Posc, Statusc, Teamc, Rotc{ if(!within(tile, finalPlaceDst)) return; + if(!headless){ + Vars.control.sound.loop(Sounds.build, tile, 0.51f); + } + if(!(tile.build instanceof ConstructBuild cb)){ 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))); diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index d4ce1bdf9c..1462800774 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -1509,6 +1509,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } } + if(cons != null){ + cons.update(); + } + if(enabled || !block.noUpdateDisabled){ updateTile(); } @@ -1521,10 +1525,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, liquids.update(updateFlow); } - if(cons != null){ - cons.update(); - } - if(power != null){ power.graph.update(); } diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index 81b78f221c..36207abd35 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -11,7 +11,6 @@ import arc.util.*; import mindustry.ai.*; import mindustry.ai.types.*; import mindustry.annotations.Annotations.*; -import mindustry.content.*; import mindustry.core.*; import mindustry.ctype.*; import mindustry.entities.*; @@ -486,12 +485,13 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I if(!spawnedByCore){ 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; Effect.scorch(x, y, (int)(hitSize / 5)); - Fx.explosion.at(this); Effect.shake(shake, shake, 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(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){ diff --git a/core/src/mindustry/entities/effect/MultiEffect.java b/core/src/mindustry/entities/effect/MultiEffect.java index a93c3bd276..ba44402ab7 100644 --- a/core/src/mindustry/entities/effect/MultiEffect.java +++ b/core/src/mindustry/entities/effect/MultiEffect.java @@ -18,6 +18,7 @@ public class MultiEffect extends Effect{ @Override public void init(){ for(Effect f : effects){ + f.init(); clip = Math.max(clip, f.clip); lifetime = Math.max(lifetime, f.lifetime); } diff --git a/core/src/mindustry/entities/effect/ParticleEffect.java b/core/src/mindustry/entities/effect/ParticleEffect.java index 0efbaefcbf..477e52e19a 100644 --- a/core/src/mindustry/entities/effect/ParticleEffect.java +++ b/core/src/mindustry/entities/effect/ParticleEffect.java @@ -20,6 +20,8 @@ public class ParticleEffect extends Effect{ public float cone = 180f, length = 20f, baseLength = 0f; /** Particle size/length/radius interpolation. */ public Interp interp = Interp.linear; + /** Particle size interpolation. Null to use interp. */ + public @Nullable Interp sizeInterp = null; public float offsetX, offsetY; public float lightScl = 2f, lightOpacity = 0.6f; public @Nullable Color lightColor; @@ -44,6 +46,7 @@ public class ParticleEffect extends Effect{ @Override public void init(){ clip = Math.max(clip, length + Math.max(sizeFrom, sizeTo)); + if(sizeInterp == null) sizeInterp = interp; } @Override @@ -52,15 +55,15 @@ public class ParticleEffect extends Effect{ float rawfin = e.fin(); 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); Draw.color(colorFrom, colorTo, fin); Color lightColor = this.lightColor == null ? Draw.getColor() : this.lightColor; if(line){ - Lines.stroke(interp.apply(strokeFrom, strokeTo, rawfin)); - float len = interp.apply(lenFrom, lenTo, rawfin); + Lines.stroke(sizeInterp.apply(strokeFrom, strokeTo, rawfin)); + float len = sizeInterp.apply(lenFrom, lenTo, rawfin); rand.setSeed(e.id); for(int i = 0; i < particles; i++){ diff --git a/core/src/mindustry/game/Schematics.java b/core/src/mindustry/game/Schematics.java index 011d289f05..80b378ad53 100644 --- a/core/src/mindustry/game/Schematics.java +++ b/core/src/mindustry/game/Schematics.java @@ -291,16 +291,22 @@ public class Schematics implements Loadable{ /** Checks a schematic for deployment validity and adds it to the cache. */ private void checkLoadout(Schematic s, boolean validate){ 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 maxSize = getMaxLaunchSize(core.block); //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; //place in the cache 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.*/ public void add(Schematic schematic){ all.add(schematic); diff --git a/core/src/mindustry/game/SpawnGroup.java b/core/src/mindustry/game/SpawnGroup.java index 115c78a7e6..79bf5164eb 100644 --- a/core/src/mindustry/game/SpawnGroup.java +++ b/core/src/mindustry/game/SpawnGroup.java @@ -19,7 +19,7 @@ import static mindustry.Vars.*; * weapon equipped, ammo used, and status effects. * 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; /** The unit type spawned */ @@ -36,10 +36,12 @@ public class SpawnGroup implements JsonSerializable{ public float unitScaling = never; /** Shield points that this unit has. */ public float shields = 0f; - /** How much shields get increased per wave. */ + /** How much shields get increased by per wave. */ public float shieldScaling = 0f; /** Amount of enemies spawned initially, with no scaling */ 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. */ public @Nullable Seq payloads; /** Status effect applied to the spawned unit. Null to disable. */ @@ -55,6 +57,10 @@ public class SpawnGroup implements JsonSerializable{ //serialization use only } + public boolean canSpawn(int position){ + return spawn == -1 || spawn == position; + } + /** @return amount of units spawned on a specific wave. */ public int getSpawned(int wave){ if(spacing == 0) spacing = 1; @@ -111,6 +117,7 @@ public class SpawnGroup implements JsonSerializable{ if(shieldScaling != 0) json.writeValue("shieldScaling", shieldScaling); if(unitAmount != 1) json.writeValue("amount", unitAmount); if(effect != null) json.writeValue("effect", effect.name); + if(spawn != -1) json.writeValue("spawn", spawn); if(payloads != null && payloads.size > 0){ 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); shieldScaling = data.getFloat("shieldScaling", 0); unitAmount = data.getInt("amount", 1); + spawn = data.getInt("spawn", -1); if(data.has("payloads")){ 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 public boolean equals(Object o){ if(this == o) return true; diff --git a/core/src/mindustry/game/Waves.java b/core/src/mindustry/game/Waves.java index 867c1476ce..8e7bf7a63c 100644 --- a/core/src/mindustry/game/Waves.java +++ b/core/src/mindustry/game/Waves.java @@ -350,8 +350,8 @@ public class Waves{ 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 bossSpacing = (int)(rand.random(25, 40) * Mathf.lerp(1f, 0.6f, 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.5f, difficulty)); int bossTier = difficulty < 0.6 ? 3 : 4; diff --git a/core/src/mindustry/graphics/BlockRenderer.java b/core/src/mindustry/graphics/BlockRenderer.java index c0c7e24fe8..cc40a2c040 100644 --- a/core/src/mindustry/graphics/BlockRenderer.java +++ b/core/src/mindustry/graphics/BlockRenderer.java @@ -150,7 +150,7 @@ public class BlockRenderer{ public void checkChanges(){ darkEvents.each(pos -> { var tile = world.tile(pos); - if(tile != null){ + if(tile != null && tile.block().fillsTile){ tile.data = world.getWallDarkness(tile); } }); diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 4e3c58e5c0..b9a98d832d 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -967,7 +967,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ //consume tap event if necessary if(build.interactable(player.team()) && build.block.consumesTap){ 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){ frag.inv.showFor(build); consumed = true; diff --git a/core/src/mindustry/io/SaveFileReader.java b/core/src/mindustry/io/SaveFileReader.java index fe87b8292c..bb80119ff0 100644 --- a/core/src/mindustry/io/SaveFileReader.java +++ b/core/src/mindustry/io/SaveFileReader.java @@ -60,6 +60,13 @@ public abstract class SaveFileReader{ "block-forge", "constructor" ); + public static final ObjectMap modContentNameMap = ObjectMap.of( + "craters", "crater-stone", + "deepwater", "deep-water", + "water", "shallow-water", + "slag", "molten-slag" + ); + protected final ReusableByteOutStream byteOutput = new ReusableByteOutStream(); protected final DataOutputStream dataBytes = new DataOutputStream(byteOutput); protected final ReusableByteOutStream byteOutputSmall = new ReusableByteOutStream(); diff --git a/core/src/mindustry/maps/SectorDamage.java b/core/src/mindustry/maps/SectorDamage.java index 5ee6e1f15a..9fd2f0d247 100644 --- a/core/src/mindustry/maps/SectorDamage.java +++ b/core/src/mindustry/maps/SectorDamage.java @@ -272,16 +272,22 @@ public class SectorDamage{ float e = build.efficiency(); if(e > 0.08f){ 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()){ - 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){ - 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){ - sumHealth += f.shieldHealth * e; + sumHealth += f.shieldHealth * e * build.timeScale; sumRps += e; } } @@ -315,14 +321,20 @@ public class SectorDamage{ var reg = new LinearRegression(); SpawnGroup bossGroup = null; Seq 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 ++){ float sumWaveDps = 0f, sumWaveHealth = 0f; 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); StatusEffect effect = (group.effect == null ? StatusEffects.none : group.effect); - int spawned = group.getSpawned(wave); + int spawned = group.getSpawned(wave) * spawnCount; //save the boss group if(group.effect == StatusEffects.boss){ bossGroup = group; diff --git a/core/src/mindustry/maps/filters/BlendFilter.java b/core/src/mindustry/maps/filters/BlendFilter.java index 7f0d319df9..773459d75a 100644 --- a/core/src/mindustry/maps/filters/BlendFilter.java +++ b/core/src/mindustry/maps/filters/BlendFilter.java @@ -8,7 +8,7 @@ import static mindustry.maps.filters.FilterOption.*; public class BlendFilter extends GenerateFilter{ float radius = 2f; - Block block = Blocks.stone, floor = Blocks.ice, ignore = Blocks.air; + Block block = Blocks.sand, floor = Blocks.sandWater, ignore = Blocks.air; @Override public FilterOption[] options(){ @@ -16,7 +16,7 @@ public class BlendFilter extends GenerateFilter{ new SliderOption("radius", () -> radius, f -> radius = f, 1f, 10f), new BlockOption("block", () -> block, b -> block = 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) }; } diff --git a/core/src/mindustry/maps/filters/DistortFilter.java b/core/src/mindustry/maps/filters/DistortFilter.java index 8b6d80e8e1..c1d6baa69e 100644 --- a/core/src/mindustry/maps/filters/DistortFilter.java +++ b/core/src/mindustry/maps/filters/DistortFilter.java @@ -27,7 +27,7 @@ public class DistortFilter extends GenerateFilter{ @Override 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(); if(!tile.block().synthetic() && !in.block.synthetic()) in.block = tile.block(); diff --git a/core/src/mindustry/maps/filters/GenerateFilter.java b/core/src/mindustry/maps/filters/GenerateFilter.java index fea59ed405..9182fc6857 100644 --- a/core/src/mindustry/maps/filters/GenerateFilter.java +++ b/core/src/mindustry/maps/filters/GenerateFilter.java @@ -99,6 +99,10 @@ public abstract class GenerateFilter{ //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){ return Simplex.noise2d(seed, 1f, 0f, 1f / scl, in.x, in.y) * mag; } diff --git a/core/src/mindustry/maps/filters/RiverNoiseFilter.java b/core/src/mindustry/maps/filters/RiverNoiseFilter.java index 3fb6efab5e..eb91954b43 100644 --- a/core/src/mindustry/maps/filters/RiverNoiseFilter.java +++ b/core/src/mindustry/maps/filters/RiverNoiseFilter.java @@ -8,7 +8,7 @@ import static mindustry.maps.filters.FilterOption.*; public class RiverNoiseFilter extends GenerateFilter{ 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 public FilterOption[] options(){ @@ -18,6 +18,7 @@ public class RiverNoiseFilter extends GenerateFilter{ new SliderOption("threshold2", () -> threshold2, f -> threshold2 = f, -1f, 1f), new SliderOption("octaves", () -> octaves, f -> octaves = f, 1f, 10f), 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("floor", () -> floor, b -> floor = b, floorsOnly), new BlockOption("floor2", () -> floor2, b -> floor2 = b, floorsOnly) @@ -26,14 +27,14 @@ public class RiverNoiseFilter extends GenerateFilter{ @Override public char icon(){ - return Iconc.blockWater; + return Iconc.blockShallowWater; } @Override public void apply(GenerateInput in){ 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; if(in.block.solid){ diff --git a/core/src/mindustry/maps/generators/BaseGenerator.java b/core/src/mindustry/maps/generators/BaseGenerator.java index 636e386356..7cbe7b8487 100644 --- a/core/src/mindustry/maps/generators/BaseGenerator.java +++ b/core/src/mindustry/maps/generators/BaseGenerator.java @@ -30,6 +30,12 @@ public class BaseGenerator{ private Tiles tiles; private Seq cores; + public static Block getDifficultyWall(int size, float difficulty){ + Seq 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 cores, Tile spawn, Team team, Sector sector, float difficulty){ this.tiles = tiles; this.cores = cores; @@ -39,22 +45,15 @@ public class BaseGenerator{ Mathf.rand.setSeed(sector.id); - Seq wallsSmall = content.blocks().select(b -> b instanceof Wall && b.size == 1 && !b.insulated && b.buildVisibility == BuildVisibility.shown && !(b instanceof Door)); - Seq wallsLarge = content.blocks().select(b -> b instanceof Wall && b.size == 2 && !b.insulated && b.buildVisibility == BuildVisibility.shown && !(b instanceof Door)); - - //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); + float bracketRange = 0.17f; + float baseChance = Mathf.lerp(0.7f, 2.1f, difficulty); int wallAngle = 70; //180 for full coverage double resourceChance = 0.5 * baseChance; double nonResourceChance = 0.0005 * baseChance; BasePart coreschem = bases.cores.getFrac(difficulty); 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){ tile.clearOverlay(); diff --git a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java index b00ba5d3a6..95f9c875e8 100644 --- a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java @@ -517,7 +517,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ 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.enemyCoreBuildRadius = 600f; diff --git a/core/src/mindustry/mod/ContentParser.java b/core/src/mindustry/mod/ContentParser.java index 3644b3ad5b..a5e2cdf39b 100644 --- a/core/src/mindustry/mod/ContentParser.java +++ b/core/src/mindustry/mod/ContentParser.java @@ -80,6 +80,8 @@ public class ContentParser{ if(data.isString()){ StatusEffect result = locate(ContentType.status, data.asString()); if(result != null) return result; + result = (StatusEffect)fieldOpt(StatusEffects.class, data); + if(result != null) return result; throw new IllegalArgumentException("Unknown status effect: '" + data.asString() + "'"); } StatusEffect effect = new StatusEffect(currentMod.name + "-" + data.getString("name")); diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 8e3f3ad2b1..e4b865de88 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -177,7 +177,7 @@ public class Mods implements Loadable{ } private void packSprites(Seq sprites, LoadedMod mod, boolean prefix, Seq> tasks){ - boolean linear = Core.settings.getBool("linear"); + boolean linear = Core.settings.getBool("linear", true); for(Fi file : sprites){ //read and bleed pixmaps in parallel @@ -186,7 +186,7 @@ public class Mods implements Loadable{ Pixmap pix = new Pixmap(file.readBytes()); //only bleeds when linear filtering is on at startup 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 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(); //generate new icons diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 80f647e409..4d74597c7c 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -334,6 +334,9 @@ public class UnitType extends UnlockableContent{ canDrown = false; omniMovement = false; immunities.add(StatusEffects.wet); + if(visualElevation < 0f){ + visualElevation = 0.11f; + } } if(flying){ @@ -473,7 +476,7 @@ public class UnitType extends UnlockableContent{ if(!packer.has(name + "-outline")){ PixmapRegion base = Core.atlas.getPixmap(region); var result = Pixmaps.outline(base, outlineColor, outlineRadius); - if(Core.settings.getBool("linear")){ + if(Core.settings.getBool("linear", true)){ Pixmaps.bleed(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); float rad = 1.6f; 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(); } diff --git a/core/src/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/mindustry/ui/dialogs/DatabaseDialog.java index c94f69f2e2..b718950950 100644 --- a/core/src/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/mindustry/ui/dialogs/DatabaseDialog.java @@ -36,7 +36,7 @@ public class DatabaseDialog extends BaseDialog{ cont.table(s -> { s.image(Icon.zoom).padRight(8); search = s.field(null, text -> rebuild()).growX().get(); - search.setMessageText(Core.bundle.get("players.search")); + search.setMessageText("@players.search"); }).fillX().padBottom(4).row(); cont.pane(all); diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 003a1036be..8638dca9b2 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -763,7 +763,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ c.defaults().padBottom(5); 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(); diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 0f8820bc2a..d8d0b40826 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -230,8 +230,12 @@ public class SettingsMenuDialog extends Dialog{ platform.shareFile(logs); }else{ platform.showFileChooser(false, "txt", file -> { - file.writeString(getLogs()); - app.post(() -> ui.showInfo("@crash.exported")); + try{ + file.writeBytes(getLogs().getBytes(Strings.utf8)); + app.post(() -> ui.showInfo("@crash.exported")); + }catch(Throwable e){ + ui.showException(e); + } }); } } diff --git a/core/src/mindustry/ui/fragments/HintsFragment.java b/core/src/mindustry/ui/fragments/HintsFragment.java index 45230f2d3a..05fc098f9d 100644 --- a/core/src/mindustry/ui/fragments/HintsFragment.java +++ b/core/src/mindustry/ui/fragments/HintsFragment.java @@ -181,6 +181,11 @@ public class HintsFragment extends Fragment{ && SectorPresets.frozenForest.unlocked() && SectorPresets.frozenForest.sector.save == null, () -> 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), coopCampaign(() -> net.client() && state.isCampaign() && SectorPresets.groundZero.sector.hasBase(), () -> false), ; diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index a9f22fe395..226bc03d53 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -162,6 +162,8 @@ public class Block extends UnlockableContent{ public int unitCapModifier = 0; /** Whether the block can be tapped and selected to configure. */ 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. */ public boolean logicConfigurable = false; /** Whether this block consumes touchDown events when tapped. */ @@ -848,7 +850,8 @@ public class Block extends UnlockableContent{ } 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){ @@ -912,12 +915,17 @@ public class Block extends UnlockableContent{ for(int x = 0; x < base.width; x++){ for(int y = 0; y < base.height; 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]); } } - if(Core.settings.getBool("linear")){ + if(Core.settings.getBool("linear", true)){ Pixmaps.bleed(out); } @@ -938,7 +946,7 @@ public class Block extends UnlockableContent{ if(outlineIcon){ PixmapRegion region = Core.atlas.getPixmap(gen[outlinedIcon >= 0 ? outlinedIcon : gen.length -1]); Pixmap out = last = Pixmaps.outline(region, outlineColor, outlineRadius); - if(Core.settings.getBool("linear")){ + if(Core.settings.getBool("linear", true)){ Pixmaps.bleed(out); } packer.add(PageType.main, name, out); diff --git a/core/src/mindustry/world/Tile.java b/core/src/mindustry/world/Tile.java index 776cb976f3..93b53d4f81 100644 --- a/core/src/mindustry/world/Tile.java +++ b/core/src/mindustry/world/Tile.java @@ -470,15 +470,15 @@ public class Tile implements Position, QuadTreeObject, Displayable{ getHitbox(rect); } - public Tile nearby(Point2 relative){ + public @Nullable Tile nearby(Point2 relative){ 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); } - public Tile nearby(int rotation){ + public @Nullable Tile nearby(int rotation){ if(rotation == 0) return world.tile(x + 1, y); if(rotation == 1) return world.tile(x, y + 1); if(rotation == 2) return world.tile(x - 1, y); @@ -486,7 +486,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ return null; } - public Building nearbyBuild(int rotation){ + public @Nullable Building nearbyBuild(int rotation){ if(rotation == 0) return world.build(x + 1, y); if(rotation == 1) return world.build(x, y + 1); if(rotation == 2) return world.build(x - 1, y); diff --git a/core/src/mindustry/world/blocks/defense/Wall.java b/core/src/mindustry/world/blocks/defense/Wall.java index b2fc1e08c8..9a22520775 100644 --- a/core/src/mindustry/world/blocks/defense/Wall.java +++ b/core/src/mindustry/world/blocks/defense/Wall.java @@ -75,7 +75,9 @@ public class Wall extends Block{ Draw.blend(); 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 if(chanceDeflect > 0f){ //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 if(!Mathf.chance(chanceDeflect / bullet.damage())) return true; @@ -115,9 +117,9 @@ public class Wall extends Block{ bullet.vel.y *= -1; } - bullet.owner(this); - bullet.team(team); - bullet.time(bullet.time() + 1f); + bullet.owner = this; + bullet.team = team; + bullet.time += 1f; //disable bullet collision by returning false return false; diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 5f26af42d8..050e20975a 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -273,6 +273,7 @@ public class Turret extends ReloadTurret{ } if(hasAmmo()){ + if(Float.isNaN(reload)) rotation = 0; if(timer(timerTarget, targetInterval)){ findTarget(); @@ -289,9 +290,7 @@ public class Turret extends ReloadTurret{ }else{ //default AI behavior targetPosition(target); - if(Float.isNaN(rotation)){ - rotation = 0; - } + if(Float.isNaN(rotation)) rotation = 0; } float targetRot = angleTo(targetPos); diff --git a/core/src/mindustry/world/blocks/distribution/DuctBridge.java b/core/src/mindustry/world/blocks/distribution/DuctBridge.java index 58457d5f22..ae8234d528 100644 --- a/core/src/mindustry/world/blocks/distribution/DuctBridge.java +++ b/core/src/mindustry/world/blocks/distribution/DuctBridge.java @@ -211,7 +211,7 @@ public class DuctBridge extends Block{ public DuctBridgeBuild findLink(){ for(int i = 1; i <= range; 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; } } diff --git a/core/src/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/mindustry/world/blocks/distribution/ItemBridge.java index 2ee12f952a..746ee0cfc7 100644 --- a/core/src/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ItemBridge.java @@ -51,6 +51,8 @@ public class ItemBridge extends Block{ group = BlockGroup.transportation; noUpdateDisabled = true; copyConfig = false; + //disabled as to not be annoying + allowConfigInventory = false; //point2 config is relative config(Point2.class, (ItemBridgeBuild tile, Point2 i) -> tile.link = Point2.pack(i.x + tile.tileX(), i.y + tile.tileY())); diff --git a/core/src/mindustry/world/blocks/environment/Cliff.java b/core/src/mindustry/world/blocks/environment/Cliff.java index 49dba95d7c..d3a0c99771 100644 --- a/core/src/mindustry/world/blocks/environment/Cliff.java +++ b/core/src/mindustry/world/blocks/environment/Cliff.java @@ -9,6 +9,7 @@ import mindustry.world.*; public class Cliff extends Block{ public float size = 11f; public @Load(value = "cliffmask#", length = 256) TextureRegion[] cliffs; + public @Load(value = "editor-cliffmask#", length = 256) TextureRegion[] editorCliffs; public Cliff(String name){ super(name); diff --git a/core/src/mindustry/world/blocks/power/BurnerGenerator.java b/core/src/mindustry/world/blocks/power/BurnerGenerator.java index 9e70f9b86f..e18ec02664 100644 --- a/core/src/mindustry/world/blocks/power/BurnerGenerator.java +++ b/core/src/mindustry/world/blocks/power/BurnerGenerator.java @@ -40,10 +40,10 @@ public class BurnerGenerator extends ItemLiquidGenerator{ Draw.rect(turbineRegions[1], x, y, -totalTime * turbineSpeed); Draw.rect(capRegion, x, y); + } - if(hasLiquids){ - Drawf.liquid(liquidRegion, x, y, liquids.total() / liquidCapacity, liquids.current().color); - } + if(hasLiquids && liquidRegion.found()){ + Drawf.liquid(liquidRegion, x, y, liquids.total() / liquidCapacity, liquids.current().color); } } } diff --git a/core/src/mindustry/world/blocks/power/PowerGraph.java b/core/src/mindustry/world/blocks/power/PowerGraph.java index 80567af1ad..2a80e7897c 100644 --- a/core/src/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/mindustry/world/blocks/power/PowerGraph.java @@ -13,10 +13,11 @@ public class PowerGraph{ private static final Seq outArray2 = new Seq<>(); private static final IntSet closedSet = new IntSet(); - private final Seq producers = new Seq<>(false); - private final Seq consumers = new Seq<>(false); - private final Seq batteries = new Seq<>(false); - private final Seq all = new Seq<>(false); + //do not modify any of these unless you know what you're doing! + public final Seq producers = new Seq<>(false); + public final Seq consumers = new Seq<>(false); + public final Seq batteries = new Seq<>(false); + public final Seq all = new Seq<>(false); private final WindowedMean powerBalance = new WindowedMean(60); private float lastPowerProduced, lastPowerNeeded, lastPowerStored; diff --git a/core/src/mindustry/world/consumers/ConsumePower.java b/core/src/mindustry/world/consumers/ConsumePower.java index 67b23d6c4c..991ad968e7 100644 --- a/core/src/mindustry/world/consumers/ConsumePower.java +++ b/core/src/mindustry/world/consumers/ConsumePower.java @@ -8,11 +8,11 @@ import mindustry.world.meta.*; /** Consumer class for blocks which consume power while being connected to a power graph. */ public class ConsumePower extends Consume{ /** 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. */ - public final float capacity; + public float capacity; /** True if the module can store power. */ - public final boolean buffered; + public boolean buffered; public ConsumePower(float usage, float capacity, boolean buffered){ this.usage = usage; diff --git a/core/src/mindustry/world/draw/DrawSmelter.java b/core/src/mindustry/world/draw/DrawSmelter.java index 9402ecbd75..681723f7fd 100644 --- a/core/src/mindustry/world/draw/DrawSmelter.java +++ b/core/src/mindustry/world/draw/DrawSmelter.java @@ -38,13 +38,15 @@ public class DrawSmelter extends DrawBlock{ float cr = Mathf.random(0.1f); 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.tint(flameColor); Fill.circle(build.x, build.y, flameRadius + Mathf.absin(Time.time, flameRadiusScl, flameRadiusMag) + cr); 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); Draw.color(); diff --git a/fastlane/metadata/android/ro/full_description.txt b/fastlane/metadata/android/ro/full_description.txt index 8bf81489ef..f462d5d7f7 100644 --- a/fastlane/metadata/android/ro/full_description.txt +++ b/fastlane/metadata/android/ro/full_description.txt @@ -12,7 +12,7 @@

Campanie

-- 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 - Apără-ți sectoarele de invaziile inamice periodice - Coordonează distribuția de resurse între sectoare folosind platforme de lansare diff --git a/gradle.properties b/gradle.properties index b38510c7c9..912648a4a4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,4 +11,4 @@ android.useAndroidX=true #used for slow jitpack builds; TODO see if this actually works http.socketTimeout=80000 http.connectionTimeout=80000 -archash=98c420de77661889ab0330a956d50721f27f33d9 +archash=72627de9b81e7143af4ebe1d1f9d54099ade8fd3 diff --git a/servers_v6.json b/servers_v6.json index f9bb12257a..9e01796b40 100644 --- a/servers_v6.json +++ b/servers_v6.json @@ -57,7 +57,7 @@ }, { "name": "Omega", - "address": ["yeeth.mindustry.me:2004"] + "address": ["yeeth.mindustry.me:2004","185.86.230.61:25570"] }, { "name": "md.obvilionnetwork.ru", @@ -104,11 +104,15 @@ "address": ["usfr2.forcehost.net:25578"] }, { - "name": "Español", + "name": "Español", "address": ["168.119.36.188:41445"] }, { - "name": "CreateDustry", + "name": "CreateDustry", "address": ["144.76.120.74:18645"] + }, + { + "name": "HexedPvP", + "address": ["001.finland.eu.hosts.dynamichost.xyz:23664"] } ] diff --git a/servers_v7.json b/servers_v7.json index 2e7da6b094..98765e821d 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -20,7 +20,7 @@ "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"] }, { @@ -37,7 +37,7 @@ }, { "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", diff --git a/tools/src/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java index df9bf89de3..ed27820c79 100644 --- a/tools/src/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -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())); }); }